diff --git a/webrtc/modules/audio_coding/acm2/rent_a_codec.cc b/webrtc/modules/audio_coding/acm2/rent_a_codec.cc index 71d34d1068..3bf959e901 100644 --- a/webrtc/modules/audio_coding/acm2/rent_a_codec.cc +++ b/webrtc/modules/audio_coding/acm2/rent_a_codec.cc @@ -40,6 +40,10 @@ #include "webrtc/modules/audio_coding/acm2/acm_codec_database.h" #include "webrtc/modules/audio_coding/acm2/acm_common_defs.h" +#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) +#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" +#endif + namespace webrtc { namespace acm2 { @@ -145,8 +149,9 @@ namespace { // Returns a new speech encoder, or null on error. // TODO(kwiberg): Don't handle errors here (bug 5033) -std::unique_ptr CreateEncoder(const CodecInst& speech_inst, - LockedIsacBandwidthInfo* bwinfo) { +std::unique_ptr CreateEncoder( + const CodecInst& speech_inst, + const rtc::scoped_refptr& bwinfo) { #if defined(WEBRTC_CODEC_ISACFX) if (STR_CASE_CMP(speech_inst.plname, "isac") == 0) return std::unique_ptr( @@ -221,7 +226,7 @@ std::unique_ptr CreateCngEncoder( } std::unique_ptr CreateIsacDecoder( - LockedIsacBandwidthInfo* bwinfo) { + const rtc::scoped_refptr& bwinfo) { #if defined(WEBRTC_CODEC_ISACFX) return std::unique_ptr(new AudioDecoderIsacFix(bwinfo)); #elif defined(WEBRTC_CODEC_ISAC) @@ -234,12 +239,16 @@ std::unique_ptr CreateIsacDecoder( } // namespace -RentACodec::RentACodec() = default; +RentACodec::RentACodec() { +#if defined(WEBRTC_CODEC_ISACFX) || defined(WEBRTC_CODEC_ISAC) + isac_bandwidth_info_ = new LockedIsacBandwidthInfo; +#endif +} RentACodec::~RentACodec() = default; std::unique_ptr RentACodec::RentEncoder( const CodecInst& codec_inst) { - return CreateEncoder(codec_inst, &isac_bandwidth_info_); + return CreateEncoder(codec_inst, isac_bandwidth_info_); } RentACodec::StackParameters::StackParameters() { @@ -295,7 +304,7 @@ std::unique_ptr RentACodec::RentEncoderStack( } std::unique_ptr RentACodec::RentIsacDecoder() { - return CreateIsacDecoder(&isac_bandwidth_info_); + return CreateIsacDecoder(isac_bandwidth_info_); } } // namespace acm2 diff --git a/webrtc/modules/audio_coding/acm2/rent_a_codec.h b/webrtc/modules/audio_coding/acm2/rent_a_codec.h index e41f77d103..2c5873d616 100644 --- a/webrtc/modules/audio_coding/acm2/rent_a_codec.h +++ b/webrtc/modules/audio_coding/acm2/rent_a_codec.h @@ -18,23 +18,16 @@ #include "webrtc/base/array_view.h" #include "webrtc/base/constructormagic.h" #include "webrtc/base/optional.h" +#include "webrtc/base/scoped_ref_ptr.h" #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" #include "webrtc/modules/audio_coding/codecs/audio_encoder.h" #include "webrtc/modules/audio_coding/include/audio_coding_module_typedefs.h" #include "webrtc/typedefs.h" -#if defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX) -#include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" -#else -// Dummy implementation, for when we don't have iSAC. -namespace webrtc { -class LockedIsacBandwidthInfo {}; -} -#endif - namespace webrtc { struct CodecInst; +class LockedIsacBandwidthInfo; namespace acm2 { @@ -229,7 +222,7 @@ class RentACodec { std::unique_ptr speech_encoder_; std::unique_ptr cng_encoder_; std::unique_ptr red_encoder_; - LockedIsacBandwidthInfo isac_bandwidth_info_; + rtc::scoped_refptr isac_bandwidth_info_; RTC_DISALLOW_COPY_AND_ASSIGN(RentACodec); }; diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h index 845af42479..d9d20ec039 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t.h @@ -13,6 +13,7 @@ #include +#include "webrtc/base/scoped_ref_ptr.h" #include "webrtc/modules/audio_coding/codecs/audio_decoder.h" #include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" @@ -22,7 +23,8 @@ template class AudioDecoderIsacT final : public AudioDecoder { public: AudioDecoderIsacT(); - explicit AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo); + explicit AudioDecoderIsacT( + const rtc::scoped_refptr& bwinfo); ~AudioDecoderIsacT() override; bool HasDecodePlc() const override; @@ -43,7 +45,7 @@ class AudioDecoderIsacT final : public AudioDecoder { private: typename T::instance_type* isac_state_; - LockedIsacBandwidthInfo* bwinfo_; + rtc::scoped_refptr bwinfo_; int decoder_sample_rate_hz_; RTC_DISALLOW_COPY_AND_ASSIGN(AudioDecoderIsacT); diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h index a986bc479d..4998feac84 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_decoder_isac_t_impl.h @@ -22,7 +22,8 @@ AudioDecoderIsacT::AudioDecoderIsacT() : AudioDecoderIsacT(nullptr) {} template -AudioDecoderIsacT::AudioDecoderIsacT(LockedIsacBandwidthInfo* bwinfo) +AudioDecoderIsacT::AudioDecoderIsacT( + const rtc::scoped_refptr& bwinfo) : bwinfo_(bwinfo), decoder_sample_rate_hz_(-1) { RTC_CHECK_EQ(0, T::Create(&isac_state_)); T::DecoderInit(isac_state_); diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h index e840f3b1b1..0da8ed71d6 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t.h @@ -13,6 +13,7 @@ #include +#include "webrtc/base/scoped_ref_ptr.h" #include "webrtc/modules/audio_coding/codecs/audio_encoder.h" #include "webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h" @@ -30,7 +31,7 @@ class AudioEncoderIsacT final : public AudioEncoder { struct Config { bool IsOk() const; - LockedIsacBandwidthInfo* bwinfo = nullptr; + rtc::scoped_refptr bwinfo; int payload_type = 103; int sample_rate_hz = 16000; @@ -50,8 +51,9 @@ class AudioEncoderIsacT final : public AudioEncoder { }; explicit AudioEncoderIsacT(const Config& config); - explicit AudioEncoderIsacT(const CodecInst& codec_inst, - LockedIsacBandwidthInfo* bwinfo); + explicit AudioEncoderIsacT( + const CodecInst& codec_inst, + const rtc::scoped_refptr& bwinfo); ~AudioEncoderIsacT() override; size_t MaxEncodedBytes() const override; @@ -77,7 +79,7 @@ class AudioEncoderIsacT final : public AudioEncoder { Config config_; typename T::instance_type* isac_state_ = nullptr; - LockedIsacBandwidthInfo* bwinfo_ = nullptr; + rtc::scoped_refptr bwinfo_; // Have we accepted input but not yet emitted it in a packet? bool packet_in_progress_ = false; diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h index 3ad0f27d4b..1debbeb903 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h @@ -21,7 +21,7 @@ namespace webrtc { template typename AudioEncoderIsacT::Config CreateIsacConfig( const CodecInst& codec_inst, - LockedIsacBandwidthInfo* bwinfo) { + const rtc::scoped_refptr& bwinfo) { typename AudioEncoderIsacT::Config config; config.bwinfo = bwinfo; config.payload_type = codec_inst.pltype; @@ -69,8 +69,9 @@ AudioEncoderIsacT::AudioEncoderIsacT(const Config& config) { } template -AudioEncoderIsacT::AudioEncoderIsacT(const CodecInst& codec_inst, - LockedIsacBandwidthInfo* bwinfo) +AudioEncoderIsacT::AudioEncoderIsacT( + const CodecInst& codec_inst, + const rtc::scoped_refptr& bwinfo) : AudioEncoderIsacT(CreateIsacConfig(codec_inst, bwinfo)) {} template diff --git a/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc b/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc index 86f60555f7..5b9439fa9c 100644 --- a/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc +++ b/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.cc @@ -12,7 +12,7 @@ namespace webrtc { -LockedIsacBandwidthInfo::LockedIsacBandwidthInfo() { +LockedIsacBandwidthInfo::LockedIsacBandwidthInfo() : ref_count_(0) { bwinfo_.in_use = 0; } diff --git a/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h b/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h index 6bb32c99ed..1ab5ae9d63 100644 --- a/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h +++ b/webrtc/modules/audio_coding/codecs/isac/locked_bandwidth_info.h @@ -11,6 +11,7 @@ #ifndef WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_LOCKED_BANDWIDTH_INFO_H_ #define WEBRTC_MODULES_AUDIO_CODING_CODECS_ISAC_LOCKED_BANDWIDTH_INFO_H_ +#include "webrtc/base/atomicops.h" #include "webrtc/base/criticalsection.h" #include "webrtc/base/thread_annotations.h" #include "webrtc/modules/audio_coding/codecs/isac/bandwidth_info.h" @@ -34,7 +35,18 @@ class LockedIsacBandwidthInfo final { bwinfo_ = bwinfo; } + int AddRef() const { return rtc::AtomicOps::Increment(&ref_count_); } + + int Release() const { + const int count = rtc::AtomicOps::Decrement(&ref_count_); + if (count == 0) { + delete this; + } + return count; + } + private: + mutable volatile int ref_count_; rtc::CriticalSection lock_; IsacBandwidthInfo bwinfo_ GUARDED_BY(lock_); };