diff mbox series

[FFmpeg-devel,v2,3/8] avcodec/hevcdec: Add hevc VPE HW decoder

Message ID 8847CE4FAA78C048A83C2AE8AA751D2770A5372F@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 hevc decoding.

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

--
1.8.3.1
diff mbox series

Patch

diff --git a/configure b/configure
index 196842a..129a4ee 100755
--- a/configure
+++ b/configure
@@ -3081,6 +3081,7 @@  hevc_vaapi_encoder_select="cbs_h265 vaapi_encode"
 hevc_v4l2m2m_decoder_deps="v4l2_m2m hevc_v4l2_m2m"
 hevc_v4l2m2m_decoder_select="hevc_mp4toannexb_bsf"
 hevc_v4l2m2m_encoder_deps="v4l2_m2m hevc_v4l2_m2m"
+hevc_vpe_decoder_deps="vpe"
 mjpeg_cuvid_decoder_deps="cuvid"
 mjpeg_qsv_decoder_select="qsvdec"
 mjpeg_qsv_encoder_deps="libmfx"
diff --git a/libavcodec/Makefile b/libavcodec/Makefile
index 0c80880..3193b32 100644
--- a/libavcodec/Makefile
+++ b/libavcodec/Makefile
@@ -762,6 +762,7 @@  OBJS-$(CONFIG_ZLIB_ENCODER)            += lclenc.o
 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

 # (AD)PCM decoders/encoders
 OBJS-$(CONFIG_PCM_ALAW_DECODER)           += pcm.o
diff --git a/libavcodec/allcodecs.c b/libavcodec/allcodecs.c
index 32f6fd6..ae5a791 100644
--- a/libavcodec/allcodecs.c
+++ b/libavcodec/allcodecs.c
@@ -809,6 +809,7 @@  extern AVCodec ff_vp9_qsv_decoder;
 extern AVCodec ff_vp9_vaapi_encoder;
 extern AVCodec ff_vp9_qsv_encoder;
 extern AVCodec ff_h264_vpe_decoder;
+extern AVCodec ff_hevc_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_hevcdec.c b/libavcodec/vpe_hevcdec.c
new file mode 100755
index 0000000..0c5a9df
--- /dev/null
+++ b/libavcodec/vpe_hevcdec.c
@@ -0,0 +1,69 @@ 
+/*
+ * Verisilicon VPE HEVC 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_hevc_decode_init(AVCodecContext *avctx)
+{
+    return ff_vpe_decode_init(avctx, HEVCDEC_VPE);
+}
+
+static const AVClass vpe_hevc_decode_class = {
+    .class_name = "hevcd_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_hevc_vpe_decoder = {
+    .name           = "hevc_vpe",
+    .long_name      = NULL_IF_CONFIG_SMALL("HEVC (VPE VC8000D)"),
+    .type           = AVMEDIA_TYPE_VIDEO,
+    .id             = AV_CODEC_ID_HEVC,
+    .priv_data_size = sizeof(VpeDecCtx),
+    .init           = &vpe_hevc_decode_init,
+    .receive_frame  = &ff_vpe_decode_receive_frame,
+    .close          = &ff_vpe_decode_close,
+    .priv_class     = &vpe_hevc_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,
+    .wrapper_name   = "vpe",
+    .bsfs           = "hevc_mp4toannexb",
+};