Message ID | 20171118184713.11490-2-sw@jkqxz.net |
---|---|
State | Superseded |
Headers | show |
On 2017-11-18 10:47, Mark Thompson wrote: > This includes a pointer to the associated hwaccel for decoders using > hwaccels - these will be used later to implement the hwaccel setup > without needing a global list. > > Also added is a new file listing all hwaccels as external declarations > - > this will be used later to generate the hwaccel list at configure time. > --- > libavcodec/cuviddec.c | 15 ++++++++++ > libavcodec/h263dec.c | 13 +++++++++ > libavcodec/h264dec.c | 25 ++++++++++++++++ > libavcodec/hevcdec.c | 25 ++++++++++++++++ > libavcodec/hwaccel.h | 50 ++++++++++++++++++++++++++++++++ > libavcodec/hwaccels.h | 72 > ++++++++++++++++++++++++++++++++++++++++++++++ > libavcodec/mediacodecdec.c | 18 ++++++++++++ > libavcodec/mmaldec.c | 7 +++++ > libavcodec/mpeg12dec.c | 42 ++++++++++++++++++++++++++- > libavcodec/mpeg4videodec.c | 13 +++++++++ > libavcodec/qsvdec.c | 13 +++++++++ > libavcodec/qsvdec.h | 3 ++ > libavcodec/qsvdec_h2645.c | 2 ++ > libavcodec/qsvdec_other.c | 3 ++ > libavcodec/vc1dec.c | 43 +++++++++++++++++++++++++++ > libavcodec/vp9.c | 19 ++++++++++++ > 16 files changed, 362 insertions(+), 1 deletion(-) > create mode 100644 libavcodec/hwaccels.h > > diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c > index 6370348639..0e5123304a 100644 > --- a/libavcodec/cuviddec.c > +++ b/libavcodec/cuviddec.c > @@ -32,6 +32,7 @@ > > #include "avcodec.h" > #include "decode.h" > +#include "hwaccel.h" > #include "internal.h" > > typedef struct CuvidContext > @@ -1094,6 +1095,19 @@ static const AVOption options[] = { > { NULL } > }; > > +static const AVCodecHWConfigInternal *cuvid_hw_configs[] = { > + &(const AVCodecHWConfigInternal) { > + .public = { > + .pix_fmt = AV_PIX_FMT_CUDA, > + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | > + AV_CODEC_HW_CONFIG_METHOD_INTERNAL, > + .device_type = AV_HWDEVICE_TYPE_CUDA > + }, > + .hwaccel = NULL, > + }, > + NULL > +}; > + > #define DEFINE_CUVID_CODEC(x, X) \ > static const AVClass x##_cuvid_class = { \ > .class_name = #x "_cuvid", \ > @@ -1127,6 +1141,7 @@ static const AVOption options[] = { > > AV_PIX_FMT_P010, \ > > AV_PIX_FMT_P016, \ > > AV_PIX_FMT_NONE }, \ > + .hw_configs = cuvid_hw_configs, \ > }; > > #if CONFIG_HEVC_CUVID_DECODER > diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c > index c7cf4bc0c2..cf66e520b0 100644 > --- a/libavcodec/h263dec.c > +++ b/libavcodec/h263dec.c > @@ -33,6 +33,7 @@ > #include "flv.h" > #include "h263.h" > #include "h263_parser.h" > +#include "hwaccel.h" > #include "internal.h" > #include "mpeg_er.h" > #include "mpeg4video.h" > @@ -756,4 +757,16 @@ AVCodec ff_h263p_decoder = { > .flush = ff_mpeg_flush, > .max_lowres = 3, > .pix_fmts = ff_h263_hwaccel_pixfmt_list_420, > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_H263_VAAPI_HWACCEL > + HWACCEL_VAAPI(h263), > +#endif > +#if CONFIG_MPEG4_VDPAU_HWACCEL > + HWACCEL_VDPAU(mpeg4), > +#endif > +#if CONFIG_H263_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(h263), > +#endif > + NULL > + }, > }; > diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c > index be187eb5f4..b03024d4a3 100644 > --- a/libavcodec/h264dec.c > +++ b/libavcodec/h264dec.c > @@ -47,6 +47,7 @@ > #include "h264_mvpred.h" > #include "h264_ps.h" > #include "golomb.h" > +#include "hwaccel.h" > #include "mathops.h" > #include "me_cmp.h" > #include "mpegutils.h" > @@ -1059,6 +1060,30 @@ AVCodec ff_h264_decoder = { > .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ > AV_CODEC_CAP_DR1 | > AV_CODEC_CAP_DELAY | > AV_CODEC_CAP_SLICE_THREADS | > AV_CODEC_CAP_FRAME_THREADS, > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_H264_DXVA2_HWACCEL > + HWACCEL_DXVA2(h264), > +#endif > +#if CONFIG_H264_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(h264), > +#endif > +#if CONFIG_H264_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(h264), > +#endif > +#if CONFIG_H264_NVDEC_HWACCEL > + HWACCEL_NVDEC(h264), > +#endif > +#if CONFIG_H264_VAAPI_HWACCEL > + HWACCEL_VAAPI(h264), > +#endif > +#if CONFIG_H264_VDPAU_HWACCEL > + HWACCEL_VDPAU(h264), > +#endif > +#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(h264), > +#endif > + NULL > + }, > .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_EXPORTS_CROPPING, > .flush = flush_dpb, > .init_thread_copy = > ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), > diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c > index 75960912b1..5ec6105d2f 100644 > --- a/libavcodec/hevcdec.c > +++ b/libavcodec/hevcdec.c > @@ -41,6 +41,7 @@ > #include "hevc_data.h" > #include "hevc_parse.h" > #include "hevcdec.h" > +#include "hwaccel.h" > #include "profiles.h" > > const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, > [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; > @@ -3510,4 +3511,28 @@ AVCodec ff_hevc_decoder = { > AV_CODEC_CAP_SLICE_THREADS | > AV_CODEC_CAP_FRAME_THREADS, > .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | > FF_CODEC_CAP_EXPORTS_CROPPING, > .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles), > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_HEVC_DXVA2_HWACCEL > + HWACCEL_DXVA2(hevc), > +#endif > +#if CONFIG_HEVC_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(hevc), > +#endif > +#if CONFIG_HEVC_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(hevc), > +#endif > +#if CONFIG_HEVC_NVDEC_HWACCEL > + HWACCEL_NVDEC(hevc), > +#endif > +#if CONFIG_HEVC_VAAPI_HWACCEL > + HWACCEL_VAAPI(hevc), > +#endif > +#if CONFIG_HEVC_VDPAU_HWACCEL > + HWACCEL_VDPAU(hevc), > +#endif > +#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(hevc), > +#endif > + NULL > + }, > }; > diff --git a/libavcodec/hwaccel.h b/libavcodec/hwaccel.h > index 0198c7f858..382e0d0264 100644 > --- a/libavcodec/hwaccel.h > +++ b/libavcodec/hwaccel.h > @@ -20,6 +20,7 @@ > #define AVCODEC_HWACCEL_H > > #include "avcodec.h" > +#include "hwaccels.h" > > > #define HWACCEL_CAP_ASYNC_SAFE (1 << 0) > @@ -39,4 +40,53 @@ typedef struct AVCodecHWConfigInternal { > } AVCodecHWConfigInternal; > > > +// These macros are used to simplify AVCodecHWConfigInternal > definitions. > + > +#define HW_CONFIG_HWACCEL(format, device, name) \ > + &(const AVCodecHWConfigInternal) { \ > + .public = { \ > + .pix_fmt = AV_PIX_FMT_ ## format, \ > + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | \ > + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, \ > + .device_type = AV_HWDEVICE_TYPE_ ## device, \ > + }, \ > + .hwaccel = &name, \ > + } > + > +#define HW_CONFIG_INTERNAL(format) \ > + &(const AVCodecHWConfigInternal) { \ > + .public = { \ > + .pix_fmt = AV_PIX_FMT_ ## format, \ > + .methods = AV_CODEC_HW_CONFIG_METHOD_INTERNAL, \ > + .device_type = AV_HWDEVICE_TYPE_NONE, \ > + }, \ > + .hwaccel = NULL, \ > + } > + > +#define HW_CONFIG_AD_HOC_HWACCEL(format, name) \ > + &(const AVCodecHWConfigInternal) { \ > + .public = { \ > + .pix_fmt = AV_PIX_FMT_ ## format, \ > + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, \ > + .device_type = AV_HWDEVICE_TYPE_NONE, \ > + }, \ > + .hwaccel = &name, \ > + } > + > +#define HWACCEL_DXVA2(codec) \ > + HW_CONFIG_HWACCEL(DXVA2_VLD, DXVA2, ff_ ## codec ## > _dxva2_hwaccel) > +#define HWACCEL_D3D11VA2(codec) \ > + HW_CONFIG_HWACCEL(D3D11, D3D11VA, ff_ ## codec ## > _d3d11va2_hwaccel) > +#define HWACCEL_NVDEC(codec) \ > + HW_CONFIG_HWACCEL(CUDA, CUDA, ff_ ## codec ## > _nvdec_hwaccel) > +#define HWACCEL_VAAPI(codec) \ > + HW_CONFIG_HWACCEL(VAAPI, VAAPI, ff_ ## codec ## > _vaapi_hwaccel) > +#define HWACCEL_VDPAU(codec) \ > + HW_CONFIG_HWACCEL(VDPAU, VDPAU, ff_ ## codec ## > _vdpau_hwaccel) > +#define HWACCEL_VIDEOTOOLBOX(codec) \ > + HW_CONFIG_HWACCEL(VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## > _videotoolbox_hwaccel) > + > +#define HWACCEL_D3D11VA(codec) \ > + HW_CONFIG_AD_HOC_HWACCEL(D3D11VA_VLD, ff_ ## codec ## > _d3d11va_hwaccel) > + > #endif /* AVCODEC_HWACCEL_H */ > diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h > new file mode 100644 > index 0000000000..cd1e54b126 > --- /dev/null > +++ b/libavcodec/hwaccels.h > @@ -0,0 +1,72 @@ > +/* > + * This file is part of FFmpeg. > + * > + * FFmpeg is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * FFmpeg is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with FFmpeg; if not, write to the Free Software > + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA > 02110-1301 USA > + */ > + > +#ifndef AVCODEC_HWACCELS_H > +#define AVCODEC_HWACCELS_H > + > +#include "avcodec.h" > + > +extern AVHWAccel ff_h263_vaapi_hwaccel; > +extern AVHWAccel ff_h263_videotoolbox_hwaccel; > +extern AVHWAccel ff_h264_d3d11va_hwaccel; > +extern AVHWAccel ff_h264_d3d11va2_hwaccel; > +extern AVHWAccel ff_h264_dxva2_hwaccel; > +extern AVHWAccel ff_h264_nvdec_hwaccel; > +extern AVHWAccel ff_h264_vaapi_hwaccel; > +extern AVHWAccel ff_h264_vdpau_hwaccel; > +extern AVHWAccel ff_h264_videotoolbox_hwaccel; > +extern AVHWAccel ff_hevc_d3d11va_hwaccel; > +extern AVHWAccel ff_hevc_d3d11va2_hwaccel; > +extern AVHWAccel ff_hevc_dxva2_hwaccel; > +extern AVHWAccel ff_hevc_nvdec_hwaccel; > +extern AVHWAccel ff_hevc_vaapi_hwaccel; > +extern AVHWAccel ff_hevc_vdpau_hwaccel; > +extern AVHWAccel ff_hevc_videotoolbox_hwaccel; > +extern AVHWAccel ff_mpeg1_vdpau_hwaccel; > +extern AVHWAccel ff_mpeg1_videotoolbox_hwaccel; > +extern AVHWAccel ff_mpeg1_xvmc_hwaccel; > +extern AVHWAccel ff_mpeg2_d3d11va_hwaccel; > +extern AVHWAccel ff_mpeg2_d3d11va2_hwaccel; > +extern AVHWAccel ff_mpeg2_nvdec_hwaccel; > +extern AVHWAccel ff_mpeg2_dxva2_hwaccel; > +extern AVHWAccel ff_mpeg2_vaapi_hwaccel; > +extern AVHWAccel ff_mpeg2_vdpau_hwaccel; > +extern AVHWAccel ff_mpeg2_videotoolbox_hwaccel; > +extern AVHWAccel ff_mpeg2_xvmc_hwaccel; > +extern AVHWAccel ff_mpeg4_vaapi_hwaccel; > +extern AVHWAccel ff_mpeg4_vdpau_hwaccel; > +extern AVHWAccel ff_mpeg4_videotoolbox_hwaccel; > +extern AVHWAccel ff_vc1_d3d11va_hwaccel; > +extern AVHWAccel ff_vc1_d3d11va2_hwaccel; > +extern AVHWAccel ff_vc1_dxva2_hwaccel; > +extern AVHWAccel ff_vc1_nvdec_hwaccel; > +extern AVHWAccel ff_vc1_vaapi_hwaccel; > +extern AVHWAccel ff_vc1_vdpau_hwaccel; > +extern AVHWAccel ff_vp9_d3d11va_hwaccel; > +extern AVHWAccel ff_vp9_d3d11va2_hwaccel; > +extern AVHWAccel ff_vp9_dxva2_hwaccel; > +extern AVHWAccel ff_vp9_nvdec_hwaccel; > +extern AVHWAccel ff_vp9_vaapi_hwaccel; > +extern AVHWAccel ff_wmv3_d3d11va_hwaccel; > +extern AVHWAccel ff_wmv3_d3d11va2_hwaccel; > +extern AVHWAccel ff_wmv3_dxva2_hwaccel; > +extern AVHWAccel ff_wmv3_nvdec_hwaccel; > +extern AVHWAccel ff_wmv3_vaapi_hwaccel; > +extern AVHWAccel ff_wmv3_vdpau_hwaccel; > + > +#endif /* AVCODEC_HWACCELS_H */ > diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c > index 0cf9419ea3..feee316140 100644 > --- a/libavcodec/mediacodecdec.c > +++ b/libavcodec/mediacodecdec.c > @@ -515,6 +515,18 @@ static void mediacodec_decode_flush(AVCodecContext > *avctx) > ff_mediacodec_dec_flush(avctx, s->ctx); > } > > +static const AVCodecHWConfigInternal *mediacodec_hw_configs[] = { > + &(const AVCodecHWConfigInternal) { > + .public = { > + .pix_fmt = AV_PIX_FMT_MEDIACODEC, > + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, > + .device_type = AV_HWDEVICE_TYPE_NONE, > + }, > + .hwaccel = NULL, > + } > + NULL > +}; > + > #if CONFIG_H264_MEDIACODEC_DECODER > AVCodec ff_h264_mediacodec_decoder = { > .name = "h264_mediacodec", > @@ -529,6 +541,7 @@ AVCodec ff_h264_mediacodec_decoder = { > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > .bsfs = "h264_mp4toannexb", > + .hw_configs = mediacodec_hw_configs, > }; > #endif > > @@ -546,6 +559,7 @@ AVCodec ff_hevc_mediacodec_decoder = { > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > .bsfs = "hevc_mp4toannexb", > + .hw_configs = mediacodec_hw_configs, > }; > #endif > > @@ -562,6 +576,7 @@ AVCodec ff_mpeg2_mediacodec_decoder = { > .close = mediacodec_decode_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > + .hw_configs = mediacodec_hw_configs, > }; > #endif > > @@ -578,6 +593,7 @@ AVCodec ff_mpeg4_mediacodec_decoder = { > .close = mediacodec_decode_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > + .hw_configs = mediacodec_hw_configs, > }; > #endif > > @@ -594,6 +610,7 @@ AVCodec ff_vp8_mediacodec_decoder = { > .close = mediacodec_decode_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > + .hw_configs = mediacodec_hw_configs, > }; > #endif > > @@ -610,5 +627,6 @@ AVCodec ff_vp9_mediacodec_decoder = { > .close = mediacodec_decode_close, > .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, > .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, > + .hw_configs = mediacodec_hw_configs, > }; > #endif > diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c > index f2ee3557aa..836d1e20e0 100644 > --- a/libavcodec/mmaldec.c > +++ b/libavcodec/mmaldec.c > @@ -34,6 +34,7 @@ > #include <stdatomic.h> > > #include "avcodec.h" > +#include "hwaccel.h" > #include "internal.h" > #include "libavutil/avassert.h" > #include "libavutil/buffer.h" > @@ -835,6 +836,11 @@ AVHWAccel ff_vc1_mmal_hwaccel = { > .pix_fmt = AV_PIX_FMT_MMAL, > }; > > +static const AVCodecHWConfigInternal *mmal_hw_configs = { > + HW_CONFIG_INTERNAL(MMAL), > + NULL > +}; > + > static const AVOption options[]={ > {"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, > extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, > {"extra_decoder_buffers", "extra MMAL internal buffered frames", > offsetof(MMALDecodeContext, extra_decoder_buffers), AV_OPT_TYPE_INT, > {.i64 = 10}, 0, 256, 0}, > @@ -867,6 +873,7 @@ static const AVOption options[]={ > .pix_fmts = (const enum AVPixelFormat[]) { > AV_PIX_FMT_MMAL, \ > > AV_PIX_FMT_YUV420P, \ > > AV_PIX_FMT_NONE}, \ > + .hw_configs = mmal_hw_configs, > }; > > FFMMAL_DEC(h264, AV_CODEC_ID_H264) > diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c > index 2b213eebcd..ec656b6369 100644 > --- a/libavcodec/mpeg12dec.c > +++ b/libavcodec/mpeg12dec.c > @@ -36,6 +36,7 @@ > #include "avcodec.h" > #include "bytestream.h" > #include "error_resilience.h" > +#include "hwaccel.h" > #include "idctdsp.h" > #include "internal.h" > #include "mpeg_er.h" > @@ -2887,7 +2888,19 @@ AVCodec ff_mpeg1video_decoder = { > .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, > .flush = flush, > .max_lowres = 3, > - .update_thread_context = > ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context) > + .update_thread_context = > ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context), > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_MPEG1_VDPAU_HWACCEL > + HWACCEL_VDPAU(mpeg1), > +#endif > +#if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(mpeg1), > +#endif > +#if CONFIG_MPEG1_XVMC_HWACCEL > + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg1), > +#endif > + NULL > + }, > }; > > AVCodec ff_mpeg2video_decoder = { > @@ -2906,6 +2919,33 @@ AVCodec ff_mpeg2video_decoder = { > .flush = flush, > .max_lowres = 3, > .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg2_video_profiles), > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_MPEG2_DXVA2_HWACCEL > + HWACCEL_DXVA2(mpeg2), > +#endif > +#if CONFIG_MPEG2_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(mpeg2), > +#endif > +#if CONFIG_MPEG2_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(mpeg2), > +#endif > +#if CONFIG_MPEG2_NVDEC_HWACCEL > + HWACCEL_NVDEC(mpeg2), > +#endif > +#if CONFIG_MPEG2_VAAPI_HWACCEL > + HWACCEL_VAAPI(mpeg2), > +#endif > +#if CONFIG_MPEG2_VDPAU_HWACCEL > + HWACCEL_VDPAU(mpeg2), > +#endif > +#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(mpeg2), > +#endif > +#if CONFIG_MPEG2_XVMC_HWACCEL > + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg2), > +#endif > + NULL > + }, > }; > > //legacy decoder > diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c > index 76247c3b8c..8db1522296 100644 > --- a/libavcodec/mpeg4videodec.c > +++ b/libavcodec/mpeg4videodec.c > @@ -25,6 +25,7 @@ > #include "libavutil/internal.h" > #include "libavutil/opt.h" > #include "error_resilience.h" > +#include "hwaccel.h" > #include "idctdsp.h" > #include "internal.h" > #include "mpegutils.h" > @@ -2848,4 +2849,16 @@ AVCodec ff_mpeg4_decoder = { > .profiles = > NULL_IF_CONFIG_SMALL(ff_mpeg4_video_profiles), > .update_thread_context = > ONLY_IF_THREADS_ENABLED(mpeg4_update_thread_context), > .priv_class = &mpeg4_class, > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_MPEG4_VAAPI_HWACCEL > + HWACCEL_VAAPI(mpeg4), > +#endif > +#if CONFIG_MPEG4_VDPAU_HWACCEL > + HWACCEL_VDPAU(mpeg4), > +#endif > +#if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL > + HWACCEL_VIDEOTOOLBOX(mpeg4), > +#endif > + NULL > + }, > }; > diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c > index c00817f1d9..55fe59b531 100644 > --- a/libavcodec/qsvdec.c > +++ b/libavcodec/qsvdec.c > @@ -41,6 +41,19 @@ > #include "qsv_internal.h" > #include "qsvdec.h" > > +const AVCodecHWConfigInternal *ff_qsv_hw_configs[] = { > + &(const AVCodecHWConfigInternal) { > + .public = { > + .pix_fmt = AV_PIX_FMT_QSV, > + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX | > + AV_CODEC_HW_CONFIG_METHOD_AD_HOC, > + .device_type = AV_HWDEVICE_TYPE_QSV, > + }, > + .hwaccel = NULL, > + }, > + NULL > +}; > + > static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, > mfxSession session, > AVBufferRef *hw_frames_ref, AVBufferRef > *hw_device_ref) > { > diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h > index 4e86e4b7f8..5b7b03a48b 100644 > --- a/libavcodec/qsvdec.h > +++ b/libavcodec/qsvdec.h > @@ -33,6 +33,7 @@ > #include "libavutil/pixfmt.h" > > #include "avcodec.h" > +#include "hwaccel.h" > #include "qsv_internal.h" > > typedef struct QSVContext { > @@ -70,6 +71,8 @@ typedef struct QSVContext { > int nb_ext_buffers; > } QSVContext; > > +extern const AVCodecHWConfigInternal *ff_qsv_hw_configs[]; > + > int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, > AVFrame *frame, int *got_frame, AVPacket > *pkt); > > diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c > index a6b53cce8d..a8a96442df 100644 > --- a/libavcodec/qsvdec_h2645.c > +++ b/libavcodec/qsvdec_h2645.c > @@ -220,6 +220,7 @@ AVCodec ff_hevc_qsv_decoder = { > AV_PIX_FMT_P010, > AV_PIX_FMT_QSV, > AV_PIX_FMT_NONE }, > + .hw_configs = ff_qsv_hw_configs, > .bsfs = "hevc_mp4toannexb", > }; > #endif > @@ -262,6 +263,7 @@ AVCodec ff_h264_qsv_decoder = { > AV_PIX_FMT_P010, > AV_PIX_FMT_QSV, > AV_PIX_FMT_NONE }, > + .hw_configs = ff_qsv_hw_configs, > .bsfs = "h264_mp4toannexb", > }; > #endif > diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c > index b94093d53c..21aa56492f 100644 > --- a/libavcodec/qsvdec_other.c > +++ b/libavcodec/qsvdec_other.c > @@ -190,6 +190,7 @@ AVCodec ff_mpeg2_qsv_decoder = { > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, > AV_PIX_FMT_QSV, > AV_PIX_FMT_NONE }, > + .hw_configs = ff_qsv_hw_configs, > }; > #endif > > @@ -225,6 +226,7 @@ AVCodec ff_vc1_qsv_decoder = { > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, > AV_PIX_FMT_QSV, > AV_PIX_FMT_NONE }, > + .hw_configs = ff_qsv_hw_configs, > }; > #endif > > @@ -260,5 +262,6 @@ AVCodec ff_vp8_qsv_decoder = { > .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, > AV_PIX_FMT_QSV, > AV_PIX_FMT_NONE }, > + .hw_configs = ff_qsv_hw_configs, > }; > #endif > diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c > index 96b8bb5364..f479a7625b 100644 > --- a/libavcodec/vc1dec.c > +++ b/libavcodec/vc1dec.c > @@ -29,6 +29,7 @@ > #include "avcodec.h" > #include "blockdsp.h" > #include "get_bits.h" > +#include "hwaccel.h" > #include "internal.h" > #include "mpeg_er.h" > #include "mpegvideo.h" > @@ -1144,6 +1145,27 @@ AVCodec ff_vc1_decoder = { > .flush = ff_mpeg_flush, > .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, > .pix_fmts = vc1_hwaccel_pixfmt_list_420, > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_VC1_DXVA2_HWACCEL > + HWACCEL_DXVA2(vc1), > +#endif > +#if CONFIG_VC1_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(vc1), > +#endif > +#if CONFIG_VC1_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(vc1), > +#endif > +#if CONFIG_VC1_NVDEC_HWACCEL > + HWACCEL_NVDEC(vc1), > +#endif > +#if CONFIG_VC1_VAAPI_HWACCEL > + HWACCEL_VAAPI(vc1), > +#endif > +#if CONFIG_VC1_VDPAU_HWACCEL > + HWACCEL_VDPAU(vc1), > +#endif > + NULL > + }, > .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) > }; > > @@ -1160,6 +1182,27 @@ AVCodec ff_wmv3_decoder = { > .flush = ff_mpeg_flush, > .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, > .pix_fmts = vc1_hwaccel_pixfmt_list_420, > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_VC1_DXVA2_HWACCEL > + HWACCEL_DXVA2(wmv3), > +#endif > +#if CONFIG_VC1_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(wmv3), > +#endif > +#if CONFIG_VC1_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(wmv3), > +#endif > +#if CONFIG_VC1_NVDEC_HWACCEL > + HWACCEL_NVDEC(wmv3), > +#endif > +#if CONFIG_VC1_VAAPI_HWACCEL > + HWACCEL_VAAPI(wmv3), > +#endif > +#if CONFIG_VC1_VDPAU_HWACCEL > + HWACCEL_VDPAU(wmv3), > +#endif > + NULL > + }, > .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) > }; > #endif > diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c > index 6ce9be61bb..1ea2869c4c 100644 > --- a/libavcodec/vp9.c > +++ b/libavcodec/vp9.c > @@ -23,6 +23,7 @@ > > #include "avcodec.h" > #include "get_bits.h" > +#include "hwaccel.h" > #include "internal.h" > #include "profiles.h" > #include "thread.h" > @@ -1794,4 +1795,22 @@ AVCodec ff_vp9_decoder = { > .init_thread_copy = > ONLY_IF_THREADS_ENABLED(vp9_decode_init_thread_copy), > .update_thread_context = > ONLY_IF_THREADS_ENABLED(vp9_decode_update_thread_context), > .profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), > + .hw_configs = (const AVCodecHWConfigInternal*[]) { > +#if CONFIG_VP9_DXVA2_HWACCEL > + HWACCEL_DXVA2(vp9), > +#endif > +#if CONFIG_VP9_D3D11VA_HWACCEL > + HWACCEL_D3D11VA(vp9), > +#endif > +#if CONFIG_VP9_D3D11VA2_HWACCEL > + HWACCEL_D3D11VA2(vp9), > +#endif > +#if CONFIG_VP9_NVDEC_HWACCEL > + HWACCEL_NVDEC(vp9), > +#endif > +#if CONFIG_VP9_VAAPI_HWACCEL > + HWACCEL_VAAPI(vp9), > +#endif > + NULL > + }, > }; Do you also need to add metadata for crystalhd? It's a fake hwaccel that returns software frames. Otherwise looks fine --phil
On 2017-11-20 13:15, Philip Langdale wrote: > On 2017-11-18 10:47, Mark Thompson wrote: >> This includes a pointer to the associated hwaccel for decoders using >> hwaccels - these will be used later to implement the hwaccel setup >> without needing a global list. >> >> Also added is a new file listing all hwaccels as external declarations >> - >> this will be used later to generate the hwaccel list at configure >> time. >> --- >> libavcodec/cuviddec.c | 15 ++++++++++ >> libavcodec/h263dec.c | 13 +++++++++ >> libavcodec/h264dec.c | 25 ++++++++++++++++ >> libavcodec/hevcdec.c | 25 ++++++++++++++++ >> libavcodec/hwaccel.h | 50 ++++++++++++++++++++++++++++++++ >> libavcodec/hwaccels.h | 72 >> ++++++++++++++++++++++++++++++++++++++++++++++ >> libavcodec/mediacodecdec.c | 18 ++++++++++++ >> libavcodec/mmaldec.c | 7 +++++ >> libavcodec/mpeg12dec.c | 42 ++++++++++++++++++++++++++- >> libavcodec/mpeg4videodec.c | 13 +++++++++ >> libavcodec/qsvdec.c | 13 +++++++++ >> libavcodec/qsvdec.h | 3 ++ >> libavcodec/qsvdec_h2645.c | 2 ++ >> libavcodec/qsvdec_other.c | 3 ++ >> libavcodec/vc1dec.c | 43 +++++++++++++++++++++++++++ >> libavcodec/vp9.c | 19 ++++++++++++ >> 16 files changed, 362 insertions(+), 1 deletion(-) >> create mode 100644 libavcodec/hwaccels.h >> >> diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c >> index 6370348639..0e5123304a 100644 >> --- a/libavcodec/cuviddec.c >> +++ b/libavcodec/cuviddec.c >> @@ -32,6 +32,7 @@ >> >> #include "avcodec.h" >> #include "decode.h" >> +#include "hwaccel.h" >> #include "internal.h" >> >> typedef struct CuvidContext >> @@ -1094,6 +1095,19 @@ static const AVOption options[] = { >> { NULL } >> }; >> >> +static const AVCodecHWConfigInternal *cuvid_hw_configs[] = { >> + &(const AVCodecHWConfigInternal) { >> + .public = { >> + .pix_fmt = AV_PIX_FMT_CUDA, >> + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | >> + AV_CODEC_HW_CONFIG_METHOD_INTERNAL, >> + .device_type = AV_HWDEVICE_TYPE_CUDA >> + }, >> + .hwaccel = NULL, >> + }, >> + NULL >> +}; >> + >> #define DEFINE_CUVID_CODEC(x, X) \ >> static const AVClass x##_cuvid_class = { \ >> .class_name = #x "_cuvid", \ >> @@ -1127,6 +1141,7 @@ static const AVOption options[] = { >> >> AV_PIX_FMT_P010, \ >> >> AV_PIX_FMT_P016, \ >> >> AV_PIX_FMT_NONE }, \ >> + .hw_configs = cuvid_hw_configs, \ >> }; >> >> #if CONFIG_HEVC_CUVID_DECODER >> diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c >> index c7cf4bc0c2..cf66e520b0 100644 >> --- a/libavcodec/h263dec.c >> +++ b/libavcodec/h263dec.c >> @@ -33,6 +33,7 @@ >> #include "flv.h" >> #include "h263.h" >> #include "h263_parser.h" >> +#include "hwaccel.h" >> #include "internal.h" >> #include "mpeg_er.h" >> #include "mpeg4video.h" >> @@ -756,4 +757,16 @@ AVCodec ff_h263p_decoder = { >> .flush = ff_mpeg_flush, >> .max_lowres = 3, >> .pix_fmts = ff_h263_hwaccel_pixfmt_list_420, >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_H263_VAAPI_HWACCEL >> + HWACCEL_VAAPI(h263), >> +#endif >> +#if CONFIG_MPEG4_VDPAU_HWACCEL >> + HWACCEL_VDPAU(mpeg4), >> +#endif >> +#if CONFIG_H263_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(h263), >> +#endif >> + NULL >> + }, >> }; >> diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c >> index be187eb5f4..b03024d4a3 100644 >> --- a/libavcodec/h264dec.c >> +++ b/libavcodec/h264dec.c >> @@ -47,6 +47,7 @@ >> #include "h264_mvpred.h" >> #include "h264_ps.h" >> #include "golomb.h" >> +#include "hwaccel.h" >> #include "mathops.h" >> #include "me_cmp.h" >> #include "mpegutils.h" >> @@ -1059,6 +1060,30 @@ AVCodec ff_h264_decoder = { >> .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ >> AV_CODEC_CAP_DR1 | >> AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_SLICE_THREADS | >> AV_CODEC_CAP_FRAME_THREADS, >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_H264_DXVA2_HWACCEL >> + HWACCEL_DXVA2(h264), >> +#endif >> +#if CONFIG_H264_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(h264), >> +#endif >> +#if CONFIG_H264_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(h264), >> +#endif >> +#if CONFIG_H264_NVDEC_HWACCEL >> + HWACCEL_NVDEC(h264), >> +#endif >> +#if CONFIG_H264_VAAPI_HWACCEL >> + HWACCEL_VAAPI(h264), >> +#endif >> +#if CONFIG_H264_VDPAU_HWACCEL >> + HWACCEL_VDPAU(h264), >> +#endif >> +#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(h264), >> +#endif >> + NULL >> + }, >> .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | >> FF_CODEC_CAP_EXPORTS_CROPPING, >> .flush = flush_dpb, >> .init_thread_copy = >> ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), >> diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c >> index 75960912b1..5ec6105d2f 100644 >> --- a/libavcodec/hevcdec.c >> +++ b/libavcodec/hevcdec.c >> @@ -41,6 +41,7 @@ >> #include "hevc_data.h" >> #include "hevc_parse.h" >> #include "hevcdec.h" >> +#include "hwaccel.h" >> #include "profiles.h" >> >> const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, >> [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; >> @@ -3510,4 +3511,28 @@ AVCodec ff_hevc_decoder = { >> AV_CODEC_CAP_SLICE_THREADS | >> AV_CODEC_CAP_FRAME_THREADS, >> .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | >> FF_CODEC_CAP_EXPORTS_CROPPING, >> .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles), >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_HEVC_DXVA2_HWACCEL >> + HWACCEL_DXVA2(hevc), >> +#endif >> +#if CONFIG_HEVC_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(hevc), >> +#endif >> +#if CONFIG_HEVC_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(hevc), >> +#endif >> +#if CONFIG_HEVC_NVDEC_HWACCEL >> + HWACCEL_NVDEC(hevc), >> +#endif >> +#if CONFIG_HEVC_VAAPI_HWACCEL >> + HWACCEL_VAAPI(hevc), >> +#endif >> +#if CONFIG_HEVC_VDPAU_HWACCEL >> + HWACCEL_VDPAU(hevc), >> +#endif >> +#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(hevc), >> +#endif >> + NULL >> + }, >> }; >> diff --git a/libavcodec/hwaccel.h b/libavcodec/hwaccel.h >> index 0198c7f858..382e0d0264 100644 >> --- a/libavcodec/hwaccel.h >> +++ b/libavcodec/hwaccel.h >> @@ -20,6 +20,7 @@ >> #define AVCODEC_HWACCEL_H >> >> #include "avcodec.h" >> +#include "hwaccels.h" >> >> >> #define HWACCEL_CAP_ASYNC_SAFE (1 << 0) >> @@ -39,4 +40,53 @@ typedef struct AVCodecHWConfigInternal { >> } AVCodecHWConfigInternal; >> >> >> +// These macros are used to simplify AVCodecHWConfigInternal >> definitions. >> + >> +#define HW_CONFIG_HWACCEL(format, device, name) \ >> + &(const AVCodecHWConfigInternal) { \ >> + .public = { \ >> + .pix_fmt = AV_PIX_FMT_ ## format, \ >> + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | >> \ >> + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, \ >> + .device_type = AV_HWDEVICE_TYPE_ ## device, \ >> + }, \ >> + .hwaccel = &name, \ >> + } >> + >> +#define HW_CONFIG_INTERNAL(format) \ >> + &(const AVCodecHWConfigInternal) { \ >> + .public = { \ >> + .pix_fmt = AV_PIX_FMT_ ## format, \ >> + .methods = AV_CODEC_HW_CONFIG_METHOD_INTERNAL, \ >> + .device_type = AV_HWDEVICE_TYPE_NONE, \ >> + }, \ >> + .hwaccel = NULL, \ >> + } >> + >> +#define HW_CONFIG_AD_HOC_HWACCEL(format, name) \ >> + &(const AVCodecHWConfigInternal) { \ >> + .public = { \ >> + .pix_fmt = AV_PIX_FMT_ ## format, \ >> + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, \ >> + .device_type = AV_HWDEVICE_TYPE_NONE, \ >> + }, \ >> + .hwaccel = &name, \ >> + } >> + >> +#define HWACCEL_DXVA2(codec) \ >> + HW_CONFIG_HWACCEL(DXVA2_VLD, DXVA2, ff_ ## codec ## >> _dxva2_hwaccel) >> +#define HWACCEL_D3D11VA2(codec) \ >> + HW_CONFIG_HWACCEL(D3D11, D3D11VA, ff_ ## codec ## >> _d3d11va2_hwaccel) >> +#define HWACCEL_NVDEC(codec) \ >> + HW_CONFIG_HWACCEL(CUDA, CUDA, ff_ ## codec ## >> _nvdec_hwaccel) >> +#define HWACCEL_VAAPI(codec) \ >> + HW_CONFIG_HWACCEL(VAAPI, VAAPI, ff_ ## codec ## >> _vaapi_hwaccel) >> +#define HWACCEL_VDPAU(codec) \ >> + HW_CONFIG_HWACCEL(VDPAU, VDPAU, ff_ ## codec ## >> _vdpau_hwaccel) >> +#define HWACCEL_VIDEOTOOLBOX(codec) \ >> + HW_CONFIG_HWACCEL(VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## >> _videotoolbox_hwaccel) >> + >> +#define HWACCEL_D3D11VA(codec) \ >> + HW_CONFIG_AD_HOC_HWACCEL(D3D11VA_VLD, ff_ ## codec ## >> _d3d11va_hwaccel) >> + >> #endif /* AVCODEC_HWACCEL_H */ >> diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h >> new file mode 100644 >> index 0000000000..cd1e54b126 >> --- /dev/null >> +++ b/libavcodec/hwaccels.h >> @@ -0,0 +1,72 @@ >> +/* >> + * This file is part of FFmpeg. >> + * >> + * FFmpeg is free software; you can redistribute it and/or >> + * modify it under the terms of the GNU Lesser General Public >> + * License as published by the Free Software Foundation; either >> + * version 2.1 of the License, or (at your option) any later version. >> + * >> + * FFmpeg is distributed in the hope that it will be useful, >> + * but WITHOUT ANY WARRANTY; without even the implied warranty of >> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU >> + * Lesser General Public License for more details. >> + * >> + * You should have received a copy of the GNU Lesser General Public >> + * License along with FFmpeg; if not, write to the Free Software >> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA >> 02110-1301 USA >> + */ >> + >> +#ifndef AVCODEC_HWACCELS_H >> +#define AVCODEC_HWACCELS_H >> + >> +#include "avcodec.h" >> + >> +extern AVHWAccel ff_h263_vaapi_hwaccel; >> +extern AVHWAccel ff_h263_videotoolbox_hwaccel; >> +extern AVHWAccel ff_h264_d3d11va_hwaccel; >> +extern AVHWAccel ff_h264_d3d11va2_hwaccel; >> +extern AVHWAccel ff_h264_dxva2_hwaccel; >> +extern AVHWAccel ff_h264_nvdec_hwaccel; >> +extern AVHWAccel ff_h264_vaapi_hwaccel; >> +extern AVHWAccel ff_h264_vdpau_hwaccel; >> +extern AVHWAccel ff_h264_videotoolbox_hwaccel; >> +extern AVHWAccel ff_hevc_d3d11va_hwaccel; >> +extern AVHWAccel ff_hevc_d3d11va2_hwaccel; >> +extern AVHWAccel ff_hevc_dxva2_hwaccel; >> +extern AVHWAccel ff_hevc_nvdec_hwaccel; >> +extern AVHWAccel ff_hevc_vaapi_hwaccel; >> +extern AVHWAccel ff_hevc_vdpau_hwaccel; >> +extern AVHWAccel ff_hevc_videotoolbox_hwaccel; >> +extern AVHWAccel ff_mpeg1_vdpau_hwaccel; >> +extern AVHWAccel ff_mpeg1_videotoolbox_hwaccel; >> +extern AVHWAccel ff_mpeg1_xvmc_hwaccel; >> +extern AVHWAccel ff_mpeg2_d3d11va_hwaccel; >> +extern AVHWAccel ff_mpeg2_d3d11va2_hwaccel; >> +extern AVHWAccel ff_mpeg2_nvdec_hwaccel; >> +extern AVHWAccel ff_mpeg2_dxva2_hwaccel; >> +extern AVHWAccel ff_mpeg2_vaapi_hwaccel; >> +extern AVHWAccel ff_mpeg2_vdpau_hwaccel; >> +extern AVHWAccel ff_mpeg2_videotoolbox_hwaccel; >> +extern AVHWAccel ff_mpeg2_xvmc_hwaccel; >> +extern AVHWAccel ff_mpeg4_vaapi_hwaccel; >> +extern AVHWAccel ff_mpeg4_vdpau_hwaccel; >> +extern AVHWAccel ff_mpeg4_videotoolbox_hwaccel; >> +extern AVHWAccel ff_vc1_d3d11va_hwaccel; >> +extern AVHWAccel ff_vc1_d3d11va2_hwaccel; >> +extern AVHWAccel ff_vc1_dxva2_hwaccel; >> +extern AVHWAccel ff_vc1_nvdec_hwaccel; >> +extern AVHWAccel ff_vc1_vaapi_hwaccel; >> +extern AVHWAccel ff_vc1_vdpau_hwaccel; >> +extern AVHWAccel ff_vp9_d3d11va_hwaccel; >> +extern AVHWAccel ff_vp9_d3d11va2_hwaccel; >> +extern AVHWAccel ff_vp9_dxva2_hwaccel; >> +extern AVHWAccel ff_vp9_nvdec_hwaccel; >> +extern AVHWAccel ff_vp9_vaapi_hwaccel; >> +extern AVHWAccel ff_wmv3_d3d11va_hwaccel; >> +extern AVHWAccel ff_wmv3_d3d11va2_hwaccel; >> +extern AVHWAccel ff_wmv3_dxva2_hwaccel; >> +extern AVHWAccel ff_wmv3_nvdec_hwaccel; >> +extern AVHWAccel ff_wmv3_vaapi_hwaccel; >> +extern AVHWAccel ff_wmv3_vdpau_hwaccel; >> + >> +#endif /* AVCODEC_HWACCELS_H */ >> diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c >> index 0cf9419ea3..feee316140 100644 >> --- a/libavcodec/mediacodecdec.c >> +++ b/libavcodec/mediacodecdec.c >> @@ -515,6 +515,18 @@ static void >> mediacodec_decode_flush(AVCodecContext *avctx) >> ff_mediacodec_dec_flush(avctx, s->ctx); >> } >> >> +static const AVCodecHWConfigInternal *mediacodec_hw_configs[] = { >> + &(const AVCodecHWConfigInternal) { >> + .public = { >> + .pix_fmt = AV_PIX_FMT_MEDIACODEC, >> + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, >> + .device_type = AV_HWDEVICE_TYPE_NONE, >> + }, >> + .hwaccel = NULL, >> + } >> + NULL >> +}; >> + >> #if CONFIG_H264_MEDIACODEC_DECODER >> AVCodec ff_h264_mediacodec_decoder = { >> .name = "h264_mediacodec", >> @@ -529,6 +541,7 @@ AVCodec ff_h264_mediacodec_decoder = { >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> .bsfs = "h264_mp4toannexb", >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> >> @@ -546,6 +559,7 @@ AVCodec ff_hevc_mediacodec_decoder = { >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> .bsfs = "hevc_mp4toannexb", >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> >> @@ -562,6 +576,7 @@ AVCodec ff_mpeg2_mediacodec_decoder = { >> .close = mediacodec_decode_close, >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> >> @@ -578,6 +593,7 @@ AVCodec ff_mpeg4_mediacodec_decoder = { >> .close = mediacodec_decode_close, >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> >> @@ -594,6 +610,7 @@ AVCodec ff_vp8_mediacodec_decoder = { >> .close = mediacodec_decode_close, >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> >> @@ -610,5 +627,6 @@ AVCodec ff_vp9_mediacodec_decoder = { >> .close = mediacodec_decode_close, >> .capabilities = AV_CODEC_CAP_DELAY | >> AV_CODEC_CAP_AVOID_PROBING, >> .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, >> + .hw_configs = mediacodec_hw_configs, >> }; >> #endif >> diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c >> index f2ee3557aa..836d1e20e0 100644 >> --- a/libavcodec/mmaldec.c >> +++ b/libavcodec/mmaldec.c >> @@ -34,6 +34,7 @@ >> #include <stdatomic.h> >> >> #include "avcodec.h" >> +#include "hwaccel.h" >> #include "internal.h" >> #include "libavutil/avassert.h" >> #include "libavutil/buffer.h" >> @@ -835,6 +836,11 @@ AVHWAccel ff_vc1_mmal_hwaccel = { >> .pix_fmt = AV_PIX_FMT_MMAL, >> }; >> >> +static const AVCodecHWConfigInternal *mmal_hw_configs = { >> + HW_CONFIG_INTERNAL(MMAL), >> + NULL >> +}; >> + >> static const AVOption options[]={ >> {"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, >> extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, >> {"extra_decoder_buffers", "extra MMAL internal buffered frames", >> offsetof(MMALDecodeContext, extra_decoder_buffers), AV_OPT_TYPE_INT, >> {.i64 = 10}, 0, 256, 0}, >> @@ -867,6 +873,7 @@ static const AVOption options[]={ >> .pix_fmts = (const enum AVPixelFormat[]) { >> AV_PIX_FMT_MMAL, \ >> >> AV_PIX_FMT_YUV420P, \ >> >> AV_PIX_FMT_NONE}, \ >> + .hw_configs = mmal_hw_configs, >> }; >> >> FFMMAL_DEC(h264, AV_CODEC_ID_H264) >> diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c >> index 2b213eebcd..ec656b6369 100644 >> --- a/libavcodec/mpeg12dec.c >> +++ b/libavcodec/mpeg12dec.c >> @@ -36,6 +36,7 @@ >> #include "avcodec.h" >> #include "bytestream.h" >> #include "error_resilience.h" >> +#include "hwaccel.h" >> #include "idctdsp.h" >> #include "internal.h" >> #include "mpeg_er.h" >> @@ -2887,7 +2888,19 @@ AVCodec ff_mpeg1video_decoder = { >> .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, >> .flush = flush, >> .max_lowres = 3, >> - .update_thread_context = >> ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context) >> + .update_thread_context = >> ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context), >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_MPEG1_VDPAU_HWACCEL >> + HWACCEL_VDPAU(mpeg1), >> +#endif >> +#if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(mpeg1), >> +#endif >> +#if CONFIG_MPEG1_XVMC_HWACCEL >> + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg1), >> +#endif >> + NULL >> + }, >> }; >> >> AVCodec ff_mpeg2video_decoder = { >> @@ -2906,6 +2919,33 @@ AVCodec ff_mpeg2video_decoder = { >> .flush = flush, >> .max_lowres = 3, >> .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg2_video_profiles), >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_MPEG2_DXVA2_HWACCEL >> + HWACCEL_DXVA2(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_NVDEC_HWACCEL >> + HWACCEL_NVDEC(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_VAAPI_HWACCEL >> + HWACCEL_VAAPI(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_VDPAU_HWACCEL >> + HWACCEL_VDPAU(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(mpeg2), >> +#endif >> +#if CONFIG_MPEG2_XVMC_HWACCEL >> + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg2), >> +#endif >> + NULL >> + }, >> }; >> >> //legacy decoder >> diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c >> index 76247c3b8c..8db1522296 100644 >> --- a/libavcodec/mpeg4videodec.c >> +++ b/libavcodec/mpeg4videodec.c >> @@ -25,6 +25,7 @@ >> #include "libavutil/internal.h" >> #include "libavutil/opt.h" >> #include "error_resilience.h" >> +#include "hwaccel.h" >> #include "idctdsp.h" >> #include "internal.h" >> #include "mpegutils.h" >> @@ -2848,4 +2849,16 @@ AVCodec ff_mpeg4_decoder = { >> .profiles = >> NULL_IF_CONFIG_SMALL(ff_mpeg4_video_profiles), >> .update_thread_context = >> ONLY_IF_THREADS_ENABLED(mpeg4_update_thread_context), >> .priv_class = &mpeg4_class, >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_MPEG4_VAAPI_HWACCEL >> + HWACCEL_VAAPI(mpeg4), >> +#endif >> +#if CONFIG_MPEG4_VDPAU_HWACCEL >> + HWACCEL_VDPAU(mpeg4), >> +#endif >> +#if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL >> + HWACCEL_VIDEOTOOLBOX(mpeg4), >> +#endif >> + NULL >> + }, >> }; >> diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c >> index c00817f1d9..55fe59b531 100644 >> --- a/libavcodec/qsvdec.c >> +++ b/libavcodec/qsvdec.c >> @@ -41,6 +41,19 @@ >> #include "qsv_internal.h" >> #include "qsvdec.h" >> >> +const AVCodecHWConfigInternal *ff_qsv_hw_configs[] = { >> + &(const AVCodecHWConfigInternal) { >> + .public = { >> + .pix_fmt = AV_PIX_FMT_QSV, >> + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX | >> + AV_CODEC_HW_CONFIG_METHOD_AD_HOC, >> + .device_type = AV_HWDEVICE_TYPE_QSV, >> + }, >> + .hwaccel = NULL, >> + }, >> + NULL >> +}; >> + >> static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, >> mfxSession session, >> AVBufferRef *hw_frames_ref, AVBufferRef >> *hw_device_ref) >> { >> diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h >> index 4e86e4b7f8..5b7b03a48b 100644 >> --- a/libavcodec/qsvdec.h >> +++ b/libavcodec/qsvdec.h >> @@ -33,6 +33,7 @@ >> #include "libavutil/pixfmt.h" >> >> #include "avcodec.h" >> +#include "hwaccel.h" >> #include "qsv_internal.h" >> >> typedef struct QSVContext { >> @@ -70,6 +71,8 @@ typedef struct QSVContext { >> int nb_ext_buffers; >> } QSVContext; >> >> +extern const AVCodecHWConfigInternal *ff_qsv_hw_configs[]; >> + >> int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, >> AVFrame *frame, int *got_frame, AVPacket >> *pkt); >> >> diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c >> index a6b53cce8d..a8a96442df 100644 >> --- a/libavcodec/qsvdec_h2645.c >> +++ b/libavcodec/qsvdec_h2645.c >> @@ -220,6 +220,7 @@ AVCodec ff_hevc_qsv_decoder = { >> AV_PIX_FMT_P010, >> AV_PIX_FMT_QSV, >> AV_PIX_FMT_NONE >> }, >> + .hw_configs = ff_qsv_hw_configs, >> .bsfs = "hevc_mp4toannexb", >> }; >> #endif >> @@ -262,6 +263,7 @@ AVCodec ff_h264_qsv_decoder = { >> AV_PIX_FMT_P010, >> AV_PIX_FMT_QSV, >> AV_PIX_FMT_NONE >> }, >> + .hw_configs = ff_qsv_hw_configs, >> .bsfs = "h264_mp4toannexb", >> }; >> #endif >> diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c >> index b94093d53c..21aa56492f 100644 >> --- a/libavcodec/qsvdec_other.c >> +++ b/libavcodec/qsvdec_other.c >> @@ -190,6 +190,7 @@ AVCodec ff_mpeg2_qsv_decoder = { >> .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, >> AV_PIX_FMT_QSV, >> AV_PIX_FMT_NONE >> }, >> + .hw_configs = ff_qsv_hw_configs, >> }; >> #endif >> >> @@ -225,6 +226,7 @@ AVCodec ff_vc1_qsv_decoder = { >> .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, >> AV_PIX_FMT_QSV, >> AV_PIX_FMT_NONE >> }, >> + .hw_configs = ff_qsv_hw_configs, >> }; >> #endif >> >> @@ -260,5 +262,6 @@ AVCodec ff_vp8_qsv_decoder = { >> .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, >> AV_PIX_FMT_QSV, >> AV_PIX_FMT_NONE >> }, >> + .hw_configs = ff_qsv_hw_configs, >> }; >> #endif >> diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c >> index 96b8bb5364..f479a7625b 100644 >> --- a/libavcodec/vc1dec.c >> +++ b/libavcodec/vc1dec.c >> @@ -29,6 +29,7 @@ >> #include "avcodec.h" >> #include "blockdsp.h" >> #include "get_bits.h" >> +#include "hwaccel.h" >> #include "internal.h" >> #include "mpeg_er.h" >> #include "mpegvideo.h" >> @@ -1144,6 +1145,27 @@ AVCodec ff_vc1_decoder = { >> .flush = ff_mpeg_flush, >> .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, >> .pix_fmts = vc1_hwaccel_pixfmt_list_420, >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_VC1_DXVA2_HWACCEL >> + HWACCEL_DXVA2(vc1), >> +#endif >> +#if CONFIG_VC1_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(vc1), >> +#endif >> +#if CONFIG_VC1_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(vc1), >> +#endif >> +#if CONFIG_VC1_NVDEC_HWACCEL >> + HWACCEL_NVDEC(vc1), >> +#endif >> +#if CONFIG_VC1_VAAPI_HWACCEL >> + HWACCEL_VAAPI(vc1), >> +#endif >> +#if CONFIG_VC1_VDPAU_HWACCEL >> + HWACCEL_VDPAU(vc1), >> +#endif >> + NULL >> + }, >> .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) >> }; >> >> @@ -1160,6 +1182,27 @@ AVCodec ff_wmv3_decoder = { >> .flush = ff_mpeg_flush, >> .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, >> .pix_fmts = vc1_hwaccel_pixfmt_list_420, >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_VC1_DXVA2_HWACCEL >> + HWACCEL_DXVA2(wmv3), >> +#endif >> +#if CONFIG_VC1_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(wmv3), >> +#endif >> +#if CONFIG_VC1_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(wmv3), >> +#endif >> +#if CONFIG_VC1_NVDEC_HWACCEL >> + HWACCEL_NVDEC(wmv3), >> +#endif >> +#if CONFIG_VC1_VAAPI_HWACCEL >> + HWACCEL_VAAPI(wmv3), >> +#endif >> +#if CONFIG_VC1_VDPAU_HWACCEL >> + HWACCEL_VDPAU(wmv3), >> +#endif >> + NULL >> + }, >> .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) >> }; >> #endif >> diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c >> index 6ce9be61bb..1ea2869c4c 100644 >> --- a/libavcodec/vp9.c >> +++ b/libavcodec/vp9.c >> @@ -23,6 +23,7 @@ >> >> #include "avcodec.h" >> #include "get_bits.h" >> +#include "hwaccel.h" >> #include "internal.h" >> #include "profiles.h" >> #include "thread.h" >> @@ -1794,4 +1795,22 @@ AVCodec ff_vp9_decoder = { >> .init_thread_copy = >> ONLY_IF_THREADS_ENABLED(vp9_decode_init_thread_copy), >> .update_thread_context = >> ONLY_IF_THREADS_ENABLED(vp9_decode_update_thread_context), >> .profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), >> + .hw_configs = (const AVCodecHWConfigInternal*[]) { >> +#if CONFIG_VP9_DXVA2_HWACCEL >> + HWACCEL_DXVA2(vp9), >> +#endif >> +#if CONFIG_VP9_D3D11VA_HWACCEL >> + HWACCEL_D3D11VA(vp9), >> +#endif >> +#if CONFIG_VP9_D3D11VA2_HWACCEL >> + HWACCEL_D3D11VA2(vp9), >> +#endif >> +#if CONFIG_VP9_NVDEC_HWACCEL >> + HWACCEL_NVDEC(vp9), >> +#endif >> +#if CONFIG_VP9_VAAPI_HWACCEL >> + HWACCEL_VAAPI(vp9), >> +#endif >> + NULL >> + }, >> }; > > Do you also need to add metadata for crystalhd? It's a fake hwaccel > that returns > software frames. n/m. I forgot - it never declared an hwaccel to begin with. > > Otherwise looks fine --phil
diff --git a/libavcodec/cuviddec.c b/libavcodec/cuviddec.c index 6370348639..0e5123304a 100644 --- a/libavcodec/cuviddec.c +++ b/libavcodec/cuviddec.c @@ -32,6 +32,7 @@ #include "avcodec.h" #include "decode.h" +#include "hwaccel.h" #include "internal.h" typedef struct CuvidContext @@ -1094,6 +1095,19 @@ static const AVOption options[] = { { NULL } }; +static const AVCodecHWConfigInternal *cuvid_hw_configs[] = { + &(const AVCodecHWConfigInternal) { + .public = { + .pix_fmt = AV_PIX_FMT_CUDA, + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | + AV_CODEC_HW_CONFIG_METHOD_INTERNAL, + .device_type = AV_HWDEVICE_TYPE_CUDA + }, + .hwaccel = NULL, + }, + NULL +}; + #define DEFINE_CUVID_CODEC(x, X) \ static const AVClass x##_cuvid_class = { \ .class_name = #x "_cuvid", \ @@ -1127,6 +1141,7 @@ static const AVOption options[] = { AV_PIX_FMT_P010, \ AV_PIX_FMT_P016, \ AV_PIX_FMT_NONE }, \ + .hw_configs = cuvid_hw_configs, \ }; #if CONFIG_HEVC_CUVID_DECODER diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c index c7cf4bc0c2..cf66e520b0 100644 --- a/libavcodec/h263dec.c +++ b/libavcodec/h263dec.c @@ -33,6 +33,7 @@ #include "flv.h" #include "h263.h" #include "h263_parser.h" +#include "hwaccel.h" #include "internal.h" #include "mpeg_er.h" #include "mpeg4video.h" @@ -756,4 +757,16 @@ AVCodec ff_h263p_decoder = { .flush = ff_mpeg_flush, .max_lowres = 3, .pix_fmts = ff_h263_hwaccel_pixfmt_list_420, + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_H263_VAAPI_HWACCEL + HWACCEL_VAAPI(h263), +#endif +#if CONFIG_MPEG4_VDPAU_HWACCEL + HWACCEL_VDPAU(mpeg4), +#endif +#if CONFIG_H263_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(h263), +#endif + NULL + }, }; diff --git a/libavcodec/h264dec.c b/libavcodec/h264dec.c index be187eb5f4..b03024d4a3 100644 --- a/libavcodec/h264dec.c +++ b/libavcodec/h264dec.c @@ -47,6 +47,7 @@ #include "h264_mvpred.h" #include "h264_ps.h" #include "golomb.h" +#include "hwaccel.h" #include "mathops.h" #include "me_cmp.h" #include "mpegutils.h" @@ -1059,6 +1060,30 @@ AVCodec ff_h264_decoder = { .capabilities = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_H264_DXVA2_HWACCEL + HWACCEL_DXVA2(h264), +#endif +#if CONFIG_H264_D3D11VA_HWACCEL + HWACCEL_D3D11VA(h264), +#endif +#if CONFIG_H264_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(h264), +#endif +#if CONFIG_H264_NVDEC_HWACCEL + HWACCEL_NVDEC(h264), +#endif +#if CONFIG_H264_VAAPI_HWACCEL + HWACCEL_VAAPI(h264), +#endif +#if CONFIG_H264_VDPAU_HWACCEL + HWACCEL_VDPAU(h264), +#endif +#if CONFIG_H264_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(h264), +#endif + NULL + }, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING, .flush = flush_dpb, .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), diff --git a/libavcodec/hevcdec.c b/libavcodec/hevcdec.c index 75960912b1..5ec6105d2f 100644 --- a/libavcodec/hevcdec.c +++ b/libavcodec/hevcdec.c @@ -41,6 +41,7 @@ #include "hevc_data.h" #include "hevc_parse.h" #include "hevcdec.h" +#include "hwaccel.h" #include "profiles.h" const uint8_t ff_hevc_pel_weight[65] = { [2] = 0, [4] = 1, [6] = 2, [8] = 3, [12] = 4, [16] = 5, [24] = 6, [32] = 7, [48] = 8, [64] = 9 }; @@ -3510,4 +3511,28 @@ AVCodec ff_hevc_decoder = { AV_CODEC_CAP_SLICE_THREADS | AV_CODEC_CAP_FRAME_THREADS, .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_EXPORTS_CROPPING, .profiles = NULL_IF_CONFIG_SMALL(ff_hevc_profiles), + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_HEVC_DXVA2_HWACCEL + HWACCEL_DXVA2(hevc), +#endif +#if CONFIG_HEVC_D3D11VA_HWACCEL + HWACCEL_D3D11VA(hevc), +#endif +#if CONFIG_HEVC_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(hevc), +#endif +#if CONFIG_HEVC_NVDEC_HWACCEL + HWACCEL_NVDEC(hevc), +#endif +#if CONFIG_HEVC_VAAPI_HWACCEL + HWACCEL_VAAPI(hevc), +#endif +#if CONFIG_HEVC_VDPAU_HWACCEL + HWACCEL_VDPAU(hevc), +#endif +#if CONFIG_HEVC_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(hevc), +#endif + NULL + }, }; diff --git a/libavcodec/hwaccel.h b/libavcodec/hwaccel.h index 0198c7f858..382e0d0264 100644 --- a/libavcodec/hwaccel.h +++ b/libavcodec/hwaccel.h @@ -20,6 +20,7 @@ #define AVCODEC_HWACCEL_H #include "avcodec.h" +#include "hwaccels.h" #define HWACCEL_CAP_ASYNC_SAFE (1 << 0) @@ -39,4 +40,53 @@ typedef struct AVCodecHWConfigInternal { } AVCodecHWConfigInternal; +// These macros are used to simplify AVCodecHWConfigInternal definitions. + +#define HW_CONFIG_HWACCEL(format, device, name) \ + &(const AVCodecHWConfigInternal) { \ + .public = { \ + .pix_fmt = AV_PIX_FMT_ ## format, \ + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX | \ + AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX, \ + .device_type = AV_HWDEVICE_TYPE_ ## device, \ + }, \ + .hwaccel = &name, \ + } + +#define HW_CONFIG_INTERNAL(format) \ + &(const AVCodecHWConfigInternal) { \ + .public = { \ + .pix_fmt = AV_PIX_FMT_ ## format, \ + .methods = AV_CODEC_HW_CONFIG_METHOD_INTERNAL, \ + .device_type = AV_HWDEVICE_TYPE_NONE, \ + }, \ + .hwaccel = NULL, \ + } + +#define HW_CONFIG_AD_HOC_HWACCEL(format, name) \ + &(const AVCodecHWConfigInternal) { \ + .public = { \ + .pix_fmt = AV_PIX_FMT_ ## format, \ + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, \ + .device_type = AV_HWDEVICE_TYPE_NONE, \ + }, \ + .hwaccel = &name, \ + } + +#define HWACCEL_DXVA2(codec) \ + HW_CONFIG_HWACCEL(DXVA2_VLD, DXVA2, ff_ ## codec ## _dxva2_hwaccel) +#define HWACCEL_D3D11VA2(codec) \ + HW_CONFIG_HWACCEL(D3D11, D3D11VA, ff_ ## codec ## _d3d11va2_hwaccel) +#define HWACCEL_NVDEC(codec) \ + HW_CONFIG_HWACCEL(CUDA, CUDA, ff_ ## codec ## _nvdec_hwaccel) +#define HWACCEL_VAAPI(codec) \ + HW_CONFIG_HWACCEL(VAAPI, VAAPI, ff_ ## codec ## _vaapi_hwaccel) +#define HWACCEL_VDPAU(codec) \ + HW_CONFIG_HWACCEL(VDPAU, VDPAU, ff_ ## codec ## _vdpau_hwaccel) +#define HWACCEL_VIDEOTOOLBOX(codec) \ + HW_CONFIG_HWACCEL(VIDEOTOOLBOX, VIDEOTOOLBOX, ff_ ## codec ## _videotoolbox_hwaccel) + +#define HWACCEL_D3D11VA(codec) \ + HW_CONFIG_AD_HOC_HWACCEL(D3D11VA_VLD, ff_ ## codec ## _d3d11va_hwaccel) + #endif /* AVCODEC_HWACCEL_H */ diff --git a/libavcodec/hwaccels.h b/libavcodec/hwaccels.h new file mode 100644 index 0000000000..cd1e54b126 --- /dev/null +++ b/libavcodec/hwaccels.h @@ -0,0 +1,72 @@ +/* + * This file is part of FFmpeg. + * + * FFmpeg is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * FFmpeg is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with FFmpeg; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef AVCODEC_HWACCELS_H +#define AVCODEC_HWACCELS_H + +#include "avcodec.h" + +extern AVHWAccel ff_h263_vaapi_hwaccel; +extern AVHWAccel ff_h263_videotoolbox_hwaccel; +extern AVHWAccel ff_h264_d3d11va_hwaccel; +extern AVHWAccel ff_h264_d3d11va2_hwaccel; +extern AVHWAccel ff_h264_dxva2_hwaccel; +extern AVHWAccel ff_h264_nvdec_hwaccel; +extern AVHWAccel ff_h264_vaapi_hwaccel; +extern AVHWAccel ff_h264_vdpau_hwaccel; +extern AVHWAccel ff_h264_videotoolbox_hwaccel; +extern AVHWAccel ff_hevc_d3d11va_hwaccel; +extern AVHWAccel ff_hevc_d3d11va2_hwaccel; +extern AVHWAccel ff_hevc_dxva2_hwaccel; +extern AVHWAccel ff_hevc_nvdec_hwaccel; +extern AVHWAccel ff_hevc_vaapi_hwaccel; +extern AVHWAccel ff_hevc_vdpau_hwaccel; +extern AVHWAccel ff_hevc_videotoolbox_hwaccel; +extern AVHWAccel ff_mpeg1_vdpau_hwaccel; +extern AVHWAccel ff_mpeg1_videotoolbox_hwaccel; +extern AVHWAccel ff_mpeg1_xvmc_hwaccel; +extern AVHWAccel ff_mpeg2_d3d11va_hwaccel; +extern AVHWAccel ff_mpeg2_d3d11va2_hwaccel; +extern AVHWAccel ff_mpeg2_nvdec_hwaccel; +extern AVHWAccel ff_mpeg2_dxva2_hwaccel; +extern AVHWAccel ff_mpeg2_vaapi_hwaccel; +extern AVHWAccel ff_mpeg2_vdpau_hwaccel; +extern AVHWAccel ff_mpeg2_videotoolbox_hwaccel; +extern AVHWAccel ff_mpeg2_xvmc_hwaccel; +extern AVHWAccel ff_mpeg4_vaapi_hwaccel; +extern AVHWAccel ff_mpeg4_vdpau_hwaccel; +extern AVHWAccel ff_mpeg4_videotoolbox_hwaccel; +extern AVHWAccel ff_vc1_d3d11va_hwaccel; +extern AVHWAccel ff_vc1_d3d11va2_hwaccel; +extern AVHWAccel ff_vc1_dxva2_hwaccel; +extern AVHWAccel ff_vc1_nvdec_hwaccel; +extern AVHWAccel ff_vc1_vaapi_hwaccel; +extern AVHWAccel ff_vc1_vdpau_hwaccel; +extern AVHWAccel ff_vp9_d3d11va_hwaccel; +extern AVHWAccel ff_vp9_d3d11va2_hwaccel; +extern AVHWAccel ff_vp9_dxva2_hwaccel; +extern AVHWAccel ff_vp9_nvdec_hwaccel; +extern AVHWAccel ff_vp9_vaapi_hwaccel; +extern AVHWAccel ff_wmv3_d3d11va_hwaccel; +extern AVHWAccel ff_wmv3_d3d11va2_hwaccel; +extern AVHWAccel ff_wmv3_dxva2_hwaccel; +extern AVHWAccel ff_wmv3_nvdec_hwaccel; +extern AVHWAccel ff_wmv3_vaapi_hwaccel; +extern AVHWAccel ff_wmv3_vdpau_hwaccel; + +#endif /* AVCODEC_HWACCELS_H */ diff --git a/libavcodec/mediacodecdec.c b/libavcodec/mediacodecdec.c index 0cf9419ea3..feee316140 100644 --- a/libavcodec/mediacodecdec.c +++ b/libavcodec/mediacodecdec.c @@ -515,6 +515,18 @@ static void mediacodec_decode_flush(AVCodecContext *avctx) ff_mediacodec_dec_flush(avctx, s->ctx); } +static const AVCodecHWConfigInternal *mediacodec_hw_configs[] = { + &(const AVCodecHWConfigInternal) { + .public = { + .pix_fmt = AV_PIX_FMT_MEDIACODEC, + .methods = AV_CODEC_HW_CONFIG_METHOD_AD_HOC, + .device_type = AV_HWDEVICE_TYPE_NONE, + }, + .hwaccel = NULL, + } + NULL +}; + #if CONFIG_H264_MEDIACODEC_DECODER AVCodec ff_h264_mediacodec_decoder = { .name = "h264_mediacodec", @@ -529,6 +541,7 @@ AVCodec ff_h264_mediacodec_decoder = { .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, .bsfs = "h264_mp4toannexb", + .hw_configs = mediacodec_hw_configs, }; #endif @@ -546,6 +559,7 @@ AVCodec ff_hevc_mediacodec_decoder = { .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, .bsfs = "hevc_mp4toannexb", + .hw_configs = mediacodec_hw_configs, }; #endif @@ -562,6 +576,7 @@ AVCodec ff_mpeg2_mediacodec_decoder = { .close = mediacodec_decode_close, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, + .hw_configs = mediacodec_hw_configs, }; #endif @@ -578,6 +593,7 @@ AVCodec ff_mpeg4_mediacodec_decoder = { .close = mediacodec_decode_close, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, + .hw_configs = mediacodec_hw_configs, }; #endif @@ -594,6 +610,7 @@ AVCodec ff_vp8_mediacodec_decoder = { .close = mediacodec_decode_close, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, + .hw_configs = mediacodec_hw_configs, }; #endif @@ -610,5 +627,6 @@ AVCodec ff_vp9_mediacodec_decoder = { .close = mediacodec_decode_close, .capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AVOID_PROBING, .caps_internal = FF_CODEC_CAP_SETS_PKT_DTS, + .hw_configs = mediacodec_hw_configs, }; #endif diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index f2ee3557aa..836d1e20e0 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -34,6 +34,7 @@ #include <stdatomic.h> #include "avcodec.h" +#include "hwaccel.h" #include "internal.h" #include "libavutil/avassert.h" #include "libavutil/buffer.h" @@ -835,6 +836,11 @@ AVHWAccel ff_vc1_mmal_hwaccel = { .pix_fmt = AV_PIX_FMT_MMAL, }; +static const AVCodecHWConfigInternal *mmal_hw_configs = { + HW_CONFIG_INTERNAL(MMAL), + NULL +}; + static const AVOption options[]={ {"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, {"extra_decoder_buffers", "extra MMAL internal buffered frames", offsetof(MMALDecodeContext, extra_decoder_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0}, @@ -867,6 +873,7 @@ static const AVOption options[]={ .pix_fmts = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL, \ AV_PIX_FMT_YUV420P, \ AV_PIX_FMT_NONE}, \ + .hw_configs = mmal_hw_configs, }; FFMMAL_DEC(h264, AV_CODEC_ID_H264) diff --git a/libavcodec/mpeg12dec.c b/libavcodec/mpeg12dec.c index 2b213eebcd..ec656b6369 100644 --- a/libavcodec/mpeg12dec.c +++ b/libavcodec/mpeg12dec.c @@ -36,6 +36,7 @@ #include "avcodec.h" #include "bytestream.h" #include "error_resilience.h" +#include "hwaccel.h" #include "idctdsp.h" #include "internal.h" #include "mpeg_er.h" @@ -2887,7 +2888,19 @@ AVCodec ff_mpeg1video_decoder = { .caps_internal = FF_CODEC_CAP_SKIP_FRAME_FILL_PARAM, .flush = flush, .max_lowres = 3, - .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context) + .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg_decode_update_thread_context), + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_MPEG1_VDPAU_HWACCEL + HWACCEL_VDPAU(mpeg1), +#endif +#if CONFIG_MPEG1_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(mpeg1), +#endif +#if CONFIG_MPEG1_XVMC_HWACCEL + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg1), +#endif + NULL + }, }; AVCodec ff_mpeg2video_decoder = { @@ -2906,6 +2919,33 @@ AVCodec ff_mpeg2video_decoder = { .flush = flush, .max_lowres = 3, .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg2_video_profiles), + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_MPEG2_DXVA2_HWACCEL + HWACCEL_DXVA2(mpeg2), +#endif +#if CONFIG_MPEG2_D3D11VA_HWACCEL + HWACCEL_D3D11VA(mpeg2), +#endif +#if CONFIG_MPEG2_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(mpeg2), +#endif +#if CONFIG_MPEG2_NVDEC_HWACCEL + HWACCEL_NVDEC(mpeg2), +#endif +#if CONFIG_MPEG2_VAAPI_HWACCEL + HWACCEL_VAAPI(mpeg2), +#endif +#if CONFIG_MPEG2_VDPAU_HWACCEL + HWACCEL_VDPAU(mpeg2), +#endif +#if CONFIG_MPEG2_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(mpeg2), +#endif +#if CONFIG_MPEG2_XVMC_HWACCEL + HW_CONFIG_AD_HOC_HWACCEL(XVMC, mpeg2), +#endif + NULL + }, }; //legacy decoder diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index 76247c3b8c..8db1522296 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -25,6 +25,7 @@ #include "libavutil/internal.h" #include "libavutil/opt.h" #include "error_resilience.h" +#include "hwaccel.h" #include "idctdsp.h" #include "internal.h" #include "mpegutils.h" @@ -2848,4 +2849,16 @@ AVCodec ff_mpeg4_decoder = { .profiles = NULL_IF_CONFIG_SMALL(ff_mpeg4_video_profiles), .update_thread_context = ONLY_IF_THREADS_ENABLED(mpeg4_update_thread_context), .priv_class = &mpeg4_class, + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_MPEG4_VAAPI_HWACCEL + HWACCEL_VAAPI(mpeg4), +#endif +#if CONFIG_MPEG4_VDPAU_HWACCEL + HWACCEL_VDPAU(mpeg4), +#endif +#if CONFIG_MPEG4_VIDEOTOOLBOX_HWACCEL + HWACCEL_VIDEOTOOLBOX(mpeg4), +#endif + NULL + }, }; diff --git a/libavcodec/qsvdec.c b/libavcodec/qsvdec.c index c00817f1d9..55fe59b531 100644 --- a/libavcodec/qsvdec.c +++ b/libavcodec/qsvdec.c @@ -41,6 +41,19 @@ #include "qsv_internal.h" #include "qsvdec.h" +const AVCodecHWConfigInternal *ff_qsv_hw_configs[] = { + &(const AVCodecHWConfigInternal) { + .public = { + .pix_fmt = AV_PIX_FMT_QSV, + .methods = AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX | + AV_CODEC_HW_CONFIG_METHOD_AD_HOC, + .device_type = AV_HWDEVICE_TYPE_QSV, + }, + .hwaccel = NULL, + }, + NULL +}; + static int qsv_init_session(AVCodecContext *avctx, QSVContext *q, mfxSession session, AVBufferRef *hw_frames_ref, AVBufferRef *hw_device_ref) { diff --git a/libavcodec/qsvdec.h b/libavcodec/qsvdec.h index 4e86e4b7f8..5b7b03a48b 100644 --- a/libavcodec/qsvdec.h +++ b/libavcodec/qsvdec.h @@ -33,6 +33,7 @@ #include "libavutil/pixfmt.h" #include "avcodec.h" +#include "hwaccel.h" #include "qsv_internal.h" typedef struct QSVContext { @@ -70,6 +71,8 @@ typedef struct QSVContext { int nb_ext_buffers; } QSVContext; +extern const AVCodecHWConfigInternal *ff_qsv_hw_configs[]; + int ff_qsv_process_data(AVCodecContext *avctx, QSVContext *q, AVFrame *frame, int *got_frame, AVPacket *pkt); diff --git a/libavcodec/qsvdec_h2645.c b/libavcodec/qsvdec_h2645.c index a6b53cce8d..a8a96442df 100644 --- a/libavcodec/qsvdec_h2645.c +++ b/libavcodec/qsvdec_h2645.c @@ -220,6 +220,7 @@ AVCodec ff_hevc_qsv_decoder = { AV_PIX_FMT_P010, AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, + .hw_configs = ff_qsv_hw_configs, .bsfs = "hevc_mp4toannexb", }; #endif @@ -262,6 +263,7 @@ AVCodec ff_h264_qsv_decoder = { AV_PIX_FMT_P010, AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, + .hw_configs = ff_qsv_hw_configs, .bsfs = "h264_mp4toannexb", }; #endif diff --git a/libavcodec/qsvdec_other.c b/libavcodec/qsvdec_other.c index b94093d53c..21aa56492f 100644 --- a/libavcodec/qsvdec_other.c +++ b/libavcodec/qsvdec_other.c @@ -190,6 +190,7 @@ AVCodec ff_mpeg2_qsv_decoder = { .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, + .hw_configs = ff_qsv_hw_configs, }; #endif @@ -225,6 +226,7 @@ AVCodec ff_vc1_qsv_decoder = { .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, + .hw_configs = ff_qsv_hw_configs, }; #endif @@ -260,5 +262,6 @@ AVCodec ff_vp8_qsv_decoder = { .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_NV12, AV_PIX_FMT_QSV, AV_PIX_FMT_NONE }, + .hw_configs = ff_qsv_hw_configs, }; #endif diff --git a/libavcodec/vc1dec.c b/libavcodec/vc1dec.c index 96b8bb5364..f479a7625b 100644 --- a/libavcodec/vc1dec.c +++ b/libavcodec/vc1dec.c @@ -29,6 +29,7 @@ #include "avcodec.h" #include "blockdsp.h" #include "get_bits.h" +#include "hwaccel.h" #include "internal.h" #include "mpeg_er.h" #include "mpegvideo.h" @@ -1144,6 +1145,27 @@ AVCodec ff_vc1_decoder = { .flush = ff_mpeg_flush, .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, .pix_fmts = vc1_hwaccel_pixfmt_list_420, + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_VC1_DXVA2_HWACCEL + HWACCEL_DXVA2(vc1), +#endif +#if CONFIG_VC1_D3D11VA_HWACCEL + HWACCEL_D3D11VA(vc1), +#endif +#if CONFIG_VC1_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(vc1), +#endif +#if CONFIG_VC1_NVDEC_HWACCEL + HWACCEL_NVDEC(vc1), +#endif +#if CONFIG_VC1_VAAPI_HWACCEL + HWACCEL_VAAPI(vc1), +#endif +#if CONFIG_VC1_VDPAU_HWACCEL + HWACCEL_VDPAU(vc1), +#endif + NULL + }, .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) }; @@ -1160,6 +1182,27 @@ AVCodec ff_wmv3_decoder = { .flush = ff_mpeg_flush, .capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY, .pix_fmts = vc1_hwaccel_pixfmt_list_420, + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_VC1_DXVA2_HWACCEL + HWACCEL_DXVA2(wmv3), +#endif +#if CONFIG_VC1_D3D11VA_HWACCEL + HWACCEL_D3D11VA(wmv3), +#endif +#if CONFIG_VC1_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(wmv3), +#endif +#if CONFIG_VC1_NVDEC_HWACCEL + HWACCEL_NVDEC(wmv3), +#endif +#if CONFIG_VC1_VAAPI_HWACCEL + HWACCEL_VAAPI(wmv3), +#endif +#if CONFIG_VC1_VDPAU_HWACCEL + HWACCEL_VDPAU(wmv3), +#endif + NULL + }, .profiles = NULL_IF_CONFIG_SMALL(ff_vc1_profiles) }; #endif diff --git a/libavcodec/vp9.c b/libavcodec/vp9.c index 6ce9be61bb..1ea2869c4c 100644 --- a/libavcodec/vp9.c +++ b/libavcodec/vp9.c @@ -23,6 +23,7 @@ #include "avcodec.h" #include "get_bits.h" +#include "hwaccel.h" #include "internal.h" #include "profiles.h" #include "thread.h" @@ -1794,4 +1795,22 @@ AVCodec ff_vp9_decoder = { .init_thread_copy = ONLY_IF_THREADS_ENABLED(vp9_decode_init_thread_copy), .update_thread_context = ONLY_IF_THREADS_ENABLED(vp9_decode_update_thread_context), .profiles = NULL_IF_CONFIG_SMALL(ff_vp9_profiles), + .hw_configs = (const AVCodecHWConfigInternal*[]) { +#if CONFIG_VP9_DXVA2_HWACCEL + HWACCEL_DXVA2(vp9), +#endif +#if CONFIG_VP9_D3D11VA_HWACCEL + HWACCEL_D3D11VA(vp9), +#endif +#if CONFIG_VP9_D3D11VA2_HWACCEL + HWACCEL_D3D11VA2(vp9), +#endif +#if CONFIG_VP9_NVDEC_HWACCEL + HWACCEL_NVDEC(vp9), +#endif +#if CONFIG_VP9_VAAPI_HWACCEL + HWACCEL_VAAPI(vp9), +#endif + NULL + }, };