diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc index 1a55adbe46..0ff2b0c0e3 100644 --- a/audio/audio_receive_stream.cc +++ b/audio/audio_receive_stream.cc @@ -113,9 +113,7 @@ AudioReceiveStream::AudioReceiveStream( const rtc::scoped_refptr& audio_state, webrtc::RtcEventLog* event_log, std::unique_ptr channel_receive) - : audio_state_(audio_state), - channel_receive_(std::move(channel_receive)), - source_tracker_(clock) { + : audio_state_(audio_state), channel_receive_(std::move(channel_receive)) { RTC_LOG(LS_INFO) << "AudioReceiveStream: " << config.rtp.remote_ssrc; RTC_DCHECK(config.decoder_factory); RTC_DCHECK(config.rtcp_send_transport); @@ -269,18 +267,13 @@ int AudioReceiveStream::GetBaseMinimumPlayoutDelayMs() const { std::vector AudioReceiveStream::GetSources() const { RTC_DCHECK_RUN_ON(&worker_thread_checker_); - return source_tracker_.GetSources(); + return channel_receive_->GetSources(); } AudioMixer::Source::AudioFrameInfo AudioReceiveStream::GetAudioFrameWithInfo( int sample_rate_hz, AudioFrame* audio_frame) { - AudioMixer::Source::AudioFrameInfo audio_frame_info = - channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame); - if (audio_frame_info != AudioMixer::Source::AudioFrameInfo::kError) { - source_tracker_.OnFrameDelivered(audio_frame->packet_infos_); - } - return audio_frame_info; + return channel_receive_->GetAudioFrameWithInfo(sample_rate_hz, audio_frame); } int AudioReceiveStream::Ssrc() const { diff --git a/audio/audio_receive_stream.h b/audio/audio_receive_stream.h index 49969a2779..0924c03d5c 100644 --- a/audio/audio_receive_stream.h +++ b/audio/audio_receive_stream.h @@ -19,7 +19,6 @@ #include "audio/audio_state.h" #include "call/audio_receive_stream.h" #include "call/syncable.h" -#include "modules/rtp_rtcp/source/source_tracker.h" #include "rtc_base/constructor_magic.h" #include "rtc_base/thread_checker.h" #include "system_wrappers/include/clock.h" @@ -108,7 +107,6 @@ class AudioReceiveStream final : public webrtc::AudioReceiveStream, webrtc::AudioReceiveStream::Config config_; rtc::scoped_refptr audio_state_; const std::unique_ptr channel_receive_; - SourceTracker source_tracker_; AudioSendStream* associated_send_stream_ = nullptr; bool playing_ RTC_GUARDED_BY(worker_thread_checker_) = false; diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc index 7567e3b2e3..8b9dd2d7f2 100644 --- a/audio/channel_receive.cc +++ b/audio/channel_receive.cc @@ -30,6 +30,7 @@ #include "modules/rtp_rtcp/include/receive_statistics.h" #include "modules/rtp_rtcp/include/remote_ntp_time_estimator.h" #include "modules/rtp_rtcp/include/rtp_rtcp.h" +#include "modules/rtp_rtcp/source/contributing_sources.h" #include "modules/rtp_rtcp/source/rtp_header_extensions.h" #include "modules/rtp_rtcp/source/rtp_packet_received.h" #include "modules/rtp_rtcp/source/rtp_rtcp_config.h" @@ -154,6 +155,8 @@ class ChannelReceive : public ChannelReceiveInterface, // Used for obtaining RTT for a receive-only channel. void SetAssociatedSendChannel(const ChannelSendInterface* channel) override; + std::vector GetSources() const override; + // TODO(sukhanov): Return const pointer. It requires making media transport // getters like GetLatestTargetTransferRate to be also const. MediaTransportInterface* media_transport() const { @@ -210,13 +213,16 @@ class ChannelReceive : public ChannelReceiveInterface, std::unique_ptr _rtpRtcpModule; const uint32_t remote_ssrc_; - // Info for GetSyncInfo is updated on network or worker thread, and queried on - // the worker thread. - rtc::CriticalSection sync_info_lock_; + // Info for GetSources and GetSyncInfo is updated on network or worker thread, + // queried on the worker thread. + rtc::CriticalSection rtp_sources_lock_; + ContributingSources contributing_sources_ RTC_GUARDED_BY(&rtp_sources_lock_); absl::optional last_received_rtp_timestamp_ - RTC_GUARDED_BY(&sync_info_lock_); + RTC_GUARDED_BY(&rtp_sources_lock_); absl::optional last_received_rtp_system_time_ms_ - RTC_GUARDED_BY(&sync_info_lock_); + RTC_GUARDED_BY(&rtp_sources_lock_); + absl::optional last_received_rtp_audio_level_ + RTC_GUARDED_BY(&rtp_sources_lock_); std::unique_ptr audio_coding_; AudioSinkInterface* audio_sink_ = nullptr; @@ -549,6 +555,24 @@ absl::optional> return audio_coding_->ReceiveCodec(); } +std::vector ChannelReceive::GetSources() const { + RTC_DCHECK(worker_thread_checker_.IsCurrent()); + int64_t now_ms = rtc::TimeMillis(); + std::vector sources; + { + rtc::CritScope cs(&rtp_sources_lock_); + sources = contributing_sources_.GetSources(now_ms); + if (last_received_rtp_system_time_ms_ >= + now_ms - ContributingSources::kHistoryMs) { + RTC_DCHECK(last_received_rtp_timestamp_.has_value()); + sources.emplace_back(*last_received_rtp_system_time_ms_, remote_ssrc_, + RtpSourceType::SSRC, last_received_rtp_audio_level_, + *last_received_rtp_timestamp_); + } + } + return sources; +} + void ChannelReceive::SetReceiveCodecs( const std::map& codecs) { RTC_DCHECK(worker_thread_checker_.IsCurrent()); @@ -562,11 +586,22 @@ void ChannelReceive::SetReceiveCodecs( // May be called on either worker thread or network thread. void ChannelReceive::OnRtpPacket(const RtpPacketReceived& packet) { int64_t now_ms = rtc::TimeMillis(); + uint8_t audio_level; + bool voice_activity; + bool has_audio_level = + packet.GetExtension<::webrtc::AudioLevel>(&voice_activity, &audio_level); { - rtc::CritScope cs(&sync_info_lock_); + rtc::CritScope cs(&rtp_sources_lock_); last_received_rtp_timestamp_ = packet.Timestamp(); last_received_rtp_system_time_ms_ = now_ms; + if (has_audio_level) + last_received_rtp_audio_level_ = audio_level; + std::vector csrcs = packet.Csrcs(); + contributing_sources_.Update( + now_ms, csrcs, + has_audio_level ? absl::optional(audio_level) : absl::nullopt, + packet.Timestamp()); } // Store playout timestamp for the received RTP packet @@ -840,7 +875,7 @@ absl::optional ChannelReceive::GetSyncInfo() const { return absl::nullopt; } { - rtc::CritScope cs(&sync_info_lock_); + rtc::CritScope cs(&rtp_sources_lock_); if (!last_received_rtp_timestamp_ || !last_received_rtp_system_time_ms_) { return absl::nullopt; } diff --git a/audio/channel_receive.h b/audio/channel_receive.h index 0780a63692..1b0c81c314 100644 --- a/audio/channel_receive.h +++ b/audio/channel_receive.h @@ -135,6 +135,8 @@ class ChannelReceiveInterface : public RtpPacketSinkInterface { // Used for obtaining RTT for a receive-only channel. virtual void SetAssociatedSendChannel( const ChannelSendInterface* channel) = 0; + + virtual std::vector GetSources() const = 0; }; std::unique_ptr CreateChannelReceive(