| Index: webrtc/modules/audio_coding/main/acm2/codec_owner.cc
|
| diff --git a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
|
| index 4d214be24281e313700fa43aca2efd2b20afa8e5..ed23e10b563f6f0b02e940db3083a719b1b2fe39 100644
|
| --- a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
|
| +++ b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
|
| @@ -75,55 +75,61 @@ bool IsG722(const CodecInst& codec) {
|
| }
|
| } // namespace
|
|
|
| -CodecOwner::CodecOwner()
|
| - : isac_is_encoder_(false), external_speech_encoder_(nullptr) {
|
| +CodecOwner::CodecOwner() : external_speech_encoder_(nullptr) {
|
| }
|
|
|
| CodecOwner::~CodecOwner() = default;
|
|
|
| namespace {
|
| -AudioEncoderDecoderMutableIsac* CreateIsacCodec(const CodecInst& speech_inst) {
|
| +
|
| +rtc::scoped_ptr<AudioDecoder> CreateIsacDecoder(
|
| + LockedIsacBandwidthInfo* bwinfo) {
|
| +#if defined(WEBRTC_CODEC_ISACFX)
|
| + return rtc_make_scoped_ptr(new AudioDecoderIsacFix(bwinfo));
|
| +#elif defined(WEBRTC_CODEC_ISAC)
|
| + return rtc_make_scoped_ptr(new AudioDecoderIsac(bwinfo));
|
| +#else
|
| + FATAL() << "iSAC is not supported.";
|
| + return rtc::scoped_ptr<AudioDecoder>();
|
| +#endif
|
| +}
|
| +
|
| +rtc::scoped_ptr<AudioEncoderMutable> CreateIsacEncoder(
|
| + const CodecInst& speech_inst,
|
| + LockedIsacBandwidthInfo* bwinfo) {
|
| #if defined(WEBRTC_CODEC_ISACFX)
|
| - return new AudioEncoderDecoderMutableIsacFix(speech_inst);
|
| + return rtc_make_scoped_ptr(
|
| + new AudioEncoderMutableIsacFix(speech_inst, bwinfo));
|
| #elif defined(WEBRTC_CODEC_ISAC)
|
| - return new AudioEncoderDecoderMutableIsacFloat(speech_inst);
|
| + return rtc_make_scoped_ptr(
|
| + new AudioEncoderMutableIsacFloat(speech_inst, bwinfo));
|
| #else
|
| FATAL() << "iSAC is not supported.";
|
| - return nullptr;
|
| + return rtc::scoped_ptr<AudioEncoderMutable>();
|
| #endif
|
| }
|
|
|
| -void CreateSpeechEncoder(
|
| +rtc::scoped_ptr<AudioEncoderMutable> CreateSpeechEncoder(
|
| const CodecInst& speech_inst,
|
| - rtc::scoped_ptr<AudioEncoderMutable>* speech_encoder,
|
| - rtc::scoped_ptr<AudioEncoderDecoderMutableIsac>* isac_codec,
|
| - bool* isac_is_encoder) {
|
| + LockedIsacBandwidthInfo* bwinfo) {
|
| if (IsIsac(speech_inst)) {
|
| - if (*isac_codec) {
|
| - (*isac_codec)->UpdateSettings(speech_inst);
|
| - } else {
|
| - isac_codec->reset(CreateIsacCodec(speech_inst));
|
| - }
|
| - *isac_is_encoder = true;
|
| - speech_encoder->reset();
|
| - return;
|
| - }
|
| - if (IsOpus(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutableOpus(speech_inst));
|
| + return CreateIsacEncoder(speech_inst, bwinfo);
|
| + } else if (IsOpus(speech_inst)) {
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutableOpus(speech_inst));
|
| } else if (IsPcmU(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutablePcmU(speech_inst));
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutablePcmU(speech_inst));
|
| } else if (IsPcmA(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutablePcmA(speech_inst));
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutablePcmA(speech_inst));
|
| } else if (IsPcm16B(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutablePcm16B(speech_inst));
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutablePcm16B(speech_inst));
|
| } else if (IsIlbc(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutableIlbc(speech_inst));
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutableIlbc(speech_inst));
|
| } else if (IsG722(speech_inst)) {
|
| - speech_encoder->reset(new AudioEncoderMutableG722(speech_inst));
|
| + return rtc_make_scoped_ptr(new AudioEncoderMutableG722(speech_inst));
|
| } else {
|
| FATAL();
|
| + return rtc::scoped_ptr<AudioEncoderMutable>();
|
| }
|
| - *isac_is_encoder = false;
|
| }
|
|
|
| AudioEncoder* CreateRedEncoder(int red_payload_type,
|
| @@ -176,8 +182,7 @@ void CodecOwner::SetEncoders(const CodecInst& speech_inst,
|
| int cng_payload_type,
|
| ACMVADMode vad_mode,
|
| int red_payload_type) {
|
| - CreateSpeechEncoder(speech_inst, &speech_encoder_, &isac_codec_,
|
| - &isac_is_encoder_);
|
| + speech_encoder_ = CreateSpeechEncoder(speech_inst, &isac_bandwidth_info_);
|
| external_speech_encoder_ = nullptr;
|
| ChangeCngAndRed(cng_payload_type, vad_mode, red_payload_type);
|
| }
|
| @@ -188,7 +193,6 @@ void CodecOwner::SetEncoders(AudioEncoderMutable* external_speech_encoder,
|
| int red_payload_type) {
|
| external_speech_encoder_ = external_speech_encoder;
|
| speech_encoder_.reset();
|
| - isac_is_encoder_ = false;
|
| ChangeCngAndRed(cng_payload_type, vad_mode, red_payload_type);
|
| }
|
|
|
| @@ -204,24 +208,13 @@ void CodecOwner::ChangeCngAndRed(int cng_payload_type,
|
| AudioEncoder* encoder =
|
| CreateRedEncoder(red_payload_type, speech_encoder, &red_encoder_);
|
| CreateCngEncoder(cng_payload_type, vad_mode, encoder, &cng_encoder_);
|
| - int num_true =
|
| - !!speech_encoder_ + !!external_speech_encoder_ + isac_is_encoder_;
|
| - DCHECK_EQ(num_true, 1);
|
| - DCHECK(!isac_is_encoder_ || isac_codec_);
|
| + DCHECK_EQ(!!speech_encoder_ + !!external_speech_encoder_, 1);
|
| }
|
|
|
| AudioDecoder* CodecOwner::GetIsacDecoder() {
|
| - if (!isac_codec_) {
|
| - DCHECK(!isac_is_encoder_);
|
| - // None of the parameter values in |speech_inst| matter when the codec is
|
| - // used only as a decoder.
|
| - CodecInst speech_inst;
|
| - speech_inst.plfreq = 16000;
|
| - speech_inst.rate = -1;
|
| - speech_inst.pacsize = 480;
|
| - isac_codec_.reset(CreateIsacCodec(speech_inst));
|
| - }
|
| - return isac_codec_.get();
|
| + if (!isac_decoder_)
|
| + isac_decoder_ = CreateIsacDecoder(&isac_bandwidth_info_);
|
| + return isac_decoder_.get();
|
| }
|
|
|
| AudioEncoder* CodecOwner::Encoder() {
|
| @@ -243,15 +236,9 @@ AudioEncoderMutable* CodecOwner::SpeechEncoder() {
|
| }
|
|
|
| const AudioEncoderMutable* CodecOwner::SpeechEncoder() const {
|
| - int num_true =
|
| - !!speech_encoder_ + !!external_speech_encoder_ + isac_is_encoder_;
|
| - DCHECK_GE(num_true, 0);
|
| - DCHECK_LE(num_true, 1);
|
| - if (external_speech_encoder_)
|
| - return external_speech_encoder_;
|
| - if (speech_encoder_)
|
| - return speech_encoder_.get();
|
| - return isac_is_encoder_ ? isac_codec_.get() : nullptr;
|
| + DCHECK(!speech_encoder_ || !external_speech_encoder_);
|
| + return external_speech_encoder_ ? external_speech_encoder_
|
| + : speech_encoder_.get();
|
| }
|
|
|
| } // namespace acm2
|
|
|