diff mbox

[FFmpeg-devel] vf_scale_npp: move aspect ratio correction after, av_frame_copy_props

Message ID 583A2421.6090305@email.cz
State Accepted
Headers show

Commit Message

Miroslav Slugeň Nov. 27, 2016, 12:09 a.m. UTC
Updating output aspect ratio before calling nppscale_scale has no effect 
because nppscale_scale calls av_frame_copy_props which will overwrite 
output aspect ratio based on source frame.

Simplest solution is to move aspect ratio update after nppscale_scale 
function, but it is also possible to move aspect ratio update directly 
to nppscale_scale function in future.

This should fix aspect ratio bug when using scale_npp for resolution 
with different W/H than original resolution for example 1920x1080 -> 
720x576 and codec which supports dynamic aspect ratio change which is 
libx264, nvenc not yet, that is the reason why that bug was hidden.

Comments

Timo Rothenpieler Nov. 29, 2016, 4:13 p.m. UTC | #1
I'm not technically the maintainer of scale_npp, but this LGTM to me.
Will push with my next batch.
diff mbox

Patch

From 6eb95f381add35de0ae83e826ee8fdeaccf6c31d Mon Sep 17 00:00:00 2001
From: Miroslav Slugen <thunder.m@email.cz>
Date: Sun, 27 Nov 2016 00:58:16 +0100
Subject: [PATCH 1/1] vf_scale_npp: move aspect ratio correction after
 av_frame_copy_props

---
 libavfilter/vf_scale_npp.c | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/libavfilter/vf_scale_npp.c b/libavfilter/vf_scale_npp.c
index 78f541e..3c1d1e9 100644
--- a/libavfilter/vf_scale_npp.c
+++ b/libavfilter/vf_scale_npp.c
@@ -586,11 +586,6 @@  static int nppscale_filter_frame(AVFilterLink *link, AVFrame *in)
         goto fail;
     }
 
-    av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
-              (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w,
-              (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,
-              INT_MAX);
-
     err = device_hwctx->internal->cuda_dl->cuCtxPushCurrent(device_hwctx->cuda_ctx);
     if (err != CUDA_SUCCESS) {
         ret = AVERROR_UNKNOWN;
@@ -603,6 +598,11 @@  static int nppscale_filter_frame(AVFilterLink *link, AVFrame *in)
     if (ret < 0)
         goto fail;
 
+    av_reduce(&out->sample_aspect_ratio.num, &out->sample_aspect_ratio.den,
+              (int64_t)in->sample_aspect_ratio.num * outlink->h * link->w,
+              (int64_t)in->sample_aspect_ratio.den * outlink->w * link->h,
+              INT_MAX);
+
     av_frame_free(&in);
     return ff_filter_frame(outlink, out);
 fail:
-- 
2.1.4