Chromium Code Reviews| 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 { |