From c7ecb78e0cd95090af02579451c4a437d292c46d Mon Sep 17 00:00:00 2001
From: Pierre Lespagnol <pierre.lespagnol@savoirfairelinux.com>
Date: Tue, 23 Mar 2021 12:17:32 -0400
Subject: [PATCH] audio/encoder: enable encoding FEC for RTP streams only

Fix the audio/video message playback

Gitlab: #489
Change-Id: Idce7cbe45fb05622c94ba54187e2477eb93168de
---
 src/media/audio/audio_receive_thread.cpp | 1 +
 src/media/audio/audio_rtp_session.cpp    | 2 ++
 src/media/media_codec.h                  | 1 +
 src/media/media_decoder.cpp              | 2 +-
 src/media/media_decoder.h                | 5 ++++-
 src/media/media_encoder.cpp              | 3 ++-
 src/media/media_encoder.h                | 1 +
 7 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/src/media/audio/audio_receive_thread.cpp b/src/media/audio/audio_receive_thread.cpp
index 754a2e5482..41253d5340 100644
--- a/src/media/audio/audio_receive_thread.cpp
+++ b/src/media/audio/audio_receive_thread.cpp
@@ -73,6 +73,7 @@ AudioReceiveThread::setup()
     }
 
     audioDecoder_->setIOContext(sdpContext_.get());
+    audioDecoder_->setFEC(true);
     if (audioDecoder_->openInput(args_)) {
         JAMI_ERR("Could not open input \"%s\"", SDP_FILENAME);
         return false;
diff --git a/src/media/audio/audio_rtp_session.cpp b/src/media/audio/audio_rtp_session.cpp
index b86d1706e1..743c30349e 100644
--- a/src/media/audio/audio_rtp_session.cpp
+++ b/src/media/audio/audio_rtp_session.cpp
@@ -99,6 +99,8 @@ AudioRtpSession::startSender()
         return;
     }
 
+    send_.fecEnabled = true;
+
     // be sure to not send any packets before saving last RTP seq value
     socketPair_->stopSendOp();
     if (sender_)
diff --git a/src/media/media_codec.h b/src/media/media_codec.h
index 56d78b4637..01830b0b31 100644
--- a/src/media/media_codec.h
+++ b/src/media/media_codec.h
@@ -278,6 +278,7 @@ struct MediaDescription
 
     /** Audio parameters */
     unsigned frame_size {};
+    bool fecEnabled {false};
 
     /** Video parameters */
     std::string parameters {};
diff --git a/src/media/media_decoder.cpp b/src/media/media_decoder.cpp
index 65fe188882..d593512c57 100644
--- a/src/media/media_decoder.cpp
+++ b/src/media/media_decoder.cpp
@@ -545,7 +545,7 @@ MediaDecoder::prepareDecoderContext()
     }
     if (avStream_->codecpar->codec_type == AVMEDIA_TYPE_AUDIO) {
         if (decoderCtx_->codec_id == AV_CODEC_ID_OPUS) {
-            av_opt_set_int(decoderCtx_, "decode_fec", 1, AV_OPT_SEARCH_CHILDREN);
+            av_opt_set_int(decoderCtx_, "decode_fec", fecEnabled_ ? 1 : 0, AV_OPT_SEARCH_CHILDREN);
         }
     }
     return 0;
diff --git a/src/media/media_decoder.h b/src/media/media_decoder.h
index 64c4047b7c..a296d5397b 100644
--- a/src/media/media_decoder.h
+++ b/src/media/media_decoder.h
@@ -178,7 +178,6 @@ public:
 
     rational<double> getFps() const;
     AVPixelFormat getPixelFormat() const;
-    void setOptions(const std::map<std::string, std::string>& options);
 
     void updateStartTime(int64_t startTime);
 
@@ -193,6 +192,8 @@ public:
 
     void setResolutionChangedCallback(std::function<void(int, int)> cb) { resolutionChangedCallback_ = std::move(cb); }
 
+    void setFEC(bool enable) { fecEnabled_ = enable; }
+
 private:
     NON_COPYABLE(MediaDecoder);
 
@@ -230,6 +231,8 @@ private:
     int width_;
     int height_;
 
+    bool fecEnabled_ {false};
+
 protected:
     AVDictionary* options_ = nullptr;
 };
diff --git a/src/media/media_encoder.cpp b/src/media/media_encoder.cpp
index 225efd05b9..805108eb68 100644
--- a/src/media/media_encoder.cpp
+++ b/src/media/media_encoder.cpp
@@ -129,6 +129,7 @@ MediaEncoder::setOptions(const MediaDescription& args)
 
     mode_ = args.mode;
     linkableHW_ = args.linkableHW;
+    fecEnabled_ = args.fecEnabled;
 }
 
 void
@@ -996,7 +997,7 @@ void
 MediaEncoder::initOpus(AVCodecContext* encoderCtx)
 {
     // Enable FEC support by default with 10% packet loss
-    av_opt_set_int(encoderCtx, "enable_fec", 1, AV_OPT_SEARCH_CHILDREN);
+    av_opt_set_int(encoderCtx, "enable_fec", fecEnabled_ ? 1 : 0, AV_OPT_SEARCH_CHILDREN);
     av_opt_set_int(encoderCtx, "packet_loss", 10, AV_OPT_SEARCH_CHILDREN);
 }
 
diff --git a/src/media/media_encoder.h b/src/media/media_encoder.h
index 2ce7963c60..983ec23966 100644
--- a/src/media/media_encoder.h
+++ b/src/media/media_encoder.h
@@ -155,6 +155,7 @@ private:
     std::mutex encMutex_;
     bool linkableHW_ {false};
     RateMode mode_ {RateMode::CRF_CONSTRAINED};
+    bool fecEnabled_ {false};
 
 #ifdef ENABLE_VIDEO
     video::VideoScaler scaler_;
-- 
GitLab