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 279616e080e7e98b6522059bad5a05d271fb7371..171198b9a39eeee9beb2030d96dadabfd6e4b037 100644 |
--- a/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
+++ b/webrtc/modules/audio_coding/codecs/cng/audio_encoder_cng.cc |
@@ -19,18 +19,19 @@ namespace { |
const int kMaxFrameSizeMs = 60; |
-} // namespace |
- |
-AudioEncoderCng::Config::Config() |
- : num_channels(1), |
- payload_type(13), |
- speech_encoder(NULL), |
- vad_mode(Vad::kVadNormal), |
- sid_frame_interval_ms(100), |
- num_cng_coefficients(8), |
- vad(NULL) { |
+rtc::scoped_ptr<CNG_enc_inst, CngInstDeleter> CreateCngInst( |
+ int sample_rate_hz, |
+ int sid_frame_interval_ms, |
+ int num_cng_coefficients) { |
+ rtc::scoped_ptr<CNG_enc_inst, CngInstDeleter> cng_inst; |
+ CHECK_EQ(0, WebRtcCng_CreateEnc(cng_inst.accept())); |
+ CHECK_EQ(0, WebRtcCng_InitEnc(cng_inst.get(), sample_rate_hz, |
+ sid_frame_interval_ms, num_cng_coefficients)); |
+ return cng_inst; |
} |
+} // namespace |
+ |
bool AudioEncoderCng::Config::IsOk() const { |
if (num_channels != 1) |
return false; |
@@ -51,43 +52,33 @@ AudioEncoderCng::AudioEncoderCng(const Config& config) |
: speech_encoder_(config.speech_encoder), |
cng_payload_type_(config.payload_type), |
num_cng_coefficients_(config.num_cng_coefficients), |
+ sid_frame_interval_ms_(config.sid_frame_interval_ms), |
last_frame_active_(true), |
- vad_(new Vad(config.vad_mode)) { |
- if (config.vad) { |
- // Replace default Vad object with user-provided one. |
- vad_.reset(config.vad); |
- } |
+ vad_(config.vad ? config.vad : new Vad(config.vad_mode)) { |
CHECK(config.IsOk()) << "Invalid configuration."; |
- CNG_enc_inst* cng_inst; |
- CHECK_EQ(WebRtcCng_CreateEnc(&cng_inst), 0) << "WebRtcCng_CreateEnc failed."; |
- cng_inst_.reset(cng_inst); // Transfer ownership to scoped_ptr. |
- CHECK_EQ(WebRtcCng_InitEnc(cng_inst_.get(), SampleRateHz(), |
- config.sid_frame_interval_ms, |
- config.num_cng_coefficients), |
- 0) |
- << "WebRtcCng_InitEnc failed"; |
+ cng_inst_ = CreateCngInst(SampleRateHz(), sid_frame_interval_ms_, |
+ num_cng_coefficients_); |
} |
-AudioEncoderCng::~AudioEncoderCng() { |
+AudioEncoderCng::~AudioEncoderCng() = default; |
+ |
+size_t AudioEncoderCng::MaxEncodedBytes() const { |
+ const size_t max_encoded_bytes_active = speech_encoder_->MaxEncodedBytes(); |
+ const size_t max_encoded_bytes_passive = |
+ rtc::CheckedDivExact(kMaxFrameSizeMs, 10) * SamplesPer10msFrame(); |
+ return std::max(max_encoded_bytes_active, max_encoded_bytes_passive); |
} |
int AudioEncoderCng::SampleRateHz() const { |
return speech_encoder_->SampleRateHz(); |
} |
-int AudioEncoderCng::RtpTimestampRateHz() const { |
- return speech_encoder_->RtpTimestampRateHz(); |
-} |
- |
int AudioEncoderCng::NumChannels() const { |
return 1; |
} |
-size_t AudioEncoderCng::MaxEncodedBytes() const { |
- const size_t max_encoded_bytes_active = speech_encoder_->MaxEncodedBytes(); |
- const size_t max_encoded_bytes_passive = |
- rtc::CheckedDivExact(kMaxFrameSizeMs, 10) * SamplesPer10msFrame(); |
- return std::max(max_encoded_bytes_active, max_encoded_bytes_passive); |
+int AudioEncoderCng::RtpTimestampRateHz() const { |
+ return speech_encoder_->RtpTimestampRateHz(); |
} |
size_t AudioEncoderCng::Num10MsFramesInNextPacket() const { |
@@ -102,16 +93,6 @@ int AudioEncoderCng::GetTargetBitrate() const { |
return speech_encoder_->GetTargetBitrate(); |
} |
-void AudioEncoderCng::SetTargetBitrate(int bits_per_second) { |
- speech_encoder_->SetTargetBitrate(bits_per_second); |
-} |
- |
-void AudioEncoderCng::SetProjectedPacketLossRate(double fraction) { |
- DCHECK_GE(fraction, 0.0); |
- DCHECK_LE(fraction, 1.0); |
- speech_encoder_->SetProjectedPacketLossRate(fraction); |
-} |
- |
AudioEncoder::EncodedInfo AudioEncoderCng::EncodeInternal( |
uint32_t rtp_timestamp, |
const int16_t* audio, |
@@ -183,6 +164,48 @@ AudioEncoder::EncodedInfo AudioEncoderCng::EncodeInternal( |
return info; |
} |
+void AudioEncoderCng::Reset() { |
+ speech_encoder_->Reset(); |
+ speech_buffer_.clear(); |
+ rtp_timestamps_.clear(); |
+ last_frame_active_ = true; |
+ vad_->Reset(); |
+ cng_inst_ = CreateCngInst(SampleRateHz(), sid_frame_interval_ms_, |
+ num_cng_coefficients_); |
+} |
+ |
+bool AudioEncoderCng::SetFec(bool enable) { |
+ return speech_encoder_->SetFec(enable); |
+} |
+ |
+bool AudioEncoderCng::SetDtx(bool enable) { |
+ return speech_encoder_->SetDtx(enable); |
+} |
+ |
+bool AudioEncoderCng::SetApplication(Application application) { |
+ return speech_encoder_->SetApplication(application); |
+} |
+ |
+bool AudioEncoderCng::SetMaxPlaybackRate(int frequency_hz) { |
+ return speech_encoder_->SetMaxPlaybackRate(frequency_hz); |
+} |
+ |
+void AudioEncoderCng::SetProjectedPacketLossRate(double fraction) { |
+ speech_encoder_->SetProjectedPacketLossRate(fraction); |
+} |
+ |
+void AudioEncoderCng::SetTargetBitrate(int bits_per_second) { |
+ speech_encoder_->SetTargetBitrate(bits_per_second); |
+} |
+ |
+void AudioEncoderCng::SetMaxBitrate(int max_bps) { |
+ speech_encoder_->SetMaxBitrate(max_bps); |
+} |
+ |
+void AudioEncoderCng::SetMaxPayloadSize(int max_payload_size_bytes) { |
+ speech_encoder_->SetMaxPayloadSize(max_payload_size_bytes); |
+} |
+ |
AudioEncoder::EncodedInfo AudioEncoderCng::EncodePassive( |
size_t frames_to_encode, |
size_t max_encoded_bytes, |