From patchwork Thu May 28 05:09:34 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Zhang, Guiyong" X-Patchwork-Id: 19917 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 0A3F8449525 for ; Thu, 28 May 2020 08:09:45 +0300 (EEST) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E544F68A427; Thu, 28 May 2020 08:09:44 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from shasxm03.verisilicon.com (shasxm06.verisilicon.com [101.89.135.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4958B689E53 for ; Thu, 28 May 2020 08:09:37 +0300 (EEST) Content-Language: zh-CN DKIM-Signature: v=1; a=rsa-sha256; d=Verisilicon.com; s=default; c=simple/simple; t=1590642576; h=from:subject:to:date:message-id; bh=4HYYU3Mg7XxHM35HMg8OPIDyS5KmpV+MS26l+IKem1w=; b=UO3h71l8Ms3xbXBH0CyyGBvolii/3MHbUdKVkcWyGa/GJ+WuNRe4OOYxabZposKY8J7Je92PyPj R3jCiLGnSqIGv1CUztfENf07W1Xow5pgHwsdOgdGfGERUWGBnWBW41HjOBBdactRL1VJRujguLW9X 0h7LtSAGiIHHqS90UWc= Received: from SHASXM03.verisilicon.com ([fe80::938:4dda:a2f9:38aa]) by SHASXM06.verisilicon.com ([fe80::59a8:ce34:dc14:ddda%16]) with mapi id 14.03.0123.003; Thu, 28 May 2020 13:09:35 +0800 From: "Zhang, Guiyong" To: FFmpeg development discussions and patches Thread-Topic: [PATCH 4/8] avcodec/vp9dec: Add vp9 VPE HW decoder Thread-Index: AdY0ri18Hy5UuZ/tQfez+4g08fSGBw== Date: Thu, 28 May 2020 05:09:34 +0000 Message-ID: <8847CE4FAA78C048A83C2AE8AA751D2770A51A8B@SHASXM03.verisilicon.com> Accept-Language: en-US, zh-CN X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.10.16.140] x-tm-as-product-ver: SMEX-11.0.0.4179-8.100.1062-25446.000 x-tm-as-result: No--9.049900-0.000000-31 x-tm-as-user-approved-sender: Yes x-tm-as-user-blocked-sender: No MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 4/8] avcodec/vp9dec: Add vp9 VPE HW decoder X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" VPE(Video Pipeline Engine) is VeriSilicon's hardware engine for multi formats video encoding and decoding. This decoder uses VPI(VPE Interface) API and library for vp9 decoding. Signed-off-by: Qin.Wang --- 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 diff --git a/configure b/configure index c020c4dd56..1ae89b09bc 100755 --- a/configure +++ b/configure @@ -3130,6 +3130,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 3b0b754417..3631c54473 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -762,6 +762,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 a864939f95..a3c189762a 100644 --- a/libavcodec/allcodecs.c +++ b/libavcodec/allcodecs.c @@ -808,6 +808,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 0000000000..9fd773dabc --- /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, +};