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

Side by Side 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 unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 2 * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 30 matching lines...) Expand all
41 // 16-20 kb/s for WB speech, 41 // 16-20 kb/s for WB speech,
42 // 28-40 kb/s for FB speech, 42 // 28-40 kb/s for FB speech,
43 // 48-64 kb/s for FB mono music, and 43 // 48-64 kb/s for FB mono music, and
44 // 64-128 kb/s for FB stereo music. 44 // 64-128 kb/s for FB stereo music.
45 // The current implementation applies the following values to mono signals, 45 // The current implementation applies the following values to mono signals,
46 // and multiplies them by 2 for stereo. 46 // and multiplies them by 2 for stereo.
47 constexpr int kOpusBitrateNbBps = 12000; 47 constexpr int kOpusBitrateNbBps = 12000;
48 constexpr int kOpusBitrateWbBps = 20000; 48 constexpr int kOpusBitrateWbBps = 20000;
49 constexpr int kOpusBitrateFbBps = 32000; 49 constexpr int kOpusBitrateFbBps = 32000;
50 50
51 // Opus API allows a min bitrate of 500bps, but Opus documentation suggests
52 // bitrate should be in the range of 6000 to 510000, inclusive.
53 constexpr int kOpusMinBitrateBps = 6000;
54 constexpr int kOpusMaxBitrateBps = 510000;
55
51 constexpr int kSampleRateHz = 48000; 56 constexpr int kSampleRateHz = 48000;
52 constexpr int kDefaultMaxPlaybackRate = 48000; 57 constexpr int kDefaultMaxPlaybackRate = 48000;
53 58
54 // These two lists must be sorted from low to high 59 // These two lists must be sorted from low to high
55 #if WEBRTC_OPUS_SUPPORT_120MS_PTIME 60 #if WEBRTC_OPUS_SUPPORT_120MS_PTIME
56 constexpr int kANASupportedFrameLengths[] = {20, 60, 120}; 61 constexpr int kANASupportedFrameLengths[] = {20, 60, 120};
57 constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60, 120}; 62 constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60, 120};
58 #else 63 #else
59 constexpr int kANASupportedFrameLengths[] = {20, 60}; 64 constexpr int kANASupportedFrameLengths[] = {20, 60};
60 constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60}; 65 constexpr int kOpusSupportedFrameLengths[] = {10, 20, 40, 60};
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 int CalculateDefaultBitrate(int max_playback_rate, size_t num_channels) { 126 int CalculateDefaultBitrate(int max_playback_rate, size_t num_channels) {
122 const int bitrate = [&] { 127 const int bitrate = [&] {
123 if (max_playback_rate <= 8000) { 128 if (max_playback_rate <= 8000) {
124 return kOpusBitrateNbBps * rtc::dchecked_cast<int>(num_channels); 129 return kOpusBitrateNbBps * rtc::dchecked_cast<int>(num_channels);
125 } else if (max_playback_rate <= 16000) { 130 } else if (max_playback_rate <= 16000) {
126 return kOpusBitrateWbBps * rtc::dchecked_cast<int>(num_channels); 131 return kOpusBitrateWbBps * rtc::dchecked_cast<int>(num_channels);
127 } else { 132 } else {
128 return kOpusBitrateFbBps * rtc::dchecked_cast<int>(num_channels); 133 return kOpusBitrateFbBps * rtc::dchecked_cast<int>(num_channels);
129 } 134 }
130 }(); 135 }();
131 RTC_DCHECK_GE(bitrate, AudioEncoderOpusConfig::kMinBitrateBps); 136 RTC_DCHECK_GE(bitrate, kOpusMinBitrateBps);
132 RTC_DCHECK_LE(bitrate, AudioEncoderOpusConfig::kMaxBitrateBps); 137 RTC_DCHECK_LE(bitrate, kOpusMaxBitrateBps);
133 return bitrate; 138 return bitrate;
134 } 139 }
135 140
136 // Get the maxaveragebitrate parameter in string-form, so we can properly figure 141 // Get the maxaveragebitrate parameter in string-form, so we can properly figure
137 // out how invalid it is and accurately log invalid values. 142 // out how invalid it is and accurately log invalid values.
138 int CalculateBitrate(int max_playback_rate_hz, 143 int CalculateBitrate(int max_playback_rate_hz,
139 size_t num_channels, 144 size_t num_channels,
140 rtc::Optional<std::string> bitrate_param) { 145 rtc::Optional<std::string> bitrate_param) {
141 const int default_bitrate = 146 const int default_bitrate =
142 CalculateDefaultBitrate(max_playback_rate_hz, num_channels); 147 CalculateDefaultBitrate(max_playback_rate_hz, num_channels);
143 148
144 if (bitrate_param) { 149 if (bitrate_param) {
145 const auto bitrate = rtc::StringToNumber<int>(*bitrate_param); 150 const auto bitrate = rtc::StringToNumber<int>(*bitrate_param);
146 if (bitrate) { 151 if (bitrate) {
147 const int chosen_bitrate = 152 const int chosen_bitrate =
148 std::max(AudioEncoderOpusConfig::kMinBitrateBps, 153 std::max(kOpusMinBitrateBps, std::min(*bitrate, kOpusMaxBitrateBps));
149 std::min(*bitrate, AudioEncoderOpusConfig::kMaxBitrateBps));
150 if (bitrate != chosen_bitrate) { 154 if (bitrate != chosen_bitrate) {
151 LOG(LS_WARNING) << "Invalid maxaveragebitrate " << *bitrate 155 LOG(LS_WARNING) << "Invalid maxaveragebitrate " << *bitrate
152 << " clamped to " << chosen_bitrate; 156 << " clamped to " << chosen_bitrate;
153 } 157 }
154 return chosen_bitrate; 158 return chosen_bitrate;
155 } 159 }
156 LOG(LS_WARNING) << "Invalid maxaveragebitrate \"" << *bitrate_param 160 LOG(LS_WARNING) << "Invalid maxaveragebitrate \"" << *bitrate_param
157 << "\" replaced by default bitrate " << default_bitrate; 161 << "\" replaced by default bitrate " << default_bitrate;
158 } 162 }
159 163
(...skipping 24 matching lines...) Expand all
184 // kOpusSupportedFrameLengths. 188 // kOpusSupportedFrameLengths.
185 for (const int supported_frame_length : kOpusSupportedFrameLengths) { 189 for (const int supported_frame_length : kOpusSupportedFrameLengths) {
186 if (supported_frame_length >= *ptime) { 190 if (supported_frame_length >= *ptime) {
187 return supported_frame_length; 191 return supported_frame_length;
188 } 192 }
189 } 193 }
190 // If none was found, return the largest supported frame length. 194 // If none was found, return the largest supported frame length.
191 return *(std::end(kOpusSupportedFrameLengths) - 1); 195 return *(std::end(kOpusSupportedFrameLengths) - 1);
192 } 196 }
193 197
194 return AudioEncoderOpusConfig::kDefaultFrameSizeMs; 198 return AudioEncoderOpus::Config::kDefaultFrameSizeMs;
195 } 199 }
196 200
197 void FindSupportedFrameLengths(int min_frame_length_ms, 201 void FindSupportedFrameLengths(int min_frame_length_ms,
198 int max_frame_length_ms, 202 int max_frame_length_ms,
199 std::vector<int>* out) { 203 std::vector<int>* out) {
200 out->clear(); 204 out->clear();
201 std::copy_if(std::begin(kANASupportedFrameLengths), 205 std::copy_if(std::begin(kANASupportedFrameLengths),
202 std::end(kANASupportedFrameLengths), std::back_inserter(*out), 206 std::end(kANASupportedFrameLengths), std::back_inserter(*out),
203 [&](int frame_length_ms) { 207 [&](int frame_length_ms) {
204 return frame_length_ms >= min_frame_length_ms && 208 return frame_length_ms >= min_frame_length_ms &&
205 frame_length_ms <= max_frame_length_ms; 209 frame_length_ms <= max_frame_length_ms;
206 }); 210 });
207 RTC_DCHECK(std::is_sorted(out->begin(), out->end())); 211 RTC_DCHECK(std::is_sorted(out->begin(), out->end()));
208 } 212 }
209 213
210 int GetBitrateBps(const AudioEncoderOpusConfig& config) {
211 RTC_DCHECK(config.IsOk());
212 return config.bitrate_bps;
213 }
214
215 } // namespace 214 } // namespace
216 215
217 rtc::Optional<AudioCodecInfo> AudioEncoderOpusImpl::QueryAudioEncoder( 216 rtc::Optional<AudioCodecInfo> AudioEncoderOpus::QueryAudioEncoder(
218 const SdpAudioFormat& format) { 217 const SdpAudioFormat& format) {
219 if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 && 218 if (STR_CASE_CMP(format.name.c_str(), GetPayloadName()) == 0 &&
220 format.clockrate_hz == 48000 && format.num_channels == 2) { 219 format.clockrate_hz == 48000 && format.num_channels == 2) {
221 const size_t num_channels = GetChannelCount(format); 220 const size_t num_channels = GetChannelCount(format);
222 const int bitrate = 221 const int bitrate =
223 CalculateBitrate(GetMaxPlaybackRate(format), num_channels, 222 CalculateBitrate(GetMaxPlaybackRate(format), num_channels,
224 GetFormatParameter(format, "maxaveragebitrate")); 223 GetFormatParameter(format, "maxaveragebitrate"));
225 AudioCodecInfo info(48000, num_channels, bitrate, 224 AudioCodecInfo info(48000, num_channels, bitrate, kOpusMinBitrateBps,
226 AudioEncoderOpusConfig::kMinBitrateBps, 225 kOpusMaxBitrateBps);
227 AudioEncoderOpusConfig::kMaxBitrateBps);
228 info.allow_comfort_noise = false; 226 info.allow_comfort_noise = false;
229 info.supports_network_adaption = true; 227 info.supports_network_adaption = true;
230 228
231 return rtc::Optional<AudioCodecInfo>(info); 229 return rtc::Optional<AudioCodecInfo>(info);
232 } 230 }
233 return rtc::Optional<AudioCodecInfo>(); 231 return rtc::Optional<AudioCodecInfo>();
234 } 232 }
235 233
236 AudioEncoderOpusConfig AudioEncoderOpusImpl::CreateConfig( 234 AudioEncoderOpus::Config AudioEncoderOpus::CreateConfig(
237 const CodecInst& codec_inst) { 235 const CodecInst& codec_inst) {
238 AudioEncoderOpusConfig config; 236 AudioEncoderOpus::Config config;
239 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48); 237 config.frame_size_ms = rtc::CheckedDivExact(codec_inst.pacsize, 48);
240 config.num_channels = codec_inst.channels; 238 config.num_channels = codec_inst.channels;
241 config.bitrate_bps = codec_inst.rate; 239 config.bitrate_bps = rtc::Optional<int>(codec_inst.rate);
242 config.application = config.num_channels == 1 240 config.payload_type = codec_inst.pltype;
243 ? AudioEncoderOpusConfig::ApplicationMode::kVoip 241 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
244 : AudioEncoderOpusConfig::ApplicationMode::kAudio; 242 : AudioEncoderOpus::kAudio;
245 config.supported_frame_lengths_ms.push_back(config.frame_size_ms); 243 config.supported_frame_lengths_ms.push_back(config.frame_size_ms);
244 #if WEBRTC_OPUS_VARIABLE_COMPLEXITY
245 config.low_rate_complexity = 9;
246 #endif
246 return config; 247 return config;
247 } 248 }
248 249
249 rtc::Optional<AudioEncoderOpusConfig> AudioEncoderOpusImpl::SdpToConfig( 250 AudioEncoderOpus::Config AudioEncoderOpus::CreateConfig(
251 int payload_type,
250 const SdpAudioFormat& format) { 252 const SdpAudioFormat& format) {
251 if (STR_CASE_CMP(format.name.c_str(), "opus") != 0 || 253 AudioEncoderOpus::Config config;
252 format.clockrate_hz != 48000 || format.num_channels != 2) {
253 return rtc::Optional<AudioEncoderOpusConfig>();
254 }
255 254
256 AudioEncoderOpusConfig config;
257 config.num_channels = GetChannelCount(format); 255 config.num_channels = GetChannelCount(format);
258 config.frame_size_ms = GetFrameSizeMs(format); 256 config.frame_size_ms = GetFrameSizeMs(format);
259 config.max_playback_rate_hz = GetMaxPlaybackRate(format); 257 config.max_playback_rate_hz = GetMaxPlaybackRate(format);
260 config.fec_enabled = (GetFormatParameter(format, "useinbandfec") == "1"); 258 config.fec_enabled = (GetFormatParameter(format, "useinbandfec") == "1");
261 config.dtx_enabled = (GetFormatParameter(format, "usedtx") == "1"); 259 config.dtx_enabled = (GetFormatParameter(format, "usedtx") == "1");
262 config.cbr_enabled = (GetFormatParameter(format, "cbr") == "1"); 260 config.cbr_enabled = (GetFormatParameter(format, "cbr") == "1");
263 config.bitrate_bps = 261 config.bitrate_bps = rtc::Optional<int>(
264 CalculateBitrate(config.max_playback_rate_hz, config.num_channels, 262 CalculateBitrate(config.max_playback_rate_hz, config.num_channels,
265 GetFormatParameter(format, "maxaveragebitrate")); 263 GetFormatParameter(format, "maxaveragebitrate")));
266 config.application = config.num_channels == 1 264 config.payload_type = payload_type;
267 ? AudioEncoderOpusConfig::ApplicationMode::kVoip 265 config.application = config.num_channels == 1 ? AudioEncoderOpus::kVoip
268 : AudioEncoderOpusConfig::ApplicationMode::kAudio; 266 : AudioEncoderOpus::kAudio;
267 #if WEBRTC_OPUS_VARIABLE_COMPLEXITY
268 config.low_rate_complexity = 9;
269 #endif
269 270
270 constexpr int kMinANAFrameLength = kANASupportedFrameLengths[0]; 271 constexpr int kMinANAFrameLength = kANASupportedFrameLengths[0];
271 constexpr int kMaxANAFrameLength = 272 constexpr int kMaxANAFrameLength =
272 kANASupportedFrameLengths[arraysize(kANASupportedFrameLengths) - 1]; 273 kANASupportedFrameLengths[arraysize(kANASupportedFrameLengths) - 1];
273
274 // For now, minptime and maxptime are only used with ANA. If ptime is outside 274 // For now, minptime and maxptime are only used with ANA. If ptime is outside
275 // of this range, it will get adjusted once ANA takes hold. Ideally, we'd know 275 // of this range, it will get adjusted once ANA takes hold. Ideally, we'd know
276 // if ANA was to be used when setting up the config, and adjust accordingly. 276 // if ANA was to be used when setting up the config, and adjust accordingly.
277 const int min_frame_length_ms = 277 const int min_frame_length_ms =
278 GetFormatParameter<int>(format, "minptime").value_or(kMinANAFrameLength); 278 GetFormatParameter<int>(format, "minptime").value_or(kMinANAFrameLength);
279 const int max_frame_length_ms = 279 const int max_frame_length_ms =
280 GetFormatParameter<int>(format, "maxptime").value_or(kMaxANAFrameLength); 280 GetFormatParameter<int>(format, "maxptime").value_or(kMaxANAFrameLength);
281 281
282 FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms, 282 FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms,
283 &config.supported_frame_lengths_ms); 283 &config.supported_frame_lengths_ms);
284 RTC_DCHECK(config.IsOk()); 284 return config;
285 return rtc::Optional<AudioEncoderOpusConfig>(config);
286 } 285 }
287 286
288 rtc::Optional<int> AudioEncoderOpusImpl::GetNewComplexity( 287 class AudioEncoderOpus::PacketLossFractionSmoother {
289 const AudioEncoderOpusConfig& config) {
290 RTC_DCHECK(config.IsOk());
291 const int bitrate_bps = GetBitrateBps(config);
292 if (bitrate_bps >= config.complexity_threshold_bps -
293 config.complexity_threshold_window_bps &&
294 bitrate_bps <= config.complexity_threshold_bps +
295 config.complexity_threshold_window_bps) {
296 // Within the hysteresis window; make no change.
297 return rtc::Optional<int>();
298 } else {
299 return rtc::Optional<int>(bitrate_bps <= config.complexity_threshold_bps
300 ? config.low_rate_complexity
301 : config.complexity);
302 }
303 }
304
305 class AudioEncoderOpusImpl::PacketLossFractionSmoother {
306 public: 288 public:
307 explicit PacketLossFractionSmoother() 289 explicit PacketLossFractionSmoother()
308 : last_sample_time_ms_(rtc::TimeMillis()), 290 : last_sample_time_ms_(rtc::TimeMillis()),
309 smoother_(kAlphaForPacketLossFractionSmoother) {} 291 smoother_(kAlphaForPacketLossFractionSmoother) {}
310 292
311 // Gets the smoothed packet loss fraction. 293 // Gets the smoothed packet loss fraction.
312 float GetAverage() const { 294 float GetAverage() const {
313 float value = smoother_.filtered(); 295 float value = smoother_.filtered();
314 return (value == rtc::ExpFilter::kValueUndefined) ? 0.0f : value; 296 return (value == rtc::ExpFilter::kValueUndefined) ? 0.0f : value;
315 } 297 }
316 298
317 // Add new observation to the packet loss fraction smoother. 299 // Add new observation to the packet loss fraction smoother.
318 void AddSample(float packet_loss_fraction) { 300 void AddSample(float packet_loss_fraction) {
319 int64_t now_ms = rtc::TimeMillis(); 301 int64_t now_ms = rtc::TimeMillis();
320 smoother_.Apply(static_cast<float>(now_ms - last_sample_time_ms_), 302 smoother_.Apply(static_cast<float>(now_ms - last_sample_time_ms_),
321 packet_loss_fraction); 303 packet_loss_fraction);
322 last_sample_time_ms_ = now_ms; 304 last_sample_time_ms_ = now_ms;
323 } 305 }
324 306
325 private: 307 private:
326 int64_t last_sample_time_ms_; 308 int64_t last_sample_time_ms_;
327 309
328 // An exponential filter is used to smooth the packet loss fraction. 310 // An exponential filter is used to smooth the packet loss fraction.
329 rtc::ExpFilter smoother_; 311 rtc::ExpFilter smoother_;
330 }; 312 };
331 313
332 AudioEncoderOpusImpl::AudioEncoderOpusImpl( 314 AudioEncoderOpus::Config::Config() {
333 const AudioEncoderOpusConfig& config, 315 #if WEBRTC_OPUS_VARIABLE_COMPLEXITY
334 int payload_type, 316 low_rate_complexity = 9;
317 #endif
318 }
319 AudioEncoderOpus::Config::Config(const Config&) = default;
320 AudioEncoderOpus::Config::~Config() = default;
321 auto AudioEncoderOpus::Config::operator=(const Config&) -> Config& = default;
322
323 bool AudioEncoderOpus::Config::IsOk() const {
324 if (frame_size_ms <= 0 || frame_size_ms % 10 != 0)
325 return false;
326 if (num_channels != 1 && num_channels != 2)
327 return false;
328 if (bitrate_bps &&
329 (*bitrate_bps < kOpusMinBitrateBps || *bitrate_bps > kOpusMaxBitrateBps))
330 return false;
331 if (complexity < 0 || complexity > 10)
332 return false;
333 if (low_rate_complexity < 0 || low_rate_complexity > 10)
334 return false;
335 return true;
336 }
337
338 int AudioEncoderOpus::Config::GetBitrateBps() const {
339 RTC_DCHECK(IsOk());
340 if (bitrate_bps)
341 return *bitrate_bps; // Explicitly set value.
342 else
343 return num_channels == 1 ? 32000 : 64000; // Default value.
344 }
345
346 rtc::Optional<int> AudioEncoderOpus::Config::GetNewComplexity() const {
347 RTC_DCHECK(IsOk());
348 const int bitrate_bps = GetBitrateBps();
349 if (bitrate_bps >=
350 complexity_threshold_bps - complexity_threshold_window_bps &&
351 bitrate_bps <=
352 complexity_threshold_bps + complexity_threshold_window_bps) {
353 // Within the hysteresis window; make no change.
354 return rtc::Optional<int>();
355 }
356 return bitrate_bps <= complexity_threshold_bps
357 ? rtc::Optional<int>(low_rate_complexity)
358 : rtc::Optional<int>(complexity);
359 }
360
361 AudioEncoderOpus::AudioEncoderOpus(
362 const Config& config,
335 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator, 363 AudioNetworkAdaptorCreator&& audio_network_adaptor_creator,
336 std::unique_ptr<SmoothingFilter> bitrate_smoother) 364 std::unique_ptr<SmoothingFilter> bitrate_smoother)
337 : payload_type_(payload_type), 365 : send_side_bwe_with_overhead_(webrtc::field_trial::IsEnabled(
338 send_side_bwe_with_overhead_(webrtc::field_trial::IsEnabled(
339 "WebRTC-SendSideBwe-WithOverhead")), 366 "WebRTC-SendSideBwe-WithOverhead")),
340 packet_loss_rate_(0.0), 367 packet_loss_rate_(0.0),
341 inst_(nullptr), 368 inst_(nullptr),
342 packet_loss_fraction_smoother_(new PacketLossFractionSmoother()), 369 packet_loss_fraction_smoother_(new PacketLossFractionSmoother()),
343 audio_network_adaptor_creator_( 370 audio_network_adaptor_creator_(
344 audio_network_adaptor_creator 371 audio_network_adaptor_creator
345 ? std::move(audio_network_adaptor_creator) 372 ? std::move(audio_network_adaptor_creator)
346 : [this](const ProtoString& config_string, 373 : [this](const ProtoString& config_string,
347 RtcEventLog* event_log) { 374 RtcEventLog* event_log) {
348 return DefaultAudioNetworkAdaptorCreator(config_string, 375 return DefaultAudioNetworkAdaptorCreator(config_string,
349 event_log); 376 event_log);
350 }), 377 }),
351 bitrate_smoother_(bitrate_smoother 378 bitrate_smoother_(bitrate_smoother
352 ? std::move(bitrate_smoother) : std::unique_ptr<SmoothingFilter>( 379 ? std::move(bitrate_smoother) : std::unique_ptr<SmoothingFilter>(
353 // We choose 5sec as initial time constant due to empirical data. 380 // We choose 5sec as initial time constant due to empirical data.
354 new SmoothingFilterImpl(5000))) { 381 new SmoothingFilterImpl(5000))) {
355 RTC_CHECK(RecreateEncoderInstance(config)); 382 RTC_CHECK(RecreateEncoderInstance(config));
356 } 383 }
357 384
358 AudioEncoderOpusImpl::AudioEncoderOpusImpl(const CodecInst& codec_inst) 385 AudioEncoderOpus::AudioEncoderOpus(const CodecInst& codec_inst)
359 : AudioEncoderOpusImpl(CreateConfig(codec_inst), codec_inst.pltype) {} 386 : AudioEncoderOpus(CreateConfig(codec_inst), nullptr) {}
360 387
361 AudioEncoderOpusImpl::AudioEncoderOpusImpl(int payload_type, 388 AudioEncoderOpus::AudioEncoderOpus(int payload_type,
362 const SdpAudioFormat& format) 389 const SdpAudioFormat& format)
363 : AudioEncoderOpusImpl(*SdpToConfig(format), payload_type) {} 390 : AudioEncoderOpus(CreateConfig(payload_type, format), nullptr) {}
364 391
365 AudioEncoderOpusImpl::~AudioEncoderOpusImpl() { 392 AudioEncoderOpus::~AudioEncoderOpus() {
366 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_)); 393 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
367 } 394 }
368 395
369 int AudioEncoderOpusImpl::SampleRateHz() const { 396 int AudioEncoderOpus::SampleRateHz() const {
370 return kSampleRateHz; 397 return kSampleRateHz;
371 } 398 }
372 399
373 size_t AudioEncoderOpusImpl::NumChannels() const { 400 size_t AudioEncoderOpus::NumChannels() const {
374 return config_.num_channels; 401 return config_.num_channels;
375 } 402 }
376 403
377 size_t AudioEncoderOpusImpl::Num10MsFramesInNextPacket() const { 404 size_t AudioEncoderOpus::Num10MsFramesInNextPacket() const {
378 return Num10msFramesPerPacket(); 405 return Num10msFramesPerPacket();
379 } 406 }
380 407
381 size_t AudioEncoderOpusImpl::Max10MsFramesInAPacket() const { 408 size_t AudioEncoderOpus::Max10MsFramesInAPacket() const {
382 return Num10msFramesPerPacket(); 409 return Num10msFramesPerPacket();
383 } 410 }
384 411
385 int AudioEncoderOpusImpl::GetTargetBitrate() const { 412 int AudioEncoderOpus::GetTargetBitrate() const {
386 return GetBitrateBps(config_); 413 return config_.GetBitrateBps();
387 } 414 }
388 415
389 void AudioEncoderOpusImpl::Reset() { 416 void AudioEncoderOpus::Reset() {
390 RTC_CHECK(RecreateEncoderInstance(config_)); 417 RTC_CHECK(RecreateEncoderInstance(config_));
391 } 418 }
392 419
393 bool AudioEncoderOpusImpl::SetFec(bool enable) { 420 bool AudioEncoderOpus::SetFec(bool enable) {
394 if (enable) { 421 if (enable) {
395 RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_)); 422 RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
396 } else { 423 } else {
397 RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_)); 424 RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_));
398 } 425 }
399 config_.fec_enabled = enable; 426 config_.fec_enabled = enable;
400 return true; 427 return true;
401 } 428 }
402 429
403 bool AudioEncoderOpusImpl::SetDtx(bool enable) { 430 bool AudioEncoderOpus::SetDtx(bool enable) {
404 if (enable) { 431 if (enable) {
405 RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_)); 432 RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
406 } else { 433 } else {
407 RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_)); 434 RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_));
408 } 435 }
409 config_.dtx_enabled = enable; 436 config_.dtx_enabled = enable;
410 return true; 437 return true;
411 } 438 }
412 439
413 bool AudioEncoderOpusImpl::GetDtx() const { 440 bool AudioEncoderOpus::GetDtx() const {
414 return config_.dtx_enabled; 441 return config_.dtx_enabled;
415 } 442 }
416 443
417 bool AudioEncoderOpusImpl::SetApplication(Application application) { 444 bool AudioEncoderOpus::SetApplication(Application application) {
418 auto conf = config_; 445 auto conf = config_;
419 switch (application) { 446 switch (application) {
420 case Application::kSpeech: 447 case Application::kSpeech:
421 conf.application = AudioEncoderOpusConfig::ApplicationMode::kVoip; 448 conf.application = AudioEncoderOpus::kVoip;
422 break; 449 break;
423 case Application::kAudio: 450 case Application::kAudio:
424 conf.application = AudioEncoderOpusConfig::ApplicationMode::kAudio; 451 conf.application = AudioEncoderOpus::kAudio;
425 break; 452 break;
426 } 453 }
427 return RecreateEncoderInstance(conf); 454 return RecreateEncoderInstance(conf);
428 } 455 }
429 456
430 void AudioEncoderOpusImpl::SetMaxPlaybackRate(int frequency_hz) { 457 void AudioEncoderOpus::SetMaxPlaybackRate(int frequency_hz) {
431 auto conf = config_; 458 auto conf = config_;
432 conf.max_playback_rate_hz = frequency_hz; 459 conf.max_playback_rate_hz = frequency_hz;
433 RTC_CHECK(RecreateEncoderInstance(conf)); 460 RTC_CHECK(RecreateEncoderInstance(conf));
434 } 461 }
435 462
436 bool AudioEncoderOpusImpl::EnableAudioNetworkAdaptor( 463 bool AudioEncoderOpus::EnableAudioNetworkAdaptor(
437 const std::string& config_string, 464 const std::string& config_string,
438 RtcEventLog* event_log) { 465 RtcEventLog* event_log) {
439 audio_network_adaptor_ = 466 audio_network_adaptor_ =
440 audio_network_adaptor_creator_(config_string, event_log); 467 audio_network_adaptor_creator_(config_string, event_log);
441 return audio_network_adaptor_.get() != nullptr; 468 return audio_network_adaptor_.get() != nullptr;
442 } 469 }
443 470
444 void AudioEncoderOpusImpl::DisableAudioNetworkAdaptor() { 471 void AudioEncoderOpus::DisableAudioNetworkAdaptor() {
445 audio_network_adaptor_.reset(nullptr); 472 audio_network_adaptor_.reset(nullptr);
446 } 473 }
447 474
448 void AudioEncoderOpusImpl::OnReceivedUplinkPacketLossFraction( 475 void AudioEncoderOpus::OnReceivedUplinkPacketLossFraction(
449 float uplink_packet_loss_fraction) { 476 float uplink_packet_loss_fraction) {
450 if (!audio_network_adaptor_) { 477 if (!audio_network_adaptor_) {
451 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction); 478 packet_loss_fraction_smoother_->AddSample(uplink_packet_loss_fraction);
452 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage(); 479 float average_fraction_loss = packet_loss_fraction_smoother_->GetAverage();
453 return SetProjectedPacketLossRate(average_fraction_loss); 480 return SetProjectedPacketLossRate(average_fraction_loss);
454 } 481 }
455 audio_network_adaptor_->SetUplinkPacketLossFraction( 482 audio_network_adaptor_->SetUplinkPacketLossFraction(
456 uplink_packet_loss_fraction); 483 uplink_packet_loss_fraction);
457 ApplyAudioNetworkAdaptor(); 484 ApplyAudioNetworkAdaptor();
458 } 485 }
459 486
460 void AudioEncoderOpusImpl::OnReceivedUplinkRecoverablePacketLossFraction( 487 void AudioEncoderOpus::OnReceivedUplinkRecoverablePacketLossFraction(
461 float uplink_recoverable_packet_loss_fraction) { 488 float uplink_recoverable_packet_loss_fraction) {
462 if (!audio_network_adaptor_) 489 if (!audio_network_adaptor_)
463 return; 490 return;
464 audio_network_adaptor_->SetUplinkRecoverablePacketLossFraction( 491 audio_network_adaptor_->SetUplinkRecoverablePacketLossFraction(
465 uplink_recoverable_packet_loss_fraction); 492 uplink_recoverable_packet_loss_fraction);
466 ApplyAudioNetworkAdaptor(); 493 ApplyAudioNetworkAdaptor();
467 } 494 }
468 495
469 void AudioEncoderOpusImpl::OnReceivedUplinkBandwidth( 496 void AudioEncoderOpus::OnReceivedUplinkBandwidth(
470 int target_audio_bitrate_bps, 497 int target_audio_bitrate_bps,
471 rtc::Optional<int64_t> probing_interval_ms) { 498 rtc::Optional<int64_t> probing_interval_ms) {
472 if (audio_network_adaptor_) { 499 if (audio_network_adaptor_) {
473 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps); 500 audio_network_adaptor_->SetTargetAudioBitrate(target_audio_bitrate_bps);
474 // We give smoothed bitrate allocation to audio network adaptor as 501 // We give smoothed bitrate allocation to audio network adaptor as
475 // the uplink bandwidth. 502 // the uplink bandwidth.
476 // The probing spikes should not affect the bitrate smoother more than 25%. 503 // The probing spikes should not affect the bitrate smoother more than 25%.
477 // To simplify the calculations we use a step response as input signal. 504 // To simplify the calculations we use a step response as input signal.
478 // The step response of an exponential filter is 505 // The step response of an exponential filter is
479 // u(t) = 1 - e^(-t / time_constant). 506 // u(t) = 1 - e^(-t / time_constant).
480 // In order to limit the affect of a BWE spike within 25% of its value 507 // In order to limit the affect of a BWE spike within 25% of its value
481 // before 508 // before
482 // the next probing, we would choose a time constant that fulfills 509 // the next probing, we would choose a time constant that fulfills
483 // 1 - e^(-probing_interval_ms / time_constant) < 0.25 510 // 1 - e^(-probing_interval_ms / time_constant) < 0.25
484 // Then 4 * probing_interval_ms is a good choice. 511 // Then 4 * probing_interval_ms is a good choice.
485 if (probing_interval_ms) 512 if (probing_interval_ms)
486 bitrate_smoother_->SetTimeConstantMs(*probing_interval_ms * 4); 513 bitrate_smoother_->SetTimeConstantMs(*probing_interval_ms * 4);
487 bitrate_smoother_->AddSample(target_audio_bitrate_bps); 514 bitrate_smoother_->AddSample(target_audio_bitrate_bps);
488 515
489 ApplyAudioNetworkAdaptor(); 516 ApplyAudioNetworkAdaptor();
490 } else if (send_side_bwe_with_overhead_) { 517 } else if (send_side_bwe_with_overhead_) {
491 if (!overhead_bytes_per_packet_) { 518 if (!overhead_bytes_per_packet_) {
492 LOG(LS_INFO) 519 LOG(LS_INFO)
493 << "AudioEncoderOpusImpl: Overhead unknown, target audio bitrate " 520 << "AudioEncoderOpus: Overhead unknown, target audio bitrate "
494 << target_audio_bitrate_bps << " bps is ignored."; 521 << target_audio_bitrate_bps << " bps is ignored.";
495 return; 522 return;
496 } 523 }
497 const int overhead_bps = static_cast<int>( 524 const int overhead_bps = static_cast<int>(
498 *overhead_bytes_per_packet_ * 8 * 100 / Num10MsFramesInNextPacket()); 525 *overhead_bytes_per_packet_ * 8 * 100 / Num10MsFramesInNextPacket());
499 SetTargetBitrate( 526 SetTargetBitrate(std::min(
500 std::min(AudioEncoderOpusConfig::kMaxBitrateBps, 527 kOpusMaxBitrateBps,
501 std::max(AudioEncoderOpusConfig::kMinBitrateBps, 528 std::max(kOpusMinBitrateBps, target_audio_bitrate_bps - overhead_bps)));
502 target_audio_bitrate_bps - overhead_bps)));
503 } else { 529 } else {
504 SetTargetBitrate(target_audio_bitrate_bps); 530 SetTargetBitrate(target_audio_bitrate_bps);
505 } 531 }
506 } 532 }
507 533
508 void AudioEncoderOpusImpl::OnReceivedRtt(int rtt_ms) { 534 void AudioEncoderOpus::OnReceivedRtt(int rtt_ms) {
509 if (!audio_network_adaptor_) 535 if (!audio_network_adaptor_)
510 return; 536 return;
511 audio_network_adaptor_->SetRtt(rtt_ms); 537 audio_network_adaptor_->SetRtt(rtt_ms);
512 ApplyAudioNetworkAdaptor(); 538 ApplyAudioNetworkAdaptor();
513 } 539 }
514 540
515 void AudioEncoderOpusImpl::OnReceivedOverhead( 541 void AudioEncoderOpus::OnReceivedOverhead(size_t overhead_bytes_per_packet) {
516 size_t overhead_bytes_per_packet) {
517 if (audio_network_adaptor_) { 542 if (audio_network_adaptor_) {
518 audio_network_adaptor_->SetOverhead(overhead_bytes_per_packet); 543 audio_network_adaptor_->SetOverhead(overhead_bytes_per_packet);
519 ApplyAudioNetworkAdaptor(); 544 ApplyAudioNetworkAdaptor();
520 } else { 545 } else {
521 overhead_bytes_per_packet_ = 546 overhead_bytes_per_packet_ =
522 rtc::Optional<size_t>(overhead_bytes_per_packet); 547 rtc::Optional<size_t>(overhead_bytes_per_packet);
523 } 548 }
524 } 549 }
525 550
526 void AudioEncoderOpusImpl::SetReceiverFrameLengthRange( 551 void AudioEncoderOpus::SetReceiverFrameLengthRange(int min_frame_length_ms,
527 int min_frame_length_ms, 552 int max_frame_length_ms) {
528 int max_frame_length_ms) {
529 // Ensure that |SetReceiverFrameLengthRange| is called before 553 // Ensure that |SetReceiverFrameLengthRange| is called before
530 // |EnableAudioNetworkAdaptor|, otherwise we need to recreate 554 // |EnableAudioNetworkAdaptor|, otherwise we need to recreate
531 // |audio_network_adaptor_|, which is not a needed use case. 555 // |audio_network_adaptor_|, which is not a needed use case.
532 RTC_DCHECK(!audio_network_adaptor_); 556 RTC_DCHECK(!audio_network_adaptor_);
533 FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms, 557 FindSupportedFrameLengths(min_frame_length_ms, max_frame_length_ms,
534 &config_.supported_frame_lengths_ms); 558 &config_.supported_frame_lengths_ms);
535 } 559 }
536 560
537 AudioEncoder::EncodedInfo AudioEncoderOpusImpl::EncodeImpl( 561 AudioEncoder::EncodedInfo AudioEncoderOpus::EncodeImpl(
538 uint32_t rtp_timestamp, 562 uint32_t rtp_timestamp,
539 rtc::ArrayView<const int16_t> audio, 563 rtc::ArrayView<const int16_t> audio,
540 rtc::Buffer* encoded) { 564 rtc::Buffer* encoded) {
541 MaybeUpdateUplinkBandwidth(); 565 MaybeUpdateUplinkBandwidth();
542 566
543 if (input_buffer_.empty()) 567 if (input_buffer_.empty())
544 first_timestamp_in_buffer_ = rtp_timestamp; 568 first_timestamp_in_buffer_ = rtp_timestamp;
545 569
546 input_buffer_.insert(input_buffer_.end(), audio.cbegin(), audio.cend()); 570 input_buffer_.insert(input_buffer_.end(), audio.cbegin(), audio.cend());
547 if (input_buffer_.size() < 571 if (input_buffer_.size() <
(...skipping 18 matching lines...) Expand all
566 RTC_CHECK_GE(status, 0); // Fails only if fed invalid data. 590 RTC_CHECK_GE(status, 0); // Fails only if fed invalid data.
567 591
568 return static_cast<size_t>(status); 592 return static_cast<size_t>(status);
569 }); 593 });
570 input_buffer_.clear(); 594 input_buffer_.clear();
571 595
572 // Will use new packet size for next encoding. 596 // Will use new packet size for next encoding.
573 config_.frame_size_ms = next_frame_length_ms_; 597 config_.frame_size_ms = next_frame_length_ms_;
574 598
575 info.encoded_timestamp = first_timestamp_in_buffer_; 599 info.encoded_timestamp = first_timestamp_in_buffer_;
576 info.payload_type = payload_type_; 600 info.payload_type = config_.payload_type;
577 info.send_even_if_empty = true; // Allows Opus to send empty packets. 601 info.send_even_if_empty = true; // Allows Opus to send empty packets.
578 info.speech = (info.encoded_bytes > 0); 602 info.speech = (info.encoded_bytes > 0);
579 info.encoder_type = CodecType::kOpus; 603 info.encoder_type = CodecType::kOpus;
580 return info; 604 return info;
581 } 605 }
582 606
583 size_t AudioEncoderOpusImpl::Num10msFramesPerPacket() const { 607 size_t AudioEncoderOpus::Num10msFramesPerPacket() const {
584 return static_cast<size_t>(rtc::CheckedDivExact(config_.frame_size_ms, 10)); 608 return static_cast<size_t>(rtc::CheckedDivExact(config_.frame_size_ms, 10));
585 } 609 }
586 610
587 size_t AudioEncoderOpusImpl::SamplesPer10msFrame() const { 611 size_t AudioEncoderOpus::SamplesPer10msFrame() const {
588 return rtc::CheckedDivExact(kSampleRateHz, 100) * config_.num_channels; 612 return rtc::CheckedDivExact(kSampleRateHz, 100) * config_.num_channels;
589 } 613 }
590 614
591 size_t AudioEncoderOpusImpl::SufficientOutputBufferSize() const { 615 size_t AudioEncoderOpus::SufficientOutputBufferSize() const {
592 // Calculate the number of bytes we expect the encoder to produce, 616 // Calculate the number of bytes we expect the encoder to produce,
593 // then multiply by two to give a wide margin for error. 617 // then multiply by two to give a wide margin for error.
594 const size_t bytes_per_millisecond = 618 const size_t bytes_per_millisecond =
595 static_cast<size_t>(GetBitrateBps(config_) / (1000 * 8) + 1); 619 static_cast<size_t>(config_.GetBitrateBps() / (1000 * 8) + 1);
596 const size_t approx_encoded_bytes = 620 const size_t approx_encoded_bytes =
597 Num10msFramesPerPacket() * 10 * bytes_per_millisecond; 621 Num10msFramesPerPacket() * 10 * bytes_per_millisecond;
598 return 2 * approx_encoded_bytes; 622 return 2 * approx_encoded_bytes;
599 } 623 }
600 624
601 // If the given config is OK, recreate the Opus encoder instance with those 625 // If the given config is OK, recreate the Opus encoder instance with those
602 // settings, save the config, and return true. Otherwise, do nothing and return 626 // settings, save the config, and return true. Otherwise, do nothing and return
603 // false. 627 // false.
604 bool AudioEncoderOpusImpl::RecreateEncoderInstance( 628 bool AudioEncoderOpus::RecreateEncoderInstance(const Config& config) {
605 const AudioEncoderOpusConfig& config) {
606 if (!config.IsOk()) 629 if (!config.IsOk())
607 return false; 630 return false;
608 config_ = config; 631 config_ = config;
609 if (inst_) 632 if (inst_)
610 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_)); 633 RTC_CHECK_EQ(0, WebRtcOpus_EncoderFree(inst_));
611 input_buffer_.clear(); 634 input_buffer_.clear();
612 input_buffer_.reserve(Num10msFramesPerPacket() * SamplesPer10msFrame()); 635 input_buffer_.reserve(Num10msFramesPerPacket() * SamplesPer10msFrame());
613 RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate( 636 RTC_CHECK_EQ(0, WebRtcOpus_EncoderCreate(&inst_, config.num_channels,
614 &inst_, config.num_channels, 637 config.application));
615 config.application == 638 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config.GetBitrateBps()));
616 AudioEncoderOpusConfig::ApplicationMode::kVoip
617 ? 0
618 : 1));
619 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config)));
620 if (config.fec_enabled) { 639 if (config.fec_enabled) {
621 RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_)); 640 RTC_CHECK_EQ(0, WebRtcOpus_EnableFec(inst_));
622 } else { 641 } else {
623 RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_)); 642 RTC_CHECK_EQ(0, WebRtcOpus_DisableFec(inst_));
624 } 643 }
625 RTC_CHECK_EQ( 644 RTC_CHECK_EQ(
626 0, WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz)); 645 0, WebRtcOpus_SetMaxPlaybackRate(inst_, config.max_playback_rate_hz));
627 // Use the default complexity if the start bitrate is within the hysteresis 646 // Use the default complexity if the start bitrate is within the hysteresis
628 // window. 647 // window.
629 complexity_ = GetNewComplexity(config).value_or(config.complexity); 648 complexity_ = config.GetNewComplexity().value_or(config.complexity);
630 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_)); 649 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
631 if (config.dtx_enabled) { 650 if (config.dtx_enabled) {
632 RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_)); 651 RTC_CHECK_EQ(0, WebRtcOpus_EnableDtx(inst_));
633 } else { 652 } else {
634 RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_)); 653 RTC_CHECK_EQ(0, WebRtcOpus_DisableDtx(inst_));
635 } 654 }
636 RTC_CHECK_EQ(0, 655 RTC_CHECK_EQ(0,
637 WebRtcOpus_SetPacketLossRate( 656 WebRtcOpus_SetPacketLossRate(
638 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5))); 657 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
639 if (config.cbr_enabled) { 658 if (config.cbr_enabled) {
640 RTC_CHECK_EQ(0, WebRtcOpus_EnableCbr(inst_)); 659 RTC_CHECK_EQ(0, WebRtcOpus_EnableCbr(inst_));
641 } else { 660 } else {
642 RTC_CHECK_EQ(0, WebRtcOpus_DisableCbr(inst_)); 661 RTC_CHECK_EQ(0, WebRtcOpus_DisableCbr(inst_));
643 } 662 }
644 num_channels_to_encode_ = NumChannels(); 663 num_channels_to_encode_ = NumChannels();
645 next_frame_length_ms_ = config_.frame_size_ms; 664 next_frame_length_ms_ = config_.frame_size_ms;
646 return true; 665 return true;
647 } 666 }
648 667
649 void AudioEncoderOpusImpl::SetFrameLength(int frame_length_ms) { 668 void AudioEncoderOpus::SetFrameLength(int frame_length_ms) {
650 next_frame_length_ms_ = frame_length_ms; 669 next_frame_length_ms_ = frame_length_ms;
651 } 670 }
652 671
653 void AudioEncoderOpusImpl::SetNumChannelsToEncode( 672 void AudioEncoderOpus::SetNumChannelsToEncode(size_t num_channels_to_encode) {
654 size_t num_channels_to_encode) {
655 RTC_DCHECK_GT(num_channels_to_encode, 0); 673 RTC_DCHECK_GT(num_channels_to_encode, 0);
656 RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels); 674 RTC_DCHECK_LE(num_channels_to_encode, config_.num_channels);
657 675
658 if (num_channels_to_encode_ == num_channels_to_encode) 676 if (num_channels_to_encode_ == num_channels_to_encode)
659 return; 677 return;
660 678
661 RTC_CHECK_EQ(0, WebRtcOpus_SetForceChannels(inst_, num_channels_to_encode)); 679 RTC_CHECK_EQ(0, WebRtcOpus_SetForceChannels(inst_, num_channels_to_encode));
662 num_channels_to_encode_ = num_channels_to_encode; 680 num_channels_to_encode_ = num_channels_to_encode;
663 } 681 }
664 682
665 void AudioEncoderOpusImpl::SetProjectedPacketLossRate(float fraction) { 683 void AudioEncoderOpus::SetProjectedPacketLossRate(float fraction) {
666 float opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_); 684 float opt_loss_rate = OptimizePacketLossRate(fraction, packet_loss_rate_);
667 if (packet_loss_rate_ != opt_loss_rate) { 685 if (packet_loss_rate_ != opt_loss_rate) {
668 packet_loss_rate_ = opt_loss_rate; 686 packet_loss_rate_ = opt_loss_rate;
669 RTC_CHECK_EQ( 687 RTC_CHECK_EQ(
670 0, WebRtcOpus_SetPacketLossRate( 688 0, WebRtcOpus_SetPacketLossRate(
671 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5))); 689 inst_, static_cast<int32_t>(packet_loss_rate_ * 100 + .5)));
672 } 690 }
673 } 691 }
674 692
675 void AudioEncoderOpusImpl::SetTargetBitrate(int bits_per_second) { 693 void AudioEncoderOpus::SetTargetBitrate(int bits_per_second) {
676 config_.bitrate_bps = rtc::SafeClamp<int>( 694 config_.bitrate_bps = rtc::Optional<int>(rtc::SafeClamp<int>(
677 bits_per_second, AudioEncoderOpusConfig::kMinBitrateBps, 695 bits_per_second, kOpusMinBitrateBps, kOpusMaxBitrateBps));
678 AudioEncoderOpusConfig::kMaxBitrateBps);
679 RTC_DCHECK(config_.IsOk()); 696 RTC_DCHECK(config_.IsOk());
680 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, GetBitrateBps(config_))); 697 RTC_CHECK_EQ(0, WebRtcOpus_SetBitRate(inst_, config_.GetBitrateBps()));
681 const auto new_complexity = GetNewComplexity(config_); 698 const auto new_complexity = config_.GetNewComplexity();
682 if (new_complexity && complexity_ != *new_complexity) { 699 if (new_complexity && complexity_ != *new_complexity) {
683 complexity_ = *new_complexity; 700 complexity_ = *new_complexity;
684 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_)); 701 RTC_CHECK_EQ(0, WebRtcOpus_SetComplexity(inst_, complexity_));
685 } 702 }
686 } 703 }
687 704
688 void AudioEncoderOpusImpl::ApplyAudioNetworkAdaptor() { 705 void AudioEncoderOpus::ApplyAudioNetworkAdaptor() {
689 auto config = audio_network_adaptor_->GetEncoderRuntimeConfig(); 706 auto config = audio_network_adaptor_->GetEncoderRuntimeConfig();
690 RTC_DCHECK(!config.frame_length_ms || *config.frame_length_ms == 20 || 707 RTC_DCHECK(!config.frame_length_ms || *config.frame_length_ms == 20 ||
691 *config.frame_length_ms == 60); 708 *config.frame_length_ms == 60);
692 709
693 if (config.bitrate_bps) 710 if (config.bitrate_bps)
694 SetTargetBitrate(*config.bitrate_bps); 711 SetTargetBitrate(*config.bitrate_bps);
695 if (config.frame_length_ms) 712 if (config.frame_length_ms)
696 SetFrameLength(*config.frame_length_ms); 713 SetFrameLength(*config.frame_length_ms);
697 if (config.enable_fec) 714 if (config.enable_fec)
698 SetFec(*config.enable_fec); 715 SetFec(*config.enable_fec);
699 if (config.uplink_packet_loss_fraction) 716 if (config.uplink_packet_loss_fraction)
700 SetProjectedPacketLossRate(*config.uplink_packet_loss_fraction); 717 SetProjectedPacketLossRate(*config.uplink_packet_loss_fraction);
701 if (config.enable_dtx) 718 if (config.enable_dtx)
702 SetDtx(*config.enable_dtx); 719 SetDtx(*config.enable_dtx);
703 if (config.num_channels) 720 if (config.num_channels)
704 SetNumChannelsToEncode(*config.num_channels); 721 SetNumChannelsToEncode(*config.num_channels);
705 } 722 }
706 723
707 std::unique_ptr<AudioNetworkAdaptor> 724 std::unique_ptr<AudioNetworkAdaptor>
708 AudioEncoderOpusImpl::DefaultAudioNetworkAdaptorCreator( 725 AudioEncoderOpus::DefaultAudioNetworkAdaptorCreator(
709 const ProtoString& config_string, 726 const ProtoString& config_string,
710 RtcEventLog* event_log) const { 727 RtcEventLog* event_log) const {
711 AudioNetworkAdaptorImpl::Config config; 728 AudioNetworkAdaptorImpl::Config config;
712 config.event_log = event_log; 729 config.event_log = event_log;
713 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl( 730 return std::unique_ptr<AudioNetworkAdaptor>(new AudioNetworkAdaptorImpl(
714 config, ControllerManagerImpl::Create( 731 config,
715 config_string, NumChannels(), supported_frame_lengths_ms(), 732 ControllerManagerImpl::Create(
716 AudioEncoderOpusConfig::kMinBitrateBps, 733 config_string, NumChannels(), supported_frame_lengths_ms(),
717 num_channels_to_encode_, next_frame_length_ms_, 734 kOpusMinBitrateBps, num_channels_to_encode_, next_frame_length_ms_,
718 GetTargetBitrate(), config_.fec_enabled, GetDtx()))); 735 GetTargetBitrate(), config_.fec_enabled, GetDtx())));
719 } 736 }
720 737
721 void AudioEncoderOpusImpl::MaybeUpdateUplinkBandwidth() { 738 void AudioEncoderOpus::MaybeUpdateUplinkBandwidth() {
722 if (audio_network_adaptor_) { 739 if (audio_network_adaptor_) {
723 int64_t now_ms = rtc::TimeMillis(); 740 int64_t now_ms = rtc::TimeMillis();
724 if (!bitrate_smoother_last_update_time_ || 741 if (!bitrate_smoother_last_update_time_ ||
725 now_ms - *bitrate_smoother_last_update_time_ >= 742 now_ms - *bitrate_smoother_last_update_time_ >=
726 config_.uplink_bandwidth_update_interval_ms) { 743 config_.uplink_bandwidth_update_interval_ms) {
727 rtc::Optional<float> smoothed_bitrate = bitrate_smoother_->GetAverage(); 744 rtc::Optional<float> smoothed_bitrate = bitrate_smoother_->GetAverage();
728 if (smoothed_bitrate) 745 if (smoothed_bitrate)
729 audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate); 746 audio_network_adaptor_->SetUplinkBandwidth(*smoothed_bitrate);
730 bitrate_smoother_last_update_time_ = rtc::Optional<int64_t>(now_ms); 747 bitrate_smoother_last_update_time_ = rtc::Optional<int64_t>(now_ms);
731 } 748 }
732 } 749 }
733 } 750 }
734 751
735 } // namespace webrtc 752 } // namespace webrtc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698