summaryrefslogtreecommitdiffstats
path: root/video/decode/vd_lavc.c
diff options
context:
space:
mode:
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r--video/decode/vd_lavc.c22
1 files changed, 16 insertions, 6 deletions
diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c
index 1f5ae68bbf..f67e6dfbe6 100644
--- a/video/decode/vd_lavc.c
+++ b/video/decode/vd_lavc.c
@@ -436,10 +436,19 @@ static int init_vo(sh_video_t *sh, AVFrame *frame)
ctx->pix_fmt = pix_fmt;
ctx->best_csp = pixfmt2imgfmt(pix_fmt);
- sh->colorspace = avcol_spc_to_mp_csp(ctx->avctx->colorspace);
- sh->color_range = avcol_range_to_mp_csp_levels(ctx->avctx->color_range);
+ ctx->image_params = (struct mp_image_params) {
+ .imgfmt = ctx->best_csp,
+ .w = width,
+ .h = height,
+ // Ideally, we should also set aspect ratio, but we aren't there yet
+ // - so vd.c calculates display size from sh->aspect.
+ .d_w = width,
+ .d_h = height,
+ .colorspace = avcol_spc_to_mp_csp(ctx->avctx->colorspace),
+ .colorlevels = avcol_range_to_mp_csp_levels(ctx->avctx->color_range),
+ };
- if (!mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp))
+ if (mpcodecs_reconfig_vo(sh, &ctx->image_params) < 0)
return -1;
ctx->vo_initialized = 1;
@@ -690,8 +699,8 @@ static int decode(struct sh_video *sh, struct demux_packet *packet,
struct mp_image *mpi = image_from_decoder(sh);
assert(mpi->planes[0]);
- mpi->colorspace = sh->colorspace;
- mpi->levels = sh->color_range;
+ mpi->colorspace = ctx->image_params.colorspace;
+ mpi->levels = ctx->image_params.colorlevels;
*out_image = mpi;
return 1;
@@ -745,7 +754,8 @@ static int control(sh_video_t *sh, int cmd, void *arg)
*(int *)arg = delay;
return CONTROL_TRUE;
case VDCTRL_REINIT_VO:
- mpcodecs_config_vo(sh, sh->disp_w, sh->disp_h, ctx->best_csp);
+ if (ctx->vo_initialized)
+ mpcodecs_reconfig_vo(sh, &ctx->image_params);
return true;
}
return CONTROL_UNKNOWN;