/alps/ufodecode

To get this branch, use:
bzr branch http://suren.me/webbzr/alps/ufodecode

« back to all changes in this revision

Viewing changes to src/ufodecode.c

  • Committer: Suren A. Chilingaryan
  • Date: 2012-10-23 00:05:26 UTC
  • mfrom: (39.1.12 upstream)
  • Revision ID: csa@dside.dyndns.org-20121023000526-ifuq3qa3ppzbygqr
Merge from mv

Show diffs side-by-side

added added

removed removed

Lines of Context:
157
157
        int pixels = (info >> 20) & 0xFF;
158
158
 
159
159
#ifdef CHECKS
160
 
        int err = 0;
161
160
        int header = (info >> 30) & 0x03;
162
161
        const int bpp = (info >> 16) & 0x0F;
 
162
        int err;
163
163
        CHECK_FLAG("raw header magick", header == 2, header);
164
164
        CHECK_FLAG("row number, only %i rows requested", row < num_rows, row, num_rows);
165
165
        CHECK_FLAG("pixel size, only 10 bits are supported", bpp == 10, bpp);
299
299
        int header = (info >> 30) & 0x03;
300
300
        const int bpp = (info >> 16) & 0x0F;
301
301
        CHECK_FLAG("raw header magick", header == 2, header);
302
 
 
303
 
        /* XXX: rows are numbered absolutely so this becomes unnecessary */
304
 
        /* CHECK_FLAG("row number, only %i rows requested", row < num_rows, row, num_rows); */
305
 
 
306
302
        CHECK_FLAG("pixel size, only 10 bits are supported", bpp == 10, bpp);
307
303
        CHECK_FLAG("channel, limited by %zu output channels", channel < channels_per_row, channel, channels_per_row);
308
304
#endif
398
394
ufo_decode_frame_channels_v5(UfoDecoder     *decoder,
399
395
                             uint16_t       *pixel_buffer,
400
396
                             uint32_t       *raw,
401
 
                             size_t          num_words,
402
397
                             size_t          num_rows,
403
398
                             size_t         *offset,
404
399
                             uint8_t         output_mode)
405
400
{
406
401
    payload_header_v5 *header;
407
402
    size_t base = 0, index = 0;
408
 
    int off = 0;
409
403
 
410
404
    header = (payload_header_v5 *) &raw[base];
411
405
 
412
406
    if (output_mode == IPECAMERA_MODE_4_CHAN_IO) {
 
407
        size_t off = 0;
 
408
 
413
409
        while (raw[base] != 0xAAAAAAA) {
414
410
            header = (payload_header_v5 *) &raw[base];
415
411
            index = header->row_number * IPECAMERA_WIDTH + header->pixel_number;
433
429
            base += 6;
434
430
        }
435
431
    }
436
 
    else { /*if (output_mode == IPECAMERA_MODE_16_CHAN_IO)*/
 
432
    else {
437
433
        while (raw[base] != 0xAAAAAAA) {
438
434
            header = (payload_header_v5 *) &raw[base];
439
435
            index = header->row_number * IPECAMERA_WIDTH + header->pixel_number;
440
436
 
441
437
            /* Skip header + two zero-filled words */
442
 
            /*
443
 
                        base += 3;
444
 
                        pixel_buffer[index + 15*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 22);
445
 
                        pixel_buffer[index + 13*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 12);
446
 
                        pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 2);
447
 
                        pixel_buffer[index + 12*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3 & raw[base]) << 8) | (0x3ff & (raw[base+1] >> 24));
448
 
                        pixel_buffer[index + 10*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 14);
449
 
                        pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 4);
450
 
                        pixel_buffer[index + 11*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 6) | (0x3ff & (raw[base+2] >> 26));
451
 
                        pixel_buffer[index +  7*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 16);
452
 
                        pixel_buffer[index +  9*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 6);
453
 
                        pixel_buffer[index +  6*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3f & raw[base+2]) << 4) | (0x3ff & (raw[base+3] >> 28));
454
 
                        pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 18);
455
 
                        pixel_buffer[index +  2*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 8);
456
 
                        pixel_buffer[index +  4*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xff & raw[base+3]) << 2) | (0x3ff & (raw[base+4] >> 30));
457
 
                        pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 20);
458
 
                        pixel_buffer[index +  0*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 10);
459
 
                        pixel_buffer[index +  1*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+4];
460
 
                        base += 5;
461
 
            */
462
 
 
463
438
            base += 2;
464
439
 
465
440
            if (header->magic != 0xc0) {
466
441
                pixel_buffer[index + 15*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 20);
467
442
                pixel_buffer[index + 13*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 8);
468
 
                pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = (0xff & raw[base]) << 4 | (raw[base+1] >> 28);
 
443
                pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (((0xff & raw[base]) << 4) | (raw[base+1] >> 28));
469
444
                pixel_buffer[index + 12*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 16);
470
445
                pixel_buffer[index + 10*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 4);
471
 
                pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 8) | (raw[base+2] >> 24);
 
446
                pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3 & raw[base+1]) << 8) | (raw[base+2] >> 24);
472
447
                pixel_buffer[index + 11*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 12);
473
448
                pixel_buffer[index +  7*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+2];
474
449
                pixel_buffer[index +  9*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 20);
475
450
                pixel_buffer[index +  6*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 8);
476
 
                pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = (0xff & raw[base+3]) << 4 | (raw[base+4] >> 28);
 
451
                pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (((0xff & raw[base+3]) << 4) | (raw[base+4] >> 28));
477
452
                pixel_buffer[index +  2*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 16);
478
453
                pixel_buffer[index +  4*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 4);
479
 
                pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+4]) << 8) | (raw[base+5] >> 24);
 
