diff mbox series

[FFmpeg-devel,1/5] avcodec/qsvdec_other: refact, use DEFINE_QSV_DECODER to remove duplicate code

Message ID 20201126102026.27202-1-guangxin.xu@intel.com
State Superseded
Headers show
Series [FFmpeg-devel,1/5] avcodec/qsvdec_other: refact, use DEFINE_QSV_DECODER to remove duplicate code | expand

Checks

Context Check Description
andriy/x86_make success Make finished
andriy/x86_make_fate success Make fate finished

Commit Message

Xu, Guangxin Nov. 26, 2020, 10:20 a.m. UTC
---
 libavcodec/qsvdec_other.c | 188 ++++++++------------------------------
 1 file changed, 36 insertions(+), 152 deletions(-)

Comments

Guangxin Xu Dec. 2, 2020, 3:14 a.m. UTC | #1
Hi Mark & Zong,
Any suggestion on this?
thanks

On Thu, Nov 26, 2020 at 6:21 PM Xu Guangxin <guangxin.xu@intel.com> wrote:

> ---
>  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
> --
> 2.17.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Xiang, Haihao Dec. 2, 2020, 4:30 a.m. UTC | #2
> ---
>  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) \


How about to use the same macro for all QSV decoders? Compared
ff_mpeg2_qsv_decoder in qsvdec_other.c and ffmpeg_h264_qsv_decoder in
qsvh2645.c, besides x, X, bsf_name, option and priv_data_size are different too.
So we may define a macro below in qsvdec.h and use this macro for all QSV
decoders.

#define DEFINE_QSV_DECODER(x, X, bsf_name, option, priv_data_size) \
...

Thanks
Haihao

> +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
Guangxin Xu Dec. 2, 2020, 5:38 a.m. UTC | #3
Hi Haihao,
If you check the final code. The QSVOtherContext and QSVH2645Context will
be unified to QSVDecContext. It's no need to pass the priv_data_size.

In the final version, we have two macros
DEFINE_QSV_DECODER_WITH_OPTION for h265 only. Maybe av1 can use it for film
grain too.
DEFINE_QSV_DECODER for other codecs.

thanks

On Wed, Dec 2, 2020 at 12:38 PM Xiang, Haihao <haihao.xiang@intel.com>
wrote:

>
> > ---
> >  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) \
>
>
> How about to use the same macro for all QSV decoders? Compared
> ff_mpeg2_qsv_decoder in qsvdec_other.c and ffmpeg_h264_qsv_decoder in
> qsvh2645.c, besides x, X, bsf_name, option and priv_data_size are
> different too.
> So we may define a macro below in qsvdec.h and use this macro for all QSV
> decoders.
>
> #define DEFINE_QSV_DECODER(x, X, bsf_name, option, priv_data_size) \
> ...
>
> Thanks
> Haihao
>
> > +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
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Xiang, Haihao Dec. 2, 2020, 5:51 a.m. UTC | #4
> Hi Haihao,
> If you check the final code. The QSVOtherContext and QSVH2645Context will
> be unified to QSVDecContext. It's no need to pass the priv_data_size.
> 
> In the final version, we have two macros
> DEFINE_QSV_DECODER_WITH_OPTION for h265 only. Maybe av1 can use it for film
> grain too.
> DEFINE_QSV_DECODER for other codecs.
> 

Thanks for the explanation, your patch looks good to me.

Regards
Haihao
 

> thanks
> 
> On Wed, Dec 2, 2020 at 12:38 PM Xiang, Haihao <haihao.xiang@intel.com>
> wrote:
> 
> > 
> > > ---
> > >  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) \
> > 
> > 
> > How about to use the same macro for all QSV decoders? Compared
> > ff_mpeg2_qsv_decoder in qsvdec_other.c and ffmpeg_h264_qsv_decoder in
> > qsvh2645.c, besides x, X, bsf_name, option and priv_data_size are
> > different too.
> > So we may define a macro below in qsvdec.h and use this macro for all QSV
> > decoders.
> > 
> > #define DEFINE_QSV_DECODER(x, X, bsf_name, option, priv_data_size) \
> > ...
> > 
> > Thanks
> > Haihao
> > 
> > > +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
> > 
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> > 
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> 
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Guangxin Xu Dec. 3, 2020, 2:37 a.m. UTC | #5
Hi Haihao,
Thanks for the review.

