summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-14 09:35:51 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-05-14 09:35:51 +0000
commitea0baf7de48c2c310ea807efd750a0464409d0ae (patch)
tree5866fe70d9110ad4d655ab95f3929affb18e0daf
parent84be5316a50601be81bcbae5901ed735edafb52a (diff)
downloadmpv-ea0baf7de48c2c310ea807efd750a0464409d0ae.tar.bz2
mpv-ea0baf7de48c2c310ea807efd750a0464409d0ae.tar.xz
frame dropping...
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@799 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--cfg-mplayer.h4
-rw-r--r--mplayer.c33
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.1<a_frame) drop_frame=1; else drop_frame=0;
- drop_frame_cnt+=drop_frame;
+// if(drop_frame) ++drop_frame_cnt;
//-------------------- Decode a frame: -----------------------
switch(sh_video->codec->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) {