Chromium Code Reviews| Index: webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| diff --git a/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc b/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| index 464655c511d349bb5bd2c74c21a15386c607059c..ab699cae79d6e1062c26e2948f1035f78613cda8 100644 |
| --- a/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| +++ b/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
| @@ -100,10 +100,7 @@ int AudioEncoderCng::GetTargetBitrate() const { |
| AudioEncoder::EncodedInfo AudioEncoderCng::EncodeInternal( |
| uint32_t rtp_timestamp, |
| rtc::ArrayView<const int16_t> audio, |
| - size_t max_encoded_bytes, |
| - uint8_t* encoded) { |
| - RTC_CHECK_GE(max_encoded_bytes, |
| - static_cast<size_t>(num_cng_coefficients_ + 1)); |
| + rtc::Buffer* encoded) { |
| const size_t samples_per_10ms_frame = SamplesPer10msFrame(); |
| RTC_CHECK_EQ(speech_buffer_.size(), |
| rtp_timestamps_.size() * samples_per_10ms_frame); |
| @@ -145,12 +142,12 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodeInternal( |
| EncodedInfo info; |
| switch (activity) { |
| case Vad::kPassive: { |
| - info = EncodePassive(frames_to_encode, max_encoded_bytes, encoded); |
| + info = EncodePassive(frames_to_encode, encoded); |
| last_frame_active_ = false; |
| break; |
| } |
| case Vad::kActive: { |
| - info = EncodeActive(frames_to_encode, max_encoded_bytes, encoded); |
| + info = EncodeActive(frames_to_encode, encoded); |
| last_frame_active_ = true; |
| break; |
| } |
| @@ -204,31 +201,37 @@ void AudioEncoderCng::SetTargetBitrate(int bits_per_second) { |
| AudioEncoder::EncodedInfo AudioEncoderCng::EncodePassive( |
| size_t frames_to_encode, |
| - size_t max_encoded_bytes, |
| - uint8_t* encoded) { |
| + rtc::Buffer* encoded) { |
| bool force_sid = last_frame_active_; |
| bool output_produced = false; |
| const size_t samples_per_10ms_frame = SamplesPer10msFrame(); |
| - RTC_CHECK_GE(max_encoded_bytes, frames_to_encode * samples_per_10ms_frame); |
| + const size_t bytes_to_encode = frames_to_encode * samples_per_10ms_frame; |
| AudioEncoder::EncodedInfo info; |
| - for (size_t i = 0; i < frames_to_encode; ++i) { |
| - // It's important not to pass &info.encoded_bytes directly to |
| - // WebRtcCng_Encode(), since later loop iterations may return zero in that |
| - // value, in which case we don't want to overwrite any value from an earlier |
| - // iteration. |
| - size_t encoded_bytes_tmp = 0; |
| - RTC_CHECK_GE(WebRtcCng_Encode(cng_inst_.get(), |
| - &speech_buffer_[i * samples_per_10ms_frame], |
| - samples_per_10ms_frame, encoded, |
| - &encoded_bytes_tmp, force_sid), |
| - 0); |
| - if (encoded_bytes_tmp > 0) { |
| - RTC_CHECK(!output_produced); |
| - info.encoded_bytes = encoded_bytes_tmp; |
| - output_produced = true; |
| - force_sid = false; |
| - } |
| - } |
| + |
| + encoded->AppendData(bytes_to_encode, [&] (rtc::ArrayView<uint8_t> encoded) { |
|
The Sun (google.com)
2016/03/01 21:06:15
FYI: Chromium C++11 style guide says to not use de
ossu
2016/03/02 08:39:42
Well yes, and no. It says don't use it, referring
kwiberg-webrtc
2016/03/02 09:40:24
Yes. The Google style guide used to blanket ban de
|
| + for (size_t i = 0; i < frames_to_encode; ++i) { |
| + // It's important not to pass &info.encoded_bytes directly to |
| + // WebRtcCng_Encode(), since later loop iterations may return zero in |
| + // that value, in which case we don't want to overwrite any value from |
| + // an earlier iteration. |
| + size_t encoded_bytes_tmp = 0; |
| + RTC_CHECK_GE( |
| + WebRtcCng_Encode(cng_inst_.get(), |
| + &speech_buffer_[i * samples_per_10ms_frame], |
| + samples_per_10ms_frame, encoded.data(), |
| + &encoded_bytes_tmp, force_sid), |
| + 0); |
| + if (encoded_bytes_tmp > 0) { |
| + RTC_CHECK(!output_produced); |
| + info.encoded_bytes = encoded_bytes_tmp; |
| + output_produced = true; |
| + force_sid = false; |
| + } |
| + } |
| + |
| + return info.encoded_bytes; |
| + }); |
| + |
| info.encoded_timestamp = rtp_timestamps_.front(); |
| info.payload_type = cng_payload_type_; |
| info.send_even_if_empty = true; |
| @@ -238,8 +241,7 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodePassive( |
| AudioEncoder::EncodedInfo AudioEncoderCng::EncodeActive( |
| size_t frames_to_encode, |
| - size_t max_encoded_bytes, |
| - uint8_t* encoded) { |
| + rtc::Buffer* encoded) { |
| const size_t samples_per_10ms_frame = SamplesPer10msFrame(); |
| AudioEncoder::EncodedInfo info; |
| for (size_t i = 0; i < frames_to_encode; ++i) { |
| @@ -248,7 +250,7 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodeActive( |
| rtc::ArrayView<const int16_t>( |
| &speech_buffer_[i * samples_per_10ms_frame], |
| samples_per_10ms_frame), |
| - max_encoded_bytes, encoded); |
| + encoded); |
| if (i + 1 == frames_to_encode) { |
| RTC_CHECK_GT(info.encoded_bytes, 0u) << "Encoder didn't deliver data."; |
| } else { |