Index: webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc |
diff --git a/webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc b/webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc |
index 7ef1ce096bd80221c706962c6a0706f052f5e816..1dde49d1ba7d3dc9cfe2c400341571ac63920e97 100644 |
--- a/webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc |
+++ b/webrtc/modules/audio_coding/codecs/red/audio_encoder_copy_red.cc |
@@ -55,13 +55,14 @@ int AudioEncoderCopyRed::GetTargetBitrate() const { |
AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeInternal( |
uint32_t rtp_timestamp, |
rtc::ArrayView<const int16_t> audio, |
- size_t max_encoded_bytes, |
- uint8_t* encoded) { |
+ rtc::Buffer* encoded) { |
+ |
+ const size_t primary_offset = encoded->size(); |
EncodedInfo info = |
- speech_encoder_->Encode(rtp_timestamp, audio, max_encoded_bytes, encoded); |
- RTC_CHECK_GE(max_encoded_bytes, |
- info.encoded_bytes + secondary_info_.encoded_bytes); |
+ speech_encoder_->Encode(rtp_timestamp, audio, encoded); |
+ |
RTC_CHECK(info.redundant.empty()) << "Cannot use nested redundant encoders."; |
+ RTC_DCHECK_EQ(encoded->size() - primary_offset, info.encoded_bytes); |
if (info.encoded_bytes > 0) { |
// |info| will be implicitly cast to an EncodedInfoLeaf struct, effectively |
@@ -70,13 +71,13 @@ AudioEncoder::EncodedInfo AudioEncoderCopyRed::EncodeInternal( |
info.redundant.push_back(info); |
RTC_DCHECK_EQ(info.redundant.size(), 1u); |
if (secondary_info_.encoded_bytes > 0) { |
- memcpy(&encoded[info.encoded_bytes], secondary_encoded_.data(), |
- secondary_info_.encoded_bytes); |
+ encoded->AppendData(secondary_encoded_); |
info.redundant.push_back(secondary_info_); |
RTC_DCHECK_EQ(info.redundant.size(), 2u); |
} |
// Save primary to secondary. |
- secondary_encoded_.SetData(encoded, info.encoded_bytes); |
+ secondary_encoded_.SetData(encoded->data() + primary_offset, |
+ info.encoded_bytes); |
secondary_info_ = info; |
RTC_DCHECK_EQ(info.speech, info.redundant[0].speech); |
} |