Changeset 1796 for trunk


Ignore:
Timestamp:
04/11/12 03:12:35 (2 years ago)
Author:
philmoz
Message:

Update for DNG handling:

  • Change DNG version to 1.3.0.0
  • Add opcodes for bad pixel removal instead of generating badpixel.bin and mapping out bad pixels in the camera
  • Comment out badpixel.bin related code.
Location:
trunk/core
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/core/conf.c

    r1722 r1796  
    517517        if ( !module_dng_load(LIBDNG_OWNED_BY_RAW) ) 
    518518                return; 
    519         if (!libdng->badpixel_list_loaded_b()) libdng->load_bad_pixels_list_b("A/CHDK/badpixel.bin"); 
    520         if (!libdng->badpixel_list_loaded_b()) conf.dng_raw=0; 
     519    //if (!libdng->badpixel_list_loaded_b()) libdng->load_bad_pixels_list_b("A/CHDK/badpixel.bin"); 
     520    //if (!libdng->badpixel_list_loaded_b()) conf.dng_raw=0; 
    521521 } 
    522522 else if ( libdng && libdng->load_bad_pixels_list_b ) { 
    523         libdng->load_bad_pixels_list_b(0);        //unload badpixel.bin 
     523    //libdng->load_bad_pixels_list_b(0);        //unload badpixel.bin 
    524524        module_dng_unload(LIBDNG_OWNED_BY_RAW); 
    525525 } 
  • trunk/core/dng.c

    r1754 r1796  
    6161 
    6262static struct t_data_for_exif exif_data; 
     63 
     64#define BE(v)   ((v&0x000000FF)<<24)|((v&0x0000FF00)<<8)|((v&0x00FF0000)>>8)|((v&0xFF000000)>>24)   // Convert to big_endian 
     65 
     66static unsigned int badpixel_opcode[] = 
     67{ 
     68    // *** all values must be in big endian order 
     69 
     70    BE(4),              // Count = 4 
     71 
     72    BE(4),              // FixBadPixelsConstant = 4 
     73    BE(0x01030000),     // DNG version = 1.3.0.0 
     74    BE(1),              // Flags = 1 
     75    BE(8),              // Opcode length = 8 bytes 
     76    BE(0),              // Constant = 0 
     77#if   cam_CFAPattern == 0x02010100 
     78    BE(0),              // BayerPhase = 0 (top left pixel is red) 
     79#elif cam_CFAPattern == 0x01020001 
     80    BE(1),              // BayerPhase = 1 (top left pixel is green in a green/red row) 
     81#elif cam_CFAPattern == 0x01000201 
     82    BE(2),              // BayerPhase = 2 (top left pixel is green in a green/blue row) 
     83#elif cam_CFAPattern == 0x00010102 
     84    BE(3),              // BayerPhase = 3 (top left pixel is blue) 
     85#endif 
     86 
     87    BE(4),              // FixBadPixelsConstant = 4 
     88    BE(0x01030000),     // DNG version = 1.3.0.0 
     89    BE(1),              // Flags = 1 
     90    BE(8),              // Opcode length = 8 bytes 
     91    BE(1),              // Constant = 1 
     92#if   cam_CFAPattern == 0x02010100 
     93    BE(0),              // BayerPhase = 0 (top left pixel is red) 
     94#elif cam_CFAPattern == 0x01020001 
     95    BE(1),              // BayerPhase = 1 (top left pixel is green in a green/red row) 
     96#elif cam_CFAPattern == 0x01000201 
     97    BE(2),              // BayerPhase = 2 (top left pixel is green in a green/blue row) 
     98#elif cam_CFAPattern == 0x00010102 
     99    BE(3),              // BayerPhase = 3 (top left pixel is blue) 
     100#endif 
     101 
     102    BE(4),              // FixBadPixelsConstant = 4 
     103    BE(0x01030000),     // DNG version = 1.3.0.0 
     104    BE(1),              // Flags = 1 
     105    BE(8),              // Opcode length = 8 bytes 
     106    BE(2),              // Constant = 2 
     107#if   cam_CFAPattern == 0x02010100 
     108    BE(0),              // BayerPhase = 0 (top left pixel is red) 
     109#elif cam_CFAPattern == 0x01020001 
     110    BE(1),              // BayerPhase = 1 (top left pixel is green in a green/red row) 
     111#elif cam_CFAPattern == 0x01000201 
     112    BE(2),              // BayerPhase = 2 (top left pixel is green in a green/blue row) 
     113#elif cam_CFAPattern == 0x00010102 
     114    BE(3),              // BayerPhase = 3 (top left pixel is blue) 
     115#endif 
     116 
     117    BE(4),              // FixBadPixelsConstant = 4 
     118    BE(0x01030000),     // DNG version = 1.3.0.0 
     119    BE(1),              // Flags = 1 
     120    BE(8),              // Opcode length = 8 bytes 
     121    BE(3),              // Constant = 3 
     122#if   cam_CFAPattern == 0x02010100 
     123    BE(0),              // BayerPhase = 0 (top left pixel is red) 
     124#elif cam_CFAPattern == 0x01020001 
     125    BE(1),              // BayerPhase = 1 (top left pixel is green in a green/red row) 
     126#elif cam_CFAPattern == 0x01000201 
     127    BE(2),              // BayerPhase = 2 (top left pixel is green in a green/blue row) 
     128#elif cam_CFAPattern == 0x00010102 
     129    BE(3),              // BayerPhase = 3 (top left pixel is blue) 
     130#endif 
     131}; 
    63132 
    64133// warning: according to TIFF format specification, elements must be sorted by tag value in ascending order! 
     
    87156 {0x8825, T_LONG,       1,  0},                                 //GPS_IFD offset 
    88157 {0x9216, T_BYTE,       4,  0x00000001},                        // TIFF/EPStandardID: 1.0.0.0 
    89  {0xC612, T_BYTE,       4,  0x00000101},                        //DNGVersion: 1.1.0.0 
     158 {0xC612, T_BYTE,       4,  0x00000301},                        //DNGVersion: 1.3.0.0 
    90159 {0xC614, T_ASCII,      32, (int)cam_name},                     //UniqueCameraModel. Filled at header generation. 
    91160 {0xC621, T_SRATIONAL,  9,  (int)&camera_sensor.color_matrix1}, 
     
    124193 {0xC620, T_LONG,       2,  (int)&camera_sensor.crop.size}, 
    125194 {0xC68D, T_LONG,       4,  (int)&camera_sensor.dng_active_area}, 
     195 {0xC740, T_UNDEFINED|T_PTR, sizeof(badpixel_opcode),  (int)&badpixel_opcode}, 
    126196 {0, T_END} 
    127197}; 
     
    533603// removal from images. 
    534604 
    535 #define INIT_BADPIXEL_COUNT -1 
    536 #define INIT_BADPIXEL_FILE -2 
    537  
    538 #define PATH_BADPIXEL_BIN "A/CHDK/badpixel.bin" 
    539 #define PATH_BAD_TMP_BIN "A/CHDK/bad_tmp.bin" 
    540  
    541 int init_badpixel_bin_flag; // contants above to count/create file, > 0 num bad pixel 
    542  
     605//#define INIT_BADPIXEL_COUNT -1 
     606//#define INIT_BADPIXEL_FILE -2 
     607// 
     608//#define PATH_BADPIXEL_BIN "A/CHDK/badpixel.bin" 
     609//#define PATH_BAD_TMP_BIN "A/CHDK/bad_tmp.bin" 
     610// 
     611//int init_badpixel_bin_flag; // contants above to count/create file, > 0 num bad pixel 
     612// 
    543613int raw_init_badpixel_bin() { 
    544     int count; 
    545     unsigned short c[2]; 
    546     FILE*f; 
    547     if(init_badpixel_bin_flag == INIT_BADPIXEL_FILE) { 
    548         f=fopen(PATH_BAD_TMP_BIN,"w+b"); 
    549     } else if (init_badpixel_bin_flag == INIT_BADPIXEL_COUNT) { 
    550         f=NULL; 
    551     } else { 
    552         return 0; 
    553     } 
    554     count = 0; 
    555     for (c[0]=camera_sensor.active_area.x1; c[0]<camera_sensor.active_area.x2; c[0]++) 
    556     { 
    557         for (c[1]=camera_sensor.active_area.y1; c[1]<camera_sensor.active_area.y2; c[1]++) 
    558         { 
    559             if (get_raw_pixel(c[0],c[1]) <= DNG_BADPIXEL_VALUE_LIMIT) 
    560             { 
    561                 unsigned short l; 
    562                 for (l=0; l<7 && (c[1]+l+1)<camera_sensor.active_area.y2; l++) 
    563                     if (get_raw_pixel(c[0],c[1]+l+1) > DNG_BADPIXEL_VALUE_LIMIT) 
    564                         break; 
    565                 c[1] = c[1] | (l << 13); 
    566                 if (f) fwrite(c, 1, 4, f); 
    567                 c[1] = (c[1] & 0x1FFF) + l; 
    568                 count = count + l + 1; 
    569             } 
    570         } 
    571     } 
    572     if (f) fclose(f); 
    573     init_badpixel_bin_flag = count; 
    574     state_shooting_progress = SHOOTING_PROGRESS_PROCESSING; 
     614//    int count; 
     615//    unsigned short c[2]; 
     616//    FILE*f; 
     617//    if(init_badpixel_bin_flag == INIT_BADPIXEL_FILE) { 
     618//        f=fopen(PATH_BAD_TMP_BIN,"w+b"); 
     619//    } else if (init_badpixel_bin_flag == INIT_BADPIXEL_COUNT) { 
     620//        f=NULL; 
     621//    } else { 
     622//        return 0; 
     623//    } 
     624//    count = 0; 
     625//    for (c[0]=camera_sensor.active_area.x1; c[0]<camera_sensor.active_area.x2; c[0]++) 
     626//    { 
     627//        for (c[1]=camera_sensor.active_area.y1; c[1]<camera_sensor.active_area.y2; c[1]++) 
     628//        { 
     629//            if (get_raw_pixel(c[0],c[1]) <= DNG_BADPIXEL_VALUE_LIMIT) 
     630//            { 
     631//                unsigned short l; 
     632//                for (l=0; l<7 && (c[1]+l+1)<camera_sensor.active_area.y2; l++) 
     633//                    if (get_raw_pixel(c[0],c[1]+l+1) > DNG_BADPIXEL_VALUE_LIMIT) 
     634//                        break; 
     635//                c[1] = c[1] | (l << 13); 
     636//                if (f) fwrite(c, 1, 4, f); 
     637//                c[1] = (c[1] & 0x1FFF) + l; 
     638//                count = count + l + 1; 
     639//            } 
     640//        } 
     641//    } 
     642//    if (f) fclose(f); 
     643//    init_badpixel_bin_flag = count; 
     644//    state_shooting_progress = SHOOTING_PROGRESS_PROCESSING; 
    575645    return 1; 
    576646} 
    577647 
    578 short* binary_list=NULL; 
    579 int binary_count=-1; 
     648//short* binary_list=NULL; 
     649//int binary_count=-1; 
    580650 
    581651void load_bad_pixels_list_b(char* filename) { 
    582     struct STD_stat st; 
    583     long filesize; 
    584     void* ptr; 
    585     FILE *fd; 
    586  
    587         if ( filename==0 ) 
    588         { unload_bad_pixels_list_b(); return; } 
    589  
    590     binary_count=-1; 
    591     if (safe_stat(filename,&st)!=0) return; 
    592     filesize=st.st_size; 
    593     if (filesize%(2*sizeof(short)) != 0) return; 
    594         if (filesize == 0) { binary_count = 0; return; }        // Allow empty badpixel.bin file 
    595     ptr=malloc(filesize); 
    596     if (!ptr) return; 
    597     fd=fopen(filename, "rb"); 
    598     if (fd) { 
    599         fread(ptr,1, filesize,fd); 
    600         fclose(fd); 
    601         binary_list=ptr; 
    602         binary_count=filesize/(2*sizeof(short)); 
    603     } 
    604     else free(ptr); 
     652 //   struct STD_stat st; 
     653 //   long filesize; 
     654 //   void* ptr; 
     655 //   FILE *fd; 
     656 
     657        //if ( filename==0 ) 
     658        // { unload_bad_pixels_list_b(); return; } 
     659 
     660 //   binary_count=-1; 
     661 //   if (safe_stat(filename,&st)!=0) return; 
     662 //   filesize=st.st_size; 
     663 //   if (filesize%(2*sizeof(short)) != 0) return; 
     664        //if (filesize == 0) { binary_count = 0; return; }      // Allow empty badpixel.bin file 
     665 //   ptr=malloc(filesize); 
     666 //   if (!ptr) return; 
     667 //   fd=fopen(filename, "rb"); 
     668 //   if (fd) { 
     669 //       fread(ptr,1, filesize,fd); 
     670 //       fclose(fd); 
     671 //       binary_list=ptr; 
     672 //       binary_count=filesize/(2*sizeof(short)); 
     673 //   } 
     674 //   else free(ptr); 
    605675} 
    606676 
    607677void unload_bad_pixels_list_b(void) { 
    608     if (binary_list) free(binary_list); 
    609     binary_list=NULL; 
    610     binary_count=-1; 
     678    //if (binary_list) free(binary_list); 
     679    //binary_list=NULL; 
     680    //binary_count=-1; 
    611681} 
    612682 
    613683void patch_bad_pixels_b(void) { 
    614     int i; 
    615     short* ptr=binary_list; 
    616     short y, cnt; 
    617     for (i=0; i<binary_count; i++, ptr+=2) 
    618     { 
    619         y = ptr[1] & 0x1FFF; 
    620         cnt = (ptr[1] >> 13) & 7; 
    621         for (; cnt>=0; cnt--, y++) 
    622             if (get_raw_pixel(ptr[0], y) <= DNG_BADPIXEL_VALUE_LIMIT) 
    623                 patch_bad_pixel(ptr[0], y); 
    624     } 
     684    //int i; 
     685    //short* ptr=binary_list; 
     686    //short y, cnt; 
     687    //for (i=0; i<binary_count; i++, ptr+=2) 
     688    //{ 
     689    //    y = ptr[1] & 0x1FFF; 
     690    //    cnt = (ptr[1] >> 13) & 7; 
     691    //    for (; cnt>=0; cnt--, y++) 
     692    //        if (get_raw_pixel(ptr[0], y) <= DNG_BADPIXEL_VALUE_LIMIT) 
     693    //            patch_bad_pixel(ptr[0], y); 
     694    //} 
    625695} 
    626696 
    627697int badpixel_list_loaded_b(void) { 
    628         return (binary_count >= 0) ? 1 : 0; 
     698//      return (binary_count >= 0) ? 1 : 0; 
     699    return 1; 
    629700} 
    630701 
    631702// ----------------------------------------------- 
    632703 
    633 enum BadpixelFSM { 
    634     BADPIX_START, 
    635     BADPIX_S1, 
    636     BADPIX_S2 
    637 }; 
    638  
    639 int badpixel_task_stack(long p) { 
    640     static unsigned int badpix_cnt1; 
    641  
    642     switch(p) { 
    643         case BADPIX_START: 
    644             action_pop(); 
    645  
    646             console_clear(); 
    647             console_add_line("Wait please... "); 
    648             console_add_line("This takes a few seconds,"); 
    649             console_add_line("don't panic!"); 
    650  
    651             init_badpixel_bin_flag = INIT_BADPIXEL_COUNT; 
    652  
    653             shooting_set_tv96_direct(96, SET_LATER); 
    654             action_push(BADPIX_S1); 
    655             action_push(AS_SHOOT); 
    656             action_push_delay(3000); 
    657             break; 
    658         case BADPIX_S1: 
    659             action_pop(); 
    660  
    661             badpix_cnt1 = init_badpixel_bin_flag; 
    662             init_badpixel_bin_flag = INIT_BADPIXEL_FILE; 
    663             shooting_set_tv96_direct(96, SET_LATER); 
    664  
    665             action_push(BADPIX_S2); 
    666             action_push(AS_SHOOT); 
    667             break; 
    668         case BADPIX_S2: 
    669             action_pop(); 
    670  
    671             console_clear(); 
    672             if (badpix_cnt1 == init_badpixel_bin_flag) { 
    673                 // TODO script asked confirmation first 
    674                 // should sanity check bad pixel count at least, 
    675                 // wrong buffer address could make badpixel bigger than available mem 
    676                 char msg[32]; 
    677                 console_add_line("badpixel.bin created."); 
    678                 sprintf(msg, "Bad pixel count: %d", badpix_cnt1); 
    679                 console_add_line(msg); 
    680                 remove(PATH_BADPIXEL_BIN); 
    681                 rename(PATH_BAD_TMP_BIN,PATH_BADPIXEL_BIN); 
    682             } else { 
    683                 console_add_line("badpixel.bin failed."); 
    684                 console_add_line("Please try again."); 
    685             } 
    686             init_badpixel_bin_flag = 0; 
    687             remove(PATH_BAD_TMP_BIN); 
    688  
    689             action_push_delay(3000); 
    690             break; 
    691         default: 
    692             action_stack_standard(p); 
    693             break; 
    694     } 
    695  
    696     return 1; 
    697 } 
     704//enum BadpixelFSM { 
     705//    BADPIX_START, 
     706//    BADPIX_S1, 
     707//    BADPIX_S2 
     708//}; 
     709// 
     710//int badpixel_task_stack(long p) { 
     711//    static unsigned int badpix_cnt1; 
     712// 
     713//    switch(p) { 
     714//        case BADPIX_START: 
     715//            action_pop(); 
     716// 
     717//            console_clear(); 
     718//            console_add_line("Wait please... "); 
     719//            console_add_line("This takes a few seconds,"); 
     720//            console_add_line("don't panic!"); 
     721// 
     722//            init_badpixel_bin_flag = INIT_BADPIXEL_COUNT; 
     723// 
     724//            shooting_set_tv96_direct(96, SET_LATER); 
     725//            action_push(BADPIX_S1); 
     726//            action_push(AS_SHOOT); 
     727//            action_push_delay(3000); 
     728//            break; 
     729//        case BADPIX_S1: 
     730//            action_pop(); 
     731// 
     732//            badpix_cnt1 = init_badpixel_bin_flag; 
     733//            init_badpixel_bin_flag = INIT_BADPIXEL_FILE; 
     734//            shooting_set_tv96_direct(96, SET_LATER); 
     735// 
     736//            action_push(BADPIX_S2); 
     737//            action_push(AS_SHOOT); 
     738//            break; 
     739//        case BADPIX_S2: 
     740//            action_pop(); 
     741// 
     742//            console_clear(); 
     743//            if (badpix_cnt1 == init_badpixel_bin_flag) { 
     744//                // TODO script asked confirmation first 
     745//                // should sanity check bad pixel count at least, 
     746//                // wrong buffer address could make badpixel bigger than available mem 
     747//                char msg[32]; 
     748//                console_add_line("badpixel.bin created."); 
     749//                sprintf(msg, "Bad pixel count: %d", badpix_cnt1); 
     750//                console_add_line(msg); 
     751//                remove(PATH_BADPIXEL_BIN); 
     752//                rename(PATH_BAD_TMP_BIN,PATH_BADPIXEL_BIN); 
     753//            } else { 
     754//                console_add_line("badpixel.bin failed."); 
     755//                console_add_line("Please try again."); 
     756//            } 
     757//            init_badpixel_bin_flag = 0; 
     758//            remove(PATH_BAD_TMP_BIN); 
     759// 
     760//            action_push_delay(3000); 
     761//            break; 
     762//        default: 
     763//            action_stack_standard(p); 
     764//            break; 
     765//    } 
     766// 
     767//    return 1; 
     768//} 
    698769 
    699770 
    700771void create_badpixel_bin() { 
    701     if (!(mode_get() & MODE_REC)) { 
    702         gui_mbox_init(LANG_ERROR, LANG_MSG_RECMODE_REQUIRED, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
    703         return; 
    704     } 
    705  
    706     gui_set_mode(&altGuiHandler); 
    707     action_stack_create(&badpixel_task_stack, BADPIX_START); 
     772    //if (!(mode_get() & MODE_REC)) { 
     773    //    gui_mbox_init(LANG_ERROR, LANG_MSG_RECMODE_REQUIRED, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
     774    //    return; 
     775    //} 
     776 
     777    //gui_set_mode(&altGuiHandler); 
     778    //action_stack_create(&badpixel_task_stack, BADPIX_START); 
    708779} 
    709780 
     
    718789    { 
    719790        fill_gamma_buf(); 
    720         patch_bad_pixels_b(); 
     791        //patch_bad_pixels_b(); 
    721792        create_thumbnail(); 
    722793        write(fd, dng_header_buf, dng_header_buf_size); 
  • trunk/core/gui.c

    r1792 r1796  
    237237#if DNG_SUPPORT 
    238238    static void cb_change_dng();  
    239     void gui_menuproc_badpixel_create(int arg); 
     239    //void gui_menuproc_badpixel_create(int arg); 
    240240#endif 
    241241#if defined (DNG_EXT_FROM) 
     
    879879    MENU_ITEM(0x5c,LANG_MENU_DNG_FORMAT,              MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_raw , (int)cb_change_dng ), 
    880880    MENU_ITEM(0x5c,LANG_MENU_RAW_DNG_EXT,             MENUITEM_BOOL,      &conf.raw_dng_ext, 0 ), 
    881     MENU_ITEM(0x2a,LANG_MENU_BADPIXEL_CREATE,         MENUITEM_PROC,      gui_menuproc_badpixel_create, 0 ), 
     881    //MENU_ITEM(0x2a,LANG_MENU_BADPIXEL_CREATE,         MENUITEM_PROC,      gui_menuproc_badpixel_create, 0 ), 
    882882#endif 
    883883    MENU_ITEM   (0x5c,LANG_MENU_RAW_CACHED,                 MENUITEM_BOOL,      &conf.raw_cache,            0 ), 
     
    10391039     int old=conf.dng_raw; 
    10401040     conf_change_dng(); 
    1041      if ((old==1) && (conf.dng_raw==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
     1041     //if ((old==1) && (conf.dng_raw==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
    10421042} 
    10431043     
    1044 void gui_menuproc_badpixel_create(int arg) { 
    1045         // After this action module will not be unloaded until reboot  
    1046         // because not clear when it finished 
    1047         if ( module_dng_load(LIBDNG_OWNED_BY_CREATEBADPIXEL) ) 
    1048         libdng->create_badpixel_bin(); 
    1049 } 
     1044//void gui_menuproc_badpixel_create(int arg) { 
     1045//      // After this action module will not be unloaded until reboot  
     1046//      // because not clear when it finished 
     1047//      if ( module_dng_load(LIBDNG_OWNED_BY_CREATEBADPIXEL) ) 
     1048//      libdng->create_badpixel_bin(); 
     1049//} 
    10501050#endif 
    10511051 
  • trunk/core/raw.c

    r1701 r1796  
    6161    char* altrawadr = get_alt_raw_image_addr(); 
    6262 
    63 #if DNG_SUPPORT 
    64     // count/save badpixels if requested 
    65     if( libdng && 
    66                 libdng->raw_init_badpixel_bin &&  
    67                 libdng->raw_init_badpixel_bin()) { 
    68         return 0; 
    69     } 
    70 #endif     
     63//#if DNG_SUPPORT 
     64//    // count/save badpixels if requested 
     65//    if( libdng && 
     66//              libdng->raw_init_badpixel_bin &&  
     67//              libdng->raw_init_badpixel_bin()) { 
     68//        return 0; 
     69//    } 
     70//#endif     
    7171 
    7272    if (develop_raw) { 
Note: See TracChangeset for help on using the changeset viewer.