diff --git a/contrib/src/libav/0004-mpegvideo_enc-enable-rtp_mode-when-multiple-slices-a.patch b/contrib/src/libav/0004-mpegvideo_enc-enable-rtp_mode-when-multiple-slices-a.patch new file mode 100644 index 0000000000000000000000000000000000000000..fa7cff32ba3ad6225183b92218f4f65a01d077cb --- /dev/null +++ b/contrib/src/libav/0004-mpegvideo_enc-enable-rtp_mode-when-multiple-slices-a.patch @@ -0,0 +1,46 @@ +From f6c94457b44f41d900cd0991857f54e1f0ccedd6 Mon Sep 17 00:00:00 2001 +From: Anton Khirnov <anton@khirnov.net> +Date: Wed, 18 Nov 2015 10:37:16 +0100 +Subject: [PATCH] mpegvideo_enc: enable rtp_mode when multiple slices are used + +Currently, multiple slices with just one thread produce corrupted +output. + +Additionally, enable slice structured mode for h263(+) + +Bug-Id: 912 +CC: libav-stabl@libav.org +--- + libavcodec/mpegvideo_enc.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c +index d572b85..b915741 100644 +--- a/libavcodec/mpegvideo_enc.c ++++ b/libavcodec/mpegvideo_enc.c +@@ -519,9 +519,6 @@ FF_ENABLE_DEPRECATION_WARNINGS + return -1; + } + +- if (s->avctx->thread_count > 1) +- s->rtp_mode = 1; +- + if (!avctx->time_base.den || !avctx->time_base.num) { + av_log(avctx, AV_LOG_ERROR, "framerate not set\n"); + return -1; +@@ -764,6 +761,13 @@ FF_ENABLE_DEPRECATION_WARNINGS + if ((CONFIG_H263P_ENCODER || CONFIG_RV20_ENCODER) && s->modified_quant) + s->chroma_qscale_table = ff_h263_chroma_qscale_table; + ++ if (s->slice_context_count > 1) { ++ s->rtp_mode = 1; ++ ++ if (avctx->codec_id == AV_CODEC_ID_H263 || avctx->codec_id == AV_CODEC_ID_H263P) ++ s->h263_slice_structured = 1; ++ } ++ + s->quant_precision = 5; + + ff_set_cmp(&s->mecc, s->mecc.ildct_cmp, s->avctx->ildct_cmp); +-- +2.1.4 diff --git a/contrib/src/libav/rules.mak b/contrib/src/libav/rules.mak index 38580cb686ef41e2f3c169144529f61c4ba9793b..53741d3c9b2312d840b9f5d88088733c73cd2a1f 100644 --- a/contrib/src/libav/rules.mak +++ b/contrib/src/libav/rules.mak @@ -186,6 +186,7 @@ libav: libav-$(LIBAV_HASH).tar.xz .sum-libav $(APPLY) $(SRC)/libav/0001-rtpdec-add-a-trace-when-jitter-buffer-is-full.patch $(APPLY) $(SRC)/libav/0002-rtpdec-inform-jitter-buffer-size.patch $(APPLY) $(SRC)/libav/0003-rtsp-warning-when-max_delay-reached.patch + $(APPLY) $(SRC)/libav/0004-mpegvideo_enc-enable-rtp_mode-when-multiple-slices-a.patch $(MOVE) .libav: libav diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 7819d74528aa8ee64d31ee676ff69f8c196e6733..c95f14b91f265760785ed3d4a30079fa7a547267 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -201,10 +201,6 @@ MediaEncoder::openOutput(const char *filename, } else if (args.codec->systemCodecInfo.avcodecId == AV_CODEC_ID_H263) { encoderCtx_->bit_rate = encoderCtx_->rc_max_rate = maxBitrate; encoderCtx_->rc_buffer_size = maxBitrate; - // on libav there are video artifcats if multithreading is enabled - // see https://bugzilla.libav.org/show_bug.cgi?id=912 - // TODO: this is a workaround ! - encoderCtx_->thread_count = 1; RING_DBG("Using Max bitrate %d", maxBitrate); }