summaryrefslogtreecommitdiff
path: root/chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc')
-rw-r--r--chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc211
1 files changed, 83 insertions, 128 deletions
diff --git a/chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc b/chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
index 4d214be2428..449a467a172 100644
--- a/chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
+++ b/chromium/third_party/webrtc/modules/audio_coding/main/acm2/codec_owner.cc
@@ -11,133 +11,104 @@
#include "webrtc/modules/audio_coding/main/acm2/codec_owner.h"
#include "webrtc/base/checks.h"
+#include "webrtc/base/logging.h"
#include "webrtc/engine_configurations.h"
#include "webrtc/modules/audio_coding/codecs/cng/include/audio_encoder_cng.h"
#include "webrtc/modules/audio_coding/codecs/g711/include/audio_encoder_pcm.h"
+#ifdef WEBRTC_CODEC_G722
#include "webrtc/modules/audio_coding/codecs/g722/include/audio_encoder_g722.h"
+#endif
+#ifdef WEBRTC_CODEC_ILBC
#include "webrtc/modules/audio_coding/codecs/ilbc/interface/audio_encoder_ilbc.h"
+#endif
+#ifdef WEBRTC_CODEC_ISACFX
+#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_decoder_isacfix.h"
#include "webrtc/modules/audio_coding/codecs/isac/fix/interface/audio_encoder_isacfix.h"
+#endif
+#ifdef WEBRTC_CODEC_ISAC
+#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_decoder_isac.h"
#include "webrtc/modules/audio_coding/codecs/isac/main/interface/audio_encoder_isac.h"
+#endif
+#ifdef WEBRTC_CODEC_OPUS
#include "webrtc/modules/audio_coding/codecs/opus/interface/audio_encoder_opus.h"
+#endif
#include "webrtc/modules/audio_coding/codecs/pcm16b/include/audio_encoder_pcm16b.h"
+#ifdef WEBRTC_CODEC_RED
#include "webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.h"
+#endif
namespace webrtc {
namespace acm2 {
-namespace {
-bool IsIsac(const CodecInst& codec) {
- return
-#if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX))
- !STR_CASE_CMP(codec.plname, "isac") ||
-#endif
- false;
-}
-
-bool IsOpus(const CodecInst& codec) {
- return
-#ifdef WEBRTC_CODEC_OPUS
- !STR_CASE_CMP(codec.plname, "opus") ||
-#endif
- false;
-}
-
-bool IsPcmU(const CodecInst& codec) {
- return !STR_CASE_CMP(codec.plname, "pcmu");
-}
-
-bool IsPcmA(const CodecInst& codec) {
- return !STR_CASE_CMP(codec.plname, "pcma");
-}
-
-bool IsPcm16B(const CodecInst& codec) {
- return
-#ifdef WEBRTC_CODEC_PCM16
- !STR_CASE_CMP(codec.plname, "l16") ||
-#endif
- false;
-}
-
-bool IsIlbc(const CodecInst& codec) {
- return
-#ifdef WEBRTC_CODEC_ILBC
- !STR_CASE_CMP(codec.plname, "ilbc") ||
-#endif
- false;
-}
-
-bool IsG722(const CodecInst& codec) {
- return
-#ifdef WEBRTC_CODEC_G722
- !STR_CASE_CMP(codec.plname, "g722") ||
-#endif
- false;
-}
-} // 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 new AudioEncoderDecoderMutableIsacFix(speech_inst);
+ return rtc_make_scoped_ptr(new AudioDecoderIsacFix(bwinfo));
#elif defined(WEBRTC_CODEC_ISAC)
- return new AudioEncoderDecoderMutableIsacFloat(speech_inst);
+ return rtc_make_scoped_ptr(new AudioDecoderIsac(bwinfo));
#else
FATAL() << "iSAC is not supported.";
- return nullptr;
+ return rtc::scoped_ptr<AudioDecoder>();
#endif
}
-void CreateSpeechEncoder(
+// Returns a new speech encoder, or null on error.
+// TODO(kwiberg): Don't handle errors here (bug 5033)
+rtc::scoped_ptr<AudioEncoder> CreateSpeechEncoder(
const CodecInst& speech_inst,
- rtc::scoped_ptr<AudioEncoderMutable>* speech_encoder,
- rtc::scoped_ptr<AudioEncoderDecoderMutableIsac>* isac_codec,
- bool* isac_is_encoder) {
- 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));
- } else if (IsPcmU(speech_inst)) {
- speech_encoder->reset(new AudioEncoderMutablePcmU(speech_inst));
- } else if (IsPcmA(speech_inst)) {
- speech_encoder->reset(new AudioEncoderMutablePcmA(speech_inst));
- } else if (IsPcm16B(speech_inst)) {
- speech_encoder->reset(new AudioEncoderMutablePcm16B(speech_inst));
- } else if (IsIlbc(speech_inst)) {
- speech_encoder->reset(new AudioEncoderMutableIlbc(speech_inst));
- } else if (IsG722(speech_inst)) {
- speech_encoder->reset(new AudioEncoderMutableG722(speech_inst));
- } else {
- FATAL();
- }
- *isac_is_encoder = false;
+ LockedIsacBandwidthInfo* bwinfo) {
+#if defined(WEBRTC_CODEC_ISACFX)
+ if (STR_CASE_CMP(speech_inst.plname, "isac") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderIsacFix(speech_inst, bwinfo));
+#endif
+#if defined(WEBRTC_CODEC_ISAC)
+ if (STR_CASE_CMP(speech_inst.plname, "isac") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderIsac(speech_inst, bwinfo));
+#endif
+#ifdef WEBRTC_CODEC_OPUS
+ if (STR_CASE_CMP(speech_inst.plname, "opus") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderOpus(speech_inst));
+#endif
+ if (STR_CASE_CMP(speech_inst.plname, "pcmu") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderPcmU(speech_inst));
+ if (STR_CASE_CMP(speech_inst.plname, "pcma") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderPcmA(speech_inst));
+ if (STR_CASE_CMP(speech_inst.plname, "l16") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderPcm16B(speech_inst));
+#ifdef WEBRTC_CODEC_ILBC
+ if (STR_CASE_CMP(speech_inst.plname, "ilbc") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderIlbc(speech_inst));
+#endif
+#ifdef WEBRTC_CODEC_G722
+ if (STR_CASE_CMP(speech_inst.plname, "g722") == 0)
+ return rtc_make_scoped_ptr(new AudioEncoderG722(speech_inst));
+#endif
+ LOG_F(LS_ERROR) << "Could not create encoder of type " << speech_inst.plname;
+ return rtc::scoped_ptr<AudioEncoder>();
}
AudioEncoder* CreateRedEncoder(int red_payload_type,
AudioEncoder* encoder,
rtc::scoped_ptr<AudioEncoder>* red_encoder) {
- if (red_payload_type == -1) {
- red_encoder->reset();
- return encoder;
+#ifdef WEBRTC_CODEC_RED
+ if (red_payload_type != -1) {
+ AudioEncoderCopyRed::Config config;
+ config.payload_type = red_payload_type;
+ config.speech_encoder = encoder;
+ red_encoder->reset(new AudioEncoderCopyRed(config));
+ return red_encoder->get();
}
- AudioEncoderCopyRed::Config config;
- config.payload_type = red_payload_type;
- config.speech_encoder = encoder;
- red_encoder->reset(new AudioEncoderCopyRed(config));
- return red_encoder->get();
+#endif
+
+ red_encoder->reset();
+ return encoder;
}
void CreateCngEncoder(int cng_payload_type,
@@ -172,30 +143,31 @@ void CreateCngEncoder(int cng_payload_type,
}
} // namespace
-void CodecOwner::SetEncoders(const CodecInst& speech_inst,
+bool 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_);
+ if (!speech_encoder_)
+ return false;
external_speech_encoder_ = nullptr;
ChangeCngAndRed(cng_payload_type, vad_mode, red_payload_type);
+ return true;
}
-void CodecOwner::SetEncoders(AudioEncoderMutable* external_speech_encoder,
+void CodecOwner::SetEncoders(AudioEncoder* external_speech_encoder,
int cng_payload_type,
ACMVADMode vad_mode,
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);
}
void CodecOwner::ChangeCngAndRed(int cng_payload_type,
ACMVADMode vad_mode,
int red_payload_type) {
- AudioEncoderMutable* speech_encoder = SpeechEncoder();
+ AudioEncoder* speech_encoder = SpeechEncoder();
if (cng_payload_type != -1 || red_payload_type != -1) {
// The RED and CNG encoders need to be in sync with the speech encoder, so
// reset the latter to ensure its buffer is empty.
@@ -204,24 +176,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_);
+ RTC_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() {
@@ -237,21 +198,15 @@ const AudioEncoder* CodecOwner::Encoder() const {
return SpeechEncoder();
}
-AudioEncoderMutable* CodecOwner::SpeechEncoder() {
- const auto& const_this = *this;
- return const_cast<AudioEncoderMutable*>(const_this.SpeechEncoder());
+AudioEncoder* CodecOwner::SpeechEncoder() {
+ const auto* const_this = this;
+ return const_cast<AudioEncoder*>(const_this->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;
+const AudioEncoder* CodecOwner::SpeechEncoder() const {
+ RTC_DCHECK(!speech_encoder_ || !external_speech_encoder_);
+ return external_speech_encoder_ ? external_speech_encoder_
+ : speech_encoder_.get();
}
} // namespace acm2