diff --git a/modules/rtp_rtcp/source/rtcp_receiver.cc b/modules/rtp_rtcp/source/rtcp_receiver.cc index 6eb8dee2d1..c117faaf59 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver.cc @@ -143,7 +143,6 @@ RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, : clock_(config.clock), receiver_only_(config.receiver_only), rtp_rtcp_(owner), - main_ssrc_(config.local_media_ssrc), registered_ssrcs_(false, config), rtcp_bandwidth_observer_(config.bandwidth_callback), rtcp_intra_frame_observer_(config.intra_frame_callback), @@ -177,7 +176,6 @@ RTCPReceiver::RTCPReceiver(const RtpRtcpInterface::Configuration& config, : clock_(config.clock), receiver_only_(config.receiver_only), rtp_rtcp_(owner), - main_ssrc_(config.local_media_ssrc), registered_ssrcs_(true, config), rtcp_bandwidth_observer_(config.bandwidth_callback), rtcp_intra_frame_observer_(config.intra_frame_callback), @@ -552,7 +550,7 @@ bool RTCPReceiver::ParseCompoundPacket(rtc::ArrayView packet, if (packet_type_counter_observer_) { packet_type_counter_observer_->RtcpPacketTypesCounterUpdated( - main_ssrc_, packet_type_counter_); + local_media_ssrc(), packet_type_counter_); } if (num_skipped_packets_ > 0) { @@ -692,7 +690,7 @@ void RTCPReceiver::HandleReportBlock(const ReportBlock& report_block, // Convert to 1/1000 seconds (milliseconds). TimeDelta rtt = CompactNtpRttToTimeDelta(rtt_ntp); report_block_data->AddRoundTripTimeSample(rtt.ms()); - if (report_block.source_ssrc() == main_ssrc_) { + if (report_block.source_ssrc() == local_media_ssrc()) { rtts_[remote_ssrc].AddRtt(rtt); } @@ -784,7 +782,7 @@ std::vector RTCPReceiver::BoundingSet(bool* tmmbr_owner) { if (!tmmbr_info) return std::vector(); - *tmmbr_owner = TMMBRHelp::IsOwner(tmmbr_info->tmmbn, main_ssrc_); + *tmmbr_owner = TMMBRHelp::IsOwner(tmmbr_info->tmmbn, local_media_ssrc()); return tmmbr_info->tmmbn; } @@ -811,7 +809,7 @@ void RTCPReceiver::HandleNack(const CommonHeader& rtcp_block, return; } - if (receiver_only_ || main_ssrc_ != nack.media_ssrc()) // Not to us. + if (receiver_only_ || local_media_ssrc() != nack.media_ssrc()) // Not to us. return; packet_information->nack_sequence_numbers.insert( @@ -978,7 +976,7 @@ void RTCPReceiver::HandlePli(const CommonHeader& rtcp_block, return; } - if (main_ssrc_ == pli.media_ssrc()) { + if (local_media_ssrc() == pli.media_ssrc()) { ++packet_type_counter_.pli_packets; // Received a signal that we need to send a new key frame. packet_information->packet_type_flags |= kRtcpPli; @@ -1001,7 +999,7 @@ void RTCPReceiver::HandleTmmbr(const CommonHeader& rtcp_block, } for (const rtcp::TmmbItem& request : tmmbr.requests()) { - if (main_ssrc_ != request.ssrc() || request.bitrate_bps() == 0) + if (local_media_ssrc() != request.ssrc() || request.bitrate_bps() == 0) continue; TmmbrInformation* tmmbr_info = FindOrCreateTmmbrInfo(tmmbr.sender_ssrc()); @@ -1083,7 +1081,7 @@ void RTCPReceiver::HandleFir(const CommonHeader& rtcp_block, const int64_t now_ms = clock_->TimeInMilliseconds(); for (const rtcp::Fir::Request& fir_request : fir.requests()) { // Is it our sender that is requested to generate a new keyframe. - if (main_ssrc_ != fir_request.ssrc) + if (local_media_ssrc() != fir_request.ssrc) continue; ++packet_type_counter_.fir_packets; @@ -1175,7 +1173,8 @@ void RTCPReceiver::TriggerCallbacksFromRtcpPacket( RTC_LOG(LS_VERBOSE) << "Incoming FIR from SSRC " << packet_information.remote_ssrc; } - rtcp_intra_frame_observer_->OnReceivedIntraFrameRequest(main_ssrc_); + rtcp_intra_frame_observer_->OnReceivedIntraFrameRequest( + local_media_ssrc()); } } if (rtcp_loss_notification_observer_ && @@ -1183,7 +1182,7 @@ void RTCPReceiver::TriggerCallbacksFromRtcpPacket( rtcp::LossNotification* loss_notification = packet_information.loss_notification.get(); RTC_DCHECK(loss_notification); - if (loss_notification->media_ssrc() == main_ssrc_) { + if (loss_notification->media_ssrc() == local_media_ssrc()) { rtcp_loss_notification_observer_->OnReceivedLossNotification( loss_notification->media_ssrc(), loss_notification->last_decoded(), loss_notification->last_received(), @@ -1215,7 +1214,7 @@ void RTCPReceiver::TriggerCallbacksFromRtcpPacket( (packet_information.packet_type_flags & kRtcpTransportFeedback)) { uint32_t media_source_ssrc = packet_information.transport_feedback->media_ssrc(); - if (media_source_ssrc == main_ssrc_ || + if (media_source_ssrc == local_media_ssrc() || registered_ssrcs_.contains(media_source_ssrc)) { transport_feedback_observer_->OnTransportFeedback( *packet_information.transport_feedback); diff --git a/modules/rtp_rtcp/source/rtcp_receiver.h b/modules/rtp_rtcp/source/rtcp_receiver.h index f45b783701..cdf4cbadf8 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver.h +++ b/modules/rtp_rtcp/source/rtcp_receiver.h @@ -376,7 +376,6 @@ class RTCPReceiver final { Clock* const clock_; const bool receiver_only_; ModuleRtpRtcp* const rtp_rtcp_; - const uint32_t main_ssrc_; // The set of registered local SSRCs. RegisteredSsrcs registered_ssrcs_; diff --git a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc index 95dc9df9ae..45b7902ec6 100644 --- a/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc +++ b/modules/rtp_rtcp/source/rtcp_receiver_unittest.cc @@ -1983,4 +1983,41 @@ TEST(RtcpReceiverTest, HandlesIncorrectTargetBitrate) { receiver.IncomingPacket(xr.Build()); } +TEST(RtcpReceiverTest, ChangeLocalMediaSsrc) { + ReceiverMocks mocks; + // Construct a receiver with `kReceiverMainSsrc` (default) local media ssrc. + RTCPReceiver receiver(DefaultConfiguration(&mocks), &mocks.rtp_rtcp_impl); + receiver.SetRemoteSSRC(kSenderSsrc); + + constexpr uint32_t kSecondarySsrc = kReceiverMainSsrc + 1; + + // Expect to only get the `OnReceivedNack()` callback once since we'll + // configure it for the `kReceiverMainSsrc` media ssrc. + EXPECT_CALL(mocks.rtp_rtcp_impl, OnReceivedNack); + + // We'll get two callbacks to RtcpPacketTypesCounterUpdated, one for each + // call to `IncomingPacket`, differentiated by the local media ssrc. + EXPECT_CALL(mocks.packet_type_counter_observer, + RtcpPacketTypesCounterUpdated(kReceiverMainSsrc, _)); + EXPECT_CALL(mocks.packet_type_counter_observer, + RtcpPacketTypesCounterUpdated(kSecondarySsrc, _)); + + // Construct a test nack packet with media ssrc set to `kReceiverMainSsrc`. + rtcp::Nack nack; + nack.SetSenderSsrc(kSenderSsrc); + nack.SetMediaSsrc(kReceiverMainSsrc); + const uint16_t kNackList[] = {1, 2, 3, 5}; + nack.SetPacketIds(kNackList, std::size(kNackList)); + + // Deliver the first callback. + receiver.IncomingPacket(nack.Build()); + + // Change the set local media ssrc. + receiver.set_local_media_ssrc(kSecondarySsrc); + + // Deliver another packet - this time there will be no callback to + // OnReceivedNack due to the ssrc not matching. + receiver.IncomingPacket(nack.Build()); +} + } // namespace webrtc