Re: [FFmpeg-devel] [PATCH V2] libavfilter/vaapi: enable vaapi rotation feature via call Intel iHD driver

2018-10-25 Thread sean darcy

On 10/25/18 2:52 AM, Zachary Zhou wrote:

It supports clockwise rotation by 0/90/180/270 degrees defined in
va/va_vpp.h, tested following command line on SKL platform

dir=0 for 0   degree
dir=1 for 90  degree
dir=2 for 180 degree
dir=3 for 270 degree

ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128
-hwaccel_output_format vaapi -i input.264 -vf "rotation_vaapi=dir=1"
-c:v h264_vaapi output.h264

Signed-off-by: Zachary Zhou 
---
  configure |   3 +
  libavfilter/Makefile  |   1 +
  libavfilter/allfilters.c  |   1 +
  libavfilter/vaapi_vpp.h   |   1 +
  libavfilter/vf_rotate_vaapi.c | 252 ++
  5 files changed, 258 insertions(+)
  create mode 100644 libavfilter/vf_rotate_vaapi.c

diff --git a/configure b/configure
index 85d5dd5962..33aced3d78 100755
--- a/configure
+++ b/configure
@@ -6390,6 +6390,9 @@ if enabled vaapi; then
  fi
  
  check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0, 0)"

+if ! check_struct "va/va.h" "struct _VAProcPipelineCaps" rotation_flags; 
then
+disable rotation_vaapi_filter
+fi
  fi
  
  if enabled_all opencl libdrm ; then

diff --git a/libavfilter/Makefile b/libavfilter/Makefile
index 108a2f87d7..534650364a 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -349,6 +349,7 @@ OBJS-$(CONFIG_SETRANGE_FILTER)   += 
vf_setparams.o
  OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o
  OBJS-$(CONFIG_SETTB_FILTER)  += settb.o
  OBJS-$(CONFIG_SHARPNESS_VAAPI_FILTER)+= vf_misc_vaapi.o vaapi_vpp.o
+OBJS-$(CONFIG_ROTATION_VAAPI_FILTER) += vf_rotate_vaapi.o vaapi_vpp.o
  OBJS-$(CONFIG_SHOWINFO_FILTER)   += vf_showinfo.o
  OBJS-$(CONFIG_SHOWPALETTE_FILTER)+= vf_showpalette.o
  OBJS-$(CONFIG_SHUFFLEFRAMES_FILTER)  += vf_shuffleframes.o
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index 557590850b..4b90a7f440 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -333,6 +333,7 @@ extern AVFilter ff_vf_setrange;
  extern AVFilter ff_vf_setsar;
  extern AVFilter ff_vf_settb;
  extern AVFilter ff_vf_sharpness_vaapi;
+extern AVFilter ff_vf_rotation_vaapi;
  extern AVFilter ff_vf_showinfo;
  extern AVFilter ff_vf_showpalette;
  extern AVFilter ff_vf_shuffleframes;
