| 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 04b635d8ca59b7a71b101234297d41dfe4da1513..09c25d9616c4d5fa805f184ff973a842f2c824d2 100644
|
| --- a/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
|
| +++ b/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc
|
| @@ -21,19 +21,6 @@ namespace {
|
|
|
| const int kMaxFrameSizeMs = 60;
|
|
|
| -std::unique_ptr<CNG_enc_inst, CngInstDeleter> CreateCngInst(
|
| - int sample_rate_hz,
|
| - int sid_frame_interval_ms,
|
| - int num_cng_coefficients) {
|
| - CNG_enc_inst* ci;
|
| - RTC_CHECK_EQ(0, WebRtcCng_CreateEnc(&ci));
|
| - std::unique_ptr<CNG_enc_inst, CngInstDeleter> cng_inst(ci);
|
| - RTC_CHECK_EQ(0,
|
| - WebRtcCng_InitEnc(cng_inst.get(), sample_rate_hz,
|
| - sid_frame_interval_ms, num_cng_coefficients));
|
| - return cng_inst;
|
| -}
|
| -
|
| } // namespace
|
|
|
| AudioEncoderCng::Config::Config() = default;
|
| @@ -65,9 +52,10 @@ AudioEncoderCng::AudioEncoderCng(Config&& config)
|
| sid_frame_interval_ms_(config.sid_frame_interval_ms),
|
| last_frame_active_(true),
|
| vad_(config.vad ? std::unique_ptr<Vad>(config.vad)
|
| - : CreateVad(config.vad_mode)) {
|
| - cng_inst_ = CreateCngInst(SampleRateHz(), sid_frame_interval_ms_,
|
| - num_cng_coefficients_);
|
| + : CreateVad(config.vad_mode)),
|
| + cng_encoder_(new ComfortNoiseEncoder(SampleRateHz(),
|
| + sid_frame_interval_ms_,
|
| + num_cng_coefficients_)) {
|
| }
|
|
|
| AudioEncoderCng::~AudioEncoderCng() = default;
|
| @@ -170,8 +158,9 @@ void AudioEncoderCng::Reset() {
|
| rtp_timestamps_.clear();
|
| last_frame_active_ = true;
|
| vad_->Reset();
|
| - cng_inst_ = CreateCngInst(SampleRateHz(), sid_frame_interval_ms_,
|
| - num_cng_coefficients_);
|
| + cng_encoder_.reset(
|
| + new ComfortNoiseEncoder(SampleRateHz(), sid_frame_interval_ms_,
|
| + num_cng_coefficients_));
|
| }
|
|
|
| bool AudioEncoderCng::SetFec(bool enable) {
|
| @@ -204,32 +193,27 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodePassive(
|
| bool force_sid = last_frame_active_;
|
| bool output_produced = false;
|
| const size_t samples_per_10ms_frame = SamplesPer10msFrame();
|
| - const size_t bytes_to_encode = frames_to_encode * samples_per_10ms_frame;
|
| AudioEncoder::EncodedInfo info;
|
|
|
| - encoded->AppendData(bytes_to_encode, [&] (rtc::ArrayView<uint8_t> encoded) {
|
| - 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;
|
| - });
|
| + 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 =
|
| + cng_encoder_->Encode(
|
| + rtc::ArrayView<const int16_t>(
|
| + &speech_buffer_[i * samples_per_10ms_frame],
|
| + samples_per_10ms_frame),
|
| + force_sid, encoded);
|
| +
|
| + if (encoded_bytes_tmp > 0) {
|
| + RTC_CHECK(!output_produced);
|
| + info.encoded_bytes = encoded_bytes_tmp;
|
| + output_produced = true;
|
| + force_sid = false;
|
| + }
|
| + }
|
|
|
| info.encoded_timestamp = rtp_timestamps_.front();
|
| info.payload_type = cng_payload_type_;
|
|
|