From ea0baf7de48c2c310ea807efd750a0464409d0ae Mon Sep 17 00:00:00 2001 From: arpi_esp Date: Mon, 14 May 2001 09:35:51 +0000 Subject: [PATCH] frame dropping... git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@799 b3059339-0415-0410-9bf9-f77b7e298cf2 --- cfg-mplayer.h | 4 ++++ mplayer.c | 33 ++++++++++++++++++++++++--------- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 3fc2432598..b5c32fb9f2 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -76,6 +76,10 @@ struct config conf[]={ {"ni", &force_ni, CONF_TYPE_FLAG, 0, 0, 1}, {"noni", &force_ni, CONF_TYPE_FLAG, 0, 1, 0}, + {"framedrop", &frame_dropping, CONF_TYPE_FLAG, 0, 0, 1}, + {"hardframedrop", &frame_dropping, CONF_TYPE_FLAG, 0, 0, 2}, + {"no framedrop", &frame_dropping, CONF_TYPE_FLAG, 0, 1, 0}, + {"aid", &audio_id, CONF_TYPE_INT, CONF_RANGE, 0, 256}, {"vid", &video_id, CONF_TYPE_INT, CONF_RANGE, 0, 256}, {"sid", &dvdsub_id, CONF_TYPE_INT, CONF_RANGE, 0, 32}, diff --git a/mplayer.c b/mplayer.c index 7ab5e6259e..831e989c10 100644 --- a/mplayer.c +++ b/mplayer.c @@ -473,6 +473,7 @@ int pts_from_bps=1; #else int pts_from_bps=0; #endif +int frame_dropping=0; // option 0=no drop 1= drop vo 2= drop decode char* title="MPlayer"; // screen info: char* video_driver=NULL; //"mga"; // default @@ -1662,7 +1663,7 @@ if(1) current_module="decode_video"; // if(!force_redraw && v_frame+0.1codec->driver){ @@ -1700,7 +1701,7 @@ switch(sh_video->codec->driver){ if(in_size<0){ eof=1;break;} if(in_size>max_framesize) max_framesize=in_size; - DS_VideoDecoder_DecodeFrame(start, in_size, 0, !drop_frame); + if(drop_frame<2) DS_VideoDecoder_DecodeFrame(start, in_size, 0, !drop_frame); current_module="draw_frame"; if(!drop_frame && sh_video->our_out_buffer){ @@ -1734,7 +1735,7 @@ switch(sh_video->codec->driver){ sh_video->bih->biSizeImage = in_size; // ret = ICDecompress(avi_header.hic, ICDECOMPRESS_NOTKEYFRAME|(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL), ret = ICDecompress(sh_video->hic, ICDECOMPRESS_NOTKEYFRAME | - ( drop_frame?(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL):0 ) , + ( (drop_frame==2)?(ICDECOMPRESS_HURRYUP|ICDECOMPRESS_PREROL):0 ) , sh_video->bih, start, &sh_video->o_bih, drop_frame ? 0 : sh_video->our_out_buffer); @@ -1838,8 +1839,17 @@ switch(sh_video->codec->driver){ if(file_format==DEMUXER_TYPE_MPEG_PS) d_video->pts+=frame_time; - if(!drop_frame){ + if(drop_frame){ + if(has_audio){ + int delay=get_audio_delay(audio_fd); + if(verbose>1)printf("delay=%d\n",delay); + time_frame=v_frame; + time_frame-=a_frame-(float)delay/(float)sh_audio->o_bps; + if(time_frame>-0.1) drop_frame=0; // stop dropping frames + } + + } else { // It's time to sleep... current_module="sleep"; @@ -1850,10 +1860,15 @@ switch(sh_video->codec->driver){ if(verbose>1)printf("delay=%d\n",delay); time_frame=v_frame; time_frame-=a_frame-(float)delay/(float)sh_audio->o_bps; + // we are out of time... drop next frame! + if(time_frame<-0.1){ + drop_frame=frame_dropping; // tricky! + ++drop_frame_cnt; + } } else { if(time_frame<-0.1 || time_frame>0.1) time_frame=0; } - + if(verbose>1)printf("sleep: %5.3f a:%6.3f v:%6.3f \n",time_frame,a_frame,v_frame); while(time_frame>0.005){ @@ -1929,12 +1944,12 @@ switch(sh_video->codec->driver){ else max_pts_correction=sh_video->frametime*0.10; // +-10% of time a_frame+=x; c_total+=x; - printf(" ct:%7.3f %3d %2d%% %2d%% %3.1f%% \r",c_total, + printf(" ct:%7.3f %3d %2d%% %2d%% %3.1f%% %d\r",c_total, (int)num_frames, (v_frame>0.5)?(int)(100.0*video_time_usage/(double)v_frame):0, (v_frame>0.5)?(int)(100.0*vout_time_usage/(double)v_frame):0, (v_frame>0.5)?(100.0*audio_time_usage/(double)v_frame):0 -// ,drop_frame_cnt + ,drop_frame_cnt // dbg_es_sent-dbg_es_rcvd ); fflush(stdout); @@ -2070,8 +2085,8 @@ switch(sh_video->codec->driver){ mixer_usemaster=!mixer_usemaster; break; case 'd': - drop_frame=!drop_frame; - printf("== drop: %d == \n",drop_frame); + frame_dropping=(frame_dropping+1)%3; + printf("== drop: %d == \n",frame_dropping); break; } if (seek_to_sec) {