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

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

Issue 1385893002: Remove default receive channel from WVoE; baby step 3. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: remove implementation of SetRemoteRenderer 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
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 default_recv_ssrc_(-1) {
1412 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 1411 RTC_DCHECK(thread_checker_.CalledOnValidThread());
1413 engine->RegisterChannel(this); 1412 engine->RegisterChannel(this);
1414 LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel " 1413 LOG(LS_VERBOSE) << "WebRtcVoiceMediaChannel::WebRtcVoiceMediaChannel "
1415 << default_send_channel_id(); 1414 << default_send_channel_id();
1416 RTC_DCHECK(nullptr != call); 1415 RTC_DCHECK(nullptr != call);
1417 ConfigureSendChannel(default_send_channel_id()); 1416 ConfigureSendChannel(default_send_channel_id());
1418 SetOptions(options); 1417 SetOptions(options);
1419 } 1418 }
1420 1419
1421 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() { 1420 WebRtcVoiceMediaChannel::~WebRtcVoiceMediaChannel() {
(...skipping 408 matching lines...) Expand 10 before | Expand all | Expand 10 after
1830 return true; 1829 return true;
1831 } 1830 }
1832 1831
1833 bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions( 1832 bool WebRtcVoiceMediaChannel::SetRecvRtpHeaderExtensions(
1834 const std::vector<RtpHeaderExtension>& extensions) { 1833 const std::vector<RtpHeaderExtension>& extensions) {
1835 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 1834 RTC_DCHECK(thread_checker_.CalledOnValidThread());
1836 if (receive_extensions_ == extensions) { 1835 if (receive_extensions_ == extensions) {
1837 return true; 1836 return true;
1838 } 1837 }
1839 1838
1840 // The default channel may or may not be in |receive_channels_|. Set the rtp
1841 // header extensions for default channel regardless.
1842 if (!SetChannelRecvRtpHeaderExtensions(default_send_channel_id(),
1843 extensions)) {
1844 return false;
1845 }
1846
1847 // Loop through all receive channels and enable/disable the extensions.
1848 for (const auto& ch : receive_channels_) { 1839 for (const auto& ch : receive_channels_) {
1849 if (!SetChannelRecvRtpHeaderExtensions(ch.second->channel(), extensions)) { 1840 if (!SetChannelRecvRtpHeaderExtensions(ch.second->channel(), extensions)) {
1850 return false; 1841 return false;
1851 } 1842 }
1852 } 1843 }
1853 1844
1854 receive_extensions_ = extensions; 1845 receive_extensions_ = extensions;
1855 1846
1856 // Recreate AudioReceiveStream:s. 1847 // Recreate AudioReceiveStream:s.
1857 { 1848 {
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after
1961 } 1952 }
1962 1953
1963 bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) { 1954 bool WebRtcVoiceMediaChannel::ChangePlayout(bool playout) {
1964 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 1955 RTC_DCHECK(thread_checker_.CalledOnValidThread());
1965 if (playout_ == playout) { 1956 if (playout_ == playout) {
1966 return true; 1957 return true;
1967 } 1958 }
1968 1959
1969 // Change the playout of all channels to the new state. 1960 // Change the playout of all channels to the new state.
1970 bool result = true; 1961 bool result = true;
1962 // TODO(solenberg): Remove!!!!!!
pthatcher1 2015/10/08 18:55:40 Do you plan to do that in this CL or a future one?
the sun 2015/10/12 15:03:01 Done.
1971 if (receive_channels_.empty()) { 1963 if (receive_channels_.empty()) {
1972 // Only toggle the default channel if we don't have any other channels. 1964 // Only toggle the default channel if we don't have any other channels.
1973 result = SetPlayout(default_send_channel_id(), playout); 1965 result = SetPlayout(default_send_channel_id(), playout);
1974 } 1966 }
1975 for (const auto& ch : receive_channels_) { 1967 for (const auto& ch : receive_channels_) {
1976 if (!SetPlayout(ch.second->channel(), playout)) { 1968 if (!SetPlayout(ch.second->channel(), playout)) {
1977 LOG(LS_ERROR) << "SetPlayout " << playout << " on channel " 1969 LOG(LS_ERROR) << "SetPlayout " << playout << " on channel "
1978 << ch.second->channel() << " failed"; 1970 << ch.second->channel() << " failed";
1979 result = false; 1971 result = false;
1980 break; 1972 break;
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
2069 // TODO(ronghuawu): Change this method to return bool. 2061 // TODO(ronghuawu): Change this method to return bool.
2070 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) { 2062 void WebRtcVoiceMediaChannel::ConfigureSendChannel(int channel) {
2071 if (engine()->voe()->network()->RegisterExternalTransport( 2063 if (engine()->voe()->network()->RegisterExternalTransport(
2072 channel, *this) == -1) { 2064 channel, *this) == -1) {
2073 LOG_RTCERR2(RegisterExternalTransport, channel, this); 2065 LOG_RTCERR2(RegisterExternalTransport, channel, this);
2074 } 2066 }
2075 2067
2076 // Enable RTCP (for quality stats and feedback messages) 2068 // Enable RTCP (for quality stats and feedback messages)
2077 EnableRtcp(channel); 2069 EnableRtcp(channel);
2078 2070
2079 // Reset all recv codecs; they will be enabled via SetRecvCodecs.
2080 ResetRecvCodecs(channel);
2081
2082 // Set RTP header extension for the new channel. 2071 // Set RTP header extension for the new channel.
2083 SetChannelSendRtpHeaderExtensions(channel, send_extensions_); 2072 SetChannelSendRtpHeaderExtensions(channel, send_extensions_);
2084 } 2073 }
2085 2074
2086 bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) { 2075 bool WebRtcVoiceMediaChannel::DeleteChannel(int channel) {
2087 if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) { 2076 if (engine()->voe()->network()->DeRegisterExternalTransport(channel) == -1) {
2088 LOG_RTCERR1(DeRegisterExternalTransport, channel); 2077 LOG_RTCERR1(DeRegisterExternalTransport, channel);
2089 } 2078 }
2090 2079
2091 if (engine()->voe()->base()->DeleteChannel(channel) == -1) { 2080 if (engine()->voe()->base()->DeleteChannel(channel) == -1) {
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2142 LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc()); 2131 LOG_RTCERR2(SetSendSSRC, channel, sp.first_ssrc());
2143 return false; 2132 return false;
2144 } 2133 }
2145 2134
2146 // At this point the channel's local SSRC has been updated. If the channel is 2135 // At this point the channel's local SSRC has been updated. If the channel is
2147 // the default channel make sure that all the receive channels are updated as 2136 // the default channel make sure that all the receive channels are updated as
2148 // well. Receive channels have to have the same SSRC as the default channel in 2137 // well. Receive channels have to have the same SSRC as the default channel in
2149 // order to send receiver reports with this SSRC. 2138 // order to send receiver reports with this SSRC.
2150 if (IsDefaultChannel(channel)) { 2139 if (IsDefaultChannel(channel)) {
2151 for (const auto& ch : receive_channels_) { 2140 for (const auto& ch : receive_channels_) {
2152 // Only update the SSRC for non-default channels. 2141 if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(),
2153 if (!IsDefaultChannel(ch.second->channel())) { 2142 sp.first_ssrc()) != 0) {
2154 if (engine()->voe()->rtp()->SetLocalSSRC(ch.second->channel(), 2143 LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
2155 sp.first_ssrc()) != 0) { 2144 return false;
2156 LOG_RTCERR2(SetLocalSSRC, ch.second->channel(), sp.first_ssrc());
2157 return false;
2158 }
2159 } 2145 }
2160 } 2146 }
2161 } 2147 }
2162 2148
2163 if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) { 2149 if (engine()->voe()->rtp()->SetRTCP_CNAME(channel, sp.cname.c_str()) == -1) {
2164 LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname); 2150 LOG_RTCERR2(SetRTCP_CNAME, channel, sp.cname);
2165 return false; 2151 return false;
2166 } 2152 }
2167 2153
2168 // Set the current codecs to be used for the new channel. 2154 // Set the current codecs to be used for the new channel.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
2213 if (!ValidateStreamParams(sp)) { 2199 if (!ValidateStreamParams(sp)) {
2214 return false; 2200 return false;
2215 } 2201 }
2216 2202
2217 uint32_t ssrc = sp.first_ssrc(); 2203 uint32_t ssrc = sp.first_ssrc();
2218 if (ssrc == 0) { 2204 if (ssrc == 0) {
2219 LOG(LS_WARNING) << "AddRecvStream with ssrc==0 is not supported."; 2205 LOG(LS_WARNING) << "AddRecvStream with ssrc==0 is not supported.";
2220 return false; 2206 return false;
2221 } 2207 }
2222 2208
2223 rtc::CritScope lock(&receive_channels_cs_); 2209 // Remove the default receive stream if one had been created with this ssrc;
2210 // we'll recreate it then.
2211 if (default_recv_ssrc_ == static_cast<int64_t>(ssrc)) {
pthatcher1 2015/10/08 18:55:40 A simple IsDefaultRecvStream(ssrc) might be nice,
the sun 2015/10/12 15:03:01 Done.
2212 RemoveRecvStream(ssrc);
2213 }
2224 2214
2225 if (receive_channels_.find(ssrc) != receive_channels_.end()) { 2215 if (receive_channels_.find(ssrc) != receive_channels_.end()) {
2226 LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc; 2216 LOG(LS_ERROR) << "Stream already exists with ssrc " << ssrc;
2227 return false; 2217 return false;
2228 } 2218 }
2229
2230 RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end()); 2219 RTC_DCHECK(receive_stream_params_.find(ssrc) == receive_stream_params_.end());
2231 2220
2232 // Reuse default channel for recv stream in non-conference mode call
2233 // when the default channel is not being used.
2234 webrtc::AudioTransport* audio_transport =
2235 engine()->voe()->base()->audio_transport();
2236 if (!InConferenceMode() && default_receive_ssrc_ == 0) {
2237 LOG(LS_INFO) << "Recv stream " << ssrc << " reuse default channel";
2238 default_receive_ssrc_ = ssrc;
2239 WebRtcVoiceChannelRenderer* channel_renderer =
2240 new WebRtcVoiceChannelRenderer(default_send_channel_id(),
2241 audio_transport);
2242 receive_channels_.insert(std::make_pair(ssrc, channel_renderer));
2243 receive_stream_params_[ssrc] = sp;
2244 AddAudioReceiveStream(ssrc);
2245 return SetPlayout(default_send_channel_id(), playout_);
2246 }
2247
2248 // Create a new channel for receiving audio data. 2221 // Create a new channel for receiving audio data.
2249 int channel = engine()->CreateMediaVoiceChannel(); 2222 int channel = engine()->CreateMediaVoiceChannel();
2250 if (channel == -1) { 2223 if (channel == -1) {
2251 LOG_RTCERR0(CreateChannel); 2224 LOG_RTCERR0(CreateChannel);
2252 return false; 2225 return false;
2253 } 2226 }
2254 if (!ConfigureRecvChannel(channel)) { 2227 if (!ConfigureRecvChannel(channel)) {
2255 DeleteChannel(channel); 2228 DeleteChannel(channel);
2256 return false; 2229 return false;
2257 } 2230 }
2258 2231
2232 webrtc::AudioTransport* audio_transport =
2233 engine()->voe()->base()->audio_transport();
2259 WebRtcVoiceChannelRenderer* channel_renderer = 2234 WebRtcVoiceChannelRenderer* channel_renderer =
2260 new WebRtcVoiceChannelRenderer(channel, audio_transport); 2235 new WebRtcVoiceChannelRenderer(channel, audio_transport);
2261 receive_channels_.insert(std::make_pair(ssrc, channel_renderer)); 2236 receive_channels_.insert(std::make_pair(ssrc, channel_renderer));
2262 receive_stream_params_[ssrc] = sp; 2237 receive_stream_params_[ssrc] = sp;
2263 AddAudioReceiveStream(ssrc); 2238 AddAudioReceiveStream(ssrc);
2264 2239
2265 LOG(LS_INFO) << "New audio stream " << ssrc 2240 LOG(LS_INFO) << "New audio stream " << ssrc
2266 << " registered to VoiceEngine channel #" 2241 << " registered to VoiceEngine channel #"
2267 << channel << "."; 2242 << channel << ".";
2268 return true; 2243 return true;
(...skipping 22 matching lines...) Expand all
2291 } 2266 }
2292 2267
2293 // Associate receive channel to default send channel (so the receive channel 2268 // Associate receive channel to default send channel (so the receive channel
2294 // can obtain RTT from the send channel). 2269 // can obtain RTT from the send channel).
2295 engine()->voe()->base()->AssociateSendChannel(channel, 2270 engine()->voe()->base()->AssociateSendChannel(channel,
2296 default_send_channel_id()); 2271 default_send_channel_id());
2297 LOG(LS_INFO) << "VoiceEngine channel #" 2272 LOG(LS_INFO) << "VoiceEngine channel #"
2298 << channel << " is associated with channel #" 2273 << channel << " is associated with channel #"
2299 << default_send_channel_id() << "."; 2274 << default_send_channel_id() << ".";
2300 2275
2301 // Use the same recv payload types as our default channel. 2276 // Turn off all supported codecs.
2302 ResetRecvCodecs(channel); 2277 int ncodecs = engine()->voe()->codec()->NumOfCodecs();
2303 if (!recv_codecs_.empty()) { 2278 for (int i = 0; i < ncodecs; ++i) {
2304 for (const auto& codec : recv_codecs_) { 2279 webrtc::CodecInst voe_codec;
2305 webrtc::CodecInst voe_codec; 2280 if (engine()->voe()->codec()->GetCodec(i, voe_codec) != -1) {
2306 if (engine()->FindWebRtcCodec(codec, &voe_codec)) { 2281 voe_codec.pltype = -1;
2307 voe_codec.pltype = codec.id; 2282 if (engine()->voe()->codec()->SetRecPayloadType(
2308 voe_codec.rate = 0; // Needed to make GetRecPayloadType work for ISAC 2283 channel, voe_codec) == -1) {
2309 if (engine()->voe()->codec()->GetRecPayloadType( 2284 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2310 default_send_channel_id(), voe_codec) != -1) { 2285 return false;
2311 if (engine()->voe()->codec()->SetRecPayloadType(
2312 channel, voe_codec) == -1) {
2313 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2314 return false;
2315 }
2316 }
2317 } 2286 }
2318 } 2287 }
2319 } 2288 }
2320 2289
2321 if (InConferenceMode()) { 2290 // Only enable those configured for this channel.
2322 // To be in par with the video, default_send_channel_id() is not used for 2291 for (const auto& codec : recv_codecs_) {
2323 // receiving in a conference call. 2292 webrtc::CodecInst voe_codec;
2324 if (receive_channels_.empty() && default_receive_ssrc_ == 0 && playout_) { 2293 if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
2325 // This is the first stream in a multi user meeting. We can now 2294 voe_codec.pltype = codec.id;
2326 // disable playback of the default stream. This since the default 2295 if (engine()->voe()->codec()->SetRecPayloadType(
2327 // stream will probably have received some initial packets before 2296 channel, voe_codec) == -1) {
2328 // the new stream was added. This will mean that the CN state from 2297 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
2329 // the default channel will be mixed in with the other streams 2298 return false;
2330 // throughout the whole meeting, which might be disturbing. 2299 }
2331 LOG(LS_INFO) << "Disabling playback on the default voice channel";
2332 SetPlayout(default_send_channel_id(), false);
2333 } 2300 }
2334 } 2301 }
2335 2302
2336 SetNack(channel, nack_enabled_); 2303 SetNack(channel, nack_enabled_);
2337 2304
2338 // Set RTP header extension for the new channel. 2305 // Set RTP header extension for the new channel.
2339 if (!SetChannelRecvRtpHeaderExtensions(channel, receive_extensions_)) { 2306 if (!SetChannelRecvRtpHeaderExtensions(channel, receive_extensions_)) {
2340 return false; 2307 return false;
2341 } 2308 }
2342 2309
2343 return SetPlayout(channel, playout_); 2310 return SetPlayout(channel, playout_);
2344 } 2311 }
2345 2312
2346 bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) { 2313 bool WebRtcVoiceMediaChannel::RemoveRecvStream(uint32_t ssrc) {
2347 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2314 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2348 LOG(LS_INFO) << "RemoveRecvStream: " << ssrc; 2315 LOG(LS_INFO) << "RemoveRecvStream: " << ssrc;
2349 2316
2350 rtc::CritScope lock(&receive_channels_cs_);
2351 ChannelMap::iterator it = receive_channels_.find(ssrc); 2317 ChannelMap::iterator it = receive_channels_.find(ssrc);
2352 if (it == receive_channels_.end()) { 2318 if (it == receive_channels_.end()) {
2353 LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc 2319 LOG(LS_WARNING) << "Try to remove stream with ssrc " << ssrc
2354 << " which doesn't exist."; 2320 << " which doesn't exist.";
2355 return false; 2321 return false;
2356 } 2322 }
2357 2323
2358 RemoveAudioReceiveStream(ssrc); 2324 RemoveAudioReceiveStream(ssrc);
2359 receive_stream_params_.erase(ssrc); 2325 receive_stream_params_.erase(ssrc);
2360 2326
2361 // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this 2327 // Delete the WebRtcVoiceChannelRenderer object connected to the channel, this
2362 // will disconnect the audio renderer with the receive channel. 2328 // will disconnect the audio renderer with the receive channel.
2363 // Cache the channel before the deletion. 2329 // Cache the channel before the deletion.
2364 const int channel = it->second->channel(); 2330 const int channel = it->second->channel();
2365 delete it->second; 2331 delete it->second;
2366 receive_channels_.erase(it); 2332 receive_channels_.erase(it);
2367 2333
2368 if (ssrc == default_receive_ssrc_) { 2334 // Deregister default channel, if that's the one being destroyed.
2369 RTC_DCHECK(IsDefaultChannel(channel)); 2335 if (default_recv_ssrc_ == static_cast<int64_t>(ssrc)) {
2370 // Recycle the default channel is for recv stream. 2336 default_recv_ssrc_ = -1;
2371 if (playout_)
2372 SetPlayout(default_send_channel_id(), false);
2373
2374 default_receive_ssrc_ = 0;
2375 return true;
2376 } 2337 }
2377 2338
2378 LOG(LS_INFO) << "Removing audio stream " << ssrc 2339 LOG(LS_INFO) << "Removing audio stream " << ssrc
2379 << " with VoiceEngine channel #" << channel << "."; 2340 << " with VoiceEngine channel #" << channel << ".";
2380 if (!DeleteChannel(channel)) 2341 return DeleteChannel(channel);
2381 return false;
2382
2383 bool enable_default_channel_playout = false;
2384 if (receive_channels_.empty()) {
2385 // The last stream was removed. We can now enable the default
2386 // channel for new channels to be played out immediately without
2387 // waiting for AddStream messages.
2388 // We do this for both conference mode and non-conference mode.
2389 // TODO(oja): Does the default channel still have it's CN state?
2390 enable_default_channel_playout = true;
2391 }
2392 if (!InConferenceMode() && receive_channels_.size() == 1 &&
2393 default_receive_ssrc_ != 0) {
2394 // Only the default channel is active, enable the playout on default
2395 // channel.
2396 enable_default_channel_playout = true;
2397 }
2398 if (enable_default_channel_playout && playout_) {
2399 LOG(LS_INFO) << "Enabling playback on the default voice channel";
2400 SetPlayout(default_send_channel_id(), true);
2401 }
2402
2403 return true;
2404 } 2342 }
2405 2343
2406 bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32_t ssrc, 2344 bool WebRtcVoiceMediaChannel::SetRemoteRenderer(uint32_t ssrc,
2407 AudioRenderer* renderer) { 2345 AudioRenderer* renderer) {
2408 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2346 RTC_DCHECK(renderer == nullptr);
2409 ChannelMap::iterator it = receive_channels_.find(ssrc);
2410 if (it == receive_channels_.end()) {
2411 if (renderer) {
2412 // Return an error if trying to set a valid renderer with an invalid ssrc.
2413 LOG(LS_ERROR) << "SetRemoteRenderer failed with ssrc "<< ssrc;
2414 return false;
2415 }
2416
2417 // The channel likely has gone away, do nothing.
2418 return true;
2419 }
2420
2421 if (renderer)
2422 it->second->Start(renderer);
2423 else
2424 it->second->Stop();
2425
2426 return true; 2347 return true;
2427 } 2348 }
2428 2349
2429 bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc, 2350 bool WebRtcVoiceMediaChannel::SetLocalRenderer(uint32_t ssrc,
2430 AudioRenderer* renderer) { 2351 AudioRenderer* renderer) {
2431 ChannelMap::iterator it = send_channels_.find(ssrc); 2352 ChannelMap::iterator it = send_channels_.find(ssrc);
2432 if (it == send_channels_.end()) { 2353 if (it == send_channels_.end()) {
2433 if (renderer) { 2354 if (renderer) {
2434 // Return an error if trying to set a valid renderer with an invalid ssrc. 2355 // Return an error if trying to set a valid renderer with an invalid ssrc.
2435 LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc; 2356 LOG(LS_ERROR) << "SetLocalRenderer failed with ssrc "<< ssrc;
2436 return false; 2357 return false;
2437 } 2358 }
2438 2359
2439 // The channel likely has gone away, do nothing. 2360 // The channel likely has gone away, do nothing.
2440 return true; 2361 return true;
2441 } 2362 }
2442 2363
2443 if (renderer) 2364 if (renderer) {
2444 it->second->Start(renderer); 2365 it->second->Start(renderer);
2445 else 2366 } else {
2446 it->second->Stop(); 2367 it->second->Stop();
2368 }
2447 2369
2448 return true; 2370 return true;
2449 } 2371 }
2450 2372
2451 bool WebRtcVoiceMediaChannel::GetActiveStreams( 2373 bool WebRtcVoiceMediaChannel::GetActiveStreams(
2452 AudioInfo::StreamList* actives) { 2374 AudioInfo::StreamList* actives) {
2453 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2375 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2454 // In conference mode, the default channel should not be in
2455 // |receive_channels_|.
2456 actives->clear(); 2376 actives->clear();
2457 for (const auto& ch : receive_channels_) { 2377 for (const auto& ch : receive_channels_) {
2458 int level = GetOutputLevel(ch.second->channel()); 2378 int level = GetOutputLevel(ch.second->channel());
2459 if (level > 0) { 2379 if (level > 0) {
2460 actives->push_back(std::make_pair(ch.first, level)); 2380 actives->push_back(std::make_pair(ch.first, level));
2461 } 2381 }
2462 } 2382 }
2463 return true; 2383 return true;
2464 } 2384 }
2465 2385
2466 int WebRtcVoiceMediaChannel::GetOutputLevel() { 2386 int WebRtcVoiceMediaChannel::GetOutputLevel() {
2467 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2387 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2468 // return the highest output level of all streams 2388 int highest = 0;
2469 int highest = GetOutputLevel(default_send_channel_id());
2470 for (const auto& ch : receive_channels_) { 2389 for (const auto& ch : receive_channels_) {
2471 highest = std::max(GetOutputLevel(ch.second->channel()), highest); 2390 highest = std::max(GetOutputLevel(ch.second->channel()), highest);
2472 } 2391 }
2473 return highest; 2392 return highest;
2474 } 2393 }
2475 2394
2476 int WebRtcVoiceMediaChannel::GetTimeSinceLastTyping() { 2395 int WebRtcVoiceMediaChannel::GetTimeSinceLastTyping() {
2477 int ret; 2396 int ret;
2478 if (engine()->voe()->processing()->TimeSinceLastTyping(ret) == -1) { 2397 if (engine()->voe()->processing()->TimeSinceLastTyping(ret) == -1) {
2479 // In case of error, log the info and continue 2398 // In case of error, log the info and continue
(...skipping 15 matching lines...) Expand all
2495 LOG_RTCERR5(SetTypingDetectionParameters, time_window, 2414 LOG_RTCERR5(SetTypingDetectionParameters, time_window,
2496 cost_per_typing, reporting_threshold, penalty_decay, 2415 cost_per_typing, reporting_threshold, penalty_decay,
2497 type_event_delay); 2416 type_event_delay);
2498 } 2417 }
2499 } 2418 }
2500 2419
2501 bool WebRtcVoiceMediaChannel::SetOutputScaling(uint32_t ssrc, 2420 bool WebRtcVoiceMediaChannel::SetOutputScaling(uint32_t ssrc,
2502 double left, 2421 double left,
2503 double right) { 2422 double right) {
2504 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2423 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2505 rtc::CritScope lock(&receive_channels_cs_); 2424 int ch_id = GetReceiveChannelId(ssrc);
2506 // Collect the channels to scale the output volume. 2425 if (ch_id < 0) {
2507 std::vector<int> channels; 2426 LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc;
2508 if (0 == ssrc) { // Collect all channels, including the default one. 2427 // TODO(solenberg): !!!!!!
pthatcher1 2015/10/08 18:55:40 I assume this means you'll do the logic for "if ss
the sun 2015/10/12 15:03:01 Done.
2509 // Default channel is not in receive_channels_ if it is not being used for 2428 return true;
2510 // playout.
2511 if (default_receive_ssrc_ == 0)
2512 channels.push_back(default_send_channel_id());
2513 for (const auto& ch : receive_channels_) {
2514 channels.push_back(ch.second->channel());
2515 }
2516 } else { // Collect only the channel of the specified ssrc.
2517 int channel = GetReceiveChannelId(ssrc);
2518 if (-1 == channel) {
2519 LOG(LS_WARNING) << "Cannot find channel for ssrc:" << ssrc;
2520 return false;
2521 }
2522 channels.push_back(channel);
2523 } 2429 }
2524 2430
2525 // Scale the output volume for the collected channels. We first normalize to 2431 // Scale the output volume for the collected channels. We first normalize to
2526 // scale the volume and then set the left and right pan. 2432 // scale the volume and then set the left and right pan.
2527 float scale = static_cast<float>(std::max(left, right)); 2433 float scale = static_cast<float>(std::max(left, right));
2528 if (scale > 0.0001f) { 2434 if (scale > 0.0001f) {
2529 left /= scale; 2435 left /= scale;
2530 right /= scale; 2436 right /= scale;
2531 } 2437 }
2532 for (int ch_id : channels) { 2438 if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling(
2533 if (-1 == engine()->voe()->volume()->SetChannelOutputVolumeScaling( 2439 ch_id, scale)) {
2534 ch_id, scale)) { 2440 LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale);
2535 LOG_RTCERR2(SetChannelOutputVolumeScaling, ch_id, scale); 2441 return false;
2536 return false;
2537 }
2538 if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
2539 ch_id, static_cast<float>(left), static_cast<float>(right))) {
2540 LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
2541 // Do not return if fails. SetOutputVolumePan is not available for all
2542 // pltforms.
2543 }
2544 LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
2545 << " right=" << right * scale
2546 << " for channel " << ch_id << " and ssrc " << ssrc;
2547 } 2442 }
2443 if (-1 == engine()->voe()->volume()->SetOutputVolumePan(
2444 ch_id, static_cast<float>(left), static_cast<float>(right))) {
2445 LOG_RTCERR3(SetOutputVolumePan, ch_id, left, right);
2446 // Do not return if fails. SetOutputVolumePan is not available for all
2447 // pltforms.
2448 }
2449 LOG(LS_INFO) << "SetOutputScaling to left=" << left * scale
2450 << " right=" << right * scale
2451 << " for channel " << ch_id << " and ssrc " << ssrc;
2548 return true; 2452 return true;
2549 } 2453 }
2550 2454
2551 bool WebRtcVoiceMediaChannel::CanInsertDtmf() { 2455 bool WebRtcVoiceMediaChannel::CanInsertDtmf() {
2552 return dtmf_allowed_; 2456 return dtmf_allowed_;
2553 } 2457 }
2554 2458
2555 bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc, 2459 bool WebRtcVoiceMediaChannel::InsertDtmf(uint32_t ssrc,
2556 int event, 2460 int event,
2557 int duration, 2461 int duration,
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2601 } 2505 }
2602 } 2506 }
2603 2507
2604 return true; 2508 return true;
2605 } 2509 }
2606 2510
2607 void WebRtcVoiceMediaChannel::OnPacketReceived( 2511 void WebRtcVoiceMediaChannel::OnPacketReceived(
2608 rtc::Buffer* packet, const rtc::PacketTime& packet_time) { 2512 rtc::Buffer* packet, const rtc::PacketTime& packet_time) {
2609 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2513 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2610 2514
2611 // Forward packet to Call as well. 2515 uint32_t ssrc = 0;
2516 if (!GetRtpSsrc(packet->data(), packet->size(), &ssrc)) {
2517 return;
2518 }
2519
2520 if (receive_channels_.empty()) {
2521 // Create new channel, which will be the default receive channel.
2522 StreamParams sp;
2523 sp.ssrcs.push_back(ssrc);
2524 LOG(LS_INFO) << "Creating default receive stream for SSRC=" << ssrc << ".";
2525 if (!AddRecvStream(sp)) {
2526 LOG(LS_WARNING) << "Could not create default receive stream.";
2527 return;
2528 }
2529 default_recv_ssrc_ = ssrc;
2530 }
2531
2532 // Forward packet to Call. If the SSRC is unknown we'll return after this.
2612 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, 2533 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
2613 packet_time.not_before); 2534 packet_time.not_before);
2614 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, 2535 webrtc::PacketReceiver::DeliveryStatus delivery_result =
2615 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(), 2536 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
2616 webrtc_packet_time); 2537 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
2538 webrtc_packet_time);
2539 if (webrtc::PacketReceiver::DELIVERY_OK != delivery_result) {
2540 return;
2541 }
2617 2542
2618 // Pick which channel to send this packet to. If this packet doesn't match 2543 // Find the channel to send this packet to. It must exist since webrtc::Call
2619 // any multiplexed streams, just send it to the default channel. Otherwise, 2544 // was able to demux the packet.
2620 // send it to the specific decoder instance for that stream. 2545 int channel = GetReceiveChannelId(ssrc);
2621 int which_channel = 2546 RTC_DCHECK(channel != -1);
2622 GetReceiveChannelId(ParseSsrc(packet->data(), packet->size(), false));
2623 if (which_channel == -1) {
2624 which_channel = default_send_channel_id();
2625 }
2626 2547
2627 // Pass it off to the decoder. 2548 // Pass it off to the decoder.
2628 engine()->voe()->network()->ReceivedRTPPacket( 2549 engine()->voe()->network()->ReceivedRTPPacket(
2629 which_channel, packet->data(), packet->size(), 2550 channel, packet->data(), packet->size(), webrtc_packet_time);
2630 webrtc::PacketTime(packet_time.timestamp, packet_time.not_before));
2631 } 2551 }
2632 2552
2633 void WebRtcVoiceMediaChannel::OnRtcpReceived( 2553 void WebRtcVoiceMediaChannel::OnRtcpReceived(
2634 rtc::Buffer* packet, const rtc::PacketTime& packet_time) { 2554 rtc::Buffer* packet, const rtc::PacketTime& packet_time) {
2635 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2555 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2636 2556
2637 // Forward packet to Call as well. 2557 // Forward packet to Call as well.
2638 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp, 2558 const webrtc::PacketTime webrtc_packet_time(packet_time.timestamp,
2639 packet_time.not_before); 2559 packet_time.not_before);
2640 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO, 2560 call_->Receiver()->DeliverPacket(webrtc::MediaType::AUDIO,
2641 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(), 2561 reinterpret_cast<const uint8_t*>(packet->data()), packet->size(),
2642 webrtc_packet_time); 2562 webrtc_packet_time);
2643 2563
2644 // Sending channels need all RTCP packets with feedback information. 2564 // Sending channels need all RTCP packets with feedback information.
2645 // Even sender reports can contain attached report blocks. 2565 // Even sender reports can contain attached report blocks.
2646 // Receiving channels need sender reports in order to create 2566 // Receiving channels need sender reports in order to create
2647 // correct receiver reports. 2567 // correct receiver reports.
2648 int type = 0; 2568 int type = 0;
2649 if (!GetRtcpType(packet->data(), packet->size(), &type)) { 2569 if (!GetRtcpType(packet->data(), packet->size(), &type)) {
2650 LOG(LS_WARNING) << "Failed to parse type from received RTCP packet"; 2570 LOG(LS_WARNING) << "Failed to parse type from received RTCP packet";
2651 return; 2571 return;
2652 } 2572 }
2653 2573
2654 // If it is a sender report, find the receive channel that is listening. 2574 // If it is a sender report, find the receive channel that is listening.
2655 bool has_sent_to_default_channel = false;
2656 if (type == kRtcpTypeSR) { 2575 if (type == kRtcpTypeSR) {
2657 uint32_t ssrc = 0; 2576 uint32_t ssrc = 0;
2658 if (!GetRtcpSsrc(packet->data(), packet->size(), &ssrc)) { 2577 if (!GetRtcpSsrc(packet->data(), packet->size(), &ssrc)) {
2659 return; 2578 return;
2660 } 2579 }
2661 int recv_channel_id = GetReceiveChannelId(ssrc); 2580 int recv_channel_id = GetReceiveChannelId(ssrc);
2662 if (recv_channel_id != -1) { 2581 if (recv_channel_id != -1) {
2663 engine()->voe()->network()->ReceivedRTCPPacket( 2582 engine()->voe()->network()->ReceivedRTCPPacket(
2664 recv_channel_id, packet->data(), packet->size()); 2583 recv_channel_id, packet->data(), packet->size());
2665
2666 if (IsDefaultChannel(recv_channel_id))
2667 has_sent_to_default_channel = true;
2668 } 2584 }
2669 } 2585 }
2670 2586
2671 // SR may continue RR and any RR entry may correspond to any one of the send 2587 // SR may continue RR and any RR entry may correspond to any one of the send
2672 // channels. So all RTCP packets must be forwarded all send channels. VoE 2588 // channels. So all RTCP packets must be forwarded all send channels. VoE
2673 // will filter out RR internally. 2589 // will filter out RR internally.
2674 for (const auto& ch : send_channels_) { 2590 for (const auto& ch : send_channels_) {
2675 // Make sure not sending the same packet to default channel more than once.
2676 if (IsDefaultChannel(ch.second->channel()) &&
2677 has_sent_to_default_channel)
2678 continue;
2679
2680 engine()->voe()->network()->ReceivedRTCPPacket( 2591 engine()->voe()->network()->ReceivedRTCPPacket(
2681 ch.second->channel(), packet->data(), packet->size()); 2592 ch.second->channel(), packet->data(), packet->size());
2682 } 2593 }
2683 } 2594 }
2684 2595
2685 bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) { 2596 bool WebRtcVoiceMediaChannel::MuteStream(uint32_t ssrc, bool muted) {
2686 int channel = 2597 int channel =
2687 (ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc); 2598 (ssrc == 0) ? default_send_channel_id() : GetSendChannelId(ssrc);
2688 if (channel == -1) { 2599 if (channel == -1) {
2689 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use."; 2600 LOG(LS_WARNING) << "The specified ssrc " << ssrc << " is not in use.";
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
2864 sinfo.echo_return_loss_enhancement = echo_return_loss_enhancement; 2775 sinfo.echo_return_loss_enhancement = echo_return_loss_enhancement;
2865 sinfo.echo_delay_median_ms = echo_delay_median_ms; 2776 sinfo.echo_delay_median_ms = echo_delay_median_ms;
2866 sinfo.echo_delay_std_ms = echo_delay_std_ms; 2777 sinfo.echo_delay_std_ms = echo_delay_std_ms;
2867 // TODO(ajm): Re-enable this metric once we have a reliable implementation. 2778 // TODO(ajm): Re-enable this metric once we have a reliable implementation.
2868 sinfo.aec_quality_min = -1; 2779 sinfo.aec_quality_min = -1;
2869 sinfo.typing_noise_detected = typing_noise_detected_; 2780 sinfo.typing_noise_detected = typing_noise_detected_;
2870 2781
2871 info->senders.push_back(sinfo); 2782 info->senders.push_back(sinfo);
2872 } 2783 }
2873 2784
2874 // Build the list of receivers, one for each receiving channel, or 1 in 2785 // Get the SSRC and stats for each receiver.
2875 // a 1:1 call.
2876 std::vector<int> channels;
2877 for (const auto& ch : receive_channels_) { 2786 for (const auto& ch : receive_channels_) {
2878 channels.push_back(ch.second->channel()); 2787 int ch_id = ch.second->channel();
2879 }
2880 if (channels.empty()) {
2881 channels.push_back(default_send_channel_id());
2882 }
2883
2884 // Get the SSRC and stats for each receiver, based on our own calculations.
2885 for (int ch_id : channels) {
2886 memset(&cs, 0, sizeof(cs)); 2788 memset(&cs, 0, sizeof(cs));
2887 if (engine()->voe()->rtp()->GetRemoteSSRC(ch_id, ssrc) != -1 && 2789 if (engine()->voe()->rtp()->GetRemoteSSRC(ch_id, ssrc) != -1 &&
2888 engine()->voe()->rtp()->GetRTCPStatistics(ch_id, cs) != -1 && 2790 engine()->voe()->rtp()->GetRTCPStatistics(ch_id, cs) != -1 &&
2889 engine()->voe()->codec()->GetRecCodec(ch_id, codec) != -1) { 2791 engine()->voe()->codec()->GetRecCodec(ch_id, codec) != -1) {
2890 VoiceReceiverInfo rinfo; 2792 VoiceReceiverInfo rinfo;
2891 rinfo.add_ssrc(ssrc); 2793 rinfo.add_ssrc(ssrc);
2892 rinfo.bytes_rcvd = cs.bytesReceived; 2794 rinfo.bytes_rcvd = cs.bytesReceived;
2893 rinfo.packets_rcvd = cs.packetsReceived; 2795 rinfo.packets_rcvd = cs.packetsReceived;
2894 // The next four fields are from the most recently sent RTCP report. 2796 // The next four fields are from the most recently sent RTCP report.
2895 // Convert Q8 to floating point. 2797 // Convert Q8 to floating point.
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2972 int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel); 2874 int ret = engine()->voe()->volume()->GetSpeechOutputLevel(channel, ulevel);
2973 return (ret == 0) ? static_cast<int>(ulevel) : -1; 2875 return (ret == 0) ? static_cast<int>(ulevel) : -1;
2974 } 2876 }
2975 2877
2976 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const { 2878 int WebRtcVoiceMediaChannel::GetReceiveChannelId(uint32_t ssrc) const {
2977 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2879 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2978 ChannelMap::const_iterator it = receive_channels_.find(ssrc); 2880 ChannelMap::const_iterator it = receive_channels_.find(ssrc);
2979 if (it != receive_channels_.end()) { 2881 if (it != receive_channels_.end()) {
2980 return it->second->channel(); 2882 return it->second->channel();
2981 } 2883 }
2982 return (ssrc == default_receive_ssrc_) ? default_send_channel_id() : -1; 2884 return -1;
2983 } 2885 }
2984 2886
2985 int WebRtcVoiceMediaChannel::GetSendChannelId(uint32_t ssrc) const { 2887 int WebRtcVoiceMediaChannel::GetSendChannelId(uint32_t ssrc) const {
2986 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 2888 RTC_DCHECK(thread_checker_.CalledOnValidThread());
2987 ChannelMap::const_iterator it = send_channels_.find(ssrc); 2889 ChannelMap::const_iterator it = send_channels_.find(ssrc);
2988 if (it != send_channels_.end()) { 2890 if (it != send_channels_.end()) {
2989 return it->second->channel(); 2891 return it->second->channel();
2990 } 2892 }
2991 return -1; 2893 return -1;
2992 } 2894 }
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
3040 LOG_RTCERR2(SetRTCPStatus, channel, 1); 2942 LOG_RTCERR2(SetRTCPStatus, channel, 1);
3041 return false; 2943 return false;
3042 } 2944 }
3043 // TODO(juberti): Enable VQMon and RTCP XR reports, once we know what 2945 // TODO(juberti): Enable VQMon and RTCP XR reports, once we know what
3044 // what we want to do with them. 2946 // what we want to do with them.
3045 // engine()->voe().EnableVQMon(default_send_channel_id(), true); 2947 // engine()->voe().EnableVQMon(default_send_channel_id(), true);
3046 // engine()->voe().EnableRTCP_XR(default_send_channel_id(), true); 2948 // engine()->voe().EnableRTCP_XR(default_send_channel_id(), true);
3047 return true; 2949 return true;
3048 } 2950 }
3049 2951
3050 bool WebRtcVoiceMediaChannel::ResetRecvCodecs(int channel) {
3051 int ncodecs = engine()->voe()->codec()->NumOfCodecs();
3052 for (int i = 0; i < ncodecs; ++i) {
3053 webrtc::CodecInst voe_codec;
3054 if (engine()->voe()->codec()->GetCodec(i, voe_codec) != -1) {
3055 voe_codec.pltype = -1;
3056 if (engine()->voe()->codec()->SetRecPayloadType(
3057 channel, voe_codec) == -1) {
3058 LOG_RTCERR2(SetRecPayloadType, channel, ToString(voe_codec));
3059 return false;
3060 }
3061 }
3062 }
3063 return true;
3064 }
3065
3066 bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) { 2952 bool WebRtcVoiceMediaChannel::SetPlayout(int channel, bool playout) {
3067 if (playout) { 2953 if (playout) {
3068 LOG(LS_INFO) << "Starting playout for channel #" << channel; 2954 LOG(LS_INFO) << "Starting playout for channel #" << channel;
3069 if (engine()->voe()->base()->StartPlayout(channel) == -1) { 2955 if (engine()->voe()->base()->StartPlayout(channel) == -1) {
3070 LOG_RTCERR1(StartPlayout, channel); 2956 LOG_RTCERR1(StartPlayout, channel);
3071 return false; 2957 return false;
3072 } 2958 }
3073 } else { 2959 } else {
3074 LOG(LS_INFO) << "Stopping playout for channel #" << channel; 2960 LOG(LS_INFO) << "Stopping playout for channel #" << channel;
3075 engine()->voe()->base()->StopPlayout(channel); 2961 engine()->voe()->base()->StopPlayout(channel);
3076 } 2962 }
3077 return true; 2963 return true;
3078 } 2964 }
3079 2965
3080 uint32_t WebRtcVoiceMediaChannel::ParseSsrc(const void* data,
3081 size_t len,
3082 bool rtcp) {
3083 size_t ssrc_pos = (!rtcp) ? 8 : 4;
3084 uint32_t ssrc = 0;
3085 if (len >= (ssrc_pos + sizeof(ssrc))) {
3086 ssrc = rtc::GetBE32(static_cast<const char*>(data) + ssrc_pos);
3087 }
3088 return ssrc;
3089 }
3090
3091 // Convert VoiceEngine error code into VoiceMediaChannel::Error enum. 2966 // Convert VoiceEngine error code into VoiceMediaChannel::Error enum.
3092 VoiceMediaChannel::Error 2967 VoiceMediaChannel::Error
3093 WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) { 2968 WebRtcVoiceMediaChannel::WebRtcErrorToChannelError(int err_code) {
3094 switch (err_code) { 2969 switch (err_code) {
3095 case 0: 2970 case 0:
3096 return ERROR_NONE; 2971 return ERROR_NONE;
3097 case VE_CANNOT_START_RECORDING: 2972 case VE_CANNOT_START_RECORDING:
3098 case VE_MIC_VOL_ERROR: 2973 case VE_MIC_VOL_ERROR:
3099 case VE_GET_MIC_VOL_ERROR: 2974 case VE_GET_MIC_VOL_ERROR:
3100 case VE_CANNOT_ACCESS_MIC_VOL: 2975 case VE_CANNOT_ACCESS_MIC_VOL:
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
3175 } 3050 }
3176 3051
3177 bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal( 3052 bool WebRtcVoiceMediaChannel::SetRecvCodecsInternal(
3178 const std::vector<AudioCodec>& new_codecs) { 3053 const std::vector<AudioCodec>& new_codecs) {
3179 RTC_DCHECK(thread_checker_.CalledOnValidThread()); 3054 RTC_DCHECK(thread_checker_.CalledOnValidThread());
3180 for (const AudioCodec& codec : new_codecs) { 3055 for (const AudioCodec& codec : new_codecs) {
3181 webrtc::CodecInst voe_codec; 3056 webrtc::CodecInst voe_codec;
3182 if (engine()->FindWebRtcCodec(codec, &voe_codec)) { 3057 if (engine()->FindWebRtcCodec(codec, &voe_codec)) {
3183 LOG(LS_INFO) << ToString(codec); 3058 LOG(LS_INFO) << ToString(codec);
3184 voe_codec.pltype = codec.id; 3059 voe_codec.pltype = codec.id;
3185 if (default_receive_ssrc_ == 0) {
3186 // Set the receive codecs on the default channel explicitly if the
3187 // default channel is not used by |receive_channels_|, this happens in
3188 // conference mode or in non-conference mode when there is no playout
3189 // channel.
3190 // TODO(xians): Figure out how we use the default channel in conference
3191 // mode.
3192 if (engine()->voe()->codec()->SetRecPayloadType(
3193 default_send_channel_id(), voe_codec) == -1) {
3194 LOG_RTCERR2(SetRecPayloadType, default_send_channel_id(),
3195 ToString(voe_codec));
3196 return false;
3197 }
3198 }
3199
3200 // Set the receive codecs on all receiving channels.
3201 for (const auto& ch : receive_channels_) { 3060 for (const auto& ch : receive_channels_) {
3202 if (engine()->voe()->codec()->SetRecPayloadType( 3061 if (engine()->voe()->codec()->SetRecPayloadType(
3203 ch.second->channel(), voe_codec) == -1) { 3062 ch.second->channel(), voe_codec) == -1) {
3204 LOG_RTCERR2(SetRecPayloadType, ch.second->channel(), 3063 LOG_RTCERR2(SetRecPayloadType, ch.second->channel(),
3205 ToString(voe_codec)); 3064 ToString(voe_codec));
3206 return false; 3065 return false;
3207 } 3066 }
3208 } 3067 }
3209 } else { 3068 } else {
3210 LOG(LS_WARNING) << "Unknown codec " << ToString(codec); 3069 LOG(LS_WARNING) << "Unknown codec " << ToString(codec);
3211 return false; 3070 return false;
3212 } 3071 }
3213 } 3072 }
3214 return true; 3073 return true;
3215 } 3074 }
3216 3075
3217 } // namespace cricket 3076 } // namespace cricket
3218 3077
3219 #endif // HAVE_WEBRTC_VOICE 3078 #endif // HAVE_WEBRTC_VOICE
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698