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