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

Side by Side Diff: webrtc/call/call.cc

Issue 2668973003: Revert of Always call RemoteBitrateEstimator::IncomingPacket from Call. (Closed)
Patch Set: Created 3 years, 10 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
« no previous file with comments | « webrtc/audio/audio_receive_stream_unittest.cc ('k') | webrtc/video/rtp_stream_receiver.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 91 matching lines...) Expand 10 before | Expand all | Expand 10 after
102 102
103 // Implements PacketReceiver. 103 // Implements PacketReceiver.
104 DeliveryStatus DeliverPacket(MediaType media_type, 104 DeliveryStatus DeliverPacket(MediaType media_type,
105 const uint8_t* packet, 105 const uint8_t* packet,
106 size_t length, 106 size_t length,
107 const PacketTime& packet_time) override; 107 const PacketTime& packet_time) override;
108 108
109 // Implements RecoveredPacketReceiver. 109 // Implements RecoveredPacketReceiver.
110 bool OnRecoveredPacket(const uint8_t* packet, size_t length) override; 110 bool OnRecoveredPacket(const uint8_t* packet, size_t length) override;
111 111
112 void NotifyBweOfReceivedPacket(const RtpPacketReceived& packet);
113
112 void SetBitrateConfig( 114 void SetBitrateConfig(
113 const webrtc::Call::Config::BitrateConfig& bitrate_config) override; 115 const webrtc::Call::Config::BitrateConfig& bitrate_config) override;
114 116
115 void SignalChannelNetworkState(MediaType media, NetworkState state) override; 117 void SignalChannelNetworkState(MediaType media, NetworkState state) override;
116 118
117 void OnTransportOverheadChanged(MediaType media, 119 void OnTransportOverheadChanged(MediaType media,
118 int transport_overhead_per_packet) override; 120 int transport_overhead_per_packet) override;
119 121
120 void OnNetworkRouteChanged(const std::string& transport_name, 122 void OnNetworkRouteChanged(const std::string& transport_name,
121 const rtc::NetworkRoute& network_route) override; 123 const rtc::NetworkRoute& network_route) override;
(...skipping 14 matching lines...) Expand all
136 private: 138 private:
137 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet, 139 DeliveryStatus DeliverRtcp(MediaType media_type, const uint8_t* packet,
138 size_t length); 140 size_t length);
139 DeliveryStatus DeliverRtp(MediaType media_type, 141 DeliveryStatus DeliverRtp(MediaType media_type,
140 const uint8_t* packet, 142 const uint8_t* packet,
141 size_t length, 143 size_t length,
142 const PacketTime& packet_time); 144 const PacketTime& packet_time);
143 void ConfigureSync(const std::string& sync_group) 145 void ConfigureSync(const std::string& sync_group)
144 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_); 146 EXCLUSIVE_LOCKS_REQUIRED(receive_crit_);
145 147
146 void NotifyBweOfReceivedPacket(const RtpPacketReceived& packet)
147 SHARED_LOCKS_REQUIRED(receive_crit_);
148
149 rtc::Optional<RtpPacketReceived> ParseRtpPacket(const uint8_t* packet, 148 rtc::Optional<RtpPacketReceived> ParseRtpPacket(const uint8_t* packet,
150 size_t length, 149 size_t length,
151 const PacketTime& packet_time) 150 const PacketTime& packet_time)
152 SHARED_LOCKS_REQUIRED(receive_crit_); 151 SHARED_LOCKS_REQUIRED(receive_crit_);
153 152
154 void UpdateSendHistograms() EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_); 153 void UpdateSendHistograms() EXCLUSIVE_LOCKS_REQUIRED(&bitrate_crit_);
155 void UpdateReceiveHistograms(); 154 void UpdateReceiveHistograms();
156 void UpdateHistograms(); 155 void UpdateHistograms();
157 void UpdateAggregateNetworkState(); 156 void UpdateAggregateNetworkState();
158 157
(...skipping 23 matching lines...) Expand all
182 // streams. 181 // streams.
183 std::multimap<uint32_t, FlexfecReceiveStreamImpl*> 182 std::multimap<uint32_t, FlexfecReceiveStreamImpl*>
184 flexfec_receive_ssrcs_media_ GUARDED_BY(receive_crit_); 183 flexfec_receive_ssrcs_media_ GUARDED_BY(receive_crit_);
185 std::map<uint32_t, FlexfecReceiveStreamImpl*> 184 std::map<uint32_t, FlexfecReceiveStreamImpl*>
186 flexfec_receive_ssrcs_protection_ GUARDED_BY(receive_crit_); 185 flexfec_receive_ssrcs_protection_ GUARDED_BY(receive_crit_);
187 std::set<FlexfecReceiveStreamImpl*> flexfec_receive_streams_ 186 std::set<FlexfecReceiveStreamImpl*> flexfec_receive_streams_
188 GUARDED_BY(receive_crit_); 187 GUARDED_BY(receive_crit_);
189 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_ 188 std::map<std::string, AudioReceiveStream*> sync_stream_mapping_
190 GUARDED_BY(receive_crit_); 189 GUARDED_BY(receive_crit_);
191 190
192 // This extra map is used for receive processing which is 191 // Registered RTP header extensions for each stream.
193 // independent of media type. 192 // Note that RTP header extensions are negotiated per track ("m= line") in the
194 193 // SDP, but we have no notion of tracks at the Call level. We therefore store
195 // TODO(nisse): In the RTP transport refactoring, we should have a 194 // the RTP header extensions per SSRC instead, which leads to some storage
196 // single mapping from ssrc to a more abstract receive stream, with 195 // overhead.
197 // accessor methods for all configuration we need at this level. 196 std::map<uint32_t, RtpHeaderExtensionMap> received_rtp_header_extensions_
198 struct ReceiveRtpConfig {
199 ReceiveRtpConfig() = default; // Needed by std::map
200 ReceiveRtpConfig(const std::vector<RtpExtension>& extensions,
201 bool transport_cc)
202 : extensions(extensions), transport_cc(transport_cc) {}
203
204 // Registered RTP header extensions for each stream. Note that RTP header
205 // extensions are negotiated per track ("m= line") in the SDP, but we have
206 // no notion of tracks at the Call level. We therefore store the RTP header
207 // extensions per SSRC instead, which leads to some storage overhead.
208 RtpHeaderExtensionMap extensions;
209 // Set if the RTCP feedback message needed for send side BWE was negotiated.
210 bool transport_cc;
211 };
212 std::map<uint32_t, ReceiveRtpConfig> receive_rtp_config_
213 GUARDED_BY(receive_crit_); 197 GUARDED_BY(receive_crit_);
214 198
215 std::unique_ptr<RWLockWrapper> send_crit_; 199 std::unique_ptr<RWLockWrapper> send_crit_;
216 // Audio and Video send streams are owned by the client that creates them. 200 // Audio and Video send streams are owned by the client that creates them.
217 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_); 201 std::map<uint32_t, AudioSendStream*> audio_send_ssrcs_ GUARDED_BY(send_crit_);
218 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_); 202 std::map<uint32_t, VideoSendStream*> video_send_ssrcs_ GUARDED_BY(send_crit_);
219 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_); 203 std::set<VideoSendStream*> video_send_streams_ GUARDED_BY(send_crit_);
220 204
221 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_; 205 VideoSendStream::RtpStateMap suspended_video_send_ssrcs_;
222 webrtc::RtcEventLog* event_log_; 206 webrtc::RtcEventLog* event_log_;
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
366 } 350 }
367 351
368 rtc::Optional<RtpPacketReceived> Call::ParseRtpPacket( 352 rtc::Optional<RtpPacketReceived> Call::ParseRtpPacket(
369 const uint8_t* packet, 353 const uint8_t* packet,
370 size_t length, 354 size_t length,
371 const PacketTime& packet_time) { 355 const PacketTime& packet_time) {
372 RtpPacketReceived parsed_packet; 356 RtpPacketReceived parsed_packet;
373 if (!parsed_packet.Parse(packet, length)) 357 if (!parsed_packet.Parse(packet, length))
374 return rtc::Optional<RtpPacketReceived>(); 358 return rtc::Optional<RtpPacketReceived>();
375 359
376 auto it = receive_rtp_config_.find(parsed_packet.Ssrc()); 360 auto it = received_rtp_header_extensions_.find(parsed_packet.Ssrc());
377 if (it != receive_rtp_config_.end()) 361 if (it != received_rtp_header_extensions_.end())
378 parsed_packet.IdentifyExtensions(it->second.extensions); 362 parsed_packet.IdentifyExtensions(it->second);
379 363
380 int64_t arrival_time_ms; 364 int64_t arrival_time_ms;
381 if (packet_time.timestamp != -1) { 365 if (packet_time.timestamp != -1) {
382 arrival_time_ms = (packet_time.timestamp + 500) / 1000; 366 arrival_time_ms = (packet_time.timestamp + 500) / 1000;
383 } else { 367 } else {
384 arrival_time_ms = clock_->TimeInMilliseconds(); 368 arrival_time_ms = clock_->TimeInMilliseconds();
385 } 369 }
386 parsed_packet.set_arrival_time_ms(arrival_time_ms); 370 parsed_packet.set_arrival_time_ms(arrival_time_ms);
387 371
388 return rtc::Optional<RtpPacketReceived>(std::move(parsed_packet)); 372 return rtc::Optional<RtpPacketReceived>(std::move(parsed_packet));
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 delete audio_send_stream; 502 delete audio_send_stream;
519 } 503 }
520 504
521 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream( 505 webrtc::AudioReceiveStream* Call::CreateAudioReceiveStream(
522 const webrtc::AudioReceiveStream::Config& config) { 506 const webrtc::AudioReceiveStream::Config& config) {
523 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream"); 507 TRACE_EVENT0("webrtc", "Call::CreateAudioReceiveStream");
524 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 508 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
525 event_log_->LogAudioReceiveStreamConfig(config); 509 event_log_->LogAudioReceiveStreamConfig(config);
526 AudioReceiveStream* receive_stream = new AudioReceiveStream( 510 AudioReceiveStream* receive_stream = new AudioReceiveStream(
527 &packet_router_, 511 &packet_router_,
512 // TODO(nisse): Used only when UseSendSideBwe(config) is true.
528 congestion_controller_->GetRemoteBitrateEstimator(true), config, 513 congestion_controller_->GetRemoteBitrateEstimator(true), config,
529 config_.audio_state, event_log_); 514 config_.audio_state, event_log_);
530 { 515 {
531 WriteLockScoped write_lock(*receive_crit_); 516 WriteLockScoped write_lock(*receive_crit_);
532 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) == 517 RTC_DCHECK(audio_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
533 audio_receive_ssrcs_.end()); 518 audio_receive_ssrcs_.end());
534 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; 519 audio_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
535 receive_rtp_config_[config.rtp.remote_ssrc] =
536 ReceiveRtpConfig(config.rtp.extensions, config.rtp.transport_cc);
537
538 ConfigureSync(config.sync_group); 520 ConfigureSync(config.sync_group);
539 } 521 }
540 { 522 {
541 ReadLockScoped read_lock(*send_crit_); 523 ReadLockScoped read_lock(*send_crit_);
542 auto it = audio_send_ssrcs_.find(config.rtp.local_ssrc); 524 auto it = audio_send_ssrcs_.find(config.rtp.local_ssrc);
543 if (it != audio_send_ssrcs_.end()) { 525 if (it != audio_send_ssrcs_.end()) {
544 receive_stream->AssociateSendStream(it->second); 526 receive_stream->AssociateSendStream(it->second);
545 } 527 }
546 } 528 }
547 receive_stream->SignalNetworkState(audio_network_state_); 529 receive_stream->SignalNetworkState(audio_network_state_);
548 UpdateAggregateNetworkState(); 530 UpdateAggregateNetworkState();
549 return receive_stream; 531 return receive_stream;
550 } 532 }
551 533
552 void Call::DestroyAudioReceiveStream( 534 void Call::DestroyAudioReceiveStream(
553 webrtc::AudioReceiveStream* receive_stream) { 535 webrtc::AudioReceiveStream* receive_stream) {
554 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream"); 536 TRACE_EVENT0("webrtc", "Call::DestroyAudioReceiveStream");
555 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 537 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
556 RTC_DCHECK(receive_stream != nullptr); 538 RTC_DCHECK(receive_stream != nullptr);
557 webrtc::internal::AudioReceiveStream* audio_receive_stream = 539 webrtc::internal::AudioReceiveStream* audio_receive_stream =
558 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream); 540 static_cast<webrtc::internal::AudioReceiveStream*>(receive_stream);
559 { 541 {
560 WriteLockScoped write_lock(*receive_crit_); 542 WriteLockScoped write_lock(*receive_crit_);
561 uint32_t ssrc = audio_receive_stream->config().rtp.remote_ssrc; 543 size_t num_deleted = audio_receive_ssrcs_.erase(
562 544 audio_receive_stream->config().rtp.remote_ssrc);
563 size_t num_deleted = audio_receive_ssrcs_.erase(ssrc);
564 RTC_DCHECK(num_deleted == 1); 545 RTC_DCHECK(num_deleted == 1);
565 const std::string& sync_group = audio_receive_stream->config().sync_group; 546 const std::string& sync_group = audio_receive_stream->config().sync_group;
566 const auto it = sync_stream_mapping_.find(sync_group); 547 const auto it = sync_stream_mapping_.find(sync_group);
567 if (it != sync_stream_mapping_.end() && 548 if (it != sync_stream_mapping_.end() &&
568 it->second == audio_receive_stream) { 549 it->second == audio_receive_stream) {
569 sync_stream_mapping_.erase(it); 550 sync_stream_mapping_.erase(it);
570 ConfigureSync(sync_group); 551 ConfigureSync(sync_group);
571 } 552 }
572 receive_rtp_config_.erase(ssrc);
573 } 553 }
574 UpdateAggregateNetworkState(); 554 UpdateAggregateNetworkState();
575 delete audio_receive_stream; 555 delete audio_receive_stream;
576 } 556 }
577 557
578 webrtc::VideoSendStream* Call::CreateVideoSendStream( 558 webrtc::VideoSendStream* Call::CreateVideoSendStream(
579 webrtc::VideoSendStream::Config config, 559 webrtc::VideoSendStream::Config config,
580 VideoEncoderConfig encoder_config) { 560 VideoEncoderConfig encoder_config) {
581 TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream"); 561 TRACE_EVENT0("webrtc", "Call::CreateVideoSendStream");
582 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 562 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
(...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after
655 protected_by_flexfec = 635 protected_by_flexfec =
656 flexfec_receive_ssrcs_media_.find(configuration.rtp.remote_ssrc) != 636 flexfec_receive_ssrcs_media_.find(configuration.rtp.remote_ssrc) !=
657 flexfec_receive_ssrcs_media_.end(); 637 flexfec_receive_ssrcs_media_.end();
658 } 638 }
659 VideoReceiveStream* receive_stream = new VideoReceiveStream( 639 VideoReceiveStream* receive_stream = new VideoReceiveStream(
660 num_cpu_cores_, protected_by_flexfec, congestion_controller_.get(), 640 num_cpu_cores_, protected_by_flexfec, congestion_controller_.get(),
661 &packet_router_, std::move(configuration), module_process_thread_.get(), 641 &packet_router_, std::move(configuration), module_process_thread_.get(),
662 call_stats_.get(), &remb_); 642 call_stats_.get(), &remb_);
663 643
664 const webrtc::VideoReceiveStream::Config& config = receive_stream->config(); 644 const webrtc::VideoReceiveStream::Config& config = receive_stream->config();
665 ReceiveRtpConfig receive_config(config.rtp.extensions,
666 config.rtp.transport_cc);
667 { 645 {
668 WriteLockScoped write_lock(*receive_crit_); 646 WriteLockScoped write_lock(*receive_crit_);
669 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) == 647 RTC_DCHECK(video_receive_ssrcs_.find(config.rtp.remote_ssrc) ==
670 video_receive_ssrcs_.end()); 648 video_receive_ssrcs_.end());
671 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream; 649 video_receive_ssrcs_[config.rtp.remote_ssrc] = receive_stream;
672 if (config.rtp.rtx_ssrc) { 650 if (config.rtp.rtx_ssrc)
673 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream; 651 video_receive_ssrcs_[config.rtp.rtx_ssrc] = receive_stream;
674 // We record identical config for the rtx stream as for the main
675 // stream. Since the transport_cc negotiation is per payload
676 // type, we may get an incorrect value for the rtx stream, but
677 // that is unlikely to matter in practice.
678 receive_rtp_config_[config.rtp.rtx_ssrc] = receive_config;
679 }
680 receive_rtp_config_[config.rtp.remote_ssrc] = receive_config;
681 video_receive_streams_.insert(receive_stream); 652 video_receive_streams_.insert(receive_stream);
682 ConfigureSync(config.sync_group); 653 ConfigureSync(config.sync_group);
683 } 654 }
684 receive_stream->SignalNetworkState(video_network_state_); 655 receive_stream->SignalNetworkState(video_network_state_);
685 UpdateAggregateNetworkState(); 656 UpdateAggregateNetworkState();
686 event_log_->LogVideoReceiveStreamConfig(config); 657 event_log_->LogVideoReceiveStreamConfig(config);
687 return receive_stream; 658 return receive_stream;
688 } 659 }
689 660
690 void Call::DestroyVideoReceiveStream( 661 void Call::DestroyVideoReceiveStream(
691 webrtc::VideoReceiveStream* receive_stream) { 662 webrtc::VideoReceiveStream* receive_stream) {
692 TRACE_EVENT0("webrtc", "Call::DestroyVideoReceiveStream"); 663 TRACE_EVENT0("webrtc", "Call::DestroyVideoReceiveStream");
693 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 664 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
694 RTC_DCHECK(receive_stream != nullptr); 665 RTC_DCHECK(receive_stream != nullptr);
695 VideoReceiveStream* receive_stream_impl = nullptr; 666 VideoReceiveStream* receive_stream_impl = nullptr;
696 { 667 {
697 WriteLockScoped write_lock(*receive_crit_); 668 WriteLockScoped write_lock(*receive_crit_);
698 // Remove all ssrcs pointing to a receive stream. As RTX retransmits on a 669 // Remove all ssrcs pointing to a receive stream. As RTX retransmits on a
699 // separate SSRC there can be either one or two. 670 // separate SSRC there can be either one or two.
700 auto it = video_receive_ssrcs_.begin(); 671 auto it = video_receive_ssrcs_.begin();
701 while (it != video_receive_ssrcs_.end()) { 672 while (it != video_receive_ssrcs_.end()) {
702 if (it->second == static_cast<VideoReceiveStream*>(receive_stream)) { 673 if (it->second == static_cast<VideoReceiveStream*>(receive_stream)) {
703 if (receive_stream_impl != nullptr) 674 if (receive_stream_impl != nullptr)
704 RTC_DCHECK(receive_stream_impl == it->second); 675 RTC_DCHECK(receive_stream_impl == it->second);
705 receive_stream_impl = it->second; 676 receive_stream_impl = it->second;
706 receive_rtp_config_.erase(it->first); 677 video_receive_ssrcs_.erase(it++);
707 it = video_receive_ssrcs_.erase(it);
708 } else { 678 } else {
709 ++it; 679 ++it;
710 } 680 }
711 } 681 }
712 video_receive_streams_.erase(receive_stream_impl); 682 video_receive_streams_.erase(receive_stream_impl);
713 RTC_CHECK(receive_stream_impl != nullptr); 683 RTC_CHECK(receive_stream_impl != nullptr);
714 ConfigureSync(receive_stream_impl->config().sync_group); 684 ConfigureSync(receive_stream_impl->config().sync_group);
715 } 685 }
716 UpdateAggregateNetworkState(); 686 UpdateAggregateNetworkState();
717 delete receive_stream_impl; 687 delete receive_stream_impl;
(...skipping 16 matching lines...) Expand all
734 flexfec_receive_streams_.end()); 704 flexfec_receive_streams_.end());
735 flexfec_receive_streams_.insert(receive_stream); 705 flexfec_receive_streams_.insert(receive_stream);
736 706
737 for (auto ssrc : config.protected_media_ssrcs) 707 for (auto ssrc : config.protected_media_ssrcs)
738 flexfec_receive_ssrcs_media_.insert(std::make_pair(ssrc, receive_stream)); 708 flexfec_receive_ssrcs_media_.insert(std::make_pair(ssrc, receive_stream));
739 709
740 RTC_DCHECK(flexfec_receive_ssrcs_protection_.find(config.remote_ssrc) == 710 RTC_DCHECK(flexfec_receive_ssrcs_protection_.find(config.remote_ssrc) ==
741 flexfec_receive_ssrcs_protection_.end()); 711 flexfec_receive_ssrcs_protection_.end());
742 flexfec_receive_ssrcs_protection_[config.remote_ssrc] = receive_stream; 712 flexfec_receive_ssrcs_protection_[config.remote_ssrc] = receive_stream;
743 713
744 RTC_DCHECK(receive_rtp_config_.find(config.remote_ssrc) == 714 RTC_DCHECK(received_rtp_header_extensions_.find(config.remote_ssrc) ==
745 receive_rtp_config_.end()); 715 received_rtp_header_extensions_.end());
746 receive_rtp_config_[config.remote_ssrc] = 716 RtpHeaderExtensionMap rtp_header_extensions(config.rtp_header_extensions);
747 ReceiveRtpConfig(config.rtp_header_extensions, config.transport_cc); 717 received_rtp_header_extensions_[config.remote_ssrc] = rtp_header_extensions;
748 } 718 }
749 719
750 // TODO(brandtr): Store config in RtcEventLog here. 720 // TODO(brandtr): Store config in RtcEventLog here.
751 721
752 return receive_stream; 722 return receive_stream;
753 } 723 }
754 724
755 void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) { 725 void Call::DestroyFlexfecReceiveStream(FlexfecReceiveStream* receive_stream) {
756 TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream"); 726 TRACE_EVENT0("webrtc", "Call::DestroyFlexfecReceiveStream");
757 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread()); 727 RTC_DCHECK(configuration_thread_checker_.CalledOnValidThread());
758 728
759 RTC_DCHECK(receive_stream != nullptr); 729 RTC_DCHECK(receive_stream != nullptr);
760 // There exist no other derived classes of FlexfecReceiveStream, 730 // There exist no other derived classes of FlexfecReceiveStream,
761 // so this downcast is safe. 731 // so this downcast is safe.
762 FlexfecReceiveStreamImpl* receive_stream_impl = 732 FlexfecReceiveStreamImpl* receive_stream_impl =
763 static_cast<FlexfecReceiveStreamImpl*>(receive_stream); 733 static_cast<FlexfecReceiveStreamImpl*>(receive_stream);
764 { 734 {
765 WriteLockScoped write_lock(*receive_crit_); 735 WriteLockScoped write_lock(*receive_crit_);
766 736
767 uint32_t ssrc = receive_stream_impl->GetConfig().remote_ssrc; 737 uint32_t ssrc = receive_stream_impl->GetConfig().remote_ssrc;
768 receive_rtp_config_.erase(ssrc); 738 received_rtp_header_extensions_.erase(ssrc);
769 739
770 // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be 740 // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be
771 // destroyed. 741 // destroyed.
772 auto prot_it = flexfec_receive_ssrcs_protection_.begin(); 742 auto prot_it = flexfec_receive_ssrcs_protection_.begin();
773 while (prot_it != flexfec_receive_ssrcs_protection_.end()) { 743 while (prot_it != flexfec_receive_ssrcs_protection_.end()) {
774 if (prot_it->second == receive_stream_impl) 744 if (prot_it->second == receive_stream_impl)
775 prot_it = flexfec_receive_ssrcs_protection_.erase(prot_it); 745 prot_it = flexfec_receive_ssrcs_protection_.erase(prot_it);
776 else 746 else
777 ++prot_it; 747 ++prot_it;
778 } 748 }
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
1131 event_log_->LogRtcpPacket(kIncomingPacket, media_type, packet, length); 1101 event_log_->LogRtcpPacket(kIncomingPacket, media_type, packet, length);
1132 1102
1133 return rtcp_delivered ? DELIVERY_OK : DELIVERY_PACKET_ERROR; 1103 return rtcp_delivered ? DELIVERY_OK : DELIVERY_PACKET_ERROR;
1134 } 1104 }
1135 1105
1136 PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type, 1106 PacketReceiver::DeliveryStatus Call::DeliverRtp(MediaType media_type,
1137 const uint8_t* packet, 1107 const uint8_t* packet,
1138 size_t length, 1108 size_t length,
1139 const PacketTime& packet_time) { 1109 const PacketTime& packet_time) {
1140 TRACE_EVENT0("webrtc", "Call::DeliverRtp"); 1110 TRACE_EVENT0("webrtc", "Call::DeliverRtp");
1141 1111 // Minimum RTP header size.
1142 ReadLockScoped read_lock(*receive_crit_); 1112 if (length < 12)
1143 // TODO(nisse): We should parse the RTP header only here, and pass
1144 // on parsed_packet to the receive streams.
1145 rtc::Optional<RtpPacketReceived> parsed_packet =
1146 ParseRtpPacket(packet, length, packet_time);
1147
1148 if (!parsed_packet)
1149 return DELIVERY_PACKET_ERROR; 1113 return DELIVERY_PACKET_ERROR;
1150 1114
1151 NotifyBweOfReceivedPacket(*parsed_packet); 1115 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]);
1152 1116 ReadLockScoped read_lock(*receive_crit_);
1153 uint32_t ssrc = parsed_packet->Ssrc();
1154
1155 if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) { 1117 if (media_type == MediaType::ANY || media_type == MediaType::AUDIO) {
1156 auto it = audio_receive_ssrcs_.find(ssrc); 1118 auto it = audio_receive_ssrcs_.find(ssrc);
1157 if (it != audio_receive_ssrcs_.end()) { 1119 if (it != audio_receive_ssrcs_.end()) {
1158 received_bytes_per_second_counter_.Add(static_cast<int>(length)); 1120 received_bytes_per_second_counter_.Add(static_cast<int>(length));
1159 received_audio_bytes_per_second_counter_.Add(static_cast<int>(length)); 1121 received_audio_bytes_per_second_counter_.Add(static_cast<int>(length));
1160 auto status = it->second->DeliverRtp(packet, length, packet_time) 1122 auto status = it->second->DeliverRtp(packet, length, packet_time)
1161 ? DELIVERY_OK 1123 ? DELIVERY_OK
1162 : DELIVERY_PACKET_ERROR; 1124 : DELIVERY_PACKET_ERROR;
1163 if (status == DELIVERY_OK) 1125 if (status == DELIVERY_OK)
1164 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); 1126 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length);
1165 return status; 1127 return status;
1166 } 1128 }
1167 } 1129 }
1168 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { 1130 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
1169 auto it = video_receive_ssrcs_.find(ssrc); 1131 auto it = video_receive_ssrcs_.find(ssrc);
1170 if (it != video_receive_ssrcs_.end()) { 1132 if (it != video_receive_ssrcs_.end()) {
1171 received_bytes_per_second_counter_.Add(static_cast<int>(length)); 1133 received_bytes_per_second_counter_.Add(static_cast<int>(length));
1172 received_video_bytes_per_second_counter_.Add(static_cast<int>(length)); 1134 received_video_bytes_per_second_counter_.Add(static_cast<int>(length));
1173 // TODO(brandtr): Notify the BWE of received media packets here. 1135 // TODO(brandtr): Notify the BWE of received media packets here.
1174 auto status = it->second->DeliverRtp(packet, length, packet_time) 1136 auto status = it->second->DeliverRtp(packet, length, packet_time)
1175 ? DELIVERY_OK 1137 ? DELIVERY_OK
1176 : DELIVERY_PACKET_ERROR; 1138 : DELIVERY_PACKET_ERROR;
1177 // Deliver media packets to FlexFEC subsystem. RTP header extensions need 1139 // Deliver media packets to FlexFEC subsystem. RTP header extensions need
1178 // not be parsed, as FlexFEC is oblivious to the semantic meaning of the 1140 // not be parsed, as FlexFEC is oblivious to the semantic meaning of the
1179 // packet contents beyond the 12 byte RTP base header. The BWE is fed 1141 // packet contents beyond the 12 byte RTP base header. The BWE is fed
1180 // information about these media packets from the regular media pipeline. 1142 // information about these media packets from the regular media pipeline.
1143 rtc::Optional<RtpPacketReceived> parsed_packet =
1144 ParseRtpPacket(packet, length, packet_time);
1181 if (parsed_packet) { 1145 if (parsed_packet) {
1182 auto it_bounds = flexfec_receive_ssrcs_media_.equal_range(ssrc); 1146 auto it_bounds = flexfec_receive_ssrcs_media_.equal_range(ssrc);
1183 for (auto it = it_bounds.first; it != it_bounds.second; ++it) 1147 for (auto it = it_bounds.first; it != it_bounds.second; ++it)
1184 it->second->AddAndProcessReceivedPacket(*parsed_packet); 1148 it->second->AddAndProcessReceivedPacket(*parsed_packet);
1185 } 1149 }
1186 if (status == DELIVERY_OK) 1150 if (status == DELIVERY_OK)
1187 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); 1151 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length);
1188 return status; 1152 return status;
1189 } 1153 }
1190 } 1154 }
1191 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) { 1155 if (media_type == MediaType::ANY || media_type == MediaType::VIDEO) {
1192 auto it = flexfec_receive_ssrcs_protection_.find(ssrc); 1156 auto it = flexfec_receive_ssrcs_protection_.find(ssrc);
1193 if (it != flexfec_receive_ssrcs_protection_.end()) { 1157 if (it != flexfec_receive_ssrcs_protection_.end()) {
1158 rtc::Optional<RtpPacketReceived> parsed_packet =
1159 ParseRtpPacket(packet, length, packet_time);
1194 if (parsed_packet) { 1160 if (parsed_packet) {
1161 NotifyBweOfReceivedPacket(*parsed_packet);
1195 auto status = it->second->AddAndProcessReceivedPacket(*parsed_packet) 1162 auto status = it->second->AddAndProcessReceivedPacket(*parsed_packet)
1196 ? DELIVERY_OK 1163 ? DELIVERY_OK
1197 : DELIVERY_PACKET_ERROR; 1164 : DELIVERY_PACKET_ERROR;
1198 if (status == DELIVERY_OK) 1165 if (status == DELIVERY_OK)
1199 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length); 1166 event_log_->LogRtpHeader(kIncomingPacket, media_type, packet, length);
1200 return status; 1167 return status;
1201 } 1168 }
1202 } 1169 }
1203 } 1170 }
1204 return DELIVERY_UNKNOWN_SSRC; 1171 return DELIVERY_UNKNOWN_SSRC;
(...skipping 19 matching lines...) Expand all
1224 bool Call::OnRecoveredPacket(const uint8_t* packet, size_t length) { 1191 bool Call::OnRecoveredPacket(const uint8_t* packet, size_t length) {
1225 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]); 1192 uint32_t ssrc = ByteReader<uint32_t>::ReadBigEndian(&packet[8]);
1226 ReadLockScoped read_lock(*receive_crit_); 1193 ReadLockScoped read_lock(*receive_crit_);
1227 auto it = video_receive_ssrcs_.find(ssrc); 1194 auto it = video_receive_ssrcs_.find(ssrc);
1228 if (it == video_receive_ssrcs_.end()) 1195 if (it == video_receive_ssrcs_.end())
1229 return false; 1196 return false;
1230 return it->second->OnRecoveredPacket(packet, length); 1197 return it->second->OnRecoveredPacket(packet, length);
1231 } 1198 }
1232 1199
1233 void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet) { 1200 void Call::NotifyBweOfReceivedPacket(const RtpPacketReceived& packet) {
1234 auto it = receive_rtp_config_.find(packet.Ssrc());
1235 bool transport_cc =
1236 (it != receive_rtp_config_.end()) && it->second.transport_cc;
1237
1238 RTPHeader header; 1201 RTPHeader header;
1239 packet.GetHeader(&header); 1202 packet.GetHeader(&header);
1240
1241 // transport_cc represents the negotiation of the RTCP feedback
1242 // message used for send side BWE. If it was negotiated but the
1243 // corresponding RTP header extension is not present, or vice versa,
1244 // bandwidth estimation is not correctly configured.
1245 if (transport_cc != header.extension.hasTransportSequenceNumber) {
1246 LOG(LS_ERROR) << "Inconsistent configuration of send side BWE.";
1247 return;
1248 }
1249 congestion_controller_->OnReceivedPacket(packet.arrival_time_ms(), 1203 congestion_controller_->OnReceivedPacket(packet.arrival_time_ms(),
1250 packet.payload_size(), header); 1204 packet.payload_size(), header);
1251 } 1205 }
1252 1206
1253 } // namespace internal 1207 } // namespace internal
1254 } // namespace webrtc 1208 } // namespace webrtc
OLDNEW
« no previous file with comments | « webrtc/audio/audio_receive_stream_unittest.cc ('k') | webrtc/video/rtp_stream_receiver.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698