Index: webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc |
diff --git a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc |
index 2a6c37ff36851ac32c7770175c193420ff0011b0..a056f78e0b0547e1fafe19e4a2f735338602cb7d 100644 |
--- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc |
+++ b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc |
@@ -10,6 +10,26 @@ |
#include "webrtc/modules/audio_coding/main/acm2/rent_a_codec.h" |
+#include "webrtc/base/logging.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/include/audio_encoder_ilbc.h" |
+#endif |
+#ifdef WEBRTC_CODEC_ISACFX |
+#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_decoder_isacfix.h" |
+#include "webrtc/modules/audio_coding/codecs/isac/fix/include/audio_encoder_isacfix.h" |
+#endif |
+#ifdef WEBRTC_CODEC_ISAC |
+#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_decoder_isac.h" |
+#include "webrtc/modules/audio_coding/codecs/isac/main/include/audio_encoder_isac.h" |
+#endif |
+#ifdef WEBRTC_CODEC_OPUS |
+#include "webrtc/modules/audio_coding/codecs/opus/include/audio_encoder_opus.h" |
+#endif |
+#include "webrtc/modules/audio_coding/codecs/pcm16b/include/audio_encoder_pcm16b.h" |
#include "webrtc/modules/audio_coding/main/acm2/acm_codec_database.h" |
#include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h" |
@@ -80,5 +100,74 @@ rtc::Maybe<NetEqDecoder> RentACodec::NetEqDecoderFromCodecId(CodecId codec_id, |
: ned); |
} |
+namespace { |
+ |
+// Returns a new speech encoder, or null on error. |
+// TODO(kwiberg): Don't handle errors here (bug 5033) |
+rtc::scoped_ptr<AudioEncoder> CreateEncoder( |
+ const CodecInst& speech_inst, |
+ 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>(); |
+} |
+ |
+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 |
+} |
+ |
+} // namespace |
+ |
+RentACodec::RentACodec() = default; |
+RentACodec::~RentACodec() = default; |
+ |
+AudioEncoder* RentACodec::RentEncoder(const CodecInst& codec_inst) { |
+ rtc::scoped_ptr<AudioEncoder> enc = |
+ CreateEncoder(codec_inst, &isac_bandwidth_info_); |
+ if (!enc) |
+ return nullptr; |
+ encoder_ = enc.Pass(); |
+ return encoder_.get(); |
+} |
+ |
+AudioDecoder* RentACodec::RentIsacDecoder() { |
+ if (!isac_decoder_) |
+ isac_decoder_ = CreateIsacDecoder(&isac_bandwidth_info_); |
+ return isac_decoder_.get(); |
+} |
+ |
} // namespace acm2 |
} // namespace webrtc |