| 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 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 94 volatile int next_channel_id_; | 95 volatile int next_channel_id_; |
| 95 Call::Config config_; | 96 Call::Config config_; |
| 96 | 97 |
| 97 // Needs to be held while write-locking |receive_crit_| or |send_crit_|. This | 98 // Needs to be held while write-locking |receive_crit_| or |send_crit_|. This |
| 98 // ensures that we have a consistent network state signalled to all senders | 99 // ensures that we have a consistent network state signalled to all senders |
| 99 // and receivers. | 100 // and receivers. |
| 100 rtc::CriticalSection network_enabled_crit_; | 101 rtc::CriticalSection network_enabled_crit_; |
| 101 bool network_enabled_ GUARDED_BY(network_enabled_crit_); | 102 bool network_enabled_ GUARDED_BY(network_enabled_crit_); |
| 102 | 103 |
| 103 rtc::scoped_ptr<RWLockWrapper> receive_crit_; | 104 rtc::scoped_ptr<RWLockWrapper> receive_crit_; |
| 105 // Audio and Video receive streams are owned by the client that creates them. |
| 104 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ | 106 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ |
| 105 GUARDED_BY(receive_crit_); | 107 GUARDED_BY(receive_crit_); |
| 106 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ | 108 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ |
| 107 GUARDED_BY(receive_crit_); | 109 GUARDED_BY(receive_crit_); |
| 108 std::set<VideoReceiveStream*> video_receive_streams_ | 110 std::set<VideoReceiveStream*> video_receive_streams_ |
| 109 GUARDED_BY(receive_crit_); | 111 GUARDED_BY(receive_crit_); |
| 110 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ | 112 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ |
| 111 GUARDED_BY(receive_crit_); | 113 GUARDED_BY(receive_crit_); |
| 112 | 114 |
| 113 rtc::scoped_ptr<RWLockWrapper> send_crit_; | 115 rtc::scoped_ptr<RWLockWrapper> send_crit_; |
| 116 // Audio and Video send streams are owned by the client that creates them. |
| 117 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); |
| 114 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); | 118 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); |
| 115 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); | 119 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); |
| 116 | 120 |
| 117 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; | 121 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; |
| 118 | 122 |
| 119 RtcEventLog* event_log_; | 123 RtcEventLog* event_log_; |
| 120 | 124 |
| 121 RTC_DISALLOW_COPY_AND_ASSIGN(Call); | 125 RTC_DISALLOW_COPY_AND_ASSIGN(Call); |
| 122 }; | 126 }; |
| 123 } // namespace internal | 127 } // namespace internal |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 155 | 159 |
| 156 Trace::CreateTrace(); | 160 Trace::CreateTrace(); |
| 157 module_process_thread_->Start(); | 161 module_process_thread_->Start(); |
| 158 | 162 |
| 159 channel_group_->SetBweBitrates(config_.bitrate_config.min_bitrate_bps, | 163 channel_group_->SetBweBitrates(config_.bitrate_config.min_bitrate_bps, |
| 160 config_.bitrate_config.start_bitrate_bps, | 164 config_.bitrate_config.start_bitrate_bps, |
| 161 config_.bitrate_config.max_bitrate_bps); | 165 config_.bitrate_config.max_bitrate_bps); |
| 162 } | 166 } |
| 163 | 167 |
| 164 Call::~Call() { | 168 Call::~Call() { |
| 165 RTC_CHECK_EQ(0u, video_send_ssrcs_.size()); | 169 RTC_CHECK(audio_send_ssrcs_.empty()); |
| 166 RTC_CHECK_EQ(0u, video_send_streams_.size()); | 170 RTC_CHECK(video_send_ssrcs_.empty()); |
| 167 RTC_CHECK_EQ(0u, audio_receive_ssrcs_.size()); | 171 RTC_CHECK(video_send_streams_.empty()); |
| 168 RTC_CHECK_EQ(0u, video_receive_ssrcs_.size()); | 172 RTC_CHECK(audio_receive_ssrcs_.empty()); |
| 169 RTC_CHECK_EQ(0u, video_receive_streams_.size()); | 173 RTC_CHECK(video_receive_ssrcs_.empty()); |
| 174 RTC_CHECK(video_receive_streams_.empty()); |
| 170 | 175 |
| 171 module_process_thread_->Stop(); | 176 module_process_thread_->Stop(); |
| 172 Trace::ReturnTrace(); | 177 Trace::ReturnTrace(); |
| 173 } | 178 } |
| 174 | 179 |
| 175 PacketReceiver* Call::Receiver() { return this; } | 180 PacketReceiver* Call::Receiver() { return this; } |
| 176 | 181 |
| 177 webrtc::AudioSendStream* Call::CreateAudioSendStream( | 182 webrtc::AudioSendStream* Call::CreateAudioSendStream( |
| 178 const webrtc::AudioSendStream::Config& config) { | 183 const webrtc::AudioSendStream::Config& config) { |
| 179 // TODO(pbos): When adding AudioSendStream, add both TRACE_EVENT0 and config | 184 TRACE_EVENT0("webrtc", "Call::CreateAudioSendStream"); |
| 180 // logging to AudioSendStream constructor. | 185 AudioSendStream* send_stream = new AudioSendStream(config); |
| 181 return nullptr; | 186 { |
| 187 rtc::CritScope lock(&network_enabled_crit_); |
| 188 WriteLockScoped write_lock(*send_crit_); |
| 189 RTC_DCHECK(audio_send_ssrcs_.find(config.rtp.ssrc) == |
| 190 audio_send_ssrcs_.end()); |
| 191 audio_send_ssrcs_[config.rtp.ssrc] = send_stream; |
| 192 |
| 193 if (!network_enabled_) |
| 194 send_stream->SignalNetworkState(kNetworkDown); |
| 195 } |
| 196 return send_stream; |
| 182 } | 197 } |
| 183 | 198 |
| 184 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { | 199 void Call::DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) { |
| 185 // TODO(pbos): When adding AudioSendStream, add both TRACE_EVENT0 and config | 200 TRACE_EVENT0("webrtc", "Call::DestroyAudioSendStream"); |
| 186 // logging to AudioSendStream destructor. | 201 RTC_DCHECK(send_stream != nullptr); |
| 202 |
| 203 send_stream->Stop(); |
| 204 |
| 205 webrtc::internal::AudioSendStream* audio_send_stream = |
| 206 static_cast<webrtc::internal::AudioSendStream*>(send_stream); |
| 207 { |
| 208 WriteLockScoped write_lock(*send_crit_); |
| 209 size_t num_deleted = audio_send_ssrcs_.erase( |
| 210 audio_send_stream->config().rtp.ssrc); |
| 211 RTC_DCHECK(num_deleted == 1); |
| 212 } |
| 213 delete audio_send_stream; |
| 187 } | 214 } |
| 188 | 215 |
| 189 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 216 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
| 190 const webrtc::AudioReceiveStream::Config& config) { | 217 const webrtc::AudioReceiveStream::Config& config) { |
| 191 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 218 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
| 192 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 219 AudioReceiveStream* receive_stream = new AudioReceiveStream( |
| 193 channel_group_->GetRemoteBitrateEstimator(), config); | 220 channel_group_->GetRemoteBitrateEstimator(), config); |
| 194 { | 221 { |
| 195 WriteLockScoped write_lock(*receive_crit_); | 222 WriteLockScoped write_lock(*receive_crit_); |
| 196 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 223 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
| 197 audio_receive_ssrcs_.end()); | 224 audio_receive_ssrcs_.end()); |
| 198 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 225 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
| 199 ConfigureSync(config.sync_group); | 226 ConfigureSync(config.sync_group); |
| 200 } | 227 } |
| 201 return receive_stream; | 228 return receive_stream; |
| 202 } | 229 } |
| 203 | 230 |
| 204 void Call::DestroyAudioReceiveStream( | 231 void Call::DestroyAudioReceiveStream( |
| 205 webrtc::AudioReceiveStream* receive_stream) { | 232 webrtc::AudioReceiveStream* receive_stream) { |
| 206 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); | 233 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); |
| 207 RTC_DCHECK(receive_stream != nullptr); | 234 RTC_DCHECK(receive_stream != nullptr); |
| 208 AudioReceiveStream* audio_receive_stream = | 235 webrtc::internal::AudioReceiveStream* audio_receive_stream = |
| 209 static_cast<AudioReceiveStream*>(receive_stream); | 236 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); |
| 210 { | 237 { |
| 211 WriteLockScoped write_lock(*receive_crit_); | 238 WriteLockScoped write_lock(*receive_crit_); |
| 212 size_t num_deleted = audio_receive_ssrcs_.erase( | 239 size_t num_deleted = audio_receive_ssrcs_.erase( |
| 213 audio_receive_stream->config().rtp.remote_ssrc); | 240 audio_receive_stream->config().rtp.remote_ssrc); |
| 214 RTC_DCHECK(num_deleted == 1); | 241 RTC_DCHECK(num_deleted == 1); |
| 215 const std::string& sync_group = audio_receive_stream->config().sync_group; | 242 const std::string& sync_group = audio_receive_stream->config().sync_group; |
| 216 const auto it = sync_stream_mapping_.find(sync_group); | 243 const auto it = sync_stream_mapping_.find(sync_group); |
| 217 if (it != sync_stream_mapping_.end() && | 244 if (it != sync_stream_mapping_.end() && |
| 218 it->second == audio_receive_stream) { | 245 it->second == audio_receive_stream) { |
| 219 sync_stream_mapping_.erase(it); | 246 sync_stream_mapping_.erase(it); |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 353 channel_group_->GetBitrateController()->AvailableBandwidth(&send_bandwidth); | 380 channel_group_->GetBitrateController()->AvailableBandwidth(&send_bandwidth); |
| 354 std::vector<unsigned int> ssrcs; | 381 std::vector<unsigned int> ssrcs; |
| 355 uint32_t recv_bandwidth = 0; | 382 uint32_t recv_bandwidth = 0; |
| 356 channel_group_->GetRemoteBitrateEstimator()->LatestEstimate(&ssrcs, | 383 channel_group_->GetRemoteBitrateEstimator()->LatestEstimate(&ssrcs, |
| 357 &recv_bandwidth); | 384 &recv_bandwidth); |
| 358 stats.send_bandwidth_bps = send_bandwidth; | 385 stats.send_bandwidth_bps = send_bandwidth; |
| 359 stats.recv_bandwidth_bps = recv_bandwidth; | 386 stats.recv_bandwidth_bps = recv_bandwidth; |
| 360 stats.pacer_delay_ms = channel_group_->GetPacerQueuingDelayMs(); | 387 stats.pacer_delay_ms = channel_group_->GetPacerQueuingDelayMs(); |
| 361 { | 388 { |
| 362 ReadLockScoped read_lock(*send_crit_); | 389 ReadLockScoped read_lock(*send_crit_); |
| 390 // TODO(solenberg): Add audio send streams. |
| 363 for (const auto& kv : video_send_ssrcs_) { | 391 for (const auto& kv : video_send_ssrcs_) { |
| 364 int rtt_ms = kv.second->GetRtt(); | 392 int rtt_ms = kv.second->GetRtt(); |
| 365 if (rtt_ms > 0) | 393 if (rtt_ms > 0) |
| 366 stats.rtt_ms = rtt_ms; | 394 stats.rtt_ms = rtt_ms; |
| 367 } | 395 } |
| 368 } | 396 } |
| 369 return stats; | 397 return stats; |
| 370 } | 398 } |
| 371 | 399 |
| 372 void Call::SetBitrateConfig( | 400 void Call::SetBitrateConfig( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 392 } | 420 } |
| 393 | 421 |
| 394 void Call::SignalNetworkState(NetworkState state) { | 422 void Call::SignalNetworkState(NetworkState state) { |
| 395 // Take crit for entire function, it needs to be held while updating streams | 423 // Take crit for entire function, it needs to be held while updating streams |
| 396 // to guarantee a consistent state across streams. | 424 // to guarantee a consistent state across streams. |
| 397 rtc::CritScope lock(&network_enabled_crit_); | 425 rtc::CritScope lock(&network_enabled_crit_); |
| 398 network_enabled_ = state == kNetworkUp; | 426 network_enabled_ = state == kNetworkUp; |
| 399 channel_group_->SignalNetworkState(state); | 427 channel_group_->SignalNetworkState(state); |
| 400 { | 428 { |
| 401 ReadLockScoped write_lock(*send_crit_); | 429 ReadLockScoped write_lock(*send_crit_); |
| 430 for (auto& kv : audio_send_ssrcs_) { |
| 431 kv.second->SignalNetworkState(state); |
| 432 } |
| 402 for (auto& kv : video_send_ssrcs_) { | 433 for (auto& kv : video_send_ssrcs_) { |
| 403 kv.second->SignalNetworkState(state); | 434 kv.second->SignalNetworkState(state); |
| 404 } | 435 } |
| 405 } | 436 } |
| 406 { | 437 { |
| 407 ReadLockScoped write_lock(*receive_crit_); | 438 ReadLockScoped write_lock(*receive_crit_); |
| 408 for (auto& kv : video_receive_ssrcs_) { | 439 for (auto& kv : video_receive_ssrcs_) { |
| 409 kv.second->SignalNetworkState(state); | 440 kv.second->SignalNetworkState(state); |
| 410 } | 441 } |
| 411 } | 442 } |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 size_t length, | 563 size_t length, |
| 533 const PacketTime& packet_time) { | 564 const PacketTime& packet_time) { |
| 534 if (RtpHeaderParser::IsRtcp(packet, length)) | 565 if (RtpHeaderParser::IsRtcp(packet, length)) |
| 535 return DeliverRtcp(media_type, packet, length); | 566 return DeliverRtcp(media_type, packet, length); |
| 536 | 567 |
| 537 return DeliverRtp(media_type, packet, length, packet_time); | 568 return DeliverRtp(media_type, packet, length, packet_time); |
| 538 } | 569 } |
| 539 | 570 |
| 540 } // namespace internal | 571 } // namespace internal |
| 541 } // namespace webrtc | 572 } // namespace webrtc |
| OLD | NEW |