Skip to content
Snippets Groups Projects
Commit 1db7678e authored by Philip-Dylan Gleonec's avatar Philip-Dylan Gleonec Committed by Adrien Béraud
Browse files

ffmpeg: update fec patch to match recent ffmpeg

An AVOption has been added to ffmpeg in sept. 2020, making the patch in
contrib redundant. This change is integrated in the contrib ffmpeg
starting from commit 85501986, which updates the used version.

This patch adapts the patches to be applied to ffmpeg and the call to
enable FEC in libopus. Specifically it does the following changes:

- backport the mainline ffmpeg patch that add fec to libopusenc
- add packet_loss reload to adapt its value to network
- modify rules.mak to add patches to the correct platforms
- make media_encoder set the right AVOption to enable fec

Issue: #4857
Change-Id: I614fce2f0cf7fc387973b34323138b07c1767726
parent 36b1334d
No related branches found
No related tags found
No related merge requests found
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
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
"patches": [ "patches": [
"change-RTCP-ratio.patch", "change-RTCP-ratio.patch",
"rtp_ext_abs_send_time.patch", "rtp_ext_abs_send_time.patch",
"libopusenc-enable-FEC.patch", "libopusenc-reload-packet-loss-at-encode.patch",
"libopusdec-enable-FEC.patch" "libopusdec-enable-FEC.patch"
], ],
"win_patches": [ "win_patches": [
......
...@@ -363,11 +363,9 @@ ffmpeg: ffmpeg-$(FFMPEG_HASH).tar.gz ...@@ -363,11 +363,9 @@ ffmpeg: ffmpeg-$(FFMPEG_HASH).tar.gz
$(APPLY) $(SRC)/ffmpeg/change-RTCP-ratio.patch $(APPLY) $(SRC)/ffmpeg/change-RTCP-ratio.patch
$(APPLY) $(SRC)/ffmpeg/rtp_ext_abs_send_time.patch $(APPLY) $(SRC)/ffmpeg/rtp_ext_abs_send_time.patch
$(APPLY) $(SRC)/ffmpeg/libopusdec-enable-FEC.patch $(APPLY) $(SRC)/ffmpeg/libopusdec-enable-FEC.patch
$(APPLY) $(SRC)/ffmpeg/libopusenc-enable-FEC.patch $(APPLY) $(SRC)/ffmpeg/libopusenc-reload-packet-loss-at-encode.patch
$(APPLY) $(SRC)/ffmpeg/screen-sharing-x11-fix.patch
ifdef HAVE_IOS
$(APPLY) $(SRC)/ffmpeg/ios-disable-b-frames.patch $(APPLY) $(SRC)/ffmpeg/ios-disable-b-frames.patch
endif $(APPLY) $(SRC)/ffmpeg/screen-sharing-x11-fix.patch
$(UPDATE_AUTOCONFIG) $(UPDATE_AUTOCONFIG)
$(MOVE) $(MOVE)
......
...@@ -1058,7 +1058,7 @@ void ...@@ -1058,7 +1058,7 @@ void
MediaEncoder::initOpus(AVCodecContext* encoderCtx) MediaEncoder::initOpus(AVCodecContext* encoderCtx)
{ {
// Enable FEC support by default with 10% packet loss // 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); av_opt_set_int(encoderCtx, "packet_loss", 10, AV_OPT_SEARCH_CHILDREN);
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment