mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
mmaldec: limit internal buffering
This uses a new MMAL feature, which limits the number of extra frames that can be buffered within the decoder. VIDEO_MAX_NUM_CALLBACKS can be defined as positive or negative number. Positive numbers are absolute, and can lead to deadlocks if the user underestimates the number of required buffers. Negative numbers specify the number of extra buffers, e.g. -1 means no extra buffer, (-1-N) means N extra buffers. Set a gratuitous default of -11 (N=10). This is much lower than the firmware default, which appears to be 96. This is backwards compatible, but needs a symbol only present in newer firmware headers. (It's an enum item, so it requires a check in configure.)
This commit is contained in:
parent
7b1b53f3a4
commit
14a90c9ef0
4
configure
vendored
4
configure
vendored
@ -5579,6 +5579,10 @@ enabled mmal && { check_lib interface/mmal/mmal.h mmal_port_connect
|
|||||||
check_lib interface/mmal/mmal.h mmal_port_connect ; }
|
check_lib interface/mmal/mmal.h mmal_port_connect ; }
|
||||||
check_lib interface/mmal/mmal.h mmal_port_connect ; } ||
|
check_lib interface/mmal/mmal.h mmal_port_connect ; } ||
|
||||||
die "ERROR: mmal not found"; }
|
die "ERROR: mmal not found"; }
|
||||||
|
enabled mmal &&
|
||||||
|
(check_code cc interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS" ||
|
||||||
|
die "ERROR: mmal firmware headers too old")
|
||||||
|
|
||||||
enabled netcdf && require_pkg_config netcdf netcdf.h nc_inq_libvers
|
enabled netcdf && require_pkg_config netcdf netcdf.h nc_inq_libvers
|
||||||
enabled nvenc && { check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; } &&
|
enabled nvenc && { check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; } &&
|
||||||
{ check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" ||
|
{ check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" ||
|
||||||
|
@ -66,6 +66,7 @@ typedef struct FFBufferRef {
|
|||||||
typedef struct MMALDecodeContext {
|
typedef struct MMALDecodeContext {
|
||||||
AVClass *av_class;
|
AVClass *av_class;
|
||||||
int extra_buffers;
|
int extra_buffers;
|
||||||
|
int extra_decoder_buffers;
|
||||||
|
|
||||||
MMAL_COMPONENT_T *decoder;
|
MMAL_COMPONENT_T *decoder;
|
||||||
MMAL_QUEUE_T *queue_decoded_frames;
|
MMAL_QUEUE_T *queue_decoded_frames;
|
||||||
@ -382,6 +383,11 @@ static av_cold int ffmmal_init_decoder(AVCodecContext *avctx)
|
|||||||
av_get_codec_tag_string(tmp, sizeof(tmp), format_in->encoding);
|
av_get_codec_tag_string(tmp, sizeof(tmp), format_in->encoding);
|
||||||
av_log(avctx, AV_LOG_DEBUG, "Using MMAL %s encoding.\n", tmp);
|
av_log(avctx, AV_LOG_DEBUG, "Using MMAL %s encoding.\n", tmp);
|
||||||
|
|
||||||
|
if (mmal_port_parameter_set_uint32(decoder->input[0], MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS,
|
||||||
|
-1 - ctx->extra_decoder_buffers)) {
|
||||||
|
av_log(avctx, AV_LOG_WARNING, "Could not set input buffering limit.\n");
|
||||||
|
}
|
||||||
|
|
||||||
if ((status = mmal_port_format_commit(decoder->input[0])))
|
if ((status = mmal_port_format_commit(decoder->input[0])))
|
||||||
goto fail;
|
goto fail;
|
||||||
|
|
||||||
@ -812,6 +818,7 @@ AVHWAccel ff_vc1_mmal_hwaccel = {
|
|||||||
|
|
||||||
static const AVOption options[]={
|
static const AVOption options[]={
|
||||||
{"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0},
|
{"extra_buffers", "extra buffers", offsetof(MMALDecodeContext, extra_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0},
|
||||||
|
{"extra_decoder_buffers", "extra MMAL internal buffered frames", offsetof(MMALDecodeContext, extra_decoder_buffers), AV_OPT_TYPE_INT, {.i64 = 10}, 0, 256, 0},
|
||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user