| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include <string.h> | 11 #include <string.h> |
| 12 | 12 |
| 13 #include <map> | 13 #include <map> |
| 14 #include <vector> | 14 #include <vector> |
| 15 | 15 |
| 16 #include "webrtc/audio/audio_receive_stream.h" | 16 #include "webrtc/audio/audio_receive_stream.h" |
| 17 #include "webrtc/audio/audio_send_stream.h" |
| 17 #include "webrtc/base/checks.h" | 18 #include "webrtc/base/checks.h" |
| 18 #include "webrtc/base/scoped_ptr.h" | 19 #include "webrtc/base/scoped_ptr.h" |
| 19 #include "webrtc/base/thread_annotations.h" | 20 #include "webrtc/base/thread_annotations.h" |
| 20 #include "webrtc/call.h" | 21 #include "webrtc/call.h" |
| 21 #include "webrtc/call/rtc_event_log.h" | 22 #include "webrtc/call/rtc_event_log.h" |
| 22 #include "webrtc/common.h" | 23 #include "webrtc/common.h" |
| 23 #include "webrtc/config.h" | 24 #include "webrtc/config.h" |
| 24 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" | 25 #include "webrtc/modules/rtp_rtcp/interface/rtp_header_parser.h" |
| 25 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 26 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 26 #include "webrtc/modules/utility/interface/process_thread.h" | 27 #include "webrtc/modules/utility/interface/process_thread.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 volatile int next_channel_id_; | 97 volatile int next_channel_id_; |
| 97 Call::Config config_; | 98 Call::Config config_; |
| 98 | 99 |
| 99 // Needs to be held while write-locking |receive_crit_| or |send_crit_|. This | 100 // Needs to be held while write-locking |receive_crit_| or |send_crit_|. This |
| 100 // ensures that we have a consistent network state signalled to all senders | 101 // ensures that we have a consistent network state signalled to all senders |
| 101 // and receivers. | 102 // and receivers. |
| 102 rtc::CriticalSection network_enabled_crit_; | 103 rtc::CriticalSection network_enabled_crit_; |
| 103 bool network_enabled_ GUARDED_BY(network_enabled_crit_); | 104 bool network_enabled_ GUARDED_BY(network_enabled_crit_); |
| 104 | 105 |
| 105 rtc::scoped_ptr<RWLockWrapper> receive_crit_; | 106 rtc::scoped_ptr<RWLockWrapper> receive_crit_; |
| 107 // Audio and Video receive streams are owned by the client that creates them. |
| 106 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ | 108 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ |
| 107 GUARDED_BY(receive_crit_); | 109 GUARDED_BY(receive_crit_); |
| 108 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ | 110 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ |
| 109 GUARDED_BY(receive_crit_); | 111 GUARDED_BY(receive_crit_); |
| 110 std::set<VideoReceiveStream*> video_receive_streams_ | 112 std::set<VideoReceiveStream*> video_receive_streams_ |
| 111 GUARDED_BY(receive_crit_); | 113 GUARDED_BY(receive_crit_); |
| 112 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ | 114 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ |
| 113 GUARDED_BY(receive_crit_); | 115 GUARDED_BY(receive_crit_); |
| 114 | 116 |
| 115 rtc::scoped_ptr<RWLockWrapper> send_crit_; | 117 rtc::scoped_ptr<RWLockWrapper> send_crit_; |
| 118 // Audio and Video send streams are owned by the client that creates them. |
| 119 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); |
| 116 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); | 120 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); |
| 117 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); | 121 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); |
| 118 | 122 |
| 119 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; | 123 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; |
| 120 | 124 |
| 121 RtcEventLog* event_log_; | 125 RtcEventLog* event_log_; |
| 122 | 126 |
| 123 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 127 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
| 124 }; | 128 }; |
| 125 } // namespace internal | 129 } // namespace internal |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 157 | 161 |
| 158 Trace::CreateTrace(); | 162 Trace::CreateTrace(); |
| 159 module_process_thread_->Start(); | 163 module_process_thread_->Start(); |
| 160 | 164 |
| 161 channel_group_->SetBweBitrates(config_.bitrate_config.min_bitrate_bps, | 165 channel_group_->SetBweBitrates(config_.bitrate_config.min_bitrate_bps, |
| 162 config_.bitrate_config.start_bitrate_bps, | 166 config_.bitrate_config.start_bitrate_bps, |
| 163 config_.bitrate_config.max_bitrate_bps); | 167 config_.bitrate_config.max_bitrate_bps); |
| 164 } | 168 } |
| 165 | 169 |
| 166 Call::~Call() { | 170 Call::~Call() { |
| 167 RTC_CHECK_EQ(0u, video_send_ssrcs_.size()); | 171 RTC_CHECK(audio_send_ssrcs_.empty()); |
| 168 RTC_CHECK_EQ(0u, video_send_streams_.size()); | 172 RTC_CHECK(video_send_ssrcs_.empty()); |
| 169 RTC_CHECK_EQ(0u, audio_receive_ssrcs_.size()); | 173 RTC_CHECK(video_send_streams_.empty()); |
| 170 RTC_CHECK_EQ(0u, video_receive_ssrcs_.size()); | 174 RTC_CHECK(audio_receive_ssrcs_.empty()); |
| 171 RTC_CHECK_EQ(0u, video_receive_streams_.size()); | 175 RTC_CHECK(video_receive_ssrcs_.empty()); |
| 176 RTC_CHECK(video_receive_streams_.empty()); |
| 172 | 177 |
| 173 module_process_thread_->Stop(); | 178 module_process_thread_->Stop(); |
| 174 Trace::ReturnTrace(); | 179 Trace::ReturnTrace(); |
| 175 } | 180 } |
| 176 | 181 |
| 177 PacketReceiver* Call::Receiver() { return this; } | 182 PacketReceiver* Call::Receiver() { return this; } |
| 178 | 183 |
| 179 webrtc::AudioSendStream* Call::CreateAudioSendStream( | 184 webrtc::AudioSendStream* Call::CreateAudioSendStream( |
| 180 const webrtc::AudioSendStream::Config& config) { | 185 const webrtc::AudioSendStream::Config& config) { |
| 181 // TODO(pbos): When adding AudioSendStream, add both TRACE_EVENT0 and config | 186 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); |
| 182 // logging to AudioSendStream constructor. | 187 AudioSendStream* send_stream = new AudioSendStream(config); |
| 183 return nullptr; | 188 { |
| 189 rtc::CritScope lock(&network_enabled_crit_); |
| 190 WriteLockScoped write_lock(*send_crit_); |
| 191 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == |
| 192 audio_send_ssrcs_.end()); |
| 193 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; |
| 194 |
| 195 if (!network_enabled_) |
| 196 send_stream->SignalNetworkState(kNetworkDown); |
| 197 } |
| 198 return send_stream; |
| 184 } | 199 } |
| 185 | 200 |
| 186 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { | 201 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { |
| 187 // TODO(pbos): When adding AudioSendStream, add both TRACE_EVENT0 and config | 202 TRACE_EVENT0("webrtc", "Call::DestroyAudioSendStream"); |
| 188 // logging to AudioSendStream destructor. | 203 RTC_DCHECK(send_stream != nullptr); |
| 204 |
| 205 send_stream->Stop(); |
| 206 |
| 207 webrtc::internal::AudioSendStream* audio_send_stream = |
| 208 static_cast<webrtc::internal::AudioSendStream*>(send_stream); |
| 209 { |
| 210 WriteLockScoped write_lock(*send_crit_); |
| 211 size_t num_deleted = audio_send_ssrcs_.erase( |
| 212 audio_send_stream->config().rtp.ssrc); |
| 213 RTC_DCHECK(num_deleted == 1); |
| 214 } |
| 215 delete audio_send_stream; |
| 189 } | 216 } |
| 190 | 217 |
| 191 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 218 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
| 192 const webrtc::AudioReceiveStream::Config& config) { | 219 const webrtc::AudioReceiveStream::Config& config) { |
| 193 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 220 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
| 194 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 221 AudioReceiveStream* receive_stream = new AudioReceiveStream( |
| 195 channel_group_->GetRemoteBitrateEstimator(), config); | 222 channel_group_->GetRemoteBitrateEstimator(), config); |
| 196 { | 223 { |
| 197 WriteLockScoped write_lock(*receive_crit_); | 224 WriteLockScoped write_lock(*receive_crit_); |
| 198 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 225 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
| 199 audio_receive_ssrcs_.end()); | 226 audio_receive_ssrcs_.end()); |
| 200 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 227 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
| 201 ConfigureSync(config.sync_group); | 228 ConfigureSync(config.sync_group); |
| 202 } | 229 } |
| 203 return receive_stream; | 230 return receive_stream; |
| 204 } | 231 } |
| 205 | 232 |
| 206 void Call::DestroyAudioReceiveStream( | 233 void Call::DestroyAudioReceiveStream( |
| 207 webrtc::AudioReceiveStream* receive_stream) { | 234 webrtc::AudioReceiveStream* receive_stream) { |
| 208 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); | 235 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); |
| 209 RTC_DCHECK(receive_stream != nullptr); | 236 RTC_DCHECK(receive_stream != nullptr); |
| 210 AudioReceiveStream* audio_receive_stream = | 237 webrtc::internal::AudioReceiveStream* audio_receive_stream = |
| 211 static_cast<AudioReceiveStream*>(receive_stream); | 238 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); |
| 212 { | 239 { |
| 213 WriteLockScoped write_lock(*receive_crit_); | 240 WriteLockScoped write_lock(*receive_crit_); |
| 214 size_t num_deleted = audio_receive_ssrcs_.erase( | 241 size_t num_deleted = audio_receive_ssrcs_.erase( |
| 215 audio_receive_stream->config().rtp.remote_ssrc); | 242 audio_receive_stream->config().rtp.remote_ssrc); |
| 216 RTC_DCHECK(num_deleted == 1); | 243 RTC_DCHECK(num_deleted == 1); |
| 217 const std::string& sync_group = audio_receive_stream->config().sync_group; | 244 const std::string& sync_group = audio_receive_stream->config().sync_group; |
| 218 const auto it = sync_stream_mapping_.find(sync_group); | 245 const auto it = sync_stream_mapping_.find(sync_group); |
| 219 if (it != sync_stream_mapping_.end() && | 246 if (it != sync_stream_mapping_.end() && |
| 220 it->second == audio_receive_stream) { | 247 it->second == audio_receive_stream) { |
| 221 sync_stream_mapping_.erase(it); | 248 sync_stream_mapping_.erase(it); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 channel_group_->GetBitrateController()->AvailableBandwidth(&send_bandwidth); | 382 channel_group_->GetBitrateController()->AvailableBandwidth(&send_bandwidth); |
| 356 std::vector<unsigned int> ssrcs; | 383 std::vector<unsigned int> ssrcs; |
| 357 uint32_t recv_bandwidth = 0; | 384 uint32_t recv_bandwidth = 0; |
| 358 channel_group_->GetRemoteBitrateEstimator()->LatestEstimate(&ssrcs, | 385 channel_group_->GetRemoteBitrateEstimator()->LatestEstimate(&ssrcs, |
| 359 &recv_bandwidth); | 386 &recv_bandwidth); |
| 360 stats.send_bandwidth_bps = send_bandwidth; | 387 stats.send_bandwidth_bps = send_bandwidth; |
| 361 stats.recv_bandwidth_bps = recv_bandwidth; | 388 stats.recv_bandwidth_bps = recv_bandwidth; |
| 362 stats.pacer_delay_ms = channel_group_->GetPacerQueuingDelayMs(); | 389 stats.pacer_delay_ms = channel_group_->GetPacerQueuingDelayMs(); |
| 363 { | 390 { |
| 364 ReadLockScoped read_lock(*send_crit_); | 391 ReadLockScoped read_lock(*send_crit_); |
| 392 // TODO(solenberg): Add audio send streams. |
| 365 for (const auto& kv : video_send_ssrcs_) { | 393 for (const auto& kv : video_send_ssrcs_) { |
| 366 int rtt_ms = kv.second->GetRtt(); | 394 int rtt_ms = kv.second->GetRtt(); |
| 367 if (rtt_ms > 0) | 395 if (rtt_ms > 0) |
| 368 stats.rtt_ms = rtt_ms; | 396 stats.rtt_ms = rtt_ms; |
| 369 } | 397 } |
| 370 } | 398 } |
| 371 return stats; | 399 return stats; |
| 372 } | 400 } |
| 373 | 401 |
| 374 void Call::SetBitrateConfig( | 402 void Call::SetBitrateConfig( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 394 } | 422 } |
| 395 | 423 |
| 396 void Call::SignalNetworkState(NetworkState state) { | 424 void Call::SignalNetworkState(NetworkState state) { |
| 397 // Take crit for entire function, it needs to be held while updating streams | 425 // Take crit for entire function, it needs to be held while updating streams |
| 398 // to guarantee a consistent state across streams. | 426 // to guarantee a consistent state across streams. |
| 399 rtc::CritScope lock(&network_enabled_crit_); | 427 rtc::CritScope lock(&network_enabled_crit_); |
| 400 network_enabled_ = state == kNetworkUp; | 428 network_enabled_ = state == kNetworkUp; |
| 401 channel_group_->SignalNetworkState(state); | 429 channel_group_->SignalNetworkState(state); |
| 402 { | 430 { |
| 403 ReadLockScoped write_lock(*send_crit_); | 431 ReadLockScoped write_lock(*send_crit_); |
| 432 for (auto& kv : audio_send_ssrcs_) { |
| 433 kv.second->SignalNetworkState(state); |
| 434 } |
| 404 for (auto& kv : video_send_ssrcs_) { | 435 for (auto& kv : video_send_ssrcs_) { |
| 405 kv.second->SignalNetworkState(state); | 436 kv.second->SignalNetworkState(state); |
| 406 } | 437 } |
| 407 } | 438 } |
| 408 { | 439 { |
| 409 ReadLockScoped write_lock(*receive_crit_); | 440 ReadLockScoped write_lock(*receive_crit_); |
| 410 for (auto& kv : video_receive_ssrcs_) { | 441 for (auto& kv : video_receive_ssrcs_) { |
| 411 kv.second->SignalNetworkState(state); | 442 kv.second->SignalNetworkState(state); |
| 412 } | 443 } |
| 413 } | 444 } |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 538 size_t length, | 569 size_t length, |
| 539 const PacketTime& packet_time) { | 570 const PacketTime& packet_time) { |
| 540 if (RtpHeaderParser::IsRtcp(packet, length)) | 571 if (RtpHeaderParser::IsRtcp(packet, length)) |
| 541 return DeliverRtcp(media_type, packet, length); | 572 return DeliverRtcp(media_type, packet, length); |
| 542 | 573 |
| 543 return DeliverRtp(media_type, packet, length, packet_time); | 574 return DeliverRtp(media_type, packet, length, packet_time); |
| 544 } | 575 } |
| 545 | 576 |
| 546 } // namespace internal | 577 } // namespace internal |
| 547 } // namespace webrtc | 578 } // namespace webrtc |
| OLD | NEW |