diff options
author | Suren A. Chilingaryan <csa@dside.dyndns.org> | 2011-12-12 03:31:48 +0100 |
---|---|---|
committer | Suren A. Chilingaryan <csa@dside.dyndns.org> | 2011-12-12 03:31:48 +0100 |
commit | 49b999907835b734a6d81c87310212ba3d9ada7a (patch) | |
tree | 1c0164382d7bf492b03bc7be654e34577dfd2b17 | |
parent | 1ba46e0dd6192d9b879633dc5895c5910d0315cf (diff) | |
download | libufodecode-49b999907835b734a6d81c87310212ba3d9ada7a.tar.gz libufodecode-49b999907835b734a6d81c87310212ba3d9ada7a.tar.bz2 libufodecode-49b999907835b734a6d81c87310212ba3d9ada7a.tar.xz libufodecode-49b999907835b734a6d81c87310212ba3d9ada7a.zip |
Introduce quiete checking of frame consistencies
-rw-r--r-- | src/ufodecode.c | 45 |
1 files changed, 31 insertions, 14 deletions
diff --git a/src/ufodecode.c b/src/ufodecode.c index 0f1d068..3143454 100644 --- a/src/ufodecode.c +++ b/src/ufodecode.c @@ -10,6 +10,8 @@ #include <xmmintrin.h> #endif +#define CHECKS + #define IPECAMERA_NUM_CHANNELS 16 /**< Number of channels per row */ #define IPECAMERA_PIXELS_PER_CHANNEL 128 /**< Number of pixels per channel */ #define IPECAMERA_WIDTH (IPECAMERA_NUM_CHANNELS * IPECAMERA_PIXELS_PER_CHANNEL) /**< Total pixel width of row */ @@ -18,20 +20,35 @@ /** * Check if value matches expected input. */ -#define CHECK_VALUE(value, expected) \ +#ifdef DEBUG +# define CHECK_VALUE(value, expected) \ if (value != expected) { \ fprintf(stderr, "<%s:%i> 0x%x != 0x%x\n", __FILE__, __LINE__, value, expected); \ err = 1; \ } +#else +# define CHECK_VALUE(value, expected) \ + if (value != expected) { \ + err = 1; \ + } +#endif /** * Check that flag evaluates to non-zero. */ -#define CHECK_FLAG(flag, check, ...) \ + +#ifdef DEBUG +# define CHECK_FLAG(flag, check, ...) \ if (!(check)) { \ fprintf(stderr, "<%s:%i> Unexpected value 0x%x of " flag "\n", __FILE__, __LINE__, __VA_ARGS__); \ err = 1; \ } +#else +# define CHECK_FLAG(flag, check, ...) \ + if (!(check)) { \ + err = 1; \ + } +#endif /** @@ -104,7 +121,7 @@ static int ufo_decode_frame_channels(ufo_decoder decoder, uint16_t *pixel_buffer uint32_t data; const int bytes = channel_size - 1; -#ifdef HAVE_SSE +#if defined(HAVE_SSE)&&!defined(DEBUG) __m128i mask = _mm_set_epi32(0x3FF, 0x3FF, 0x3FF, 0x3FF); __m128i packed; __m128i tmp1, tmp2; @@ -124,22 +141,22 @@ static int ufo_decode_frame_channels(ufo_decoder decoder, uint16_t *pixel_buffer channel = info & 0x0F; pixels = (info >> 20) & 0xFF; -#ifdef DEBUG +#ifdef CHECKS int err = 0; int header = (info >> 30) & 0x03; // 2 bits const int bpp = (info >> 16) & 0x0F; // 4 bits CHECK_FLAG("raw header magick", header == 2, header); + CHECK_FLAG("row number, only %i rows requested", row < num_rows, row, num_rows); CHECK_FLAG("pixel size, only 10 bits are supported", bpp == 10, bpp); - CHECK_FLAG("channel, limited by %i output channels", channel < IPECAMERA_NUM_CHANNELS, channel, IPECAMERA_NUM_CHANNELS); + CHECK_FLAG("channel, limited by %i output channels", channel < cpl, channel, cpl); + CHECK_FLAG("channel (line %i), duplicate entry", (!cmask)||(cmask[row]&(1<<channel_order[channel])) == 0, channel_order[channel], row); #endif - if ((row > num_rows)||(channel > cpl)||(pixels>IPECAMERA_PIXELS_PER_CHANNEL)) return EILSEQ; - if (cmask) cmask[row] |= (1<<channel); - channel = channel_order[channel]; + if (cmask) cmask[row] |= (1<<channel); int base = row * IPECAMERA_WIDTH + channel * IPECAMERA_PIXELS_PER_CHANNEL; @@ -148,12 +165,12 @@ static int ufo_decode_frame_channels(ufo_decoder decoder, uint16_t *pixel_buffer pixel_buffer[base] = 0; /* base++; */ } -#ifdef DEBUG +#ifdef CHECKS else CHECK_FLAG("number of pixels, %i is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL); #endif -#ifdef HAVE_SSE +#if defined(HAVE_SSE)&&!defined(DEBUG) for (int i = 1 ; i < bytes-4; i += 4, base += 12) { packed = _mm_set_epi32(raw[i], raw[i+1], raw[i+2], raw[i+3]); @@ -192,7 +209,7 @@ static int ufo_decode_frame_channels(ufo_decoder decoder, uint16_t *pixel_buffer pixel_buffer[base++] = (data >> 20) & 0x3FF; pixel_buffer[base++] = (data >> 10) & 0x3FF; pixel_buffer[base++] = data & 0x3FF; -#else +#else /* HAVE_SSE */ for (int i = 1 ; i < bytes; i++) { data = raw[i]; #ifdef DEBUG @@ -205,7 +222,7 @@ static int ufo_decode_frame_channels(ufo_decoder decoder, uint16_t *pixel_buffer pixel_buffer[base++] = (data >> 10) & 0x3FF; pixel_buffer[base++] = data & 0x3FF; } -#endif +#endif /* HAVE_SSE */ data = raw[bytes]; #ifdef DEBUG @@ -307,7 +324,7 @@ size_t ufo_decoder_decode_frame(ufo_decoder decoder, uint32_t *raw, size_t num_b if ((pixels == NULL)||(num_words < 16)) return 0; -#ifdef DEBUG +#ifdef CHECKS CHECK_VALUE(raw[pos++], 0x51111111); CHECK_VALUE(raw[pos++], 0x52222222); CHECK_VALUE(raw[pos++], 0x53333333); @@ -330,7 +347,7 @@ size_t ufo_decoder_decode_frame(ufo_decoder decoder, uint32_t *raw, size_t num_b pos += advance; -#ifdef DEBUG +#ifdef CHECKS CHECK_VALUE(raw[pos++], 0x0AAAAAAA); CHECK_VALUE(raw[pos++], 0x0BBBBBBB); // Statuses of previous! frame is following |