📄 mplayer.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();#ifdef USE_DVDNAVif (stream->type==STREAMTYPE_DVDNAV) { dvdnav_stream_fullstart((dvdnav_priv_t *)stream->priv);}#endiftotal_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); }#ifdef HAVE_NEW_GUI if(use_gui) guiGetEvent( guiCEvent,(char *)guiSetPause );#endif if (audio_out && sh_audio) audio_out->pause(); // pause audio, keep data if possible while( (cmd = mp_input_get_cmd(20,1,1)) == NULL) {#ifdef HAVE_NEW_GUI if(use_gui){ guiEventHandling(); guiGetEvent( guiReDraw,NULL ); if(guiIntfStruct.Playing!=2 || (rel_seek_secs || abs_seek_pos)) break; }#endif#ifdef HAVE_MENU if(vf_menu) vf_menu_pause_update(vf_menu);#endif 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#ifdef HAVE_NEW_GUI if (use_gui) { if ( guiIntfStruct.Playing == guiSetStop ) goto goto_next_file; guiGetEvent( guiCEvent,(char *)guiSetPlay ); }#endif }// handle -sstepif(step_sec>0) { osd_function=OSD_FFW; rel_seek_secs+=step_sec;}#ifdef USE_DVDNAVif (stream->type==STREAMTYPE_DVDNAV && dvd_nav_still) dvdnav_stream_sleeping((dvdnav_priv_t*)stream->priv);#endif//================= EDL =========================================#ifdef USE_EDL if( next_edl_record ) { // Are we (still?) doing EDL? if ( !sh_video ) { mp_msg( MSGT_CPLAYER, MSGL_ERR, MSGTR_EdlNOsh_video ); free_edl(edl_records); next_edl_record = NULL; edl_records = NULL; } else { if( sh_video->pts >= next_edl_record->start_sec ) { if( next_edl_record->action == EDL_SKIP ) { osd_function = OSD_FFW; abs_seek_pos = 0; rel_seek_secs = next_edl_record->length_sec; mp_msg(MSGT_CPLAYER, MSGL_DBG4, "EDL_SKIP: start [%f], stop [%f], length [%f]\n", next_edl_record->start_sec, next_edl_record->stop_sec, next_edl_record->length_sec ); edl_decision = 1; } else if( next_edl_record->action == EDL_MUTE ) { edl_muted = !edl_muted; if ((user_muted | edl_muted) != mixer.muted) mixer_mute(&mixer); mp_msg(MSGT_CPLAYER, MSGL_DBG4, "EDL_MUTE: [%f]\n", next_edl_record->start_sec ); } next_edl_record=next_edl_record->next; } } }#endif//================= 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; 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_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;#ifdef HAVE_NEW_GUI if (use_gui) { int i=0; if (n>0) for (i=0;i<n;i++) mplNext(); else for (i=0;i<-1*n;i++) mplPrev(); } else#endif { 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; 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 ==================== // DVD sub:} // 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 + -