From 3a8daba13dc48ae86bb60cd5ff43d3371b2f0bd5 Mon Sep 17 00:00:00 2001
From: "Huang, Zhengxu" <zhengxu.maxw...@gmail.com>
Date: Thu, 20 Jul 2017 16:16:44 +0800
Subject: [PATCH] lavf/vf_deinterlace_qsv: Enable the qsv deinterlace vpp

The current qsv deinterlace module does not work at all because MSDK needs user 
to pass
extra parameters to enable hint functions,such as 
denoise,deinterlace,composition and so on.

Usage:-hwaccel qsv -r 25 -c:v h264_qsv -i in -vf deinterlace_qsv=bob -b 2M
      -maxrate 3M -c:v h264_qsv -y out.h264

Signed-off-by: ChaoX A Liu <chaox.a....@gmail.com>
Signed-off-by: Zhengxu Huang <zhengxu.maxw...@gmail.com>
Signed-off-by: Andrew Zhang <huazh...@gmail.com>
Change-Id: I9e7ddcf884f2788c2820f6c98affacfb9d8f3287
---
 libavfilter/vf_deinterlace_qsv.c | 24 +++++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c
index 5cda286..cca6fcf 100644
--- a/libavfilter/vf_deinterlace_qsv.c
+++ b/libavfilter/vf_deinterlace_qsv.c
@@ -68,7 +68,9 @@ typedef struct QSVDeintContext {
     int             nb_surface_ptrs;
 
     mfxExtOpaqueSurfaceAlloc opaque_alloc;
-    mfxExtBuffer            *ext_buffers[1];
+    mfxExtVPPDeinterlacing   deint_conf;
+    mfxExtBuffer            *ext_buffers[2];
+    int                      num_ext_buffers;
 
     QSVFrame *work_frames;
 
@@ -76,6 +78,9 @@ typedef struct QSVDeintContext {
 
     int got_output_frame;
     int eof;
+
+    /* option for Deinterlacing algorithm to be used */
+    int mode;
 } QSVDeintContext;
 
 static void qsvdeint_uninit(AVFilterContext *ctx)
@@ -211,6 +216,12 @@ static int init_out_session(AVFilterContext *ctx)
 
     memset(&par, 0, sizeof(par));
 
+    s->deint_conf.Header.BufferId = MFX_EXTBUFF_VPP_DEINTERLACING;
+    s->deint_conf.Header.BufferSz = sizeof(s->deint_conf);
+    s->deint_conf.Mode = s->mode;
+
+    s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer*)&s->deint_conf;
+
     if (opaque) {
         s->surface_ptrs = av_mallocz_array(hw_frames_hwctx->nb_surfaces,
                                            sizeof(*s->surface_ptrs));
@@ -229,10 +240,7 @@ static int init_out_session(AVFilterContext *ctx)
         s->opaque_alloc.Header.BufferId = 
MFX_EXTBUFF_OPAQUE_SURFACE_ALLOCATION;
         s->opaque_alloc.Header.BufferSz = sizeof(s->opaque_alloc);
 
-        s->ext_buffers[0] = (mfxExtBuffer*)&s->opaque_alloc;
-
-        par.ExtParam    = s->ext_buffers;
-        par.NumExtParam = FF_ARRAY_ELEMS(s->ext_buffers);
+        s->ext_buffers[s->num_ext_buffers++] = (mfxExtBuffer*)&s->opaque_alloc;
 
         par.IOPattern = MFX_IOPATTERN_IN_OPAQUE_MEMORY | 
MFX_IOPATTERN_OUT_OPAQUE_MEMORY;
     } else {
@@ -260,6 +268,9 @@ static int init_out_session(AVFilterContext *ctx)
         par.IOPattern = MFX_IOPATTERN_IN_VIDEO_MEMORY | 
MFX_IOPATTERN_OUT_VIDEO_MEMORY;
     }
 
+    par.ExtParam    = s->ext_buffers;
+    par.NumExtParam = s->num_ext_buffers;
+
     par.AsyncDepth = 1;    // TODO async
 
     par.vpp.In = hw_frames_hwctx->surfaces[0].Info;
@@ -534,6 +545,9 @@ static int qsvdeint_request_frame(AVFilterLink *outlink)
 #define OFFSET(x) offsetof(QSVDeintContext, x)
 #define FLAGS AV_OPT_FLAG_VIDEO_PARAM
 static const AVOption options[] = {
+    { "mode", "set deinterlace mode", OFFSET(mode),   AV_OPT_TYPE_INT, {.i64 = 
MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, 
FLAGS, "mode"},
+    { "bob",   "bob algorithm",                  0, AV_OPT_TYPE_CONST,      
{.i64 = MFX_DEINTERLACING_BOB}, MFX_DEINTERLACING_BOB, 
MFX_DEINTERLACING_ADVANCED, FLAGS, "mode"},
+    { "advanced", "Motion adaptive algorithm",   0, AV_OPT_TYPE_CONST, {.i64 = 
MFX_DEINTERLACING_ADVANCED}, MFX_DEINTERLACING_BOB, MFX_DEINTERLACING_ADVANCED, 
FLAGS, "mode"},
     { NULL },
 };
 
-- 
1.8.3.1

_______________________________________________
libav-devel mailing list
libav-devel@libav.org
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to