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

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

Issue 1315903004: ABANDONED: Remove the default receive channel in WVoE. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@mediacontroller
Patch Set: test Created 5 years, 2 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
« no previous file with comments | « talk/media/webrtc/webrtcvoiceengine.h ('k') | talk/media/webrtc/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * libjingle 2 * libjingle
3 * Copyright 2004 Google Inc. 3 * Copyright 2004 Google Inc.
4 * 4 *
5 * Redistribution and use in source and binary forms, with or without 5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met: 6 * modification, are permitted provided that the following conditions are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright notice, 8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer. 9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice, 10 * 2. Redistributions in binary form must reproduce the above copyright notice,
(...skipping 356 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 AudioOptions GetDefaultEngineOptions() { 367 AudioOptions GetDefaultEngineOptions() {
368 AudioOptions options; 368 AudioOptions options;
369 options.echo_cancellation.Set(true); 369 options.echo_cancellation.Set(true);
370 options.auto_gain_control.Set(true); 370 options.auto_gain_control.Set(true);
371 options.noise_suppression.Set(true); 371 options.noise_suppression.Set(true);
372 options.highpass_filter.Set(true); 372 options.highpass_filter.Set(true);
373 options.stereo_swapping.Set(false); 373 options.stereo_swapping.Set(false);
374 options.audio_jitter_buffer_max_packets.Set(50); 374 options.audio_jitter_buffer_max_packets.Set(50);
375 options.audio_jitter_buffer_fast_accelerate.Set(false); 375 options.audio_jitter_buffer_fast_accelerate.Set(false);
376 options.typing_detection.Set(true); 376 options.typing_detection.Set(true);
377 options.conference_mode.Set(false);
378 options.adjust_agc_delta.Set(0); 377 options.adjust_agc_delta.Set(0);
379 options.experimental_agc.Set(false); 378 options.experimental_agc.Set(false);
380 options.extended_filter_aec.Set(false); 379 options.extended_filter_aec.Set(false);
381 options.delay_agnostic_aec.Set(false); 380 options.delay_agnostic_aec.Set(false);
382 options.experimental_ns.Set(false); 381 options.experimental_ns.Set(false);
383 options.aec_dump.Set(false); 382 options.aec_dump.Set(false);
384 return options; 383 return options;
385 } 384 }
386 385
387 std::string GetEnableString(bool enable) { 386 std::string GetEnableString(bool enable) {
(...skipping 1013 matching lines...) Expand 10 before | Expand all | Expand 10 after
1401 send_bitrate_bps_(0), 1400 send_bitrate_bps_(0),
1402 options_(), 1401 options_(),
1403 dtmf_allowed_(false), 1402 dtmf_allowed_(false),
1404 desired_playout_(false), 1403 desired_playout_(false),
1405 nack_enabled_(false), 1404 nack_enabled_(false),
1406 playout_(false), 1405 playout_(false),
1407 typing_noise_detected_(false), 1406 typing_noise_detected_(false),
1408 desired_send_(SEND_NOTHING), 1407 desired_send_(SEND_NOTHING),
1409 send_(SEND_NOTHING), 1408 send_(SEND_NOTHING),
1410 call_(call), 1409 call_(call),
1411 default_receive_ssrc_(0) { 1410 using_default_recv_channel_(false),
1411 default_recv_ssrc_(0) {
1412 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 1412 RTC_DCHECK(thread_checker_.CalledOnValidThread());
1413 engine->RegisterChannel(this); 1413 engine->RegisterChannel(this);
1414 LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel " 1414 LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel "
1415 << default_send_channel_id(); 1415 << default_send_channel_id();
1416 RTC_DCHECK(nullptr != call); 1416 RTC_DCHECK(nullptr != call);
1417 ConfigureSendChannel(default_send_channel_id()); 1417 ConfigureSendChannel(default_send_channel_id());
1418 SetOptions(options); 1418 SetOptions(options);
1419 } 1419 }
1420 1420
1421 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { 1421 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1478 options_.SetAll(options); 1478 options_.SetAll(options);
1479 1479
1480 if (send_ != SEND_NOTHING) { 1480 if (send_ != SEND_NOTHING) {
1481 if (!engine()->ApplyOptions(options_)) { 1481 if (!engine()->ApplyOptions(options_)) {
1482 LOG(LS_WARNING) << 1482 LOG(LS_WARNING) <<
1483 "Failed to apply engine options during channel SetOptions."; 1483 "Failed to apply engine options during channel SetOptions.";
1484 return false; 1484 return false;
1485 } 1485 }
1486 } 1486 }
1487 1487
1488 if (!SetRecvOptions(default_send_channel_id(), options)) {
1489 return false;
1490 }
1491 for (const auto& ch : receive_channels_) { 1488 for (const auto& ch : receive_channels_) {
1492 if (!SetRecvOptions(ch.second->channel(), options)) { 1489 if (!SetRecvOptions(ch.second->channel(), options)) {
1493 return false; 1490 return false;
1494 } 1491 }
1495 } 1492 }
1496 if (dscp_option_changed) { 1493 if (dscp_option_changed) {
1497 rtc::DiffServCodePoint dscp = rtc::DSCP_DEFAULT; 1494 rtc::DiffServCodePoint dscp = rtc::DSCP_DEFAULT;
1498 if (options_.dscp.GetWithDefaultIfUnset(false)) 1495 if (options_.dscp.GetWithDefaultIfUnset(false))
1499 dscp = kAudioDscpValue; 1496 dscp = kAudioDscpValue;
1500 if (MediaChannel::SetDscp(dscp) != 0) { 1497 if (MediaChannel::SetDscp(dscp) != 0) {
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
1895 return true; 1892 return true;
1896 } 1893 }
1897 1894
1898 bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions( 1895 bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions(
1899 const std::vector<RtpHeaderExtension>& extensions) { 1896 const std::vector<RtpHeaderExtension>& extensions) {
1900 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 1897 RTC_DCHECK(thread_checker_.CalledOnValidThread());
1901 if (receive_extensions_ == extensions) { 1898 if (receive_extensions_ == extensions) {
1902 return true; 1899 return true;
1903 } 1900 }
1904 1901
1905 // The default channel may or may not be in |receive_channels_|. Set the rtp
1906 // header extensions for default channel regardless.
1907 if (!SetChannelRecvRtpHeaderExtensions(default_send_channel_id(),
1908 extensions)) {
1909 return false;
1910 }
1911
1912 // Loop through all receive channels and enable/disable the extensions.
1913 for (const auto& ch : receive_channels_) { 1902 for (const auto& ch : receive_channels_) {
1914 if (!SetChannelRecvRtpHeaderExtensions(ch.second->channel(), extensions)) { 1903 if (!SetChannelRecvRtpHeaderExtensions(ch.second->channel(), extensions)) {
1915 return false; 1904 return false;
1916 } 1905 }
1917 } 1906 }
1918 1907
1919 receive_extensions_ = extensions; 1908 receive_extensions_ = extensions;
1920 1909
1921 // Recreate AudioReceiveStream:s. 1910 // Recreate AudioReceiveStream:s.
1922 { 1911 {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
2026 } 2015 }
2027 2016
2028 bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { 2017 bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
2029 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2018 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2030 if (playout_ == playout) { 2019 if (playout_ == playout) {
2031 return true; 2020 return true;
2032 } 2021 }
2033 2022
2034 // Change the playout of all channels to the new state. 2023 // Change the playout of all channels to the new state.
2035 bool result = true; 2024 bool result = true;
2036 if (receive_channels_.empty()) {
2037 // Only toggle the default channel if we don't have any other channels.
2038 result = SetPlayout(default_send_channel_id(), playout);
2039 }
2040 for (const auto& ch : receive_channels_) { 2025 for (const auto& ch : receive_channels_) {
2041 if (!SetPlayout(ch.second->channel(), playout)) { 2026 if (!SetPlayout(ch.second->channel(), playout)) {
2042 LOG(LS_ERROR) << "SetPlayout " << playout << " on channel " 2027 LOG(LS_ERROR) << "SetPlayout " << playout << " on channel "
2043 << ch.second->channel() << " failed"; 2028 << ch.second->channel() << " failed";
2044 result = false; 2029 result = false;
2045 break; 2030 break;
2046 } 2031 }
2047 } 2032 }
2048 2033
2049 if (result) { 2034 if (result) {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2133 // TODO(ronghuawu): Change this method to return bool. 2118 // TODO(ronghuawu): Change this method to return bool.
2134 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) { 2119 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) {
2135 if (engine()->voe()->network()->RegisterExternalTransport( 2120 if (engine()->voe()->network()->RegisterExternalTransport(
2136 channel, *this) == -1) { 2121 channel, *this) == -1) {
2137 LOG_RTCERR2(RegisterExternalTransport, channel, this); 2122 LOG_RTCERR2(RegisterExternalTransport, channel, this);
2138 } 2123 }
2139 2124
2140 // Enable RTCP (for quality stats and feedback messages) 2125 // Enable RTCP (for quality stats and feedback messages)
2141 EnableRtcp(channel); 2126 EnableRtcp(channel);
2142 2127
2143 // Reset all recv codecs; they will be enabled via SetRecvCodecs.
2144 ResetRecvCodecs(channel);
2145
2146 // Set RTP header extension for the new channel. 2128 // Set RTP header extension for the new channel.
2147 SetChannelSendRtpHeaderExtensions(channel, send_extensions_); 2129 SetChannelSendRtpHeaderExtensions(channel, send_extensions_);
2148 } 2130 }
2149 2131
2150 bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) { 2132 bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) {
2151 if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) { 2133 if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) {
2152 LOG_RTCERR1(DeRegisterExternalTransport, channel); 2134 LOG_RTCERR1(DeRegisterExternalTransport, channel);
2153 } 2135 }
2154 2136
2155 if (engine()->voe()->base()->DeleteChannel(channel) == -1) { 2137 if (engine()->voe()->base()->DeleteChannel(channel) == -1) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2206 LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc()); 2188 LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc());
2207 return false; 2189 return false;
2208 } 2190 }
2209 2191
2210 // At this point the channel's local SSRC has been updated. If the channel is 2192 // At this point the channel's local SSRC has been updated. If the channel is
2211 // the default channel make sure that all the receive channels are updated as 2193 // the default channel make sure that all the receive channels are updated as
2212 // well. Receive channels have to have the same SSRC as the default channel in 2194 // well. Receive channels have to have the same SSRC as the default channel in
2213 // order to send receiver reports with this SSRC. 2195 // order to send receiver reports with this SSRC.
2214 if (IsDefaultChannel(channel)) { 2196 if (IsDefaultChannel(channel)) {
2215 for (const auto& ch : receive_channels_) { 2197 for (const auto& ch : receive_channels_) {
2216 // Only update the SSRC for non-default channels. 2198 if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(),
2217 if (!IsDefaultChannel(ch.second->channel())) { 2199 sp.first_ssrc()) != 0) {
2218 if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(), 2200 LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
2219 sp.first_ssrc()) != 0) { 2201 return false;
2220 LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
2221 return false;
2222 }
2223 } 2202 }
2224 } 2203 }
2225 } 2204 }
2226 2205
2227 if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) { 2206 if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) {
2228 LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname); 2207 LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname);
2229 return false; 2208 return false;
2230 } 2209 }
2231 2210
2232 // Set the current codecs to be used for the new channel. 2211 // Set the current codecs to be used for the new channel.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2277 if (!ValidateStreamParams(sp)) { 2256 if (!ValidateStreamParams(sp)) {
2278 return false; 2257 return false;
2279 } 2258 }
2280 2259
2281 uint32 ssrc = sp.first_ssrc(); 2260 uint32 ssrc = sp.first_ssrc();
2282 if (ssrc == 0) { 2261 if (ssrc == 0) {
2283 LOG(LS_WARNING) << "AddRecvStream with ssrc==0 is not supported."; 2262 LOG(LS_WARNING) << "AddRecvStream with ssrc==0 is not supported.";
2284 return false; 2263 return false;
2285 } 2264 }
2286 2265
2287 rtc::CritScope lock(&receive_channels_cs_); 2266 // Remove the default receive stream if one had been created with this ssrc;
2267 // we'll recreate it then.
2268 if (using_default_recv_channel_ && ssrc == default_recv_ssrc_) {
2269 RemoveRecvStream(ssrc);
2270 }
2288 2271
2289 if (receive_channels_.find(ssrc) != receive_channels_.end()) { 2272 if (receive_channels_.find(ssrc) != receive_channels_.end()) {
2290 LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc; 2273 LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc;
2291 return false; 2274 return false;
2292 } 2275 }
2293
2294 RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end()); 2276 RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end());
2295 2277
2296 // Reuse default channel for recv stream in non-conference mode call
2297 // when the default channel is not being used.
2298 webrtc::AudioTransport* audio_transport =
2299 engine()->voe()->base()->audio_transport();
2300 if (!InConferenceMode() && default_receive_ssrc_ == 0) {
2301 LOG(LS_INFO) << "Recv stream " << ssrc << " reuse default channel";
2302 default_receive_ssrc_ = ssrc;
2303 WebRtcVoiceChannelRenderer* channel_renderer =
2304 new WebRtcVoiceChannelRenderer(default_send_channel_id(),
2305 audio_transport);
2306 receive_channels_.insert(std::make_pair(ssrc, channel_renderer));
2307 receive_stream_params_[ssrc] = sp;
2308 AddAudioReceiveStream(ssrc);
2309 return SetPlayout(default_send_channel_id(), playout_);
2310 }
2311
2312 // Create a new channel for receiving audio data. 2278 // Create a new channel for receiving audio data.
2313 int channel = engine()->CreateMediaVoiceChannel(); 2279 int channel = engine()->CreateMediaVoiceChannel();
2314 if (channel == -1) { 2280 if (channel == -1) {
2315 LOG_RTCERR0(CreateChannel); 2281 LOG_RTCERR0(CreateChannel);
2316 return false; 2282 return false;
2317 } 2283 }
2318 if (!ConfigureRecvChannel(channel)) { 2284 if (!ConfigureRecvChannel(channel)) {
2319 DeleteChannel(channel); 2285 DeleteChannel(channel);
2320 return false; 2286 return false;
2321 } 2287 }
2322 2288
2289 webrtc::AudioTransport* audio_transport =
2290 engine()->voe()->base()->audio_transport();
2323 WebRtcVoiceChannelRenderer* channel_renderer = 2291 WebRtcVoiceChannelRenderer* channel_renderer =
2324 new WebRtcVoiceChannelRenderer(channel, audio_transport); 2292 new WebRtcVoiceChannelRenderer(channel, audio_transport);
2325 receive_channels_.insert(std::make_pair(ssrc, channel_renderer)); 2293 receive_channels_.insert(std::make_pair(ssrc, channel_renderer));
2326 receive_stream_params_[ssrc] = sp; 2294 receive_stream_params_[ssrc] = sp;
2327 AddAudioReceiveStream(ssrc); 2295 AddAudioReceiveStream(ssrc);
2328 2296
2329 LOG(LS_INFO) << "New audio stream " << ssrc 2297 LOG(LS_INFO) << "New audio stream " << ssrc
2330 << " registered to VoiceEngine channel #" 2298 << " registered to VoiceEngine channel #"
2331 << channel << "."; 2299 << channel << ".";
2332 return true; 2300 return true;
(...skipping 25 matching lines...) Expand all
2358 } 2326 }
2359 2327
2360 // Associate receive channel to default send channel (so the receive channel 2328 // Associate receive channel to default send channel (so the receive channel
2361 // can obtain RTT from the send channel). 2329 // can obtain RTT from the send channel).
2362 engine()->voe()->base()->AssociateSendChannel(channel, 2330 engine()->voe()->base()->AssociateSendChannel(channel,
2363 default_send_channel_id()); 2331 default_send_channel_id());
2364 LOG(LS_INFO) << "VoiceEngine channel #" 2332 LOG(LS_INFO) << "VoiceEngine channel #"
2365 << channel << " is associated with channel #" 2333 << channel << " is associated with channel #"
2366 << default_send_channel_id() << "."; 2334 << default_send_channel_id() << ".";
2367 2335
2368 // Use the same recv payload types as our default channel. 2336 // Turn off all supported codecs.
2369 ResetRecvCodecs(channel); 2337 int ncodecs = engine()->voe()->codec()->NumOfCodecs();
2370 if (!recv_codecs_.empty()) { 2338 for (int i = 0; i < ncodecs; ++i) {
2371 for (const auto& codec : recv_codecs_) { 2339 webrtc::CodecInst voe_codec;
2372 webrtc::CodecInst voe_codec; 2340 if (engine()->voe()->codec()->GetCodec(i, voe_codec) != -1) {
2373 if (engine()->FindWebRtcCodec(codec, &voe_codec)) { 2341 voe_codec.pltype = -1;
2374 voe_codec.pltype = codec.id; 2342 if (engine()->voe()->codec()->SetRecPayloadType(
2375 voe_codec.rate = 0; // Needed to make GetRecPayloadType work for ISAC 2343 channel, voe_codec) == -1) {
2376 if (engine()->voe()->codec()->GetRecPayloadType( 2344 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2377 default_send_channel_id(), voe_codec) != -1) { 2345 return false;
2378 if (engine()->voe()->codec()->SetRecPayloadType(
2379 channel, voe_codec) == -1) {
2380 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2381 return false;
2382 }
2383 }
2384 } 2346 }
2385 } 2347 }
2386 } 2348 }
2387 2349
2388 if (InConferenceMode()) { 2350 // Only enable those configured for this channel.
2389 // To be in par with the video, default_send_channel_id() is not used for 2351 for (const auto& codec : recv_codecs_) {
2390 // receiving in a conference call. 2352 webrtc::CodecInst voe_codec;
2391 if (receive_channels_.empty() && default_receive_ssrc_ == 0 && playout_) { 2353 if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
2392 // This is the first stream in a multi user meeting. We can now 2354 voe_codec.pltype = codec.id;
2393 // disable playback of the default stream. This since the default 2355 if (engine()->voe()->codec()->SetRecPayloadType(
2394 // stream will probably have received some initial packets before 2356 channel, voe_codec) == -1) {
2395 // the new stream was added. This will mean that the CN state from 2357 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2396 // the default channel will be mixed in with the other streams 2358 return false;
2397 // throughout the whole meeting, which might be disturbing. 2359 }
2398 LOG(LS_INFO) << "Disabling playback on the default voice channel";
2399 SetPlayout(default_send_channel_id(), false);
2400 } 2360 }
2401 } 2361 }
2402 2362
2403 SetNack(channel, nack_enabled_); 2363 SetNack(channel, nack_enabled_);
2404 2364
2405 // Set RTP header extension for the new channel. 2365 // Set RTP header extension for the new channel.
2406 if (!SetChannelRecvRtpHeaderExtensions(channel, receive_extensions_)) { 2366 if (!SetChannelRecvRtpHeaderExtensions(channel, receive_extensions_)) {
2407 return false; 2367 return false;
2408 } 2368 }
2409 2369
2410 return SetPlayout(channel, playout_); 2370 return SetPlayout(channel, playout_);
2411 } 2371 }
2412 2372
2413 bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) { 2373 bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32 ssrc) {
2414 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2374 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2415 LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; 2375 LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
2416 2376
2417 rtc::CritScope lock(&receive_channels_cs_);
2418 ChannelMap::iterator it = receive_channels_.find(ssrc); 2377 ChannelMap::iterator it = receive_channels_.find(ssrc);
2419 if (it == receive_channels_.end()) { 2378 if (it == receive_channels_.end()) {
2420 LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc 2379 LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc
2421 << " which doesn't exist."; 2380 << " which doesn't exist.";
2422 return false; 2381 return false;
2423 } 2382 }
2424 2383
2425 RemoveAudioReceiveStream(ssrc); 2384 RemoveAudioReceiveStream(ssrc);
2426 receive_stream_params_.erase(ssrc); 2385 receive_stream_params_.erase(ssrc);
2427 2386
2428 // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this 2387 // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this
2429 // will disconnect the audio renderer with the receive channel. 2388 // will disconnect the audio renderer with the receive channel.
2430 // Cache the channel before the deletion. 2389 // Cache the channel before the deletion.
2431 const int channel = it->second->channel(); 2390 const int channel = it->second->channel();
2432 delete it->second; 2391 delete it->second;
2433 receive_channels_.erase(it); 2392 receive_channels_.erase(it);
2434 2393
2435 if (ssrc == default_receive_ssrc_) { 2394 // Deregister default channel, if that's the one being destroyed.
2436 RTC_DCHECK(IsDefaultChannel(channel)); 2395 if (using_default_recv_channel_ && ssrc == default_recv_ssrc_) {
2437 // Recycle the default channel is for recv stream. 2396 using_default_recv_channel_ = false;
2438 if (playout_) 2397 default_recv_ssrc_ = 0;
2439 SetPlayout(default_send_channel_id(), false);
2440
2441 default_receive_ssrc_ = 0;
2442 return true;
2443 } 2398 }
2444 2399
2445 LOG(LS_INFO) << "Removing audio stream " << ssrc 2400 LOG(LS_INFO) << "Removing audio stream " << ssrc
2446 << " with VoiceEngine channel #" << channel << "."; 2401 << " with VoiceEngine channel #" << channel << ".";
2447 if (!DeleteChannel(channel)) 2402 return DeleteChannel(channel);
2448 return false;
2449
2450 bool enable_default_channel_playout = false;
2451 if (receive_channels_.empty()) {
2452 // The last stream was removed. We can now enable the default
2453 // channel for new channels to be played out immediately without
2454 // waiting for AddStream messages.
2455 // We do this for both conference mode and non-conference mode.
2456 // TODO(oja): Does the default channel still have it's CN state?
2457 enable_default_channel_playout = true;
2458 }
2459 if (!InConferenceMode() && receive_channels_.size() == 1 &&
2460 default_receive_ssrc_ != 0) {
2461 // Only the default channel is active, enable the playout on default
2462 // channel.
2463 enable_default_channel_playout = true;
2464 }
2465 if (enable_default_channel_playout && playout_) {
2466 LOG(LS_INFO) << "Enabling playback on the default voice channel";
2467 SetPlayout(default_send_channel_id(), true);
2468 }
2469
2470 return true;
2471 } 2403 }
2472 2404
2473 bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32 ssrc, 2405 bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32 ssrc,
2474 AudioRenderer* renderer) { 2406 AudioRenderer* renderer) {
2475 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2407 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2476 ChannelMap::iterator it = receive_channels_.find(ssrc); 2408 ChannelMap::iterator it = receive_channels_.find(ssrc);
2477 if (it == receive_channels_.end()) { 2409 if (it == receive_channels_.end()) {
2478 if (renderer) { 2410 if (renderer) {
2479 // Return an error if trying to set a valid renderer with an invalid ssrc. 2411 // Return an error if trying to set a valid renderer with an invalid ssrc.
2480 LOG(LS_ERROR) << "SetRemoteRenderer failed with ssrc "<< ssrc; 2412 LOG(LS_ERROR) << "SetRemoteRenderer failed with ssrc "<< ssrc;
(...skipping 30 matching lines...) Expand all
2511 it->second->Start(renderer); 2443 it->second->Start(renderer);
2512 else 2444 else
2513 it->second->Stop(); 2445 it->second->Stop();
2514 2446
2515 return true; 2447 return true;
2516 } 2448 }
2517 2449
2518 bool WebRtcVoiceMediaChannel::GetActiveStreams( 2450 bool WebRtcVoiceMediaChannel::GetActiveStreams(
2519 AudioInfo::StreamList* actives) { 2451 AudioInfo::StreamList* actives) {
2520 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2452 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2521 // In conference mode, the default channel should not be in
2522 // |receive_channels_|.
2523 actives->clear(); 2453 actives->clear();
2524 for (const auto& ch : receive_channels_) { 2454 for (const auto& ch : receive_channels_) {
2525 int level = GetOutputLevel(ch.second->channel()); 2455 int level = GetOutputLevel(ch.second->channel());
2526 if (level > 0) { 2456 if (level > 0) {
2527 actives->push_back(std::make_pair(ch.first, level)); 2457 actives->push_back(std::make_pair(ch.first, level));
2528 } 2458 }
2529 } 2459 }
2530 return true; 2460 return true;
2531 } 2461 }
2532 2462
2533 int WebRtcVoiceMediaChannel::GetOutputLevel() { 2463 int WebRtcVoiceMediaChannel::GetOutputLevel() {
2534 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2464 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2535 // return the highest output level of all streams 2465 int highest = 0;
2536 int highest = GetOutputLevel(default_send_channel_id());
2537 for (const auto& ch : receive_channels_) { 2466 for (const auto& ch : receive_channels_) {
2538 highest = std::max(GetOutputLevel(ch.second->channel()), highest); 2467 highest = std::max(GetOutputLevel(ch.second->channel()), highest);
2539 } 2468 }
2540 return highest; 2469 return highest;
2541 } 2470 }
2542 2471
2543 int WebRtcVoiceMediaChannel::GetTimeSinceLastTyping() { 2472 int WebRtcVoiceMediaChannel::GetTimeSinceLastTyping() {
2544 int ret; 2473 int ret;
2545 if (engine()->voe()->processing()->TimeSinceLastTyping(ret) == -1) { 2474 if (engine()->voe()->processing()->TimeSinceLastTyping(ret) == -1) {
2546 // In case of error, log the info and continue 2475 // In case of error, log the info and continue
(...skipping 14 matching lines...) Expand all
2561 // In case of error, log the info and continue 2490 // In case of error, log the info and continue
2562 LOG_RTCERR5(SetTypingDetectionParameters, time_window, 2491 LOG_RTCERR5(SetTypingDetectionParameters, time_window,
2563 cost_per_typing, reporting_threshold, penalty_decay, 2492 cost_per_typing, reporting_threshold, penalty_decay,
2564 type_event_delay); 2493 type_event_delay);
2565 } 2494 }
2566 } 2495 }
2567 2496
2568 bool WebRtcVoiceMediaChannel::SetOutputScaling( 2497 bool WebRtcVoiceMediaChannel::SetOutputScaling(
2569 uint32 ssrc, double left, double right) { 2498 uint32 ssrc, double left, double right) {
2570 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2499 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2571 rtc::CritScope lock(&receive_channels_cs_); 2500 int ch_id = GetReceiveChannelId(ssrc);
2572 // Collect the channels to scale the output volume. 2501 if (ch_id < 0) {
2573 std::vector<int> channels; 2502 LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc;
2574 if (0 == ssrc) { // Collect all channels, including the default one. 2503 return true;
2575 // Default channel is not in receive_channels_ if it is not being used for
2576 // playout.
2577 if (default_receive_ssrc_ == 0)
2578 channels.push_back(default_send_channel_id());
2579 for (const auto& ch : receive_channels_) {
2580 channels.push_back(ch.second->channel());
2581 }
2582 } else { // Collect only the channel of the specified ssrc.
2583 int channel = GetReceiveChannelId(ssrc);
2584 if (-1 == channel) {
2585 LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc;
2586 return false;
2587 }
2588 channels.push_back(channel);
2589 } 2504 }
2590 2505
2591 // Scale the output volume for the collected channels. We first normalize to 2506 // Scale the output volume for the collected channels. We first normalize to
2592 // scale the volume and then set the left and right pan. 2507 // scale the volume and then set the left and right pan.
2593 float scale = static_cast<float>(std::max(left, right)); 2508 float scale = static_cast<float>(std::max(left, right));
2594 if (scale > 0.0001f) { 2509 if (scale > 0.0001f) {
2595 left /= scale; 2510 left /= scale;
2596 right /= scale; 2511 right /= scale;
2597 } 2512 }
2598 for (int ch_id : channels) { 2513 if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling(
2599 if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling( 2514 ch_id, scale)) {
2600 ch_id, scale)) { 2515 LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale);
2601 LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale); 2516 return false;
2602 return false;
2603 }
2604 if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
2605 ch_id, static_cast<float>(left), static_cast<float>(right))) {
2606 LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
2607 // Do not return if fails. SetOutputVolumePan is not available for all
2608 // pltforms.
2609 }
2610 LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
2611 << " right=" << right * scale
2612 << " for channel " << ch_id << " and ssrc " << ssrc;
2613 } 2517 }
2518 if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
2519 ch_id, static_cast<float>(left), static_cast<float>(right))) {
2520 LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
2521 // Do not return if fails. SetOutputVolumePan is not available for all
2522 // pltforms.
2523 }
2524 LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
2525 << " right=" << right * scale
2526 << " for channel " << ch_id << " and ssrc " << ssrc;
2614 return true; 2527 return true;
2615 } 2528 }
2616 2529
2617 bool WebRtcVoiceMediaChannel::CanInsertDtmf() { 2530 bool WebRtcVoiceMediaChannel::CanInsertDtmf() {
2618 return dtmf_allowed_; 2531 return dtmf_allowed_;
2619 } 2532 }
2620 2533
2621 bool WebRtcVoiceMediaChannel::InsertDtmf(uint32 ssrc, int event, 2534 bool WebRtcVoiceMediaChannel::InsertDtmf(uint32 ssrc, int event,
2622 int duration, int flags) { 2535 int duration, int flags) {
2623 if (!dtmf_allowed_) { 2536 if (!dtmf_allowed_) {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2665 } 2578 }
2666 } 2579 }
2667 2580
2668 return true; 2581 return true;
2669 } 2582 }
2670 2583
2671 void WebRtcVoiceMediaChannel::OnPacketReceived( 2584 void WebRtcVoiceMediaChannel::OnPacketReceived(
2672 rtc::Buffer* packet, const rtc::PacketTime& packet_time) { 2585 rtc::Buffer* packet, const rtc::PacketTime& packet_time) {
2673 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2586 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2674 2587
2675 // Forward packet to Call as well. 2588 uint32 ssrc = 0;
2589 if (!GetRtpSsrc(packet->data(), packet->size(), &ssrc)) {
2590 return;
2591 }
2592
2593 if (receive_channels_.empty()) {
2594 // Create new channel, which will be the default receive channel.
2595 StreamParams sp;
2596 sp.ssrcs.push_back(ssrc);
2597 LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
2598 if (!AddRecvStream(sp)) {
2599 LOG(LS_WARNING) << "Could not create default receive stream.";
2600 return;
2601 }
2602 using_default_recv_channel_ = true;
2603 default_recv_ssrc_ = ssrc;
2604 }
2605
2606 // Forward packet to Call. If the SSRC is unknown we'll return after this.
2676 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, 2607 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
2677 packet_time.not_before); 2608 packet_time.not_before);
2678 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, 2609 webrtc::PacketReceiver::DeliveryStatus delivery_result =
2679 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(), 2610 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
2680 webrtc_packet_time); 2611 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
2612 webrtc_packet_time);
2613 if (webrtc::PacketReceiver::DELIVERY_OK != delivery_result) {
2614 return;
2615 }
2681 2616
2682 // Pick which channel to send this packet to. If this packet doesn't match 2617 // Find the channel to send this packet to. It must exist since webrtc::Call
2683 // any multiplexed streams, just send it to the default channel. Otherwise, 2618 // was able to demux the packet.
2684 // send it to the specific decoder instance for that stream. 2619 int channel = GetReceiveChannelId(ssrc);
2685 int which_channel = 2620 RTC_DCHECK(channel != -1);
2686 GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), false));
2687 if (which_channel == -1) {
2688 which_channel = default_send_channel_id();
2689 }
2690 2621
2691 // Pass it off to the decoder. 2622 // Pass it off to the decoder.
2692 engine()->voe()->network()->ReceivedRTPPacket( 2623 engine()->voe()->network()->ReceivedRTPPacket(
2693 which_channel, packet->data(), packet->size(), 2624 channel, packet->data(), packet->size(), webrtc_packet_time);
2694 webrtc::PacketTime(packet_time.timestamp, packet_time.not_before));
2695 } 2625 }
2696 2626
2697 void WebRtcVoiceMediaChannel::OnRtcpReceived( 2627 void WebRtcVoiceMediaChannel::OnRtcpReceived(
2698 rtc::Buffer* packet, const rtc::PacketTime& packet_time) { 2628 rtc::Buffer* packet, const rtc::PacketTime& packet_time) {
2699 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2629 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2700 2630
2701 // Forward packet to Call as well. 2631 // Forward packet to Call as well.
2702 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, 2632 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
2703 packet_time.not_before); 2633 packet_time.not_before);
2704 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, 2634 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
2705 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(), 2635 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
2706 webrtc_packet_time); 2636 webrtc_packet_time);
2707 2637
2708 // Sending channels need all RTCP packets with feedback information. 2638 // Sending channels need all RTCP packets with feedback information.
2709 // Even sender reports can contain attached report blocks. 2639 // Even sender reports can contain attached report blocks.
2710 // Receiving channels need sender reports in order to create 2640 // Receiving channels need sender reports in order to create
2711 // correct receiver reports. 2641 // correct receiver reports.
2712 int type = 0; 2642 int type = 0;
2713 if (!GetRtcpType(packet->data(), packet->size(), &type)) { 2643 if (!GetRtcpType(packet->data(), packet->size(), &type)) {
2714 LOG(LS_WARNING) << "Failed to parse type from received RTCP packet"; 2644 LOG(LS_WARNING) << "Failed to parse type from received RTCP packet";
2715 return; 2645 return;
2716 } 2646 }
2717 2647
2718 // If it is a sender report, find the receive channel that is listening. 2648 // If it is a sender report, find the receive channel that is listening.
2719 bool has_sent_to_default_channel = false;
2720 if (type == kRtcpTypeSR) { 2649 if (type == kRtcpTypeSR) {
2721 uint32 ssrc = 0; 2650 uint32 ssrc = 0;
2722 if (!GetRtcpSsrc(packet->data(), packet->size(), &ssrc)) { 2651 if (!GetRtcpSsrc(packet->data(), packet->size(), &ssrc)) {
2723 return; 2652 return;
2724 } 2653 }
2725 int recv_channel_id = GetReceiveChannelId(ssrc); 2654 int recv_channel_id = GetReceiveChannelId(ssrc);
2726 if (recv_channel_id != -1) { 2655 if (recv_channel_id != -1) {
2727 engine()->voe()->network()->ReceivedRTCPPacket( 2656 engine()->voe()->network()->ReceivedRTCPPacket(
2728 recv_channel_id, packet->data(), packet->size()); 2657 recv_channel_id, packet->data(), packet->size());
2729
2730 if (IsDefaultChannel(recv_channel_id))
2731 has_sent_to_default_channel = true;
2732 } 2658 }
2733 } 2659 }
2734 2660
2735 // SR may continue RR and any RR entry may correspond to any one of the send 2661 // SR may continue RR and any RR entry may correspond to any one of the send
2736 // channels. So all RTCP packets must be forwarded all send channels. VoE 2662 // channels. So all RTCP packets must be forwarded all send channels. VoE
2737 // will filter out RR internally. 2663 // will filter out RR internally.
2738 for (const auto& ch : send_channels_) { 2664 for (const auto& ch : send_channels_) {
2739 // Make sure not sending the same packet to default channel more than once.
2740 if (IsDefaultChannel(ch.second->channel()) &&
2741 has_sent_to_default_channel)
2742 continue;
2743
2744 engine()->voe()->network()->ReceivedRTCPPacket( 2665 engine()->voe()->network()->ReceivedRTCPPacket(
2745 ch.second->channel(), packet->data(), packet->size()); 2666 ch.second->channel(), packet->data(), packet->size());
2746 } 2667 }
2747 } 2668 }
2748 2669
2749 bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) { 2670 bool WebRtcVoiceMediaChannel::MuteStream(uint32 ssrc, bool muted) {
2750 int channel = 2671 int channel =
2751 (ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc); 2672 (ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc);
2752 if (channel == -1) { 2673 if (channel == -1) {
2753 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; 2674 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2928 sinfo.echo_return_loss_enhancement = echo_return_loss_enhancement; 2849 sinfo.echo_return_loss_enhancement = echo_return_loss_enhancement;
2929 sinfo.echo_delay_median_ms = echo_delay_median_ms; 2850 sinfo.echo_delay_median_ms = echo_delay_median_ms;
2930 sinfo.echo_delay_std_ms = echo_delay_std_ms; 2851 sinfo.echo_delay_std_ms = echo_delay_std_ms;
2931 // TODO(ajm): Re-enable this metric once we have a reliable implementation. 2852 // TODO(ajm): Re-enable this metric once we have a reliable implementation.
2932 sinfo.aec_quality_min = -1; 2853 sinfo.aec_quality_min = -1;
2933 sinfo.typing_noise_detected = typing_noise_detected_; 2854 sinfo.typing_noise_detected = typing_noise_detected_;
2934 2855
2935 info->senders.push_back(sinfo); 2856 info->senders.push_back(sinfo);
2936 } 2857 }
2937 2858
2938 // Build the list of receivers, one for each receiving channel, or 1 in 2859 // Get the SSRC and stats for each receiver.
2939 // a 1:1 call.
2940 std::vector<int> channels;
2941 for (const auto& ch : receive_channels_) { 2860 for (const auto& ch : receive_channels_) {
2942 channels.push_back(ch.second->channel()); 2861 int ch_id = ch.second->channel();
2943 }
2944 if (channels.empty()) {
2945 channels.push_back(default_send_channel_id());
2946 }
2947
2948 // Get the SSRC and stats for each receiver, based on our own calculations.
2949 for (int ch_id : channels) {
2950 memset(&cs, 0, sizeof(cs)); 2862 memset(&cs, 0, sizeof(cs));
2951 if (engine()->voe()->rtp()->GetRemoteSSRC(ch_id, ssrc) != -1 && 2863 if (engine()->voe()->rtp()->GetRemoteSSRC(ch_id, ssrc) != -1 &&
2952 engine()->voe()->rtp()->GetRTCPStatistics(ch_id, cs) != -1 && 2864 engine()->voe()->rtp()->GetRTCPStatistics(ch_id, cs) != -1 &&
2953 engine()->voe()->codec()->GetRecCodec(ch_id, codec) != -1) { 2865 engine()->voe()->codec()->GetRecCodec(ch_id, codec) != -1) {
2954 VoiceReceiverInfo rinfo; 2866 VoiceReceiverInfo rinfo;
2955 rinfo.add_ssrc(ssrc); 2867 rinfo.add_ssrc(ssrc);
2956 rinfo.bytes_rcvd = cs.bytesReceived; 2868 rinfo.bytes_rcvd = cs.bytesReceived;
2957 rinfo.packets_rcvd = cs.packetsReceived; 2869 rinfo.packets_rcvd = cs.packetsReceived;
2958 // The next four fields are from the most recently sent RTCP report. 2870 // The next four fields are from the most recently sent RTCP report.
2959 // Convert Q8 to floating point. 2871 // Convert Q8 to floating point.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
3036 int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); 2948 int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel);
3037 return (ret == 0) ? static_cast<int>(ulevel) : -1; 2949 return (ret == 0) ? static_cast<int>(ulevel) : -1;
3038 } 2950 }
3039 2951
3040 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32 ssrc) const { 2952 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32 ssrc) const {
3041 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2953 RTC_DCHECK(thread_checker_.CalledOnValidThread());
3042 ChannelMap::const_iterator it = receive_channels_.find(ssrc); 2954 ChannelMap::const_iterator it = receive_channels_.find(ssrc);
3043 if (it != receive_channels_.end()) { 2955 if (it != receive_channels_.end()) {
3044 return it->second->channel(); 2956 return it->second->channel();
3045 } 2957 }
3046 return (ssrc == default_receive_ssrc_) ? default_send_channel_id() : -1; 2958 return -1;
3047 } 2959 }
3048 2960
3049 int WebRtcVoiceMediaChannel::GetSendChannelId(uint32 ssrc) const { 2961 int WebRtcVoiceMediaChannel::GetSendChannelId(uint32 ssrc) const {
3050 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2962 RTC_DCHECK(thread_checker_.CalledOnValidThread());
3051 ChannelMap::const_iterator it = send_channels_.find(ssrc); 2963 ChannelMap::const_iterator it = send_channels_.find(ssrc);
3052 if (it != send_channels_.end()) { 2964 if (it != send_channels_.end()) {
3053 return it->second->channel(); 2965 return it->second->channel();
3054 } 2966 }
3055 return -1; 2967 return -1;
3056 } 2968 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3104 LOG_RTCERR2(SetRTCPStatus, channel, 1); 3016 LOG_RTCERR2(SetRTCPStatus, channel, 1);
3105 return false; 3017 return false;
3106 } 3018 }
3107 // TODO(juberti): Enable VQMon and RTCP XR reports, once we know what 3019 // TODO(juberti): Enable VQMon and RTCP XR reports, once we know what
3108 // what we want to do with them. 3020 // what we want to do with them.
3109 // engine()->voe().EnableVQMon(default_send_channel_id(), true); 3021 // engine()->voe().EnableVQMon(default_send_channel_id(), true);
3110 // engine()->voe().EnableRTCP_XR(default_send_channel_id(), true); 3022 // engine()->voe().EnableRTCP_XR(default_send_channel_id(), true);
3111 return true; 3023 return true;
3112 } 3024 }
3113 3025
3114 bool WebRtcVoiceMediaChannel::ResetRecvCodecs(int channel) {
3115 int ncodecs = engine()->voe()->codec()->NumOfCodecs();
3116 for (int i = 0; i < ncodecs; ++i) {
3117 webrtc::CodecInst voe_codec;
3118 if (engine()->voe()->codec()->GetCodec(i, voe_codec) != -1) {
3119 voe_codec.pltype = -1;
3120 if (engine()->voe()->codec()->SetRecPayloadType(
3121 channel, voe_codec) == -1) {
3122 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
3123 return false;
3124 }
3125 }
3126 }
3127 return true;
3128 }
3129
3130 bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) { 3026 bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) {
3131 if (playout) { 3027 if (playout) {
3132 LOG(LS_INFO) << "Starting playout for channel #" << channel; 3028 LOG(LS_INFO) << "Starting playout for channel #" << channel;
3133 if (engine()->voe()->base()->StartPlayout(channel) == -1) { 3029 if (engine()->voe()->base()->StartPlayout(channel) == -1) {
3134 LOG_RTCERR1(StartPlayout, channel); 3030 LOG_RTCERR1(StartPlayout, channel);
3135 return false; 3031 return false;
3136 } 3032 }
3137 } else { 3033 } else {
3138 LOG(LS_INFO) << "Stopping playout for channel #" << channel; 3034 LOG(LS_INFO) << "Stopping playout for channel #" << channel;
3139 engine()->voe()->base()->StopPlayout(channel); 3035 engine()->voe()->base()->StopPlayout(channel);
3140 } 3036 }
3141 return true; 3037 return true;
3142 } 3038 }
3143 3039
3144 uint32 WebRtcVoiceMediaChannel::ParseSsrc(const void* data, size_t len,
3145 bool rtcp) {
3146 size_t ssrc_pos = (!rtcp) ? 8 : 4;
3147 uint32 ssrc = 0;
3148 if (len >= (ssrc_pos + sizeof(ssrc))) {
3149 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos);
3150 }
3151 return ssrc;
3152 }
3153
3154 // Convert VoiceEngine error code into VoiceMediaChannel::Error enum. 3040 // Convert VoiceEngine error code into VoiceMediaChannel::Error enum.
3155 VoiceMediaChannel::Error 3041 VoiceMediaChannel::Error
3156 WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) { 3042 WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) {
3157 switch (err_code) { 3043 switch (err_code) {
3158 case 0: 3044 case 0:
3159 return ERROR_NONE; 3045 return ERROR_NONE;
3160 case VE_CANNOT_START_RECORDING: 3046 case VE_CANNOT_START_RECORDING:
3161 case VE_MIC_VOL_ERROR: 3047 case VE_MIC_VOL_ERROR:
3162 case VE_GET_MIC_VOL_ERROR: 3048 case VE_GET_MIC_VOL_ERROR:
3163 case VE_CANNOT_ACCESS_MIC_VOL: 3049 case VE_CANNOT_ACCESS_MIC_VOL:
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3238 } 3124 }
3239 3125
3240 bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal( 3126 bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal(
3241 const std::vector<AudioCodec>& new_codecs) { 3127 const std::vector<AudioCodec>& new_codecs) {
3242 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 3128 RTC_DCHECK(thread_checker_.CalledOnValidThread());
3243 for (const AudioCodec& codec : new_codecs) { 3129 for (const AudioCodec& codec : new_codecs) {
3244 webrtc::CodecInst voe_codec; 3130 webrtc::CodecInst voe_codec;
3245 if (engine()->FindWebRtcCodec(codec, &voe_codec)) { 3131 if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
3246 LOG(LS_INFO) << ToString(codec); 3132 LOG(LS_INFO) << ToString(codec);
3247 voe_codec.pltype = codec.id; 3133 voe_codec.pltype = codec.id;
3248 if (default_receive_ssrc_ == 0) {
3249 // Set the receive codecs on the default channel explicitly if the
3250 // default channel is not used by |receive_channels_|, this happens in
3251 // conference mode or in non-conference mode when there is no playout
3252 // channel.
3253 // TODO(xians): Figure out how we use the default channel in conference
3254 // mode.
3255 if (engine()->voe()->codec()->SetRecPayloadType(
3256 default_send_channel_id(), voe_codec) == -1) {
3257 LOG_RTCERR2(SetRecPayloadType, default_send_channel_id(),
3258 ToString(voe_codec));
3259 return false;
3260 }
3261 }
3262
3263 // Set the receive codecs on all receiving channels.
3264 for (const auto& ch : receive_channels_) { 3134 for (const auto& ch : receive_channels_) {
3265 if (engine()->voe()->codec()->SetRecPayloadType( 3135 if (engine()->voe()->codec()->SetRecPayloadType(
3266 ch.second->channel(), voe_codec) == -1) { 3136 ch.second->channel(), voe_codec) == -1) {
3267 LOG_RTCERR2(SetRecPayloadType, ch.second->channel(), 3137 LOG_RTCERR2(SetRecPayloadType, ch.second->channel(),
3268 ToString(voe_codec)); 3138 ToString(voe_codec));
3269 return false; 3139 return false;
3270 } 3140 }
3271 } 3141 }
3272 } else { 3142 } else {
3273 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); 3143 LOG(LS_WARNING) << "Unknown codec " << ToString(codec);
3274 return false; 3144 return false;
3275 } 3145 }
3276 } 3146 }
3277 return true; 3147 return true;
3278 } 3148 }
3279 3149
3280 } // namespace cricket 3150 } // namespace cricket
3281 3151
3282 #endif // HAVE_WEBRTC_VOICE 3152 #endif // HAVE_WEBRTC_VOICE
OLDNEW
« no previous file with comments | « talk/media/webrtc/webrtcvoiceengine.h ('k') | talk/media/webrtc/webrtcvoiceengine_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698