aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-02-12 22:19:38 +0000
committerMark Thompson <sw@jkqxz.net>2018-02-12 22:19:38 +0000
commitd23fff0d8a0e7df170c67a9dd5c1f7c1fc0da489 (patch)
tree3b51fe6fabeae2eea7cd5027f58c01d965bb5d45
parentd401ba6b3d86091dff2fae326c610f0120ee8853 (diff)
parent5b145290df2998a9836a93eb925289c6c8b63af0 (diff)
downloadffmpeg-d23fff0d8a0e7df170c67a9dd5c1f7c1fc0da489.tar.gz
Merge commit '5b145290df2998a9836a93eb925289c6c8b63af0'
* commit '5b145290df2998a9836a93eb925289c6c8b63af0': lavc: Add support for increasing hardware frame pool sizes Merged-by: Mark Thompson <sw@jkqxz.net>
-rw-r--r--doc/APIchanges3
-rw-r--r--libavcodec/avcodec.h14
-rw-r--r--libavcodec/decode.c9
-rw-r--r--libavcodec/options_table.h1
-rw-r--r--libavcodec/version.h2
5 files changed, 28 insertions, 1 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 91f41a5020..e5c392ead5 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@ libavutil: 2017-10-21
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
Deprecate use of av_input_audio_device_next(), av_input_video_device_next(),
av_output_audio_device_next(), av_output_video_device_next().
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index ad0b48a839..bc0eacd66b 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3255,6 +3255,20 @@ typedef struct AVCodecContext {
* (with the display dimensions being determined by the crop_* fields).
*/
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;
#if FF_API_CODEC_GET_SET
diff --git a/libavcodec/decode.c b/libavcodec/decode.c
index f67b214759..e984d9754e 100644
--- a/libavcodec/decode.c
+++ b/libavcodec/decode.c
@@ -1229,6 +1229,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);
diff --git a/libavcodec/options_table.h b/libavcodec/options_table.h
index d89f58d540..ac9ce4b301 100644
--- a/libavcodec/options_table.h
+++ b/libavcodec/options_table.h
@@ -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" },
{"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"},
+{"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},
};
diff --git a/libavcodec/version.h b/libavcodec/version.h
index e36cea30b5..3597a1a380 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -28,7 +28,7 @@
#include "libavutil/version.h"
#define LIBAVCODEC_VERSION_MAJOR 58
-#define LIBAVCODEC_VERSION_MINOR 10
+#define LIBAVCODEC_VERSION_MINOR 11
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \