[FFmpeg-devel] [PATCH 1/5] avcodec/qsvdec_other: refact, use DEFINE_QSV_DECODER to remove duplicate code
Guangxin Xu
oddstone at gmail.com
Thu Dec 3 04:37:54 EET 2020
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 at 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 at 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 at ffmpeg.org
> > > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> > >
> > > To unsubscribe, visit link above, or email
> > > ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> >
> > _______________________________________________
> > ffmpeg-devel mailing list
> > ffmpeg-devel at ffmpeg.org
> > https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> >
> > To unsubscribe, visit link above, or email
> > ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".
More information about the ffmpeg-devel
mailing list