lavc: Add support for increasing hardware frame pool sizes

AVCodecContext.extra_hw_frames is added to the size of hardware frame
pools created by libavcodec for APIs which require fixed-size pools.
This allows the user to keep references to a greater number of frames
after decode, which may be necessary for some use-cases.

It is also added to the initial_pool_size value returned by
avcodec_get_hw_frames_parameters() if a fixed-size pool is required.
This commit is contained in:
Mark Thompson 2018-01-29 22:18:00 +00:00
parent fd36cf6bf6
commit 5b145290df
5 changed files with 28 additions and 1 deletions

View File

@ -13,6 +13,9 @@ libavutil: 2017-03-23
API changes, most recent first:
2018-02-xx - xxxxxxx - lavc 58.9.0 - avcodec.h
Add AVCodecContext.extra_hw_frames.
2017-xx-xx - xxxxxxx - lavc 58.8.0 - avcodec.h
Add const to AVCodecContext.hwaccel.

View File

@ -2739,6 +2739,20 @@ typedef struct AVCodecContext {
* AVCodecContext.get_format callback)
*/
int hwaccel_flags;
/**
* 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;
/**

View File

@ -791,6 +791,15 @@ int avcodec_get_hw_frames_parameters(AVCodecContext *avctx,
ret = hwa->frame_params(avctx, frames_ref);
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;
} else {
av_buffer_unref(&frames_ref);

View File

@ -419,6 +419,7 @@ static const AVOption avcodec_options[] = {
{"side_data_only_packets", NULL, OFFSET(side_data_only_packets), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, A|V|E },
#endif
{"apply_cropping", NULL, OFFSET(apply_cropping), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, V | D },
{"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},
};

View File

@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
#define LIBAVCODEC_VERSION_MINOR 8
#define LIBAVCODEC_VERSION_MINOR 9
#define LIBAVCODEC_VERSION_MICRO 0
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \