📄 mplayer_novideo_0.21.c
字号:
if(!sh_audio){ mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_NoSound); mp_msg(MSGT_CPLAYER,MSGL_V,"Freeing %d unused audio chunks.\n",d_audio->packs); ds_free_packs(d_audio); // free buffered chunks d_audio->id=-2; // do not read audio chunks goto goto_next_file;}//==================== 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 (audio_out && sh_audio) audio_out->pause(); // pause audio, keep data if possible while( (cmd = mp_input_get_cmd(20,1,1)) == NULL) { 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 (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; rel_seek_secs = v; } else if(abs) { /* Absolute seek by percentage */ abs_seek_pos = 3; 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_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; build_afilter_chain(sh_audio, &ao_data); } break; case MP_CMD_SPEED_MULT : { float v = cmd->args[0].v.f; playback_speed *= v; build_afilter_chain(sh_audio, &ao_data); } break; case MP_CMD_SPEED_SET : { float v = cmd->args[0].v.f; playback_speed = v; 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_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); } } 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_FRAMEDROPPING : { int v = cmd->args[0].v.i; if(v < 0){ frame_dropping = (frame_dropping+1)%3; } else frame_dropping = v > 2 ? 2 : v; } break; case MP_CMD_GET_TIME_LENGTH : { mp_msg(MSGT_GLOBAL,MSGL_INFO,MSGTR_AnsLength, demuxer_get_time_length(demuxer)); } break; case MP_CMD_SWITCH_AUDIO : demuxer_switch_audio(demuxer); break; default : { mp_msg(MSGT_CPLAYER, MSGL_V, "Received unknown cmd %s\n",cmd->name); } } if (cmd->pausing) osd_function = OSD_PAUSE; mp_cmd_free(cmd); }} if (seek_to_sec) { int a,b; float d; if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3) rel_seek_secs += 3600*a +60*b +d ; else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2) rel_seek_secs += 60*a +d; else if (sscanf(seek_to_sec, "%f", &d)==1) rel_seek_secs += d; seek_to_sec = NULL; } /* Looping. */ if(eof==1 && loop_times>=0) { int l = loop_times; play_tree_iter_step(playtree_iter,0,0); loop_times = l; mp_msg(MSGT_CPLAYER,MSGL_V,"loop_times = %d, eof = %d\n", loop_times,eof); if(loop_times>1) loop_times--; else if(loop_times==1) loop_times=-1; play_n_frames=play_n_frames_mf; eof=0; abs_seek_pos=3; rel_seek_secs=0; // seek to start of movie (0%) loop_seek = 1; }if(rel_seek_secs || abs_seek_pos){ current_module="seek"; if(demux_seek(demuxer,rel_seek_secs,abs_seek_pos)){ // success: /* FIXME there should be real seeking for vobsub */ fflush(stdout); if(sh_audio){ current_module="seek_audio_reset"; audio_out->reset(); // stop audio, throwing away buffered data } } rel_seek_secs=0; abs_seek_pos=0; frame_time_remaining=0; current_module=NULL; loop_seek=0;}//================= Update OSD ====================} // while(!eof)mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d \n",eof);}goto_next_file: // don't jump here after ao/vo/getch initialization!mp_msg(MSGT_CPLAYER,MSGL_INFO,"\n");if(benchmark){ double tot=video_time_usage+vout_time_usage+audio_time_usage; double total_time_usage; total_time_usage_start=GetTimer()-total_time_usage_start; total_time_usage = (float)total_time_usage_start*0.000001; mp_msg(MSGT_CPLAYER,MSGL_INFO,"\nBENCHMARKs: VC:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs\n", video_time_usage,vout_time_usage,audio_time_usage, total_time_usage-tot,total_time_usage); if(total_time_usage>0.0) mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARK%%: VC:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%%\n", 100.0*video_time_usage/total_time_usage, 100.0*vout_time_usage/total_time_usage, 100.0*audio_time_usage/total_time_usage, 100.0*(total_time_usage-tot)/total_time_usage, 100.0); if(total_frame_cnt && frame_dropping) mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARKn: disp: %d (%3.2f fps) drop: %d (%d%%) total: %d (%3.2f fps)\n", total_frame_cnt-drop_frame_cnt, (total_time_usage>0.5)?((total_frame_cnt-drop_frame_cnt)/total_time_usage):0, drop_frame_cnt, 100*drop_frame_cnt/total_frame_cnt, total_frame_cnt, (total_time_usage>0.5)?(total_frame_cnt/total_time_usage):0); }// time to uninit all, except global stuff:uninit_player(INITED_ALL-(INITED_GUI+INITED_INPUT+(fixed_vo?INITED_VO:0)));if(eof == PT_NEXT_ENTRY || eof == PT_PREV_ENTRY) { eof = eof == PT_NEXT_ENTRY ? 1 : -1; if(play_tree_iter_step(playtree_iter,play_tree_step,0) == PLAY_TREE_ITER_ENTRY) { eof = 1; } else { play_tree_iter_free(playtree_iter); playtree_iter = NULL; } play_tree_step = 1;} else if (eof == PT_UP_NEXT || eof == PT_UP_PREV) { eof = eof == PT_UP_NEXT ? 1 : -1; if ( playtree_iter ) { if(play_tree_iter_up_step(playtree_iter,eof,0) == PLAY_TREE_ITER_ENTRY) { eof = 1; } else { play_tree_iter_free(playtree_iter); playtree_iter = NULL; } }} else { // NEXT PREV SRC eof = eof == PT_PREV_SRC ? -1 : 1;}if(eof == 0) eof = 1;while(playtree_iter != NULL) { filename = play_tree_iter_get_file(playtree_iter,eof); if(filename == NULL) { if( play_tree_iter_step(playtree_iter,eof,0) != PLAY_TREE_ITER_ENTRY) { play_tree_iter_free(playtree_iter); playtree_iter = NULL; }; } else break;} if(use_gui || playtree_iter != NULL){ eof = 0; goto play_next_file;}exit_player_with_rc(MSGTR_Exit_eof, 0);return 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -