Changeset 1799 for trunk


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

Update for DNG 1.3 additions:

  • restored the previous badpixel.bin generation and mapping
  • added an option to enable CHDK map out bad pixels using badpixel.bin (default is off)

See http://chdk.setepontos.com/index.php?topic=7951.0 for discussion on the changes

Location:
trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/CHDK/LANG/english.lng

    r1797 r1799  
    436436335 "Mute during zooming" 
    437437 
    438 336 "Bad pixel removal" 
     438336 "Manual bad pixel removal" 
    439439337 "Off" 
    440440338 "Averag." 
     
    674674 
    675675552 "Disable Zoom Assist button" 
     676 
     677553 "DNG 1.0 bad pixel removal" 
  • trunk/core/conf.c

    r1797 r1799  
    375375    //CONF_INFO(224, conf.edge_overlay_zoom,          CONF_DEF_VALUE, i:1, NULL),               // moved to edge overlay module 
    376376    CONF_INFO(225, conf.raw_cache,                  CONF_DEF_VALUE, i:0, NULL), 
    377     CONF_INFO(226, conf.dng_raw,                    CONF_DEF_VALUE, i:0, conf_change_dng), 
     377    CONF_INFO(226, conf.dng_raw,                    CONF_DEF_VALUE, i:1, conf_change_dng), 
    378378    CONF_INFO(227, conf.flash_sync_curtain,         CONF_DEF_VALUE, i:0, NULL), 
    379379    CONF_INFO(228, conf.raw_timer,                  CONF_DEF_VALUE, i:0, NULL), 
     
    383383    CONF_INFO(232, conf.flash_video_override,       CONF_DEF_VALUE, i:0, NULL), 
    384384    CONF_INFO(233, conf.flash_video_override_power, CONF_DEF_VALUE, i:0, NULL), 
    385     CONF_INFO(234, conf.raw_dng_ext,                CONF_DEF_VALUE, i:0, NULL), 
     385    CONF_INFO(234, conf.raw_dng_ext,                CONF_DEF_VALUE, i:1, NULL), 
    386386    CONF_INFO(235, conf.dng_usb_ext,                CONF_DEF_VALUE, i:0, conf_change_dng_ext), 
    387387    CONF_INFO(236, conf.flash_manual_override,      CONF_DEF_VALUE, i:0, NULL), 
     
    458458    CONF_INFO(288, conf.zoom_assist_button_disable, CONF_DEF_VALUE,     i:0, NULL), 
    459459#endif 
     460 
     461    CONF_INFO(289, conf.dng_badpix_removal,         CONF_DEF_VALUE,     i:0, conf_change_dng), 
    460462    }; 
    461463#define CONF_NUM (sizeof(conf_info)/sizeof(conf_info[0])) 
     
    476478    case 194: conf_change_script_file(); break; 
    477479    case 2: 
    478     case 226: conf_change_dng(); break; 
     480    case 226:  
     481    case 289: conf_change_dng(); break; 
    479482    case 235: conf_change_dng_ext(); break; 
    480483    case 284: conf_change_autoiso(); break; 
     
    518521void conf_change_dng(void){ 
    519522#if DNG_SUPPORT 
    520  if (conf.save_raw && conf.dng_raw) { 
     523 if (conf.save_raw && conf.dng_raw && conf.dng_badpix_removal) { 
    521524        if ( !module_dng_load(LIBDNG_OWNED_BY_RAW) ) 
    522                 return; 
    523     //if (!libdng->badpixel_list_loaded_b()) libdng->load_bad_pixels_list_b("A/CHDK/badpixel.bin"); 
    524     //if (!libdng->badpixel_list_loaded_b()) conf.dng_raw=0; 
     525        return; 
     526    if (!libdng->badpixel_list_loaded_b()) libdng->load_bad_pixels_list_b("A/CHDK/badpixel.bin"); 
     527    if (!libdng->badpixel_list_loaded_b()) conf.dng_badpix_removal=0; 
    525528 } 
    526529 else if ( libdng && libdng->load_bad_pixels_list_b ) { 
    527     //libdng->load_bad_pixels_list_b(0);        //unload badpixel.bin 
     530    libdng->load_bad_pixels_list_b(0);        //unload badpixel.bin 
    528531        module_dng_unload(LIBDNG_OWNED_BY_RAW); 
    529532 } 
  • trunk/core/dng.c

    r1796 r1799  
    4949const int cam_Resolution[]              = {180,1}; 
    5050int cam_AsShotNeutral[]                 = {1000,1000,1000,1000,1000,1000}; 
     51static char cam_datetime[20]    = "";                   // DateTimeOriginal 
    5152 
    5253struct t_data_for_exif{ 
     
    150151 {0x11C,  T_SHORT,      1,  1},                                 // PlanarConfiguration: 1 
    151152 {0x131,  T_ASCII,      sizeof(cam_chdk_ver), (int)cam_chdk_ver},//Software 
    152  {0x132,  T_ASCII,      20, 0},                                 // DateTime 
     153 {0x132,  T_ASCII,      20, (int)cam_datetime},                 // DateTime 
    153154 {0x14A,  T_LONG,       1,  0},                                 //SubIFDs offset 
    154155 {0x8298, T_ASCII,      1,  0},                                 // Copyright 
     
    200201static int cam_shutter[2]       = { 0, 1000000 };       // Shutter speed 
    201202static int cam_aperture[2]      = { 0, 10 };            // Aperture 
    202 static char cam_datetime[20]    = "";                   // DateTimeOriginal 
    203203static int cam_apex_shutter[2]  = { 0, 96 };            // Shutter speed in APEX units 
    204204static int cam_apex_aperture[2] = { 0, 96 };            // Aperture in APEX units 
     
    229229struct dir_entry GPS_IFD[]={ 
    230230  {0x0000, T_BYTE,              4,  0x00000302},                    //GPSVersionID: 2 3 0 0 
    231   {0x0001, T_ASCII,             2,  (int)gps_data.latitudeRef},     //North or South Latitude "N\0" or "S\0" 
     231  {0x0001, T_ASCII|T_PTR,       2,  (int)gps_data.latitudeRef},     //North or South Latitude "N\0" or "S\0" 
    232232  {0x0002, T_RATIONAL,          3,  (int)gps_data.latitude},        //Latitude 
    233   {0x0003, T_ASCII,             2,  (int)gps_data.longitudeRef},    //East or West Latitude "E\0" or "W\0" 
     233  {0x0003, T_ASCII|T_PTR,       2,  (int)gps_data.longitudeRef},    //East or West Latitude "E\0" or "W\0" 
    234234  {0x0004, T_RATIONAL,          3,  (int)gps_data.longitude},       //Longitude 
    235   {0x0005, T_BYTE,              1,  (int)gps_data.heightRef},       //AltitudeRef 
     235  {0x0005, T_BYTE|T_PTR,        1,  (int)&gps_data.heightRef},      //AltitudeRef 
    236236  {0x0006, T_RATIONAL,          1,  (int)gps_data.height},          //Altitude 
    237237  {0x0007, T_RATIONAL,          3,  (int)gps_data.timeStamp},       //TimeStamp 
    238   {0x0009, T_ASCII,             2,  (int)gps_data.status},          //Status 
     238  {0x0009, T_ASCII|T_PTR,       2,  (int)gps_data.status},          //Status 
    239239//{0x000A, T_ASCII,             1,  0},                             //MeasureMode 
    240240  {0x0012, T_ASCII,             7,  (int)gps_data.mapDatum},        //MapDatum 7 + 1 pad byte 
     
    295295     case 0x110 :                                                                                       // CameraName 
    296296     case 0xC614: IFD_LIST[j].entry[i].count = strlen((char*)IFD_LIST[j].entry[i].offset) + 1; break;   // UniqueCameraModel 
    297      case 0x132 : 
    298297     case 0x8822: IFD_LIST[j].entry[i].offset=get_exp_program_for_exif(exif_data.exp_program); break;//ExposureProgram 
    299298     case 0x0112: IFD_LIST[j].entry[i].offset=get_orientation_for_exif(exif_data.orientation); break; //Orientation 
     
    603602// removal from images. 
    604603 
    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 // 
     604#define INIT_BADPIXEL_COUNT -1 
     605#define INIT_BADPIXEL_FILE -2 
     606 
     607#define PATH_BADPIXEL_BIN "A/CHDK/badpixel.bin" 
     608#define PATH_BAD_TMP_BIN "A/CHDK/bad_tmp.bin" 
     609 
     610int init_badpixel_bin_flag; // contants above to count/create file, > 0 num bad pixel 
     611 
    613612int raw_init_badpixel_bin() { 
    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; 
     613    int count; 
     614    unsigned short c[2]; 
     615    FILE*f; 
     616    if(init_badpixel_bin_flag == INIT_BADPIXEL_FILE) { 
     617        f=fopen(PATH_BAD_TMP_BIN,"w+b"); 
     618    } else if (init_badpixel_bin_flag == INIT_BADPIXEL_COUNT) { 
     619        f=NULL; 
     620    } else { 
     621        return 0; 
     622    } 
     623    count = 0; 
     624    for (c[0]=camera_sensor.active_area.x1; c[0]<camera_sensor.active_area.x2; c[0]++) 
     625    { 
     626        for (c[1]=camera_sensor.active_area.y1; c[1]<camera_sensor.active_area.y2; c[1]++) 
     627        { 
     628            if (get_raw_pixel(c[0],c[1]) <= DNG_BADPIXEL_VALUE_LIMIT) 
     629            { 
     630                unsigned short l; 
     631                for (l=0; l<7 && (c[1]+l+1)<camera_sensor.active_area.y2; l++) 
     632                    if (get_raw_pixel(c[0],c[1]+l+1) > DNG_BADPIXEL_VALUE_LIMIT) 
     633                        break; 
     634                c[1] = c[1] | (l << 13); 
     635                if (f) fwrite(c, 1, 4, f); 
     636                c[1] = (c[1] & 0x1FFF) + l; 
     637                count = count + l + 1; 
     638            } 
     639        } 
     640    } 
     641    if (f) fclose(f); 
     642    init_badpixel_bin_flag = count; 
     643    state_shooting_progress = SHOOTING_PROGRESS_PROCESSING; 
    645644    return 1; 
    646645} 
    647646 
    648 //short* binary_list=NULL; 
    649 //int binary_count=-1; 
     647short* binary_list=NULL; 
     648int binary_count=-1; 
    650649 
    651650void load_bad_pixels_list_b(char* filename) { 
    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); 
     651    struct STD_stat st; 
     652    long filesize; 
     653    void* ptr; 
     654    FILE *fd; 
     655 
     656        if ( filename==0 ) 
     657        { unload_bad_pixels_list_b(); return; } 
     658 
     659    binary_count=-1; 
     660    if (safe_stat(filename,&st)!=0) return; 
     661    filesize=st.st_size; 
     662    if (filesize%(2*sizeof(short)) != 0) return; 
     663        if (filesize == 0) { binary_count = 0; return; }        // Allow empty badpixel.bin file 
     664    ptr=malloc(filesize); 
     665    if (!ptr) return; 
     666    fd=fopen(filename, "rb"); 
     667    if (fd) { 
     668        fread(ptr,1, filesize,fd); 
     669        fclose(fd); 
     670        binary_list=ptr; 
     671        binary_count=filesize/(2*sizeof(short)); 
     672    } 
     673    else free(ptr); 
    675674} 
    676675 
    677676void unload_bad_pixels_list_b(void) { 
    678     //if (binary_list) free(binary_list); 
    679     //binary_list=NULL; 
    680     //binary_count=-1; 
     677    if (binary_list) free(binary_list); 
     678    binary_list=NULL; 
     679    binary_count=-1; 
    681680} 
    682681 
    683682void patch_bad_pixels_b(void) { 
    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     //} 
     683    int i; 
     684    short* ptr=binary_list; 
     685    short y, cnt; 
     686    for (i=0; i<binary_count; i++, ptr+=2) 
     687    { 
     688        y = ptr[1] & 0x1FFF; 
     689        cnt = (ptr[1] >> 13) & 7; 
     690        for (; cnt>=0; cnt--, y++) 
     691            if (get_raw_pixel(ptr[0], y) <= DNG_BADPIXEL_VALUE_LIMIT) 
     692                patch_bad_pixel(ptr[0], y); 
     693    } 
    695694} 
    696695 
    697696int badpixel_list_loaded_b(void) { 
    698 //      return (binary_count >= 0) ? 1 : 0; 
     697        return (binary_count >= 0) ? 1 : 0; 
     698} 
     699 
     700// ----------------------------------------------- 
     701 
     702enum BadpixelFSM { 
     703    BADPIX_START, 
     704    BADPIX_S1, 
     705    BADPIX_S2 
     706}; 
     707 
     708int badpixel_task_stack(long p) { 
     709    static unsigned int badpix_cnt1; 
     710 
     711    switch(p) { 
     712        case BADPIX_START: 
     713            action_pop(); 
     714 
     715            console_clear(); 
     716            console_add_line("Wait please... "); 
     717            console_add_line("This takes a few seconds,"); 
     718            console_add_line("don't panic!"); 
     719 
     720            init_badpixel_bin_flag = INIT_BADPIXEL_COUNT; 
     721 
     722            shooting_set_tv96_direct(96, SET_LATER); 
     723            action_push(BADPIX_S1); 
     724            action_push(AS_SHOOT); 
     725            action_push_delay(3000); 
     726            break; 
     727        case BADPIX_S1: 
     728            action_pop(); 
     729 
     730            badpix_cnt1 = init_badpixel_bin_flag; 
     731            init_badpixel_bin_flag = INIT_BADPIXEL_FILE; 
     732            shooting_set_tv96_direct(96, SET_LATER); 
     733 
     734            action_push(BADPIX_S2); 
     735            action_push(AS_SHOOT); 
     736            break; 
     737        case BADPIX_S2: 
     738            action_pop(); 
     739 
     740            console_clear(); 
     741            if (badpix_cnt1 == init_badpixel_bin_flag) { 
     742                // TODO script asked confirmation first 
     743                // should sanity check bad pixel count at least, 
     744                // wrong buffer address could make badpixel bigger than available mem 
     745                char msg[32]; 
     746                console_add_line("badpixel.bin created."); 
     747                sprintf(msg, "Bad pixel count: %d", badpix_cnt1); 
     748                console_add_line(msg); 
     749                remove(PATH_BADPIXEL_BIN); 
     750                rename(PATH_BAD_TMP_BIN,PATH_BADPIXEL_BIN); 
     751            } else { 
     752                console_add_line("badpixel.bin failed."); 
     753                console_add_line("Please try again."); 
     754            } 
     755            init_badpixel_bin_flag = 0; 
     756            remove(PATH_BAD_TMP_BIN); 
     757 
     758            action_push_delay(3000); 
     759            break; 
     760        default: 
     761            action_stack_standard(p); 
     762            break; 
     763    } 
     764 
    699765    return 1; 
    700766} 
    701767 
    702 // ----------------------------------------------- 
    703  
    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 //} 
    769  
    770768 
    771769void create_badpixel_bin() { 
    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); 
     770    if (!(mode_get() & MODE_REC)) { 
     771        gui_mbox_init(LANG_ERROR, LANG_MSG_RECMODE_REQUIRED, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
     772        return; 
     773    } 
     774 
     775    gui_set_mode(&altGuiHandler); 
     776    action_stack_create(&badpixel_task_stack, BADPIX_START); 
    779777} 
    780778 
     
    789787    { 
    790788        fill_gamma_buf(); 
    791         //patch_bad_pixels_b(); 
     789        if (conf.dng_badpix_removal) 
     790            patch_bad_pixels_b(); 
    792791        create_thumbnail(); 
    793792        write(fd, dng_header_buf, dng_header_buf_size); 
     
    854853int _module_unloader() 
    855854{ 
    856  
    857855        unload_bad_pixels_list_b(); 
    858856    free_dng_header(); 
  • trunk/core/gui.c

    r1797 r1799  
    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) 
     
    863863static CMenuItem raw_submenu_items[] = { 
    864864#if DNG_SUPPORT 
    865     MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE,                MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.save_raw, (int)cb_change_dng ), 
     865    MENU_ITEM   (0x5c,LANG_MENU_RAW_SAVE,                   MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.save_raw, (int)cb_change_dng ), 
    866866#else 
    867     MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE,                MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.save_raw, 0 ), 
    868 #endif 
    869     MENU_ITEM(0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS,         MENUITEM_SUBMENU,   &raw_exceptions_submenu, 0 ), 
    870     MENU_ENUM2(0x5f,LANG_MENU_RAW_NOISE_REDUCTION,    &conf.raw_nr, gui_raw_nr_modes ), 
    871     MENU_ITEM(0x5c,LANG_MENU_RAW_FIRST_ONLY,          MENUITEM_BOOL,      &conf.raw_save_first_only, 0 ), 
    872     MENU_ITEM(0x5c,LANG_MENU_RAW_SAVE_IN_DIR,         MENUITEM_BOOL,      &conf.raw_in_dir, 0 ), 
    873     MENU_ENUM2a(0x5f,LANG_MENU_RAW_PREFIX,            &conf.raw_prefix, img_prefixes, NUM_IMG_PREFIXES ), 
    874     MENU_ENUM2a(0x5f,LANG_MENU_RAW_EXTENSION,         &conf.raw_ext, img_exts, NUM_IMG_EXTS ), 
    875     MENU_ENUM2a(0x5f,LANG_MENU_SUB_PREFIX,            &conf.sub_batch_prefix, img_prefixes, NUM_IMG_PREFIXES ), 
    876     MENU_ENUM2a(0x5f,LANG_MENU_SUB_EXTENSION,         &conf.sub_batch_ext, img_exts, NUM_IMG_EXTS ), 
    877 //  MENU_ITEM(0x60,LANG_MENU_SUB_IN_DARK_VALUE,       MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_in_dark_value, MENU_MINMAX(0, 1023) ), 
    878 //  MENU_ITEM(0x60,LANG_MENU_SUB_OUT_DARK_VALUE,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_out_dark_value, MENU_MINMAX(0, 1023) ), 
    879     MENU_ITEM(0x2a,LANG_MENU_RAW_DEVELOP,             MENUITEM_PROC,      gui_raw_develop, 0 ), 
    880     MENU_ITEM(0x5c,LANG_MENU_BAD_PIXEL_REMOVAL,       MENUITEM_ENUM,      gui_bad_pixel_enum, 0 ), 
     867    MENU_ITEM   (0x5c,LANG_MENU_RAW_SAVE,                   MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.save_raw, 0 ), 
     868#endif 
     869    MENU_ITEM   (0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS,      MENUITEM_SUBMENU,   &raw_exceptions_submenu, 0 ), 
     870    MENU_ENUM2  (0x5f,LANG_MENU_RAW_NOISE_REDUCTION,        &conf.raw_nr, gui_raw_nr_modes ), 
     871    MENU_ITEM   (0x5c,LANG_MENU_RAW_FIRST_ONLY,             MENUITEM_BOOL,      &conf.raw_save_first_only, 0 ), 
     872    MENU_ITEM   (0x5c,LANG_MENU_RAW_SAVE_IN_DIR,            MENUITEM_BOOL,      &conf.raw_in_dir, 0 ), 
     873    MENU_ENUM2a (0x5f,LANG_MENU_RAW_PREFIX,                 &conf.raw_prefix, img_prefixes, NUM_IMG_PREFIXES ), 
     874    MENU_ENUM2a (0x5f,LANG_MENU_RAW_EXTENSION,              &conf.raw_ext, img_exts, NUM_IMG_EXTS ), 
     875    MENU_ENUM2a (0x5f,LANG_MENU_SUB_PREFIX,                 &conf.sub_batch_prefix, img_prefixes, NUM_IMG_PREFIXES ), 
     876    MENU_ENUM2a (0x5f,LANG_MENU_SUB_EXTENSION,              &conf.sub_batch_ext, img_exts, NUM_IMG_EXTS ), 
     877//  MENU_ITEM   (0x60,LANG_MENU_SUB_IN_DARK_VALUE,          MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_in_dark_value, MENU_MINMAX(0, 1023) ), 
     878//  MENU_ITEM   (0x60,LANG_MENU_SUB_OUT_DARK_VALUE,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.sub_out_dark_value, MENU_MINMAX(0, 1023) ), 
     879    MENU_ITEM   (0x2a,LANG_MENU_RAW_DEVELOP,                MENUITEM_PROC,      gui_raw_develop, 0 ), 
     880    MENU_ITEM   (0x5c,LANG_MENU_BAD_PIXEL_REMOVAL,          MENUITEM_ENUM,      gui_bad_pixel_enum, 0 ), 
     881    MENU_ITEM   (0x5c,LANG_MENU_RAW_CACHED,                 MENUITEM_BOOL,      &conf.raw_cache,            0 ), 
    881882#if DNG_SUPPORT 
    882     MENU_ITEM(0x5c,LANG_MENU_DNG_FORMAT,              MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_raw , (int)cb_change_dng ), 
    883     MENU_ITEM(0x5c,LANG_MENU_RAW_DNG_EXT,             MENUITEM_BOOL,      &conf.raw_dng_ext, 0 ), 
    884     //MENU_ITEM(0x2a,LANG_MENU_BADPIXEL_CREATE,         MENUITEM_PROC,      gui_menuproc_badpixel_create, 0 ), 
    885 #endif 
    886     MENU_ITEM   (0x5c,LANG_MENU_RAW_CACHED,                 MENUITEM_BOOL,      &conf.raw_cache,            0 ), 
     883    MENU_ITEM   (0x0 ,(int)"DNG",                           MENUITEM_SEPARATOR, 0,                                                      0 ), 
     884    MENU_ITEM   (0x5c,LANG_MENU_DNG_FORMAT,                 MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_raw , (int)cb_change_dng ), 
     885    MENU_ITEM   (0x5c,LANG_MENU_RAW_DNG_EXT,                MENUITEM_BOOL,      &conf.raw_dng_ext, 0 ), 
     886    MENU_ITEM   (0x0 ,(int)"DNG 1.0",                       MENUITEM_SEPARATOR, 0,                                                      0 ), 
     887    MENU_ITEM   (0x5c,LANG_MENU_DNG_BADPIX_REMOVE,          MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_badpix_removal, (int)cb_change_dng ), 
     888    MENU_ITEM   (0x2a,LANG_MENU_BADPIXEL_CREATE,            MENUITEM_PROC,      gui_menuproc_badpixel_create, 0 ), 
     889#endif 
    887890    MENU_ITEM   (0x51,LANG_MENU_BACK,                       MENUITEM_UP,        0,                          0 ), 
    888891    {0} 
     
    10401043#if DNG_SUPPORT 
    10411044void cb_change_dng(){ 
    1042      int old=conf.dng_raw; 
     1045     int old=conf.dng_badpix_removal; 
    10431046     conf_change_dng(); 
    1044      //if ((old==1) && (conf.dng_raw==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
     1047     if ((old==1) && (conf.dng_badpix_removal==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL); 
    10451048} 
    10461049     
    1047 //void gui_menuproc_badpixel_create(int arg) { 
    1048 //      // After this action module will not be unloaded until reboot  
    1049 //      // because not clear when it finished 
    1050 //      if ( module_dng_load(LIBDNG_OWNED_BY_CREATEBADPIXEL) ) 
    1051 //      libdng->create_badpixel_bin(); 
    1052 //} 
     1050void gui_menuproc_badpixel_create(int arg) { 
     1051        // After this action module will not be unloaded until reboot  
     1052        // because not clear when it finished 
     1053        if ( module_dng_load(LIBDNG_OWNED_BY_CREATEBADPIXEL) ) 
     1054        libdng->create_badpixel_bin(); 
     1055} 
    10531056#endif 
    10541057 
  • trunk/core/gui_lang.h

    r1797 r1799  
    679679#define LANG_MENU_MISC_ZOOM_ASSIST              552 
    680680 
    681 #define GUI_LANG_ITEMS                          552 
     681#define LANG_MENU_DNG_BADPIX_REMOVE             553 
     682 
     683#define GUI_LANG_ITEMS                          553 
    682684 
    683685//------------------------------------------------------------------- 
  • trunk/core/raw.c

    r1796 r1799  
    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) { 
  • trunk/include/conf.h

    r1797 r1799  
    6060    int raw_cache; 
    6161    int dng_raw; 
     62    int dng_badpix_removal; // Force CHDK to do DNG bad pixel removal (requires creation of badpixel.bin) 
    6263    int raw_timer; 
    6364    int raw_dng_ext; 
Note: See TracChangeset for help on using the changeset viewer.