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 |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 #include "webrtc/video/send_delay_stats.h" | 53 #include "webrtc/video/send_delay_stats.h" |
54 #include "webrtc/video/stats_counter.h" | 54 #include "webrtc/video/stats_counter.h" |
55 #include "webrtc/video/video_receive_stream.h" | 55 #include "webrtc/video/video_receive_stream.h" |
56 #include "webrtc/video/video_send_stream.h" | 56 #include "webrtc/video/video_send_stream.h" |
57 #include "webrtc/video/vie_remb.h" | 57 #include "webrtc/video/vie_remb.h" |
58 | 58 |
59 namespace webrtc { | 59 namespace webrtc { |
60 | 60 |
61 const int Call::Config::kDefaultStartBitrateBps = 300000; | 61 const int Call::Config::kDefaultStartBitrateBps = 300000; |
62 | 62 |
| 63 namespace { |
| 64 |
| 65 // TODO(nisse): This really begs for a shared context struct. |
| 66 bool UseSendSideBwe(const std::vector<RtpExtension>& extensions, |
| 67 bool transport_cc) { |
| 68 if (!transport_cc) |
| 69 return false; |
| 70 for (const auto& extension : extensions) { |
| 71 if (extension.uri == RtpExtension::kTransportSequenceNumberUri) |
| 72 return true; |
| 73 } |
| 74 return false; |
| 75 } |
| 76 |
| 77 bool UseSendSideBwe(const VideoReceiveStream::Config& config) { |
| 78 return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); |
| 79 } |
| 80 |
| 81 bool UseSendSideBwe(const AudioReceiveStream::Config& config) { |
| 82 return UseSendSideBwe(config.rtp.extensions, config.rtp.transport_cc); |
| 83 } |
| 84 |
| 85 bool UseSendSideBwe(const FlexfecReceiveStream::Config& config) { |
| 86 return UseSendSideBwe(config.rtp_header_extensions, config.transport_cc); |
| 87 } |
| 88 |
| 89 } // namespace |
| 90 |
63 namespace internal { | 91 namespace internal { |
64 | 92 |
65 class Call : public webrtc::Call, | 93 class Call : public webrtc::Call, |
66 public PacketReceiver, | 94 public PacketReceiver, |
67 public RecoveredPacketReceiver, | 95 public RecoveredPacketReceiver, |
68 public CongestionController::Observer, | 96 public CongestionController::Observer, |
69 public BitrateAllocator::LimitObserver { | 97 public BitrateAllocator::LimitObserver { |
70 public: | 98 public: |
71 explicit Call(const Call::Config& config); | 99 explicit Call(const Call::Config& config); |
72 virtual ~Call(); | 100 virtual ~Call(); |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 | 220 |
193 // This extra map is used for receive processing which is | 221 // This extra map is used for receive processing which is |
194 // independent of media type. | 222 // independent of media type. |
195 | 223 |
196 // TODO(nisse): In the RTP transport refactoring, we should have a | 224 // TODO(nisse): In the RTP transport refactoring, we should have a |
197 // single mapping from ssrc to a more abstract receive stream, with | 225 // single mapping from ssrc to a more abstract receive stream, with |
198 // accessor methods for all configuration we need at this level. | 226 // accessor methods for all configuration we need at this level. |
199 struct ReceiveRtpConfig { | 227 struct ReceiveRtpConfig { |
200 ReceiveRtpConfig() = default; // Needed by std::map | 228 ReceiveRtpConfig() = default; // Needed by std::map |
201 ReceiveRtpConfig(const std::vector<RtpExtension>& extensions, | 229 ReceiveRtpConfig(const std::vector<RtpExtension>& extensions, |
202 bool transport_cc) | 230 bool use_send_side_bwe) |
203 : extensions(extensions), transport_cc(transport_cc) {} | 231 : extensions(extensions), use_send_side_bwe(use_send_side_bwe) {} |
204 | 232 |
205 // Registered RTP header extensions for each stream. Note that RTP header | 233 // Registered RTP header extensions for each stream. Note that RTP header |
206 // extensions are negotiated per track ("m= line") in the SDP, but we have | 234 // extensions are negotiated per track ("m= line") in the SDP, but we have |
207 // no notion of tracks at the Call level. We therefore store the RTP header | 235 // no notion of tracks at the Call level. We therefore store the RTP header |
208 // extensions per SSRC instead, which leads to some storage overhead. | 236 // extensions per SSRC instead, which leads to some storage overhead. |
209 RtpHeaderExtensionMap extensions; | 237 RtpHeaderExtensionMap extensions; |
210 // Set if the RTCP feedback message needed for send side BWE was negotiated. | 238 // Set if both RTP extension the RTCP feedback message needed for |
211 bool transport_cc = false; | 239 // send side BWE are negotiated. |
| 240 bool use_send_side_bwe = false; |
212 }; | 241 }; |
213 std::map<uint32_t, ReceiveRtpConfig> receive_rtp_config_ | 242 std::map<uint32_t, ReceiveRtpConfig> receive_rtp_config_ |
214 GUARDED_BY(receive_crit_); | 243 GUARDED_BY(receive_crit_); |
215 | 244 |
216 std::unique_ptr<RWLockWrapper> send_crit_; | 245 std::unique_ptr<RWLockWrapper> send_crit_; |
217 // Audio and Video send streams are owned by the client that creates them. | 246 // Audio and Video send streams are owned by the client that creates them. |
218 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); | 247 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); |
219 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); | 248 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); |
220 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); | 249 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); |
221 | 250 |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
518 UpdateAggregateNetworkState(); | 547 UpdateAggregateNetworkState(); |
519 delete audio_send_stream; | 548 delete audio_send_stream; |
520 } | 549 } |
521 | 550 |
522 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( | 551 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( |
523 const webrtc::AudioReceiveStream::Config& config) { | 552 const webrtc::AudioReceiveStream::Config& config) { |
524 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); | 553 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); |
525 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 554 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
526 event_log_->LogAudioReceiveStreamConfig(config); | 555 event_log_->LogAudioReceiveStreamConfig(config); |
527 AudioReceiveStream* receive_stream = new AudioReceiveStream( | 556 AudioReceiveStream* receive_stream = new AudioReceiveStream( |
528 &packet_router_, | 557 &packet_router_, config, |
529 congestion_controller_->GetRemoteBitrateEstimator(true), config, | |
530 config_.audio_state, event_log_); | 558 config_.audio_state, event_log_); |
531 { | 559 { |
532 WriteLockScoped write_lock(*receive_crit_); | 560 WriteLockScoped write_lock(*receive_crit_); |
533 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 561 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
534 audio_receive_ssrcs_.end()); | 562 audio_receive_ssrcs_.end()); |
535 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 563 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
536 receive_rtp_config_[config.rtp.remote_ssrc] = | 564 receive_rtp_config_[config.rtp.remote_ssrc] = |
537 ReceiveRtpConfig(config.rtp.extensions, config.rtp.transport_cc); | 565 ReceiveRtpConfig(config.rtp.extensions, UseSendSideBwe(config)); |
538 | 566 |
539 ConfigureSync(config.sync_group); | 567 ConfigureSync(config.sync_group); |
540 } | 568 } |
541 { | 569 { |
542 ReadLockScoped read_lock(*send_crit_); | 570 ReadLockScoped read_lock(*send_crit_); |
543 auto it = audio_send_ssrcs_.find(config.rtp.local_ssrc); | 571 auto it = audio_send_ssrcs_.find(config.rtp.local_ssrc); |
544 if (it != audio_send_ssrcs_.end()) { | 572 if (it != audio_send_ssrcs_.end()) { |
545 receive_stream->AssociateSendStream(it->second); | 573 receive_stream->AssociateSendStream(it->second); |
546 } | 574 } |
547 } | 575 } |
548 receive_stream->SignalNetworkState(audio_network_state_); | 576 receive_stream->SignalNetworkState(audio_network_state_); |
549 UpdateAggregateNetworkState(); | 577 UpdateAggregateNetworkState(); |
550 return receive_stream; | 578 return receive_stream; |
551 } | 579 } |
552 | 580 |
553 void Call::DestroyAudioReceiveStream( | 581 void Call::DestroyAudioReceiveStream( |
554 webrtc::AudioReceiveStream* receive_stream) { | 582 webrtc::AudioReceiveStream* receive_stream) { |
555 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); | 583 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); |
556 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 584 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
557 RTC_DCHECK(receive_stream != nullptr); | 585 RTC_DCHECK(receive_stream != nullptr); |
558 webrtc::internal::AudioReceiveStream* audio_receive_stream = | 586 webrtc::internal::AudioReceiveStream* audio_receive_stream = |
559 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); | 587 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); |
560 { | 588 { |
561 WriteLockScoped write_lock(*receive_crit_); | 589 WriteLockScoped write_lock(*receive_crit_); |
562 uint32_t ssrc = audio_receive_stream->config().rtp.remote_ssrc; | 590 const AudioReceiveStream::Config& config = audio_receive_stream->config(); |
563 | 591 uint32_t ssrc = config.rtp.remote_ssrc; |
| 592 congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
| 593 ->RemoveStream(ssrc); |
564 size_t num_deleted = audio_receive_ssrcs_.erase(ssrc); | 594 size_t num_deleted = audio_receive_ssrcs_.erase(ssrc); |
565 RTC_DCHECK(num_deleted == 1); | 595 RTC_DCHECK(num_deleted == 1); |
566 const std::string& sync_group = audio_receive_stream->config().sync_group; | 596 const std::string& sync_group = audio_receive_stream->config().sync_group; |
567 const auto it = sync_stream_mapping_.find(sync_group); | 597 const auto it = sync_stream_mapping_.find(sync_group); |
568 if (it != sync_stream_mapping_.end() && | 598 if (it != sync_stream_mapping_.end() && |
569 it->second == audio_receive_stream) { | 599 it->second == audio_receive_stream) { |
570 sync_stream_mapping_.erase(it); | 600 sync_stream_mapping_.erase(it); |
571 ConfigureSync(sync_group); | 601 ConfigureSync(sync_group); |
572 } | 602 } |
573 receive_rtp_config_.erase(ssrc); | 603 receive_rtp_config_.erase(ssrc); |
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
651 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 681 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
652 | 682 |
653 bool protected_by_flexfec = false; | 683 bool protected_by_flexfec = false; |
654 { | 684 { |
655 ReadLockScoped read_lock(*receive_crit_); | 685 ReadLockScoped read_lock(*receive_crit_); |
656 protected_by_flexfec = | 686 protected_by_flexfec = |
657 flexfec_receive_ssrcs_media_.find(configuration.rtp.remote_ssrc) != | 687 flexfec_receive_ssrcs_media_.find(configuration.rtp.remote_ssrc) != |
658 flexfec_receive_ssrcs_media_.end(); | 688 flexfec_receive_ssrcs_media_.end(); |
659 } | 689 } |
660 VideoReceiveStream* receive_stream = new VideoReceiveStream( | 690 VideoReceiveStream* receive_stream = new VideoReceiveStream( |
661 num_cpu_cores_, protected_by_flexfec, congestion_controller_.get(), | 691 num_cpu_cores_, protected_by_flexfec, |
662 &packet_router_, std::move(configuration), module_process_thread_.get(), | 692 &packet_router_, std::move(configuration), module_process_thread_.get(), |
663 call_stats_.get(), &remb_); | 693 call_stats_.get(), &remb_); |
664 | 694 |
665 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); | 695 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); |
666 ReceiveRtpConfig receive_config(config.rtp.extensions, | 696 ReceiveRtpConfig receive_config(config.rtp.extensions, |
667 config.rtp.transport_cc); | 697 UseSendSideBwe(config)); |
668 { | 698 { |
669 WriteLockScoped write_lock(*receive_crit_); | 699 WriteLockScoped write_lock(*receive_crit_); |
670 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == | 700 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == |
671 video_receive_ssrcs_.end()); | 701 video_receive_ssrcs_.end()); |
672 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; | 702 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; |
673 if (config.rtp.rtx_ssrc) { | 703 if (config.rtp.rtx_ssrc) { |
674 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream; | 704 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream; |
675 // We record identical config for the rtx stream as for the main | 705 // We record identical config for the rtx stream as for the main |
676 // stream. Since the transport_cc negotiation is per payload | 706 // stream. Since the transport_cc negotiation is per payload |
677 // type, we may get an incorrect value for the rtx stream, but | 707 // type, we may get an incorrect value for the rtx stream, but |
(...skipping 29 matching lines...) Expand all Loading... |
707 receive_rtp_config_.erase(it->first); | 737 receive_rtp_config_.erase(it->first); |
708 it = video_receive_ssrcs_.erase(it); | 738 it = video_receive_ssrcs_.erase(it); |
709 } else { | 739 } else { |
710 ++it; | 740 ++it; |
711 } | 741 } |
712 } | 742 } |
713 video_receive_streams_.erase(receive_stream_impl); | 743 video_receive_streams_.erase(receive_stream_impl); |
714 RTC_CHECK(receive_stream_impl != nullptr); | 744 RTC_CHECK(receive_stream_impl != nullptr); |
715 ConfigureSync(receive_stream_impl->config().sync_group); | 745 ConfigureSync(receive_stream_impl->config().sync_group); |
716 } | 746 } |
| 747 const VideoReceiveStream::Config& config = receive_stream_impl->config(); |
| 748 |
| 749 congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
| 750 ->RemoveStream(config.rtp.remote_ssrc); |
| 751 |
717 UpdateAggregateNetworkState(); | 752 UpdateAggregateNetworkState(); |
718 delete receive_stream_impl; | 753 delete receive_stream_impl; |
719 } | 754 } |
720 | 755 |
721 FlexfecReceiveStream* Call::CreateFlexfecReceiveStream( | 756 FlexfecReceiveStream* Call::CreateFlexfecReceiveStream( |
722 const FlexfecReceiveStream::Config& config) { | 757 const FlexfecReceiveStream::Config& config) { |
723 TRACE_EVENT0("webrtc", "Call::CreateFlexfecReceiveStream"); | 758 TRACE_EVENT0("webrtc", "Call::CreateFlexfecReceiveStream"); |
724 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 759 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
725 | 760 |
726 RecoveredPacketReceiver* recovered_packet_receiver = this; | 761 RecoveredPacketReceiver* recovered_packet_receiver = this; |
(...skipping 11 matching lines...) Expand all Loading... |
738 for (auto ssrc : config.protected_media_ssrcs) | 773 for (auto ssrc : config.protected_media_ssrcs) |
739 flexfec_receive_ssrcs_media_.insert(std::make_pair(ssrc, receive_stream)); | 774 flexfec_receive_ssrcs_media_.insert(std::make_pair(ssrc, receive_stream)); |
740 | 775 |
741 RTC_DCHECK(flexfec_receive_ssrcs_protection_.find(config.remote_ssrc) == | 776 RTC_DCHECK(flexfec_receive_ssrcs_protection_.find(config.remote_ssrc) == |
742 flexfec_receive_ssrcs_protection_.end()); | 777 flexfec_receive_ssrcs_protection_.end()); |
743 flexfec_receive_ssrcs_protection_[config.remote_ssrc] = receive_stream; | 778 flexfec_receive_ssrcs_protection_[config.remote_ssrc] = receive_stream; |
744 | 779 |
745 RTC_DCHECK(receive_rtp_config_.find(config.remote_ssrc) == | 780 RTC_DCHECK(receive_rtp_config_.find(config.remote_ssrc) == |
746 receive_rtp_config_.end()); | 781 receive_rtp_config_.end()); |
747 receive_rtp_config_[config.remote_ssrc] = | 782 receive_rtp_config_[config.remote_ssrc] = |
748 ReceiveRtpConfig(config.rtp_header_extensions, config.transport_cc); | 783 ReceiveRtpConfig(config.rtp_header_extensions, UseSendSideBwe(config)); |
749 } | 784 } |
750 | 785 |
751 // TODO(brandtr): Store config in RtcEventLog here. | 786 // TODO(brandtr): Store config in RtcEventLog here. |
752 | 787 |
753 return receive_stream; | 788 return receive_stream; |
754 } | 789 } |
755 | 790 |
756 void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { | 791 void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { |
757 TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream"); | 792 TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream"); |
758 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 793 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
759 | 794 |
760 RTC_DCHECK(receive_stream != nullptr); | 795 RTC_DCHECK(receive_stream != nullptr); |
761 // There exist no other derived classes of FlexfecReceiveStream, | 796 // There exist no other derived classes of FlexfecReceiveStream, |
762 // so this downcast is safe. | 797 // so this downcast is safe. |
763 FlexfecReceiveStreamImpl* receive_stream_impl = | 798 FlexfecReceiveStreamImpl* receive_stream_impl = |
764 static_cast<FlexfecReceiveStreamImpl*>(receive_stream); | 799 static_cast<FlexfecReceiveStreamImpl*>(receive_stream); |
765 { | 800 { |
766 WriteLockScoped write_lock(*receive_crit_); | 801 WriteLockScoped write_lock(*receive_crit_); |
767 | 802 |
768 uint32_t ssrc = receive_stream_impl->GetConfig().remote_ssrc; | 803 const FlexfecReceiveStream::Config& config = |
| 804 receive_stream_impl->GetConfig(); |
| 805 uint32_t ssrc = config.remote_ssrc; |
769 receive_rtp_config_.erase(ssrc); | 806 receive_rtp_config_.erase(ssrc); |
770 | 807 |
771 // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be | 808 // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be |
772 // destroyed. | 809 // destroyed. |
773 auto prot_it = flexfec_receive_ssrcs_protection_.begin(); | 810 auto prot_it = flexfec_receive_ssrcs_protection_.begin(); |
774 while (prot_it != flexfec_receive_ssrcs_protection_.end()) { | 811 while (prot_it != flexfec_receive_ssrcs_protection_.end()) { |
775 if (prot_it->second == receive_stream_impl) | 812 if (prot_it->second == receive_stream_impl) |
776 prot_it = flexfec_receive_ssrcs_protection_.erase(prot_it); | 813 prot_it = flexfec_receive_ssrcs_protection_.erase(prot_it); |
777 else | 814 else |
778 ++prot_it; | 815 ++prot_it; |
779 } | 816 } |
780 auto media_it = flexfec_receive_ssrcs_media_.begin(); | 817 auto media_it = flexfec_receive_ssrcs_media_.begin(); |
781 while (media_it != flexfec_receive_ssrcs_media_.end()) { | 818 while (media_it != flexfec_receive_ssrcs_media_.end()) { |
782 if (media_it->second == receive_stream_impl) | 819 if (media_it->second == receive_stream_impl) |
783 media_it = flexfec_receive_ssrcs_media_.erase(media_it); | 820 media_it = flexfec_receive_ssrcs_media_.erase(media_it); |
784 else | 821 else |
785 ++media_it; | 822 ++media_it; |
786 } | 823 } |
787 | 824 |
| 825 congestion_controller_->GetRemoteBitrateEstimator(UseSendSideBwe(config)) |
| 826 ->RemoveStream(ssrc); |
| 827 |
788 flexfec_receive_streams_.erase(receive_stream_impl); | 828 flexfec_receive_streams_.erase(receive_stream_impl); |
789 } | 829 } |
790 | 830 |
791 delete receive_stream_impl; | 831 delete receive_stream_impl; |
792 } | 832 } |
793 | 833 |
794 Call::Stats Call::GetStats() const { | 834 Call::Stats Call::GetStats() const { |
795 // TODO(solenberg): Some test cases in EndToEndTest use this from a different | 835 // TODO(solenberg): Some test cases in EndToEndTest use this from a different |
796 // thread. Re-enable once that is fixed. | 836 // thread. Re-enable once that is fixed. |
797 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); | 837 // RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1227 ReadLockScoped read_lock(*receive_crit_); | 1267 ReadLockScoped read_lock(*receive_crit_); |
1228 auto it = video_receive_ssrcs_.find(ssrc); | 1268 auto it = video_receive_ssrcs_.find(ssrc); |
1229 if (it == video_receive_ssrcs_.end()) | 1269 if (it == video_receive_ssrcs_.end()) |
1230 return false; | 1270 return false; |
1231 return it->second->OnRecoveredPacket(packet, length); | 1271 return it->second->OnRecoveredPacket(packet, length); |
1232 } | 1272 } |
1233 | 1273 |
1234 void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet, | 1274 void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet, |
1235 MediaType media_type) { | 1275 MediaType media_type) { |
1236 auto it = receive_rtp_config_.find(packet.Ssrc()); | 1276 auto it = receive_rtp_config_.find(packet.Ssrc()); |
1237 bool transport_cc = | 1277 bool use_send_side_bwe = |
1238 (it != receive_rtp_config_.end()) && it->second.transport_cc; | 1278 (it != receive_rtp_config_.end()) && it->second.use_send_side_bwe; |
1239 | 1279 |
1240 RTPHeader header; | 1280 RTPHeader header; |
1241 packet.GetHeader(&header); | 1281 packet.GetHeader(&header); |
1242 | 1282 |
1243 if (!transport_cc && header.extension.hasTransportSequenceNumber) { | 1283 if (!use_send_side_bwe && header.extension.hasTransportSequenceNumber) { |
1244 // Inconsistent configuration of send side BWE. Do nothing. | 1284 // Inconsistent configuration of send side BWE. Do nothing. |
1245 // TODO(nisse): Without this check, we may produce RTCP feedback | 1285 // TODO(nisse): Without this check, we may produce RTCP feedback |
1246 // packets even when not negotiated. But it would be cleaner to | 1286 // packets even when not negotiated. But it would be cleaner to |
1247 // move the check down to RTCPSender::SendFeedbackPacket, which | 1287 // move the check down to RTCPSender::SendFeedbackPacket, which |
1248 // would also help the PacketRouter to select an appropriate rtp | 1288 // would also help the PacketRouter to select an appropriate rtp |
1249 // module in the case that some, but not all, have RTCP feedback | 1289 // module in the case that some, but not all, have RTCP feedback |
1250 // enabled. | 1290 // enabled. |
1251 return; | 1291 return; |
1252 } | 1292 } |
1253 // For audio, we only support send side BWE. | 1293 // For audio, we only support send side BWE. |
1254 // TODO(nisse): Tests passes MediaType::ANY, see | 1294 // TODO(nisse): Tests passes MediaType::ANY, see |
1255 // FakeNetworkPipe::Process. We need to treat that as video. Tests | 1295 // FakeNetworkPipe::Process. We need to treat that as video. Tests |
1256 // should be fixed to use the same MediaType as the production code. | 1296 // should be fixed to use the same MediaType as the production code. |
1257 if (media_type != MediaType::AUDIO || | 1297 if (media_type != MediaType::AUDIO || |
1258 (transport_cc && header.extension.hasTransportSequenceNumber)) { | 1298 (use_send_side_bwe && header.extension.hasTransportSequenceNumber)) { |
1259 congestion_controller_->OnReceivedPacket( | 1299 congestion_controller_->OnReceivedPacket( |
1260 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), | 1300 packet.arrival_time_ms(), packet.payload_size() + packet.padding_size(), |
1261 header); | 1301 header); |
1262 } | 1302 } |
1263 } | 1303 } |
1264 | 1304 |
1265 } // namespace internal | 1305 } // namespace internal |
1266 } // namespace webrtc | 1306 } // namespace webrtc |
OLD | NEW |