* commit '5b145290df2998a9836a93eb925289c6c8b63af0': lavc: Add support for increasing hardware frame pool sizes Merged-by: Mark Thompson <sw@jkqxz.net>tags/n4.0
| @@ -15,6 +15,9 @@ libavutil: 2017-10-21 | |||||
| API changes, most recent first: | API changes, most recent first: | ||||
| 2018-02-xx - xxxxxxx - lavc 58.11.100 - avcodec.h | |||||
| Add AVCodecContext.extra_hw_frames. | |||||
| 2018-02-06 - 0fd475704e - lavd 58.1.100 - avdevice.h | 2018-02-06 - 0fd475704e - lavd 58.1.100 - avdevice.h | ||||
| Deprecate use of av_input_audio_device_next(), av_input_video_device_next(), | Deprecate use of av_input_audio_device_next(), av_input_video_device_next(), | ||||
| av_output_audio_device_next(), av_output_video_device_next(). | av_output_audio_device_next(), av_output_video_device_next(). | ||||
| @@ -3255,6 +3255,20 @@ typedef struct AVCodecContext { | |||||
| * (with the display dimensions being determined by the crop_* fields). | * (with the display dimensions being determined by the crop_* fields). | ||||
| */ | */ | ||||
| int apply_cropping; | int apply_cropping; | ||||
| /* | |||||
| * Video decoding only. Sets the number of extra hardware frames which | |||||
| * the decoder will allocate for use by the caller. This must be set | |||||
| * before avcodec_open2() is called. | |||||
| * | |||||
| * Some hardware decoders require all frames that they will use for | |||||
| * output to be defined in advance before decoding starts. For such | |||||
| * decoders, the hardware frame pool must therefore be of a fixed size. | |||||
| * The extra frames set here are on top of any number that the decoder | |||||
| * needs internally in order to operate normally (for example, frames | |||||
| * used as reference pictures). | |||||
| */ | |||||
| int extra_hw_frames; | |||||
| } AVCodecContext; | } AVCodecContext; | ||||
| #if FF_API_CODEC_GET_SET | #if FF_API_CODEC_GET_SET | ||||
| @@ -1229,6 +1229,15 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx, | |||||
| ret = hwa->frame_params(avctx, frames_ref); | ret = hwa->frame_params(avctx, frames_ref); | ||||
| if (ret >= 0) { | if (ret >= 0) { | ||||
| AVHWFramesContext *frames_ctx = (AVHWFramesContext*)frames_ref->data; | |||||
| if (frames_ctx->initial_pool_size) { | |||||
| // If the user has requested that extra output surfaces be | |||||
| // available then add them here. | |||||
| if (avctx->extra_hw_frames > 0) | |||||
| frames_ctx->initial_pool_size += avctx->extra_hw_frames; | |||||
| } | |||||
| *out_frames_ref = frames_ref; | *out_frames_ref = frames_ref; | ||||
| } else { | } else { | ||||
| av_buffer_unref(&frames_ref); | av_buffer_unref(&frames_ref); | ||||
| @@ -476,6 +476,7 @@ static const AVOption avcodec_options[] = { | |||||
| {"ignore_level", "ignore level even if the codec level used is unknown or higher than the maximum supported level reported by the hardware driver", 0, AV_OPT_TYPE_CONST, { .i64 = AV_HWACCEL_FLAG_IGNORE_LEVEL }, INT_MIN, INT_MAX, V | D, "hwaccel_flags" }, | {"ignore_level", "ignore level even if the codec level used is unknown or higher than the maximum supported level reported by the hardware driver", 0, AV_OPT_TYPE_CONST, { .i64 = AV_HWACCEL_FLAG_IGNORE_LEVEL }, INT_MIN, INT_MAX, V | D, "hwaccel_flags" }, | ||||
| {"allow_high_depth", "allow to output YUV pixel formats with a different chroma sampling than 4:2:0 and/or other than 8 bits per component", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"}, | {"allow_high_depth", "allow to output YUV pixel formats with a different chroma sampling than 4:2:0 and/or other than 8 bits per component", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_HIGH_DEPTH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"}, | ||||
| {"allow_profile_mismatch", "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"}, | {"allow_profile_mismatch", "attempt to decode anyway if HW accelerated decoder's supported profiles do not exactly match the stream", 0, AV_OPT_TYPE_CONST, {.i64 = AV_HWACCEL_FLAG_ALLOW_PROFILE_MISMATCH }, INT_MIN, INT_MAX, V | D, "hwaccel_flags"}, | ||||
| {"extra_hw_frames", "Number of extra hardware frames to allocate for the user", OFFSET(extra_hw_frames), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, V|D }, | |||||
| {NULL}, | {NULL}, | ||||
| }; | }; | ||||
| @@ -28,7 +28,7 @@ | |||||
| #include "libavutil/version.h" | #include "libavutil/version.h" | ||||
| #define LIBAVCODEC_VERSION_MAJOR 58 | #define LIBAVCODEC_VERSION_MAJOR 58 | ||||
| #define LIBAVCODEC_VERSION_MINOR 10 | |||||
| #define LIBAVCODEC_VERSION_MINOR 11 | |||||
| #define LIBAVCODEC_VERSION_MICRO 100 | #define LIBAVCODEC_VERSION_MICRO 100 | ||||
| #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ | ||||