From 83277131b1d22a5cd4243994cbc36501e8096845 Mon Sep 17 00:00:00 2001 From: kwiberg Date: Tue, 26 Jan 2016 06:06:13 -0800 Subject: [PATCH] AudioCodingModuleImpl: Put CodecManager and Rent-A-Codec in a separate struct This will make it easier for future CLs to make them optional. BUG=webrtc:5028 Review URL: https://codereview.webrtc.org/1625363002 Cr-Commit-Position: refs/heads/master@{#11381} --- .../acm2/audio_coding_module_impl.cc | 50 ++++++++++--------- .../acm2/audio_coding_module_impl.h | 12 +++-- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc index d770c5b059..a7d9df457c 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.cc @@ -107,6 +107,7 @@ AudioCodingModuleImpl::AudioCodingModuleImpl( expected_in_ts_(0xD87F3F9F), receiver_(config), bitrate_logger_("WebRTC.Audio.TargetBitrateInKbps"), + encoder_factory_(new EncoderFactory), encoder_stack_(nullptr), previous_pltype_(255), receiver_initialized_(false), @@ -195,39 +196,39 @@ int32_t AudioCodingModuleImpl::Encode(const InputData& input_data) { // Can be called multiple times for Codec, CNG, RED. int AudioCodingModuleImpl::RegisterSendCodec(const CodecInst& send_codec) { rtc::CritScope lock(&acm_crit_sect_); - if (!codec_manager_.RegisterEncoder(send_codec)) { + if (!encoder_factory_->codec_manager.RegisterEncoder(send_codec)) { return -1; } - auto* sp = codec_manager_.GetStackParams(); - if (!sp->speech_encoder && codec_manager_.GetCodecInst()) { + auto* sp = encoder_factory_->codec_manager.GetStackParams(); + if (!sp->speech_encoder && encoder_factory_->codec_manager.GetCodecInst()) { // We have no speech encoder, but we have a specification for making one. - AudioEncoder* enc = - rent_a_codec_.RentEncoder(*codec_manager_.GetCodecInst()); + AudioEncoder* enc = encoder_factory_->rent_a_codec.RentEncoder( + *encoder_factory_->codec_manager.GetCodecInst()); if (!enc) return -1; sp->speech_encoder = enc; } if (sp->speech_encoder) - encoder_stack_ = rent_a_codec_.RentEncoderStack(sp); + encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp); return 0; } void AudioCodingModuleImpl::RegisterExternalSendCodec( AudioEncoder* external_speech_encoder) { rtc::CritScope lock(&acm_crit_sect_); - auto* sp = codec_manager_.GetStackParams(); + auto* sp = encoder_factory_->codec_manager.GetStackParams(); sp->speech_encoder = external_speech_encoder; - encoder_stack_ = rent_a_codec_.RentEncoderStack(sp); + encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp); } // Get current send codec. rtc::Optional AudioCodingModuleImpl::SendCodec() const { rtc::CritScope lock(&acm_crit_sect_); - auto* ci = codec_manager_.GetCodecInst(); + auto* ci = encoder_factory_->codec_manager.GetCodecInst(); if (ci) { return rtc::Optional(*ci); } - auto* enc = codec_manager_.GetStackParams()->speech_encoder; + auto* enc = encoder_factory_->codec_manager.GetStackParams()->speech_encoder; if (enc) { return rtc::Optional(CodecManager::ForgeCodecInst(enc)); } @@ -442,19 +443,19 @@ int AudioCodingModuleImpl::PreprocessToAddData(const AudioFrame& in_frame, bool AudioCodingModuleImpl::REDStatus() const { rtc::CritScope lock(&acm_crit_sect_); - return codec_manager_.GetStackParams()->use_red; + return encoder_factory_->codec_manager.GetStackParams()->use_red; } // Configure RED status i.e on/off. int AudioCodingModuleImpl::SetREDStatus(bool enable_red) { #ifdef WEBRTC_CODEC_RED rtc::CritScope lock(&acm_crit_sect_); - if (!codec_manager_.SetCopyRed(enable_red)) { + if (!encoder_factory_->codec_manager.SetCopyRed(enable_red)) { return -1; } - auto* sp = codec_manager_.GetStackParams(); + auto* sp = encoder_factory_->codec_manager.GetStackParams(); if (sp->speech_encoder) - encoder_stack_ = rent_a_codec_.RentEncoderStack(sp); + encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp); return 0; #else WEBRTC_TRACE(webrtc::kTraceWarning, webrtc::kTraceAudioCoding, id_, @@ -469,17 +470,17 @@ int AudioCodingModuleImpl::SetREDStatus(bool enable_red) { bool AudioCodingModuleImpl::CodecFEC() const { rtc::CritScope lock(&acm_crit_sect_); - return codec_manager_.GetStackParams()->use_codec_fec; + return encoder_factory_->codec_manager.GetStackParams()->use_codec_fec; } int AudioCodingModuleImpl::SetCodecFEC(bool enable_codec_fec) { rtc::CritScope lock(&acm_crit_sect_); - if (!codec_manager_.SetCodecFEC(enable_codec_fec)) { + if (!encoder_factory_->codec_manager.SetCodecFEC(enable_codec_fec)) { return -1; } - auto* sp = codec_manager_.GetStackParams(); + auto* sp = encoder_factory_->codec_manager.GetStackParams(); if (sp->speech_encoder) - encoder_stack_ = rent_a_codec_.RentEncoderStack(sp); + encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp); if (enable_codec_fec) { return sp->use_codec_fec ? 0 : -1; } else { @@ -505,12 +506,12 @@ int AudioCodingModuleImpl::SetVAD(bool enable_dtx, // Note: |enable_vad| is not used; VAD is enabled based on the DTX setting. RTC_DCHECK_EQ(enable_dtx, enable_vad); rtc::CritScope lock(&acm_crit_sect_); - if (!codec_manager_.SetVAD(enable_dtx, mode)) { + if (!encoder_factory_->codec_manager.SetVAD(enable_dtx, mode)) { return -1; } - auto* sp = codec_manager_.GetStackParams(); + auto* sp = encoder_factory_->codec_manager.GetStackParams(); if (sp->speech_encoder) - encoder_stack_ = rent_a_codec_.RentEncoderStack(sp); + encoder_stack_ = encoder_factory_->rent_a_codec.RentEncoderStack(sp); return 0; } @@ -518,7 +519,7 @@ int AudioCodingModuleImpl::SetVAD(bool enable_dtx, int AudioCodingModuleImpl::VAD(bool* dtx_enabled, bool* vad_enabled, ACMVADMode* mode) const { rtc::CritScope lock(&acm_crit_sect_); - const auto* sp = codec_manager_.GetStackParams(); + const auto* sp = encoder_factory_->codec_manager.GetStackParams(); *dtx_enabled = *vad_enabled = sp->use_cng; *mode = sp->vad_mode; return 0; @@ -609,8 +610,9 @@ int AudioCodingModuleImpl::RegisterReceiveCodec(const CodecInst& codec) { // not own its decoder. return receiver_.AddCodec( *codec_index, codec.pltype, codec.channels, codec.plfreq, - STR_CASE_CMP(codec.plname, "isac") == 0 ? rent_a_codec_.RentIsacDecoder() - : nullptr, + STR_CASE_CMP(codec.plname, "isac") == 0 + ? encoder_factory_->rent_a_codec.RentIsacDecoder() + : nullptr, codec.plname); } diff --git a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h index 6750a91ea1..102396f70b 100644 --- a/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h +++ b/webrtc/modules/audio_coding/acm2/audio_coding_module_impl.h @@ -248,10 +248,16 @@ class AudioCodingModuleImpl final : public AudioCodingModule { ACMResampler resampler_ GUARDED_BY(acm_crit_sect_); AcmReceiver receiver_; // AcmReceiver has it's own internal lock. ChangeLogger bitrate_logger_ GUARDED_BY(acm_crit_sect_); - CodecManager codec_manager_ GUARDED_BY(acm_crit_sect_); - RentACodec rent_a_codec_ GUARDED_BY(acm_crit_sect_); - // Last encoder stack obtained from rent_a_codec_.RentEncoderStack. + struct EncoderFactory { + CodecManager codec_manager; + RentACodec rent_a_codec; + }; + rtc::scoped_ptr encoder_factory_ GUARDED_BY(acm_crit_sect_); + + // Current encoder stack, either obtained from + // encoder_factory_->rent_a_codec.RentEncoderStack or provided by a call to + // RegisterEncoder. AudioEncoder* encoder_stack_ GUARDED_BY(acm_crit_sect_); // This is to keep track of CN instances where we can send DTMFs.