ffmpeg | branch: master | wm4 <nfx...@googlemail.com> | Thu Apr 14 12:21:26 2016 +0200| [74beead9bd596180bcac6108548fc0a86d8eb4ae] | committer: Anton Khirnov
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.) Signed-off-by: Anton Khirnov <an...@khirnov.net> > http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=74beead9bd596180bcac6108548fc0a86d8eb4ae --- configure | 2 ++ libavcodec/mmaldec.c | 9 +++++++++ 2 files changed, 11 insertions(+) diff --git a/configure b/configure index 4f41be7..e395e38 100755 --- a/configure +++ b/configure @@ -1645,6 +1645,7 @@ HAVE_LIST=" libc_msvcrt libdc1394_1 libdc1394_2 + MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS sdl section_data_rel_ro threads @@ -4628,6 +4629,7 @@ 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 ; } || die "ERROR: mmal not found"; } +enabled mmal && check_func_headers interface/mmal/mmal.h "MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS" enabled omx_rpi && enable omx enabled omx && { check_header OMX_Core.h || { ! enabled cross_compile && enabled omx_rpi && { diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c index c993551..718ea14 100644 --- a/libavcodec/mmaldec.c +++ b/libavcodec/mmaldec.c @@ -67,6 +67,7 @@ typedef struct FFBufferRef { typedef struct MMALDecodeContext { AVClass *av_class; int extra_buffers; + int extra_decoder_buffers; MMAL_COMPONENT_T *decoder; MMAL_QUEUE_T *queue_decoded_frames; @@ -380,6 +381,13 @@ static av_cold int ffmmal_init_decoder(AVCodecContext *avctx) av_get_codec_tag_string(tmp, sizeof(tmp), format_in->encoding); av_log(avctx, AV_LOG_DEBUG, "Using MMAL %s encoding.\n", tmp); +#if HAVE_MMAL_PARAMETER_VIDEO_MAX_NUM_CALLBACKS + 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"); + } +#endif + if ((status = mmal_port_format_commit(decoder->input[0]))) goto fail; @@ -796,6 +804,7 @@ AVHWAccel ff_vc1_mmal_hwaccel = { static const AVOption options[]={ {"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} }; _______________________________________________ ffmpeg-cvslog mailing list ffmpeg-cvslog@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-cvslog