| 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 c2a40243eaba8f4f1522bb0e1d2cd8f966db36db..328181428bb6bc4eb7af21188222615915b20344 100644
|
| --- a/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc
|
| +++ b/webrtc/modules/audio_coding/main/acm2/rent_a_codec.cc
|
| @@ -187,14 +187,14 @@ rtc::scoped_ptr<AudioEncoder> CreateRedEncoder(AudioEncoder* encoder,
|
| #endif
|
| }
|
|
|
| -rtc::scoped_ptr<AudioEncoder> CreateCngEncoder(
|
| - AudioEncoder* encoder,
|
| - RentACodec::CngConfig cng_config) {
|
| +rtc::scoped_ptr<AudioEncoder> CreateCngEncoder(AudioEncoder* encoder,
|
| + int payload_type,
|
| + ACMVADMode vad_mode) {
|
| AudioEncoderCng::Config config;
|
| config.num_channels = encoder->NumChannels();
|
| - config.payload_type = cng_config.cng_payload_type;
|
| + config.payload_type = payload_type;
|
| config.speech_encoder = encoder;
|
| - switch (cng_config.vad_mode) {
|
| + switch (vad_mode) {
|
| case VADNormal:
|
| config.vad_mode = Vad::kVadNormal;
|
| break;
|
| @@ -239,26 +239,45 @@ AudioEncoder* RentACodec::RentEncoder(const CodecInst& codec_inst) {
|
| return speech_encoder_.get();
|
| }
|
|
|
| -AudioEncoder* RentACodec::RentEncoderStack(
|
| - AudioEncoder* speech_encoder,
|
| - rtc::Optional<CngConfig> cng_config,
|
| - rtc::Optional<int> red_payload_type) {
|
| +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 (cng_config || red_payload_type) {
|
| +
|
| + 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;
|
| + 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 (red_payload_type) {
|
| - red_encoder_ = CreateRedEncoder(encoder_stack_, *red_payload_type);
|
| + if (param->use_red) {
|
| + red_encoder_ = CreateRedEncoder(encoder_stack_, *red_pt);
|
| if (red_encoder_)
|
| encoder_stack_ = red_encoder_.get();
|
| } else {
|
| red_encoder_.reset();
|
| }
|
| - if (cng_config) {
|
| - cng_encoder_ = CreateCngEncoder(encoder_stack_, *cng_config);
|
| + if (param->use_cng) {
|
| + cng_encoder_ = CreateCngEncoder(encoder_stack_, *cng_pt, param->vad_mode);
|
| encoder_stack_ = cng_encoder_.get();
|
| } else {
|
| cng_encoder_.reset();
|
|
|