//------------------------------------------------------------------- void gui_osd_draw_ev_video(int is_osd_edit) { #if CAM_EV_IN_VIDEO if (!is_video_recording() && !is_osd_edit) return; int visible = get_ev_video_avail() || is_osd_edit; int x0=conf.ev_video_pos.x, y0=conf.ev_video_pos.y; int i, deltax; twoColors col = user_color(conf.osd_color); draw_rectangle(x0,y0,x0+70,y0+24, visible? MAKE_COLOR(BG_COLOR(col),BG_COLOR(col)): COLOR_TRANSPARENT, RECT_BORDER1|DRAW_FILLED); if (!visible) { return; } for (i=0;i<9;i++) draw_line(x0+2+i*8, y0+12, x0+2+i*8, y0+12-(i&1 ? 5 : 10), col); for (i=0;i<9;i++) draw_line(x0+2+i*8+1, y0+12, x0+2+i*8+1, y0+12-(i&1 ? 5 : 10), col); deltax=8*get_ev_video(); x0+=deltax; draw_line(x0+34,y0+16,x0+34,y0+22,col); draw_line(x0+35,y0+16,x0+35,y0+22,col); draw_line(x0+32,y0+19,x0+32,y0+22,col); draw_line(x0+33,y0+18,x0+33,y0+22,col); draw_line(x0+36,y0+18,x0+36,y0+22,col); draw_line(x0+37,y0+19,x0+37,y0+22,col); #endif }
void *vid_get_viewport_live_fb() { if (camera_info.state.mode_video || is_video_recording()) return viewport_buffers[0]; // Video only seems to use the first viewport buffer. // Hopefully return the most recently used viewport buffer so that motion detect, histogram, zebra and edge overly are using current image data return viewport_buffers[(active_viewport_buffer-1)&3]; }
int vid_get_viewport_display_yoffset() { if (camera_info.state.mode_play) { return 0; } else { if(camera_info.state.mode_video || is_video_recording()) { return 0; //all video modes } } return (vp_yo[shooting_get_prop(PROPCASE_ASPECT_RATIO)]); }
int vid_get_viewport_display_xoffset() { if (camera_info.state.mode_play) { return 0; } // video, ignore still res propcase if(camera_info.state.mode_video || is_video_recording()) { return 0; //all video modes for now } return vp_xo[shooting_get_prop(PROPCASE_ASPECT_RATIO)]; }
// only X offset appears to be required, for 1:1 // buffer and display int vid_get_viewport_xoffset() { if (camera_info.state.mode_play) { return 0; } if (camera_info.state.mode_video || is_video_recording()) { return 0; } if(shooting_get_prop(PROPCASE_ASPECT_RATIO) == 3) { // 1:1 appears to use X offset return 44; } return 0; }
int vid_get_viewport_display_xoffset() { if (camera_info.state.mode_play) { return 0; } // video, ignore still res propcase if(camera_info.state.mode_video || is_video_recording()) { if(shooting_get_prop(PROPCASE_VIDEO_RESOLUTION) == 2) { return 40;// 4:3 video } else { return 0; // 16:9 video, no x offset } } return vp_xo[shooting_get_prop(PROPCASE_ASPECT_RATIO)]; }
long vid_get_viewport_height() { int m = mode_get(); int aspect_ratio=shooting_get_prop(PROPCASE_ASPECT_RATIO); if (MODE_IS_VIDEO(m) || is_video_recording()) return 240; if ((m & MODE_MASK) != MODE_PLAY) { // 0 = 4:3, 1 = 16:9, 2 = 3:2, 3 = 1:1 if (aspect_ratio==1 || aspect_ratio==2) return 240; } extern int _GetVRAMVPixelsSize(); return ((m & MODE_MASK) == MODE_PLAY)?240:_GetVRAMVPixelsSize()>>1; }
void dump_memory() { int fd; static int cnt=1; static char fn[32]; // zero size means all RAM if (conf.memdmp_size == 0) conf.memdmp_size = (unsigned int)camera_info.maxramaddr + 1; // enforce RAM area if ((unsigned int)conf.memdmp_start > (unsigned int)camera_info.maxramaddr) conf.memdmp_start = 0; if ( (unsigned int)conf.memdmp_start + (unsigned int)conf.memdmp_size > ((unsigned int)camera_info.maxramaddr+1) ) conf.memdmp_size = (unsigned int)camera_info.maxramaddr + 1 - (unsigned int)conf.memdmp_start; started(); // try to avoid hanging the camera if ( !is_video_recording() ) { mkdir("A/DCIM"); mkdir("A/DCIM/100CANON"); fd = 0; do { sprintf(fn, "A/DCIM/100CANON/CRW_%04d.JPG", cnt++); if (stat(fn,0) != 0) { fd = open(fn, O_WRONLY|O_CREAT, 0777); break; } } while(cnt<9999); if (fd) { if ( conf.memdmp_start == 0 ) { long val0 = *((long*)(0|CAM_UNCACHED_BIT)); write(fd, &val0, 4); if (conf.memdmp_size > 4) { write(fd, (void*)4, conf.memdmp_size - 4); } } else { write(fd, (void*)conf.memdmp_start, conf.memdmp_size); } close(fd); } vid_bitmap_refresh(); } finished(); }
void gui_osd_draw_dof(int is_osd_edit) { if (conf.show_dof != DOF_DONT_SHOW) shooting_update_dof_values(); if (is_osd_edit || (camera_info.state.mode_rec_or_review && ((conf.show_dof == DOF_SHOW_IN_DOF) || (conf.show_dof == DOF_SHOW_IN_DOF_EX)) && (((camera_info.state.is_shutter_half_press || camera_info.state.state_kbd_script_run || shooting_get_common_focus_mode()) && (camera_info.state.mode_photo || camera_info.state.mode_shooting==MODE_STITCH)) || ((camera_info.state.mode_video || is_video_recording()) && conf.show_values_in_video)))) { twoColors col = user_color(conf.osd_color); twoColors valid_col = MAKE_COLOR(BG_COLOR(col), COLOR_GREEN); int i = 8, j; short f_ex = (conf.show_dof==DOF_SHOW_IN_DOF_EX); draw_osd_string(conf.dof_pos, 0, 0, "S/NL/FL:", col, conf.dof_scale); sprintf_dist(osd_buf, camera_info.dof_values.subject_distance); j = strlen(osd_buf); draw_osd_string(conf.dof_pos, i*FONT_WIDTH, 0, osd_buf, (f_ex && (camera_info.dof_values.distance_valid || shooting_get_focus_mode()))?valid_col:col, conf.dof_scale); i = i+j; draw_osd_string(conf.dof_pos, i*FONT_WIDTH, 0, "/", col, conf.dof_scale); sprintf_dist(osd_buf, camera_info.dof_values.near_limit); j = strlen(osd_buf); draw_osd_string(conf.dof_pos, (++i)*FONT_WIDTH, 0, osd_buf, (f_ex && camera_info.dof_values.distance_valid)?valid_col:col, conf.dof_scale); i = i+j; draw_osd_string(conf.dof_pos, i*FONT_WIDTH, 0, "/", col, conf.dof_scale); sprintf_dist(osd_buf, camera_info.dof_values.far_limit); draw_osd_string(conf.dof_pos, (++i)*FONT_WIDTH, 0, osd_buf, (f_ex && camera_info.dof_values.distance_valid)?valid_col:col, conf.dof_scale); i = 8; draw_osd_string(conf.dof_pos, 0, FONT_HEIGHT, "DOF/HYP:", col, conf.dof_scale); sprintf_dist(osd_buf, camera_info.dof_values.depth_of_field); j = strlen(osd_buf); draw_osd_string(conf.dof_pos, i*FONT_WIDTH, FONT_HEIGHT, osd_buf, (f_ex && camera_info.dof_values.distance_valid)?valid_col:col, conf.dof_scale); i = i+j; draw_osd_string(conf.dof_pos, i*FONT_WIDTH, FONT_HEIGHT, "/", col, conf.dof_scale); sprintf_dist_hyp(osd_buf, camera_info.dof_values.hyperfocal_distance); draw_osd_string(conf.dof_pos, (++i)*FONT_WIDTH, FONT_HEIGHT, osd_buf, (f_ex && camera_info.dof_values.hyperfocal_valid)?valid_col:col, conf.dof_scale); } }
//------------------------------------------------------------------- // Handler for button presses in normal camera shooting or playback modes static int gui_std_kbd_process() { #ifdef CAM_USE_ZOOM_FOR_MF if (conf.use_zoom_mf && kbd_use_zoom_as_mf()) return 1; #endif if (kbd_use_up_down_left_right_as_fast_switch()) return 1; // Process Shutter Half Press + BUTTON shortcuts gui_kbd_shortcuts(); // process other keys in not <alt> mode #if CAM_AF_SCAN_DURING_VIDEO_RECORD if (is_video_recording()) if (kbd_is_key_clicked(conf.video_af_key)) MakeAFScan(); #endif #if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO // return from digital to optical zoom in video #if CAM_HAS_ZOOM_LEVER if (conf.unlock_optical_zoom_for_video && is_video_recording() && kbd_is_key_clicked(KEY_ZOOM_OUT)) #else if (conf.unlock_optical_zoom_for_video && is_video_recording() && kbd_is_key_clicked(KEY_DOWN)) #endif { short x; // state = 1 => digital zoom standard if (shooting_get_digital_zoom_state()) { get_property_case(PROPCASE_DIGITAL_ZOOM_POSITION, &x, sizeof(x)); #if defined(CAM_USE_OPTICAL_MAX_ZOOM_STATUS) if (x==0) zoom_status=ZOOM_OPTICAL_MAX; //ERR99: No zoom back from digital to optical zoom possible if set to medium #else if (x==0) zoom_status=ZOOM_OPTICAL_MEDIUM; #endif } } #endif #if CAM_EV_IN_VIDEO if (is_video_recording() && !camera_info.state.is_shutter_half_press) { #if CAM_HAS_ERASE_BUTTON if (kbd_is_key_clicked(KEY_ERASE)) #elif CAM_HAS_DISP_BUTTON if (kbd_is_key_clicked(KEY_DISPLAY)) #else if (kbd_is_key_clicked(KEY_MENU)) #endif { set_ev_video_avail(!get_ev_video_avail()); #ifdef CAM_TOUCHSCREEN_UI redraw_buttons = 1; #endif } if (get_ev_video_avail()) { if (kbd_is_key_clicked(KEY_LEFT)) { set_ev_video(get_ev_video()-1); } if (kbd_is_key_clicked(KEY_RIGHT)) { set_ev_video(get_ev_video()+1); } } } #endif return 0; }
//------------------------------------------------------------------- // Process up/down/left/right/jogdial shortcuts when control options enabled static int kbd_use_up_down_left_right_as_fast_switch() { static long key_pressed = 0; int ev_video = 0; int jogdial; #if CAM_EV_IN_VIDEO ev_video = get_ev_video_avail(); #endif // One of the control options must be enabled or don't do anything if (!conf.fast_ev && !conf.fast_movie_control && !conf.fast_movie_quality_control) return 0; // Clear state variable is neither UP or DOWN is pressed if (!kbd_is_key_pressed(KEY_UP) && !kbd_is_key_pressed(KEY_DOWN)) key_pressed = 0; // Must be in record mode and not have either Canon menu open if ( (canon_menu_active!=(int)&canon_menu_active-4) || canon_shoot_menu_active!=0 || !camera_info.state.mode_rec) return 0; // Adjust exposure if 'Enable Fast EV switch?' option is set if (conf.fast_ev && (key_pressed == 0) && (camera_info.state.mode_shooting != MODE_M)) { #if !CAM_HAS_JOGDIAL if (kbd_is_key_pressed(KEY_UP)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); key_pressed = KEY_UP; return 1; } if (kbd_is_key_pressed(KEY_DOWN)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()-(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); key_pressed = KEY_DOWN; return 1; } #else jogdial=get_jogdial_direction(); if (camera_info.state.is_shutter_half_press && (jogdial==JOGDIAL_RIGHT)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()+(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()+(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } if (camera_info.state.is_shutter_half_press && (jogdial==JOGDIAL_LEFT)) { shooting_set_prop(PROPCASE_EV_CORRECTION_1,shooting_get_ev_correction1()-(conf.fast_ev_step+1)*16); shooting_set_prop(PROPCASE_EV_CORRECTION_2,shooting_get_ev_correction2()-(conf.fast_ev_step+1)*16); EnterToCompensationEVF(); } #endif } // Adjust video quality/bitrate if 'Video Quality Control?' option is set if (conf.fast_movie_quality_control && key_pressed == 0 && is_video_recording()) { if (kbd_is_key_pressed(KEY_UP)) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY gui_video_bitrate_enum(1,0); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality+=1; if (conf.video_quality>VIDEO_MAX_QUALITY) conf.video_quality=VIDEO_MAX_QUALITY; movie_reset = 1; } key_pressed = KEY_UP; return 1; } if (kbd_is_key_pressed(KEY_DOWN)) { if (conf.video_mode==0) { #if !CAM_VIDEO_QUALITY_ONLY conf.video_bitrate-=1; if (conf.video_bitrate<0) conf.video_bitrate=0; shooting_video_bitrate_change(conf.video_bitrate); movie_reset = 1; #endif } else if (conf.video_mode==1) { conf.video_quality-=1; if (conf.video_quality<1) conf.video_quality=1; movie_reset = 1; } key_pressed = KEY_DOWN; return 1; } } #if CAM_VIDEO_CONTROL // Pause / unpause video if 'Fast Movie Control' option is set if (conf.fast_movie_control && key_pressed == 0 && !ev_video #ifndef CAM_HAS_VIDEO_BUTTON && (camera_info.state.mode_video || is_video_recording()) #endif ) { if (kbd_is_key_pressed(KEY_LEFT) && is_video_recording()) { movie_status = VIDEO_RECORD_STOPPED; key_pressed = KEY_LEFT; return 1; } // reyalp - HACK for cams that can do video in any mode // note that this means this will probably run whenever you press right // BUG this doesn't know whether recording was stopped or paused. if (kbd_is_key_pressed(KEY_RIGHT) && (movie_status == VIDEO_RECORD_STOPPED)) { movie_status = VIDEO_RECORD_IN_PROGRESS; movie_reset = 1; key_pressed = KEY_RIGHT; return 1; } } #endif return key_pressed; }
static void gui_osd_draw_movie_time_left() { static int card_used, init_space, elapsed, avg_use, time_left; static long init_time; static int record_running = 0; static int init = 0; static unsigned int skipcalls = 1; unsigned int hour=0, min=0, sec=0; twoColors col = user_color(conf.osd_color); if ((conf.show_movie_time > 0) && (camera_info.state.mode_video || is_video_recording()) && !camera_info.state.mode_play) { #if CAM_CHDK_HAS_EXT_VIDEO_MENU if (camera_info.state.mode_video || is_video_recording()) { // if manual adjust, show the field item to be adjusted // if any value overriden, show the override value #if !CAM_VIDEO_QUALITY_ONLY if ((conf.video_mode == 0 && conf.fast_movie_quality_control==1) || conf.video_bitrate != VIDEO_DEFAULT_BITRATE) { // gui_print_osd_state_string_chr("Bitrate: ",video_bitrate_strings[conf.video_bitrate]); sprintf(osd_buf, "Bit:%5s",gui_video_bitrate_enum(0,0)); draw_osd_string(conf.mode_video_pos, 0, 2*FONT_HEIGHT, osd_buf, col, conf.mode_video_scale); } #endif if ((conf.video_mode == 1 && conf.fast_movie_quality_control==1) || conf.video_quality != VIDEO_DEFAULT_QUALITY) { // gui_print_osd_state_string_int("Quality: ",conf.video_quality); sprintf(osd_buf, "Qual:%2i",conf.video_quality); draw_osd_string(conf.mode_video_pos, 0, 3*FONT_HEIGHT, osd_buf, col, conf.mode_video_scale); } // everything else is for when recording if (!is_video_recording()) { record_running = 0; init = 0; return; } } #endif if (movie_reset == 1) { init = 0; movie_reset = 0; } if (is_video_recording()) record_running = 1; else { record_running = 0; init = 0; } if (record_running == 1 && init == 0) { init = 1; init_space = GetFreeCardSpaceKb(); init_time = get_tick_count(); } if (init == 1) { card_used = init_space - GetFreeCardSpaceKb(); elapsed = (int) ( get_tick_count() - init_time ) / 1000; avg_use = card_used / elapsed; // running average Kb/sec time_left = (GetFreeCardSpaceKb() / avg_use); hour = time_left / 3600; min = (time_left % 3600) / 60; sec = (time_left % 3600) % 60; if (elapsed < 1) { sprintf(osd_buf, "Calc..."); draw_osd_string(conf.mode_video_pos, 0, 0, osd_buf, col, conf.mode_video_scale); } if (--skipcalls ==0) { if (elapsed > 1) { int time_yofst = 0; if (conf.show_movie_time == 3) { // Both lines displayed so offset time value below bit rate time_yofst = FONT_HEIGHT; } if (conf.show_movie_time & 2) { sprintf(osd_buf, "%04d KB/s", avg_use); draw_osd_string(conf.mode_video_pos, 0, 0, osd_buf, col, conf.mode_video_scale); } if (conf.show_movie_time & 1) { sprintf(osd_buf, "-%02d:%02d:%02d", hour, min, sec); draw_osd_string(conf.mode_video_pos, 0, time_yofst, osd_buf, col, conf.mode_video_scale); } #if CAM_CHDK_HAS_EXT_VIDEO_TIME if( (int)conf.ext_video_time == 1 ) { draw_txt_string(0, 13, lang_str(LANG_WARN_VIDEO_EXT_TIME), user_color(conf.osd_color_warn)); } #endif } skipcalls = conf.show_movie_refresh*5; } } } }
//------------------------------------------------------------------- static void gui_osd_draw_values(int is_osd_edit, int is_zebra) { if (is_osd_edit || (camera_info.state.mode_rec_or_review && conf.show_values)) { // showtype // 1 - show all values // 2 - show DOF values only (for zebra & MF) int showtype = 0; if (!is_zebra && ((conf.show_values==SHOW_MISC_ALWAYS && camera_info.state.mode_photo) || ((camera_info.state.mode_video || is_video_recording()) && conf.show_values_in_video) || ((camera_info.state.is_shutter_half_press || (recreview_hold==1)) && (conf.show_values==SHOW_MISC_SHOOT)))) showtype = 1; else if (is_zebra || (shooting_get_common_focus_mode() && camera_info.state.mode_photo && conf.show_values && !((conf.show_dof==DOF_SHOW_IN_DOF) || (conf.show_dof==DOF_SHOW_IN_DOF_EX)))) showtype = 2; if (conf.values_show_real_iso || conf.values_show_market_iso || conf.values_show_ev_seted || conf.values_show_ev_measured || conf.values_show_bv_measured || conf.values_show_bv_seted || conf.values_show_overexposure || conf.values_show_canon_overexposure || conf.values_show_luminance) gui_osd_calc_expo_param(); m = 0; short f_ex = (conf.show_dof==DOF_SHOW_IN_MISC_EX); if (((conf.show_dof==DOF_SHOW_IN_MISC) || f_ex) && showtype && !is_osd_edit) { if (conf.dof_subj_dist_in_misc) gui_print_osd_dof_string_dist("SD :", camera_info.dof_values.subject_distance, f_ex && (camera_info.dof_values.distance_valid || shooting_get_focus_mode()), 0); if (conf.dof_near_limit_in_misc) gui_print_osd_dof_string_dist("NL :", camera_info.dof_values.near_limit, f_ex && camera_info.dof_values.distance_valid, 0); if (conf.dof_far_limit_in_misc) gui_print_osd_dof_string_dist("FL :", camera_info.dof_values.far_limit, f_ex && camera_info.dof_values.distance_valid, 0); if (conf.dof_depth_in_misc) gui_print_osd_dof_string_dist("DOF:", camera_info.dof_values.depth_of_field, f_ex && camera_info.dof_values.distance_valid, 0); if (conf.dof_hyperfocal_in_misc) gui_print_osd_dof_string_dist("HYP:", camera_info.dof_values.hyperfocal_distance, f_ex && camera_info.dof_values.hyperfocal_valid, 1); } if ((showtype == 1) || is_osd_edit) { if (conf.values_show_zoom || is_osd_edit) { int fl, zp=shooting_get_zoom(), fl1=get_focal_length(zp); switch (conf.zoom_value) { case ZOOM_SHOW_FL: sprintf(osd_buf, "Z:%d.%dmm%8s", fl1/1000, fl1%1000/100, ""); break; case ZOOM_SHOW_EFL: fl=get_effective_focal_length(zp); // scale by users adapter lens eg. Canon Wide .42 or Canon Tele 1.75 fl = fl * conf.zoom_scale / 100; sprintf(osd_buf, "Z:%3dmm%8s", fl/1000, ""); break; case ZOOM_SHOW_X: default: fl=get_zoom_x(zp); sprintf(osd_buf, "Z:%d/%d.%dx%8s", zp, fl/10, fl%10, ""); break; } gui_print_osd_misc_string(); } if (conf.values_show_real_aperture || is_osd_edit) gui_print_osd_misc_string_float("Av :%d.%02d ", 100, shooting_get_real_aperture()/10); int iso_mode = shooting_get_iso_mode(); if ((iso_mode <= 0) || !(conf.values_show_iso_only_in_autoiso_mode)) { if (conf.values_show_real_iso) gui_print_osd_misc_string_int("I-R:", expo.iso); if (conf.values_show_market_iso) gui_print_osd_misc_string_int("I-M:", expo.iso_market); } if (conf.values_show_bv_measured) gui_print_osd_misc_string_canon_values("Bvm:", expo.bv96_measured ); if (conf.values_show_bv_seted) gui_print_osd_misc_string_canon_values("Bvs:", expo.bv96_seted ); if (conf.values_show_ev_measured) gui_print_osd_misc_string_canon_values("Evm:", expo.ev96_measured); if (conf.values_show_ev_seted) gui_print_osd_misc_string_canon_values("Evs:", expo.ev96_seted ); if (conf.values_show_overexposure) gui_print_osd_misc_string_canon_values("dE :", expo.dev96); if (conf.values_show_canon_overexposure) gui_print_osd_misc_string_canon_values("dEc:", expo.dev96_canon); if (conf.values_show_luminance) gui_print_osd_misc_string_float("B :%d.%02d", 100, expo.b); } } }