From patchwork Thu Nov 26 10:20:22 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xu, Guangxin" X-Patchwork-Id: 24041 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 8F6CB44A323 for ; Thu, 26 Nov 2020 12:21:08 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 7145268B924; Thu, 26 Nov 2020 12:21:08 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3198968B748 for ; Thu, 26 Nov 2020 12:21:01 +0200 (EET) IronPort-SDR: DQAx3DA3NFh9Yf4oV5AiY4WhsEWqq/EZEYCsf9mOESkgcOWemeGwHR/TFLzJA0iJSqF2+zeQHF q6eZ7KvgsmEQ== X-IronPort-AV: E=McAfee;i="6000,8403,9816"; a="171487030" X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="171487030" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2020 02:20:59 -0800 IronPort-SDR: R4HQj0v7uDLCnnjUOv7xCA6HqyOj/gCOx7WDByTc0R8H4x3ReI8pvH0Kw12Q/Ye/EGPY3qoo02 KKTDLgw6qH0Q== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="362756167" Received: from skl-e5-server.sh.intel.com ([10.239.43.170]) by fmsmga004.fm.intel.com with ESMTP; 26 Nov 2020 02:20:58 -0800 From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Nov 2020 18:20:22 +0800 Message-Id: <20201126102026.27202-1-guangxin.xu@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 1/5] avcodec/qsvdec_other: refact, use DEFINE_QSV_DECODER to remove duplicate code 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 Cc: Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/qsvdec_other.c | 188 ++++++++------------------------------ 1 file changed, 36 insertions(+), 152 deletions(-) diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c index 2775e07955..266ac9f2e5 100644 --- a/libavcodec/qsvdec_other.c +++ b/libavcodec/qsvdec_other.c @@ -189,170 +189,54 @@ static const AVOption options[] = { { NULL }, }; -#if CONFIG_MPEG2_QSV_DECODER -static const AVClass mpeg2_qsv_class = { - .class_name = "mpeg2_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; +#define DEFINE_QSV_DECODER(x, X, bsf_name) \ +static const AVClass x##_qsv_class = { \ + .class_name = #x "_qsv", \ + .item_name = av_default_item_name, \ + .option = options, \ + .version = LIBAVUTIL_VERSION_INT, \ +}; \ +AVCodec ff_##x##_qsv_decoder = { \ + .name = #x "_qsv", \ + .long_name = NULL_IF_CONFIG_SMALL(#X " video (Intel Quick Sync Video acceleration)"), \ + .priv_data_size = sizeof(QSVOtherContext), \ + .type = AVMEDIA_TYPE_VIDEO, \ + .id = AV_CODEC_ID_##X, \ + .init = qsv_decode_init, \ + .decode = qsv_decode_frame, \ + .flush = qsv_decode_flush, \ + .close = qsv_decode_close, \ + .bsfs = bsf_name, \ + .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, \ + .priv_class = &x##_qsv_class, \ + .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ + AV_PIX_FMT_P010, \ + AV_PIX_FMT_QSV, \ + AV_PIX_FMT_NONE }, \ + .hw_configs = ff_qsv_hw_configs, \ + .wrapper_name = "qsv", \ +}; \ -AVCodec ff_mpeg2_qsv_decoder = { - .name = "mpeg2_qsv", - .long_name = NULL_IF_CONFIG_SMALL("MPEG-2 video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_MPEG2VIDEO, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &mpeg2_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .wrapper_name = "qsv", -}; +#if CONFIG_MPEG2_QSV_DECODER +DEFINE_QSV_DECODER(mpeg2, MPEG2VIDEO, NULL) #endif #if CONFIG_VC1_QSV_DECODER -static const AVClass vc1_qsv_class = { - .class_name = "vc1_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_vc1_qsv_decoder = { - .name = "vc1_qsv", - .long_name = NULL_IF_CONFIG_SMALL("VC-1 video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_VC1, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &vc1_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .wrapper_name = "qsv", -}; -#endif - -#if CONFIG_VP8_QSV_DECODER -static const AVClass vp8_qsv_class = { - .class_name = "vp8_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_vp8_qsv_decoder = { - .name = "vp8_qsv", - .long_name = NULL_IF_CONFIG_SMALL("VP8 video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_VP8, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &vp8_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .wrapper_name = "qsv", -}; +DEFINE_QSV_DECODER(vc1, VC1, NULL) #endif #if CONFIG_MJPEG_QSV_DECODER -static const AVClass mjpeg_qsv_class = { - .class_name = "mjpeg_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; +DEFINE_QSV_DECODER(mjpeg, MJPEG, NULL) +#endif -AVCodec ff_mjpeg_qsv_decoder = { - .name = "mjpeg_qsv", - .long_name = NULL_IF_CONFIG_SMALL("MJPEG video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_MJPEG, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &mjpeg_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, -}; +#if CONFIG_VP8_QSV_DECODER +DEFINE_QSV_DECODER(vp8, VP8, NULL) #endif #if CONFIG_VP9_QSV_DECODER -static const AVClass vp9_qsv_class = { - .class_name = "vp9_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_vp9_qsv_decoder = { - .name = "vp9_qsv", - .long_name = NULL_IF_CONFIG_SMALL("VP9 video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_VP9, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &vp9_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_P010, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .wrapper_name = "qsv", -}; +DEFINE_QSV_DECODER(vp9, VP9, NULL) #endif #if CONFIG_AV1_QSV_DECODER -static const AVClass av1_qsv_class = { - .class_name = "av1_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_av1_qsv_decoder = { - .name = "av1_qsv", - .long_name = NULL_IF_CONFIG_SMALL("AV1 video (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVOtherContext), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_AV1, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &av1_qsv_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_P010, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .wrapper_name = "qsv", -}; +DEFINE_QSV_DECODER(av1, AV1, NULL) #endif From patchwork Thu Nov 26 10:20:23 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xu, Guangxin" X-Patchwork-Id: 24042 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 B5BA144A323 for ; Thu, 26 Nov 2020 12:21:13 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 91F5D68B916; Thu, 26 Nov 2020 12:21:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 16CD968B915 for ; Thu, 26 Nov 2020 12:21:02 +0200 (EET) IronPort-SDR: j5LwKeKprow9PJc5nQuXe3Ix/efYZagg57G2fC2Ub2SZd0tT/LdTZNM3QoWo4VADL5irSTDYlj dW4+/ckUwtew== X-IronPort-AV: E=McAfee;i="6000,8403,9816"; a="171487031" X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="171487031" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2020 02:21:00 -0800 IronPort-SDR: /QR1uHpY7b9OulHaiR+XaIBojtGzuborWlOtbGFcZnkRBWcWzpP/9qM+MyO3Rlj1wzrs+IYbWF MA6gcjx7Zm2g== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="362756171" Received: from skl-e5-server.sh.intel.com ([10.239.43.170]) by fmsmga004.fm.intel.com with ESMTP; 26 Nov 2020 02:20:59 -0800 From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Nov 2020 18:20:23 +0800 Message-Id: <20201126102026.27202-2-guangxin.xu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201126102026.27202-1-guangxin.xu@intel.com> References: <20201126102026.27202-1-guangxin.xu@intel.com> Subject: [FFmpeg-devel] [PATCH 2/5] avcodec/qsvdec_h2645: refact, use DEFINE_QSV_DECODER to remove duplicate code 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 Cc: Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/qsvdec_h2645.c | 89 +++++++++++++++------------------------ 1 file changed, 33 insertions(+), 56 deletions(-) diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c index 02c41883b6..b0ab23a922 100644 --- a/libavcodec/qsvdec_h2645.c +++ b/libavcodec/qsvdec_h2645.c @@ -182,6 +182,36 @@ static void qsv_decode_flush(AVCodecContext *avctx) #define OFFSET(x) offsetof(QSVH2645Context, x) #define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM +#define DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, opt) \ +static const AVClass x##_qsv_class = { \ + .class_name = #x "_qsv", \ + .item_name = av_default_item_name, \ + .option = opt, \ + .version = LIBAVUTIL_VERSION_INT, \ +}; \ +AVCodec ff_##x##_qsv_decoder = { \ + .name = #x "_qsv", \ + .long_name = NULL_IF_CONFIG_SMALL(#X " video (Intel Quick Sync Video acceleration)"), \ + .priv_data_size = sizeof(QSVH2645Context), \ + .type = AVMEDIA_TYPE_VIDEO, \ + .id = AV_CODEC_ID_##X, \ + .init = qsv_decode_init, \ + .decode = qsv_decode_frame, \ + .flush = qsv_decode_flush, \ + .close = qsv_decode_close, \ + .bsfs = bsf_name, \ + .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, \ + .priv_class = &x##_qsv_class, \ + .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ + AV_PIX_FMT_P010, \ + AV_PIX_FMT_QSV, \ + AV_PIX_FMT_NONE }, \ + .hw_configs = ff_qsv_hw_configs, \ + .wrapper_name = "qsv", \ +}; \ + +#define DEFINE_QSV_DECODER(x, X, bsf_name) DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, options) + #if CONFIG_HEVC_QSV_DECODER static const AVOption hevc_options[] = { { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, @@ -200,37 +230,9 @@ static const AVOption hevc_options[] = { { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, { NULL }, }; - -static const AVClass hevc_class = { - .class_name = "hevc_qsv", - .item_name = av_default_item_name, - .option = hevc_options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_hevc_qsv_decoder = { - .name = "hevc_qsv", - .long_name = NULL_IF_CONFIG_SMALL("HEVC (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVH2645Context), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_HEVC, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &hevc_class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_P010, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .bsfs = "hevc_mp4toannexb", - .wrapper_name = "qsv", -}; +DEFINE_QSV_DECODER_WITH_OPTION(hevc, HEVC, "hevc_mp4toannexb", hevc_options) #endif -#if CONFIG_H264_QSV_DECODER static const AVOption options[] = { { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, @@ -241,31 +243,6 @@ static const AVOption options[] = { { NULL }, }; -static const AVClass class = { - .class_name = "h264_qsv", - .item_name = av_default_item_name, - .option = options, - .version = LIBAVUTIL_VERSION_INT, -}; - -AVCodec ff_h264_qsv_decoder = { - .name = "h264_qsv", - .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 (Intel Quick Sync Video acceleration)"), - .priv_data_size = sizeof(QSVH2645Context), - .type = AVMEDIA_TYPE_VIDEO, - .id = AV_CODEC_ID_H264, - .init = qsv_decode_init, - .decode = qsv_decode_frame, - .flush = qsv_decode_flush, - .close = qsv_decode_close, - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, - .priv_class = &class, - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, - AV_PIX_FMT_P010, - AV_PIX_FMT_QSV, - AV_PIX_FMT_NONE }, - .hw_configs = ff_qsv_hw_configs, - .bsfs = "h264_mp4toannexb", - .wrapper_name = "qsv", -}; +#if CONFIG_H264_QSV_DECODER +DEFINE_QSV_DECODER(h264, H264, "h264_mp4toannexb") #endif From patchwork Thu Nov 26 10:20:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xu, Guangxin" X-Patchwork-Id: 24043 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 BDF1344A323 for ; Thu, 26 Nov 2020 12:21:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AB97D68B966; Thu, 26 Nov 2020 12:21:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id E562468B920 for ; Thu, 26 Nov 2020 12:21:04 +0200 (EET) IronPort-SDR: shTjLWmnL2/oiYH7ijBX5xSyJ2wKbvQlFrfElDStmNNVqWXNEoMjUAVo3eecjVsPw/6CT4y35I 75gjj2YtGmvQ== X-IronPort-AV: E=McAfee;i="6000,8403,9816"; a="171487034" X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="171487034" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2020 02:21:01 -0800 IronPort-SDR: 0P9FMLYNU0fXVtqsyO6cR8jU/8+fZk2H3MxMb6IoKgwQ/CFBtxDUZxaOR7EaHT4hgryP3qsFzD UCKkJ6kAxtjg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="362756179" Received: from skl-e5-server.sh.intel.com ([10.239.43.170]) by fmsmga004.fm.intel.com with ESMTP; 26 Nov 2020 02:21:00 -0800 From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Nov 2020 18:20:24 +0800 Message-Id: <20201126102026.27202-3-guangxin.xu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201126102026.27202-1-guangxin.xu@intel.com> References: <20201126102026.27202-1-guangxin.xu@intel.com> Subject: [FFmpeg-devel] [PATCH 3/5] avcodec/qsvdec: refact, move qsvdec_h2645.c to qsvdec.c 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 Cc: Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/Makefile | 8 +- libavcodec/qsvdec.c | 215 ++++++++++++++++++++++++++++++++- libavcodec/qsvdec_h2645.c | 248 -------------------------------------- 3 files changed, 217 insertions(+), 254 deletions(-) delete mode 100644 libavcodec/qsvdec_h2645.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index a6435c9e85..3ee8aa7f86 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -374,7 +374,7 @@ OBJS-$(CONFIG_H264_NVENC_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_NVENC_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_NVENC_H264_ENCODER) += nvenc_h264.o OBJS-$(CONFIG_H264_OMX_ENCODER) += omx.o -OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h2645.o +OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o OBJS-$(CONFIG_H264_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_H264_VAAPI_ENCODER) += vaapi_encode_h264.o h264_levels.o @@ -394,7 +394,7 @@ OBJS-$(CONFIG_HEVC_MEDIACODEC_DECODER) += mediacodecdec.o OBJS-$(CONFIG_HEVC_MF_ENCODER) += mfenc.o mf_utils.o OBJS-$(CONFIG_HEVC_NVENC_ENCODER) += nvenc_hevc.o OBJS-$(CONFIG_NVENC_HEVC_ENCODER) += nvenc_hevc.o -OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec_h2645.o +OBJS-$(CONFIG_HEVC_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_HEVC_QSV_ENCODER) += qsvenc_hevc.o hevc_ps_enc.o \ hevc_data.o OBJS-$(CONFIG_HEVC_RKMPP_DECODER) += rkmppdec.o @@ -922,14 +922,14 @@ OBJS-$(CONFIG_H263_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_H264_D3D11VA_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_DXVA2_HWACCEL) += dxva2_h264.o OBJS-$(CONFIG_H264_NVDEC_HWACCEL) += nvdec_h264.o -OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec_h2645.o +OBJS-$(CONFIG_H264_QSV_HWACCEL) += qsvdec.o OBJS-$(CONFIG_H264_VAAPI_HWACCEL) += vaapi_h264.o OBJS-$(CONFIG_H264_VDPAU_HWACCEL) += vdpau_h264.o OBJS-$(CONFIG_H264_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_HEVC_D3D11VA_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_DXVA2_HWACCEL) += dxva2_hevc.o OBJS-$(CONFIG_HEVC_NVDEC_HWACCEL) += nvdec_hevc.o -OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec_h2645.o +OBJS-$(CONFIG_HEVC_QSV_HWACCEL) += qsvdec.o OBJS-$(CONFIG_HEVC_VAAPI_HWACCEL) += vaapi_hevc.o h265_profile_level.o OBJS-$(CONFIG_HEVC_VDPAU_HWACCEL) += vdpau_hevc.o h265_profile_level.o OBJS-$(CONFIG_MJPEG_NVDEC_HWACCEL) += nvdec_mjpeg.o diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index c666aaeb52..0a79d00eac 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -31,6 +31,7 @@ #include "libavutil/hwcontext_qsv.h" #include "libavutil/mem.h" #include "libavutil/log.h" +#include "libavutil/opt.h" #include "libavutil/pixdesc.h" #include "libavutil/pixfmt.h" #include "libavutil/time.h" @@ -228,7 +229,7 @@ static int qsv_decode_preinit(AVCodecContext *avctx, QSVContext *q, enum AVPixel return 0; } -static int qsv_decode_init(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param) +static int qsv_decode_init_context(AVCodecContext *avctx, QSVContext *q, mfxVideoParam *param) { int ret; @@ -615,7 +616,7 @@ int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, } if (!q->initialized) { - ret = qsv_decode_init(avctx, q, ¶m); + ret = qsv_decode_init_context(avctx, q, ¶m); if (ret < 0) goto reinit_fail; q->initialized = 1; @@ -633,3 +634,213 @@ void ff_qsv_decode_flush(AVCodecContext *avctx, QSVContext *q) q->orig_pix_fmt = AV_PIX_FMT_NONE; q->initialized = 0; } + +enum LoadPlugin { + LOAD_PLUGIN_NONE, + LOAD_PLUGIN_HEVC_SW, + LOAD_PLUGIN_HEVC_HW, +}; + +typedef struct QSVDecContext { + AVClass *class; + QSVContext qsv; + + int load_plugin; + + AVFifoBuffer *packet_fifo; + + AVPacket buffer_pkt; +} QSVDecContext; + +static void qsv_clear_buffers(QSVDecContext *s) +{ + AVPacket pkt; + while (av_fifo_size(s->packet_fifo) >= sizeof(pkt)) { + av_fifo_generic_read(s->packet_fifo, &pkt, sizeof(pkt), NULL); + av_packet_unref(&pkt); + } + + av_packet_unref(&s->buffer_pkt); +} + +static av_cold int qsv_decode_close(AVCodecContext *avctx) +{ + QSVDecContext *s = avctx->priv_data; + + ff_qsv_decode_close(&s->qsv); + + qsv_clear_buffers(s); + + av_fifo_free(s->packet_fifo); + + return 0; +} + +static av_cold int qsv_decode_init(AVCodecContext *avctx) +{ + QSVDecContext *s = avctx->priv_data; + int ret; + + if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) { + static const char * const uid_hevcdec_sw = "15dd936825ad475ea34e35f3f54217a6"; + static const char * const uid_hevcdec_hw = "33a61c0b4c27454ca8d85dde757c6f8e"; + + if (s->qsv.load_plugins[0]) { + av_log(avctx, AV_LOG_WARNING, + "load_plugins is not empty, but load_plugin is not set to 'none'." + "The load_plugin value will be ignored.\n"); + } else { + av_freep(&s->qsv.load_plugins); + + if (s->load_plugin == LOAD_PLUGIN_HEVC_SW) + s->qsv.load_plugins = av_strdup(uid_hevcdec_sw); + else + s->qsv.load_plugins = av_strdup(uid_hevcdec_hw); + if (!s->qsv.load_plugins) + return AVERROR(ENOMEM); + } + } + + s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12; + s->packet_fifo = av_fifo_alloc(sizeof(AVPacket)); + if (!s->packet_fifo) { + ret = AVERROR(ENOMEM); + goto fail; + } + + return 0; +fail: + qsv_decode_close(avctx); + return ret; +} + +static int qsv_decode_frame(AVCodecContext *avctx, void *data, + int *got_frame, AVPacket *avpkt) +{ + QSVDecContext *s = avctx->priv_data; + AVFrame *frame = data; + int ret; + + /* buffer the input packet */ + if (avpkt->size) { + AVPacket input_ref; + + if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) { + ret = av_fifo_realloc2(s->packet_fifo, + av_fifo_size(s->packet_fifo) + sizeof(input_ref)); + if (ret < 0) + return ret; + } + + ret = av_packet_ref(&input_ref, avpkt); + if (ret < 0) + return ret; + av_fifo_generic_write(s->packet_fifo, &input_ref, sizeof(input_ref), NULL); + } + + /* process buffered data */ + while (!*got_frame) { + /* prepare the input data */ + if (s->buffer_pkt.size <= 0) { + /* no more data */ + if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) + return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); + /* in progress of reinit, no read from fifo and keep the buffer_pkt */ + if (!s->qsv.reinit_flag) { + av_packet_unref(&s->buffer_pkt); + av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL); + } + } + + ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->buffer_pkt); + if (ret < 0){ + /* Drop buffer_pkt when failed to decode the packet. Otherwise, + the decoder will keep decoding the failure packet. */ + av_packet_unref(&s->buffer_pkt); + return ret; + } + if (s->qsv.reinit_flag) + continue; + + s->buffer_pkt.size -= ret; + s->buffer_pkt.data += ret; + } + + return avpkt->size; +} + +static void qsv_decode_flush(AVCodecContext *avctx) +{ + QSVDecContext *s = avctx->priv_data; + + qsv_clear_buffers(s); + ff_qsv_decode_flush(avctx, &s->qsv); +} + +#define OFFSET(x) offsetof(QSVDecContext, x) +#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM + +#define DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, opt) \ +static const AVClass x##_qsv_class = { \ + .class_name = #x "_qsv", \ + .item_name = av_default_item_name, \ + .option = opt, \ + .version = LIBAVUTIL_VERSION_INT, \ +}; \ +AVCodec ff_##x##_qsv_decoder = { \ + .name = #x "_qsv", \ + .long_name = NULL_IF_CONFIG_SMALL(#X " video (Intel Quick Sync Video acceleration)"), \ + .priv_data_size = sizeof(QSVDecContext), \ + .type = AVMEDIA_TYPE_VIDEO, \ + .id = AV_CODEC_ID_##X, \ + .init = qsv_decode_init, \ + .decode = qsv_decode_frame, \ + .flush = qsv_decode_flush, \ + .close = qsv_decode_close, \ + .bsfs = bsf_name, \ + .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, \ + .priv_class = &x##_qsv_class, \ + .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ + AV_PIX_FMT_P010, \ + AV_PIX_FMT_QSV, \ + AV_PIX_FMT_NONE }, \ + .hw_configs = ff_qsv_hw_configs, \ + .wrapper_name = "qsv", \ +}; \ + +#define DEFINE_QSV_DECODER(x, X, bsf_name) DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, options) + +#if CONFIG_HEVC_QSV_DECODER +static const AVOption hevc_options[] = { + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, + + { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_HEVC_HW }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VD, "load_plugin" }, + { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_NONE }, 0, 0, VD, "load_plugin" }, + { "hevc_sw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_SW }, 0, 0, VD, "load_plugin" }, + { "hevc_hw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_HW }, 0, 0, VD, "load_plugin" }, + + { "load_plugins", "A :-separate list of hexadecimal plugin UIDs to load in an internal session", + OFFSET(qsv.load_plugins), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD }, + + { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"}, + { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"}, + { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON }, 0, 0, VD, "gpu_copy"}, + { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, + { NULL }, +}; +DEFINE_QSV_DECODER_WITH_OPTION(hevc, HEVC, "hevc_mp4toannexb", hevc_options) +#endif + +static const AVOption options[] = { + { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, + + { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"}, + { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"}, + { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON }, 0, 0, VD, "gpu_copy"}, + { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, + { NULL }, +}; + +#if CONFIG_H264_QSV_DECODER +DEFINE_QSV_DECODER(h264, H264, "h264_mp4toannexb") +#endif diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c deleted file mode 100644 index b0ab23a922..0000000000 --- a/libavcodec/qsvdec_h2645.c +++ /dev/null @@ -1,248 +0,0 @@ -/* - * Intel MediaSDK QSV based H.264 / HEVC decoder - * - * copyright (c) 2013 Luca Barbato - * copyright (c) 2015 Anton Khirnov - * - * 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 - -#include - -#include "libavutil/common.h" -#include "libavutil/fifo.h" -#include "libavutil/opt.h" - -#include "avcodec.h" -#include "internal.h" -#include "qsv_internal.h" -#include "qsvdec.h" -#include "qsv.h" - -enum LoadPlugin { - LOAD_PLUGIN_NONE, - LOAD_PLUGIN_HEVC_SW, - LOAD_PLUGIN_HEVC_HW, -}; - -typedef struct QSVH2645Context { - AVClass *class; - QSVContext qsv; - - int load_plugin; - - AVFifoBuffer *packet_fifo; - - AVPacket buffer_pkt; -} QSVH2645Context; - -static void qsv_clear_buffers(QSVH2645Context *s) -{ - AVPacket pkt; - while (av_fifo_size(s->packet_fifo) >= sizeof(pkt)) { - av_fifo_generic_read(s->packet_fifo, &pkt, sizeof(pkt), NULL); - av_packet_unref(&pkt); - } - - av_packet_unref(&s->buffer_pkt); -} - -static av_cold int qsv_decode_close(AVCodecContext *avctx) -{ - QSVH2645Context *s = avctx->priv_data; - - ff_qsv_decode_close(&s->qsv); - - qsv_clear_buffers(s); - - av_fifo_free(s->packet_fifo); - - return 0; -} - -static av_cold int qsv_decode_init(AVCodecContext *avctx) -{ - QSVH2645Context *s = avctx->priv_data; - int ret; - - if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) { - static const char * const uid_hevcdec_sw = "15dd936825ad475ea34e35f3f54217a6"; - static const char * const uid_hevcdec_hw = "33a61c0b4c27454ca8d85dde757c6f8e"; - - if (s->qsv.load_plugins[0]) { - av_log(avctx, AV_LOG_WARNING, - "load_plugins is not empty, but load_plugin is not set to 'none'." - "The load_plugin value will be ignored.\n"); - } else { - av_freep(&s->qsv.load_plugins); - - if (s->load_plugin == LOAD_PLUGIN_HEVC_SW) - s->qsv.load_plugins = av_strdup(uid_hevcdec_sw); - else - s->qsv.load_plugins = av_strdup(uid_hevcdec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); - } - } - - s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12; - s->packet_fifo = av_fifo_alloc(sizeof(AVPacket)); - if (!s->packet_fifo) { - ret = AVERROR(ENOMEM); - goto fail; - } - - return 0; -fail: - qsv_decode_close(avctx); - return ret; -} - -static int qsv_decode_frame(AVCodecContext *avctx, void *data, - int *got_frame, AVPacket *avpkt) -{ - QSVH2645Context *s = avctx->priv_data; - AVFrame *frame = data; - int ret; - - /* buffer the input packet */ - if (avpkt->size) { - AVPacket input_ref; - - if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) { - ret = av_fifo_realloc2(s->packet_fifo, - av_fifo_size(s->packet_fifo) + sizeof(input_ref)); - if (ret < 0) - return ret; - } - - ret = av_packet_ref(&input_ref, avpkt); - if (ret < 0) - return ret; - av_fifo_generic_write(s->packet_fifo, &input_ref, sizeof(input_ref), NULL); - } - - /* process buffered data */ - while (!*got_frame) { - /* prepare the input data */ - if (s->buffer_pkt.size <= 0) { - /* no more data */ - if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) - return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); - /* in progress of reinit, no read from fifo and keep the buffer_pkt */ - if (!s->qsv.reinit_flag) { - av_packet_unref(&s->buffer_pkt); - av_fifo_generic_read(s->packet_fifo, &s->buffer_pkt, sizeof(s->buffer_pkt), NULL); - } - } - - ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->buffer_pkt); - if (ret < 0){ - /* Drop buffer_pkt when failed to decode the packet. Otherwise, - the decoder will keep decoding the failure packet. */ - av_packet_unref(&s->buffer_pkt); - return ret; - } - if (s->qsv.reinit_flag) - continue; - - s->buffer_pkt.size -= ret; - s->buffer_pkt.data += ret; - } - - return avpkt->size; -} - -static void qsv_decode_flush(AVCodecContext *avctx) -{ - QSVH2645Context *s = avctx->priv_data; - - qsv_clear_buffers(s); - ff_qsv_decode_flush(avctx, &s->qsv); -} - -#define OFFSET(x) offsetof(QSVH2645Context, x) -#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM - -#define DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, opt) \ -static const AVClass x##_qsv_class = { \ - .class_name = #x "_qsv", \ - .item_name = av_default_item_name, \ - .option = opt, \ - .version = LIBAVUTIL_VERSION_INT, \ -}; \ -AVCodec ff_##x##_qsv_decoder = { \ - .name = #x "_qsv", \ - .long_name = NULL_IF_CONFIG_SMALL(#X " video (Intel Quick Sync Video acceleration)"), \ - .priv_data_size = sizeof(QSVH2645Context), \ - .type = AVMEDIA_TYPE_VIDEO, \ - .id = AV_CODEC_ID_##X, \ - .init = qsv_decode_init, \ - .decode = qsv_decode_frame, \ - .flush = qsv_decode_flush, \ - .close = qsv_decode_close, \ - .bsfs = bsf_name, \ - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, \ - .priv_class = &x##_qsv_class, \ - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ - AV_PIX_FMT_P010, \ - AV_PIX_FMT_QSV, \ - AV_PIX_FMT_NONE }, \ - .hw_configs = ff_qsv_hw_configs, \ - .wrapper_name = "qsv", \ -}; \ - -#define DEFINE_QSV_DECODER(x, X, bsf_name) DEFINE_QSV_DECODER_WITH_OPTION(x, X, bsf_name, options) - -#if CONFIG_HEVC_QSV_DECODER -static const AVOption hevc_options[] = { - { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, - - { "load_plugin", "A user plugin to load in an internal session", OFFSET(load_plugin), AV_OPT_TYPE_INT, { .i64 = LOAD_PLUGIN_HEVC_HW }, LOAD_PLUGIN_NONE, LOAD_PLUGIN_HEVC_HW, VD, "load_plugin" }, - { "none", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_NONE }, 0, 0, VD, "load_plugin" }, - { "hevc_sw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_SW }, 0, 0, VD, "load_plugin" }, - { "hevc_hw", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = LOAD_PLUGIN_HEVC_HW }, 0, 0, VD, "load_plugin" }, - - { "load_plugins", "A :-separate list of hexadecimal plugin UIDs to load in an internal session", - OFFSET(qsv.load_plugins), AV_OPT_TYPE_STRING, { .str = "" }, 0, 0, VD }, - - { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"}, - { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"}, - { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON }, 0, 0, VD, "gpu_copy"}, - { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, - { NULL }, -}; -DEFINE_QSV_DECODER_WITH_OPTION(hevc, HEVC, "hevc_mp4toannexb", hevc_options) -#endif - -static const AVOption options[] = { - { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, - - { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"}, - { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"}, - { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON }, 0, 0, VD, "gpu_copy"}, - { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, - { NULL }, -}; - -#if CONFIG_H264_QSV_DECODER -DEFINE_QSV_DECODER(h264, H264, "h264_mp4toannexb") -#endif From patchwork Thu Nov 26 10:20:25 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xu, Guangxin" X-Patchwork-Id: 24044 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 B2F6044A323 for ; Thu, 26 Nov 2020 12:21:15 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9536868B958; Thu, 26 Nov 2020 12:21:15 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 184B868B920 for ; Thu, 26 Nov 2020 12:21:06 +0200 (EET) IronPort-SDR: f8TpbBX3bCqPd2/5MF0eASjK6TDZsWB2vDqR/Dmeuf63ycM94aFL3r3n8pOfpH9ieZsSCVW8il 32LvER51ND7w== X-IronPort-AV: E=McAfee;i="6000,8403,9816"; a="171487037" X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="171487037" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2020 02:21:02 -0800 IronPort-SDR: P13tVWsYxDB9YbjFybSBSlhcmj4oIrc1SHL4+IhiYQeTFxFyx+ulD53CL32fvKhs8we6rP5PS6 6Hp7uOrYg5QA== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="362756194" Received: from skl-e5-server.sh.intel.com ([10.239.43.170]) by fmsmga004.fm.intel.com with ESMTP; 26 Nov 2020 02:21:01 -0800 From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Nov 2020 18:20:25 +0800 Message-Id: <20201126102026.27202-4-guangxin.xu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201126102026.27202-1-guangxin.xu@intel.com> References: <20201126102026.27202-1-guangxin.xu@intel.com> Subject: [FFmpeg-devel] [PATCH 4/5] avcodec/qsvdec: refact, move qsvdec_other.c to qsvdec.c 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 Cc: Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/Makefile | 14 +-- libavcodec/qsvdec.c | 42 ++++++- libavcodec/qsvdec_other.c | 242 -------------------------------------- 3 files changed, 48 insertions(+), 250 deletions(-) delete mode 100644 libavcodec/qsvdec_other.c diff --git a/libavcodec/Makefile b/libavcodec/Makefile index 3ee8aa7f86..d7dac52e15 100644 --- a/libavcodec/Makefile +++ b/libavcodec/Makefile @@ -448,7 +448,7 @@ OBJS-$(CONFIG_METASOUND_DECODER) += metasound.o metasound_data.o \ OBJS-$(CONFIG_MICRODVD_DECODER) += microdvddec.o ass.o OBJS-$(CONFIG_MIMIC_DECODER) += mimic.o OBJS-$(CONFIG_MJPEG_DECODER) += mjpegdec.o -OBJS-$(CONFIG_MJPEG_QSV_DECODER) += qsvdec_other.o +OBJS-$(CONFIG_MJPEG_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_MJPEG_ENCODER) += mjpegenc.o mjpegenc_common.o \ mjpegenc_huffman.o OBJS-$(CONFIG_MJPEGB_DECODER) += mjpegbdec.o @@ -485,7 +485,7 @@ OBJS-$(CONFIG_MPEG1VIDEO_ENCODER) += mpeg12enc.o mpeg12.o OBJS-$(CONFIG_MPEG1_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_MPEG1_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_MPEG2_MMAL_DECODER) += mmaldec.o -OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec_other.o +OBJS-$(CONFIG_MPEG2_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_MPEG2_QSV_ENCODER) += qsvenc_mpeg2.o OBJS-$(CONFIG_MPEG2VIDEO_DECODER) += mpeg12dec.o mpeg12.o mpeg12data.o OBJS-$(CONFIG_MPEG2VIDEO_ENCODER) += mpeg12enc.o mpeg12.o @@ -687,7 +687,7 @@ OBJS-$(CONFIG_VC1_DECODER) += vc1dec.o vc1_block.o vc1_loopfilter.o wmv2dsp.o wmv2data.o OBJS-$(CONFIG_VC1_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VC1_MMAL_DECODER) += mmaldec.o -OBJS-$(CONFIG_VC1_QSV_DECODER) += qsvdec_other.o +OBJS-$(CONFIG_VC1_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_VC1_V4L2M2M_DECODER) += v4l2_m2m_dec.o OBJS-$(CONFIG_VC2_ENCODER) += vc2enc.o vc2enc_dwt.o diractab.o OBJS-$(CONFIG_VCR1_DECODER) += vcr1.o @@ -706,7 +706,7 @@ OBJS-$(CONFIG_VP7_DECODER) += vp8.o vp56rac.o OBJS-$(CONFIG_VP8_DECODER) += vp8.o vp56rac.o OBJS-$(CONFIG_VP8_CUVID_DECODER) += cuviddec.o OBJS-$(CONFIG_VP8_MEDIACODEC_DECODER) += mediacodecdec.o -OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec_other.o +OBJS-$(CONFIG_VP8_QSV_DECODER) += qsvdec.o OBJS-$(CONFIG_VP8_RKMPP_DECODER) += rkmppdec.o OBJS-$(CONFIG_VP8_VAAPI_ENCODER) += vaapi_encode_vp8.o OBJS-$(CONFIG_VP8_V4L2M2M_DECODER) += v4l2_m2m_dec.o @@ -941,7 +941,7 @@ OBJS-$(CONFIG_MPEG1_XVMC_HWACCEL) += mpegvideo_xvmc.o OBJS-$(CONFIG_MPEG2_D3D11VA_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_DXVA2_HWACCEL) += dxva2_mpeg2.o OBJS-$(CONFIG_MPEG2_NVDEC_HWACCEL) += nvdec_mpeg12.o -OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec_other.o +OBJS-$(CONFIG_MPEG2_QSV_HWACCEL) += qsvdec.o OBJS-$(CONFIG_MPEG2_VAAPI_HWACCEL) += vaapi_mpeg2.o OBJS-$(CONFIG_MPEG2_VDPAU_HWACCEL) += vdpau_mpeg12.o OBJS-$(CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o @@ -953,7 +953,7 @@ OBJS-$(CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL) += videotoolbox.o OBJS-$(CONFIG_VC1_D3D11VA_HWACCEL) += dxva2_vc1.o OBJS-$(CONFIG_VC1_DXVA2_HWACCEL) += dxva2_vc1.o OBJS-$(CONFIG_VC1_NVDEC_HWACCEL) += nvdec_vc1.o -OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec_other.o +OBJS-$(CONFIG_VC1_QSV_HWACCEL) += qsvdec.o OBJS-$(CONFIG_VC1_VAAPI_HWACCEL) += vaapi_vc1.o OBJS-$(CONFIG_VC1_VDPAU_HWACCEL) += vdpau_vc1.o OBJS-$(CONFIG_VP8_NVDEC_HWACCEL) += nvdec_vp8.o @@ -963,7 +963,7 @@ OBJS-$(CONFIG_VP9_DXVA2_HWACCEL) += dxva2_vp9.o OBJS-$(CONFIG_VP9_NVDEC_HWACCEL) += nvdec_vp9.o OBJS-$(CONFIG_VP9_VAAPI_HWACCEL) += vaapi_vp9.o OBJS-$(CONFIG_VP9_VDPAU_HWACCEL) += vdpau_vp9.o -OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec_other.o +OBJS-$(CONFIG_VP8_QSV_HWACCEL) += qsvdec.o # libavformat dependencies OBJS-$(CONFIG_ISO_MEDIA) += mpeg4audio.o mpegaudiodata.o diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index 0a79d00eac..ed40e2f4c2 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -667,6 +667,7 @@ static av_cold int qsv_decode_close(AVCodecContext *avctx) { QSVDecContext *s = avctx->priv_data; + av_freep(&s->qsv.load_plugins); ff_qsv_decode_close(&s->qsv); qsv_clear_buffers(s); @@ -681,7 +682,22 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx) QSVDecContext *s = avctx->priv_data; int ret; - if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) { + if (avctx->codec_id == AV_CODEC_ID_VP8) { + static const char *uid_vp8dec_hw = "f622394d8d87452f878c51f2fc9b4131"; + + av_freep(&s->qsv.load_plugins); + s->qsv.load_plugins = av_strdup(uid_vp8dec_hw); + if (!s->qsv.load_plugins) + return AVERROR(ENOMEM); + } else if (avctx->codec_id == AV_CODEC_ID_VP9) { + static const char *uid_vp9dec_hw = "a922394d8d87452f878c51f2fc9b4131"; + + av_freep(&s->qsv.load_plugins); + s->qsv.load_plugins = av_strdup(uid_vp9dec_hw); + if (!s->qsv.load_plugins) + return AVERROR(ENOMEM); + } + else if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) { static const char * const uid_hevcdec_sw = "15dd936825ad475ea34e35f3f54217a6"; static const char * const uid_hevcdec_hw = "33a61c0b4c27454ca8d85dde757c6f8e"; @@ -844,3 +860,27 @@ static const AVOption options[] = { #if CONFIG_H264_QSV_DECODER DEFINE_QSV_DECODER(h264, H264, "h264_mp4toannexb") #endif + +#if CONFIG_MPEG2_QSV_DECODER +DEFINE_QSV_DECODER(mpeg2, MPEG2VIDEO, NULL) +#endif + +#if CONFIG_VC1_QSV_DECODER +DEFINE_QSV_DECODER(vc1, VC1, NULL) +#endif + +#if CONFIG_MJPEG_QSV_DECODER +DEFINE_QSV_DECODER(mjpeg, MJPEG, NULL) +#endif + +#if CONFIG_VP8_QSV_DECODER +DEFINE_QSV_DECODER(vp8, VP8, NULL) +#endif + +#if CONFIG_VP9_QSV_DECODER +DEFINE_QSV_DECODER(vp9, VP9, NULL) +#endif + +#if CONFIG_AV1_QSV_DECODER +DEFINE_QSV_DECODER(av1, AV1, NULL) +#endif diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c deleted file mode 100644 index 266ac9f2e5..0000000000 --- a/libavcodec/qsvdec_other.c +++ /dev/null @@ -1,242 +0,0 @@ -/* - * Intel MediaSDK QSV based MPEG-2, VC-1, VP8, MJPEG, VP9 and AV1 decoders - * - * copyright (c) 2015 Anton Khirnov - * - * 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 - -#include - -#include "libavutil/common.h" -#include "libavutil/fifo.h" -#include "libavutil/opt.h" - -#include "avcodec.h" -#include "internal.h" -#include "qsv_internal.h" -#include "qsvdec.h" -#include "qsv.h" - -typedef struct QSVOtherContext { - AVClass *class; - QSVContext qsv; - - AVFifoBuffer *packet_fifo; - - AVPacket input_ref; -} QSVOtherContext; - -static void qsv_clear_buffers(QSVOtherContext *s) -{ - AVPacket pkt; - while (av_fifo_size(s->packet_fifo) >= sizeof(pkt)) { - av_fifo_generic_read(s->packet_fifo, &pkt, sizeof(pkt), NULL); - av_packet_unref(&pkt); - } - - av_packet_unref(&s->input_ref); -} - -static av_cold int qsv_decode_close(AVCodecContext *avctx) -{ - QSVOtherContext *s = avctx->priv_data; - -#if CONFIG_VP8_QSV_DECODER || CONFIG_VP9_QSV_DECODER - if (avctx->codec_id == AV_CODEC_ID_VP8 || avctx->codec_id == AV_CODEC_ID_VP9) - av_freep(&s->qsv.load_plugins); -#endif - - ff_qsv_decode_close(&s->qsv); - - qsv_clear_buffers(s); - - av_fifo_free(s->packet_fifo); - - return 0; -} - -static av_cold int qsv_decode_init(AVCodecContext *avctx) -{ - QSVOtherContext *s = avctx->priv_data; - int ret; - -#if CONFIG_VP8_QSV_DECODER - if (avctx->codec_id == AV_CODEC_ID_VP8) { - static const char *uid_vp8dec_hw = "f622394d8d87452f878c51f2fc9b4131"; - - av_freep(&s->qsv.load_plugins); - s->qsv.load_plugins = av_strdup(uid_vp8dec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); - } -#endif - -#if CONFIG_VP9_QSV_DECODER - if (avctx->codec_id == AV_CODEC_ID_VP9) { - static const char *uid_vp9dec_hw = "a922394d8d87452f878c51f2fc9b4131"; - - av_freep(&s->qsv.load_plugins); - s->qsv.load_plugins = av_strdup(uid_vp9dec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); - } -#endif - - s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12; - s->packet_fifo = av_fifo_alloc(sizeof(AVPacket)); - if (!s->packet_fifo) { - ret = AVERROR(ENOMEM); - goto fail; - } - - return 0; -fail: - qsv_decode_close(avctx); - return ret; -} - -static int qsv_decode_frame(AVCodecContext *avctx, void *data, - int *got_frame, AVPacket *avpkt) -{ - QSVOtherContext *s = avctx->priv_data; - AVFrame *frame = data; - int ret; - - /* buffer the input packet */ - if (avpkt->size) { - AVPacket input_ref; - - if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) { - ret = av_fifo_realloc2(s->packet_fifo, - av_fifo_size(s->packet_fifo) + sizeof(input_ref)); - if (ret < 0) - return ret; - } - - ret = av_packet_ref(&input_ref, avpkt); - if (ret < 0) - return ret; - av_fifo_generic_write(s->packet_fifo, &input_ref, sizeof(input_ref), NULL); - } - - /* process buffered data */ - while (!*got_frame) { - if (s->input_ref.size <= 0) { - /* no more data */ - if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket)) - return avpkt->size ? avpkt->size : ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, avpkt); - /* in progress of reinit, no read from fifo and keep the buffer_pkt */ - if (!s->qsv.reinit_flag) { - av_packet_unref(&s->input_ref); - av_fifo_generic_read(s->packet_fifo, &s->input_ref, sizeof(s->input_ref), NULL); - } - } - - ret = ff_qsv_process_data(avctx, &s->qsv, frame, got_frame, &s->input_ref); - if (ret < 0) { - /* Drop input packet when failed to decode the packet. Otherwise, - the decoder will keep decoding the failure packet. */ - av_packet_unref(&s->input_ref); - - return ret; - } - if (s->qsv.reinit_flag) - continue; - - s->input_ref.size -= ret; - s->input_ref.data += ret; - } - - return avpkt->size; -} - -static void qsv_decode_flush(AVCodecContext *avctx) -{ - QSVOtherContext *s = avctx->priv_data; - - qsv_clear_buffers(s); - ff_qsv_decode_flush(avctx, &s->qsv); -} - -#define OFFSET(x) offsetof(QSVOtherContext, x) -#define VD AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_DECODING_PARAM -static const AVOption options[] = { - { "async_depth", "Internal parallelization depth, the higher the value the higher the latency.", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VD }, - - { "gpu_copy", "A GPU-accelerated copy between video and system memory", OFFSET(qsv.gpu_copy), AV_OPT_TYPE_INT, { .i64 = MFX_GPUCOPY_DEFAULT }, MFX_GPUCOPY_DEFAULT, MFX_GPUCOPY_OFF, VD, "gpu_copy"}, - { "default", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_DEFAULT }, 0, 0, VD, "gpu_copy"}, - { "on", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_ON }, 0, 0, VD, "gpu_copy"}, - { "off", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_GPUCOPY_OFF }, 0, 0, VD, "gpu_copy"}, - { NULL }, -}; - -#define DEFINE_QSV_DECODER(x, X, bsf_name) \ -static const AVClass x##_qsv_class = { \ - .class_name = #x "_qsv", \ - .item_name = av_default_item_name, \ - .option = options, \ - .version = LIBAVUTIL_VERSION_INT, \ -}; \ -AVCodec ff_##x##_qsv_decoder = { \ - .name = #x "_qsv", \ - .long_name = NULL_IF_CONFIG_SMALL(#X " video (Intel Quick Sync Video acceleration)"), \ - .priv_data_size = sizeof(QSVOtherContext), \ - .type = AVMEDIA_TYPE_VIDEO, \ - .id = AV_CODEC_ID_##X, \ - .init = qsv_decode_init, \ - .decode = qsv_decode_frame, \ - .flush = qsv_decode_flush, \ - .close = qsv_decode_close, \ - .bsfs = bsf_name, \ - .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_AVOID_PROBING | AV_CODEC_CAP_HYBRID, \ - .priv_class = &x##_qsv_class, \ - .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, \ - AV_PIX_FMT_P010, \ - AV_PIX_FMT_QSV, \ - AV_PIX_FMT_NONE }, \ - .hw_configs = ff_qsv_hw_configs, \ - .wrapper_name = "qsv", \ -}; \ - -#if CONFIG_MPEG2_QSV_DECODER -DEFINE_QSV_DECODER(mpeg2, MPEG2VIDEO, NULL) -#endif - -#if CONFIG_VC1_QSV_DECODER -DEFINE_QSV_DECODER(vc1, VC1, NULL) -#endif - -#if CONFIG_MJPEG_QSV_DECODER -DEFINE_QSV_DECODER(mjpeg, MJPEG, NULL) -#endif - -#if CONFIG_VP8_QSV_DECODER -DEFINE_QSV_DECODER(vp8, VP8, NULL) -#endif - -#if CONFIG_VP9_QSV_DECODER -DEFINE_QSV_DECODER(vp9, VP9, NULL) -#endif - -#if CONFIG_AV1_QSV_DECODER -DEFINE_QSV_DECODER(av1, AV1, NULL) -#endif From patchwork Thu Nov 26 10:20:26 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xu, Guangxin" X-Patchwork-Id: 24045 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 C359E44A323 for ; Thu, 26 Nov 2020 12:21:17 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id AA8A168B971; Thu, 26 Nov 2020 12:21:17 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga14.intel.com (mga14.intel.com [192.55.52.115]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F113168B95C for ; Thu, 26 Nov 2020 12:21:08 +0200 (EET) IronPort-SDR: B98L6pFFVPBWnYpswi8V3nuaOxB58jvG2Wi8ff9hGxhe4pkwTtAEsaKyVBmSR2B7Q9dH/+VDLD DjjDOwD+xD5w== X-IronPort-AV: E=McAfee;i="6000,8403,9816"; a="171487038" X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="171487038" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga004.fm.intel.com ([10.253.24.48]) by fmsmga103.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2020 02:21:03 -0800 IronPort-SDR: SojAmrfs2k3h1C0FTXC7c3n9UYuUN9PyvgPJ0vQK8eQAHHttn12Njuj/GPzK7hg0fdFY+kYYDu cT3+x+sA8Png== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,371,1599548400"; d="scan'208";a="362756202" Received: from skl-e5-server.sh.intel.com ([10.239.43.170]) by fmsmga004.fm.intel.com with ESMTP; 26 Nov 2020 02:21:02 -0800 From: Xu Guangxin To: ffmpeg-devel@ffmpeg.org Date: Thu, 26 Nov 2020 18:20:26 +0800 Message-Id: <20201126102026.27202-5-guangxin.xu@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20201126102026.27202-1-guangxin.xu@intel.com> References: <20201126102026.27202-1-guangxin.xu@intel.com> Subject: [FFmpeg-devel] [PATCH 5/5] avcodec/qsvdec: refact, remove duplicate code for plugin loading 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 Cc: Xu Guangxin MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" --- libavcodec/qsvdec.c | 29 +++++++++++------------------ 1 file changed, 11 insertions(+), 18 deletions(-) diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index ed40e2f4c2..8da367079a 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -681,21 +681,12 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx) { QSVDecContext *s = avctx->priv_data; int ret; + const char *uid = NULL; if (avctx->codec_id == AV_CODEC_ID_VP8) { - static const char *uid_vp8dec_hw = "f622394d8d87452f878c51f2fc9b4131"; - - av_freep(&s->qsv.load_plugins); - s->qsv.load_plugins = av_strdup(uid_vp8dec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); + uid = "f622394d8d87452f878c51f2fc9b4131"; } else if (avctx->codec_id == AV_CODEC_ID_VP9) { - static const char *uid_vp9dec_hw = "a922394d8d87452f878c51f2fc9b4131"; - - av_freep(&s->qsv.load_plugins); - s->qsv.load_plugins = av_strdup(uid_vp9dec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); + uid = "a922394d8d87452f878c51f2fc9b4131"; } else if (avctx->codec_id == AV_CODEC_ID_HEVC && s->load_plugin != LOAD_PLUGIN_NONE) { static const char * const uid_hevcdec_sw = "15dd936825ad475ea34e35f3f54217a6"; @@ -706,16 +697,18 @@ static av_cold int qsv_decode_init(AVCodecContext *avctx) "load_plugins is not empty, but load_plugin is not set to 'none'." "The load_plugin value will be ignored.\n"); } else { - av_freep(&s->qsv.load_plugins); - if (s->load_plugin == LOAD_PLUGIN_HEVC_SW) - s->qsv.load_plugins = av_strdup(uid_hevcdec_sw); + uid = uid_hevcdec_sw; else - s->qsv.load_plugins = av_strdup(uid_hevcdec_hw); - if (!s->qsv.load_plugins) - return AVERROR(ENOMEM); + uid = uid_hevcdec_hw; } } + if (uid) { + av_freep(&s->qsv.load_plugins); + s->qsv.load_plugins = av_strdup(uid); + if (!s->qsv.load_plugins) + return AVERROR(ENOMEM); + } s->qsv.orig_pix_fmt = AV_PIX_FMT_NV12; s->packet_fifo = av_fifo_alloc(sizeof(AVPacket));