diff --git a/video/decode/dec_video.c b/video/decode/dec_video.c index af55c66811..509daf7cd8 100644 --- a/video/decode/dec_video.c +++ b/video/decode/dec_video.c @@ -211,6 +211,10 @@ bool video_init_best_codec(struct dec_video *d_video, char* video_decoders) static void add_avi_pts(struct dec_video *d_video, double pts) { if (pts != MP_NOPTS_VALUE) { + int delay = -1; + video_vd_control(d_video, VDCTRL_QUERY_UNSEEN_FRAMES, &delay); + if (delay >= 0 && delay < d_video->num_buffered_pts) + d_video->num_buffered_pts = delay; if (d_video->num_buffered_pts == MP_ARRAY_SIZE(d_video->buffered_pts)) { MP_ERR(d_video, "Too many buffered pts\n"); } else { diff --git a/video/decode/vd.h b/video/decode/vd.h index 2c812dd4e1..6f5016ac37 100644 --- a/video/decode/vd.h +++ b/video/decode/vd.h @@ -42,6 +42,7 @@ extern const vd_functions_t *const mpcodecs_vd_drivers[]; enum vd_ctrl { VDCTRL_RESET = 1, // reset decode state after seeking + VDCTRL_QUERY_UNSEEN_FRAMES, // current decoder lag VDCTRL_FORCE_HWDEC_FALLBACK, // force software decoding fallback VDCTRL_GET_HWDEC, }; diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index bae0224e02..923fec308b 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -722,6 +722,19 @@ static int control(struct dec_video *vd, int cmd, void *arg) case VDCTRL_RESET: reset_avctx(vd); return CONTROL_TRUE; + case VDCTRL_QUERY_UNSEEN_FRAMES: { + AVCodecContext *avctx = ctx->avctx; + if (!ctx) + break; + if (ctx->hwdec && ctx->hwdec->type == HWDEC_RPI) + break; // MMAL has arbitrary buffering, thus unknown + int delay = avctx->has_b_frames; + assert(delay >= 0); + if (avctx->active_thread_type & FF_THREAD_FRAME) + delay += avctx->thread_count - 1; + *(int *)arg = delay; + return CONTROL_TRUE; + } case VDCTRL_GET_HWDEC: { int hwdec = ctx->hwdec ? ctx->hwdec->type : 0; if (!ctx->software_fallback_decoder)