diff --git a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h index 095bb7b313..91353d973f 100644 --- a/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h +++ b/webrtc/modules/audio_coding/codecs/isac/audio_encoder_isac_t_impl.h @@ -23,7 +23,6 @@ namespace webrtc { const int kIsacPayloadType = 103; const int kInvalidPayloadType = -1; -const int kDefaultBitRate = 32000; template AudioEncoderDecoderIsacT::Config::Config() @@ -31,7 +30,7 @@ AudioEncoderDecoderIsacT::Config::Config() red_payload_type(kInvalidPayloadType), sample_rate_hz(16000), frame_size_ms(30), - bit_rate(kDefaultBitRate), + bit_rate(32000), max_bit_rate(-1), max_payload_size_bytes(-1) { } @@ -49,7 +48,7 @@ bool AudioEncoderDecoderIsacT::Config::IsOk() const { if (max_payload_size_bytes > 400) return false; return (frame_size_ms == 30 || frame_size_ms == 60) && - ((bit_rate >= 10000 && bit_rate <= 32000) || bit_rate == 0); + bit_rate >= 10000 && bit_rate <= 32000; case 32000: case 48000: if (max_bit_rate > 160000) @@ -57,8 +56,7 @@ bool AudioEncoderDecoderIsacT::Config::IsOk() const { if (max_payload_size_bytes > 600) return false; return T::has_swb && - (frame_size_ms == 30 && - ((bit_rate >= 10000 && bit_rate <= 56000) || bit_rate == 0)); + (frame_size_ms == 30 && bit_rate >= 10000 && bit_rate <= 56000); default: return false; } @@ -70,7 +68,7 @@ AudioEncoderDecoderIsacT::ConfigAdaptive::ConfigAdaptive() red_payload_type(kInvalidPayloadType), sample_rate_hz(16000), initial_frame_size_ms(30), - initial_bit_rate(kDefaultBitRate), + initial_bit_rate(32000), max_bit_rate(-1), enforce_frame_size(false), max_payload_size_bytes(-1) { @@ -116,9 +114,7 @@ AudioEncoderDecoderIsacT::AudioEncoderDecoderIsacT(const Config& config) CHECK_EQ(0, T::Create(&isac_state_)); CHECK_EQ(0, T::EncoderInit(isac_state_, 1)); CHECK_EQ(0, T::SetEncSampRate(isac_state_, config.sample_rate_hz)); - CHECK_EQ(0, T::Control(isac_state_, config.bit_rate == 0 ? kDefaultBitRate - : config.bit_rate, - config.frame_size_ms)); + CHECK_EQ(0, T::Control(isac_state_, config.bit_rate, config.frame_size_ms)); // When config.sample_rate_hz is set to 48000 Hz (iSAC-fb), the decoder is // still set to 32000 Hz, since there is no full-band mode in the decoder. CHECK_EQ(0, T::SetDecSampRate(isac_state_, diff --git a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc index 5f6bcb5e81..08926558b7 100644 --- a/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc +++ b/webrtc/modules/audio_coding/main/acm2/acm_codec_database.cc @@ -575,9 +575,7 @@ ACMGenericCodec* ACMCodecDB::CreateCodecInstance(const CodecInst& codec_inst, // All we have support for right now. if (!STR_CASE_CMP(codec_inst.plname, "ISAC")) { #if (defined(WEBRTC_CODEC_ISAC) || defined(WEBRTC_CODEC_ISACFX)) - return new ACMGenericCodecWrapper(codec_inst, cng_pt_nb, cng_pt_wb, - cng_pt_swb, cng_pt_fb, enable_red, - red_payload_type); + return new ACMISAC(kISAC, enable_red); #endif } else if (!STR_CASE_CMP(codec_inst.plname, "PCMU") || !STR_CASE_CMP(codec_inst.plname, "PCMA")) { diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc index 8d0f3181d1..fc1191a45f 100644 --- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc +++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_impl.cc @@ -270,6 +270,7 @@ int32_t AudioCodingModuleImpl::Process() { FrameType frame_type = kAudioFrameSpeech; uint8_t current_payload_type = 0; bool has_data_to_send = false; + bool red_active = false; RTPFragmentationHeader my_fragmentation; // Keep the scope of the ACM critical section limited. @@ -301,32 +302,36 @@ int32_t AudioCodingModuleImpl::Process() { } case kActiveNormalEncoded: case kPassiveNormalEncoded: { + current_payload_type = static_cast(send_codec_inst_.pltype); frame_type = kAudioFrameSpeech; break; } case kPassiveDTXNB: { + current_payload_type = cng_nb_pltype_; frame_type = kAudioFrameCN; is_first_red_ = true; break; } case kPassiveDTXWB: { + current_payload_type = cng_wb_pltype_; frame_type = kAudioFrameCN; is_first_red_ = true; break; } case kPassiveDTXSWB: { + current_payload_type = cng_swb_pltype_; frame_type = kAudioFrameCN; is_first_red_ = true; break; } case kPassiveDTXFB: { + current_payload_type = cng_fb_pltype_; frame_type = kAudioFrameCN; is_first_red_ = true; break; } } has_data_to_send = true; - current_payload_type = encoded_info.payload_type; previous_pltype_ = current_payload_type; ConvertEncodedInfoToFragmentationHeader(encoded_info, &my_fragmentation); @@ -343,9 +348,8 @@ int32_t AudioCodingModuleImpl::Process() { // have been switched to the new AudioEncoder interface. if ((codecs_[current_send_codec_idx_]->ExternalRedNeeded()) && ((encoding_type == kActiveNormalEncoded) || - (encoding_type == kPassiveNormalEncoded))) { + (encoding_type == kPassiveNormalEncoded))) { DCHECK(encoded_info.redundant.empty()); - FATAL() << "Don't go here!"; // RED is enabled within this scope. // // Note that, a special solution exists for iSAC since it is the only @@ -385,6 +389,7 @@ int32_t AudioCodingModuleImpl::Process() { // // Hence, even if every second packet is dropped, perfect // reconstruction is possible. + red_active = true; has_data_to_send = false; // Skip the following part for the first packet in a RED session. @@ -452,7 +457,7 @@ int32_t AudioCodingModuleImpl::Process() { CriticalSectionScoped lock(callback_crit_sect_); if (packetization_callback_ != NULL) { - if (my_fragmentation.fragmentationVectorSize > 0) { + if (red_active || my_fragmentation.fragmentationVectorSize > 0) { // Callback with payload data, including redundant data (RED). packetization_callback_->SendData(frame_type, current_payload_type, rtp_timestamp, stream, length_bytes, diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc index 5185c1209a..4ee53391e7 100644 --- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc +++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest.cc @@ -809,14 +809,15 @@ TEST_F(AcmSenderBitExactness, DISABLED_ON_ANDROID(IsacSwb30ms)) { ASSERT_NO_FATAL_FAILURE( SetUpTest(acm2::ACMCodecDB::kISACSWB, 1, 104, 960, 960)); Run(AcmReceiverBitExactness::PlatformChecksum( - "2b3c387d06f00b7b7aad4c9be56fb83d", + "98d960600eb4ddb3fcbe11f5057ddfd7", "", - "5683b58da0fbf2063c7adc2e6bfb3fb8"), + "2f6dfe142f735f1d96f6bd86d2526f42"), AcmReceiverBitExactness::PlatformChecksum( - "bcc2041e7744c7ebd9f701866856849c", + "cc9d2d86a71d6f99f97680a5c27e2762", "", - "ce86106a93419aefb063097108ec94ab"), - 33, test::AcmReceiveTest::kMonoOutput); + "7b214fc3a5e33d68bf30e77969371f31"), + 33, + test::AcmReceiveTest::kMonoOutput); } TEST_F(AcmSenderBitExactness, Pcm16_8000khz_10ms) { diff --git a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc index f27b4cf199..30bb565cb5 100644 --- a/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc +++ b/webrtc/modules/audio_coding/main/acm2/audio_coding_module_unittest_oldapi.cc @@ -960,14 +960,15 @@ TEST_F(AcmSenderBitExactnessOldApi, MAYBE_IsacWb60ms) { TEST_F(AcmSenderBitExactnessOldApi, DISABLED_ON_ANDROID(IsacSwb30ms)) { ASSERT_NO_FATAL_FAILURE(SetUpTest("ISAC", 32000, 1, 104, 960, 960)); Run(AcmReceiverBitExactnessOldApi::PlatformChecksum( - "2b3c387d06f00b7b7aad4c9be56fb83d", + "98d960600eb4ddb3fcbe11f5057ddfd7", "", - "5683b58da0fbf2063c7adc2e6bfb3fb8"), + "2f6dfe142f735f1d96f6bd86d2526f42"), AcmReceiverBitExactnessOldApi::PlatformChecksum( - "bcc2041e7744c7ebd9f701866856849c", + "cc9d2d86a71d6f99f97680a5c27e2762", "", - "ce86106a93419aefb063097108ec94ab"), - 33, test::AcmReceiveTestOldApi::kMonoOutput); + "7b214fc3a5e33d68bf30e77969371f31"), + 33, + test::AcmReceiveTestOldApi::kMonoOutput); } TEST_F(AcmSenderBitExactnessOldApi, Pcm16_8000khz_10ms) {