Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(226)

Unified Diff: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc

Issue 2947563002: Revert of Opus implementation of the AudioEncoderFactoryTemplate API (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
diff --git a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
index a4ae2ca6d5983e6ae939cbe9113e2c609578dde9..be32aef152e80e05feed810d415f5718ca04a869 100644
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc
@@ -47,6 +47,11 @@
constexpr int kOpusBitrateNbBps = 12000;
constexpr int kOpusBitrateWbBps = 20000;
constexpr int kOpusBitrateFbBps = 32000;
+
+// Opus API allows a min bitrate of 500bps, but Opus documentation suggests
+// bitrate should be in the range of 6000 to 510000, inclusive.
+constexpr int kOpusMinBitrateBps = 6000;
+constexpr int kOpusMaxBitrateBps = 510000;
constexpr int kSampleRateHz = 48000;
constexpr int kDefaultMaxPlaybackRate = 48000;
@@ -128,8 +133,8 @@
return kOpusBitrateFbBps * rtc::dchecked_cast<int>(num_channels);
}
}();
- RTC_DCHECK_GE(bitrate, AudioEncoderOpusConfig::kMinBitrateBps);
- RTC_DCHECK_LE(bitrate, AudioEncoderOpusConfig::kMaxBitrateBps);
+ RTC_DCHECK_GE(bitrate, kOpusMinBitrateBps);
+ RTC_DCHECK_LE(bitrate, kOpusMaxBitrateBps);
return bitrate;
}
@@ -145,8 +150,7 @@
const auto bitrate = rtc::StringToNumber<int>(*bitrate_param);
if (bitrate) {
const int chosen_bitrate =
- std::max(AudioEncoderOpusConfig::kMinBitrateBps,
- std::min(*bitrate, AudioEncoderOpusConfig::kMaxBitrateBps));
+ std::max(kOpusMinBitrateBps, std::min(*bitrate, kOpusMaxBitrateBps));
if (bitrate != chosen_bitrate) {
LOG(LS_WARNING) << "Invalid maxaveragebitrate " << *bitrate
<< " clamped to " << chosen_bitrate;
@@ -191,7 +195,7 @@
return *(std::end(kOpusSupportedFrameLengths) - 1);
}
- return AudioEncoderOpusConfig::kDefaultFrameSizeMs;
+ return AudioEncoderOpus::Config::kDefaultFrameSizeMs;
}
void FindSupportedFrameLengths(int min_frame_length_ms,
@@ -207,14 +211,9 @@
RTC_DCHECK(std::is_sorted(out->begin(), out->end()));
}
-int GetBitrateBps(const AudioEncoderOpusConfig& config) {
- RTC_DCHECK(config.IsOk());
- return config.bitrate_bps;
-}
-
} // namespace
-rtc::Optional<AudioCodecInfo> AudioEncoderOpusImpl::QueryAudioEncoder(
+rtc::Optional<AudioCodecInfo> AudioEncoderOpus::QueryAudioEncoder(
const SdpAudioFormat& format) {
if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 &&
format.clockrate_hz == 48000 && format.num_channels == 2) {
@@ -222,9 +221,8 @@
const int bitrate =
CalculateBitrate(GetMaxPlaybackRate(format), num_channels,
GetFormatParameter(format, "maxaveragebitrate"));
- AudioCodecInfo info(48000, num_channels, bitrate,
- AudioEncoderOpusConfig::kMinBitrateBps,
- AudioEncoderOpusConfig::kMaxBitrateBps);
+ AudioCodecInfo info(48000, num_channels, bitrate, kOpusMinBitrateBps,
+ kOpusMaxBitrateBps);
info.allow_comfort_noise = false;
info.supports_network_adaption = true;
@@ -233,44 +231,46 @@
return rtc::Optional<AudioCodecInfo>();
}
-AudioEncoderOpusConfig AudioEncoderOpusImpl::CreateConfig(
+AudioEncoderOpus::Config AudioEncoderOpus::CreateConfig(
const CodecInst& codec_inst) {
- AudioEncoderOpusConfig config;
+ AudioEncoderOpus::Config config;
config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
config.num_channels = codec_inst.channels;
- config.bitrate_bps = codec_inst.rate;
- config.application = config.num_channels == 1
- ? AudioEncoderOpusConfig::ApplicationMode::kVoip
- : AudioEncoderOpusConfig::ApplicationMode::kAudio;
+ config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
+ config.payload_type = codec_inst.pltype;
+ config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
+ : AudioEncoderOpus::kAudio;
config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
+#if WEBRTC_OPUS_VARIABLE_COMPLEXITY
+ config.low_rate_complexity = 9;
+#endif
return config;
}
-rtc::Optional<AudioEncoderOpusConfig> AudioEncoderOpusImpl::SdpToConfig(
+AudioEncoderOpus::Config AudioEncoderOpus::CreateConfig(
+ int payload_type,
const SdpAudioFormat& format) {
- if (STR_CASE_CMP(format.name.c_str(), "opus") != 0 ||
- format.clockrate_hz != 48000 || format.num_channels != 2) {
- return rtc::Optional<AudioEncoderOpusConfig>();
- }
-
- AudioEncoderOpusConfig config;
+ AudioEncoderOpus::Config config;
+
config.num_channels = GetChannelCount(format);
config.frame_size_ms = GetFrameSizeMs(format);
config.max_playback_rate_hz = GetMaxPlaybackRate(format);
config.fec_enabled = (GetFormatParameter(format, "useinbandfec") == "1");
config.dtx_enabled = (GetFormatParameter(format, "usedtx") == "1");
config.cbr_enabled = (GetFormatParameter(format, "cbr") == "1");
- config.bitrate_bps =
+ config.bitrate_bps = rtc::Optional<int>(
CalculateBitrate(config.max_playback_rate_hz, config.num_channels,
- GetFormatParameter(format, "maxaveragebitrate"));
- config.application = config.num_channels == 1
- ? AudioEncoderOpusConfig::ApplicationMode::kVoip
- : AudioEncoderOpusConfig::ApplicationMode::kAudio;
+ GetFormatParameter(format, "maxaveragebitrate")));
+ config.payload_type = payload_type;
+ config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
+ : AudioEncoderOpus::kAudio;
+#if WEBRTC_OPUS_VARIABLE_COMPLEXITY
+ config.low_rate_complexity = 9;
+#endif
constexpr int kMinANAFrameLength = kANASupportedFrameLengths[0];
constexpr int kMaxANAFrameLength =
kANASupportedFrameLengths[arraysize(kANASupportedFrameLengths) - 1];
-
// For now, minptime and maxptime are only used with ANA. If ptime is outside
// of this range, it will get adjusted once ANA takes hold. Ideally, we'd know
// if ANA was to be used when setting up the config, and adjust accordingly.
@@ -281,28 +281,10 @@
FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms,
&config.supported_frame_lengths_ms);
- RTC_DCHECK(config.IsOk());
- return rtc::Optional<AudioEncoderOpusConfig>(config);
-}
-
-rtc::Optional<int> AudioEncoderOpusImpl::GetNewComplexity(
- const AudioEncoderOpusConfig& config) {
- RTC_DCHECK(config.IsOk());
- const int bitrate_bps = GetBitrateBps(config);
- if (bitrate_bps >= config.complexity_threshold_bps -
- config.complexity_threshold_window_bps &&
- bitrate_bps <= config.complexity_threshold_bps +
- config.complexity_threshold_window_bps) {
- // Within the hysteresis window; make no change.
- return rtc::Optional<int>();
- } else {
- return rtc::Optional<int>(bitrate_bps <= config.complexity_threshold_bps
- ? config.low_rate_complexity
- : config.complexity);
- }
-}
-
-class AudioEncoderOpusImpl::PacketLossFractionSmoother {
+ return config;
+}
+
+class AudioEncoderOpus::PacketLossFractionSmoother {
public:
explicit PacketLossFractionSmoother()
: last_sample_time_ms_(rtc::TimeMillis()),
@@ -329,13 +311,58 @@
rtc::ExpFilter smoother_;
};
-AudioEncoderOpusImpl::AudioEncoderOpusImpl(
- const AudioEncoderOpusConfig& config,
- int payload_type,
+AudioEncoderOpus::Config::Config() {
+#if WEBRTC_OPUS_VARIABLE_COMPLEXITY
+ low_rate_complexity = 9;
+#endif
+}
+AudioEncoderOpus::Config::Config(const Config&) = default;
+AudioEncoderOpus::Config::~Config() = default;
+auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default;
+
+bool AudioEncoderOpus::Config::IsOk() const {
+ if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
+ return false;
+ if (num_channels != 1 && num_channels != 2)
+ return false;
+ if (bitrate_bps &&
+ (*bitrate_bps < kOpusMinBitrateBps || *bitrate_bps > kOpusMaxBitrateBps))
+ return false;
+ if (complexity < 0 || complexity > 10)
+ return false;
+ if (low_rate_complexity < 0 || low_rate_complexity > 10)
+ return false;
+ return true;
+}
+
+int AudioEncoderOpus::Config::GetBitrateBps() const {
+ RTC_DCHECK(IsOk());
+ if (bitrate_bps)
+ return *bitrate_bps; // Explicitly set value.
+ else
+ return num_channels == 1 ? 32000 : 64000; // Default value.
+}
+
+rtc::Optional<int> AudioEncoderOpus::Config::GetNewComplexity() const {
+ RTC_DCHECK(IsOk());
+ const int bitrate_bps = GetBitrateBps();
+ if (bitrate_bps >=
+ complexity_threshold_bps - complexity_threshold_window_bps &&
+ bitrate_bps <=
+ complexity_threshold_bps + complexity_threshold_window_bps) {
+ // Within the hysteresis window; make no change.
+ return rtc::Optional<int>();
+ }
+ return bitrate_bps <= complexity_threshold_bps
+ ? rtc::Optional<int>(low_rate_complexity)
+ : rtc::Optional<int>(complexity);
+}
+
+AudioEncoderOpus::AudioEncoderOpus(
+ const Config& config,
AudioNetworkAdaptorCreator&& audio_network_adaptor_creator,
std::unique_ptr<SmoothingFilter> bitrate_smoother)
- : payload_type_(payload_type),
- send_side_bwe_with_overhead_(webrtc::field_trial::IsEnabled(
+ : send_side_bwe_with_overhead_(webrtc::field_trial::IsEnabled(
"WebRTC-SendSideBwe-WithOverhead")),
packet_loss_rate_(0.0),
inst_(nullptr),
@@ -355,42 +382,42 @@
RTC_CHECK(RecreateEncoderInstance(config));
}
-AudioEncoderOpusImpl::AudioEncoderOpusImpl(const CodecInst& codec_inst)
- : AudioEncoderOpusImpl(CreateConfig(codec_inst), codec_inst.pltype) {}
-
-AudioEncoderOpusImpl::AudioEncoderOpusImpl(int payload_type,
- const SdpAudioFormat& format)
- : AudioEncoderOpusImpl(*SdpToConfig(format), payload_type) {}
-
-AudioEncoderOpusImpl::~AudioEncoderOpusImpl() {
+AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
+ : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {}
+
+AudioEncoderOpus::AudioEncoderOpus(int payload_type,
+ const SdpAudioFormat& format)
+ : AudioEncoderOpus(CreateConfig(payload_type, format), nullptr) {}
+
+AudioEncoderOpus::~AudioEncoderOpus() {
RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
}
-int AudioEncoderOpusImpl::SampleRateHz() const {
+int AudioEncoderOpus::SampleRateHz() const {
return kSampleRateHz;
}
-size_t AudioEncoderOpusImpl::NumChannels() const {
+size_t AudioEncoderOpus::NumChannels() const {
return config_.num_channels;
}
-size_t AudioEncoderOpusImpl::Num10MsFramesInNextPacket() const {
+size_t AudioEncoderOpus::Num10MsFramesInNextPacket() const {
return Num10msFramesPerPacket();
}
-size_t AudioEncoderOpusImpl::Max10MsFramesInAPacket() const {
+size_t AudioEncoderOpus::Max10MsFramesInAPacket() const {
return Num10msFramesPerPacket();
}
-int AudioEncoderOpusImpl::GetTargetBitrate() const {
- return GetBitrateBps(config_);
-}
-
-void AudioEncoderOpusImpl::Reset() {
+int AudioEncoderOpus::GetTargetBitrate() const {
+ return config_.GetBitrateBps();
+}
+
+void AudioEncoderOpus::Reset() {
RTC_CHECK(RecreateEncoderInstance(config_));
}
-bool AudioEncoderOpusImpl::SetFec(bool enable) {
+bool AudioEncoderOpus::SetFec(bool enable) {
if (enable) {
RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
} else {
@@ -400,7 +427,7 @@
return true;
}
-bool AudioEncoderOpusImpl::SetDtx(bool enable) {
+bool AudioEncoderOpus::SetDtx(bool enable) {
if (enable) {
RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
} else {
@@ -410,30 +437,30 @@
return true;
}
-bool AudioEncoderOpusImpl::GetDtx() const {
+bool AudioEncoderOpus::GetDtx() const {
return config_.dtx_enabled;
}
-bool AudioEncoderOpusImpl::SetApplication(Application application) {
+bool AudioEncoderOpus::SetApplication(Application application) {
auto conf = config_;
switch (application) {
case Application::kSpeech:
- conf.application = AudioEncoderOpusConfig::ApplicationMode::kVoip;
+ conf.application = AudioEncoderOpus::kVoip;
break;
case Application::kAudio:
- conf.application = AudioEncoderOpusConfig::ApplicationMode::kAudio;
+ conf.application = AudioEncoderOpus::kAudio;
break;
}
return RecreateEncoderInstance(conf);
}
-void AudioEncoderOpusImpl::SetMaxPlaybackRate(int frequency_hz) {
+void AudioEncoderOpus::SetMaxPlaybackRate(int frequency_hz) {
auto conf = config_;
conf.max_playback_rate_hz = frequency_hz;
RTC_CHECK(RecreateEncoderInstance(conf));
}
-bool AudioEncoderOpusImpl::EnableAudioNetworkAdaptor(
+bool AudioEncoderOpus::EnableAudioNetworkAdaptor(
const std::string& config_string,
RtcEventLog* event_log) {
audio_network_adaptor_ =
@@ -441,11 +468,11 @@
return audio_network_adaptor_.get() != nullptr;
}
-void AudioEncoderOpusImpl::DisableAudioNetworkAdaptor() {
+void AudioEncoderOpus::DisableAudioNetworkAdaptor() {
audio_network_adaptor_.reset(nullptr);
}
-void AudioEncoderOpusImpl::OnReceivedUplinkPacketLossFraction(
+void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
float uplink_packet_loss_fraction) {
if (!audio_network_adaptor_) {
packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
@@ -457,7 +484,7 @@
ApplyAudioNetworkAdaptor();
}
-void AudioEncoderOpusImpl::OnReceivedUplinkRecoverablePacketLossFraction(
+void AudioEncoderOpus::OnReceivedUplinkRecoverablePacketLossFraction(
float uplink_recoverable_packet_loss_fraction) {
if (!audio_network_adaptor_)
return;
@@ -466,7 +493,7 @@
ApplyAudioNetworkAdaptor();
}
-void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth(
+void AudioEncoderOpus::OnReceivedUplinkBandwidth(
int target_audio_bitrate_bps,
rtc::Optional<int64_t> probing_interval_ms) {
if (audio_network_adaptor_) {
@@ -490,30 +517,28 @@
} else if (send_side_bwe_with_overhead_) {
if (!overhead_bytes_per_packet_) {
LOG(LS_INFO)
- << "AudioEncoderOpusImpl: Overhead unknown, target audio bitrate "
+ << "AudioEncoderOpus: Overhead unknown, target audio bitrate "
<< target_audio_bitrate_bps << " bps is ignored.";
return;
}
const int overhead_bps = static_cast<int>(
*overhead_bytes_per_packet_ * 8 * 100 / Num10MsFramesInNextPacket());
- SetTargetBitrate(
- std::min(AudioEncoderOpusConfig::kMaxBitrateBps,
- std::max(AudioEncoderOpusConfig::kMinBitrateBps,
- target_audio_bitrate_bps - overhead_bps)));
+ SetTargetBitrate(std::min(
+ kOpusMaxBitrateBps,
+ std::max(kOpusMinBitrateBps, target_audio_bitrate_bps - overhead_bps)));
} else {
SetTargetBitrate(target_audio_bitrate_bps);
}
}
-void AudioEncoderOpusImpl::OnReceivedRtt(int rtt_ms) {
+void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) {
if (!audio_network_adaptor_)
return;
audio_network_adaptor_->SetRtt(rtt_ms);
ApplyAudioNetworkAdaptor();
}
-void AudioEncoderOpusImpl::OnReceivedOverhead(
- size_t overhead_bytes_per_packet) {
+void AudioEncoderOpus::OnReceivedOverhead(size_t overhead_bytes_per_packet) {
if (audio_network_adaptor_) {
audio_network_adaptor_->SetOverhead(overhead_bytes_per_packet);
ApplyAudioNetworkAdaptor();
@@ -523,9 +548,8 @@
}
}
-void AudioEncoderOpusImpl::SetReceiverFrameLengthRange(
- int min_frame_length_ms,
- int max_frame_length_ms) {
+void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms,
+ int max_frame_length_ms) {
// Ensure that |SetReceiverFrameLengthRange| is called before
// |EnableAudioNetworkAdaptor|, otherwise we need to recreate
// |audio_network_adaptor_|, which is not a needed use case.
@@ -534,7 +558,7 @@
&config_.supported_frame_lengths_ms);
}
-AudioEncoder::EncodedInfo AudioEncoderOpusImpl::EncodeImpl(
+AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl(
uint32_t rtp_timestamp,
rtc::ArrayView<const int16_t> audio,
rtc::Buffer* encoded) {
@@ -573,26 +597,26 @@
config_.frame_size_ms = next_frame_length_ms_;
info.encoded_timestamp = first_timestamp_in_buffer_;
- info.payload_type = payload_type_;
+ info.payload_type = config_.payload_type;
info.send_even_if_empty = true; // Allows Opus to send empty packets.
info.speech = (info.encoded_bytes > 0);
info.encoder_type = CodecType::kOpus;
return info;
}
-size_t AudioEncoderOpusImpl::Num10msFramesPerPacket() const {
+size_t AudioEncoderOpus::Num10msFramesPerPacket() const {
return static_cast<size_t>(rtc::CheckedDivExact(config_.frame_size_ms, 10));
}
-size_t AudioEncoderOpusImpl::SamplesPer10msFrame() const {
+size_t AudioEncoderOpus::SamplesPer10msFrame() const {
return rtc::CheckedDivExact(kSampleRateHz, 100) * config_.num_channels;
}
-size_t AudioEncoderOpusImpl::SufficientOutputBufferSize() const {
+size_t AudioEncoderOpus::SufficientOutputBufferSize() const {
// Calculate the number of bytes we expect the encoder to produce,
// then multiply by two to give a wide margin for error.
const size_t bytes_per_millisecond =
- static_cast<size_t>(GetBitrateBps(config_) / (1000 * 8) + 1);
+ static_cast<size_t>(config_.GetBitrateBps() / (1000 * 8) + 1);
const size_t approx_encoded_bytes =
Num10msFramesPerPacket() * 10 * bytes_per_millisecond;
return 2 * approx_encoded_bytes;
@@ -601,8 +625,7 @@
// If the given config is OK, recreate the Opus encoder instance with those
// settings, save the config, and return true. Otherwise, do nothing and return
// false.
-bool AudioEncoderOpusImpl::RecreateEncoderInstance(
- const AudioEncoderOpusConfig& config) {
+bool AudioEncoderOpus::RecreateEncoderInstance(const Config& config) {
if (!config.IsOk())
return false;
config_ = config;
@@ -610,13 +633,9 @@
RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
input_buffer_.clear();
input_buffer_.reserve(Num10msFramesPerPacket() * SamplesPer10msFrame());
- RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate(
- &inst_, config.num_channels,
- config.application ==
- AudioEncoderOpusConfig::ApplicationMode::kVoip
- ? 0
- : 1));
- RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config)));
+ RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate(&inst_, config.num_channels,
+ config.application));
+ RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config.GetBitrateBps()));
if (config.fec_enabled) {
RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
} else {
@@ -626,7 +645,7 @@
0, WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz));
// Use the default complexity if the start bitrate is within the hysteresis
// window.
- complexity_ = GetNewComplexity(config).value_or(config.complexity);
+ complexity_ = config.GetNewComplexity().value_or(config.complexity);
RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
if (config.dtx_enabled) {
RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
@@ -646,12 +665,11 @@
return true;
}
-void AudioEncoderOpusImpl::SetFrameLength(int frame_length_ms) {
+void AudioEncoderOpus::SetFrameLength(int frame_length_ms) {
next_frame_length_ms_ = frame_length_ms;
}
-void AudioEncoderOpusImpl::SetNumChannelsToEncode(
- size_t num_channels_to_encode) {
+void AudioEncoderOpus::SetNumChannelsToEncode(size_t num_channels_to_encode) {
RTC_DCHECK_GT(num_channels_to_encode, 0);
RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels);
@@ -662,7 +680,7 @@
num_channels_to_encode_ = num_channels_to_encode;
}
-void AudioEncoderOpusImpl::SetProjectedPacketLossRate(float fraction) {
+void AudioEncoderOpus::SetProjectedPacketLossRate(float fraction) {
float opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_);
if (packet_loss_rate_ != opt_loss_rate) {
packet_loss_rate_ = opt_loss_rate;
@@ -672,20 +690,19 @@
}
}
-void AudioEncoderOpusImpl::SetTargetBitrate(int bits_per_second) {
- config_.bitrate_bps = rtc::SafeClamp<int>(
- bits_per_second, AudioEncoderOpusConfig::kMinBitrateBps,
- AudioEncoderOpusConfig::kMaxBitrateBps);
+void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
+ config_.bitrate_bps = rtc::Optional<int>(rtc::SafeClamp<int>(
+ bits_per_second, kOpusMinBitrateBps, kOpusMaxBitrateBps));
RTC_DCHECK(config_.IsOk());
- RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config_)));
- const auto new_complexity = GetNewComplexity(config_);
+ RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps()));
+ const auto new_complexity = config_.GetNewComplexity();
if (new_complexity && complexity_ != *new_complexity) {
complexity_ = *new_complexity;
RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
}
}
-void AudioEncoderOpusImpl::ApplyAudioNetworkAdaptor() {
+void AudioEncoderOpus::ApplyAudioNetworkAdaptor() {
auto config = audio_network_adaptor_->GetEncoderRuntimeConfig();
RTC_DCHECK(!config.frame_length_ms || *config.frame_length_ms == 20 ||
*config.frame_length_ms == 60);
@@ -705,20 +722,20 @@
}
std::unique_ptr<AudioNetworkAdaptor>
-AudioEncoderOpusImpl::DefaultAudioNetworkAdaptorCreator(
+AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator(
const ProtoString& config_string,
RtcEventLog* event_log) const {
AudioNetworkAdaptorImpl::Config config;
config.event_log = event_log;
return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
- config, ControllerManagerImpl::Create(
- config_string, NumChannels(), supported_frame_lengths_ms(),
- AudioEncoderOpusConfig::kMinBitrateBps,
- num_channels_to_encode_, next_frame_length_ms_,
- GetTargetBitrate(), config_.fec_enabled, GetDtx())));
-}
-
-void AudioEncoderOpusImpl::MaybeUpdateUplinkBandwidth() {
+ config,
+ ControllerManagerImpl::Create(
+ config_string, NumChannels(), supported_frame_lengths_ms(),
+ kOpusMinBitrateBps, num_channels_to_encode_, next_frame_length_ms_,
+ GetTargetBitrate(), config_.fec_enabled, GetDtx())));
+}
+
+void AudioEncoderOpus::MaybeUpdateUplinkBandwidth() {
if (audio_network_adaptor_) {
int64_t now_ms = rtc::TimeMillis();
if (!bitrate_smoother_last_update_time_ ||

Powered by Google App Engine
This is Rietveld 408576698