📄 mplayer_novideo_0.20.c
字号:
//==================== START PLAYING =======================if(loop_times>1) loop_times--; elseif(loop_times==1) loop_times = -1;mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_StartPlaying);fflush(stdout); //"starting playback..."InitTimer();total_time_usage_start=GetTimer();audio_time_usage=0; video_time_usage=0; vout_time_usage=0;total_frame_cnt=0; drop_frame_cnt=0; // fix for multifile fps benchmarkplay_n_frames=play_n_frames_mf;if(play_n_frames==0){ eof=PT_NEXT_ENTRY; goto goto_next_file;}while(!eof){ float aq_sleep_time=0; if(play_n_frames>=0){ --play_n_frames; if(play_n_frames<0) eof = PT_NEXT_ENTRY; }/*========================== PLAY AUDIO ============================*/while(sh_audio){ unsigned int t; double tt; int playsize; current_module="play_audio"; ao_data.pts=((sh_video?sh_video->timer:0)+sh_audio->delay)*90000.0; playsize=audio_out->get_space(); // handle audio-only case: if(playsize < ao_data.outburst && !sh_video) { // buffer is full, do not block here!!! usec_sleep(10000); // Wait a tick before retry continue; } if(playsize>MAX_OUTBURST) playsize=MAX_OUTBURST; // we shouldn't exceed it! // Fill buffer if needed: current_module="decode_audio"; // Enter AUDIO decoder module t=GetTimer(); while(sh_audio->a_out_buffer_len<playsize && !d_audio->eof){ int ret=decode_audio(sh_audio,&sh_audio->a_out_buffer[sh_audio->a_out_buffer_len], playsize-sh_audio->a_out_buffer_len,sh_audio->a_out_buffer_size-sh_audio->a_out_buffer_len); if(ret<=0) break; // EOF? sh_audio->a_out_buffer_len+=ret; } t=GetTimer()-t; tt = t*0.000001f; audio_time_usage+=tt; if(playsize>sh_audio->a_out_buffer_len) playsize=sh_audio->a_out_buffer_len; // play audio: current_module="play_audio"; playsize=audio_out->play(sh_audio->a_out_buffer,playsize,0); if(playsize>0){ sh_audio->a_out_buffer_len-=playsize; memmove(sh_audio->a_out_buffer,&sh_audio->a_out_buffer[playsize],sh_audio->a_out_buffer_len); sh_audio->delay+=playback_speed*playsize/((float)((ao_data.bps && sh_audio->afilter) ? ao_data.bps : sh_audio->o_bps)); } break;} // while(sh_audio) if(!quiet) { float a_pos = sh_audio->delay - audio_out->get_delay() * playback_speed; print_status(a_pos, 0, 0); } if(d_audio->eof) eof = PT_NEXT_ENTRY;/*========================== PLAY VIDEO ============================*///============================ Handle PAUSE =============================== current_module="pause";#ifdef USE_OSD if(osd_visible){ if (!--osd_visible){ vo_osd_progbar_type=-1; // disable vo_osd_changed(OSDTYPE_PROGBAR); if (osd_function != OSD_PAUSE) osd_function = OSD_PLAY; } }#endif if(osd_function==OSD_PAUSE){ mp_cmd_t* cmd; if(!quiet) { mp_msg(MSGT_CPLAYER,MSGL_STATUS,MSGTR_Paused); fflush(stdout); } if (video_out && sh_video && vo_config_count) video_out->control(VOCTRL_PAUSE, NULL); if (audio_out && sh_audio) audio_out->pause(); // pause audio, keep data if possible while( (cmd = mp_input_get_cmd(20,1,1)) == NULL) { if(sh_video && video_out && vo_config_count) video_out->check_events(); usec_sleep(20000); } if (cmd && cmd->id == MP_CMD_PAUSE) { cmd = mp_input_get_cmd(0,1,0); mp_cmd_free(cmd); } osd_function=OSD_PLAY; if (audio_out && sh_audio) audio_out->resume(); // resume audio if (video_out && sh_video && vo_config_count) video_out->control(VOCTRL_RESUME, NULL); // resume video (void)GetRelativeTime(); // keep TF around FT in next cycle }// handle -sstepif(step_sec>0) { osd_function=OSD_FFW; rel_seek_secs+=step_sec;}//================= EDL =========================================//================= Keyboard events, SEEKing ==================== current_module="key_events";{ mp_cmd_t* cmd; int brk_cmd = 0; while( !brk_cmd && (cmd = mp_input_get_cmd(0,0,0)) != NULL) { switch(cmd->id) { case MP_CMD_SEEK : { float v; int abs; osd_show_percentage = 25; v = cmd->args[0].v.f; abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0; if(abs==2) { /* Absolute seek to a specific timestamp in seconds */ abs_seek_pos = 1; if(sh_video) osd_function= (v > sh_video->timer) ? OSD_FFW : OSD_REW; rel_seek_secs = v; } else if(abs) { /* Absolute seek by percentage */ abs_seek_pos = 3; if(sh_video) osd_function= (v > sh_video->timer) ? OSD_FFW : OSD_REW; rel_seek_secs = v/100.0; } else { rel_seek_secs+= v; osd_function= (v > 0) ? OSD_FFW : OSD_REW; } brk_cmd = 1; } break; case MP_CMD_SWITCH_RATIO : { if (cmd->nargs == 0) movie_aspect = (float) sh_video->disp_w / sh_video->disp_h; else movie_aspect = cmd->args[0].v.f; mpcodecs_config_vo (sh_video, sh_video->disp_w, sh_video->disp_h, 0); } break; case MP_CMD_AUDIO_DELAY : { float v = cmd->args[0].v.f; audio_delay += v; osd_show_av_delay = 9; if(sh_audio) sh_audio->delay+= v; } break; case MP_CMD_SPEED_INCR : { float v = cmd->args[0].v.f; playback_speed += v; if (sh_video) osd_show_speed = sh_video->fps; build_afilter_chain(sh_audio, &ao_data); } break; case MP_CMD_SPEED_MULT : { float v = cmd->args[0].v.f; playback_speed *= v; if (sh_video) osd_show_speed = sh_video->fps; build_afilter_chain(sh_audio, &ao_data); } break; case MP_CMD_SPEED_SET : { float v = cmd->args[0].v.f; playback_speed = v; if (sh_video) osd_show_speed = sh_video->fps; build_afilter_chain(sh_audio, &ao_data); } break; case MP_CMD_FRAME_STEP : case MP_CMD_PAUSE : { cmd->pausing = 1; brk_cmd = 1; } break; case MP_CMD_QUIT : { exit_player_with_rc(MSGTR_Exit_quit, (cmd->nargs > 0)? cmd->args[0].v.i : 0); } case MP_CMD_GRAB_FRAMES : { grab_frames=2; } break; case MP_CMD_PLAY_TREE_STEP : { int n = cmd->args[0].v.i == 0 ? 1 : cmd->args[0].v.i; int force = cmd->args[1].v.i; if(!force && playtree_iter) { play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter); if(play_tree_iter_step(i,n,0) == PLAY_TREE_ITER_ENTRY) eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY; play_tree_iter_free(i); } else eof = (n > 0) ? PT_NEXT_ENTRY : PT_PREV_ENTRY; if(eof) play_tree_step = n; brk_cmd = 1; } break; case MP_CMD_PLAY_TREE_UP_STEP : { int n = cmd->args[0].v.i > 0 ? 1 : -1; int force = cmd->args[1].v.i; if(!force && playtree_iter) { play_tree_iter_t* i = play_tree_iter_new_copy(playtree_iter); if(play_tree_iter_up_step(i,n,0) == PLAY_TREE_ITER_ENTRY) eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; play_tree_iter_free(i); } else eof = (n > 0) ? PT_UP_NEXT : PT_UP_PREV; brk_cmd = 1; } break; case MP_CMD_PLAY_ALT_SRC_STEP : { if(playtree_iter && playtree_iter->num_files > 1) { int v = cmd->args[0].v.i; if(v > 0 && playtree_iter->file < playtree_iter->num_files) eof = PT_NEXT_SRC; else if(v < 0 && playtree_iter->file > 1) eof = PT_PREV_SRC; } brk_cmd = 1; } break; case MP_CMD_SUB_DELAY : {#ifdef USE_SUB if (sh_video) { int abs= cmd->args[1].v.i; float v = cmd->args[0].v.f; if(abs) sub_delay = v; else sub_delay += v; osd_show_sub_delay = 9; // show the subdelay in OSD }#endif } break; case MP_CMD_SUB_STEP : {#ifdef USE_SUB if (sh_video) { int movement = cmd->args[0].v.i; step_sub(subdata, sh_video->pts, movement); osd_show_sub_delay = 9; // show the subdelay in OSD }#endif } break; case MP_CMD_SUB_LOG : {#ifdef USE_SUB log_sub();#endif } break; case MP_CMD_OSD : {#ifdef USE_OSD if(sh_video) { int v = cmd->args[0].v.i; if(v < 0) osd_level=(osd_level+1)%(MAX_OSD_LEVEL+1); else osd_level= v > MAX_OSD_LEVEL ? MAX_OSD_LEVEL : v; }#endif } break; case MP_CMD_OSD_SHOW_TEXT : {#ifdef USE_OSD if(osd_level && sh_video){ osd_show_text=sh_video->fps; // 1 sec strncpy(osd_show_text_buffer, cmd->args[0].v.s, 64); }#endif } break; case MP_CMD_VOLUME : { int v = cmd->args[0].v.i; // start change for absolute volume value int abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0; if( abs ) { mixer_setvolume(&mixer, (float)v, (float)v ); } else { if(v > 0) mixer_incvolume(&mixer); else mixer_decvolume(&mixer); } #ifdef USE_OSD if(osd_level && sh_video){ float vol; osd_visible=sh_video->fps; // 1 sec vo_osd_progbar_type=OSD_VOLUME; mixer_getbothvolume(&mixer, &vol); vo_osd_progbar_value=(vol*256.0)/100.0; vo_osd_changed(OSDTYPE_PROGBAR); }#endif } break; case MP_CMD_MUTE: mixer_mute(&mixer); break; case MP_CMD_LOADFILE : { play_tree_t* e = play_tree_new(); play_tree_add_file(e,cmd->args[0].v.s); // Go back to the start point while(play_tree_iter_up_step(playtree_iter,0,1) != PLAY_TREE_ITER_END) /* NOP */; play_tree_free_list(playtree->child,1); play_tree_set_child(playtree,e); play_tree_iter_step(playtree_iter,0,0); eof = PT_NEXT_SRC; brk_cmd = 1; } break; case MP_CMD_LOADLIST : { play_tree_t* e = parse_playlist_file(cmd->args[0].v.s); if(!e) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_PlaylistLoadUnable,cmd->args[0].v.s); else { // Go back to the start point while(play_tree_iter_up_step(playtree_iter,0,1) != PLAY_TREE_ITER_END) /* NOP */; play_tree_free_list(playtree->child,1); play_tree_set_child(playtree,e); play_tree_iter_step(playtree_iter,0,0); eof = PT_NEXT_SRC; } brk_cmd = 1; } break; case MP_CMD_GAMMA : { int v = cmd->args[0].v.i, abs = cmd->args[1].v.i; if (!sh_video) break; if (vo_gamma_gamma == 1000) { vo_gamma_gamma = 0; get_video_colors (sh_video, "gamma", &vo_gamma_gamma); } if (abs) vo_gamma_gamma = v; else vo_gamma_gamma += v; if (vo_gamma_gamma > 100) vo_gamma_gamma = 100; else if (vo_gamma_gamma < -100) vo_gamma_gamma = -100; set_video_colors(sh_video, "gamma", vo_gamma_gamma);#ifdef USE_OSD if(osd_level){ osd_visible=sh_video->fps; // 1 sec vo_osd_progbar_type=OSD_BRIGHTNESS; vo_osd_progbar_value=(vo_gamma_gamma<<7)/100 + 128; vo_osd_changed(OSDTYPE_PROGBAR); }#endif // USE_OSD } break; case MP_CMD_BRIGHTNESS : { int v = cmd->args[0].v.i, abs = cmd->args[1].v.i; if (!sh_video) break; if (vo_gamma_brightness == 1000) { vo_gamma_brightness = 0; get_video_colors(sh_video, "brightness", &vo_gamma_brightness); } if (abs) vo_gamma_brightness = v; else vo_gamma_brightness += v; if (vo_gamma_brightness > 100) vo_gamma_brightness = 100; else if (vo_gamma_brightness < -100) vo_gamma_brightness = -100; if(set_video_colors(sh_video, "brightness", vo_gamma_brightness)){#ifdef USE_OSD if(osd_level){ osd_visible=sh_video->fps; // 1 sec vo_osd_progbar_type=OSD_BRIGHTNESS; vo_osd_progbar_value=(vo_gamma_brightness<<7)/100 + 128; vo_osd_changed(OSDTYPE_PROGBAR); }#endif // USE_OSD } } break; case MP_CMD_CONTRAST : { int v = cmd->args[0].v.i, abs = cmd->args[1].v.i; if (!sh_video) break; if (vo_gamma_contrast == 1000) { vo_gamma_contrast = 0; get_video_colors(sh_video, "contrast", &vo_gamma_contrast); } if (abs) vo_gamma_contrast = v; else vo_gamma_contrast += v; if (vo_gamma_contrast > 100) vo_gamma_contrast = 100; else if (vo_gamma_contrast < -100) vo_gamma_contrast = -100; if(set_video_colors(sh_video, "contrast", vo_gamma_contrast)){#ifdef USE_OSD if(osd_level){ osd_visible=sh_video->fps; // 1 sec vo_osd_progbar_type=OSD_CONTRAST; vo_osd_progbar_value=(vo_gamma_contrast<<7)/100 + 128; vo_osd_changed(OSDTYPE_PROGBAR); }#endif // USE_OSD } } break; case MP_CMD_SATURATION : { int v = cmd->args[0].v.i, abs = cmd->args[1].v.i; if (!sh_video) break; if (vo_gamma_saturation ==
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -