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 a2497c7862aa748da741d6d127984344f965b60c..edafbbdf39d9f64449395209bde4941a2df8d66f 100644 |
--- a/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
+++ b/webrtc/modules/audio_coding/codecs/opus/audio_encoder_opus.cc |
@@ -29,7 +29,7 @@ AudioEncoderOpus::Config CreateConfig(const CodecInst& codec_inst) { |
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.bitrate_bps = rtc::Optional<int>(codec_inst.rate); |
config.payload_type = codec_inst.pltype; |
config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip |
: AudioEncoderOpus::kAudio; |
@@ -78,18 +78,32 @@ double OptimizePacketLossRate(double new_loss_rate, double old_loss_rate) { |
} // namespace |
+AudioEncoderOpus::Config::Config() = default; |
+AudioEncoderOpus::Config::Config(const Config&) = default; |
+AudioEncoderOpus::Config::~Config() = default; |
+auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default; |
hlundin-webrtc
2016/05/18 00:34:47
I don't understand this syntax. Please, educate me
kwiberg-webrtc
2016/05/18 02:54:28
It's a trailing return type (see http://en.cpprefe
|
+ |
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 < kMinBitrateBps || bitrate_bps > kMaxBitrateBps) |
+ if (bitrate_bps && |
+ (*bitrate_bps < kMinBitrateBps || *bitrate_bps > kMaxBitrateBps)) |
return false; |
if (complexity < 0 || 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. |
+} |
+ |
AudioEncoderOpus::AudioEncoderOpus(const Config& config) |
: packet_loss_rate_(0.0), inst_(nullptr) { |
RTC_CHECK(RecreateEncoderInstance(config)); |
@@ -119,7 +133,7 @@ size_t AudioEncoderOpus::Max10MsFramesInAPacket() const { |
} |
int AudioEncoderOpus::GetTargetBitrate() const { |
- return config_.bitrate_bps; |
+ return config_.GetBitrateBps(); |
} |
void AudioEncoderOpus::Reset() { |
@@ -168,10 +182,10 @@ void AudioEncoderOpus::SetProjectedPacketLossRate(double fraction) { |
} |
void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) { |
- config_.bitrate_bps = |
- std::max(std::min(bits_per_second, kMaxBitrateBps), kMinBitrateBps); |
+ config_.bitrate_bps = rtc::Optional<int>( |
+ std::max(std::min(bits_per_second, kMaxBitrateBps), kMinBitrateBps)); |
RTC_DCHECK(config_.IsOk()); |
- RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.bitrate_bps)); |
+ RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps())); |
} |
AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl( |
@@ -228,7 +242,7 @@ 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>(config_.bitrate_bps / (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; |
@@ -246,7 +260,7 @@ bool AudioEncoderOpus::RecreateEncoderInstance(const Config& config) { |
input_buffer_.reserve(Num10msFramesPerPacket() * SamplesPer10msFrame()); |
RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate(&inst_, config.num_channels, |
config.application)); |
- RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config.bitrate_bps)); |
+ RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config.GetBitrateBps())); |
if (config.fec_enabled) { |
RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_)); |
} else { |