From 8bb6ea3da9fea6d75e12ed7443819b8f974147fe Mon Sep 17 00:00:00 2001 From: Karl Wiberg Date: Thu, 28 May 2015 13:37:19 +0200 Subject: [PATCH] Reset speech encoder before hooking it up to RED or CNG Commit 7e0c7d49 ("Add support for external encoders in ACM") changed things around so that we no longer recreate the speech encoder when adding CNG or RED to an existing encoder. This isn't correct, since those two expect to be in sync with the speech encoder they work with. Solve the problem by resetting the speech encoder before hooking in RED or CNG. BUG=crbug/490368 R=jmarusic@webrtc.org TBR=henrik.lundin@webrtc.org Review URL: https://webrtc-codereview.appspot.com/53589004 Cr-Commit-Position: refs/heads/master@{#9307} --- webrtc/modules/audio_coding/main/acm2/codec_owner.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc index 5f0671d8b..4d214be24 100644 --- a/webrtc/modules/audio_coding/main/acm2/codec_owner.cc +++ b/webrtc/modules/audio_coding/main/acm2/codec_owner.cc @@ -195,8 +195,14 @@ void CodecOwner::SetEncoders(AudioEncoderMutable* external_speech_encoder, void CodecOwner::ChangeCngAndRed(int cng_payload_type, ACMVADMode vad_mode, int red_payload_type) { + AudioEncoderMutable* 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. + speech_encoder->Reset(); + } AudioEncoder* encoder = - CreateRedEncoder(red_payload_type, SpeechEncoder(), &red_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_;