Index: mencoder.c =================================================================== RCS file: /cvsroot/mplayer/main/mencoder.c,v retrieving revision 1.331 diff -u -r1.331 mencoder.c --- mencoder.c 12 Jan 2006 20:04:32 -0000 1.331 +++ mencoder.c 26 Jan 2006 02:29:58 -0000 @@ -1389,6 +1389,9 @@ AV_delay-=audio_delay; AV_delay /= playback_speed; AV_delay-=mux_a->timer-(mux_v->timer-(v_timer_corr+v_pts_corr)); + // correct for encoder delays + AV_delay -= (float) mux_a->encoder_delay * mux_a->h.dwScale/mux_a->h.dwRate; + AV_delay += (float) mux_v->encoder_delay * mux_v->h.dwScale/mux_v->h.dwRate; // compensate input video timer by av: x=AV_delay*0.1f; if(x<-max_pts_correction) x=-max_pts_correction; else Index: libmpcodecs/ve_lavc.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpcodecs/ve_lavc.c,v retrieving revision 1.127 diff -u -r1.127 ve_lavc.c --- libmpcodecs/ve_lavc.c 23 Jan 2006 13:53:40 -0000 1.127 +++ libmpcodecs/ve_lavc.c 26 Jan 2006 02:29:58 -0000 @@ -838,8 +838,10 @@ out_size = avcodec_encode_video(lavc_venc_context, mux_v->buffer, mux_v->buffer_size, pic); - if(out_size == 0) + if(out_size == 0) { + ++mux_v->encoder_delay; return 0; + } muxer_write_chunk(mux_v,out_size,lavc_venc_context->coded_frame->key_frame?0x10:0); Index: libmpcodecs/ve_x264.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpcodecs/ve_x264.c,v retrieving revision 1.43 diff -u -r1.43 ve_x264.c --- libmpcodecs/ve_x264.c 16 Jan 2006 01:37:32 -0000 1.43 +++ libmpcodecs/ve_x264.c 26 Jan 2006 02:29:58 -0000 @@ -513,6 +513,8 @@ && frame_ref == 1 && !bframe); muxer_write_chunk(mod->mux, i_size, keyframe?0x10:0); } + else + ++mod->mux->encoder_delay; return i_size; } Index: libmpcodecs/ve_xvid.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpcodecs/ve_xvid.c,v retrieving revision 1.30 diff -u -r1.30 ve_xvid.c --- libmpcodecs/ve_xvid.c 18 Nov 2005 14:39:22 -0000 1.30 +++ libmpcodecs/ve_xvid.c 26 Jan 2006 02:29:58 -0000 @@ -523,7 +523,10 @@ #endif // write output + if (fp->enc_frame.length > 0) muxer_write_chunk(fp->mux, fp->enc_frame.length, fp->enc_frame.intra==1 ? 0x10 : 0); + else + ++fp->mux->encoder_delay; // update the VBR engine vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra, Index: libmpcodecs/ve_xvid4.c =================================================================== RCS file: /cvsroot/mplayer/main/libmpcodecs/ve_xvid4.c,v retrieving revision 1.22 diff -u -r1.22 ve_xvid4.c --- libmpcodecs/ve_xvid4.c 18 Nov 2005 14:39:22 -0000 1.22 +++ libmpcodecs/ve_xvid4.c 26 Jan 2006 02:29:59 -0000 @@ -620,7 +620,10 @@ } /* If size is == 0, we're done with that frame */ - if(size == 0) return(FINE); + if(size == 0) { + ++mod->mux->encoder_delay; + return(FINE); + } /* xvidcore returns stats about encoded frame in an asynchronous way * accumulate these stats */ Index: libmpdemux/muxer.h =================================================================== RCS file: /cvsroot/mplayer/main/libmpdemux/muxer.h,v retrieving revision 1.16 diff -u -r1.16 muxer.h --- libmpdemux/muxer.h 21 Nov 2005 22:53:14 -0000 1.16 +++ libmpdemux/muxer.h 26 Jan 2006 02:29:59 -0000 @@ -38,6 +38,7 @@ // stream specific: WAVEFORMATEX *wf; BITMAPINFOHEADER *bih; // in format + int encoder_delay; // in number of frames // mpeg specific: size_t ipb[3]; // sizes of I/P/B frames // muxer of that stream