diff options
Diffstat (limited to 'video/decode/vd_lavc.c')
-rw-r--r-- | video/decode/vd_lavc.c | 22 |
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; |