36
47
* Check if value matches expected input.
39
50
# define CHECK_VALUE(value, expected) \
40
51
if (value != expected) { \
41
52
fprintf(stderr, "<%s:%i> 0x%x != 0x%x\n", __FILE__, __LINE__, value, expected); \
52
63
* Check that flag evaluates to non-zero.
55
66
# define CHECK_FLAG(flag, check, ...) \
57
68
fprintf(stderr, "<%s:%i> Unexpected value 0x%x of " flag "\n", __FILE__, __LINE__, __VA_ARGS__); \
146
157
if (cpi * channel_size > num_words) {
148
159
fprintf(stderr, "Not enough data to decode frame, expected %lu bytes, but received %lu\n", cpi * channel_size * sizeof(uint32_t), num_words * sizeof(uint32_t));
177
188
pixel_buffer[base] = 0;
182
193
CHECK_FLAG("number of pixels, %i is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL);
185
#if defined(HAVE_SSE) && !defined(DEBUG)
186
197
for (int i = 1 ; i < bytes-4; i += 4, base += 12) {
187
198
packed = _mm_set_epi32(raw[i], raw[i+1], raw[i+2], raw[i+3]);
225
236
for (int i = 1 ; i < bytes; i++) {
228
239
header = (data >> 30) & 0x03;
229
240
CHECK_FLAG("raw data magic", header == 3, header);
233
244
pixel_buffer[base++] = (data >> 20) & 0x3FF;
234
245
pixel_buffer[base++] = (data >> 10) & 0x3FF;
235
246
pixel_buffer[base++] = data & 0x3FF;
239
250
data = raw[bytes];
241
252
header = (data >> 30) & 0x03;
242
253
CHECK_FLAG("raw data magic", header == 3, header);
243
254
CHECK_FLAG("raw footer magic", (data & 0x3FF) == 0x55, (data & 0x3FF));
284
295
if (cpi * channel_size > num_words) {
286
297
fprintf(stderr, "Not enough data to decode frame, expected %lu bytes, but received %lu\n", cpi * channel_size * sizeof(uint32_t), num_words * sizeof(uint32_t));
291
302
for (size_t c = 0; c < cpi; c++) {
292
const int info = raw[0];
293
int row = (info >> 4) & 0x7FF;
294
int channel = info & 0x0F;
295
int pixels = (info >> 20) & 0xFF;
304
const int info = raw[0];
305
int row = (info >> 4) & 0x7FF;
306
int channel = info & 0x0F;
307
int pixels = (info >> 20) & 0xFF;
299
310
int header = (info >> 30) & 0x03;
300
311
const int bpp = (info >> 16) & 0x0F;
301
312
CHECK_FLAG("raw header magick", header == 2, header);
302
313
CHECK_FLAG("pixel size, only 10 bits are supported", bpp == 10, bpp);
303
CHECK_FLAG("channel, limited by %zu output channels", channel < channels_per_row, channel, channels_per_row);
306
if ((channel > channels_per_row) || (pixels > IPECAMERA_PIXELS_PER_CHANNEL))
316
CHECK_FLAG("pixels, only %u pixels per channel (offset: %zx)", pixels <= IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL, (*offset + pos));
317
CHECK_FLAG("channel, limited by %zu output channels (offset: %zx)", channel <= channels_per_row, channel, channels_per_row, (*offset + pos));
309
321
channel = channel_order[channel];
318
#if defined(HAVE_SSE) && !defined(DEBUG)
319
331
for (int i = 1 ; i < bytes-4; i += 4, base += 12) {
320
332
packed = _mm_set_epi32(raw[i], raw[i+1], raw[i+2], raw[i+3]);
358
370
for (int i = 1 ; i < bytes; i++) {
361
373
header = (data >> 30) & 0x03;
362
CHECK_FLAG("raw data magic", header == 3, header);
374
CHECK_FLAG("raw data magic (offset: 0x%zx, expected: 0x02)", header == 3, header, (*offset + pos + i)*sizeof(uint32_t));
366
378
pixel_buffer[base++] = (data >> 20) & 0x3FF;
367
379
pixel_buffer[base++] = (data >> 10) & 0x3FF;
368
380
pixel_buffer[base++] = data & 0x3FF;
372
384
data = raw[bytes];
374
386
header = (data >> 30) & 0x03;
375
CHECK_FLAG("raw data magic", header == 3, header);
376
CHECK_FLAG("raw footer magic", (data & 0x3FF) == 0x55, (data & 0x3FF));
387
CHECK_FLAG("raw data magic (offset: 0x%zx, expected: 0x03)", header == 3, header, (*offset + pos + bytes)*sizeof(uint32_t));
388
CHECK_FLAG("raw footer magic (offset: 0x%zx, expected: 0x55)", (data & 0x3FF) == 0x55, (data & 0x3FF), (*offset + pos + bytes)*sizeof(uint32_t));
539
550
const size_t num_words = num_bytes / 4;
541
if ((pixels == NULL) || (num_words < 16))
552
if ((pixels == NULL) || (num_words < 16)) {
555
fprintf(stderr, "Not enough frame data, only %zu bytes supplied \n", num_bytes);
544
560
size_t rows_per_frame = decoder->height;
545
561
const int version = (raw[pos+6] >> 24) & 0xF;
548
564
CHECK_VALUE(raw[pos++], 0x51111111);
549
565
CHECK_VALUE(raw[pos++], 0x52222222);
550
566
CHECK_VALUE(raw[pos++], 0x53333333);
578
594
if ((meta->output_mode != IPECAMERA_MODE_4_CHAN_IO) && (meta->output_mode != IPECAMERA_MODE_16_CHAN_IO)) {
580
596
fprintf(stderr, "Output mode 0x%x is not supported\n", meta->output_mode);
587
604
fprintf(stderr, "Unsupported data format version %i detected\n", version);
615
636
switch (version) {
617
err = ufo_decode_frame_channels_v0(decoder, pixels, raw + pos, num_words - pos - 8, &advance);
638
err = ufo_decode_frame_channels_v0(decoder, pixels, raw + pos, num_words - pos - 8, &pos);
620
err = ufo_decode_frame_channels_v4(decoder, pixels, raw + pos, num_words - pos - 8, rows_per_frame, &advance);
641
err = ufo_decode_frame_channels_v4(decoder, pixels, raw + pos, num_words - pos - 8, rows_per_frame, &pos);
623
err = ufo_decode_frame_channels_v5(decoder, pixels, raw + pos, rows_per_frame, &advance, meta->output_mode);
644
err = ufo_decode_frame_channels_v5(decoder, pixels, raw + pos, rows_per_frame, &pos, meta->output_mode);