Changeset 1866


Ignore:
Timestamp:
05/26/12 23:14:42 (13 months ago)
Author:
philmoz
Message:

Updates for G1X:

  • Add 14 bit raw support for DNG thumbnail generation and badpixel mapping.
  • Fix bug in DNG thumbnail generation code.
  • Set DNG color matrix (taken from native raw file converted to DNG with Adobe convertor).
  • Add second color matrix plus calibration and forward matrices for color conversion.
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/core/dng.c

    r1863 r1866  
    110110#define GPS_IFD_INDEX               21      // tag 0x8825 
    111111#define DNG_VERSION_INDEX           23      // tag 0xC612 
    112 #define UNIQUE_CAMERA_MODEL_INDEX   24      // tag 0xC614 
     112#define UNIQUE_CAMERA_MODEL_INDEX   25      // tag 0xC614 
     113#define COLOR_MATRIX2_INDEX         27      // tag 0xc622 
     114#define CALIBRATION1_INDEX          28      // tag 0xc623 
     115#define CALIBRATION2_INDEX          29      // tag 0xc624 
     116#define ILLUMINANT2_INDEX           38      // tag 0xc65b 
     117#define FORWARD_MATRIX1_INDEX       39      // tag 0xc714 
     118#define FORWARD_MATRIX2_INDEX       40      // tag 0xc715 
    113119 
    114120struct dir_entry ifd0[]={ 
     
    137143    {0x9216, T_BYTE,       4,  0x00000001},                        // TIFF/EPStandardID: 1.0.0.0 
    138144    {0xC612, T_BYTE,       4,  0x00000301},                        // DNGVersion: 1.3.0.0 
     145    {0xC613, T_BYTE,       4,  0x00000101},                        // DNGBackwardVersion: 1.1.0.0 
    139146    {0xC614, T_ASCII,      32, (int)cam_name},                     // UniqueCameraModel. Filled at header generation. 
    140147    {0xC621, T_SRATIONAL,  9,  (int)&camera_sensor.color_matrix1}, 
     148    {0xC622, T_SRATIONAL,  9,  (int)&camera_sensor.color_matrix2}, 
     149    {0xC623, T_SRATIONAL,  9,  (int)&camera_sensor.camera_calibration1}, 
     150    {0xC624, T_SRATIONAL,  9,  (int)&camera_sensor.camera_calibration2}, 
    141151    {0xC627, T_RATIONAL,   3,  (int)cam_AnalogBalance}, 
    142152    {0xC628, T_RATIONAL,   3,  (int)cam_AsShotNeutral}, 
     
    147157    {0xC630, T_RATIONAL,   4,  (int)&camera_sensor.lens_info}, 
    148158    {0xC65A, T_SHORT|T_PTR,1,  (int)&camera_sensor.calibration_illuminant1},  
     159    {0xC65B, T_SHORT|T_PTR,1,  (int)&camera_sensor.calibration_illuminant2},  
     160    {0xC714, T_SRATIONAL,  9,  (int)&camera_sensor.forward_matrix1}, 
     161    {0xC715, T_SRATIONAL,  9,  (int)&camera_sensor.forward_matrix2}, 
    149162}; 
    150163 
     
    287300        ifd0[DNG_VERSION_INDEX].offset = BE(0x01010000); 
    288301        ifd1[BADPIXEL_OPCODE_INDEX].type |= T_SKIP; 
    289         ifd_list[1].count = DIR_SIZE(ifd1) - 1; 
    290302    } 
    291303    else 
     
    294306        ifd0[DNG_VERSION_INDEX].offset = BE(0x01030000); 
    295307        ifd1[BADPIXEL_OPCODE_INDEX].type &= ~T_SKIP; 
    296         ifd_list[1].count = DIR_SIZE(ifd1); 
    297308    } 
    298309 
     
    310321        // If no GPS then remove the GPS data from the header - assumes gps_ifd is the last one in ifd_list 
    311322        ifd_count--; 
    312         ifd_list[0].count = DIR_SIZE(ifd0) - 1;     // Entry 0x8825 won't be saved so don't count it 
    313323        ifd0[GPS_IFD_INDEX].type |= T_SKIP;         // mark entry so it is skipped 
    314324    } 
     
    325335    exif_ifd[FLASH_MODE_INDEX].offset = get_flash_mode_for_exif(exif_data.flash_mode, exif_data.flash_fired); 
    326336    exif_ifd[SSTIME_INDEX].count = exif_ifd[SSTIME_ORIG_INDEX].count = strlen(cam_subsectime)+1; 
     337 
     338    // Skip color matrix and calibration entries that aren't defined for the camera 
     339    if (camera_sensor.calibration_illuminant2 == 0) 
     340    { 
     341        ifd0[ILLUMINANT2_INDEX].type |= T_SKIP; 
     342        ifd0[COLOR_MATRIX2_INDEX].type |= T_SKIP; 
     343    } 
     344    if (camera_sensor.has_calibration1 == 0)    ifd0[CALIBRATION1_INDEX].type |= T_SKIP; 
     345    if (camera_sensor.has_calibration2 == 0)    ifd0[CALIBRATION2_INDEX].type |= T_SKIP; 
     346    if (camera_sensor.has_forwardmatrix1 == 0)  ifd0[FORWARD_MATRIX1_INDEX].type |= T_SKIP; 
     347    if (camera_sensor.has_forwardmatrix2 == 0)  ifd0[FORWARD_MATRIX2_INDEX].type |= T_SKIP; 
     348 
     349    // fixup up IFD count values, exclude skipped entries 
     350    for (j=0;j<ifd_count;j++) 
     351    { 
     352        ifd_list[j].count = 0; 
     353        for(i=0; i<ifd_list[j].entry_count; i++) 
     354        { 
     355            if ((ifd_list[j].entry[i].type & T_SKIP) == 0)  // Exclude skipped entries (e.g. GPS info if camera doesn't have GPS) 
     356            { 
     357                ifd_list[j].count++; 
     358            } 
     359        } 
     360    } 
    327361 
    328362    // calculating offset of RAW data and count of entries for each IFD 
     
    647681        for (j=0; j<DNG_TH_WIDTH; j++) 
    648682        { 
    649             x = ((camera_sensor.jpeg.x + (camera_sensor.jpeg.width  * j) / DNG_TH_WIDTH)  & 0xFFFFFFFE) + xadj; 
    650             y = ((camera_sensor.jpeg.y + (camera_sensor.jpeg.height * i) / DNG_TH_HEIGHT) & 0xFFFFFFFE) + yadj; 
     683            x = ((camera_sensor.active_area.x1 + camera_sensor.jpeg.x + (camera_sensor.jpeg.width  * j) / DNG_TH_WIDTH)  & 0xFFFFFFFE) + xadj; 
     684            y = ((camera_sensor.active_area.y1 + camera_sensor.jpeg.y + (camera_sensor.jpeg.height * i) / DNG_TH_HEIGHT) & 0xFFFFFFFE) + yadj; 
    651685 
    652686            *buf++ = gamma[get_raw_pixel(x,y)>>shift];           // red pixel 
  • trunk/core/main.c

    r1863 r1866  
    4747    { -1 , 2 }, 
    4848#endif 
     49#if defined(cam_CFAPattern) 
     50    cam_CFAPattern,  
     51#else 
     52    0, 
     53#endif 
    4954#if defined(CAM_COLORMATRIX1) 
     55    cam_CalibrationIlluminant1, 
    5056    { CAM_COLORMATRIX1 }, 
    51     cam_CFAPattern, cam_CalibrationIlluminant1, 
    52 #else 
    53     { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    54     0, 0, 
     57#else 
     58    0, 
     59    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     60#endif 
     61#if defined(CAM_COLORMATRIX2) 
     62    cam_CalibrationIlluminant2, 
     63    { CAM_COLORMATRIX2 }, 
     64#else 
     65    0, 
     66    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     67#endif 
     68#if defined(CAM_CAMERACALIBRATION1) 
     69    1, 
     70    { CAM_CAMERACALIBRATION1 }, 
     71#else 
     72    0, 
     73    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     74#endif 
     75#if defined(CAM_CAMERACALIBRATION2) 
     76    1, 
     77    { CAM_CAMERACALIBRATION2 }, 
     78#else 
     79    0, 
     80    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     81#endif 
     82#if defined(CAM_FORWARDMATRIX1) 
     83    1, 
     84    { CAM_FORWARDMATRIX1 }, 
     85#else 
     86    0, 
     87    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
     88#endif 
     89#if defined(CAM_FORWARDMATRIX2) 
     90    1, 
     91    { CAM_FORWARDMATRIX2 }, 
     92#else 
     93    0, 
     94    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, 
    5595#endif 
    5696}; 
  • trunk/core/raw.c

    r1810 r1866  
    213213    } 
    214214#elif CAM_SENSOR_BITS_PER_PIXEL==14 
     215    unsigned char* addr=(unsigned char*)get_raw_image_addr()+y*camera_sensor.raw_rowlen+(x/8)*14; 
     216    switch (x%8) { 
     217        case 0: addr[ 0]=(addr[0]&0x03)|(value<< 2); addr[ 1]=value>>6;                                                         break; 
     218        case 1: addr[ 0]=(addr[0]&0xFC)|(value>>12); addr[ 2]=(addr[ 2]&0x0F)|(value<< 4); addr[ 3]=value>>4;                   break; 
     219        case 2: addr[ 2]=(addr[2]&0xF0)|(value>>10); addr[ 4]=(addr[ 4]&0x3F)|(value<< 6); addr[ 5]=value>>2;                   break; 
     220        case 3: addr[ 4]=(addr[4]&0xC0)|(value>> 8); addr[ 7]=value;                                                            break; 
     221        case 4: addr[ 6]=value>>6;                   addr[ 9]=(addr[ 9]&0x03)|(value<< 2);                                      break; 
     222        case 5: addr[ 8]=value>>4;                   addr[ 9]=(addr[ 9]&0x3F)|(value>>12); addr[11]=(addr[11]&0x0F)|(value<<4); break; 
     223        case 6: addr[10]=value>>2;                   addr[11]=(addr[11]&0xF0)|(value>>10); addr[13]=(addr[13]&0x3F)|(value<<6); break; 
     224        case 7: addr[12]=value;                      addr[13]=(addr[13]&0xC0)|(value>> 8);                                      break; 
     225    } 
    215226#else  
    216227    #error define set_raw_pixel for sensor bit depth 
     
    235246    unsigned char* addr=(unsigned char*)get_raw_image_addr()+y*camera_sensor.raw_rowlen+(x/4)*6; 
    236247    switch (x%4) { 
    237         case 0: return ((unsigned short)(addr[1]) << 4) | (addr[0] >> 4); 
     248        case 0: return ((unsigned short)(addr[1])        << 4) | (addr[0] >> 4); 
    238249        case 1: return ((unsigned short)(addr[0] & 0x0F) << 8) | (addr[3]); 
    239         case 2: return ((unsigned short)(addr[2]) << 4) | (addr[5] >> 4); 
     250        case 2: return ((unsigned short)(addr[2])        << 4) | (addr[5] >> 4); 
    240251        case 3: return ((unsigned short)(addr[5] & 0x0F) << 8) | (addr[4]); 
    241252    } 
    242253#elif CAM_SENSOR_BITS_PER_PIXEL==14 
    243     return CAM_BLACK_LEVEL; 
     254    unsigned char* addr=(unsigned char*)get_raw_image_addr()+y*camera_sensor.raw_rowlen+(x/8)*14; 
     255    switch (x%8) { 
     256        case 0: return ((unsigned short)(addr[ 1])        <<  6) | (addr[ 0] >> 2); 
     257        case 1: return ((unsigned short)(addr[ 0] & 0x03) << 12) | (addr[ 3] << 4) | (addr[ 2] >> 4); 
     258        case 2: return ((unsigned short)(addr[ 2] & 0x0F) << 10) | (addr[ 5] << 2) | (addr[ 4] >> 6); 
     259        case 3: return ((unsigned short)(addr[ 4] & 0x3F) <<  8) | (addr[ 7]); 
     260        case 4: return ((unsigned short)(addr[ 6])        <<  6) | (addr[ 9] >> 2); 
     261        case 5: return ((unsigned short)(addr[ 9] & 0x03) << 12) | (addr[ 8] << 4) | (addr[11] >> 4); 
     262        case 6: return ((unsigned short)(addr[11] & 0x0F) << 10) | (addr[10] << 2) | (addr[13] >> 6); 
     263        case 7: return ((unsigned short)(addr[13] & 0x3F) <<  8) | (addr[12]); 
     264    } 
    244265#else  
    245266    #error define get_raw_pixel for sensor bit depth 
  • trunk/include/camera.h

    r1863 r1866  
    143143    #undef  CAM_COLORMATRIX1                    // DNG color profile matrix 
    144144    #undef  cam_CalibrationIlluminant1          // DNG color profile illuminant - set it to 17 for standard light A 
     145    #undef  CAM_COLORMATRIX2                    // DNG color profile matrix 2 
     146    #undef  cam_CalibrationIlluminant2          // DNG color profile illuminant 2 - set it to 21 for D65 
     147    #undef  CAM_CAMERACALIBRATION1              // DNG camera calibration matrix 1 
     148    #undef  CAM_CAMERACALIBRATION2              // DNG camera calibration matrix 2 
     149    #undef  CAM_FORWARDMATRIX1                  // DNG camera forward matrix 1 
     150    #undef  CAM_FORWARDMATRIX2                  // DNG camera forward matrix 2 
    145151    #undef  CAM_DNG_EXPOSURE_BIAS               // Specify DNG exposure bias value (to override default of -0.5 in the dng.c code) 
    146152    #undef  DNG_EXT_FROM                        // Extension in the cameras known extensions to replace with .DNG to allow DNG 
     
    266272    int lens_info[8];           // DNG Lens Info 
    267273    int exposure_bias[2];       // DNG Exposure Bias 
     274    int cfa_pattern; 
     275    int calibration_illuminant1; 
    268276    int color_matrix1[18];      // DNG Color Matrix 
    269     int cfa_pattern, calibration_illuminant1; 
     277    int calibration_illuminant2; 
     278    int color_matrix2[18];      // DNG Color Matrix 2 
     279    int has_calibration1; 
     280    int camera_calibration1[18];// DNG Camera Calibration Matrix 1 
     281    int has_calibration2; 
     282    int camera_calibration2[18];// DNG Camera Calibration Matrix 2 
     283    int has_forwardmatrix1; 
     284    int forward_matrix1[18];    // DNG Camera Forward Matrix 1 
     285    int has_forwardmatrix2; 
     286    int forward_matrix2[18];    // DNG Camera Forward Matrix 1 
    270287} _cam_sensor; 
    271288 
  • trunk/platform/g1x/platform_camera.h

    r1863 r1866  
    5252    #define cam_CFAPattern                      0x02010100 // Red  Green  Green  Blue 
    5353 
    54     #define CAM_DNG_EXPOSURE_BIAS               0,1     // Specify DNG exposure bias value to 0 (to override default of -0.5 in the dng.c code) 
    55  
    5654    #define CAM_DNG_LENS_INFO                   { 151,10, 604,10, 28,10, 58,10 }    // See comments in camera.h 
    5755 
    58     //need fixing ***************************************************** 
    59     #define cam_CalibrationIlluminant1  1 
     56    //From G1 X native RAW file as converted to DNG by Adobe convertor 
     57    #define cam_CalibrationIlluminant1          17      // Standard Light A 
    6058    #define CAM_COLORMATRIX1    \ 
    61     544808, 100000, -174047, 100000, -80399, 100000, \ 
    62     -75055, 100000,  440444, 100000,  11367, 100000, \ 
    63      -5801, 100000,   71589, 100000, 118914, 100000 
     59      8138, 10000,  -2281, 10000,   -659, 10000, \ 
     60     -3453, 10000,  11006, 10000,   2816, 10000, \ 
     61      -297, 10000,   1118, 10000,   6471, 10000 
     62    #define cam_CalibrationIlluminant2          21      // D65 
     63    #define CAM_COLORMATRIX2    \ 
     64      7378, 10000,  -1255, 10000,  -1043, 10000, \ 
     65     -4088, 10000,  12251, 10000,   2048, 10000, \ 
     66      -876, 10000,   1946, 10000,   5805, 10000 
     67    #define CAM_CAMERACALIBRATION1    \ 
     68     10102, 10000,      0, 10000,      0, 10000, \ 
     69         0, 10000,  10000, 10000,      0, 10000, \ 
     70         0, 10000,  00000, 10000,  10233, 10000 
     71    #define CAM_CAMERACALIBRATION2    \ 
     72     10102, 10000,      0, 10000,      0, 10000, \ 
     73         0, 10000,  10000, 10000,      0, 10000, \ 
     74         0, 10000,  00000, 10000,  10233, 10000 
     75    #define CAM_FORWARDMATRIX1    \ 
     76      7310, 10000,    833, 10000,   1500, 10000, \ 
     77      2013, 10000,   8875, 10000,   -888, 10000, \ 
     78        34, 10000,  -4122, 10000,  12339, 10000 
     79    #define CAM_FORWARDMATRIX2    \ 
     80      7010, 10000,   1653, 10000,    980, 10000, \ 
     81      2351, 10000,   9551, 10000,  -1902, 10000, \ 
     82       177, 10000,  -2144, 10000,  10218, 10000 
    6483 
    6584    // Sensor size, DNG image size & cropping 
Note: See TracChangeset for help on using the changeset viewer.