diff mbox series

[FFmpeg-devel,v2,4/8] avcodec/vp9dec: Add vp9 VPE HW decoder

Message ID 8847CE4FAA78C048A83C2AE8AA751D2770A5373C@SHASXM03.verisilicon.com
State New
Headers show
Series [FFmpeg-devel,v2,1/8] avutil/hwcontext: Add VPE implementation
Related show

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Zhang, Guiyong May 31, 2020, 6:27 a.m. UTC
This decoder uses VPI(VPE Interface) API and library for vp9 decoding.

Signed-off-by: Qin.Wang <Qin.Wang@verisilicon.com>
---
 configure               |  1 +
 libavcodec/Makefile     |  1 +
 libavcodec/allcodecs.c  |  1 +
 libavcodec/vpe_vp9dec.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 70 insertions(+)
 create mode 100755 libavcodec/vpe_vp9dec.c

--
1.8.3.1
diff mbox series

Patch

diff --git a/configure b/configure
index 129a4ee..f116c37 100755
--- a/configure
+++ b/configure
@@ -3131,6 +3131,7 @@  vp9_vaapi_encoder_select="vaapi_encode"
 vp9_qsv_encoder_deps="libmfx MFX_CODEC_VP9"
 vp9_qsv_encoder_select="qsvenc"
 vp9_v4l2m2m_decoder_deps="v4l2_m2m vp9_v4l2_m2m"
+vp9_vpe_decoder_deps="vpe"
 wmv3_crystalhd_decoder_select="crystalhd"

 # parsers
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 3193b32..6b59ae7 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -763,6 +763,7 @@  OBJS-$(CONFIG_ZMBV_DECODER)            += zmbv.o
 OBJS-$(CONFIG_ZMBV_ENCODER)            += zmbvenc.o
 OBJS-$(CONFIG_H264_VPE_DECODER)        += vpe_h264dec.o vpe_dec_common.o
 OBJS-$(CONFIG_HEVC_VPE_DECODER)        += vpe_hevcdec.o vpe_dec_common.o
+OBJS-$(CONFIG_VP9_VPE_DECODER)         += vpe_vp9dec.o vpe_dec_common.o

 # (AD)PCM decoders/encoders
 OBJS-$(CONFIG_PCM_ALAW_DECODER)           += pcm.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index ae5a791..5c5c32e 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -810,6 +810,7 @@  extern AVCodec ff_vp9_vaapi_encoder;
 extern AVCodec ff_vp9_qsv_encoder;
 extern AVCodec ff_h264_vpe_decoder;
 extern AVCodec ff_hevc_vpe_decoder;
+extern AVCodec ff_vp9_vpe_decoder;

 // The iterate API is not usable with ossfuzz due to the excessive size of binaries created
 #if CONFIG_OSSFUZZ
diff --git a/libavcodec/vpe_vp9dec.c b/libavcodec/vpe_vp9dec.c
new file mode 100755
index 0000000..9fd773d
--- /dev/null
+++ b/libavcodec/vpe_vp9dec.c
@@ -0,0 +1,67 @@ 
+/*
+ * Verisilicon VPE VP9 Decoder
+ *
+ * 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 "hwconfig.h"
+#include "internal.h"
+#include "libavutil/pixfmt.h"
+
+#include "vpe_dec_common.h"
+
+static av_cold int vpe_vp9_decode_init(AVCodecContext *avctx)
+{
+    return ff_vpe_decode_init(avctx, VP9DEC_VPE);
+}
+
+static const AVClass vpe_vp9_decode_class = {
+    .class_name = "vp9d_vpe",
+    .item_name  = av_default_item_name,
+    .option     = vpe_decode_options,
+    .version    = LIBAVUTIL_VERSION_INT,
+};
+
+static const AVCodecHWConfigInternal *vpe_hw_configs[] =
+    { &(const AVCodecHWConfigInternal){
+          .public =
+              {
+                  .pix_fmt = AV_PIX_FMT_VPE,
+                  .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX |
+                             AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX,
+                  .device_type = AV_HWDEVICE_TYPE_VPE,
+              },
+          .hwaccel = NULL,
+      },
+      NULL };
+
+AVCodec ff_vp9_vpe_decoder = {
+    .name           = "vp9_vpe",
+    .long_name      = NULL_IF_CONFIG_SMALL("VP9 (VPE VC8000D)"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_VP9,
+    .priv_data_size = sizeof(VpeDecCtx),
+    .init           = &vpe_vp9_decode_init,
+    .receive_frame  = &ff_vpe_decode_receive_frame,
+    .close          = &ff_vpe_decode_close,
+    .priv_class     = &vpe_vp9_decode_class,
+    .capabilities =
+        AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | AV_CODEC_CAP_AVOID_PROBING,
+    .caps_internal  = FF_CODEC_CAP_INIT_CLEANUP,
+    .pix_fmts       = (const enum AVPixelFormat[]){ AV_PIX_FMT_VPE, AV_PIX_FMT_NONE },
+    .hw_configs     = vpe_hw_configs,
+};