diff --git a/libavfilter/vaapi_vpp.h b/libavfilter/vaapi_vpp.h
index 0bc31018d4..cfe19b689f 100644
--- a/libavfilter/vaapi_vpp.h
+++ b/libavfilter/vaapi_vpp.h
@@ -44,6 +44,7 @@ typedef struct VAAPIVPPContext {
  int output_width;   // computed width
  int output_height;  // computed height
  
+int rotation_state;

  VABufferID filter_buffers[VAProcFilterCount];
  intnb_filter_buffers;
  
diff --git a/libavfilter/vf_rotate_vaapi.c b/libavfilter/vf_rotate_vaapi.c

new file mode 100644
index 00..34c270e9c7
--- /dev/null
+++ b/libavfilter/vf_rotate_vaapi.c
@@ -0,0 +1,252 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+#include 
+
+#include "libavutil/avassert.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "vaapi_vpp.h"
+
+// Rotation angle values
+enum RotationAngle {
+ROTATION_0   = 0,
+ROTATION_90  = 1,
+ROTATION_180 = 2,
+ROTATION_270 = 3,
+
+ROTATION_MIN = ROTATION_0,
+ROTATION_MAX = ROTATION_270,
+ROTATION_DEFAULT = ROTATION_0,
+};
+
+typedef struct RotationVAAPIContext {
+VAAPIVPPContext vpp_ctx; // must be the first field
+
+int rotation;// enable rotation.
+} RotationVAAPIContext;
+
+static int rotation_vaapi_build_filter_params(AVFilterContext *avctx)
+{
+VAAPIVPPContext *vpp_ctx  = avctx->priv;
+RotationVAAPIContext *ctx = avctx->priv;
+
+VAStatus vas;
+int support_flag;
+
+VAProcPipelineCaps pipeline_caps;
+
+memset(&pipeline_caps, 0, sizeof(pipeline_caps));
+vas = vaQueryVideoProcPipelineCaps(vpp_ctx->hwctx->display,
+   vpp_ctx->va_context,
+   NULL, 0,
+   &pipeline_caps);
+if (vas != VA_STATUS_SUCCESS) {
+   

Re: [FFmpeg-devel] [PATCH V2] libavfilter/vaapi: enable vaapi rotation feature via call Intel iHD driver

2018-10-26 Thread sean darcy

On 10/26/18 11:18 AM, Paul B Mahol wrote:

On 10/26/18, Zhou, Zachary  wrote:




-Original Message-
From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On Behalf Of
Rostislav Pehlivanov
Sent: Friday, October 26, 2018 9:02 PM
To: FFmpeg development discussions and patches 
Subject: Re: [FFmpeg-devel] [PATCH V2] libavfilter/vaapi: enable vaapi
rotation feature via call Intel iHD driver

On Fri, 26 Oct 2018 at 04:10, Zhou, Zachary 
wrote:





-Original Message-
From: ffmpeg-devel [mailto:ffmpeg-devel-boun...@ffmpeg.org] On
Behalf Of sean darcy
Sent: Thursday, October 25, 2018 11:51 PM
To: ffmpeg-devel@ffmpeg.org
Subject: Re: [FFmpeg-devel] [PATCH V2] libavfilter/vaapi: enable
vaapi rotation feature via call Intel iHD driver

On 10/25/18 2:52 AM, Zachary Zhou wrote:

It supports clockwise rotation by 0/90/180/270 degrees defined in
va/va_vpp.h, tested following command line on SKL platform

dir=0 for 0   degree
dir=1 for 90  degree
dir=2 for 180 degree
dir=3 for 270 degree

ffmpeg -hwaccel vaapi -vaapi_device /dev/dri/renderD128
-hwaccel_output_format vaapi -i input.264 -vf
"rotation_vaapi=dir=1"
-c:v h264_vaapi output.h264

Signed-off-by: Zachary Zhou 
---
   configure |   3 +
   libavfilter/Makefile  |   1 +
   libavfilter/allfilters.c  |   1 +
   libavfilter/vaapi_vpp.h   |   1 +
   libavfilter/vf_rotate_vaapi.c | 252

++

   5 files changed, 258 insertions(+)
   create mode 100644 libavfilter/vf_rotate_vaapi.c

diff --git a/configure b/configure index 85d5dd5962..33aced3d78
100755
--- a/configure
+++ b/configure
@@ -6390,6 +6390,9 @@ if enabled vaapi; then
   fi

   check_cpp_condition vaapi_1 "va/va.h" "VA_CHECK_VERSION(1, 0,

0)"

+if ! check_struct "va/va.h" "struct _VAProcPipelineCaps"

rotation_flags;

then

+disable rotation_vaapi_filter
+fi
   fi

   if enabled_all opencl libdrm ; then diff --git
a/libavfilter/Makefile b/libavfilter/Makefile index
108a2f87d7..534650364a 100644
--- a/libavfilter/Makefile
+++ b/libavfilter/Makefile
@@ -349,6 +349,7 @@ OBJS-$(CONFIG_SETRANGE_FILTER)   +=

vf_setparams.o

   OBJS-$(CONFIG_SETSAR_FILTER) += vf_aspect.o
   OBJS-$(CONFIG_SETTB_FILTER)  += settb.o
   OBJS-$(CONFIG_SHARPNESS_VAAPI_FILTER)+= vf_misc_vaapi.o

vaapi_vpp.o

+OBJS-$(CONFIG_ROTATION_VAAPI_FILTER) += vf_rotate_vaapi.o

vaapi_vpp.o

   OBJS-$(CONFIG_SHOWINFO_FILTER)   += vf_showinfo.o
   OBJS-$(CONFIG_SHOWPALETTE_FILTER)+= vf_showpalette.o
   OBJS-$(CONFIG_SHUFFLEFRAMES_FILTER)  +=
vf_shuffleframes.o
diff --git a/libavfilter/allfilters.c b/libavfilter/allfilters.c
index
557590850b..4b90a7f440 100644
--- a/libavfilter/allfilters.c
+++ b/libavfilter/allfilters.c
@@ -333,6 +333,7 @@ extern AVFilter ff_vf_setrange;
   extern AVFilter ff_vf_setsar;
   extern AVFilter ff_vf_settb;
   extern AVFilter ff_vf_sharpness_vaapi;
+extern AVFilter ff_vf_rotation_vaapi;
   extern AVFilter ff_vf_showinfo;
   extern AVFilter ff_vf_showpalette;
   extern AVFilter ff_vf_shuffleframes; diff --git
a/libavfilter/vaapi_vpp.h b/libavfilter/vaapi_vpp.h index
0bc31018d4..cfe19b689f 100644
--- a/libavfilter/vaapi_vpp.h
+++ b/libavfilter/vaapi_vpp.h
@@ -44,6 +44,7 @@ typedef struct VAAPIVPPContext {
   int output_width;   // computed width
   int output_height;  // computed height

+int rotation_state;
   VABufferID filter_buffers[VAProcFilterCount];
   intnb_filter_buffers;

diff --git a/libavfilter/vf_rotate_vaapi.c
b/libavfilter/vf_rotate_vaapi.c new file mode 100644 index
00..34c270e9c7
--- /dev/null
+++ b/libavfilter/vf_rotate_vaapi.c
@@ -0,0 +1,252 @@
+/*
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later
version.
+ *
+ * FFmpeg is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

GNU

+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+Public
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+02110-1301 USA  */ #include 
+
+#include "libavutil/avassert.h"
+#include "libavutil/mem.h"
+#include "libavutil/opt.h"
+#include "libavutil/pixdesc.h"
+
+#include "avfilter.h"
+#include "formats.h"
+#include "internal.h"
+#include "vaapi_vpp.h"
+
+// Rotation angle values
+enum RotationAngle {
+ROTATION_0   = 0,
+ROTATION