[FFmpeg-devel] [PATCH 02/13] lavc: Add hardware config metadata for decoders supporting hardware output

Philip Langdale philipl at overt.org
Mon Nov 20 23:17:41 EET 2017


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


More information about the ffmpeg-devel mailing list