Chromium Code Reviews| 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 #include <algorithm> | 12 #include <algorithm> |
| 13 #include <map> | 13 #include <map> |
| 14 #include <memory> | 14 #include <memory> |
| 15 #include <utility> | |
| 15 #include <vector> | 16 #include <vector> |
| 16 | 17 |
| 17 #include "webrtc/audio/audio_receive_stream.h" | 18 #include "webrtc/audio/audio_receive_stream.h" |
| 18 #include "webrtc/audio/audio_send_stream.h" | 19 #include "webrtc/audio/audio_send_stream.h" |
| 19 #include "webrtc/audio/audio_state.h" | 20 #include "webrtc/audio/audio_state.h" |
| 20 #include "webrtc/audio/scoped_voe_interface.h" | 21 #include "webrtc/audio/scoped_voe_interface.h" |
| 21 #include "webrtc/base/basictypes.h" | 22 #include "webrtc/base/basictypes.h" |
| 22 #include "webrtc/base/checks.h" | 23 #include "webrtc/base/checks.h" |
| 23 #include "webrtc/base/constructormagic.h" | 24 #include "webrtc/base/constructormagic.h" |
| 24 #include "webrtc/base/logging.h" | 25 #include "webrtc/base/logging.h" |
| 25 #include "webrtc/base/task_queue.h" | 26 #include "webrtc/base/task_queue.h" |
| 26 #include "webrtc/base/thread_annotations.h" | 27 #include "webrtc/base/thread_annotations.h" |
| 27 #include "webrtc/base/thread_checker.h" | 28 #include "webrtc/base/thread_checker.h" |
| 28 #include "webrtc/base/trace_event.h" | 29 #include "webrtc/base/trace_event.h" |
| 29 #include "webrtc/call.h" | 30 #include "webrtc/call.h" |
| 30 #include "webrtc/call/bitrate_allocator.h" | 31 #include "webrtc/call/bitrate_allocator.h" |
| 32 #include "webrtc/call/flexfec_receive_stream.h" | |
| 31 #include "webrtc/config.h" | 33 #include "webrtc/config.h" |
| 32 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" | 34 #include "webrtc/logging/rtc_event_log/rtc_event_log.h" |
| 33 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" | 35 #include "webrtc/modules/bitrate_controller/include/bitrate_controller.h" |
| 34 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" | 36 #include "webrtc/modules/congestion_controller/include/congestion_controller.h" |
| 35 #include "webrtc/modules/pacing/paced_sender.h" | 37 #include "webrtc/modules/pacing/paced_sender.h" |
| 36 #include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" | 38 #include "webrtc/modules/rtp_rtcp/include/flexfec_receiver.h" |
| 37 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" | 39 #include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
| 38 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" | 40 #include "webrtc/modules/rtp_rtcp/source/byte_io.h" |
| 39 #include "webrtc/modules/utility/include/process_thread.h" | 41 #include "webrtc/modules/utility/include/process_thread.h" |
| 40 #include "webrtc/system_wrappers/include/clock.h" | 42 #include "webrtc/system_wrappers/include/clock.h" |
| (...skipping 18 matching lines...) Expand all Loading... | |
| 59 | 61 |
| 60 class Call : public webrtc::Call, | 62 class Call : public webrtc::Call, |
| 61 public PacketReceiver, | 63 public PacketReceiver, |
| 62 public RecoveredPacketReceiver, | 64 public RecoveredPacketReceiver, |
| 63 public CongestionController::Observer, | 65 public CongestionController::Observer, |
| 64 public BitrateAllocator::LimitObserver { | 66 public BitrateAllocator::LimitObserver { |
| 65 public: | 67 public: |
| 66 explicit Call(const Call::Config& config); | 68 explicit Call(const Call::Config& config); |
| 67 virtual ~Call(); | 69 virtual ~Call(); |
| 68 | 70 |
| 71 // Implements webrtc::Call. | |
| 69 PacketReceiver* Receiver() override; | 72 PacketReceiver* Receiver() override; |
| 70 | 73 |
| 71 webrtc::AudioSendStream* CreateAudioSendStream( | 74 webrtc::AudioSendStream* CreateAudioSendStream( |
| 72 const webrtc::AudioSendStream::Config& config) override; | 75 const webrtc::AudioSendStream::Config& config) override; |
| 73 void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override; | 76 void DestroyAudioSendStream(webrtc::AudioSendStream* send_stream) override; |
| 74 | 77 |
| 75 webrtc::AudioReceiveStream* CreateAudioReceiveStream( | 78 webrtc::AudioReceiveStream* CreateAudioReceiveStream( |
| 76 const webrtc::AudioReceiveStream::Config& config) override; | 79 const webrtc::AudioReceiveStream::Config& config) override; |
| 77 void DestroyAudioReceiveStream( | 80 void DestroyAudioReceiveStream( |
| 78 webrtc::AudioReceiveStream* receive_stream) override; | 81 webrtc::AudioReceiveStream* receive_stream) override; |
| 79 | 82 |
| 80 webrtc::VideoSendStream* CreateVideoSendStream( | 83 webrtc::VideoSendStream* CreateVideoSendStream( |
| 81 webrtc::VideoSendStream::Config config, | 84 webrtc::VideoSendStream::Config config, |
| 82 VideoEncoderConfig encoder_config) override; | 85 VideoEncoderConfig encoder_config) override; |
| 83 void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override; | 86 void DestroyVideoSendStream(webrtc::VideoSendStream* send_stream) override; |
| 84 | 87 |
| 85 webrtc::VideoReceiveStream* CreateVideoReceiveStream( | 88 webrtc::VideoReceiveStream* CreateVideoReceiveStream( |
| 86 webrtc::VideoReceiveStream::Config configuration) override; | 89 webrtc::VideoReceiveStream::Config configuration) override; |
| 87 void DestroyVideoReceiveStream( | 90 void DestroyVideoReceiveStream( |
| 88 webrtc::VideoReceiveStream* receive_stream) override; | 91 webrtc::VideoReceiveStream* receive_stream) override; |
| 89 | 92 |
| 93 webrtc::FlexfecReceiveStream* CreateFlexfecReceiveStream( | |
| 94 webrtc::FlexfecReceiveStream::Config configuration) override; | |
| 95 void DestroyFlexfecReceiveStream( | |
| 96 webrtc::FlexfecReceiveStream* receive_stream) override; | |
| 97 | |
| 90 Stats GetStats() const override; | 98 Stats GetStats() const override; |
| 91 | 99 |
| 100 // Implements PacketReceiver. | |
| 92 DeliveryStatus DeliverPacket(MediaType media_type, | 101 DeliveryStatus DeliverPacket(MediaType media_type, |
| 93 const uint8_t* packet, | 102 const uint8_t* packet, |
| 94 size_t length, | 103 size_t length, |
| 95 const PacketTime& packet_time) override; | 104 const PacketTime& packet_time) override; |
| 96 | 105 |
| 97 // Implements RecoveredPacketReceiver. | 106 // Implements RecoveredPacketReceiver. |
| 98 bool OnRecoveredPacket(const uint8_t* packet, size_t length) override; | 107 bool OnRecoveredPacket(const uint8_t* packet, size_t length) override; |
| 99 | 108 |
| 100 void SetBitrateConfig( | 109 void SetBitrateConfig( |
| 101 const webrtc::Call::Config::BitrateConfig& bitrate_config) override; | 110 const webrtc::Call::Config::BitrateConfig& bitrate_config) override; |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 146 const std::unique_ptr<ProcessThread> pacer_thread_; | 155 const std::unique_ptr<ProcessThread> pacer_thread_; |
| 147 const std::unique_ptr<CallStats> call_stats_; | 156 const std::unique_ptr<CallStats> call_stats_; |
| 148 const std::unique_ptr<BitrateAllocator> bitrate_allocator_; | 157 const std::unique_ptr<BitrateAllocator> bitrate_allocator_; |
| 149 Call::Config config_; | 158 Call::Config config_; |
| 150 rtc::ThreadChecker configuration_thread_checker_; | 159 rtc::ThreadChecker configuration_thread_checker_; |
| 151 | 160 |
| 152 NetworkState audio_network_state_; | 161 NetworkState audio_network_state_; |
| 153 NetworkState video_network_state_; | 162 NetworkState video_network_state_; |
| 154 | 163 |
| 155 std::unique_ptr<RWLockWrapper> receive_crit_; | 164 std::unique_ptr<RWLockWrapper> receive_crit_; |
| 156 // Audio and Video receive streams are owned by the client that creates them. | 165 // Audio, Video, and FlexFEC receive streams are owned by the client that |
| 166 // creates them. | |
| 157 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ | 167 std::map<uint32_t, AudioReceiveStream*> audio_receive_ssrcs_ |
| 158 GUARDED_BY(receive_crit_); | 168 GUARDED_BY(receive_crit_); |
| 159 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ | 169 std::map<uint32_t, VideoReceiveStream*> video_receive_ssrcs_ |
| 160 GUARDED_BY(receive_crit_); | 170 GUARDED_BY(receive_crit_); |
| 161 std::set<VideoReceiveStream*> video_receive_streams_ | 171 std::set<VideoReceiveStream*> video_receive_streams_ |
| 162 GUARDED_BY(receive_crit_); | 172 GUARDED_BY(receive_crit_); |
| 173 // Each media stream could conceivably be protected by multiple FlexFEC | |
| 174 // streams. | |
| 175 std::multimap<uint32_t, FlexfecReceiveStream*> flexfec_receive_ssrcs_media_ | |
| 176 GUARDED_BY(receive_crit_); | |
| 177 std::map<uint32_t, FlexfecReceiveStream*> flexfec_receive_ssrcs_protection_ | |
| 178 GUARDED_BY(receive_crit_); | |
| 179 std::set<FlexfecReceiveStream*> flexfec_receive_streams_ | |
| 180 GUARDED_BY(receive_crit_); | |
| 163 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ | 181 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ |
| 164 GUARDED_BY(receive_crit_); | 182 GUARDED_BY(receive_crit_); |
| 165 | 183 |
| 166 std::unique_ptr<RWLockWrapper> send_crit_; | 184 std::unique_ptr<RWLockWrapper> send_crit_; |
| 167 // Audio and Video send streams are owned by the client that creates them. | 185 // Audio and Video send streams are owned by the client that creates them. |
| 168 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); | 186 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); |
| 169 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); | 187 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); |
| 170 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); | 188 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); |
| 171 | 189 |
| 172 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; | 190 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; |
| (...skipping 398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 571 } | 589 } |
| 572 } | 590 } |
| 573 video_receive_streams_.erase(receive_stream_impl); | 591 video_receive_streams_.erase(receive_stream_impl); |
| 574 RTC_CHECK(receive_stream_impl != nullptr); | 592 RTC_CHECK(receive_stream_impl != nullptr); |
| 575 ConfigureSync(receive_stream_impl->config().sync_group); | 593 ConfigureSync(receive_stream_impl->config().sync_group); |
| 576 } | 594 } |
| 577 UpdateAggregateNetworkState(); | 595 UpdateAggregateNetworkState(); |
| 578 delete receive_stream_impl; | 596 delete receive_stream_impl; |
| 579 } | 597 } |
| 580 | 598 |
| 599 webrtc::FlexfecReceiveStream* Call::CreateFlexfecReceiveStream( | |
| 600 webrtc::FlexfecReceiveStream::Config configuration) { | |
| 601 TRACE_EVENT0("webrtc", "Call::CreateFlexfecReceiveStream"); | |
| 602 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | |
| 603 FlexfecReceiveStream* receive_stream = | |
| 604 new FlexfecReceiveStream(std::move(configuration), this); | |
| 605 | |
| 606 const webrtc::FlexfecReceiveStream::Config& config = receive_stream->config(); | |
| 607 { | |
| 608 WriteLockScoped write_lock(*receive_crit_); | |
| 609 for (auto ssrc : config.protected_media_ssrcs) | |
| 610 flexfec_receive_ssrcs_media_.insert(std::make_pair(ssrc, receive_stream)); | |
| 611 RTC_DCHECK(flexfec_receive_ssrcs_protection_.find(config.flexfec_ssrc) == | |
| 612 flexfec_receive_ssrcs_protection_.end()); | |
| 613 flexfec_receive_ssrcs_protection_[config.flexfec_ssrc] = receive_stream; | |
| 614 flexfec_receive_streams_.insert(receive_stream); | |
| 615 } | |
| 616 // TODO(brandtr): Store config in RtcEventLog here. | |
| 617 return receive_stream; | |
| 618 } | |
| 619 | |
| 620 void Call::DestroyFlexfecReceiveStream( | |
| 621 webrtc::FlexfecReceiveStream* receive_stream) { | |
| 622 TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream"); | |
| 623 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | |
| 624 RTC_DCHECK(receive_stream != nullptr); | |
| 625 // There exist no other derived classes of webrtc::FlexfecReceiveStream, | |
| 626 // so this downcast is safe. | |
| 627 FlexfecReceiveStream* receive_stream_impl = | |
| 628 static_cast<FlexfecReceiveStream*>(receive_stream); | |
| 629 { | |
| 630 WriteLockScoped write_lock(*receive_crit_); | |
| 631 // Remove all SSRCs pointing to the FlexfecReceiveStream to be destroyed. | |
| 632 auto media_it = flexfec_receive_ssrcs_media_.begin(); | |
| 633 while (media_it != flexfec_receive_ssrcs_media_.end()) { | |
| 634 if (media_it->second == receive_stream_impl) | |
| 635 media_it = flexfec_receive_ssrcs_media_.erase(media_it); | |
| 636 else | |
| 637 ++media_it; | |
| 638 } | |
| 639 auto prot_it = flexfec_receive_ssrcs_protection_.begin(); | |
| 640 while (prot_it != flexfec_receive_ssrcs_protection_.end()) { | |
| 641 if (prot_it->second == receive_stream_impl) | |
|
stefan-webrtc
2016/10/20 16:23:26
{}, here and above
brandtr
2016/10/21 08:40:26
While I personally like the braces for single-line
stefan-webrtc
2016/10/21 11:07:35
My impression has always been that an if-else is a
brandtr
2016/10/21 12:18:39
Seems fairly common with if/else without braces: h
| |
| 642 prot_it = flexfec_receive_ssrcs_protection_.erase(prot_it); | |
| 643 else | |
| 644 ++prot_it; | |
| 645 } | |
| 646 flexfec_receive_streams_.erase(receive_stream_impl); | |
| 647 } | |
| 648 delete receive_stream_impl; | |
| 649 } | |
| 650 | |
| 581 Call::Stats Call::GetStats() const { | 651 Call::Stats Call::GetStats() const { |
| 582 // TODO(solenberg): Some test cases in EndToEndTest use this from a different | 652 // TODO(solenberg): Some test cases in EndToEndTest use this from a different |
| 583 // thread. Re-enable once that is fixed. | 653 // thread. Re-enable once that is fixed. |
| 584 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 654 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
| 585 Stats stats; | 655 Stats stats; |
| 586 // Fetch available send/receive bitrates. | 656 // Fetch available send/receive bitrates. |
| 587 uint32_t send_bandwidth = 0; | 657 uint32_t send_bandwidth = 0; |
| 588 congestion_controller_->GetBitrateController()->AvailableBandwidth( | 658 congestion_controller_->GetBitrateController()->AvailableBandwidth( |
| 589 &send_bandwidth); | 659 &send_bandwidth); |
| 590 std::vector<unsigned int> ssrcs; | 660 std::vector<unsigned int> ssrcs; |
| (...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 916 } | 986 } |
| 917 } | 987 } |
| 918 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { | 988 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { |
| 919 auto it = video_receive_ssrcs_.find(ssrc); | 989 auto it = video_receive_ssrcs_.find(ssrc); |
| 920 if (it != video_receive_ssrcs_.end()) { | 990 if (it != video_receive_ssrcs_.end()) { |
| 921 received_bytes_per_second_counter_.Add(static_cast<int>(length)); | 991 received_bytes_per_second_counter_.Add(static_cast<int>(length)); |
| 922 received_video_bytes_per_second_counter_.Add(static_cast<int>(length)); | 992 received_video_bytes_per_second_counter_.Add(static_cast<int>(length)); |
| 923 auto status = it->second->DeliverRtp(packet, length, packet_time) | 993 auto status = it->second->DeliverRtp(packet, length, packet_time) |
| 924 ? DELIVERY_OK | 994 ? DELIVERY_OK |
| 925 : DELIVERY_PACKET_ERROR; | 995 : DELIVERY_PACKET_ERROR; |
| 996 // Deliver media packets to FlexFEC subsystem. | |
| 997 auto it_bounds = flexfec_receive_ssrcs_media_.equal_range(ssrc); | |
| 998 for (auto it = it_bounds.first; it != it_bounds.second; ++it) | |
| 999 it->second->AddAndProcessReceivedPacket(packet, length); | |
| 1000 if (status == DELIVERY_OK) | |
| 1001 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); | |
| 1002 return status; | |
| 1003 } | |
| 1004 } | |
| 1005 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { | |
| 1006 auto it = flexfec_receive_ssrcs_protection_.find(ssrc); | |
| 1007 if (it != flexfec_receive_ssrcs_protection_.end()) { | |
| 1008 auto status = it->second->AddAndProcessReceivedPacket(packet, length) | |
| 1009 ? DELIVERY_OK | |
| 1010 : DELIVERY_PACKET_ERROR; | |
| 926 if (status == DELIVERY_OK) | 1011 if (status == DELIVERY_OK) |
| 927 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); | 1012 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); |
| 928 return status; | 1013 return status; |
| 929 } | 1014 } |
| 930 } | 1015 } |
| 931 return DELIVERY_UNKNOWN_SSRC; | 1016 return DELIVERY_UNKNOWN_SSRC; |
| 932 } | 1017 } |
| 933 | 1018 |
| 934 PacketReceiver::DeliveryStatus Call::DeliverPacket( | 1019 PacketReceiver::DeliveryStatus Call::DeliverPacket( |
| 935 MediaType media_type, | 1020 MediaType media_type, |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 952 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]); | 1037 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]); |
| 953 ReadLockScoped read_lock(*receive_crit_); | 1038 ReadLockScoped read_lock(*receive_crit_); |
| 954 auto it = video_receive_ssrcs_.find(ssrc); | 1039 auto it = video_receive_ssrcs_.find(ssrc); |
| 955 if (it == video_receive_ssrcs_.end()) | 1040 if (it == video_receive_ssrcs_.end()) |
| 956 return false; | 1041 return false; |
| 957 return it->second->OnRecoveredPacket(packet, length); | 1042 return it->second->OnRecoveredPacket(packet, length); |
| 958 } | 1043 } |
| 959 | 1044 |
| 960 } // namespace internal | 1045 } // namespace internal |
| 961 } // namespace webrtc | 1046 } // namespace webrtc |
| OLD | NEW |