[Mplayer-cvslog] CVS: main mplayer.c,1.487,1.488
Arpi of Ize
arpi at mplayerhq.hu
Thu May 2 04:04:05 CEST 2002
Update of /cvsroot/mplayer/main
In directory mail:/var/tmp.root/cvs-serv3064
Modified Files:
mplayer.c
Log Message:
- frame_time delayed one frame, as it's really duration of current frame,
as suggested by Atmosfear some time ago, when talking about -mf...
- limiting usleep time, to avoid sound skips and ensure responsiveness,
inspired by asf patch from Albeu. it solves problem with very low fps .wmv files
Index: mplayer.c
===================================================================
RCS file: /cvsroot/mplayer/main/mplayer.c,v
retrieving revision 1.487
retrieving revision 1.488
diff -u -r1.487 -r1.488
--- mplayer.c 1 May 2002 22:37:59 -0000 1.487
+++ mplayer.c 2 May 2002 02:03:59 -0000 1.488
@@ -1343,12 +1343,14 @@
int too_fast_frame_cnt=0;
// for auto-quality:
float AV_delay=0; // average of A-V timestamp differences
-double cvideo_base_vtime;
-double cvideo_base_vframe;
double vdecode_time;
unsigned int lastframeout_ts;
float time_frame_corr_avg=0;
+float next_frame_time=0;
+int frame_time_remaining=0; // flag
+int blit_frame=0;
+
//================ SETUP AUDIO ==========================
if(sh_audio){
@@ -1484,15 +1486,13 @@
/*========================== PLAY VIDEO ============================*/
- float frame_time=0;
- int blit_frame=0;
-
- vo_pts=sh_video->timer*90000.0;
- vo_fps=sh_video->fps;
+ float frame_time=next_frame_time;
+ float delay=audio_out->get_delay()*0.5;
- cvideo_base_vframe=sh_video->timer;
- cvideo_base_vtime=video_time_usage;
+ vo_pts=sh_video->timer*90000.0;
+ vo_fps=sh_video->fps;
+ if(!frame_time_remaining){
//-------------------- Decode a frame: -----------------------
vdecode_time=video_time_usage;
while(1)
@@ -1500,7 +1500,7 @@
int in_size;
// get it!
current_module="video_read_frame";
- in_size=video_read_frame(sh_video,&frame_time,&start,force_fps);
+ in_size=video_read_frame(sh_video,&next_frame_time,&start,force_fps);
if(in_size<0){ eof=1; break; }
if(in_size>max_framesize) max_framesize=in_size; // stats
sh_video->timer+=frame_time;
@@ -1537,6 +1537,8 @@
eof=1; goto goto_next_file;
}
+ }
+
// ==========================================================================
// current_module="draw_osd";
@@ -1558,7 +1560,7 @@
}
#endif
- if(drop_frame){
+ if(drop_frame && !frame_time_remaining){
time_frame=0; // don't sleep!
blit_frame=0; // don't display!
@@ -1567,6 +1569,7 @@
// It's time to sleep...
+ frame_time_remaining=0;
time_frame-=GetRelativeTime(); // reset timer
if(sh_audio && !d_audio->eof){
@@ -1625,6 +1628,14 @@
} // if(dapsync)
+ if(delay>0.25) delay=0.25; else
+ if(delay<0.10) delay=0.10;
+ if(time_frame>delay*0.6){
+ // sleep time too big - may cause audio drops (buffer underrun)
+ frame_time_remaining=1;
+ time_frame=delay*0.5;
+ }
+
} else {
// NOSOUND:
@@ -1676,12 +1687,14 @@
}
+//if(!frame_time_remaining){ // should we display the frame now?
+
//====================== FLIP PAGE (VIDEO BLT): =========================
current_module="flip_page";
if(vo_config_count) video_out->check_events();
- if(blit_frame){
+ if(blit_frame && !frame_time_remaining){
unsigned int t2=GetTimer();
double tt;
float j;
@@ -1741,7 +1754,7 @@
max_pts_correction=default_max_pts_correction;
else
max_pts_correction=sh_video->frametime*0.10; // +-10% of time
- sh_audio->timer+=x; c_total+=x;
+ if(!frame_time_remaining){ sh_audio->timer+=x; c_total+=x;} // correction
if(!quiet) mp_msg(MSGT_AVSYNC,MSGL_STATUS,"A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d %d %d%%\r",
a_pts-audio_delay-delay,v_pts,AV_delay,c_total,
(int)sh_video->num_frames,(int)sh_video->num_frames_decoded,
@@ -2756,6 +2769,7 @@
}
rel_seek_secs=0;
abs_seek_pos=0;
+ frame_time_remaining=0;
current_module=NULL;
}
More information about the MPlayer-cvslog
mailing list