Hi Mark & Zong,
Are we good to go?
thanks


On Wed, Dec 2, 2020 at 1:52 PM Xiang, Haihao <haihao.xiang@intel.com> wrote:

>
> > Hi Haihao,
> > If you check the final code. The QSVOtherContext and QSVH2645Context will
> > be unified to QSVDecContext. It's no need to pass the priv_data_size.
> >
> > In the final version, we have two macros
> > DEFINE_QSV_DECODER_WITH_OPTION for h265 only. Maybe av1 can use it for
> film
> > grain too.
> > DEFINE_QSV_DECODER for other codecs.
> >
>
> Thanks for the explanation, your patch looks good to me.
>
> Regards
> Haihao
>
>
> > thanks
> >
> > On Wed, Dec 2, 2020 at 12:38 PM Xiang, Haihao <haihao.xiang@intel.com>
> > wrote:
> >
> > >
> > > > ---
> > > >  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) \
> > >
> > >
> > > How about to use the same macro for all QSV decoders? Compared
> > > ff_mpeg2_qsv_decoder in qsvdec_other.c and ffmpeg_h264_qsv_decoder in
> > > qsvh2645.c, besides x, X, bsf_name, option and priv_data_size are
> > > different too.
> > > So we may define a macro below in qsvdec.h and use this macro for all
> QSV
> > > decoders.
> > >
> > > #define DEFINE_QSV_DECODER(x, X, bsf_name, option, priv_data_size) \
> > > ...
> > >
> > > Thanks
> > > Haihao
> > >
> > > > +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
> > >
> > > _______________________________________________
> > > ffmpeg-devel mailing list
> > > ffmpeg-devel@ffmpeg.org
> > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> > >
> > > To unsubscribe, visit link above, or email
> > > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel@ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
Linjie Fu Jan. 2, 2021, 3:29 a.m. UTC | #6
Guangxin:

On Thu, Nov 26, 2020 at 6:21 PM Xu Guangxin <guangxin.xu@intel.com> wrote:
>
> ---
>  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
> --

Generally looks reasonable to me.
One thing is this patch set doesn't seem to pass the pre-patch
check[1] for hardware accelerating,
would you please help to double confirm and avoid potential regression?

Another point is, maybe separating "av_freep(&s->qsv.load_plugins);"
in a single patch to fix the mem leak would be more notable
compared with being hidden in the refactor patch.

[1] https://github.com/intel-media-ci/ffmpeg/pull/326

- linjie
Guangxin Xu Jan. 5, 2021, 2:33 a.m. UTC | #7
Hi Linjie,
thanks for the review.

On Sat, Jan 2, 2021 at 11:29 AM Linjie Fu <linjie.justin.fu@gmail.com>
wrote:

> Guangxin:
>
> On Thu, Nov 26, 2020 at 6:21 PM Xu Guangxin <guangxin.xu@intel.com> wrote:
> >
> > ---
> >  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
> > --
>
> Generally looks reasonable to me.
> One thing is this patch set doesn't seem to pass the pre-patch
> check[1] for hardware accelerating,
> would you please help to double confirm and avoid potential regression?
>
The fail introduced by
https://github.com/intel-media-ci/ffmpeg/pull/326/commits/2b1d1e5bf01dd2249fbf78b0ebcbdf9270657e3f
It's not related to the react code. I have sent other pr to ci,
https://github.com/intel-media-ci/ffmpeg/pull/327
It's passed all tests

>
> Another point is, maybe separating "av_freep(&s->qsv.load_plugins);"
> in a single patch to fix the mem leak would be more notable
> compared with being hidden in the refactor patch.
>
Good suggestion, I will send a new patchset.

>
> [1] https://github.com/intel-media-ci/ffmpeg/pull/326
>
> - linjie
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
diff mbox series

Patch

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