~ruther/guix-local

ref: 8f940ef48d0c593c5ed844f680d5986ad5e423e8 guix-local/gnu/packages/patches/ffmpeg-jami-libopusenc-reload-packet-loss-at-encode.patch -rw-r--r-- 1.7 KiB
8f940ef4 — Sergey Trofimov gnu: yt-dlp: Update to 2025.12.08. 5 months ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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