mirror of
https://github.com/mpv-player/mpv
synced 2024-12-28 06:03:45 +01:00
Fix video delay when encoding with B-frames.
Encoding delay is adjusted for on-the-fly during encoding. Decoding delay is compensated for by setting an appropriate dwStart on the audio stream (only in muxer_avi at this point). git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@17660 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
parent
14d023a2ee
commit
960b978a03
@ -770,6 +770,8 @@ static int config(struct vf_instance_s* vf,
|
||||
mux_v->bih->biSize= sizeof(BITMAPINFOHEADER) + lavc_venc_context->extradata_size;
|
||||
}
|
||||
|
||||
mux_v->decoder_delay = lavc_venc_context->max_b_frames ? 1 : 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -854,8 +856,10 @@ static int encode_frame(struct vf_instance_s* vf, AVFrame *pic){
|
||||
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, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
|
||||
|
||||
|
@ -435,6 +435,11 @@ static int config(struct vf_instance_s* vf, int width, int height, int d_width,
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (mod->param.i_bframe > 1 && mod->param.b_bframe_pyramid)
|
||||
mod->mux->decoder_delay = 2;
|
||||
else
|
||||
mod->mux->decoder_delay = mod->param.i_bframe ? 1 : 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -511,6 +516,8 @@ static int encode_frame(struct vf_instance_s *vf, x264_picture_t *pic_in)
|
||||
&& frame_ref == 1 && !bframe);
|
||||
muxer_write_chunk(mod->mux, i_size, keyframe?0x10:0, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
|
||||
}
|
||||
else
|
||||
++mod->mux->encoder_delay;
|
||||
|
||||
return i_size;
|
||||
}
|
||||
|
@ -378,6 +378,10 @@ config(struct vf_instance_s* vf,
|
||||
|
||||
vbrInit(&fp->vbr_state);
|
||||
|
||||
#ifdef XVID_API_UNSTABLE
|
||||
fp->mux->decoder_delay = enc_param.max_bframes ? 1 : 0;
|
||||
#endif
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -523,7 +527,10 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
|
||||
#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, MP_NOPTS_VALUE, MP_NOPTS_VALUE);
|
||||
else
|
||||
++fp->mux->encoder_delay;
|
||||
|
||||
// update the VBR engine
|
||||
vbrUpdate(&fp->vbr_state, enc_stats.quant, fp->enc_frame.intra,
|
||||
|
@ -504,6 +504,8 @@ config(struct vf_instance_s* vf,
|
||||
/* Store the encoder instance into the private data */
|
||||
mod->instance = mod->create.handle;
|
||||
|
||||
mod->mux->decoder_delay = mod->create.max_bframes ? 1 : 0;
|
||||
|
||||
return(FINE);
|
||||
}
|
||||
|
||||
@ -620,7 +622,10 @@ put_image(struct vf_instance_s* vf, mp_image_t *mpi)
|
||||
}
|
||||
|
||||
/* 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 */
|
||||
|
@ -665,10 +665,19 @@ static void avifile_write_index(muxer_t *muxer){
|
||||
}
|
||||
}
|
||||
|
||||
static void avifile_fix_parameters(muxer_stream_t *s){
|
||||
/* adjust audio_delay_fix according to individual stream delay */
|
||||
if (s->type == MUXER_TYPE_AUDIO)
|
||||
s->muxer->audio_delay_fix -= (float)s->decoder_delay * s->h.dwScale/s->h.dwRate;
|
||||
if (s->type == MUXER_TYPE_VIDEO)
|
||||
s->muxer->audio_delay_fix += (float)s->decoder_delay * s->h.dwScale/s->h.dwRate;
|
||||
}
|
||||
|
||||
int muxer_init_muxer_avi(muxer_t *muxer){
|
||||
muxer->cont_new_stream = &avifile_new_stream;
|
||||
muxer->cont_write_chunk = &avifile_write_chunk;
|
||||
muxer->cont_write_header = &avifile_write_header;
|
||||
muxer->cont_write_index = &avifile_write_index;
|
||||
muxer->fix_stream_parameters = &avifile_fix_parameters;
|
||||
return 1;
|
||||
}
|
||||
|
@ -1394,6 +1394,9 @@ if(sh_audio && !demuxer2){
|
||||
AV_delay-=audio_delay;
|
||||
AV_delay /= playback_speed;
|
||||
AV_delay-=mux_a->timer-(mux_v->timer-(v_timer_corr+v_pts_corr));
|
||||
// adjust 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
|
||||
|
Loading…
Reference in New Issue
Block a user