lavf/qsvvpp: bypass vpp is not needed.

Message ID 1522230007-30823-1-git-send-email-zhong.li@intel.com
State New
Headers show
Series
  • lavf/qsvvpp: bypass vpp is not needed.
Related show

Commit Message

Li, Zhong March 28, 2018, 9:40 a.m.
It is benefit to performance for specific case.

Signed-off-by: Zhong Li <zhong.li@intel.com>
---
 libavfilter/vf_vpp_qsv.c | 28 +++++++++++++++++++++++++---
 1 file changed, 25 insertions(+), 3 deletions(-)

Comments

Luca Barbato March 28, 2018, 10:01 a.m. | #1
On 28/03/2018 11:40, Zhong Li wrote:
> It is benefit to performance for specific case.
> 
> Signed-off-by: Zhong Li <zhong.li@intel.com>
> ---
>   libavfilter/vf_vpp_qsv.c | 28 +++++++++++++++++++++++++---
>   1 file changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c
> index 610e821..568dee5 100644
> --- a/libavfilter/vf_vpp_qsv.c
> +++ b/libavfilter/vf_vpp_qsv.c
> @@ -27,6 +27,7 @@
>   #include "libavutil/eval.h"
>   #include "libavutil/avassert.h"
>   #include "libavutil/pixdesc.h"
> +#include "libavutil/mathematics.h"
>   
>   #include "formats.h"
>   #include "internal.h"
> @@ -249,6 +250,7 @@ static int config_output(AVFilterLink *outlink)
>       QSVVPPParam     param = { NULL };
>       QSVVPPCrop      crop  = { 0 };
>       mfxExtBuffer    *ext_buf[ENH_FILTERS_COUNT];
> +    AVFilterLink    *inlink = ctx->inputs[0];
>   
>       outlink->w          = vpp->out_width;
>       outlink->h          = vpp->out_height;
> @@ -320,14 +322,34 @@ static int config_output(AVFilterLink *outlink)
>           param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf;
>       }
>   
> -    return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
> +    if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
> +        vpp->detail || vpp->procamp || inlink->w != outlink->w || inlink->h != outlink->h)
> +        return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
> +    else {
> +        av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n");
> +        if (inlink->hw_frames_ctx)
> +            outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
> +    }
> +
> +    return 0;
>   }
>   
>   static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
>   {
> -    VPPContext *vpp = inlink->dst->priv;
> +    int              ret = 0;
> +    AVFilterContext  *ctx = inlink->dst;
> +    VPPContext       *vpp = inlink->dst->priv;
> +    AVFilterLink     *outlink = ctx->outputs[0];
> +
> +    if (vpp->qsv)
> +        ret = ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref);
> +    else {
> +        if (picref->pts != AV_NOPTS_VALUE)
> +            picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base);
> +        ret = ff_filter_frame(outlink, picref);
> +    }
>   
> -    return ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref);
> +    return ret;
>   }
>   
>   static int query_formats(AVFilterContext *ctx)
> 

Sounds fine.
Diego Biurrun March 28, 2018, 4:56 p.m. | #2
On Wed, Mar 28, 2018 at 05:40:07PM +0800, Zhong Li wrote:
> It is benefit to performance for specific case.

"i_F_ not needed" is what you were trying to say I guess.

Diego
Li, Zhong March 29, 2018, 1:34 p.m. | #3
> From: libav-devel [mailto:libav-devel-bounces@libav.org] On Behalf Of
> Diego Biurrun
> Sent: Thursday, March 29, 2018 12:56 AM
> To: libav development <libav-devel@libav.org>
> Subject: Re: [libav-devel] [PATCH] lavf/qsvvpp: bypass vpp is not needed.
> 
> On Wed, Mar 28, 2018 at 05:40:07PM +0800, Zhong Li wrote:
> > It is benefit to performance for specific case.
> 
> "i_F_ not needed" is what you were trying to say I guess.
> 
> Diego
Exactly! Thanks for review. Will update it.

Patch

diff --git a/libavfilter/vf_vpp_qsv.c b/libavfilter/vf_vpp_qsv.c
index 610e821..568dee5 100644
--- a/libavfilter/vf_vpp_qsv.c
+++ b/libavfilter/vf_vpp_qsv.c
@@ -27,6 +27,7 @@ 
 #include "libavutil/eval.h"
 #include "libavutil/avassert.h"
 #include "libavutil/pixdesc.h"
+#include "libavutil/mathematics.h"
 
 #include "formats.h"
 #include "internal.h"
@@ -249,6 +250,7 @@  static int config_output(AVFilterLink *outlink)
     QSVVPPParam     param = { NULL };
     QSVVPPCrop      crop  = { 0 };
     mfxExtBuffer    *ext_buf[ENH_FILTERS_COUNT];
+    AVFilterLink    *inlink = ctx->inputs[0];
 
     outlink->w          = vpp->out_width;
     outlink->h          = vpp->out_height;
@@ -320,14 +322,34 @@  static int config_output(AVFilterLink *outlink)
         param.ext_buf[param.num_ext_buf++] = (mfxExtBuffer*)&vpp->procamp_conf;
     }
 
-    return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
+    if (vpp->use_frc || vpp->use_crop || vpp->deinterlace || vpp->denoise ||
+        vpp->detail || vpp->procamp || inlink->w != outlink->w || inlink->h != outlink->h)
+        return ff_qsvvpp_create(ctx, &vpp->qsv, &param);
+    else {
+        av_log(ctx, AV_LOG_VERBOSE, "qsv vpp pass through mode.\n");
+        if (inlink->hw_frames_ctx)
+            outlink->hw_frames_ctx = av_buffer_ref(inlink->hw_frames_ctx);
+    }
+
+    return 0;
 }
 
 static int filter_frame(AVFilterLink *inlink, AVFrame *picref)
 {
-    VPPContext *vpp = inlink->dst->priv;
+    int              ret = 0;
+    AVFilterContext  *ctx = inlink->dst;
+    VPPContext       *vpp = inlink->dst->priv;
+    AVFilterLink     *outlink = ctx->outputs[0];
+
+    if (vpp->qsv)
+        ret = ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref);
+    else {
+        if (picref->pts != AV_NOPTS_VALUE)
+            picref->pts = av_rescale_q(picref->pts, inlink->time_base, outlink->time_base);
+        ret = ff_filter_frame(outlink, picref);
+    }
 
-    return ff_qsvvpp_filter_frame(vpp->qsv, inlink, picref);
+    return ret;
 }
 
 static int query_formats(AVFilterContext *ctx)