/alps/ufodecode

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/ufodecode

« back to all changes in this revision

Viewing changes to src/ufodecode.c

  • Committer: Matthias Vogelgesang
  • Date: 2012-07-18 09:50:30 UTC
  • Revision ID: matthias.vogelgesang@kit.edu-20120718095030-pq2py9clhlx0nqz8
Correctly implement 12 bit mode

Show diffs side-by-side

added added

removed removed

Lines of Context:
311
311
            pixel_buffer[base] = 0;
312
312
            /* base++; */
313
313
        }
314
 
/* #ifdef DEBUG */
315
 
/*         else */ 
316
 
/*             CHECK_FLAG("number of pixels, %i is expected", pixels == IPECAMERA_PIXELS_PER_CHANNEL, pixels, IPECAMERA_PIXELS_PER_CHANNEL); */
317
 
/* #endif */
318
314
 
319
315
#if defined(HAVE_SSE) && !defined(DEBUG)
320
316
        for (int i = 1 ; i < bytes-4; i += 4, base += 12) {
399
395
                             size_t          num_rows, 
400
396
                             size_t         *offset)
401
397
{
 
398
    payload_header_v5 *header;
402
399
    size_t base = 0, index = 0;
403
 
 
404
 
    for (int row = 0; row < num_rows; row++) {
405
 
        for (int pix = 0; pix < 128; pix++) {
406
 
            payload_header_v5 *header = (payload_header_v5 *) &raw[base];
407
 
 
408
 
            if (header->row_number > num_rows) {
409
 
                fprintf(stderr, "Error: row_number in header is %i instead of %i\n", 
410
 
                        header->row_number, row); 
411
 
                return 1;
412
 
            }
413
 
 
414
 
            if (header->pixel_number > 128) {
415
 
                fprintf(stderr, "Error: pixel_number in header is %i instead of %i\n", 
416
 
                        header->pixel_number, pix); 
417
 
                return 1;
418
 
            }
419
 
 
 
400
    int off = 0;
 
401
 
 
402
    header = (payload_header_v5 *) &raw[base];
 
403
 
 
404
    if (header->pixel_size == 12) {
 
405
        while (raw[base] != 0xAAAAAAA) {
 
406
            header = (payload_header_v5 *) &raw[base];
420
407
            index = header->row_number * IPECAMERA_WIDTH + header->pixel_number;
421
408
 
422
 
            /* TODO: this branch should be removed from the inner loop */
423
 
            if (header->pixel_size == 10) {
424
 
                /* Skip header + two zero-filled words */
425
 
                base += 3;
426
 
 
427
 
                pixel_buffer[index + 15*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 22);
428
 
                pixel_buffer[index + 13*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 12);
429
 
                pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 2);
430
 
                pixel_buffer[index + 12*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3 & raw[base]) << 8) | (0x3ff & (raw[base+1] >> 24));
431
 
                pixel_buffer[index + 10*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 14);
432
 
                pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 4);
433
 
                pixel_buffer[index + 11*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 6) | (0x3ff & (raw[base+2] >> 26));
434
 
                pixel_buffer[index +  7*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 16);
435
 
                pixel_buffer[index +  9*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 6);
436
 
                pixel_buffer[index +  6*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3f & raw[base+2]) << 4) | (0x3ff & (raw[base+3] >> 28));
437
 
                pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 18);
438
 
                pixel_buffer[index +  2*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 8);
439
 
                pixel_buffer[index +  4*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xff & raw[base+3]) << 2) | (0x3ff & (raw[base+4] >> 30));
440
 
                pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 20);
441
 
                pixel_buffer[index +  0*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 10);
442
 
                pixel_buffer[index +  1*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+4];
443
 
            }
444
 
            else if (header->pixel_size == 12) {
445
 
                /* Skip header + one zero-filled word */
446
 
                base += 2;
447
 
 
448
 
                pixel_buffer[index + 15*IPECAMERA_PIXELS_PER_CHANNEL] = 0xfff & (raw[base] >> 20);
449
 
                pixel_buffer[index + 13*IPECAMERA_PIXELS_PER_CHANNEL] = 0xfff & (raw[base] >> 8);
450
 
                pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = (0xff & raw[base]) << 4 | (raw[base+1] >> 28);
451
 
                pixel_buffer[index + 12*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 16);
452
 
                pixel_buffer[index + 10*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 4);
453
 
                pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 8) | (raw[base+2] >> 24);
