| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2004 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2004 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 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 // draft-spittka-payload-rtp-opus-03 | 76 // draft-spittka-payload-rtp-opus-03 |
| 77 | 77 |
| 78 // Recommended bitrates: | 78 // Recommended bitrates: |
| 79 // 8-12 kb/s for NB speech, | 79 // 8-12 kb/s for NB speech, |
| 80 // 16-20 kb/s for WB speech, | 80 // 16-20 kb/s for WB speech, |
| 81 // 28-40 kb/s for FB speech, | 81 // 28-40 kb/s for FB speech, |
| 82 // 48-64 kb/s for FB mono music, and | 82 // 48-64 kb/s for FB mono music, and |
| 83 // 64-128 kb/s for FB stereo music. | 83 // 64-128 kb/s for FB stereo music. |
| 84 // The current implementation applies the following values to mono signals, | 84 // The current implementation applies the following values to mono signals, |
| 85 // and multiplies them by 2 for stereo. | 85 // and multiplies them by 2 for stereo. |
| 86 const int kOpusBitrateNb = 12000; | 86 const int kOpusBitrateNbBps = 12000; |
| 87 const int kOpusBitrateWb = 20000; | 87 const int kOpusBitrateWbBps = 20000; |
| 88 const int kOpusBitrateFb = 32000; | 88 const int kOpusBitrateFbBps = 32000; |
| 89 | 89 |
| 90 // Opus bitrate should be in the range between 6000 and 510000. | 90 // Opus bitrate should be in the range between 6000 and 510000. |
| 91 const int kOpusMinBitrate = 6000; | 91 const int kOpusMinBitrateBps = 6000; |
| 92 const int kOpusMaxBitrate = 510000; | 92 const int kOpusMaxBitrateBps = 510000; |
| 93 | 93 |
| 94 // iSAC bitrate should be <= 56000. | 94 // iSAC bitrate should be <= 56000. |
| 95 const int kIsacMaxBitrate = 56000; | 95 const int kIsacMaxBitrateBps = 56000; |
| 96 | 96 |
| 97 // Default audio dscp value. | 97 // Default audio dscp value. |
| 98 // See http://tools.ietf.org/html/rfc2474 for details. | 98 // See http://tools.ietf.org/html/rfc2474 for details. |
| 99 // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00 | 99 // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00 |
| 100 const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; | 100 const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; |
| 101 | 101 |
| 102 // Constants from voice_engine_defines.h. | 102 // Constants from voice_engine_defines.h. |
| 103 const int kMinTelephoneEventCode = 0; // RFC4733 (Section 2.3.1) | 103 const int kMinTelephoneEventCode = 0; // RFC4733 (Section 2.3.1) |
| 104 const int kMaxTelephoneEventCode = 255; | 104 const int kMaxTelephoneEventCode = 255; |
| 105 const int kMinTelephoneEventDuration = 100; | 105 const int kMinTelephoneEventDuration = 100; |
| (...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 // clamp it. Returns the Opus bit rate for operation. | 215 // clamp it. Returns the Opus bit rate for operation. |
| 216 int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) { | 216 int GetOpusBitrate(const AudioCodec& codec, int max_playback_rate) { |
| 217 int bitrate = 0; | 217 int bitrate = 0; |
| 218 bool use_param = true; | 218 bool use_param = true; |
| 219 if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) { | 219 if (!codec.GetParam(kCodecParamMaxAverageBitrate, &bitrate)) { |
| 220 bitrate = codec.bitrate; | 220 bitrate = codec.bitrate; |
| 221 use_param = false; | 221 use_param = false; |
| 222 } | 222 } |
| 223 if (bitrate <= 0) { | 223 if (bitrate <= 0) { |
| 224 if (max_playback_rate <= 8000) { | 224 if (max_playback_rate <= 8000) { |
| 225 bitrate = kOpusBitrateNb; | 225 bitrate = kOpusBitrateNbBps; |
| 226 } else if (max_playback_rate <= 16000) { | 226 } else if (max_playback_rate <= 16000) { |
| 227 bitrate = kOpusBitrateWb; | 227 bitrate = kOpusBitrateWbBps; |
| 228 } else { | 228 } else { |
| 229 bitrate = kOpusBitrateFb; | 229 bitrate = kOpusBitrateFbBps; |
| 230 } | 230 } |
| 231 | 231 |
| 232 if (IsCodecFeatureEnabled(codec, kCodecParamStereo)) { | 232 if (IsCodecFeatureEnabled(codec, kCodecParamStereo)) { |
| 233 bitrate *= 2; | 233 bitrate *= 2; |
| 234 } | 234 } |
| 235 } else if (bitrate < kOpusMinBitrate || bitrate > kOpusMaxBitrate) { | 235 } else if (bitrate < kOpusMinBitrateBps || bitrate > kOpusMaxBitrateBps) { |
| 236 bitrate = (bitrate < kOpusMinBitrate) ? kOpusMinBitrate : kOpusMaxBitrate; | 236 bitrate = (bitrate < kOpusMinBitrateBps) ? kOpusMinBitrateBps |
| 237 : kOpusMaxBitrateBps; |
| 237 std::string rate_source = | 238 std::string rate_source = |
| 238 use_param ? "Codec parameter \"maxaveragebitrate\"" : | 239 use_param ? "Codec parameter \"maxaveragebitrate\"" : |
| 239 "Supplied Opus bitrate"; | 240 "Supplied Opus bitrate"; |
| 240 LOG(LS_WARNING) << rate_source | 241 LOG(LS_WARNING) << rate_source |
| 241 << " is invalid and is replaced by: " | 242 << " is invalid and is replaced by: " |
| 242 << bitrate; | 243 << bitrate; |
| 243 } | 244 } |
| 244 return bitrate; | 245 return bitrate; |
| 245 } | 246 } |
| 246 | 247 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 471 if (IsCodec(*voe_codec, kG722CodecName)) { | 472 if (IsCodec(*voe_codec, kG722CodecName)) { |
| 472 // If the ASSERT triggers, the codec definition in WebRTC VoiceEngine | 473 // If the ASSERT triggers, the codec definition in WebRTC VoiceEngine |
| 473 // has changed, and this special case is no longer needed. | 474 // has changed, and this special case is no longer needed. |
| 474 RTC_DCHECK(voe_codec->plfreq != new_plfreq); | 475 RTC_DCHECK(voe_codec->plfreq != new_plfreq); |
| 475 voe_codec->plfreq = new_plfreq; | 476 voe_codec->plfreq = new_plfreq; |
| 476 } | 477 } |
| 477 } | 478 } |
| 478 }; | 479 }; |
| 479 | 480 |
| 480 const WebRtcVoiceCodecs::CodecPref WebRtcVoiceCodecs::kCodecPrefs[11] = { | 481 const WebRtcVoiceCodecs::CodecPref WebRtcVoiceCodecs::kCodecPrefs[11] = { |
| 481 {kOpusCodecName, 48000, 2, 111, true, {10, 20, 40, 60}, kOpusMaxBitrate}, | 482 {kOpusCodecName, 48000, 2, 111, true, {10, 20, 40, 60}, kOpusMaxBitrateBps}, |
| 482 {kIsacCodecName, 16000, 1, 103, true, {30, 60}, kIsacMaxBitrate}, | 483 {kIsacCodecName, 16000, 1, 103, true, {30, 60}, kIsacMaxBitrateBps}, |
| 483 {kIsacCodecName, 32000, 1, 104, true, {30}, kIsacMaxBitrate}, | 484 {kIsacCodecName, 32000, 1, 104, true, {30}, kIsacMaxBitrateBps}, |
| 484 // G722 should be advertised as 8000 Hz because of the RFC "bug". | 485 // G722 should be advertised as 8000 Hz because of the RFC "bug". |
| 485 {kG722CodecName, 8000, 1, 9, false, {10, 20, 30, 40, 50, 60}}, | 486 {kG722CodecName, 8000, 1, 9, false, {10, 20, 30, 40, 50, 60}}, |
| 486 {kIlbcCodecName, 8000, 1, 102, false, {20, 30, 40, 60}}, | 487 {kIlbcCodecName, 8000, 1, 102, false, {20, 30, 40, 60}}, |
| 487 {kPcmuCodecName, 8000, 1, 0, false, {10, 20, 30, 40, 50, 60}}, | 488 {kPcmuCodecName, 8000, 1, 0, false, {10, 20, 30, 40, 50, 60}}, |
| 488 {kPcmaCodecName, 8000, 1, 8, false, {10, 20, 30, 40, 50, 60}}, | 489 {kPcmaCodecName, 8000, 1, 8, false, {10, 20, 30, 40, 50, 60}}, |
| 489 {kCnCodecName, 32000, 1, 106, false, {}}, | 490 {kCnCodecName, 32000, 1, 106, false, {}}, |
| 490 {kCnCodecName, 16000, 1, 105, false, {}}, | 491 {kCnCodecName, 16000, 1, 105, false, {}}, |
| 491 {kCnCodecName, 8000, 1, 13, false, {}}, | 492 {kCnCodecName, 8000, 1, 13, false, {}}, |
| 492 {kDtmfCodecName, 8000, 1, 126, false, {}} | 493 {kDtmfCodecName, 8000, 1, 126, false, {}}}; |
| 493 }; | |
| 494 | 494 |
| 495 rtc::Optional<int> ComputeSendBitrate(int max_send_bitrate_bps, | 495 rtc::Optional<int> ComputeSendBitrate(int max_send_bitrate_bps, |
| 496 int rtp_max_bitrate_bps, | 496 int rtp_max_bitrate_bps, |
| 497 const webrtc::CodecInst& codec_inst) { | 497 const webrtc::CodecInst& codec_inst) { |
| 498 const int bps = MinPositive(max_send_bitrate_bps, rtp_max_bitrate_bps); | 498 const int bps = MinPositive(max_send_bitrate_bps, rtp_max_bitrate_bps); |
| 499 const int codec_rate = codec_inst.rate; | 499 const int codec_rate = codec_inst.rate; |
| 500 | 500 |
| 501 if (bps <= 0) { | 501 if (bps <= 0) { |
| 502 return rtc::Optional<int>(codec_rate); | 502 return rtc::Optional<int>(codec_rate); |
| 503 } | 503 } |
| (...skipping 881 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1385 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1385 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| 1386 if (stream_) { | 1386 if (stream_) { |
| 1387 call_->DestroyAudioSendStream(stream_); | 1387 call_->DestroyAudioSendStream(stream_); |
| 1388 stream_ = nullptr; | 1388 stream_ = nullptr; |
| 1389 } | 1389 } |
| 1390 RTC_DCHECK(!stream_); | 1390 RTC_DCHECK(!stream_); |
| 1391 if (webrtc::field_trial::FindFullName("WebRTC-AdaptAudioBitrate") == | 1391 if (webrtc::field_trial::FindFullName("WebRTC-AdaptAudioBitrate") == |
| 1392 "Enabled") { | 1392 "Enabled") { |
| 1393 // TODO(mflodman): Keep testing this and set proper values. | 1393 // TODO(mflodman): Keep testing this and set proper values. |
| 1394 // Note: This is an early experiment currently only supported by Opus. | 1394 // Note: This is an early experiment currently only supported by Opus. |
| 1395 config_.min_bitrate_kbps = kOpusMinBitrate; | 1395 config_.min_bitrate_bps = kOpusMinBitrateBps; |
| 1396 config_.max_bitrate_kbps = kOpusBitrateFb; | 1396 config_.max_bitrate_bps = kOpusBitrateFbBps; |
| 1397 } | 1397 } |
| 1398 stream_ = call_->CreateAudioSendStream(config_); | 1398 stream_ = call_->CreateAudioSendStream(config_); |
| 1399 RTC_CHECK(stream_); | 1399 RTC_CHECK(stream_); |
| 1400 UpdateSendState(); | 1400 UpdateSendState(); |
| 1401 } | 1401 } |
| 1402 | 1402 |
| 1403 rtc::ThreadChecker worker_thread_checker_; | 1403 rtc::ThreadChecker worker_thread_checker_; |
| 1404 rtc::RaceChecker audio_capture_race_checker_; | 1404 rtc::RaceChecker audio_capture_race_checker_; |
| 1405 webrtc::AudioTransport* const voe_audio_transport_ = nullptr; | 1405 webrtc::AudioTransport* const voe_audio_transport_ = nullptr; |
| 1406 webrtc::Call* call_ = nullptr; | 1406 webrtc::Call* call_ = nullptr; |
| (...skipping 1165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2572 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 2572 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
| 2573 const auto it = send_streams_.find(ssrc); | 2573 const auto it = send_streams_.find(ssrc); |
| 2574 if (it != send_streams_.end()) { | 2574 if (it != send_streams_.end()) { |
| 2575 return it->second->channel(); | 2575 return it->second->channel(); |
| 2576 } | 2576 } |
| 2577 return -1; | 2577 return -1; |
| 2578 } | 2578 } |
| 2579 } // namespace cricket | 2579 } // namespace cricket |
| 2580 | 2580 |
| 2581 #endif // HAVE_WEBRTC_VOICE | 2581 #endif // HAVE_WEBRTC_VOICE |
| OLD | NEW |