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 // The current implementation applies the following values to mono signals, | 76 // The current implementation applies the following values to mono signals, |
77 // and multiplies them by 2 for stereo. | 77 // and multiplies them by 2 for stereo. |
78 const int kOpusBitrateNb = 12000; | 78 const int kOpusBitrateNb = 12000; |
79 const int kOpusBitrateWb = 20000; | 79 const int kOpusBitrateWb = 20000; |
80 const int kOpusBitrateFb = 32000; | 80 const int kOpusBitrateFb = 32000; |
81 | 81 |
82 // Opus bitrate should be in the range between 6000 and 510000. | 82 // Opus bitrate should be in the range between 6000 and 510000. |
83 const int kOpusMinBitrate = 6000; | 83 const int kOpusMinBitrate = 6000; |
84 const int kOpusMaxBitrate = 510000; | 84 const int kOpusMaxBitrate = 510000; |
85 | 85 |
86 // iSAC bitrate should be <= 56000. | |
87 const int kIsacMaxBitrate = 56000; | |
88 | |
86 // Default audio dscp value. | 89 // Default audio dscp value. |
87 // See http://tools.ietf.org/html/rfc2474 for details. | 90 // See http://tools.ietf.org/html/rfc2474 for details. |
88 // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00 | 91 // See also http://tools.ietf.org/html/draft-jennings-rtcweb-qos-00 |
89 const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; | 92 const rtc::DiffServCodePoint kAudioDscpValue = rtc::DSCP_EF; |
90 | 93 |
91 // Constants from voice_engine_defines.h. | 94 // Constants from voice_engine_defines.h. |
92 const int kMinTelephoneEventCode = 0; // RFC4733 (Section 2.3.1) | 95 const int kMinTelephoneEventCode = 0; // RFC4733 (Section 2.3.1) |
93 const int kMaxTelephoneEventCode = 255; | 96 const int kMaxTelephoneEventCode = 255; |
94 const int kMinTelephoneEventDuration = 100; | 97 const int kMinTelephoneEventDuration = 100; |
95 const int kMaxTelephoneEventDuration = 60000; // Actual limit is 2^16 | 98 const int kMaxTelephoneEventDuration = 60000; // Actual limit is 2^16 |
(...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
298 return result; | 301 return result; |
299 } | 302 } |
300 | 303 |
301 static bool ToCodecInst(const AudioCodec& in, | 304 static bool ToCodecInst(const AudioCodec& in, |
302 webrtc::CodecInst* out) { | 305 webrtc::CodecInst* out) { |
303 for (webrtc::CodecInst voe_codec : webrtc::acm2::RentACodec::Database()) { | 306 for (webrtc::CodecInst voe_codec : webrtc::acm2::RentACodec::Database()) { |
304 // Change the sample rate of G722 to 8000 to match SDP. | 307 // Change the sample rate of G722 to 8000 to match SDP. |
305 MaybeFixupG722(&voe_codec, 8000); | 308 MaybeFixupG722(&voe_codec, 8000); |
306 AudioCodec codec(voe_codec.pltype, voe_codec.plname, voe_codec.plfreq, | 309 AudioCodec codec(voe_codec.pltype, voe_codec.plname, voe_codec.plfreq, |
307 voe_codec.rate, voe_codec.channels); | 310 voe_codec.rate, voe_codec.channels); |
308 bool multi_rate = IsCodecMultiRate(voe_codec); | 311 // This function returns a nonempty value if the codec is multi-rate. |
312 bool multi_rate = | |
313 bool(WebRtcVoiceCodecs::MaxBitrateBpsForMultiRateCodec(voe_codec)); | |
309 // Allow arbitrary rates for ISAC to be specified. | 314 // Allow arbitrary rates for ISAC to be specified. |
310 if (multi_rate) { | 315 if (multi_rate) { |
311 // Set codec.bitrate to 0 so the check for codec.Matches() passes. | 316 // Set codec.bitrate to 0 so the check for codec.Matches() passes. |
312 codec.bitrate = 0; | 317 codec.bitrate = 0; |
313 } | 318 } |
314 if (codec.Matches(in)) { | 319 if (codec.Matches(in)) { |
315 if (out) { | 320 if (out) { |
316 // Fixup the payload type. | 321 // Fixup the payload type. |
317 voe_codec.pltype = in.id; | 322 voe_codec.pltype = in.id; |
318 | 323 |
(...skipping 12 matching lines...) Expand all Loading... | |
331 voe_codec.rate = (in.bitrate > 0) ? in.bitrate : -1; | 336 voe_codec.rate = (in.bitrate > 0) ? in.bitrate : -1; |
332 } | 337 } |
333 *out = voe_codec; | 338 *out = voe_codec; |
334 } | 339 } |
335 return true; | 340 return true; |
336 } | 341 } |
337 } | 342 } |
338 return false; | 343 return false; |
339 } | 344 } |
340 | 345 |
341 static bool IsCodecMultiRate(const webrtc::CodecInst& codec) { | 346 static rtc::Optional<int> MaxBitrateBpsForMultiRateCodec( |
347 const webrtc::CodecInst& codec) { | |
342 for (size_t i = 0; i < arraysize(kCodecPrefs); ++i) { | 348 for (size_t i = 0; i < arraysize(kCodecPrefs); ++i) { |
343 if (IsCodec(codec, kCodecPrefs[i].name) && | 349 if (IsCodec(codec, kCodecPrefs[i].name) && |
344 kCodecPrefs[i].clockrate == codec.plfreq) { | 350 kCodecPrefs[i].clockrate == codec.plfreq) { |
345 return kCodecPrefs[i].is_multi_rate; | 351 return kCodecPrefs[i].max_bitrate_bps; |
346 } | 352 } |
347 } | 353 } |
348 return false; | 354 return rtc::Optional<int>(); |
349 } | 355 } |
350 | 356 |
351 // If the AudioCodec param kCodecParamPTime is set, then we will set it to | 357 // If the AudioCodec param kCodecParamPTime is set, then we will set it to |
352 // codec pacsize if it's valid, or we will pick the next smallest value we | 358 // codec pacsize if it's valid, or we will pick the next smallest value we |
353 // support. | 359 // support. |
354 // TODO(Brave): Query supported packet sizes from ACM when the API is ready. | 360 // TODO(Brave): Query supported packet sizes from ACM when the API is ready. |
355 static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) { | 361 static bool SetPTimeAsPacketSize(webrtc::CodecInst* codec, int ptime_ms) { |
356 for (const CodecPref& codec_pref : kCodecPrefs) { | 362 for (const CodecPref& codec_pref : kCodecPrefs) { |
357 if ((IsCodec(*codec, codec_pref.name) && | 363 if ((IsCodec(*codec, codec_pref.name) && |
358 codec_pref.clockrate == codec->plfreq) || | 364 codec_pref.clockrate == codec->plfreq) || |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
409 return nullptr; | 415 return nullptr; |
410 } | 416 } |
411 | 417 |
412 private: | 418 private: |
413 static const int kMaxNumPacketSize = 6; | 419 static const int kMaxNumPacketSize = 6; |
414 struct CodecPref { | 420 struct CodecPref { |
415 const char* name; | 421 const char* name; |
416 int clockrate; | 422 int clockrate; |
417 size_t channels; | 423 size_t channels; |
418 int payload_type; | 424 int payload_type; |
419 bool is_multi_rate; | |
420 int packet_sizes_ms[kMaxNumPacketSize]; | 425 int packet_sizes_ms[kMaxNumPacketSize]; |
426 // Nonempty if it's a multirate codec. | |
The Sun (google.com)
2016/04/26 22:18:08
Ah, what I had in mind was just to make the return
| |
427 rtc::Optional<int> max_bitrate_bps; | |
421 }; | 428 }; |
422 // Note: keep the supported packet sizes in ascending order. | 429 // Note: keep the supported packet sizes in ascending order. |
423 static const CodecPref kCodecPrefs[12]; | 430 static const CodecPref kCodecPrefs[12]; |
424 | 431 |
425 static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) { | 432 static int SelectPacketSize(const CodecPref& codec_pref, int ptime_ms) { |
426 int selected_packet_size_ms = codec_pref.packet_sizes_ms[0]; | 433 int selected_packet_size_ms = codec_pref.packet_sizes_ms[0]; |
427 for (int packet_size_ms : codec_pref.packet_sizes_ms) { | 434 for (int packet_size_ms : codec_pref.packet_sizes_ms) { |
428 if (packet_size_ms && packet_size_ms <= ptime_ms) { | 435 if (packet_size_ms && packet_size_ms <= ptime_ms) { |
429 selected_packet_size_ms = packet_size_ms; | 436 selected_packet_size_ms = packet_size_ms; |
430 } | 437 } |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
477 if (codec.id == red_pt) { | 484 if (codec.id == red_pt) { |
478 return &codec; | 485 return &codec; |
479 } | 486 } |
480 } | 487 } |
481 LOG(LS_WARNING) << "RED params " << red_params << " are invalid."; | 488 LOG(LS_WARNING) << "RED params " << red_params << " are invalid."; |
482 return nullptr; | 489 return nullptr; |
483 } | 490 } |
484 }; | 491 }; |
485 | 492 |
486 const WebRtcVoiceCodecs::CodecPref WebRtcVoiceCodecs::kCodecPrefs[12] = { | 493 const WebRtcVoiceCodecs::CodecPref WebRtcVoiceCodecs::kCodecPrefs[12] = { |
487 { kOpusCodecName, 48000, 2, 111, true, { 10, 20, 40, 60 } }, | 494 {kOpusCodecName, |
488 { kIsacCodecName, 16000, 1, 103, true, { 30, 60 } }, | 495 48000, |
489 { kIsacCodecName, 32000, 1, 104, true, { 30 } }, | 496 2, |
490 // G722 should be advertised as 8000 Hz because of the RFC "bug". | 497 111, |
491 { kG722CodecName, 8000, 1, 9, false, { 10, 20, 30, 40, 50, 60 } }, | 498 {10, 20, 40, 60}, |
492 { kIlbcCodecName, 8000, 1, 102, false, { 20, 30, 40, 60 } }, | 499 rtc::Optional<int>(kOpusMaxBitrate)}, |
493 { kPcmuCodecName, 8000, 1, 0, false, { 10, 20, 30, 40, 50, 60 } }, | 500 {kIsacCodecName, |
494 { kPcmaCodecName, 8000, 1, 8, false, { 10, 20, 30, 40, 50, 60 } }, | 501 16000, |
495 { kCnCodecName, 32000, 1, 106, false, { } }, | 502 1, |
496 { kCnCodecName, 16000, 1, 105, false, { } }, | 503 103, |
497 { kCnCodecName, 8000, 1, 13, false, { } }, | 504 {30, 60}, |
498 { kRedCodecName, 8000, 1, 127, false, { } }, | 505 rtc::Optional<int>(kIsacMaxBitrate)}, |
499 { kDtmfCodecName, 8000, 1, 126, false, { } }, | 506 {kIsacCodecName, 32000, 1, 104, {30}, rtc::Optional<int>(kIsacMaxBitrate)}, |
507 // G722 should be advertised as 8000 Hz because of the RFC "bug". | |
508 {kG722CodecName, 8000, 1, 9, {10, 20, 30, 40, 50, 60}}, | |
509 {kIlbcCodecName, 8000, 1, 102, {20, 30, 40, 60}}, | |
510 {kPcmuCodecName, 8000, 1, 0, {10, 20, 30, 40, 50, 60}}, | |
511 {kPcmaCodecName, 8000, 1, 8, {10, 20, 30, 40, 50, 60}}, | |
512 {kCnCodecName, 32000, 1, 106, {}}, | |
513 {kCnCodecName, 16000, 1, 105, {}}, | |
514 {kCnCodecName, 8000, 1, 13, {}}, | |
515 {kRedCodecName, 8000, 1, 127, {}}, | |
516 {kDtmfCodecName, 8000, 1, 126, {}}, | |
500 }; | 517 }; |
501 } // namespace { | 518 } // namespace { |
502 | 519 |
503 bool WebRtcVoiceEngine::ToCodecInst(const AudioCodec& in, | 520 bool WebRtcVoiceEngine::ToCodecInst(const AudioCodec& in, |
504 webrtc::CodecInst* out) { | 521 webrtc::CodecInst* out) { |
505 return WebRtcVoiceCodecs::ToCodecInst(in, out); | 522 return WebRtcVoiceCodecs::ToCodecInst(in, out); |
506 } | 523 } |
507 | 524 |
508 WebRtcVoiceEngine::WebRtcVoiceEngine(webrtc::AudioDeviceModule* adm) | 525 WebRtcVoiceEngine::WebRtcVoiceEngine(webrtc::AudioDeviceModule* adm) |
509 : WebRtcVoiceEngine(adm, new VoEWrapper()) { | 526 : WebRtcVoiceEngine(adm, new VoEWrapper()) { |
(...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1360 std::vector<webrtc::RtpExtension> filtered_extensions = | 1377 std::vector<webrtc::RtpExtension> filtered_extensions = |
1361 FilterRtpExtensions(params.extensions, | 1378 FilterRtpExtensions(params.extensions, |
1362 webrtc::RtpExtension::IsSupportedForAudio, true); | 1379 webrtc::RtpExtension::IsSupportedForAudio, true); |
1363 if (send_rtp_extensions_ != filtered_extensions) { | 1380 if (send_rtp_extensions_ != filtered_extensions) { |
1364 send_rtp_extensions_.swap(filtered_extensions); | 1381 send_rtp_extensions_.swap(filtered_extensions); |
1365 for (auto& it : send_streams_) { | 1382 for (auto& it : send_streams_) { |
1366 it.second->RecreateAudioSendStream(send_rtp_extensions_); | 1383 it.second->RecreateAudioSendStream(send_rtp_extensions_); |
1367 } | 1384 } |
1368 } | 1385 } |
1369 | 1386 |
1370 if (!SetSendBitrate(params.max_bandwidth_bps)) { | 1387 if (!SetMaxSendBitrate(params.max_bandwidth_bps)) { |
1371 return false; | 1388 return false; |
1372 } | 1389 } |
1373 return SetOptions(params.options); | 1390 return SetOptions(params.options); |
1374 } | 1391 } |
1375 | 1392 |
1376 bool WebRtcVoiceMediaChannel::SetRecvParameters( | 1393 bool WebRtcVoiceMediaChannel::SetRecvParameters( |
1377 const AudioRecvParameters& params) { | 1394 const AudioRecvParameters& params) { |
1378 TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetRecvParameters"); | 1395 TRACE_EVENT0("webrtc", "WebRtcVoiceMediaChannel::SetRecvParameters"); |
1379 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 1396 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
1380 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetRecvParameters: " | 1397 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetRecvParameters: " |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1740 << " Hz on channel " | 1757 << " Hz on channel " |
1741 << channel; | 1758 << channel; |
1742 if (engine()->voe()->codec()->SetOpusMaxPlaybackRate( | 1759 if (engine()->voe()->codec()->SetOpusMaxPlaybackRate( |
1743 channel, send_codec_spec_.opus_max_playback_rate) == -1) { | 1760 channel, send_codec_spec_.opus_max_playback_rate) == -1) { |
1744 LOG_RTCERR2(SetOpusMaxPlaybackRate, channel, | 1761 LOG_RTCERR2(SetOpusMaxPlaybackRate, channel, |
1745 send_codec_spec_.opus_max_playback_rate); | 1762 send_codec_spec_.opus_max_playback_rate); |
1746 return false; | 1763 return false; |
1747 } | 1764 } |
1748 } | 1765 } |
1749 } | 1766 } |
1750 // TODO(solenberg): SetSendBitrate() yields another call to SetSendCodec(). | 1767 // TODO(solenberg): SetMaxSendBitrate() yields another call to SetSendCodec(). |
1751 // Check if it is possible to fuse with the previous call in this function. | 1768 // Check if it is possible to fuse with the previous call in this function. |
1752 SetChannelParameters(channel, rtp_parameters); | 1769 SetChannelParameters(channel, rtp_parameters); |
1753 | 1770 |
1754 // Set the CN payloadtype and the VAD status. | 1771 // Set the CN payloadtype and the VAD status. |
1755 if (send_codec_spec_.cng_payload_type != -1) { | 1772 if (send_codec_spec_.cng_payload_type != -1) { |
1756 // The CN payload type for 8000 Hz clockrate is fixed at 13. | 1773 // The CN payload type for 8000 Hz clockrate is fixed at 13. |
1757 if (send_codec_spec_.cng_plfreq != 8000) { | 1774 if (send_codec_spec_.cng_plfreq != 8000) { |
1758 webrtc::PayloadFrequencies cn_freq; | 1775 webrtc::PayloadFrequencies cn_freq; |
1759 switch (send_codec_spec_.cng_plfreq) { | 1776 switch (send_codec_spec_.cng_plfreq) { |
1760 case 16000: | 1777 case 16000: |
(...skipping 615 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2376 } | 2393 } |
2377 } | 2394 } |
2378 | 2395 |
2379 webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing(); | 2396 webrtc::AudioProcessing* ap = engine()->voe()->base()->audio_processing(); |
2380 if (ap) { | 2397 if (ap) { |
2381 ap->set_output_will_be_muted(all_muted); | 2398 ap->set_output_will_be_muted(all_muted); |
2382 } | 2399 } |
2383 return true; | 2400 return true; |
2384 } | 2401 } |
2385 | 2402 |
2386 bool WebRtcVoiceMediaChannel::SetSendBitrate(int bps) { | 2403 bool WebRtcVoiceMediaChannel::SetMaxSendBitrate(int bps) { |
2387 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetSendBitrate."; | 2404 LOG(LS_INFO) << "WebRtcVoiceMediaChannel::SetMaxSendBitrate."; |
2388 send_bitrate_bps_ = bps; | 2405 max_send_bitrate_bps_ = bps; |
2389 | 2406 |
2390 for (const auto& kv : send_streams_) { | 2407 for (const auto& kv : send_streams_) { |
2391 if (!SetChannelParameters(kv.second->channel(), | 2408 if (!SetChannelParameters(kv.second->channel(), |
2392 kv.second->rtp_parameters())) { | 2409 kv.second->rtp_parameters())) { |
2393 return false; | 2410 return false; |
2394 } | 2411 } |
2395 } | 2412 } |
2396 return true; | 2413 return true; |
2397 } | 2414 } |
2398 | 2415 |
2399 bool WebRtcVoiceMediaChannel::SetChannelParameters( | 2416 bool WebRtcVoiceMediaChannel::SetChannelParameters( |
2400 int channel, | 2417 int channel, |
2401 const webrtc::RtpParameters& parameters) { | 2418 const webrtc::RtpParameters& parameters) { |
2402 RTC_CHECK_EQ(1UL, parameters.encodings.size()); | 2419 RTC_CHECK_EQ(1UL, parameters.encodings.size()); |
2403 // TODO(deadbeef): Handle setting parameters with a list of codecs in a | 2420 // TODO(deadbeef): Handle setting parameters with a list of codecs in a |
2404 // different order (which should change the send codec). | 2421 // different order (which should change the send codec). |
2405 return SetSendBitrate( | 2422 return SetMaxSendBitrate( |
2406 channel, | 2423 channel, MinPositive(max_send_bitrate_bps_, |
2407 MinPositive(send_bitrate_bps_, parameters.encodings[0].max_bitrate_bps)); | 2424 parameters.encodings[0].max_bitrate_bps)); |
2408 } | 2425 } |
2409 | 2426 |
2410 bool WebRtcVoiceMediaChannel::SetSendBitrate(int channel, int bps) { | 2427 bool WebRtcVoiceMediaChannel::SetMaxSendBitrate(int channel, int bps) { |
2411 // Bitrate is auto by default. | 2428 // Bitrate is auto by default. |
2412 // TODO(bemasc): Fix this so that if SetMaxSendBandwidth(50) is followed by | 2429 // TODO(bemasc): Fix this so that if SetMaxSendBandwidth(50) is followed by |
2413 // SetMaxSendBandwith(0), the second call removes the previous limit. | 2430 // SetMaxSendBandwith(0), the second call removes the previous limit. |
2414 if (bps <= 0) | 2431 if (bps <= 0) { |
2415 return true; | 2432 return true; |
2433 } | |
2416 | 2434 |
2417 if (!HasSendCodec()) { | 2435 if (!HasSendCodec()) { |
2418 LOG(LS_INFO) << "The send codec has not been set up yet. " | 2436 LOG(LS_INFO) << "The send codec has not been set up yet. " |
2419 << "The send bitrate setting will be applied later."; | 2437 << "The send bitrate setting will be applied later."; |
2420 return true; | 2438 return true; |
2421 } | 2439 } |
2422 | 2440 |
2423 webrtc::CodecInst codec = send_codec_spec_.codec_inst; | 2441 webrtc::CodecInst codec = send_codec_spec_.codec_inst; |
2424 bool is_multi_rate = WebRtcVoiceCodecs::IsCodecMultiRate(codec); | 2442 // This function returns a nonempty value if the codec is multi-rate. |
2443 rtc::Optional<int> max_bitrate_bps = | |
2444 WebRtcVoiceCodecs::MaxBitrateBpsForMultiRateCodec(codec); | |
2425 | 2445 |
2426 if (is_multi_rate) { | 2446 if (max_bitrate_bps) { |
2427 // If codec is multi-rate then just set the bitrate. | 2447 // If codec is multi-rate then just set the bitrate. |
2428 codec.rate = bps; | 2448 codec.rate = std::min(bps, *max_bitrate_bps); |
2449 LOG(LS_INFO) << "Setting codec " << codec.plname << " to bitrate " << bps | |
2450 << " bps."; | |
2429 if (!SetSendCodec(channel, codec)) { | 2451 if (!SetSendCodec(channel, codec)) { |
2430 LOG(LS_INFO) << "Failed to set codec " << codec.plname << " to bitrate " | 2452 LOG(LS_ERROR) << "Failed to set codec " << codec.plname << " to bitrate " |
2431 << bps << " bps."; | 2453 << bps << " bps."; |
2432 return false; | 2454 return false; |
2433 } | 2455 } |
2434 return true; | 2456 return true; |
2435 } else { | 2457 } else { |
2436 // If codec is not multi-rate and |bps| is less than the fixed bitrate | 2458 // If codec is not multi-rate and |bps| is less than the fixed bitrate |
2437 // then fail. If codec is not multi-rate and |bps| exceeds or equal the | 2459 // then fail. If codec is not multi-rate and |bps| exceeds or equal the |
2438 // fixed bitrate then ignore. | 2460 // fixed bitrate then ignore. |
2439 if (bps < codec.rate) { | 2461 if (bps < codec.rate) { |
2440 LOG(LS_INFO) << "Failed to set codec " << codec.plname | 2462 LOG(LS_ERROR) << "Failed to set codec " << codec.plname << " to bitrate " |
2441 << " to bitrate " << bps << " bps" | 2463 << bps << " bps" |
2442 << ", requires at least " << codec.rate << " bps."; | 2464 << ", requires at least " << codec.rate << " bps."; |
2443 return false; | 2465 return false; |
2444 } | 2466 } |
2445 return true; | 2467 return true; |
2446 } | 2468 } |
2447 } | 2469 } |
2448 | 2470 |
2449 void WebRtcVoiceMediaChannel::OnReadyToSend(bool ready) { | 2471 void WebRtcVoiceMediaChannel::OnReadyToSend(bool ready) { |
2450 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); | 2472 RTC_DCHECK(worker_thread_checker_.CalledOnValidThread()); |
2451 LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); | 2473 LOG(LS_VERBOSE) << "OnReadyToSend: " << (ready ? "Ready." : "Not ready."); |
2452 call_->SignalChannelNetworkState( | 2474 call_->SignalChannelNetworkState( |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2575 } | 2597 } |
2576 } else { | 2598 } else { |
2577 LOG(LS_INFO) << "Stopping playout for channel #" << channel; | 2599 LOG(LS_INFO) << "Stopping playout for channel #" << channel; |
2578 engine()->voe()->base()->StopPlayout(channel); | 2600 engine()->voe()->base()->StopPlayout(channel); |
2579 } | 2601 } |
2580 return true; | 2602 return true; |
2581 } | 2603 } |
2582 } // namespace cricket | 2604 } // namespace cricket |
2583 | 2605 |
2584 #endif // HAVE_WEBRTC_VOICE | 2606 #endif // HAVE_WEBRTC_VOICE |
OLD | NEW |