454
 
                pixel_buffer[index + 11*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 12);
455
 
                pixel_buffer[index +  7*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+2];
456
 
                pixel_buffer[index +  9*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 20);
457
 
                pixel_buffer[index +  6*IPECAMERA_PIXELS_PER_CHANNEL] = 0xfff & (raw[base+3] >> 8);
458
 
                pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = (0xff & raw[base+3]) << 4 | (raw[base+4] >> 28);
459
 
                pixel_buffer[index +  2*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 16);
460
 
                pixel_buffer[index +  4*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 4);
461
 
                pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+4]) << 8) | (raw[base+5] >> 24);
462
 
                pixel_buffer[index +  0*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+5] >> 12);
463
 
                pixel_buffer[index +  1*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+5];
464
 
             
465
 
                base += 1;
 
409
            /* Skip header + one zero-filled words */
 
410
            base += 2;
 
411
 
 
412
            if ((header->magic != 0xe0) && (header->magic != 0xc0)) {
 
413
                pixel_buffer[index +  (0+off)*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+5] >> 12);
 
414
                pixel_buffer[index +  (4+off)*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 4);
 
415
                pixel_buffer[index +  (8+off)*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 8) | (raw[base+2] >> 24);
 
416
                pixel_buffer[index + (12+off)*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 16);
466
417
            }
467
418
            else {
468
 
                fprintf(stderr, "Error: unsupported pixel size %i\n", header->pixel_size); 
469
 
                return 1;
 
419
                off++; 
 
420
 
 
421
                if (header->magic == 0xc0)
 
422
                    off = 0;
470
423
            }
471
424
 
472
 
            /* Skip footer */
 
425
            base += 6;
 
426
        }
 
427
    }
 
428
    else if (header->pixel_size) {
 
429
        while (raw[base] != 0xAAAAAAA) {
 
430
            header = (payload_header_v5 *) &raw[base];
 
431
            index = header->row_number * IPECAMERA_WIDTH + header->pixel_number;
 
432
 
 
433
            /* Skip header + two zero-filled words */
 
434
            base += 3;
 
435
 
 
436
            pixel_buffer[index + 15*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 22);
 
437
            pixel_buffer[index + 13*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 12);
 
438
            pixel_buffer[index + 14*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base] >> 2);
 
439
            pixel_buffer[index + 12*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3 & raw[base]) << 8) | (0x3ff & (raw[base+1] >> 24));
 
440
            pixel_buffer[index + 10*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 14);
 
441
            pixel_buffer[index +  8*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+1] >> 4);
 
442
            pixel_buffer[index + 11*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xf & raw[base+1]) << 6) | (0x3ff & (raw[base+2] >> 26));
 
443
            pixel_buffer[index +  7*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 16);
 
444
            pixel_buffer[index +  9*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+2] >> 6);
 
445
            pixel_buffer[index +  6*IPECAMERA_PIXELS_PER_CHANNEL] = ((0x3f & raw[base+2]) << 4) | (0x3ff & (raw[base+3] >> 28));
 
446
            pixel_buffer[index +  5*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 18);
 
447
            pixel_buffer[index +  2*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+3] >> 8);
 
448
            pixel_buffer[index +  4*IPECAMERA_PIXELS_PER_CHANNEL] = ((0xff & raw[base+3]) << 2) | (0x3ff & (raw[base+4] >> 30));
 
449
            pixel_buffer[index +  3*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 20);
 
450
            pixel_buffer[index +  0*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & (raw[base+4] >> 10);
 
451
            pixel_buffer[index +  1*IPECAMERA_PIXELS_PER_CHANNEL] = 0x3ff & raw[base+4];
473
452
            base += 5;
474
453
        }
475
 
 
476
 
        if (row != 0)
477
 
            base += 8;
478
454
    }
479
455
 
480
456
    *offset = base;
638
614
    CHECK_VALUE(raw[pos++], 0x0AAAAAAA);
639
615
 
640
616
    meta->status1.bits = raw[pos++];
641
 
    printf("%x\n", raw[pos]);
642
617
    meta->status2.bits = raw[pos++];
643
618
    meta->status3.bits = raw[pos++];
644
619
    pos++;