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

Side by Side Diff: webrtc/media/engine/webrtcvoiceengine.cc

Issue 1920123002: Cap the send bitrate for opus and iSAC before passing down to VoE. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Combining "is multi rate" and "max bitrate" into one field/function. Created 4 years, 8 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) 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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/media/engine/webrtcvoiceengine.h ('k') | webrtc/media/engine/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698