From 9a55c4e70cebe6da6b7c7796119f84c4c9ad2a60 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 26 Sep 2013 16:53:17 +0200 Subject: video: let sh_video->aspect always be container aspect ratio Now writing -1 to the 'aspect' property resets the video to the auto aspect ratio. Returning the aspect from the property becomes a bit more complicated, because we still try to return the container aspect ratio if no frame has been decoded yet. --- video/decode/vd.c | 11 ++++++----- video/decode/vd_lavc.c | 14 ++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) (limited to 'video') diff --git a/video/decode/vd.c b/video/decode/vd.c index ad2af3a2cd..574f0468d4 100644 --- a/video/decode/vd.c +++ b/video/decode/vd.c @@ -115,12 +115,13 @@ int mpcodecs_reconfig_vo(sh_video_t *sh, const struct mp_image_params *params) } // time to do aspect ratio corrections... - if (opts->movie_aspect > -1.0) - sh->aspect = opts->movie_aspect; // cmdline overrides autodetect - else if (sh->stream_aspect != 0.0) - sh->aspect = sh->stream_aspect; + float force_aspect = opts->movie_aspect; + if (force_aspect > -1.0 && sh->stream_aspect != 0.0) + force_aspect = sh->stream_aspect; + + if (force_aspect >= 0) + vf_set_dar(&p.d_w, &p.d_h, p.w, p.h, force_aspect); - vf_set_dar(&p.d_w, &p.d_h, p.w, p.h, sh->aspect); if (abs(p.d_w - p.w) >= 4 || abs(p.d_h - p.h) >= 4) { mp_tmsg(MSGT_CPLAYER, MSGL_V, "Aspect ratio is %.2f:1 - " "scaling to correct movie aspect.\n", sh->aspect); diff --git a/video/decode/vd_lavc.c b/video/decode/vd_lavc.c index 7fbf9d8401..86c1c92541 100644 --- a/video/decode/vd_lavc.c +++ b/video/decode/vd_lavc.c @@ -492,8 +492,9 @@ static void update_image_params(sh_video_t *sh, AVFrame *frame) // But set it even if the sample aspect did not change, since a // resolution change can cause an aspect change even if the // _sample_ aspect is unchanged. - if (sh->aspect == 0 || ctx->last_sample_aspect_ratio.den) - sh->aspect = aspect; + float use_aspect = sh->aspect; + if (use_aspect == 0 || ctx->last_sample_aspect_ratio.den) + use_aspect = aspect; ctx->last_sample_aspect_ratio = frame->sample_aspect_ratio; sh->disp_w = width; sh->disp_h = height; @@ -501,14 +502,15 @@ static void update_image_params(sh_video_t *sh, AVFrame *frame) ctx->pix_fmt = pix_fmt; ctx->best_csp = pixfmt2imgfmt(pix_fmt); + int d_w, d_h; + vf_set_dar(&d_w, &d_h, width, height, use_aspect); + 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, + .d_w = d_w, + .d_h = d_h, .colorspace = avcol_spc_to_mp_csp(ctx->avctx->colorspace), .colorlevels = avcol_range_to_mp_csp_levels(ctx->avctx->color_range), .chroma_location = -- cgit v1.2.3