summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--video/decode/dec_video.c4
-rw-r--r--video/decode/vd.h1
-rw-r--r--video/decode/vd_lavc.c13
3 files changed, 18 insertions, 0 deletions
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)