diff --git a/contrib/src/ffmpeg/libopusenc-reload-packet-loss-at-encode.patch b/contrib/src/ffmpeg/libopusenc-reload-packet-loss-at-encode.patch new file mode 100644 index 0000000000000000000000000000000000000000..5c4bd4d3ebea0341d2665081e16dd1fd6aee07a3 --- /dev/null +++ b/contrib/src/ffmpeg/libopusenc-reload-packet-loss-at-encode.patch @@ -0,0 +1,44 @@ +From dba13d03bc8e827fededc20b0ab1f574a1500f2a Mon Sep 17 00:00:00 2001 +From: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com> +Date: Thu, 11 Feb 2021 12:25:14 +0100 +Subject: [PATCH 2/2] avcodec/libopusenc: reload packet loss at encode + +An estimation of packet loss is required by libopus to compute its FEC +data. Currently, this estimation is constant, and can not be changed +after configuration. This means an application using libopus through +ffmpeg can not adapt the packet loss estimation when the network +quality degrades. + +This patch makes the encoder reload the packet_loss AVOption before +encoding samples, if fec is enabled. This way an application can modify +the packet loss estimation by changing the AVOption. Typical use-case +is a RTP stream, where packet loss can be estimated from RTCP packets. + +Signed-off-by: Philip-Dylan Gleonec <philip-dylan.gleonec@savoirfairelinux.com> +--- + libavcodec/libopusenc.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/libavcodec/libopusenc.c b/libavcodec/libopusenc.c +index 70d17f802b..c18e8ae7fa 100644 +--- a/libavcodec/libopusenc.c ++++ b/libavcodec/libopusenc.c +@@ -460,6 +460,15 @@ static int libopus_encode(AVCodecContext *avctx, AVPacket *avpkt, + int ret; + int discard_padding; + ++ if (opus->opts.fec) { ++ ret = opus_multistream_encoder_ctl(opus->enc, ++ OPUS_SET_PACKET_LOSS_PERC(opus->opts.packet_loss)); ++ if (ret != OPUS_OK) ++ av_log(avctx, AV_LOG_WARNING, ++ "Unable to set expected packet loss percentage: %s\n", ++ opus_strerror(ret)); ++ } ++ + if (frame) { + ret = ff_af_queue_add(&opus->afq, frame); + if (ret < 0) +-- +2.25.1 + diff --git a/contrib/src/ffmpeg/package.json b/contrib/src/ffmpeg/package.json index ed715bdc3c833d37a175920a002f98567013743a..a5af29200f90f2ad35188b886b8cbd45fe99a90c 100644 --- a/contrib/src/ffmpeg/package.json +++ b/contrib/src/ffmpeg/package.json @@ -12,7 +12,7 @@ "patches": [ "change-RTCP-ratio.patch", "rtp_ext_abs_send_time.patch", - "libopusenc-enable-FEC.patch", + "libopusenc-reload-packet-loss-at-encode.patch", "libopusdec-enable-FEC.patch" ], "win_patches": [ diff --git a/contrib/src/ffmpeg/rules.mak b/contrib/src/ffmpeg/rules.mak index 980bde8a8a6e401574e6ae9c67da834164b62ad5..e092f6578143542215078ac5ef35e6d432d73d99 100644 --- a/contrib/src/ffmpeg/rules.mak +++ b/contrib/src/ffmpeg/rules.mak @@ -363,11 +363,9 @@ ffmpeg: ffmpeg-$(FFMPEG_HASH).tar.gz $(APPLY) $(SRC)/ffmpeg/change-RTCP-ratio.patch $(APPLY) $(SRC)/ffmpeg/rtp_ext_abs_send_time.patch $(APPLY) $(SRC)/ffmpeg/libopusdec-enable-FEC.patch - $(APPLY) $(SRC)/ffmpeg/libopusenc-enable-FEC.patch - $(APPLY) $(SRC)/ffmpeg/screen-sharing-x11-fix.patch -ifdef HAVE_IOS + $(APPLY) $(SRC)/ffmpeg/libopusenc-reload-packet-loss-at-encode.patch $(APPLY) $(SRC)/ffmpeg/ios-disable-b-frames.patch -endif + $(APPLY) $(SRC)/ffmpeg/screen-sharing-x11-fix.patch $(UPDATE_AUTOCONFIG) $(MOVE) diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp index 317435f562f175d98ff71688a7dc41019c5f4834..43822c9ebb376fee099af79622778bbfe8c843ca 100644 --- a/src/media/media_encoder.cpp +++ b/src/media/media_encoder.cpp @@ -1058,7 +1058,7 @@ void MediaEncoder::initOpus(AVCodecContext* encoderCtx) { // Enable FEC support by default with 10% packet loss - av_opt_set_int(encoderCtx, "enable_fec", fecEnabled_ ? 1 : 0, AV_OPT_SEARCH_CHILDREN); + av_opt_set_int(encoderCtx, "fec", fecEnabled_ ? 1 : 0, AV_OPT_SEARCH_CHILDREN); av_opt_set_int(encoderCtx, "packet_loss", 10, AV_OPT_SEARCH_CHILDREN); }