From 858eba0ca4b680ce23c4eebd1460db333989b0a4 Mon Sep 17 00:00:00 2001 From: Mark Thompson Date: Mon, 13 Apr 2020 16:33:15 +0100 Subject: [PATCH] lavc: Extend hardware config metadata to encoders --- libavcodec/avcodec.h | 11 ++++++++++- libavcodec/hwconfig.h | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index b79b025e53b..2bce39f94bb 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -2541,6 +2541,10 @@ enum { * AVCodecContext.hw_frames_ctx should be set to a suitable frames * context inside the get_format() callback. The frames context * must have been created on a device of the specified type. + * + * When selecting this format for an encoder, + * AVCodecContext.hw_frames_ctx should be set to the context which + * will be used for the input frames before calling avcodec_open2(). */ AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX = 0x02, /** @@ -2563,7 +2567,12 @@ enum { typedef struct AVCodecHWConfig { /** - * A hardware pixel format which the codec can use. + * For decoders, a hardware pixel format which that decoder may be + * able to decode to if suitable hardware is available. + * + * For encoders, a pixel format which the encoder may be able to + * accept. If set to AV_PIX_FMT_NONE, this applies to all pixel + * formats supported by the codec. */ enum AVPixelFormat pix_fmt; /** diff --git a/libavcodec/hwconfig.h b/libavcodec/hwconfig.h index 4199ffdd503..f421dc909f4 100644 --- a/libavcodec/hwconfig.h +++ b/libavcodec/hwconfig.h @@ -81,4 +81,22 @@ typedef struct AVCodecHWConfigInternal { #define HWACCEL_XVMC(codec) \ HW_CONFIG_HWACCEL(0, 0, 1, XVMC, NONE, ff_ ## codec ## _xvmc_hwaccel) +#define HW_CONFIG_ENCODER(device, frames, ad_hoc, format, device_type_) \ + &(const AVCodecHWConfigInternal) { \ + .public = { \ + .pix_fmt = AV_PIX_FMT_ ## format, \ + .methods = (device ? AV_CODEC_HW_CONFIG_METHOD_HW_DEVICE_CTX : 0) | \ + (frames ? AV_CODEC_HW_CONFIG_METHOD_HW_FRAMES_CTX : 0) | \ + (ad_hoc ? AV_CODEC_HW_CONFIG_METHOD_AD_HOC : 0), \ + .device_type = AV_HWDEVICE_TYPE_ ## device_type_, \ + }, \ + .hwaccel = NULL, \ + } + +#define HW_CONFIG_ENCODER_DEVICE(format, device_type_) \ + HW_CONFIG_ENCODER(1, 0, 0, format, device_type_) + +#define HW_CONFIG_ENCODER_FRAMES(format, device_type_) \ + HW_CONFIG_ENCODER(0, 1, 0, format, device_type_) + #endif /* AVCODEC_HWCONFIG_H */ -- 2.39.5