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 |
deleted file mode 100644 |
index 229d367f6139115e9b377a11fff680d3630f35a4..0000000000000000000000000000000000000000 |
--- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc |
+++ /dev/null |
@@ -1,306 +0,0 @@ |
-/* |
- * Copyright (c) 2015 The WebRTC project authors. All Rights Reserved. |
- * |
- * Use of this source code is governed by a BSD-style license |
- * that can be found in the LICENSE file in the root of the source |
- * tree. An additional intellectual property rights grant can be found |
- * in the file PATENTS. All contributing project authors may |
- * be found in the AUTHORS file in the root of the source tree. |
- */ |
- |
-#include "webrtc/modules/audio_coding/main/acm2/rent_a_codec.h" |
- |
-#include "webrtc/base/logging.h" |
-#include "webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.h" |
-#include "webrtc/modules/audio_coding/codecs/g711/audio_encoder_pcm.h" |
-#ifdef WEBRTC_CODEC_G722 |
-#include "webrtc/modules/audio_coding/codecs/g722/audio_encoder_g722.h" |
-#endif |
-#ifdef WEBRTC_CODEC_ILBC |
-#include "webrtc/modules/audio_coding/codecs/ilbc/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/audio_encoder_opus.h" |
-#endif |
-#include "webrtc/modules/audio_coding/codecs/pcm16b/audio_encoder_pcm16b.h" |
-#ifdef WEBRTC_CODEC_RED |
-#include "webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.h" |
-#endif |
-#include "webrtc/modules/audio_coding/main/acm2/acm_codec_database.h" |
-#include "webrtc/modules/audio_coding/main/acm2/acm_common_defs.h" |
- |
-namespace webrtc { |
-namespace acm2 { |
- |
-rtc::Optional<RentACodec::CodecId> RentACodec::CodecIdByParams( |
- const char* payload_name, |
- int sampling_freq_hz, |
- int channels) { |
- return CodecIdFromIndex( |
- ACMCodecDB::CodecId(payload_name, sampling_freq_hz, channels)); |
-} |
- |
-rtc::Optional<CodecInst> RentACodec::CodecInstById(CodecId codec_id) { |
- rtc::Optional<int> mi = CodecIndexFromId(codec_id); |
- return mi ? rtc::Optional<CodecInst>(Database()[*mi]) |
- : rtc::Optional<CodecInst>(); |
-} |
- |
-rtc::Optional<RentACodec::CodecId> RentACodec::CodecIdByInst( |
- const CodecInst& codec_inst) { |
- return CodecIdFromIndex(ACMCodecDB::CodecNumber(codec_inst)); |
-} |
- |
-rtc::Optional<CodecInst> RentACodec::CodecInstByParams(const char* payload_name, |
- int sampling_freq_hz, |
- int channels) { |
- rtc::Optional<CodecId> codec_id = |
- CodecIdByParams(payload_name, sampling_freq_hz, channels); |
- if (!codec_id) |
- return rtc::Optional<CodecInst>(); |
- rtc::Optional<CodecInst> ci = CodecInstById(*codec_id); |
- RTC_DCHECK(ci); |
- |
- // Keep the number of channels from the function call. For most codecs it |
- // will be the same value as in default codec settings, but not for all. |
- ci->channels = channels; |
- |
- return ci; |
-} |
- |
-bool RentACodec::IsCodecValid(const CodecInst& codec_inst) { |
- return ACMCodecDB::CodecNumber(codec_inst) >= 0; |
-} |
- |
-rtc::Optional<bool> RentACodec::IsSupportedNumChannels(CodecId codec_id, |
- int num_channels) { |
- auto i = CodecIndexFromId(codec_id); |
- return i ? rtc::Optional<bool>( |
- ACMCodecDB::codec_settings_[*i].channel_support >= |
- num_channels) |
- : rtc::Optional<bool>(); |
-} |
- |
-rtc::ArrayView<const CodecInst> RentACodec::Database() { |
- return rtc::ArrayView<const CodecInst>(ACMCodecDB::database_, |
- NumberOfCodecs()); |
-} |
- |
-rtc::Optional<NetEqDecoder> RentACodec::NetEqDecoderFromCodecId( |
- CodecId codec_id, |
- int num_channels) { |
- rtc::Optional<int> i = CodecIndexFromId(codec_id); |
- if (!i) |
- return rtc::Optional<NetEqDecoder>(); |
- const NetEqDecoder ned = ACMCodecDB::neteq_decoders_[*i]; |
- return rtc::Optional<NetEqDecoder>( |
- (ned == NetEqDecoder::kDecoderOpus && num_channels == 2) |
- ? NetEqDecoder::kDecoderOpus_2ch |
- : ned); |
-} |
- |
-RentACodec::RegistrationResult RentACodec::RegisterCngPayloadType( |
- std::map<int, int>* pt_map, |
- const CodecInst& codec_inst) { |
- if (STR_CASE_CMP(codec_inst.plname, "CN") != 0) |
- return RegistrationResult::kSkip; |
- switch (codec_inst.plfreq) { |
- case 8000: |
- case 16000: |
- case 32000: |
- case 48000: |
- (*pt_map)[codec_inst.plfreq] = codec_inst.pltype; |
- return RegistrationResult::kOk; |
- default: |
- return RegistrationResult::kBadFreq; |
- } |
-} |
- |
-RentACodec::RegistrationResult RentACodec::RegisterRedPayloadType( |
- std::map<int, int>* pt_map, |
- const CodecInst& codec_inst) { |
- if (STR_CASE_CMP(codec_inst.plname, "RED") != 0) |
- return RegistrationResult::kSkip; |
- switch (codec_inst.plfreq) { |
- case 8000: |
- (*pt_map)[codec_inst.plfreq] = codec_inst.pltype; |
- return RegistrationResult::kOk; |
- default: |
- return RegistrationResult::kBadFreq; |
- } |
-} |
- |
-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<AudioEncoder> CreateRedEncoder(AudioEncoder* encoder, |
- int red_payload_type) { |
-#ifdef WEBRTC_CODEC_RED |
- AudioEncoderCopyRed::Config config; |
- config.payload_type = red_payload_type; |
- config.speech_encoder = encoder; |
- return rtc::scoped_ptr<AudioEncoder>(new AudioEncoderCopyRed(config)); |
-#else |
- return rtc::scoped_ptr<AudioEncoder>(); |
-#endif |
-} |
- |
-rtc::scoped_ptr<AudioEncoder> CreateCngEncoder(AudioEncoder* encoder, |
- int payload_type, |
- ACMVADMode vad_mode) { |
- AudioEncoderCng::Config config; |
- config.num_channels = encoder->NumChannels(); |
- config.payload_type = payload_type; |
- config.speech_encoder = encoder; |
- switch (vad_mode) { |
- case VADNormal: |
- config.vad_mode = Vad::kVadNormal; |
- break; |
- case VADLowBitrate: |
- config.vad_mode = Vad::kVadLowBitrate; |
- break; |
- case VADAggr: |
- config.vad_mode = Vad::kVadAggressive; |
- break; |
- case VADVeryAggr: |
- config.vad_mode = Vad::kVadVeryAggressive; |
- break; |
- default: |
- FATAL(); |
- } |
- return rtc::scoped_ptr<AudioEncoder>(new AudioEncoderCng(config)); |
-} |
- |
-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; |
- speech_encoder_ = enc.Pass(); |
- return speech_encoder_.get(); |
-} |
- |
-RentACodec::StackParameters::StackParameters() { |
- // Register the default payload types for RED and CNG. |
- for (const CodecInst& ci : RentACodec::Database()) { |
- RentACodec::RegisterCngPayloadType(&cng_payload_types, ci); |
- RentACodec::RegisterRedPayloadType(&red_payload_types, ci); |
- } |
-} |
- |
-RentACodec::StackParameters::~StackParameters() = default; |
- |
-AudioEncoder* RentACodec::RentEncoderStack(AudioEncoder* speech_encoder, |
- StackParameters* param) { |
- RTC_DCHECK(speech_encoder); |
- |
- if (param->use_codec_fec) { |
- // Switch FEC on. On failure, remember that FEC is off. |
- if (!speech_encoder->SetFec(true)) |
- param->use_codec_fec = false; |
- } else { |
- // Switch FEC off. This shouldn't fail. |
- const bool success = speech_encoder->SetFec(false); |
- RTC_DCHECK(success); |
- } |
- |
- auto pt = [&speech_encoder](const std::map<int, int>& m) { |
- auto it = m.find(speech_encoder->SampleRateHz()); |
- return it == m.end() ? rtc::Optional<int>() |
- : rtc::Optional<int>(it->second); |
- }; |
- auto cng_pt = pt(param->cng_payload_types); |
- param->use_cng = |
- param->use_cng && cng_pt && speech_encoder->NumChannels() == 1; |
- auto red_pt = pt(param->red_payload_types); |
- param->use_red = param->use_red && red_pt; |
- |
- if (param->use_cng || param->use_red) { |
- // The RED and CNG encoders need to be in sync with the speech encoder, so |
- // reset the latter to ensure its buffer is empty. |
- speech_encoder->Reset(); |
- } |
- encoder_stack_ = speech_encoder; |
- if (param->use_red) { |
- red_encoder_ = CreateRedEncoder(encoder_stack_, *red_pt); |
- if (red_encoder_) |
- encoder_stack_ = red_encoder_.get(); |
- } else { |
- red_encoder_.reset(); |
- } |
- if (param->use_cng) { |
- cng_encoder_ = CreateCngEncoder(encoder_stack_, *cng_pt, param->vad_mode); |
- encoder_stack_ = cng_encoder_.get(); |
- } else { |
- cng_encoder_.reset(); |
- } |
- return encoder_stack_; |
-} |
- |
-AudioDecoder* RentACodec::RentIsacDecoder() { |
- if (!isac_decoder_) |
- isac_decoder_ = CreateIsacDecoder(&isac_bandwidth_info_); |
- return isac_decoder_.get(); |
-} |
- |
-} // namespace acm2 |
-} // namespace webrtc |