summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2020-04-13 16:33:15 +0100
committerMark Thompson <sw@jkqxz.net>2020-04-26 18:38:25 +0100
commit858eba0ca4b680ce23c4eebd1460db333989b0a4 (patch)
tree845facb49e0218e4c04fcead6edc8ec715a25470
parent2594f6a362c788a036dbf3e27d540d15fe7f72d0 (diff)
lavc: Extend hardware config metadata to encoders
-rw-r--r--libavcodec/avcodec.h11
-rw-r--r--libavcodec/hwconfig.h18
2 files changed, 28 insertions, 1 deletions
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index b79b025e53..2bce39f94b 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 4199ffdd50..f421dc909f 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 */