From 7cf25ea0e5864bd0fdb1d5d4048539943a21ddca Mon Sep 17 00:00:00 2001 From: Joe Bloggs Date: Fri, 20 Oct 2017 18:38:59 +0100 Subject: [PATCH 1/7] Added greyscale conversion routines (towards #207) --- liboavideo/Makefile.am | 10 +- liboavideo/grey.c | 318 +++++++++++++++++++++++++++++++ liboavideo/grey.h | 56 ++++++ liboavideo/oavideo.c | 207 +++++++++++++++++++- liboavideo/rgb_to_grey.ods | Bin 0 -> 20588 bytes liboavideo/test_oaconvert.c | 247 ++++++++++++++++++++++++ liboavideo/yuv.c | 2 + oacapture/qt-icons/greyscale.png | Bin 0 -> 4029 bytes 8 files changed, 838 insertions(+), 2 deletions(-) create mode 100644 liboavideo/grey.c create mode 100644 liboavideo/grey.h create mode 100644 liboavideo/rgb_to_grey.ods create mode 100644 liboavideo/test_oaconvert.c create mode 100644 oacapture/qt-icons/greyscale.png diff --git a/liboavideo/Makefile.am b/liboavideo/Makefile.am index b81c812d..04dee9e4 100644 --- a/liboavideo/Makefile.am +++ b/liboavideo/Makefile.am @@ -27,7 +27,7 @@ AM_CPPFLAGS = -I$(top_srcdir)/include lib_LTLIBRARIES = liboavideo.la liboavideo_la_SOURCES = \ - oavideo.c yuv.c fits.c + oavideo.c yuv.c grey.c fits.c WARNINGS = -g -O -Wall -Werror -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wno-pointer-sign $(OSX_WARNINGS) @@ -38,3 +38,11 @@ warnings: verbose-warnings: $(MAKE) V=1 CFLAGS='$(WARNINGS)' CXXFLAGS='$(WARNINGS)' $(MAKE) V=1 CFLAGS='$(WARNINGS)' CXXFLAGS='$(WARNINGS)' $(check_PROGRAMS) + +test: + @gcc --std=c99 -g3 -O0 -I./ -I../include test_oaconvert.c yuv.c grey.c oavideo.c -o test_oaconvert + @./test_oaconvert 2>&1 | tee test_oaconvert.txt + @if grep -q "at line" test_oaconvert.txt; then \ + echo;\ + head -n `grep at\ line test_oaconvert.txt | sed -e 's/.* at line \(.*\) .*/\1/g'` test_oaconvert.c | tail -n 1; \ + fi diff --git a/liboavideo/grey.c b/liboavideo/grey.c new file mode 100644 index 00000000..9302dcec --- /dev/null +++ b/liboavideo/grey.c @@ -0,0 +1,318 @@ +/***************************************************************************** + * + * yuv.c -- convert YUV formats to RGB888 + * + * Copyright 2014 James Fidell (james@openastroproject.org) + * + * License: + * + * This file is part of the Open Astro Project. + * + * The Open Astro Project is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Open Astro Project is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Open Astro Project. If not, see + * . + * + *****************************************************************************/ + +#include +#include + +#include "grey.h" + +void +oaGreyscale_8to16LE( uint8_t* source, uint8_t* target, int len ) +{ + int i; + uint8_t* t = target + (len-1)*2; + uint8_t* s = source + (len-1); + + for ( i = len; i > 0; i--, s-=1, t-=2 ) { + *(t+1) = *s; + *t = 0x00; + } +} + +void +oaGreyscale_8to16BE( uint8_t* source, uint8_t* target, int len ) +{ + int i; + uint8_t v; + uint8_t* t = target + (len-1)*2; + uint8_t* s = source + (len-1); + + for ( i = len; i > 0; i--, s-=1, t-=2 ) { + *t = *s; + *(t+1) = 0x00; + } +} + +void +oaGreyscale_10to8( uint8_t* s, uint8_t* t, int len, bool packed ) +{ + int i; + uint16_t p; + + if ( packed ) { + for ( i = 0; i < len; i += 5, s += 5 ) { + *t++ = *s; + *t++ = *(s+1); + *t++ = *(s+2); + *t++ = *(s+3); + // ignore 5th byte + } + } + else { + for ( i = 0; i < len; i += 2, s+=2 ) { + p = (*s << 6) + ((*(s+1)&0x03) << 14); + *t++ = (p & 0xff00) >> 8; + } + } +} + +void +oaGreyscale_10to16( uint8_t* source, uint8_t* target, int len, bool packed, bool little_endian ) +{ + int i; + uint8_t* s; + uint8_t* t; + uint16_t p1, p2, p3, p4; + + const int numPixels = len / ( packed ? 1.25 : 2 ); + + if ( packed ) { + t = target + (numPixels-4) * 2; + s = source + (numPixels-4) * 5/4; + + for ( i=0; i < len; i += 5, s -= 5, t -= 8) + { + uint8_t lsb = *(s+4); + + uint16_t p1 = (*(s) << 8) + ((lsb&0x03) << 6); + uint16_t p2 = (*(s+1) << 8) + ((lsb&0x0c) << 4); + uint16_t p3 = (*(s+2) << 8) + ((lsb&0x30) << 2); + uint16_t p4 = (*(s+3) << 8) + (lsb&0xc0); + + if (little_endian) { + *t = p1 & 0x00ff; + *(t+1) = (p1 & 0xff00) >> 8; + *(t+2) = p2 & 0x00ff; + *(t+3) = (p2 & 0xff00) >> 8; + *(t+4) = p3 & 0x00ff; + *(t+5) = (p3 & 0xff00) >> 8; + *(t+6) = p4 & 0x00ff; + *(t+7) = (p4 & 0xff00) >> 8; + } + else { + *t = (p1 & 0xff00) >> 8; + *(t+1) = p1 & 0x00ff; + *(t+2) = (p2 & 0xff00) >> 8; + *(t+3) = p2 & 0x00ff; + *(t+4) = (p3 & 0xff00) >> 8; + *(t+5) = p3 & 0x00ff; + *(t+6) = (p4 & 0xff00) >> 8; + *(t+7) = p4 & 0x00ff; + } + } + } + else { + t = target + (numPixels-1)*2; + s = source + (numPixels-1)*2; + + for ( i=0; i < len; i += 2, s-=2, t-=2) + { + p1 = (*s << 6) + ((*(s+1)&0x03) << 14); + if (little_endian) { + *t = p1 & 0x00ff; + *(t+1) = (p1 & 0xff00) >> 8; + } + else { + *t = (p1 & 0xff00) >> 8; + *(t+1) = p1 & 0x00ff; + } + } + } +} + +void +oaGreyscale_10to16LE( uint8_t* s, uint8_t* t, int len, bool packed ) +{ + oaGreyscale_10to16( s, t, len, packed, true ); +} + +void +oaGreyscale_10to16BE( uint8_t* s, uint8_t* t, int len, bool packed ) +{ + oaGreyscale_10to16( s, t, len, packed, false ); +} + +void +oaGreyscale_16LEto8( uint8_t* s, uint8_t* t, int len ) +{ + int i; + for ( i = 0; i < len; i+=2, s+=2, t++ ) { + *t = *(s+1); + } +} + +void +oaGreyscale_16BEto8( uint8_t* s, uint8_t* t, int len ) +{ + int i; + for ( i = 0; i < len; i+=2, s+=2, t++ ) { + *t = *s; + } +} + +void +oaGreyscale_16swap( uint8_t* s, uint8_t* t, int len ) +{ + int i; + for ( i = 0; i < len; i+=2, s+=2, t+=2 ) { + uint8_t v = *s; + *t = *(s+1); + *(t+1) = v; + } +} + +void +oaGreyscale_RGB24to8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint8_t R, G, B; + for ( i = 0; i < len; i += 3, s += 3, t += 1 ) { + R = swapRB ? *(s+2) : *s; G = *(s+1); B = swapRB ? *s : *(s+2); + *t = .2126 * R + .7152 * G + .0722 * B; + } +} + +void +oaGreyscale_RGB24to16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 3, s += 3, t += 2 ) { + R = swapRB ? *(s+2) : *s; G = *(s+1); B = swapRB ? *s : *(s+2); + Y = .2126 * (R<<8) + .7152 * (G<<8) + .0722 * (B<<8); + *t = Y & 0x00ff; + *(t+1) = (Y & 0xff00) >> 8; + } +} + +void +oaGreyscale_RGB24to16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 3, s += 3, t += 2 ) { + R = swapRB ? *(s+2) : *s; G = *(s+1); B = swapRB ? *s : *(s+2); + Y = .2126 * (R<<8) + .7152 * (G<<8) + .0722 * (B<<8); + *t = (Y & 0xff00) >> 8; + *(t+1) = Y & 0x00ff; + } +} + +void +oaGreyscale_RGB48LEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 1 ) { + R = swapRB ? ((*(s+5)<<8) + *(s+4)) : (((*(s+1))<<8) + *s); + G = (*(s+3)<<8) + *(s+2); + B = swapRB ? ((*(s+1)<<8) + *s) : ((*(s+5)<<8) + *(s+4)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = (Y & 0xff00) >> 8; + } +} + +void +oaGreyscale_RGB48LEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 2 ) { + R = swapRB ? ((*(s+5)<<8) + *(s+4)) : ((*(s+1)<<8) + *s); + G = (*(s+3)<<8) + *(s+2); + B = swapRB ? ((*(s+1)<<8) + *s) : ((*(s+5)<<8) + *(s+4)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = Y & 0x00ff; + *(t+1) = (Y & 0xff00) >> 8; + } +} + +void +oaGreyscale_RGB48LEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 2 ) { + R = swapRB ? ((*(s+5)<<8) + *(s+4)) : ((*(s+1)<<8) + *s); + G = (*(s+3)<<8) + *(s+2); + B = swapRB ? ((*(s+1)<<8) + *s) : ((*(s+5)<<8) + *(s+4)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = (Y & 0xff00) >> 8; + *(t+1) = Y & 0x00ff; + } +} + +void +oaGreyscale_RGB48BEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 1 ) { + R = swapRB ? ((*(s+4)<<8) + *(s+5)) : ((*s<<8) + *(s+1)); + G = (*(s+2)<<8) + *(s+3); + B = swapRB ? ((*s<<8) + *(s+1)) : ((*(s+4)<<8) + *(s+5)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = (Y & 0xff00) >> 8; + } +} + +void +oaGreyscale_RGB48BEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 2 ) { + R = swapRB ? ((*(s+4)<<8) + *(s+5)) : ((*s<<8) + *(s+1)); + G = (*(s+2)<<8) + *(s+3); + B = swapRB ? ((*s<<8) + *(s+1)) : ((*(s+4)<<8) + *(s+5)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = Y & 0x00ff; + *(t+1) = (Y & 0xff00) >> 8; + } +} + +void +oaGreyscale_RGB48BEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +{ + int i; + uint16_t R, G, B; + uint16_t Y; + for ( i = 0; i < len; i += 6, s += 6, t += 2 ) { + R = swapRB ? ((*(s+4)<<8) + *(s+5)) : ((*s<<8) + *(s+1)); + G = (*(s+2)<<8) + *(s+3); + B = swapRB ? ((*s<<8) + *(s+1)) : ((*(s+4)<<8) + *(s+5)); + Y = .2126 * R + .7152 * G + .0722 * B; + *t = (Y & 0xff00) >> 8; + *(t+1) = Y & 0x00ff; + } +} diff --git a/liboavideo/grey.h b/liboavideo/grey.h new file mode 100644 index 00000000..0a0672b1 --- /dev/null +++ b/liboavideo/grey.h @@ -0,0 +1,56 @@ +/***************************************************************************** + * + * grey.h -- convert any format to GREYxx header + * + * Copyright 2017 ... + * + * License: + * + * This file is part of the Open Astro Project. + * + * The Open Astro Project is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License as published + * by the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * The Open Astro Project is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with the Open Astro Project. If not, see + * . + * + *****************************************************************************/ + +#ifndef OPENASTRO_VIDEO_GREY_H +#define OPENASTRO_VIDEO_GREY_H + +#include +typedef enum { false, true } bool; + +extern void oaGreyscale_8to16LE( uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_8to16BE( uint8_t* s, uint8_t* t, int len ); + +extern void oaGreyscale_10to8( uint8_t* s, uint8_t* t, int len, bool packed ); +extern void oaGreyscale_10to16LE( uint8_t* s, uint8_t* t, int len, bool packed ); +extern void oaGreyscale_10to16BE( uint8_t* s, uint8_t* t, int len, bool packed ); + +extern void oaGreyscale_16LEto8( uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_16BEto8( uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_16swap( uint8_t* s, uint8_t* t, int len ); + +extern void oaGreyscale_RGB24to8( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB24to16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB24to16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); + +extern void oaGreyscale_RGB48LEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48LEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48LEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); + +extern void oaGreyscale_RGB48BEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48BEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48BEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); + +#endif /* OPENASTRO_VIDEO_GREY_H */ diff --git a/liboavideo/oavideo.c b/liboavideo/oavideo.c index 1cd2f1e0..ca13b97a 100644 --- a/liboavideo/oavideo.c +++ b/liboavideo/oavideo.c @@ -28,13 +28,20 @@ #include #include -#include "yuv.h" +#include +#include "yuv.h" +#include "grey.h" int oaconvert ( void* source, void* target, int xSize, int ySize, int sourceFormat, int targetFormat ) { + if ( OA_ISGREYSCALE( targetFormat ) ) { + oaconvert_greyscale( source, target, xSize, ySize, + sourceFormat, targetFormat ); + } + if ( targetFormat != OA_PIX_FMT_RGB24 ) { // FIX ME -- set errno return -1; @@ -66,3 +73,201 @@ oaconvert ( void* source, void* target, int xSize, int ySize, int sourceFormat, return 0; } + + + +//#define OA_PIX_FMT_YUV444P 22 +//#define OA_PIX_FMT_YUV422P 23 +//#define OA_PIX_FMT_YUV420P 24 +//#define OA_PIX_FMT_YUV410P 25 +//#define OA_PIX_FMT_YUYV 27 +//#define OA_PIX_FMT_UYVY 28 +//#define OA_PIX_FMT_YUV420 29 +//#define OA_PIX_FMT_YUV411 30 +//#define OA_PIX_FMT_YUV410 31 + +int +oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sourceFormat, + int targetFormat ) +{ + int length; + bool swapRB; + + if ( !OA_ISGREYSCALE( targetFormat ) ) { + // FIX ME -- set errno + return -1; + } + + if ( !source || !target ) + { + // FIX ME -- set errno + return -1; + } + + switch ( sourceFormat ) { + case OA_PIX_FMT_GREY8: + case OA_PIX_FMT_BGGR8: + case OA_PIX_FMT_RGGB8: + case OA_PIX_FMT_GBRG8: + case OA_PIX_FMT_GRBG8: + length = xSize * ySize; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + if ( target != source ) memcpy( target, source, length ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_8to16LE( source, target, length ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_8to16BE( source, target, length ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + //case OA_PIX_FMT_BGGR10P: + //case OA_PIX_FMT_RGGB10P: + //case OA_PIX_FMT_GBRG10P: + case OA_PIX_FMT_GRBG10P: + length = xSize * ySize * 1.25; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_10to8( source, target, length, 1 ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_10to16LE( source, target, length, 1 ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_10to16BE( source, target, length, 1 ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + //case OA_PIX_FMT_BGGR10: + //case OA_PIX_FMT_RGGB10: + //case OA_PIX_FMT_GBRG10: + case OA_PIX_FMT_GRBG10: + length = xSize * ySize * 2; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_10to8( source, target, length, 0 ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_10to16LE( source, target, length, 0 ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_10to16BE( source, target, length, 0 ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + case OA_PIX_FMT_GREY16LE: + case OA_PIX_FMT_BGGR16LE: + case OA_PIX_FMT_RGGB16LE: + case OA_PIX_FMT_GBRG16LE: + case OA_PIX_FMT_GRBG16LE: + length = xSize * ySize * 2; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_16LEto8( source, target, length ); + break; + case OA_PIX_FMT_GREY16LE: + if ( target != source) memcpy( target, source, length ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_16swap( source, target, length ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + case OA_PIX_FMT_GREY16BE: + case OA_PIX_FMT_BGGR16BE: + case OA_PIX_FMT_RGGB16BE: + case OA_PIX_FMT_GBRG16BE: + case OA_PIX_FMT_GRBG16BE: + length = xSize * ySize * 2; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_16BEto8( source, target, length ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_16swap( source, target, length ); + break; + case OA_PIX_FMT_GREY16BE: + if ( target != source ) memcpy( target, source, xSize * ySize * 2 ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + case OA_PIX_FMT_RGB24: + case OA_PIX_FMT_BGR24: + length = xSize * ySize * 3; + swapRB = sourceFormat == OA_PIX_FMT_BGR24; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_RGB24to8( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_RGB24to16LE( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_RGB24to16BE( source, target, length, swapRB ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + case OA_PIX_FMT_RGB48LE: + case OA_PIX_FMT_BGR48LE: + length = xSize * ySize * 6; + swapRB = sourceFormat == OA_PIX_FMT_BGR48LE; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_RGB48LEto8( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_RGB48LEto16LE( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_RGB48LEto16BE( source, target, length, swapRB ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + case OA_PIX_FMT_RGB48BE: + case OA_PIX_FMT_BGR48BE: + length = xSize * ySize * 6; + swapRB = sourceFormat == OA_PIX_FMT_BGR48BE; + switch ( targetFormat ) { + case OA_PIX_FMT_GREY8: + oaGreyscale_RGB48BEto8( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16LE: + oaGreyscale_RGB48BEto16LE( source, target, length, swapRB ); + break; + case OA_PIX_FMT_GREY16BE: + oaGreyscale_RGB48BEto16BE( source, target, length, swapRB ); + break; + default: + return -1; // FIX ME -- set errno + } + break; + + default: + return -1; + } + return 0; +} + diff --git a/liboavideo/rgb_to_grey.ods b/liboavideo/rgb_to_grey.ods new file mode 100644 index 0000000000000000000000000000000000000000..d4566b5690bb18fed821e6ec4c1805d3ec5c221a GIT binary patch literal 20588 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 literal 0 HcmV?d00001 diff --git a/liboavideo/test_oaconvert.c b/liboavideo/test_oaconvert.c new file mode 100644 index 00000000..8cd4448a --- /dev/null +++ b/liboavideo/test_oaconvert.c @@ -0,0 +1,247 @@ +//gcc --std=c99 -g3 -O0 -I./ -I../include test_oaconvert.c yuv.c grey.c oavideo.c -o test_oaconvert +//or `head -n 1 test_oaconvert.c | cut -c 3-` +// ./test_oaconvert 2>&1 | tee test_oaconvert.txt; LINE=`grep at\ line test_oaconvert.txt | sed -e 's/.* at line //g'`; head -n $LINE test_oaconvert.c | tail -n 1 +#include +#include +#include + +#include +#include +#include "yuv.h" +#include "grey.h" + + +#define TARGET_LENGTH 24 + +uint8_t source[] = { 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0xcd, 0xef, + 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0xcd, 0xef, + 0x01, 0x23, 0x45, 0x67, + 0x89, 0xab, 0xcd, 0xef }; + +uint8_t empty[] = { 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 }; + +void print_array(uint8_t* buf, int len, int sep) +{ + int i; + for ( i = 0; i < len; ++i ) + { + if (i == sep) + fprintf(stderr, " ... "); + fprintf(stderr, "%02x ", *(buf+i)); + } + fprintf(stderr, "\n"); +} + +void assert(int fmt, uint8_t expected[], uint8_t* target, int length, int check_nulls, int LINE) +{ + fprintf(stderr, "."); + if (0 != memcmp(target, expected, length)) { + fprintf(stderr, "F\n"); + fprintf(stderr, "Conversion does not match expected at line %d (fmt==%d)\n", LINE, fmt); + fprintf(stderr, "Expected: "); print_array(expected, length, -1); + fprintf(stderr, "Actual: "); print_array(target, length, -1); + exit(-1); + } + if (check_nulls && 0 != memcmp(empty, target+length, TARGET_LENGTH-length)) { + fprintf(stderr, "F\n"); + fprintf(stderr, "Conversion exceeds length of expected (%d) at line %d (fmt==%d)\n", length, LINE, fmt); + print_array(target, TARGET_LENGTH, length); + exit(-1); + } +} + +/** + * Test a conversion from pixel format S to pixel format T + * + * fmt - an index if running in a loop, to provide useful debug on failure + * S - source pixel format + * T - target pixel format + * e - pointer to array of expected result + * l - length of expected result + * L - line at which the function (macro) was invokved + */ +void test_convert(int fmt, int S, int T, uint8_t* e, int l, int L) +{ + uint8_t* t = (uint8_t*) malloc(TARGET_LENGTH); + + // Test conversion from one buffer to another + memset(t, 0, TARGET_LENGTH); + oaconvert(source, t, 2, 2, S, T); + assert(fmt, e, t, l, 1, L); + + // Test in-place conversion + memcpy(t, source, TARGET_LENGTH); + oaconvert(t, t, 2, 2, S, T); + assert(fmt, e, t, l, 0, L); + + free(t); +} + +#define EXPECTED(...) __VA_ARGS__ +#define TEST_CONVERT(fmt, S, T, expected) \ +do {\ + uint8_t e[] = expected;\ + test_convert(fmt, S, T, e, sizeof(e), __LINE__);\ +} while (0); + + + +/* TODO +#define OA_PIX_FMT_YUV444P 22 +#define OA_PIX_FMT_YUV422P 23 +#define OA_PIX_FMT_YUV420P 24 +#define OA_PIX_FMT_YUV410P 25 +#define OA_PIX_FMT_YUYV 27 +#define OA_PIX_FMT_UYVY 28 +#define OA_PIX_FMT_YUV420 29 +#define OA_PIX_FMT_YUV411 30 +#define OA_PIX_FMT_YUV410 31 +*/ + + +void test_8() +{ + int fmt; + uint8_t FORMATS_8[] = { OA_PIX_FMT_GREY8, + OA_PIX_FMT_BGGR8, + OA_PIX_FMT_RGGB8, + OA_PIX_FMT_GBRG8, + OA_PIX_FMT_GRBG8 }; + + fprintf(stderr, "Running tests in %s", __FUNCTION__); + + // 8bit + for ( fmt=0; fmt < sizeof(FORMATS_8); ++fmt ) { + TEST_CONVERT(fmt, FORMATS_8[fmt], OA_PIX_FMT_GREY8, EXPECTED({0x01, 0x23, 0x45, 0x67})); + TEST_CONVERT(fmt, FORMATS_8[fmt], OA_PIX_FMT_GREY16LE, EXPECTED({0x00, 0x01, 0x00, 0x23, 0x00, 0x45, 0x00, 0x67})); + TEST_CONVERT(fmt, FORMATS_8[fmt], OA_PIX_FMT_GREY16BE, EXPECTED({0x01, 0x00, 0x23, 0x00, 0x45, 0x00, 0x67, 0x00})); + } + + fprintf(stderr, "\n"); +} + +void test_10() +{ + int fmt; + uint8_t FORMATS_10P[] = { //OA_PIX_FMT_BGGR10P, + //OA_PIX_FMT_RGGB10P, + //OA_PIX_FMT_GBRG10P, + OA_PIX_FMT_GRBG10P }; + + uint8_t FORMATS_10[] = { //OA_PIX_FMT_BGGR10, + //OA_PIX_FMT_RGGB10, + //OA_PIX_FMT_GBRG10, + OA_PIX_FMT_GRBG10 }; + + fprintf(stderr, "Running tests in %s", __FUNCTION__); + + // 10bit packed + for ( fmt=0; fmt < sizeof(FORMATS_10P); ++fmt ) { + TEST_CONVERT(fmt, FORMATS_10P[fmt], OA_PIX_FMT_GREY8, EXPECTED({0x01, 0x23, 0x45, 0x67})); + TEST_CONVERT(fmt, FORMATS_10P[fmt], OA_PIX_FMT_GREY16LE, EXPECTED({0x40, 0x01, 0x80, 0x23, 0x00, 0x45, 0x80, 0x67})); + TEST_CONVERT(fmt, FORMATS_10P[fmt], OA_PIX_FMT_GREY16BE, EXPECTED({0x01, 0x40, 0x23, 0x80, 0x45, 0x00, 0x67, 0x80})); + } + + // 10bit + for ( fmt=0; fmt < sizeof(FORMATS_10); ++fmt ) { + TEST_CONVERT(fmt, FORMATS_10[fmt], OA_PIX_FMT_GREY8, EXPECTED({0xc0, 0xd1, 0xe2, 0xf3})); + TEST_CONVERT(fmt, FORMATS_10[fmt], OA_PIX_FMT_GREY16LE, EXPECTED({0x40, 0xc0, 0x40, 0xd1, 0x40, 0xe2, 0x40, 0xf3})); + TEST_CONVERT(fmt, FORMATS_10[fmt], OA_PIX_FMT_GREY16BE, EXPECTED({0xc0, 0x40, 0xd1, 0x40, 0xe2, 0x40, 0xf3, 0x40})); + } + + fprintf(stderr, "\n"); +} + +void test_16 () +{ + int fmt; + uint8_t FORMATS_16LE[] = { OA_PIX_FMT_GREY16LE, + OA_PIX_FMT_BGGR16LE, + OA_PIX_FMT_RGGB16LE, + OA_PIX_FMT_GBRG16LE, + OA_PIX_FMT_GRBG16LE }; + + uint8_t FORMATS_16BE[] = { OA_PIX_FMT_GREY16BE, + OA_PIX_FMT_BGGR16BE, + OA_PIX_FMT_RGGB16BE, + OA_PIX_FMT_GBRG16BE, + OA_PIX_FMT_GRBG16BE }; + + fprintf(stderr, "Running tests in %s", __FUNCTION__); + + // 16bit LE + for ( fmt=0; fmt < sizeof(FORMATS_16LE); ++fmt ) { + TEST_CONVERT(fmt, FORMATS_16LE[fmt], OA_PIX_FMT_GREY8, EXPECTED({0x23, 0x67, 0xab, 0xef})); + TEST_CONVERT(fmt, FORMATS_16LE[fmt], OA_PIX_FMT_GREY16LE, EXPECTED({0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef})); + TEST_CONVERT(fmt, FORMATS_16LE[fmt], OA_PIX_FMT_GREY16BE, EXPECTED({0x23, 0x01, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd})); + } + + // 16bit BE + for ( fmt=0; fmt < sizeof(FORMATS_16BE); ++fmt ) { + TEST_CONVERT(fmt, FORMATS_16BE[fmt], OA_PIX_FMT_GREY8, EXPECTED({0x01, 0x45, 0x89, 0xcd})); + TEST_CONVERT(fmt, FORMATS_16BE[fmt], OA_PIX_FMT_GREY16LE, EXPECTED({0x23, 0x01, 0x67, 0x45, 0xab, 0x89, 0xef, 0xcd})); + TEST_CONVERT(fmt, FORMATS_16BE[fmt], OA_PIX_FMT_GREY16BE, EXPECTED({0x01, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef})); + } + + fprintf(stderr, "\n"); +} + + +void test_rgb24() +{ + fprintf(stderr, "Running tests in %s", __FUNCTION__); + + // RGB24 + TEST_CONVERT(0, OA_PIX_FMT_RGB24, OA_PIX_FMT_GREY8, EXPECTED({0x1e, 0x84, 0xd6, 0x40})); + TEST_CONVERT(0, OA_PIX_FMT_RGB24, OA_PIX_FMT_GREY16LE, EXPECTED({0x39, 0x1e, 0x39, 0x84, 0x96, 0xd6, 0x39, 0x40})); + TEST_CONVERT(0, OA_PIX_FMT_RGB24, OA_PIX_FMT_GREY16BE, EXPECTED({0x1e, 0x39, 0x84, 0x39, 0xd6, 0x96, 0x40, 0x39})); + + // BGR24 + TEST_CONVERT(0, OA_PIX_FMT_BGR24, OA_PIX_FMT_GREY8, EXPECTED({0x27, 0x8d, 0xb9, 0x49})); + TEST_CONVERT(0, OA_PIX_FMT_BGR24, OA_PIX_FMT_GREY16LE, EXPECTED({0xc6, 0x27, 0xc6, 0x8d, 0xf2, 0xb9, 0xc6, 0x49})); + TEST_CONVERT(0, OA_PIX_FMT_BGR24, OA_PIX_FMT_GREY16BE, EXPECTED({0x27, 0xc6, 0x8d, 0xc6, 0xb9, 0xf2, 0x49, 0xc6})); + + fprintf(stderr, "\n"); +} + +void test_rgb48() +{ + fprintf(stderr, "Running tests in %s", __FUNCTION__); + + // RGB48 + TEST_CONVERT(0, OA_PIX_FMT_RGB48LE, OA_PIX_FMT_GREY8, EXPECTED({0x5d, 0x53, 0xd2, 0xa1})); + TEST_CONVERT(0, OA_PIX_FMT_RGB48LE, OA_PIX_FMT_GREY16LE, EXPECTED({0xaf, 0x5d, 0x78, 0x53, 0x80, 0xd2, 0xf3, 0xa1})); + TEST_CONVERT(0, OA_PIX_FMT_RGB48LE, OA_PIX_FMT_GREY16BE, EXPECTED({0x5d, 0xaf, 0x53, 0x78, 0xd2, 0x80, 0xa1, 0xf3})); + + TEST_CONVERT(0, OA_PIX_FMT_RGB48BE, OA_PIX_FMT_GREY8, EXPECTED({0x3b, 0x31, 0xb0, 0x80})); + TEST_CONVERT(0, OA_PIX_FMT_RGB48BE, OA_PIX_FMT_GREY16LE, EXPECTED({0xd1, 0x3b, 0x9a, 0x31, 0xa2, 0xb0, 0x15, 0x80})); + TEST_CONVERT(0, OA_PIX_FMT_RGB48BE, OA_PIX_FMT_GREY16BE, EXPECTED({0x3b, 0xd1, 0x31, 0x9a, 0xb0, 0xa2, 0x80, 0x15})); + + // BGR48 + TEST_CONVERT(0, OA_PIX_FMT_BGR48LE, OA_PIX_FMT_GREY8, EXPECTED({0x70, 0x40, 0xbf, 0xb5})); + TEST_CONVERT(0, OA_PIX_FMT_BGR48LE, OA_PIX_FMT_GREY16LE, EXPECTED({0xda, 0x70, 0x4d, 0x40, 0x55, 0xbf, 0x1e, 0xb5})); + TEST_CONVERT(0, OA_PIX_FMT_BGR48LE, OA_PIX_FMT_GREY16BE, EXPECTED({0x70, 0xda, 0x40, 0x4d, 0xbf, 0x55, 0xb5, 0x1e})); + + TEST_CONVERT(0, OA_PIX_FMT_BGR48BE, OA_PIX_FMT_GREY8, EXPECTED({0x4e, 0x1e, 0x9d, 0x93})); + TEST_CONVERT(0, OA_PIX_FMT_BGR48BE, OA_PIX_FMT_GREY16LE, EXPECTED({0xfc, 0x4e, 0x6f, 0x1e, 0x77, 0x9d, 0x40, 0x93})); + TEST_CONVERT(0, OA_PIX_FMT_BGR48BE, OA_PIX_FMT_GREY16BE, EXPECTED({0x4e, 0xfc, 0x1e, 0x6f, 0x9d, 0x77, 0x93, 0x40})); + + fprintf(stderr, "\n"); +} + +int main() +{ + test_8(); + test_10(); + test_16(); + test_rgb24(); + test_rgb48(); +} + diff --git a/liboavideo/yuv.c b/liboavideo/yuv.c index 8d2b3bb1..0869bbab 100644 --- a/liboavideo/yuv.c +++ b/liboavideo/yuv.c @@ -27,6 +27,8 @@ #include #include +#include + #include "yuv.h" #include "yuvlut.h" diff --git a/oacapture/qt-icons/greyscale.png b/oacapture/qt-icons/greyscale.png new file mode 100644 index 0000000000000000000000000000000000000000..553d041f8123aa1dd0a3735d5f5bb1b5206f43e2 GIT binary patch literal 4029 zcmeHJX;hQP8vaO7AR0m3&`=Bkg@Q>4f)*qRAqYeXL=AyzBZTAwV#s24QDhNO**954 zp-PnQU%_QFoX*B8J3e8#!WXA zFue5%EVEzL(bqaUXmI9i)r;}`O^g_7by)Ko#-bH}^170WU*5H}bu33L--}+b+iiVN z!PRSoK;P`15KZ()cz5Kj%@fe>`_MY{3q7~PQGwkL8(&D{YM#owMm|-2NKT=}Z7$q= zzn}Tql*eR@RZof@8WwNz*DOA?E0OVd7zYuA1}~B$3@pxB!Uj)MNvEi}Rx4c@58t)t z*bCh9h9O|V`C!9kKN&)?)f8nhv0cCOJ;kld_Gsvk8o`LABVJgp0yjH{2C zC;dDe1=qxv_A*M_*N^@j%j~vCFdUxc-mz0h>-R0C_dy$y@0Jghxpqz3d48AMao-Y{ zx%1Yxwgy@mBvoFNwXn<}MyPtKU|n;Pa7gF{@*e0PCC59k$DYSkF1}>A`;Z zCejMm%~QIg6;C+pik3q3iwkJkOZCBMu#!BZi%2IwEWO<6G!~nPsU3On3v8V5ckd2K zSJ06~gg7HIEbp8Lf;oX}G1=8l$vF44E-u0wcRp)lR)|-p`iv@V+%nTgF3v1$US8}l zjH1`5pCn+0qu|hI_v^m}6)z_3) zYratTP4g3*F?C~_h$O16G5o7B3;=1c-(xVmoBwLEMd4{8JuA~>0TyMo~pC*47 zdUeS_nfIq;!dMEg26N&3GM%AY;A_45bbI$JkUds=r}z_>gzP}e%0v`PohDzJZ@}@% zK9&3l$s4(x?}o3aB=pqBygzmC8nNYe$C}42J(t#>3Dz*x^30b#eZ`Txf6rrXS=Bi+ zn`=-9`a5xEX`?oDg4ydB&N>(|A1j_}Zd;gj^Dc z?GDX7>be({S#-7a)#UFUz3lMDxXYZaX}yAPIOcWw-N94@-cQ9ZHLXUsjPx3xKs#SsRB7$sk%4FUjMh)NNQ z%>$*#U@(*`z@x_MZ=jG|4j$$2NVTJi$Y2=PD?$wJitwScBY12l4vI*CxhS2r1bk4+ zLMr*;0*SK{kNV8(tewwoV^PS@5GfCj3ZT-EWT6;DI$#_ycId52uG}6)fFWJPoDk=o z?jBz#v@1L+Oez&QW3dW_0;AZ75sE{xI4373terj9-X5(*pd|+cQkD`ekXX!7{F}oa zl(5BG<+wrta*mS~ER;#{D3ta;@(VeK{SUWDCJz71%wc1}aF7oQq!KI+gTsEtbJ)%v zLNTAEJ-KsYP zTei#|p0)p%YVFo)>DB-#S;(JrA^=$ovZNpfso+Y(ke(DO%|B+zDlMpo;!dJl-vu*B z8Bm-))b`t)y742=X4eitO%CpR{zQc|j|+VK*q640q|uv%<}EJMEYxkfucLd9E{n2( zw2^=_t1P|hjN{TEUOP`hE93{#90ywCH?wfr4dG`K;7q@j+o5Y(l=MOjsn@Z@{?(=B z)M|@f(DDOOk3UIZRyJn7KTgf8-7X7@Wup}i)2nm(Rnp%X{2W1jTlSSm-uDMBQrZlI zet0 Date: Wed, 25 Oct 2017 17:12:22 +0100 Subject: [PATCH 2/7] Added const pointers and removed 10bit routines --- include/openastro/video.h | 3 ++- liboavideo/grey.c | 44 ++++++++++++++++++----------------- liboavideo/grey.h | 46 +++++++++++++++++++------------------ liboavideo/oavideo.c | 45 ++++++++++++++++++------------------ liboavideo/test_oaconvert.c | 5 +++- liboavideo/yuv.c | 34 +++++++++++++-------------- liboavideo/yuv.h | 12 ++++++---- 7 files changed, 99 insertions(+), 90 deletions(-) diff --git a/include/openastro/video.h b/include/openastro/video.h index 73e39813..e6314743 100644 --- a/include/openastro/video.h +++ b/include/openastro/video.h @@ -27,6 +27,7 @@ #ifndef OPENASTRO_VIDEO_H #define OPENASTRO_VIDEO_H -extern int oaconvert ( void*, void*, int, int, int, int ); +extern int oaconvert ( const void*, void*, int, int, int, int ); +extern int oaconvert_greyscale ( const void*, void*, int, int, int, int ); #endif /* OPENASTRO_VIDEO_H */ diff --git a/liboavideo/grey.c b/liboavideo/grey.c index 9302dcec..a9017b75 100644 --- a/liboavideo/grey.c +++ b/liboavideo/grey.c @@ -30,11 +30,11 @@ #include "grey.h" void -oaGreyscale_8to16LE( uint8_t* source, uint8_t* target, int len ) +oaGreyscale_8to16LE( const uint8_t* source, uint8_t* target, int len ) { int i; uint8_t* t = target + (len-1)*2; - uint8_t* s = source + (len-1); + const uint8_t* s = source + (len-1); for ( i = len; i > 0; i--, s-=1, t-=2 ) { *(t+1) = *s; @@ -43,12 +43,12 @@ oaGreyscale_8to16LE( uint8_t* source, uint8_t* target, int len ) } void -oaGreyscale_8to16BE( uint8_t* source, uint8_t* target, int len ) +oaGreyscale_8to16BE( const uint8_t* source, uint8_t* target, int len ) { int i; uint8_t v; uint8_t* t = target + (len-1)*2; - uint8_t* s = source + (len-1); + const uint8_t* s = source + (len-1); for ( i = len; i > 0; i--, s-=1, t-=2 ) { *t = *s; @@ -56,8 +56,9 @@ oaGreyscale_8to16BE( uint8_t* source, uint8_t* target, int len ) } } +/* FIXME awaiting OA_PIX_FMT_XXXX10X void -oaGreyscale_10to8( uint8_t* s, uint8_t* t, int len, bool packed ) +oaGreyscale_10to8( const uint8_t* s, uint8_t* t, int len, bool packed ) { int i; uint16_t p; @@ -80,10 +81,10 @@ oaGreyscale_10to8( uint8_t* s, uint8_t* t, int len, bool packed ) } void -oaGreyscale_10to16( uint8_t* source, uint8_t* target, int len, bool packed, bool little_endian ) +oaGreyscale_10to16( const uint8_t* source, uint8_t* target, int len, bool packed, bool little_endian ) { int i; - uint8_t* s; + const uint8_t* s; uint8_t* t; uint16_t p1, p2, p3, p4; @@ -144,19 +145,20 @@ oaGreyscale_10to16( uint8_t* source, uint8_t* target, int len, bool packed, bool } void -oaGreyscale_10to16LE( uint8_t* s, uint8_t* t, int len, bool packed ) +oaGreyscale_10to16LE( const uint8_t* s, uint8_t* t, int len, bool packed ) { oaGreyscale_10to16( s, t, len, packed, true ); } void -oaGreyscale_10to16BE( uint8_t* s, uint8_t* t, int len, bool packed ) +oaGreyscale_10to16BE( const uint8_t* s, uint8_t* t, int len, bool packed ) { oaGreyscale_10to16( s, t, len, packed, false ); } +*/ void -oaGreyscale_16LEto8( uint8_t* s, uint8_t* t, int len ) +oaGreyscale_16LEto8( const uint8_t* s, uint8_t* t, int len ) { int i; for ( i = 0; i < len; i+=2, s+=2, t++ ) { @@ -165,7 +167,7 @@ oaGreyscale_16LEto8( uint8_t* s, uint8_t* t, int len ) } void -oaGreyscale_16BEto8( uint8_t* s, uint8_t* t, int len ) +oaGreyscale_16BEto8( const uint8_t* s, uint8_t* t, int len ) { int i; for ( i = 0; i < len; i+=2, s+=2, t++ ) { @@ -174,7 +176,7 @@ oaGreyscale_16BEto8( uint8_t* s, uint8_t* t, int len ) } void -oaGreyscale_16swap( uint8_t* s, uint8_t* t, int len ) +oaGreyscale_16swap( const uint8_t* s, uint8_t* t, int len ) { int i; for ( i = 0; i < len; i+=2, s+=2, t+=2 ) { @@ -185,7 +187,7 @@ oaGreyscale_16swap( uint8_t* s, uint8_t* t, int len ) } void -oaGreyscale_RGB24to8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB24to8( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint8_t R, G, B; @@ -196,7 +198,7 @@ oaGreyscale_RGB24to8( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB24to16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB24to16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -210,7 +212,7 @@ oaGreyscale_RGB24to16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB24to16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB24to16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -224,7 +226,7 @@ oaGreyscale_RGB24to16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48LEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48LEto8( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -239,7 +241,7 @@ oaGreyscale_RGB48LEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48LEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48LEto16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -255,7 +257,7 @@ oaGreyscale_RGB48LEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48LEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48LEto16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -271,7 +273,7 @@ oaGreyscale_RGB48LEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48BEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48BEto8( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -286,7 +288,7 @@ oaGreyscale_RGB48BEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48BEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48BEto16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; @@ -302,7 +304,7 @@ oaGreyscale_RGB48BEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ) } void -oaGreyscale_RGB48BEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ) +oaGreyscale_RGB48BEto16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ) { int i; uint16_t R, G, B; diff --git a/liboavideo/grey.h b/liboavideo/grey.h index 0a0672b1..f9542060 100644 --- a/liboavideo/grey.h +++ b/liboavideo/grey.h @@ -30,27 +30,29 @@ #include typedef enum { false, true } bool; -extern void oaGreyscale_8to16LE( uint8_t* s, uint8_t* t, int len ); -extern void oaGreyscale_8to16BE( uint8_t* s, uint8_t* t, int len ); - -extern void oaGreyscale_10to8( uint8_t* s, uint8_t* t, int len, bool packed ); -extern void oaGreyscale_10to16LE( uint8_t* s, uint8_t* t, int len, bool packed ); -extern void oaGreyscale_10to16BE( uint8_t* s, uint8_t* t, int len, bool packed ); - -extern void oaGreyscale_16LEto8( uint8_t* s, uint8_t* t, int len ); -extern void oaGreyscale_16BEto8( uint8_t* s, uint8_t* t, int len ); -extern void oaGreyscale_16swap( uint8_t* s, uint8_t* t, int len ); - -extern void oaGreyscale_RGB24to8( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB24to16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB24to16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); - -extern void oaGreyscale_RGB48LEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB48LEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB48LEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); - -extern void oaGreyscale_RGB48BEto8( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB48BEto16LE( uint8_t* s, uint8_t* t, int len, bool swapRB ); -extern void oaGreyscale_RGB48BEto16BE( uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_8to16LE( const uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_8to16BE( const uint8_t* s, uint8_t* t, int len ); + +/* FIXME awaiting OA_PIX_FMT_XXXX10X +extern void oaGreyscale_10to8( const uint8_t* s, uint8_t* t, int len, bool packed ); +extern void oaGreyscale_10to16LE( const uint8_t* s, uint8_t* t, int len, bool packed ); +extern void oaGreyscale_10to16BE( const uint8_t* s, uint8_t* t, int len, bool packed ); +*/ + +extern void oaGreyscale_16LEto8( const uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_16BEto8( const uint8_t* s, uint8_t* t, int len ); +extern void oaGreyscale_16swap( const uint8_t* s, uint8_t* t, int len ); + +extern void oaGreyscale_RGB24to8( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB24to16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB24to16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); + +extern void oaGreyscale_RGB48LEto8( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48LEto16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48LEto16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); + +extern void oaGreyscale_RGB48BEto8( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48BEto16LE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); +extern void oaGreyscale_RGB48BEto16BE( const uint8_t* s, uint8_t* t, int len, bool swapRB ); #endif /* OPENASTRO_VIDEO_GREY_H */ diff --git a/liboavideo/oavideo.c b/liboavideo/oavideo.c index ca13b97a..b37362fb 100644 --- a/liboavideo/oavideo.c +++ b/liboavideo/oavideo.c @@ -34,7 +34,7 @@ #include "grey.h" int -oaconvert ( void* source, void* target, int xSize, int ySize, int sourceFormat, +oaconvert ( const void* source, void* target, int xSize, int ySize, int sourceFormat, int targetFormat ) { if ( OA_ISGREYSCALE( targetFormat ) ) { @@ -76,18 +76,8 @@ oaconvert ( void* source, void* target, int xSize, int ySize, int sourceFormat, -//#define OA_PIX_FMT_YUV444P 22 -//#define OA_PIX_FMT_YUV422P 23 -//#define OA_PIX_FMT_YUV420P 24 -//#define OA_PIX_FMT_YUV410P 25 -//#define OA_PIX_FMT_YUYV 27 -//#define OA_PIX_FMT_UYVY 28 -//#define OA_PIX_FMT_YUV420 29 -//#define OA_PIX_FMT_YUV411 30 -//#define OA_PIX_FMT_YUV410 31 - int -oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sourceFormat, +oaconvert_greyscale ( const void* source, void* target, int xSize, int ySize, int sourceFormat, int targetFormat ) { int length; @@ -126,6 +116,7 @@ oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sour } break; +/* FIXME awaiting OA_PIX_FMTXXXX10X //case OA_PIX_FMT_BGGR10P: //case OA_PIX_FMT_RGGB10P: //case OA_PIX_FMT_GBRG10P: @@ -133,13 +124,13 @@ oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sour length = xSize * ySize * 1.25; switch ( targetFormat ) { case OA_PIX_FMT_GREY8: - oaGreyscale_10to8( source, target, length, 1 ); + oaGreyscale_10to8( source, target, length, true ); break; case OA_PIX_FMT_GREY16LE: - oaGreyscale_10to16LE( source, target, length, 1 ); + oaGreyscale_10to16LE( source, target, length, true ); break; case OA_PIX_FMT_GREY16BE: - oaGreyscale_10to16BE( source, target, length, 1 ); + oaGreyscale_10to16BE( source, target, length, true ); break; default: return -1; // FIX ME -- set errno @@ -153,19 +144,19 @@ oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sour length = xSize * ySize * 2; switch ( targetFormat ) { case OA_PIX_FMT_GREY8: - oaGreyscale_10to8( source, target, length, 0 ); + oaGreyscale_10to8( source, target, length, false ); break; case OA_PIX_FMT_GREY16LE: - oaGreyscale_10to16LE( source, target, length, 0 ); + oaGreyscale_10to16LE( source, target, length, false ); break; case OA_PIX_FMT_GREY16BE: - oaGreyscale_10to16BE( source, target, length, 0 ); + oaGreyscale_10to16BE( source, target, length, false ); break; default: return -1; // FIX ME -- set errno } break; - +*/ case OA_PIX_FMT_GREY16LE: case OA_PIX_FMT_BGGR16LE: case OA_PIX_FMT_RGGB16LE: @@ -201,7 +192,7 @@ oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sour oaGreyscale_16swap( source, target, length ); break; case OA_PIX_FMT_GREY16BE: - if ( target != source ) memcpy( target, source, xSize * ySize * 2 ); + if ( target != source ) memcpy( target, source, length ); break; default: return -1; // FIX ME -- set errno @@ -264,9 +255,19 @@ oaconvert_greyscale ( void* source, void* target, int xSize, int ySize, int sour return -1; // FIX ME -- set errno } break; - + + //FIXME TODO + case OA_PIX_FMT_YUV444P: + case OA_PIX_FMT_YUV422P: + case OA_PIX_FMT_YUV420P: + case OA_PIX_FMT_YUV410P: + case OA_PIX_FMT_YUYV: + case OA_PIX_FMT_UYVY: + case OA_PIX_FMT_YUV420: + case OA_PIX_FMT_YUV411: + case OA_PIX_FMT_YUV410: default: - return -1; + return -1; // FIX ME -- set errno } return 0; } diff --git a/liboavideo/test_oaconvert.c b/liboavideo/test_oaconvert.c index 8cd4448a..734075da 100644 --- a/liboavideo/test_oaconvert.c +++ b/liboavideo/test_oaconvert.c @@ -93,7 +93,7 @@ do {\ -/* TODO +/* FIXME - no routines and hence no tests exist for the following formats #define OA_PIX_FMT_YUV444P 22 #define OA_PIX_FMT_YUV422P 23 #define OA_PIX_FMT_YUV420P 24 @@ -129,6 +129,8 @@ void test_8() void test_10() { +/* FIXME awaiting OA_PIX_FMT_XXXX10X + int fmt; uint8_t FORMATS_10P[] = { //OA_PIX_FMT_BGGR10P, //OA_PIX_FMT_RGGB10P, @@ -157,6 +159,7 @@ void test_10() } fprintf(stderr, "\n"); +*/ } void test_16 () diff --git a/liboavideo/yuv.c b/liboavideo/yuv.c index 0869bbab..223f54ba 100644 --- a/liboavideo/yuv.c +++ b/liboavideo/yuv.c @@ -27,8 +27,6 @@ #include #include -#include - #include "yuv.h" #include "yuvlut.h" @@ -36,13 +34,13 @@ void -oaYUV444PtoRGB888 ( void* source, void* target, unsigned int xSize, +oaYUV444PtoRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; - uint8_t* ys = source; - uint8_t* us = ( uint8_t* ) source + len; - uint8_t* vs = ( uint8_t* ) source + 2 * len; + const uint8_t* ys = source; + const uint8_t* us = ( uint8_t* ) source + len; + const uint8_t* vs = ( uint8_t* ) source + 2 * len; uint8_t* t = ( uint8_t* ) target; int32_t r32, g32, b32; uint8_t r8, g8, b8, y, u, v; @@ -66,13 +64,13 @@ oaYUV444PtoRGB888 ( void* source, void* target, unsigned int xSize, void -oaYUV422PtoRGB888 ( void* source, void* target, unsigned int xSize, +oaYUV422PtoRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; - uint8_t* ys = ( uint8_t* ) source; - uint8_t* us = ( uint8_t* ) source + len; - uint8_t* vs = us + len / 2; + const uint8_t* ys = ( uint8_t* ) source; + const uint8_t* us = ( uint8_t* ) source + len; + const uint8_t* vs = us + len / 2; uint8_t* t = ( uint8_t* ) target; int32_t r32, g32, b32; uint8_t r8, g8, b8, y1, y2, u, v; @@ -115,7 +113,7 @@ oaYUV422PtoRGB888 ( void* source, void* target, unsigned int xSize, void -oaYUV420PtoRGB888 ( void* source, void* target, unsigned int xSize, +oaYUV420PtoRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; @@ -123,7 +121,7 @@ oaYUV420PtoRGB888 ( void* source, void* target, unsigned int xSize, unsigned int c, r; int32_t r32, g32, b32; uint8_t r8, g8, b8, y, u, v; - uint8_t* ys = ( uint8_t* ) source; + const uint8_t* ys = ( uint8_t* ) source; uint8_t* u_off; uint8_t* v_off; uint8_t* t = ( uint8_t* ) target; @@ -154,11 +152,11 @@ oaYUV420PtoRGB888 ( void* source, void* target, unsigned int xSize, void -oaYUYVtoRGB888 ( void* source, void* target, unsigned int xSize, +oaYUYVtoRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; - uint8_t* s = ( uint8_t* ) source; + const uint8_t* s = ( uint8_t* ) source; uint8_t* t = ( uint8_t* ) target; int32_t r32, g32, b32; uint8_t r8, g8, b8, y1, y2, u, v; @@ -201,11 +199,11 @@ oaYUYVtoRGB888 ( void* source, void* target, unsigned int xSize, void -oaUYVYtoRGB888 ( void* source, void* target, unsigned int xSize, +oaUYVYtoRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; - uint8_t* s = ( uint8_t* ) source; + const uint8_t* s = ( uint8_t* ) source; uint8_t* t = ( uint8_t* ) target; int32_t r32, g32, b32; uint8_t r8, g8, b8, y1, y2, u, v; @@ -248,11 +246,11 @@ oaUYVYtoRGB888 ( void* source, void* target, unsigned int xSize, void -oaYUV411toRGB888 ( void* source, void* target, unsigned int xSize, +oaYUV411toRGB888 ( const void* source, void* target, unsigned int xSize, unsigned int ySize ) { unsigned int len = xSize * ySize; - uint8_t* s = ( uint8_t* ) source; + const uint8_t* s = ( uint8_t* ) source; uint8_t* t = ( uint8_t* ) target; int32_t r32, g32, b32; uint8_t r8, g8, b8, y1, y2, y3, y4, u, v; diff --git a/liboavideo/yuv.h b/liboavideo/yuv.h index 64b5a8fc..ab667f32 100644 --- a/liboavideo/yuv.h +++ b/liboavideo/yuv.h @@ -27,10 +27,12 @@ #ifndef OPENASTRO_VIDEO_YUV_H #define OPENASTRO_VIDEO_YUV_H -extern void oaYUV444PtoRGB888 ( void*, void*, unsigned int, unsigned int ); -extern void oaYUV422PtoRGB888 ( void*, void*, unsigned int, unsigned int ); -extern void oaYUV411toRGB888 ( void*, void*, unsigned int, unsigned int ); -extern void oaYUYVtoRGB888 ( void*, void*, unsigned int, unsigned int ); -extern void oaUYVYtoRGB888 ( void*, void*, unsigned int, unsigned int ); +#include + +extern void oaYUV444PtoRGB888 ( const void*, void*, unsigned int, unsigned int ); +extern void oaYUV422PtoRGB888 ( const void*, void*, unsigned int, unsigned int ); +extern void oaYUV411toRGB888 ( const void*, void*, unsigned int, unsigned int ); +extern void oaYUYVtoRGB888 ( const void*, void*, unsigned int, unsigned int ); +extern void oaUYVYtoRGB888 ( const void*, void*, unsigned int, unsigned int ); #endif /* OPENASTRO_VIDEO_YUV_H */ From 38e478e1ceae9526f9b2703be129aa06051337b8 Mon Sep 17 00:00:00 2001 From: Joe Bloggs Date: Wed, 25 Oct 2017 17:14:41 +0100 Subject: [PATCH 3/7] Fixed sp. --- liboavideo/grey.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/liboavideo/grey.c b/liboavideo/grey.c index a9017b75..f1309e8f 100644 --- a/liboavideo/grey.c +++ b/liboavideo/grey.c @@ -1,6 +1,6 @@ /***************************************************************************** * - * yuv.c -- convert YUV formats to RGB888 + * grey.c -- convert any format to GREYxx * * Copyright 2014 James Fidell (james@openastroproject.org) * From a3fcd364cc2fe0aad67e6885f3aae27ad3e8a340 Mon Sep 17 00:00:00 2001 From: Joe Bloggs Date: Wed, 25 Oct 2017 17:16:50 +0100 Subject: [PATCH 4/7] moved include fro .h to .c --- liboavideo/test_oaconvert | Bin 0 -> 70880 bytes liboavideo/test_oaconvert.txt | 4 ++++ liboavideo/yuv.c | 2 ++ liboavideo/yuv.h | 2 -- 4 files changed, 6 insertions(+), 2 deletions(-) create mode 100755 liboavideo/test_oaconvert create mode 100644 liboavideo/test_oaconvert.txt diff --git a/liboavideo/test_oaconvert b/liboavideo/test_oaconvert new file mode 100755 index 0000000000000000000000000000000000000000..400538b0aafb307659f87ab41e71ce7099e85c9e GIT binary patch literal 70880 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 literal 0 HcmV?d00001 diff --git a/liboavideo/test_oaconvert.txt b/liboavideo/test_oaconvert.txt new file mode 100644 index 00000000..85061cec --- /dev/null +++ b/liboavideo/test_oaconvert.txt @@ -0,0 +1,4 @@ +Running tests in test_8.............................. +Running tests in test_16............................................................ +Running tests in test_rgb24............ +Running tests in test_rgb48........................ diff --git a/liboavideo/yuv.c b/liboavideo/yuv.c index 223f54ba..e49c0834 100644 --- a/liboavideo/yuv.c +++ b/liboavideo/yuv.c @@ -27,6 +27,8 @@ #include #include +#include + #include "yuv.h" #include "yuvlut.h" diff --git a/liboavideo/yuv.h b/liboavideo/yuv.h index ab667f32..a734797a 100644 --- a/liboavideo/yuv.h +++ b/liboavideo/yuv.h @@ -27,8 +27,6 @@ #ifndef OPENASTRO_VIDEO_YUV_H #define OPENASTRO_VIDEO_YUV_H -#include - extern void oaYUV444PtoRGB888 ( const void*, void*, unsigned int, unsigned int ); extern void oaYUV422PtoRGB888 ( const void*, void*, unsigned int, unsigned int ); extern void oaYUV411toRGB888 ( const void*, void*, unsigned int, unsigned int ); From bfaa934e56cc0e7b1a77344b74cad8776b058be0 Mon Sep 17 00:00:00 2001 From: Joe Bloggs Date: Wed, 25 Oct 2017 17:23:58 +0100 Subject: [PATCH 5/7] removed test binary and log --- liboavideo/test_oaconvert | Bin 70880 -> 0 bytes liboavideo/test_oaconvert.txt | 4 ---- 2 files changed, 4 deletions(-) delete mode 100755 liboavideo/test_oaconvert delete mode 100644 liboavideo/test_oaconvert.txt diff --git a/liboavideo/test_oaconvert b/liboavideo/test_oaconvert deleted file mode 100755 index 400538b0aafb307659f87ab41e71ce7099e85c9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70880 zcmeEv31C#!)&H9%$s|A$ASf!zAfO3L$Yc+S%#ukakc})XEq+5tCXgDEGz*K0Xai!3 z7O=GyK5S8NskIcVvZ$3Lqrn9g6$M+Zpr}Ex;!=xC<^Mb9-uLFsWP*Ht?f3oL|9_PC z-rdeQ_uO;NJ@?%EURJmZ^Na?AqW+A^6$+)+McO$_TovW;fIuC)lC4-2yD~-@r9`4u z1pcY@?D9#ycgkk!-GaLGGvS|^9*lIs&uGU5KcgKNMH#`@z+J^ocfuF=+2y0Se|CjP zs&_@Pat5^{S_6d6qZHEf_|`duZ%VJctL=z9YB$_2%7@GP>V3Z?Ouei9qrTC<5wd?H zjCQ0bZKs>0DsX3BAiwn8)*5;qoywV z)$yjWi;{&zFY#-DOozLD51HDK=qeCh;qou)C*RXg{<;0++xyA)BHxOCp}#T62uIKO ze)6f$;p)?{hs#ez{$S-irL$}vo&?|c0pnLq!dqePgxK(puwdZdPiSG}pEIP@}o7p|w`=dI^xXrM0TL)w`&wu0g47_W6*# zU{Pa(%=Rkzg#}KRH#OOou05tEXAm7m-G4ONYTAG&8h=&ZezyMS7b*3_THIgcNyF5yvs@w$Aef?PCQmrpXO{;axuRi~&d zQJ1f`J1M$+z20T(@>N?vaO}E#y^eTv`J_MUuT+<>*AGwo35#b<#Kg<3if2`4Yees3 zXyIvp(&85_PiI_=qSIr?;2Jm5jweblq{3r|PvbZCd`cTAy`R%VC`~Ln*2(D@N)v02 zZRfO+(!`Qun>qdEWk?e%j;-VLCzK`@9J`*=A5fZx<5&}?-=;LN;@CV+|B=$ff@7te zo{x0xI;8n$`>>$nrT_4ByzOZ}da|^lU~gx9mR<4e?b@74x4kb8wJW`|(D1X`xRJSv zvTH9CqS7;w93_LhMqC9R!_(B-j24T9hHaoy1yoRkI!7= z{`xZa;kJt~=F9ctnEwQg;GRVAruWz1oIZ_Op6dOcHSS)IVSn5XC2j{25pPYi zDo-R6|2p6)Ui*Hj*UB3n=K8d01e8xxhH@eir-ZwYtNDIh)hC`pq*{9E)A zAP*M^eg)cGOKp~EZF+TWmZ8la0?}K5^7iFNmAI8R1KFevy0?r|SB^tg|V?s32E z?s31ffb{3~xE;9>C*yXU^xRT;7#WV;SEHt57uh~f$4ifrO#~SvC_V1|0Pzw)yo~!R z0CNEMR{`oZ+z<8vx1YgX!{Epi5;)RgfE&l)IsvK+O}hcgkNcAV^%U+s3wqppl~C$B z8Qir&;D}0q`x6)@6}w)jS#}spOU~RYqPZRsG59!OjSJwQDKkPidY zBLKPMqaOFp=R>L6&Mba32%Kc`Qh*C(ajqVKL@41=mTyYgX;{URCfFYNPUm{dVsnCAb$i5!rmiW>HQj_3$e_BSfc6MxW9wuM}OYqeitC#L;8IJ zbJ(%_1zivHQznCXgu(0wh?mghWq^1E_X7a&DnPwvhYsfe%znr27lXhMBXra>FqqCu zp}V(0PIp623(&07vHN9iCd68Hf($JUy3(7)&9?VI9?|soxIcvE4}SuA1c)6-?<6qW z9lKv)Fv4QUP6WW5gu?Z>Hv`0-XmS@oY{7jiK->*b_Z0NF@9hDY&5qp%g1~Sm0$_d( zFc_zYoVrnb@2}b@-f*H5tx@4tRCx4neFpM4s$w9o#6Xr~AYaBn-U+N2$UigIARY`w zmf%4e6My)37)UgIdnpDI&5yzky$cZUeTso3Fc`?U7)%fk0$@&@BJBGC;w6B386aK( zr~?4;DnPw4g$kG2!Oep!E|1RfwW;Dw__l$M>7oM+uSUu6SO=NooL`@ z+h4*!qUrB9Vj$7{;kz)90I_2j29m&FAm0hXPU`tY0L-NfW-~zC2~c+d#1??s3J`Y# z)II3Py~6+o19>zE40j>`<}j<&x+WM82=J|YU_2f{vvrQ$?{l-DP7Fhq=)|wN+4X;f zkwDWQ6~RcL`N~Qd34pi}I^-Ym za4YIr)r#Amo>gtQRrah}jN2nUtCrw)k>?g}=-7QM2m|*ofI(plw1_C~Sye^tdREQH z?T(&R)wul>P^i$c`*`2(CTQJ#^mC$B`!0 zNOt>B+>Xk9PWBH^U%O|z5>=$8{o7_Etyrct_E$HSWhToV&y< zgnX8UPLhUWVQtp?eMauRJ~{99$vFzPzONg#qw07BDJ147_j_ET*(|MMkj;8S4~{hV z4Pmoj?Ss$=V3^*5M(;rT^1}h{AC{wYSmXXH?aL1Z$`8r%Lt6RE?aL1Y$`8o$16uh@ zA*1(7pRszmPtHqhv)(-`7HPFYdamVbZ2TALc|SJme?>~)(+$D9{YvTk!BVPK>?5Tb zxR9~Z@=0PkEByoNOa71DDp|6j1@Z=Y4qwOS!P*Yf|>dJgLq zDb@vTh%{@S;30T|`#UQ4t#R*b?==`Y#YQK2;N%J-*K<2o(g=uP{j7#1_Q6>^eu-vt zpnMctFj7X3q5zS>)4r&eE+=^@vf{u$1|87QLjEKx^GQ!T_AtH$T`zifxT6y57_s3y z0?h#hK@%)a*k3k!+TFc$IV`qq-?;V-jo8rE7l_tGLw}9m?6+~cXp9)lSK>(}f}l~b z0s{5bO-8uz0g{YZ|6JyNtD1m?SoCXXR(LT_0Fj_yR1EBOQ11p#R%gVvp;WB@;zae=IpCP#naP+OA$pIJSIO zmgFFuz~enuj&X#L1B{T2#kF^uMV4Xz@sYBU6c(+LT0tjIroM1Uw;*DM{hE-C`WAS{ zN1p{%syOOpaqpl2<8}GNc8YwB>-w@SfwF#C4hs`Wsz{fBDn6zU52%JuXJzvLJ()Zo z$K6zg*E6zAviI!pTz;Q}CcPrOn;ymR6oTo%gXuqlT99+$<@wi5)UH(2!0(#n) z_bRPXxE)s7Br9CVN1SL_-0F#VT7%6@uwkKKgZm9^VI0D$bd7sI4(7EMw4aJ-ozQ;D z)HVzJJ?y#6-P?Kr)>7gWEgjH2jPs?$uZ=H*?#qu)=ACyslZj=9D0$-~N-pl3pY}2G zB~8D>rtY!3aakiMz;=Bw4Hq&EeSus_KnlKvwr^fSr7_`X*r20fJkc;JJPnhH5Bb0nG98C=NE<_WbvurnkT!jj*PS@mJ7 z)%GX#e1Bob2ZbG<=K{j%gf~3xeuF3Hc-sf`!o>Hlbj)>J>G%(a*S{`+@KZnOHsHxu zD(L+c`dO2clda0wl+>kGB@eEitFd9RueqhJvB6r?=xebyG`3n7RkcPMI>cCMia7%i_sa#ZlebR#iXQYPANz^DV9R`D$9M^}dD$ ztqZMWc0MQTJvbKhXx`qYTR$ohNi?y!7I<`fjXK%K+*)qkwdBObDbnP)cn|r4y zkN z0q5iN;QN9!kzOS8kIA%}-``!W7uxP@(Z^wN;X0%10KS8pGyJ2-z7ORyF_r=RGmI*JGvNLive6R+ze|Hpa<}rp z>C+EkECcPgnbh{VC_nem>C;nCtd%bf;IBb>I?8_^1pl`h{FTV>c^&wJ=U%4<+w z2;J|md?m_%1)I;Xg6CW39KCow12GM|fgWZjAKAX17Nb#oC)=vmLQ1 zj@U$JtQGZ8-x+IRyHpQ2DS(6F`2W9tI502D&LwtvSF6#`(NDc2pvb@N5q7>Kip#%* zEIZ%N6G^=2I**?&kZG7?{++L;WjX0F{nT;{760r;JKyE>qI8->nr$sgZZe8ATrmEv zlJ^1fK3v}E*tq^jqDH@yj(L1nW#S~K0`nN69sHyB!s*v(w)0)hUnkQl-6>oec<)`s zkH9ILuX(aQmdcz~`3d#nbe=4iVE*Yh^}7Y3h~AUq`nkMEM%uZ`Ir4sqyl2XLp1jYL z_gZ;hEbpQ4&o*rs?OxFFo990Yz4zDt^Tc$&(wXXynPu~DJvqt0ZFRDL*F_WkWxK}v z=a!7~*S?qN|KajW{W0fW;!oH%#y`?M+Mo2sD1Tau)&Km!k^X~QF7zLnJi>qCrStu( zt~$@Z);Qe1al<+OttrF&Q=T2__f!q>mz|3D&s`hm|2#1kxCR2(0N{!SE(>r)`TdVX z0GAoKjKF2^Uz4Dq&fmMI{P@f6vR!}cu6^&b?v3Yt(!DMJqi%oOiSC12j&+}S>Amie z5l6ez(vEa{s{Y(PckQ3L*LEN3-g@%Y?p+tX(tTpa{%+;^=erZOJ=>l1#@_BJF;8{> za7uUgs;l;NZ`|;B_qM&eyN`Uiqx23HJck7U0?pTz3H1 z#%@Kq9k^}-u3Ld?EpXioTphr*y8HRUmB4jFchcPDfUyMao4b!(UEdvZuoi8qQ2+bg ztBzNKrc%%|4YatsYip-=Kff;r_|v;bu1ZFEB5;ldz6*hCIA9F{j)8z51y}~O`&-wM zt50;Hzg?@2zuHx{>)EcYO?$dPf0yUTeO((j+|gBAdutcy=}OqP1otY`nTGOolwF8+ zQC-{ek94Ab=aiV$oiPW~I*(la@E(#2+@~UKN4_29cGR<@z60$XXzu_V2jDpX7x&c; z;6d3P4&X)k!w%4aI?p;lmjm=UKqu<{4R?bR^gGcHC;H<=zntiw6a93ezfSbq3HVO% z!3lmi!51g^;{=~jUg-qioZz1md~|}JPVm(U{sPu=C;06I-vNKM6XO6JH>3VqC&mYD zZUe5{oftRZyTgfb1kNpJe~%O63mCs~V!WLgci?~62{~{=9-NR1C*;EkIRPzCIUzTo z=UL!-9yIL-u2+ETRp2@VTz>+tKLghhC*%;g-UF^YttCW^k~T7D9ErCvU(9@`a;O=2*~jHkmd7O zW)E&T2W^IRdyWi+%nkv}!O({|z>Mwo|8*c>4uC$ypp6AEqo4)@8Rp$Bh4&fn}hG2@Sr@q=B@ z?>o?SO~T8N^B243uHDzQw)>f`DKUGyemLbxwCMuOC(!0Gz}yX8*#VdjL3g$T=C-b+ zxxWF-`?_Kd-i+zle+fFg7dre{r~j|pJJ)vK-RU{9u`^-Y+Ro?qtwh}x+~=ZB ze&@k0DJVN1x^C{=+Vtk0gIl)m*>%w>+*9_Xr9Jcn=|ApQAUzfNQ&Bz@^`@e}9qsJM zhh50G10HNb3+^lJz=N`lcHp%Gza4a-&R#p{vV%T5=tSL5?Vua&%?|Vf_8`uIemT%T z2m0wie;w$z1O10R$#j4p4)DbRT(BF34)DtXzQNvHi8k{c;3wKFf_-UmfX{$=9qi2w z4)7oCR-^pKfORwKtVR1;)Yk z0Op6F<0N2y3OYUq%u}G_E429rcLny%06SrVeKEt|8AD zM;z?VVA#JQPUsbE(=gbXbJ&(b@6hIa*su|>M;8L-MX*y=z#IizGa4|*z;=#Bn@a&R z5pBi+=6Kkz34oal`#TB$c4BVDJb2&3-DTMiK{p?SzHWy;Zi5d0wtH^e1KqoRd4G38 z@~>eZ?uCBd1O48Lxp52T-@Cf6`PpXJfnPz-?|>d}!d$x%bL4!l2tZMXrpVg+cq7U^ZM z9gBg#1-P4FYZ`#_D&SiP+v9^RnhzXa&^{M*&jH+7Xj=hVXP|8{+D-?39<+6%tqU~S z(RK>jP6i!WpdlS?ZD^Yeyc5ti32iTdjT()%R5l)vtUam0H+mghQSU- z1IO3U^>;gKYhQp(*a;i3xpU)&4%iMK(ph+phHcon=fsR`p8s*5iu6?EL$|Y_!#+Fe zLw7eLy%T!;f*tVefQ$TS$ow$KyA^Uh0kWJ09dSW_ilGN{paVYWM-$}yTBO^d2OZG0 zwP#KN0Bv7K+qYP!z(=$_37ns! z?bpC(aDv~E<4EX2G-Q}`B@S{v1adtLay}e#e?D~QLdd-pdNA6F@q}(ALDwdrZ8G%6 zhPLTwn+4xvGIVhY+S<|91wC`4tp{zVJ0U-4I|FSipi{HZb`ILkg^qclbMw*Ghqeo$ zgIA$#1KKu$t`@XijJC@_*R^Q70(fsg`bY2y+TjbVg1>R26LJq4IskVK=(ria#VznD z*20%qhrZkj96tq3x50n-Iee5~z&F_dpJXHOZ32CF0Ozlq&_DPecfs%20^D0c>pj4K zuM_&}gx)%#zrg!j(7g?`YzOTR0`Egk=sSFr9Zvrv)&7LPRQYQ!nFn9}Kj6F1g)jd- z|CE?H{|-A zo3a|Vq8+yBdi+}kf9Qv>DL(-IYT%v=yp_ON41D>pF?PVnL38?p)Z;wP{v*Q2}|K1n`o&N$egSok;Zz#q6D zzC$(sy~FyCJN*A@%<1=IE`P_4deFsjn7i_!gVoU0>!Ei)f$naCZr>06+YO!F3*CGb zj9H|`VD})339s`^1B6cd@uCqe(2LS=+%SJfk&VV zyP*@0J276s?}r}k1r5&v=L^t*mw@+G=;G_Z{RZ^sFz~aK{QbW| zZ@z&3eC>q%xFAO^$P@hT2p9V3f}FV^Z!XB43;lIL4&g@+c0n#(=(`JY>VmwwAh#~a zuM2YQf;_t**DlC6eD$&L-7j@P?p=_7`1%vzk0--FPl3N~ga4l9g1)$*H!kQ8{Qt== z=#vY2<$`{>pl2@Vn+tm9g8sRnhc4)&3wr4SZ(Yz+7xdKyy>)@lF6glf`iwQh_ppYT zi#5f6xS;PY=)Ei7<(h0w#McRvtm(-)_-Nq-ID|&>3T0^NMj6<;QH@}6S>Ph-UxlMY zBBV1g!On&2;sbT`Pon-Z93mF=H;obX^VEo#zA~Og{i%qLiTZEbME!@%Ar)nE0Vokg z7Q>#=2*7g1mXrcOW`wjx@|iVqx^h;HTMQAZnYU&mE7%Ku)wq@1btQ8m>Xf z(r7wDX&z$mB5{4R!->RD!y+Vp6x~cn6Abjty!Pn7P`8E~mLhRew4VTsGTex2>!R<$ z$eWW4w_Qw&y7QV*nrYtT0scf+`07CXb_Z96;}Hu+3| zjIDDN$`4B7w=8S;J?Eim#% zAY*)8!WkGB_Qn zoI_{Z>nJzsBgOjZ|q9K23bSp4cR@a zv0LkXLT^ZwU&|_wiYl8|C<*0*1VRk8%eDXS}kkmnDaFlWm@n>+22RwLsW~?B9_mR=ykJu9Y<* zf&5!cOa`Lo1xw~B2@lB{`Lf3Cvc?NUig7&z>dTNCkIEV^iW*?6BhJpPRV;7H8ZQfm zK&TRy$|@=v`o=2}@`~s&*g9-aNEIqRAd10KA%@gFW=M>34)uBPqhy<29}zDI;Ei*T zV%TKDY{3knhiDUhzKVVcZdp?$b+x49&l*Fnl{NCY0TfWycuQl5KcvQUvc_SJAu)sP z+*-v#lLd9>?Epg@vWkjkutijPM`K9BO(9j%WtF2EQxaYbK{QKNd0!xcoFzmK5wxg? zu9j7L1r*3yLXoU8Uv~KpS>>3hau`*9C#&SiDxI>*ae-(*s{Azs$~&^k2?3?^I%U|b zp@J3_5%J_hQM?^8&qF#qJ{|+eP6d7Qm43WmkGo;hd0!=C#=4(oIJQ7`j4sQ=xytzo z$TY;K@OabrEa`Xt+!@F`S7g#RJNXv_%FN2uaBiflRZuQmtxzAZ!-OE?Q0Rg1uZ+T# zG74A9C|oI{aHWjGl`;tz%qUziv?CYFY(XV*o+8HLXo2y`?}Lg6nqW;S*?5e!BiC@L zikwexAltBs&SOMzw=She)B5{XMDfgbX%os#>o>26%CDrRG%BX`n^r`9gpL>zMe_C) z7M_mBQPQ}+-m`D;BxYL{BQa4VN-dbXl6P<|kEJ;+RWVFj#sKV= z1zO6q{_z!-`MTt;6_(~~#gMX+DcQNgvLKM!fvSPjBP%S+WJTlpd`p}5oM&0AJ-d}? z%l)7sCff2KZUYExw1uvb*He$(PYkmof#WO~bov=Koxqb|mOGeP?qFuQgPD~V%q)+d zSp|A#P17@Lx{g_eLCh)&Viu=N>%kpnmP|e@m{ly8^^jneO#NOkOQs$KvuuiiQ^c)h z7!H}pBi6}hH?dAW=UN&SLkV$%21zlR%^M*Uk^4w87Oxy`XLj)kA7A=l|RHh0C4%C%-EY*tP8d0y_ z(yTo%6e4#magp2+A#*bMfMlag-Y3|&T(I$8!A6<7N3c<*?q->j2?!@RClioOuudjO zG@%LC$zdOOHHq2^F}(JHf2Gb`PbnTysL2hYXtolWO*QYh^?boyJ|D&0orif}2<07u zySpTJ?-1PGF1dS$VCMspyT24kbdWW8v&ttBcc&_oz<-y-FL<^^NM5O6nM`?v;K@`j zE9q8Zm~p*}byOyttfDgEV4;(VSuAuiQAwSi2!?nDu^CsBxr5j;sY&}FGUG;r(5XEu29X_C zlTWM|M21{V{$a%+GEO3CTt9OVStm7BIcQm0AXPqSS$ZHyQJ{KbX-}45fFJLAIz{n1Oc^xnsZM2?eN?Ieb=x5k;KJ1c(eT7lp}BE3|8Z#DFMeI2EsB%RGSwA6Eju-n5_)3SkZXk5>y*tp=;Cz!k#=}tQ`qO z31Gid!=4<3Jvj(_vL1Vi#7@I+Bj7|vs*a2_m5ius3G1C#ORQK1^3Sm8V_=OYn<#5W z1HzpGLaFHQodQWAb$5$Is6@R>{?`4wB)ouk>3|Fny!&;b1Fb3}vH=dX-EB#4U zGHkNJStV>w=&(HzgzX85%`%HYkeoqIh&P=QcT5=;p%PV0zV`fs7^n7Jr$mjV=FePm zshx2T#VF9vuxXE^;29kS&jeBMOb`Xn=qPwjN5Q@y0i1FD4~PQ!ypSl6&$Tggu!0qJ zYLuvlh?;{riFP7F2~bl6J4^gHsH5g!5H$ybs5z*k=5-x4f7DSUpP3r@%+&lzqsB+n zyjz$gsPSpM`IDsPT^%*=22t~F5H;`WsCi#UO|Om``OMVFXQt+uM$IosGCzB8oS=r! z?Se;!O?B`~h&P|XPL5K4|A zQc>bTj@cmTiH9be4U(XEHeF_eq-Zcpuh}3;8Upc+lx6ipAiq%tNz@RCkD6GBQ(Ri2 zb_fK>BCFLXarShBwY!5x)OrvN(iPaK~L8?db-Zl)1@YuE;Ye)4G+-u z9Pw+k;p^m3e%Yb~zeeln8XZj6=wP}=>**S+r|S|uU21~qQWH$qr5asBrx3r=42>zF zbkP{5>1j#}rYS9$rZhcG8G4#B^)#sorb$gOO<5XE3e7-fr2-a6&f;H#NZLLL-FNw2 zJOT>m!M^PT zwSw4#t^wy@!`RrN15B|O#11wLiHbjWgY#SzouimyCl9!6Kmj}=(->vIfGbc1!zmvT zt%-<3E_h5gsueZVV2T|ufEpQ)v<%W9WTRTNOhyz8rDTi>9}F=V3WidPfuodyp_5QJ zDA_ReJc0hw^N1+>@Si)+qbjix*a8z|8Hd9KO%F=Oqf`=2rGo=tf`AM`D_ymrlq?vU zejc?+7yy0@i6UIX#3Mprmw+z3<&&(aR0(jua6)8<2XYIBYG@SYya1A^=UtA9=j$^F zRezihFk9t2g~kN4BUH8#L6L#}scZsCM0!*(BP>9z<65*jVlm{+3=q8=7$A>`8zh@x zxF{K`j!~RCM*lVH^<+nw4FM^MOa${s3#t)+Pq{$^cOJ^h)&Neim0C*kiC zdNb1}wl!SU(72>Q{?Wn(4Q-Qn_kU7dLv?*yjZfj0GNHB+f8dbn&aZ22391s5=v%)9 z;h-}^1XLwCSw%movB}p^)zaGB7&dd#;<_3i7ESzmZevw7ze?PiT#a7SU+1gw)g~{b z{qd8u18Tp$2yM1J8l%>WNLwKG9m#Ln~3Q)>qZq*37_AQjIzU7p~}% z#^#!qx~qLi0ZU73+k7g3SICd_mmp=T2Cyd9);CrWX0D3A8@K?^fX8$Kh@{ntyMY>V;L!q9RDIYNl*-j=Ir^KRUQb!duqj#h)dtuWOMAm`5ms>s8y>j904(I{ckw zZHw`M--2e}GV!Ew1YlKcAQ2L3RClXQ7a1%U-`b8asL}EaU5yiBaWh0ti@eD)#b$ZN zGR5*Kt_O|jL-GG+F8gJqar{urGsdw)EmJm|1|?e_d)+d}cdJ#<3Q0p@(O?<%tM-GIQ8&)9jH3Ub9L5|{5tja1T#XhhuIAZv ziJbCZ&Nf>{QA_n|YMEw=`(?Vsx>{nz2^Qc@8ft0#r(qsLR0!y11bwxHA@U#I$%{=@ z(@dkNlUr7;T)*LID?#m1y_AW{DwYV$v+q5p%ZE;i*&GhO~mo~N&dduCM5hrvJNJbm`FaOnKq zcM|?zny1;tfDU^`=2s51BHHWMpB(a z@d&Df7koBzvs?mzP&rKlz_(A+G&`$%L#9!N_bhWPSHOy!$N@H4*fnittNvQ#4^rO` zDkbmObiZ0?I;JGQM>*^1@~X^Ul^V#~8z%2pRQVuXUXi7%Q!S&(KbG_4(|9zu;u2xG z9M{NoxL6*b3;PBZ8jFGQJK9On}qigsHvdzE5C4#F*K1yv~qf6v;x*Dsfa~5i0 zv5df#V03;b7@rc1m&1cFjvaymf!WNM%~%&8OZ5YoPUC2%q1rN!{Gkwa)7OG2~^RjeDB}i`i5INsgaAuDq(}zHvfNn zOyL|%GgvkSLKO(0A^;>}B(T}q!bzLSr1j@Dr*4A4B8#lIx<_ET#J~XyX;^9_7Z^vM zv+z#KX3LzE;Qwt)=44p*L0h$|3-9DqYvhtUE%m>$T+Aslo`y(Edt`E?1V9;^O)0Y< zvs?^_;VL1|xY;Yp!&O1KY4cpmsAm|0APea!XG$+dKxOe9R;hyGinLU3kz=+sG1Zoy zm7blJnVyxTco7|HXj|&_T5Wj7i#}dQMM+VC%j@zu%Fv*~TUg?n?#(N6yRE6HQC^Yj zt(a5lw$g$b3u(n$P*UzKE-7=D7CKyRYi7DqsY8{XnvzsE1b2nIyu#}$DW2&rtDsN)O(>sGF+u$fU=ltMXuZbT zhM--xx7F(V{*~4#+86yUvvLqnh5)&(wS0oLVuIB-!AgO-#@a+*(gds5TUb!+_Ii^p zTW(#lu&&-`O-xC;OraXoTaZ{-Qk*X?U?g~!lbV{AmX(^4mYJQAo|To6osv~phPc&)GPt!-^} zS_N9YwbiW?ytPe9R&|Wj+?(epudro$iwcUZi4()|Wuh%fDR;Z4 zd&}Jw))b}0;Vmtg?aeEy@aC5}=44yb09cj1lH&5pA~%aDq%bF=mPR}%Dsa;IaCyDV{Ok~J~Wy3{&lidBcx znV(;lZB4RXd#$x^VOf5@v){seXIXy#g=NnE3kjz!v(ViiT2b!ox17j2Q+rX~e|w_* zOzlPa8QPb}1Am4M)qU8;h%8 zPFqL?5mBvHlU&qTTMNSk`svO&9`|f(iY+CD6D?JXeO~kv(Aju+y?F(Y6eLT^a@}R# z(%e$7yEwPNQB3I41sQG^)RqX5RAgr`tlHM*WyJJam@w`%fq{-@v*kv69mh}t6YN$? z>KpNOQ;l=5CMYL+p6zud!a%`<5g_O}%>e{yVPkVESshW}Ep)>SfGAna;HWf6^UBh* zG5o3MxROD)s`$XCS>lSoOayBHYD zO1v&dk-N;{%_}J@a#WOiJ?OJ0SM#e{$jVi>Nl~ez%U0zQ~d4)R{7-(Wu zr%gQO6;_ayq=IByRz`YGdRj(Gc4}&Bc2-78R!)|0Vp?{dW>UofLqv)1NVpQi*jA>q zG!YA4m_)iNUK)SG%VP^%>a*l^c6xedR(g6$R$5j{PDX|;)0R<*i3|N8u|s7kgsMPu zQIpSim0qD~HVCK8%!0;>Yb7{SE2hlgn`WsKC#I#a+bhhf6Qiw})%3Jfo8HjOshpXfnp$d2P2=Gs?}psx z%nTSPA~o0T0%KKWc2CT-rKjZ0IjPyOwkcWJw$u!CGsQPCOPG3| zH?bpMR2GzB#Rzr6YEZKpCjTZ|HY6jpdliKMfsU@;^Jh1L{yN`wIgUsXzI zZA0^m@Oi@dNNo*uOBsbmxW=2l&Q?jDR~0rd+j5;0I!j6lLqrh%6V|j|EVkjX)PN`u zyQr%9Dql0`D@O;hD9**gTI>Iua+jm9P|Og56FT>+EZ>=$4pJA9!O5dRW~)XEa=_)l zN&o6q*C4cu$A`EgSq)zG|MHZYh$N~oyNDz2+?5ZpS;Bw4MQdfkL z4>bw0ZEi`W6S~A=gyE}2C_}g6I-`RE%z6h!5QynK*PVw6p1PqME^7#q#N)_9Cd? zF!~`z#0r58@;OyPN*xt081$L$LX0k1ZxOu{S{;yEaoWYo7KS+`*B1PoTLQ^}B`UnMfj%iTn6g-4n&)S+<>RATp+rhRrz*>Mv-j5Ju~o|3W(DJNtt zG{=Yes*{$$f|ueBgr9gBF!cyZ*45Tk*HzU6n!Z3R;`PPs5VGs%rBh{1RjuCnHMR9^ zEhHMSdu0W#3M}Z$3uLFL=fS;VMKN=4P-&K_>yMw9JuT*)WTyWM}v$Vok_` z!Ru(%na3(ra9eujNU==US1(-DDBZ&H=>?^;FtyRJ${xzD$*l!%xULF~LBvuPVh1Ei znY6HRk#7TPkK-%~0qwsl6Hl0ySD4vE~3d za@EKZ%BxjdP7a(Ef))tEh(!NUwS`qA9emy$ing>h5#mYx2+j9;xkM78Zia}-BFrWc z96SVF+3bgxT8w{FBjR{uahbIsl%!nP)qrsf<5(xjMPpzuPZ-_cg)QlAWpTmm9GdNj zc|>zRi2M0VG`YL^;^_(s~_AQCNWa9B_gif8eJc=`&fRxLaOwkkp-0K@~O^fLCra(34U|Oe8te zO|9DMO!d2x3w@Xp8`|pYp|8Mz zwbrb%0%*2~UrQH2l_d_j>jFPo*8)pPajS`_I0Uy5&wy=Zm$6k-d6BPQ4JB>07HItjoK5umT2_oZT9c7|WJfV~mZK~Wu6bSoMZXERvjBTub5|(45rZZl!6!vmKRo+`1-DO;-c2J z2H%tgz6Kv?MzX58df^oKqj;6fI&ndobz(`1bs`qpQ>qcpSC7b`FJ$hdl?>Pm-S{9j zn4S%@VWUj|xrzq?x@Qg#V{B;OBjC`It)ra}edjp_7j9)H3Wy6(K}0X6BhW@(f}~Gf zBT3%sqafjyq z{eyJm&~7`9pwJeexN$DepcHt(4?Pqc5H-HmD*O>st{@iaR=HM(SXYZJdjd%*vE`|F z8|!Q6>;Sxwz8Zxg%V1z~xg~Bur&)~fd)L`4(8N}n0J+2cah0}$bPkT(aHaNgCxK%# zEY@CC2SGp}SYtbzsGb_QBiq0(JIy|-A=a%k*gl9!o3vA%YDI_TM8sj$V4qjFBn4b` zu(g>cj4utDE-1-!Vqc2+%fU9 zha`vBk3nJP$~iOVSP|aSX{|FK2Pz-}Vlf}^`V0GV05T<)TnqspI}~q3~}H`9C+a!M9g3S zPQ(NZs5s~eo4f$aE1cufmkF};HLR$@##M%zRM*&x=|-Hm18~Ika3zr{bL8Uu8GDhS z2V0P0a~+ceMi(&z^o z>4LXj0aHgqB3U8iQcPE*Vlt92ySxB(XxM1KrvG8%DLW|EqtHQ(M6upvi7IqB5yHVP zLLT#0g5|ZPwl43-#ONfNLYX!jPF11(Rl-QIEDIAAR!u>CXm9{u%T^EM1iXpB{)0P* zcBO@>29F>EMUMOe>;W##b2@URy(Xq;F-pmqU|H6i5k2b!m)YLq9Gvv@dCtLdLEU}C zHZbWCSQoN~7myrbH^QT)F)S)5cL@+)Y+B`m@qB)VFv+7ViaPw{RLPAk9kaDli8f-l z6oNBwT4+!3N-Ra8vwndie#A}6!Q_Qgf0z%OsGHMqbfj%M)X4>iu2o|pc$KeySt1TA z4e;PZ2ab1IMG!fxx#l63egw}>L4E|ntv>xQiUWyQ*4XIy3;Qs|g;u>Js&lAZ3GghX zvic0F1}!Zprx`$<0M2lj`Ai3MwbQHpoOk}#gTd;F%l_K)x(+Ugn0~RLQk+kuj$R6W z=!HnQn0ypRdYyrtBkZy0tP)QFw40S7zTnZkV17C|2dX94hB-@V!V4h0aI2!dd8a!c z1~zD!N1_yPMA-@kR(`bCjI-_GoQu9IH!Eran0}+0A?tP`)syMLwXC9sII2FuDo(1g z=|EHj6LoGmuZd~97?ZpHum{3r96D5we~@vMN8S>v>G(TQE;CX|)5FZe6Re^pBdjcj z*O!M=d+e>jc-7I15fuB$S090*RPVA%CnuTPcIkTH2TiaEoW4tJU zGz88P0~$imc?H?TH(N1hH_q$u;ZnlC{t2-Q;9Glt||b5Q*vG;`w!vCbr+SC zJMi)f-YO8P()Vn?*x>9(kV#ScKihv62mk4ex=xD4VH+Gq4^PMcjL!C@iI)p!pbDn! z3=HB3PCw;m_X+{Q4@VX9CtFjjG{?%xH(<_r&kwH)Y4$qgotMQ`_1{mu67RL3G5JM& zm{F{XA#>PT#0COR+sjh*benK}*;x|1SR$BfOHNO*rRHR(XQrp6rf1u-QgBQ<)i*Ic z10Ey52S<`{Xfj|=2scBgyVM8|`!|Xzei6f{Y@6LVe(q6=>gfS$y zuiUCTaS(6|G%Fm=DJN^Lu3CZ?q1q_h$Q^_7@%a=jn2)?X9NlnNuzlbY2CVo%+t)+R zD;HsZF0uw31P)SjCcuSV3t4TcnBzG*EzH81K)}?r$mj^7Fj{~_m6X}D=_slMBTt)H z6?_YGLF+=G00$}J^=&bKS~LXz5Soyuf;HDVlm+bn@*u2Pr8or0p^&7(@me z*WwHr@YZ4<6C=;_i~7tHQ7(dU@ND!)f0ptAouDlNKnQsu4MBrMZ*F59=4}1ahEE9T zyhdm}jhQ?xAhz(Nt6U8S&P!fgy|;zl(xXa3J+z%9#K*!bUxil(#TyG8 zyX8e0&?6u~fnIXg1j3_4ua#IpUl)u%qaYJlg>--;cGamwfK@9LfBOk=7-D;SQ+5$G5+)-%?)IA zWMwQ8Cs^kP1+=Am!a)$Z=qf66OAAjSVqV(9)8ko-kNG*_FN@*kIZiw8k1A50=v54L zTg;YbOUWYJ$6XCN5Tuz?e#1l5&?363hoBQv)g=jemw^Do!UNc)OvT(dn#Pw*u1XH^Q=X6CM{-6=V>Ge=| zKM+zx9kzJ2&_#8lwH#+8im_w}-eHp8Xb87YtriJiO)OHdfui%);1%Fa^pN+g1L}{k zN=x|nPh<%oBQ)9A)=Cjd+(34qb&U^#RgD)HYM{CL0%5T9#el=Jf_(Q{glg3lSNNli zyk%2RQV3tirf88!j`4<@LZ~{4A;|;&ahM57OgpZ`a1suRsJc`GoZ<}o@)l`erRoH0 z21XN0oid2C?bg&BnyzS{tlWzLFnvJ6U3jKI&zS-&|2}?E_>Wj#LhvHdjVO=^zt(AP%71iwUFte@7{&&C^S{S=ZUq^FmP_)!``w}yV&gG0wQ z0GNux^yHLDnaTKeM1OSfw+Q+{rk;oCrBeR*a?CI|pcka!uv=2d~Ve(V!N zwW{&nL@Y8K6$shluEtymOu4l4`cE*xAR(SgmE{_b>Iu`%rw?d{JzZUE1t098n)KBI z_TJ>#cDX1P&gI$YJclw6si(6vprzbZfHfB4yVz9aHIq)G>6=iayWTQOndn+ z@bV^2CjGt~jY9GICa*Jio(?&bqkoMGT~?3d@GG``C)}VAozB1N&+igGS6N{}QD0a= zlXp>(I8rGF`E2JiopcEk0#8YtwaJwZOvz37x_j8k zSQH3HL8u#mv91N3(GJYg!UYaJhbd1_$sPP$_sjsB0{&Y72n>K=jqWWg3UfFr1Oz&e z*3j7Z1Nf|^90}JQWfY!X;9Mv=PVY2Jdq87G6SeAc>Bte#C>lsHt{Pu;y;#0+98A7- z!V5=s`^2}aAX)*gdc()Zz(MLDIUCxWQY^P}sYQOAJZ2w;D%~My)DuUq*y5&CB3)FH zt6Pw&#|hYGRnTS>98GUNeWi**J*W>Wgx&|8ceG{DE2|J53TXy{n>cZ=6GJUDVk3{5 z92>7VMT7?I=7>~K6Sj+dpic)#gd%8nnOUHtBsnEJJr$c{S=gq)mj%+()39@aH;8iR zG^Y4ijW@4YY?-N_EC`Ha-`#k$QY{q%03^n8O~E4(&Nt)}4F%=oZqO^E?tVfoRNil> zaK3^l2#;-&07M?oRZK=bkrM|AUG#45_b6`h&jP>J|N z1zTD^OT`BY(y&{XnvKn%Obk*+YIb%;4nDAfBYEOGN@Q$#WfQP&;>22?5A^AGuxQ}4 z*P*m= zrgsO@lHma0b+wE%TXuFTzSfwTlA4i5(c%pLUXP63;9U!f-SB#yUmzj=$-_1zEGXiIq@M)y8JH3Q03!N~qn+-qO zCTzO8$^=c}NC5GC-oRA?i7ystgHWR-}2&KzCj&EXJFx^tKHxBF7(pNEfj#$5llWvjZgp1i$tE9QmVtw z@9hMDE-S}Zpp?ZFtwH+*^p-@Ruvx=HJi(_0v?3erd2%U9FKv9Qy(RroH^14Tu!KEL&!d(#C@z1O}gz(m>(mE|o$dnV}yyfrJ&p z6Ja7~Nv&&1uj;mje(6T5gI0A7jd~{N zhTy zi-jT31T`p~-`H3mT1a7x(B8@(5PtPb(&EjjJl=4SpMRAJ?N4NR7pMb*c62lhpQ=^N z^yjGX$K0;NN0d$YtIU#j4v{qHkt-Rt&T=%)E#s+ ztu_rb#SDsinG$Am)VLVbu^OZ7xSOMj@pl1Dk4D9sBcF=83ee4_h`6YqP$sHu#U0;A zkBp3Zl5$4L9Mfo1#PByqA?E@W(;umPS$tIXK(vVLG+ay6MOpC&=uFeh5f?5`!o$eH zQN@%IC&5I-e=-EggdtHi$Tmm)h_Clk72D7#BmGsxs3Ckk5Qn_2hJ>gH{6R}|)TOwZ zUX2_E(k$mhjOd|EQ}nq}#rzO6JYvKfms8e&^CCuMQEx9g-xM7Yaqjj@@qGRTQN@F) zRHMCyk`aRz;ExHK%@MKFXW(xz&RT*$rx`K33rsiTKP5u3dgy8dxCrG3=v{;l$(m^%%N7M}UIwr?0(KDT`#mGZA+T*=&* znGCJ1g!1<>e|(JVF7EFgmr?#aZtKA~Mko(5{B*|q>SW5fU<6&?Vvfz?{9gQ(%m`(? zovyn$e>#R0bTZ`Y8N$eMl=C|CHsb<%9?pE23F(Val9^*hrr{4<(`BIiIv%4#jBy3` z@ykNWUptAeiiNKCl+m?{73SCz*_x?;`rL=O*^^9dNkHt9V#&*sb#580x-^Q|>yv)$Ha(^dro!>A&f5MPI zWJ(q=AL6-RqsJ1KS1+RLV&=dnEE_K}m&Q(@`~}S0f{FAzhR3mh^Y?J80ZdgK!}*ZM zrJb)C_?w83f0o8`S;C7s=fzUWU(I^a$P#sa2IcHx4on(F&nLO2hkG}hW%vQ+$!Dxn zQQWU-7>Ed^lt(a)X|N5UoNJ(*5z3kZE@dA6gz2Al1?7y0rfYX0T_=>#wT(yQDVTu> zrJk`waNmE%Ty18_e5!~_H}F_o!_;2P<9nBA%e;MEBLv9@mu2r5TZYfM?-w%tpL1Wfa@+CDpAsIOl`NBSjCTi9p2;>OhPibAG@@h&(=eY$ zZ5m6_!(2a?M}GrD{xgpVNI?C$+@lm8*%z436W|P6s~Cu^#`@! zYvfh2z!_QpB>ES*C>DK+Y#4`LMmAcgwCPRgMC1?W17BqGID*#lGUc=$osMhU_dreL z;xW*S$R$o{yL2gT#${AiXAs!$tFB7!?c0p!?AdenoIP9T+xWU>( z?|jfIrM!<>?O57n{UHg-GuE#HNS?K}P|m~FYxJ;xwf=)fJY}7u2flCpox*=)-I0Uj zob?Iy`pQbB;a1pla*?dGcVr^jYOj{UajK}N;UvD898QyQo6|J9&wgGhX`kRp=73$p z@%5}7!-@~uS82%S?d@#z1v>{SEB}nSMww!-a74!ah4zTI=@bd8IhqqUa5N;n!}gQk zq1er8;9b7vkEbJUF|0k}mN{&-Rd3E`t*=5bRd2gWs@47jj)o2!p^ZWh$sUOSUXtpJ3uk|x_&IW5H?R1}&Kp{3- zx$M79)>*2y*?Nb`{nmwPNNTOKH2W5-jviQNE#aBq0c#UW4_bGzvaQw?n8*K1>rM#a zf8UB{>znK+*m|A41jh6~Vn2eCvPPFO)>jclf$w=e4e@gMEgM`T|A}6^Rz`7DY>-d0 z7f##Bl;ShrSCch=>lfK{2W9Dw#>QIN8@Jka&>(PiR9tC>%Qx%P1fV~Dj1A7djrGns z$q_L36jbotv6S=0!VNtTmw(T3QZa(gU%7)WxTq;*|7kn+TU9MPs(R~K#EZv4P^D?g z1rD6_O!iR58d|FBUTWQ~1*eAY(^z|t=4`v?I~={eVxXfh^CbN-@DSzgzm)zo;KL?} z2WHYW2CbuG4<1hXA;T!a(50+l*tSlHhwtJ593gK-Jd&6EzN`{TKWZ4cf=lQfqqm{6 zeA(~OCC3Emsbg1A=W*}T6~+%B&4drw`ovcUAf7a93gVn5)M9EDz2>&L?5-az1dYrXGF-rcr>UzPiB zrZol>u-4%ZkUMKePsEd7X5ZcV5xrqb0ri|(Pfwb*3XHzoKeI1xo5}q2tE8OMk$o|D zDrb>9woOEw_cePV-^V%&9)$gT^OmL|E*#kgaZwTbx_C47E2*P*mF|U&eDg z=_4!U_f&S3+)Qm(%bRJ$HL^8(b*(%}w_Yc2roGn7N~&0CKFJm~%emb(L+etyN6LA2K$|NtrN6T;hzYq^pt z{zg7T0iKcH&@@j(?WU$Dqw+Au6j|z7KY$KbY1@vU(4*5*Y4uLEY&d;MI^vAgRJ!xq zWbLw@z1lUk72<9OnD4%8G~ym9S%`Zkpk80E6*SpR{i$o_y|i1PjFi1c)BF1zWs7~M z_D0;VmKN{dhQ2dkDe-})X^FwBIQI_e9*cPBS^Ctlr}`isK7I<~5igTw(!a&)^p5m8qCI;<4uxhM zNe%6+#W`K3ga z!uO<%X@_LD{0oiy&oYae?U4(3>}ffO_Wg|8`J3#*US4iJ!%kXZT_wpH>wYq9v0|uuo%J}o;UQ~(29k%Z zqGm|8S;OfOk6P~qk!-h4_CWHub$}*+${NOFyR6^y*lw#Y!97+jon)^ygQa~|FBl8m zY29mwE}8lCl36>yFSXb0SP4px_Nnu+-L8pQL2GJO&|+LGXt8!oT*C_54h%56Q+)J3 zq)~Q8f>{hROwM9hqUT~*l6x^M-dSb)pI8jbu%aix32?32DtbFIQSe@#;OsgXAAN>E z^e2p??9|p~*{nl~-PATqV{OdRn9-y)3~H9f?6kIKVXae?FZIdWc_^dlZAjGEabMN^ zuU>E7_!6x3^yzSt0fjRVk30zH35f6Zj2 z9820&@(U!?-Jd;~Y~wOP>d(DGubhSnaRp$CM&<0tfI|i z)x=CzOT|ttTyz7n(w!kH_ zN3aF1wLO9@(jriJJ|?NZUUwhB-4sSeq&;z`j8PFU>RtXojfjirAaacXw-*Wzy6~~U zrD!AG)OMpB47kDo9@)S50B8OAu6oug`ba<71>8%o=M{aT_(=OF?mSd@Q{$g$yotvD zsPT&$$C*-viyHsdg<6R7XYdGEqxL3P_ zZ-4{#q#v#7PZpQ5f}m&&QxqQQ52WyFcQzXk%_7F>LRC-XcwDUM-Q#_|!XxL6M^!zM z<8(jpX7H0F-7mNYRpFS%Z|)jYkp?_X=R=bp*~BB~lM%X}q1}Uuyt%G_I&fGaVxF0;=@034N9sl@HNIAl zm-{t-81*$1k@NP?H2q~=4=(ss*sSrrO@pdzX?Y%1xI+^f@744VXFBx7n*I%qZ}05j z#y)@4_>qei2x}IBl1XbDSyG-LPn>hG3UH@8*U+d@K52MVmP2o;HG~Nq5 zEfmoCBfyib6tO-#KkVq+H>l^F!sA6{pP-^Qe)}Ek5sl|-JuQi7Wa!WPV;uTPTK)u$ z?-=CZ#i}+TI%xbJ?LS!>@27BG2ua3k`qe2xg(m2JFGV{^u=54i`E;hHAJX2T->vCq zYrV|%36{ZBDAn}mIy&@6P-eJW<8dv5s(e7}wL#;lNe=!j>SfppobtHO?>ja9>E=O2 zXU5%bjn}nxa3kk)8t;6QgB$yw2A-yB2#-Eh^x+swmv4YK^*R3Fma`>r_M?aks>)_) zyS3N&_W=ht@(c!^rYOUsX`24;u@1doA5Ky7L|$jk0(~;ZQEhg*)Br0Jlw66jy_ys1h$ttel5W02S3# zR#oQ}EWTUt13wFk@z`u&5MHq1O@wzfSCsKp-vvwXiUNEsS(M>Uu_lsImp zu5IGjTs#zY%am+HC zUlfih+4Yl{c{BhXh{q?f^pgsq$~J7e9b#UR+~C_GJ3&j7txCch!M<|7*TRvD&QMfc ziH|W<6rnpP)S@Mg^mqa)qE%+QkC)T*5zQMWZp<(>oAxz(L z9^q(g#_=w0%@5rjUs({geL7YB?@UwQ}yv z%hmJNn1y@=bv53`U*__n67^6|xC(gmax%VlqDHY21y6WJw9~NbSq%%%LE-TB(K~(h z`%uH15`pR^<#@9L(wZtKoo{m3qFh|HNCfaA%;Eq(5tdm~P$~lW+{SznC|XhhMklSQ z5&^tHC4jBM)n%0xVTC*#t14btKn9&#w6I15RF?*j4U|@*Si?6a1voE*s8S8tK=FJ% z6VER~C8p%CI<#ozsd4-mJw9;pn|0qynt#4w)T!Y!>3J8w zSvOd&2XxQ~s`-ODHOc45ur8y&xqqwAbtt+ULY=0$%Fa5Z5Uyc@`&EZ9*+oxVF_`pn zNM0S#(eE^WeJF^$;WMzau4zh*=@u^JB7EkWfZY5^0Nfb)7FRG9BHrcyZrTnv;9ptg z@LMgM)WmN7o|@lnztxb2iFIZ=w$aAgnTXX*9{OHwwcc0TzjTv}ObrF5_UvyJA-T(jq diff --git a/liboavideo/test_oaconvert.txt b/liboavideo/test_oaconvert.txt deleted file mode 100644 index 85061cec..00000000 --- a/liboavideo/test_oaconvert.txt +++ /dev/null @@ -1,4 +0,0 @@ -Running tests in test_8.............................. -Running tests in test_16............................................................ -Running tests in test_rgb24............ -Running tests in test_rgb48........................ From a335b7c890e4cc3b2e825a8847bc35be742c5cfd Mon Sep 17 00:00:00 2001 From: Joe Bloggs Date: Wed, 25 Oct 2017 17:25:47 +0100 Subject: [PATCH 6/7] removed icon file, not for this branch --- oacapture/qt-icons/greyscale.png | Bin 4029 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 oacapture/qt-icons/greyscale.png diff --git a/oacapture/qt-icons/greyscale.png b/oacapture/qt-icons/greyscale.png deleted file mode 100644 index 553d041f8123aa1dd0a3735d5f5bb1b5206f43e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4029 zcmeHJX;hQP8vaO7AR0m3&`=Bkg@Q>4f)*qRAqYeXL=AyzBZTAwV#s24QDhNO**954 zp-PnQU%_QFoX*B8J3e8#!WXA zFue5%EVEzL(bqaUXmI9i)r;}`O^g_7by)Ko#-bH}^170WU*5H}bu33L--}+b+iiVN z!PRSoK;P`15KZ()cz5Kj%@fe>`_MY{3q7~PQGwkL8(&D{YM#owMm|-2NKT=}Z7$q= zzn}Tql*eR@RZof@8WwNz*DOA?E0OVd7zYuA1}~B$3@pxB!Uj)MNvEi}Rx4c@58t)t z*bCh9h9O|V`C!9kKN&)?)f8nhv0cCOJ;kld_Gsvk8o`LABVJgp0yjH{2C zC;dDe1=qxv_A*M_*N^@j%j~vCFdUxc-mz0h>-R0C_dy$y@0Jghxpqz3d48AMao-Y{ zx%1Yxwgy@mBvoFNwXn<}MyPtKU|n;Pa7gF{@*e0PCC59k$DYSkF1}>A`;Z zCejMm%~QIg6;C+pik3q3iwkJkOZCBMu#!BZi%2IwEWO<6G!~nPsU3On3v8V5ckd2K zSJ06~gg7HIEbp8Lf;oX}G1=8l$vF44E-u0wcRp)lR)|-p`iv@V+%nTgF3v1$US8}l zjH1`5pCn+0qu|hI_v^m}6)z_3) zYratTP4g3*F?C~_h$O16G5o7B3;=1c-(xVmoBwLEMd4{8JuA~>0TyMo~pC*47 zdUeS_nfIq;!dMEg26N&3GM%AY;A_45bbI$JkUds=r}z_>gzP}e%0v`PohDzJZ@}@% zK9&3l$s4(x?}o3aB=pqBygzmC8nNYe$C}42J(t#>3Dz*x^30b#eZ`Txf6rrXS=Bi+ zn`=-9`a5xEX`?oDg4ydB&N>(|A1j_}Zd;gj^Dc z?GDX7>be({S#-7a)#UFUz3lMDxXYZaX}yAPIOcWw-N94@-cQ9ZHLXUsjPx3xKs#SsRB7$sk%4FUjMh)NNQ z%>$*#U@(*`z@x_MZ=jG|4j$$2NVTJi$Y2=PD?$wJitwScBY12l4vI*CxhS2r1bk4+ zLMr*;0*SK{kNV8(tewwoV^PS@5GfCj3ZT-EWT6;DI$#_ycId52uG}6)fFWJPoDk=o z?jBz#v@1L+Oez&QW3dW_0;AZ75sE{xI4373terj9-X5(*pd|+cQkD`ekXX!7{F}oa zl(5BG<+wrta*mS~ER;#{D3ta;@(VeK{SUWDCJz71%wc1}aF7oQq!KI+gTsEtbJ)%v zLNTAEJ-KsYP zTei#|p0)p%YVFo)>DB-#S;(JrA^=$ovZNpfso+Y(ke(DO%|B+zDlMpo;!dJl-vu*B z8Bm-))b`t)y742=X4eitO%CpR{zQc|j|+VK*q640q|uv%<}EJMEYxkfucLd9E{n2( zw2^=_t1P|hjN{TEUOP`hE93{#90ywCH?wfr4dG`K;7q@j+o5Y(l=MOjsn@Z@{?(=B z)M|@f(DDOOk3UIZRyJn7KTgf8-7X7@Wup}i)2nm(Rnp%X{2W1jTlSSm-uDMBQrZlI zet0 Date: Wed, 25 Oct 2017 21:01:15 +0100 Subject: [PATCH 7/7] ignore test_oaconvert binary and results --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index a0ebbd68..d06a2a8f 100644 --- a/.gitignore +++ b/.gitignore @@ -114,5 +114,7 @@ ui_*.h /ext/ffmpeg/libavutil/libavutil.a /ext/ffmpeg/libswresample/libswresample.a /ext/ffmpeg/libswscale/libswscale.a +/liboavideo/test_oaconvert +/liboavideo/test_oaconvert.txt /oacapture/oacapture /oalive/oalive