diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc index 7270f3928a..666e1e23dc 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.cc @@ -688,8 +688,10 @@ void RTCPReceiver::HandleXr(const CommonHeader& rtcp_block, for (const rtcp::ReceiveTimeInfo& time_info : xr.dlrr().sub_blocks()) HandleXrDlrrReportBlock(time_info); - if (xr.target_bitrate()) - HandleXrTargetBitrate(*xr.target_bitrate(), packet_information); + if (xr.target_bitrate()) { + HandleXrTargetBitrate(xr.sender_ssrc(), *xr.target_bitrate(), + packet_information); + } } void RTCPReceiver::HandleXrReceiveReferenceTime(uint32_t sender_ssrc, @@ -722,8 +724,13 @@ void RTCPReceiver::HandleXrDlrrReportBlock(const rtcp::ReceiveTimeInfo& rti) { } void RTCPReceiver::HandleXrTargetBitrate( + uint32_t ssrc, const rtcp::TargetBitrate& target_bitrate, PacketInformation* packet_information) { + if (ssrc != remote_ssrc_) { + return; // Not for us. + } + BitrateAllocation bitrate_allocation; for (const auto& item : target_bitrate.GetTargetBitrates()) { if (item.spatial_layer >= kMaxSpatialLayers || diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h index 5f0b151d42..a167c135b0 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver.h @@ -165,7 +165,8 @@ class RTCPReceiver { void HandleXrDlrrReportBlock(const rtcp::ReceiveTimeInfo& rti) EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_); - void HandleXrTargetBitrate(const rtcp::TargetBitrate& target_bitrate, + void HandleXrTargetBitrate(uint32_t ssrc, + const rtcp::TargetBitrate& target_bitrate, PacketInformation* packet_information) EXCLUSIVE_LOCKS_REQUIRED(rtcp_receiver_lock_); diff --git a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index 3ad333c6b9..d42a74e6a1 100644 --- a/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/webrtc/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -1225,6 +1225,15 @@ TEST_F(RtcpReceiverTest, ReceivesTargetBitrate) { rtcp::ExtendedReports xr; xr.SetTargetBitrate(bitrate); + // Wrong sender ssrc, target bitrate should be discarded. + xr.SetSenderSsrc(kSenderSsrc + 1); + EXPECT_CALL(bitrate_allocation_observer_, + OnBitrateAllocationUpdated(expected_allocation)) + .Times(0); + InjectRtcpPacket(xr); + + // Set correct ssrc, callback should be called once. + xr.SetSenderSsrc(kSenderSsrc); EXPECT_CALL(bitrate_allocation_observer_, OnBitrateAllocationUpdated(expected_allocation)); InjectRtcpPacket(xr); @@ -1241,6 +1250,7 @@ TEST_F(RtcpReceiverTest, HandlesIncorrectTargetBitrate) { rtcp::ExtendedReports xr; xr.SetTargetBitrate(bitrate); + xr.SetSenderSsrc(kSenderSsrc); EXPECT_CALL(bitrate_allocation_observer_, OnBitrateAllocationUpdated(expected_allocation));