454
                pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3 & raw[base+4]) << 8) | (raw[base+5] >> 24);
480
455
                pixel_buffer[index +  0*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+5] >> 12);
481
456
                pixel_buffer[index +  1*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+5];
482
457
            }
483
 
            else {
484
 
                off++;
485
 
 
486
 
                if (header->magic == 0xc0)
487
 
                    off = 0;
488
 
            }
489
458
 
490
459
            base += 6;
491
 
 
492
460
        }
493
461
    }
494
462
 
495
 
 
496
463
    *offset = base;
497
464
    return 0;
498
465
}
 
466
 
499
467
/**
500
468
 * \brief Deinterlace by interpolating between two rows
501
469
 *
584
552
    CHECK_VALUE(raw[pos++], 0x55555555);
585
553
 
586
554
    switch (version) {
587
 
    case 0:
588
 
        CHECK_VALUE(raw[pos++], 0x56666666);
589
 
        CHECK_VALUE(raw[pos] >> 28, 0x5);
590
 
        meta->frame_number = raw[pos++] & 0xFFFFFFF;
591
 
        CHECK_VALUE(raw[pos] >> 28, 0x5);
592
 
        meta->time_stamp = raw[pos++] & 0xFFFFFFF;
593
 
        break;
594
 
 
595
 
    case 4:
596
 
    case 5:
597
 
        CHECK_VALUE(raw[pos] >> 28, 0x5);
598
 
        meta->cmosis_start_address = (raw[pos] >> 21) & 0x1FF;
599
 
        meta->n_skipped_rows = (raw[pos] >> 15) & 0x3F;
600
 
        meta->n_rows = rows_per_frame = raw[pos] & 0x7FF;
601
 
        pos++;
602
 
 
603
 
        meta->frame_number = raw[pos++] & 0x1FFFFFF;
604
 
        CHECK_VALUE(raw[pos] >> 28, 0x5);
605
 
        meta->time_stamp = raw[pos] & 0xFFFFFF;
606
 
        meta->output_mode = (raw[pos] >> 24) & 0x3;
607
 
        meta->adc_resolution = (raw[pos] >> 26) & 0x3;
608
 
        pos++;
609
 
 
610
 
        if ((meta->output_mode != IPECAMERA_MODE_4_CHAN_IO)&&(meta->output_mode != IPECAMERA_MODE_16_CHAN_IO)) {
 
555
        case 0:
 
556
            CHECK_VALUE(raw[pos++], 0x56666666);
 
557
            CHECK_VALUE(raw[pos] >> 28, 0x5);
 
558
            meta->frame_number = raw[pos++] & 0xFFFFFFF;
 
559
            CHECK_VALUE(raw[pos] >> 28, 0x5);
 
560
            meta->time_stamp = raw[pos++] & 0xFFFFFFF;
 
561
            break;
 
562
 
 
563
        case 4:
 
564
        case 5:
 
565
            CHECK_VALUE(raw[pos] >> 28, 0x5);
 
566
            meta->cmosis_start_address = (raw[pos] >> 21) & 0x1FF;
 
567
            meta->n_skipped_rows = (raw[pos] >> 15) & 0x3F;
 
568
            meta->n_rows = rows_per_frame = raw[pos] & 0x7FF;
 
569
            pos++;
 
570
 
 
571
            meta->frame_number = raw[pos++] & 0x1FFFFFF;
 
572
            CHECK_VALUE(raw[pos] >> 28, 0x5);
 
573
            meta->time_stamp = raw[pos] & 0xFFFFFF;
 
574
            meta->output_mode = (raw[pos] >> 24) & 0x3;
 
575
            meta->adc_resolution = (raw[pos] >> 26) & 0x3;
 
576
            pos++;
 
577
 
 
578
            if ((meta->output_mode != IPECAMERA_MODE_4_CHAN_IO) && (meta->output_mode != IPECAMERA_MODE_16_CHAN_IO)) {
611
579
#ifdef DEBUG
612
 
            fprintf(stderr, "Output mode 0x%lx is not supported\n", meta->output_mode);
 
580
                fprintf(stderr, "Output mode 0x%x is not supported\n", meta->output_mode);
613
581
#endif
614
 
            return EILSEQ;
615
 
        }
616
 
        break;
 
582
                return EILSEQ;
 
583
            }
 
584
            break;
617
585
 
618
 
    default:
619
 
        fprintf(stderr, "Unsupported data format detected\n");
620
 
        return 0;
 
586
        default:
 
587
            fprintf(stderr, "Unsupported data format version %i detected\n", version);
 
588
            return 0;
621
589
    }
622
590
 
623
591
    if (err)
624
592
        return 0;
625
593
#else
626
594
    switch (version) {
627
 
    case 0:
628
 
        meta->frame_number = raw[pos + 6] & 0xFFFFFFF;
629
 
        meta->time_stamp = raw[pos + 7] & 0xFFFFFFF;
630
 
        break;
631
 
    case 4:
632
 
    case 5:
633
 
        meta->frame_number = raw[pos + 6] & 0x1FFFFFF;
634
 
        meta->time_stamp = raw[pos + 7] & 0xFFFFFF;
635
 
        meta->output_mode = (raw[pos + 7] >> 24) & 0x3;
636
 
        meta->adc_resolution = (raw[pos + 7] >> 26) & 0x3;
 
595
        case 0:
 
596
            meta->frame_number = raw[pos + 6] & 0xFFFFFFF;
 
597
            meta->time_stamp = raw[pos + 7] & 0xFFFFFFF;
 
598
            break;
 
599
        case 4:
 
600
        case 5:
 
601
            meta->frame_number = raw[pos + 6] & 0x1FFFFFF;
 
602
            meta->time_stamp = raw[pos + 7] & 0xFFFFFF;
 
603
            meta->output_mode = (raw[pos + 7] >> 24) & 0x3;
 
604
            meta->adc_resolution = (raw[pos + 7] >> 26) & 0x3;
637
605
 
638
 
        break;
639
 
    default:
640
 
        fprintf(stderr, "Unsupported data format detected\n");
641
 
        return 0;
 
606
            break;
 
607
        default:
 
608
            fprintf(stderr, "Unsupported data format detected\n");
 
609
            return 0;
642
610
    }
643
611
 
644
612
    pos += 8;
645
613
#endif
646
614
 
647
615
    switch (version) {
648
 
    case 0:
649
 
        err = ufo_decode_frame_channels_v0(decoder, pixels, raw + pos, num_words - pos - 8, &advance);
650
 
        break;
651
 
    case 4:
652
 
        err = ufo_decode_frame_channels_v4(decoder, pixels, raw + pos, num_words - pos - 8, rows_per_frame, &advance);
653
 
        break;
654
 
    case 5:
655
 
        err = ufo_decode_frame_channels_v5(decoder, pixels, raw + pos, num_words - pos - 8, rows_per_frame, &advance, meta->output_mode);
656
 
        break;
657
 
    default:
658
 
        break;
 
616
        case 0:
 
617
            err = ufo_decode_frame_channels_v0(decoder, pixels, raw + pos, num_words - pos - 8, &advance);
 
618
            break;
 
619
        case 4:
 
620
            err = ufo_decode_frame_channels_v4(decoder, pixels, raw + pos, num_words - pos - 8, rows_per_frame, &advance);
 
621
            break;
 
622
        case 5:
 
623
            err = ufo_decode_frame_channels_v5(decoder, pixels, raw + pos, rows_per_frame, &advance, meta->output_mode);
 
624
            break;
 
625
        default:
 
626
            break;
659
627
    }
660
628
 
661
629
    if (err)