Refactor: Move ssrc, media_channel, SetFrameDecryptor, and SetFrameTransformer to RtpReceiverBase - Add media_channel() pure virtual getter to RtpReceiverInternal - Move ssrc() implementation and signaled_ssrc_ member to RtpReceiverBase - Move SetFrameTransformer/frame_transformer_ to RtpReceiverBase - Move SetFrameDecryptor/GetFrameDecryptor/frame_decryptor_ to RtpReceiverBase - Add media_channel() override to AudioRtpReceiver and VideoRtpReceiver Both concrete receivers had identical implementations of these methods. Consolidating them in the base class reduces duplication and provides a foundation for wiring SFrame decryption at the base class level. Bug: webrtc:479862368 Change-Id: I8c2769006820e683d06491522b31ba321e975d16 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/466421 Reviewed-by: Harald Alvestrand <hta@webrtc.org> Commit-Queue: Harald Alvestrand <hta@webrtc.org> Reviewed-by: Philip Eliasson <philipel@webrtc.org> Cr-Commit-Position: refs/heads/main@{#47550}
diff --git a/pc/BUILD.gn b/pc/BUILD.gn index 6514d2f..29dfecb 100644 --- a/pc/BUILD.gn +++ b/pc/BUILD.gn
@@ -1838,6 +1838,7 @@ ":media_stream", ":media_stream_proxy", "../api:dtls_transport_interface", + "../api:frame_transformer_interface", "../api:media_stream_interface", "../api:rtc_error", "../api:rtp_receiver_interface", @@ -1845,6 +1846,7 @@ "../api:sequence_checker", "../api:sframe_decrypter_interface", "../api:sframe_types", + "../api/crypto:frame_decryptor_interface", "../media:media_channel", "../rtc_base:logging", "../rtc_base:macromagic",
diff --git a/pc/audio_rtp_receiver.cc b/pc/audio_rtp_receiver.cc index 585719c6..841506b 100644 --- a/pc/audio_rtp_receiver.cc +++ b/pc/audio_rtp_receiver.cc
@@ -19,9 +19,7 @@ #include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" -#include "api/crypto/frame_decryptor_interface.h" #include "api/dtls_transport_interface.h" -#include "api/frame_transformer_interface.h" #include "api/make_ref_counted.h" #include "api/media_stream_interface.h" #include "api/rtc_error.h" @@ -186,22 +184,6 @@ : media_channel_->GetDefaultRtpReceiveParameters(); } -void AudioRtpReceiver::SetFrameDecryptor( - scoped_refptr<FrameDecryptorInterface> frame_decryptor) { - RTC_DCHECK_RUN_ON(worker_thread_); - frame_decryptor_ = std::move(frame_decryptor); - // Special Case: Set the frame decryptor to any value on any existing channel. - if (media_channel_ && signaled_ssrc_) { - media_channel_->SetFrameDecryptor(*signaled_ssrc_, frame_decryptor_); - } -} - -scoped_refptr<FrameDecryptorInterface> AudioRtpReceiver::GetFrameDecryptor() - const { - RTC_DCHECK_RUN_ON(worker_thread_); - return frame_decryptor_; -} - void AudioRtpReceiver::Stop() { RTC_DCHECK_RUN_ON(&signaling_thread_checker_); source_->SetState(MediaSourceInterface::kEnded); @@ -262,12 +244,9 @@ return GetRestartFunctionForMediaChannel(std::nullopt); } -std::optional<uint32_t> AudioRtpReceiver::ssrc() const { +MediaReceiveChannelInterface* AudioRtpReceiver::media_channel() const { RTC_DCHECK_RUN_ON(worker_thread_); - if (!signaled_ssrc_.has_value() && media_channel_) { - return media_channel_->GetUnsignaledSsrc(); - } - return signaled_ssrc_; + return media_channel_; } void AudioRtpReceiver::set_stream_ids(std::vector<std::string> stream_ids) { @@ -324,16 +303,6 @@ return media_channel_->GetSources(current_ssrc.value()); } -void AudioRtpReceiver::SetFrameTransformer( - scoped_refptr<FrameTransformerInterface> frame_transformer) { - RTC_DCHECK_RUN_ON(worker_thread_); - if (media_channel_) { - media_channel_->SetDepacketizerToDecoderFrameTransformer( - signaled_ssrc_.value_or(0), frame_transformer); - } - frame_transformer_ = std::move(frame_transformer); -} - void AudioRtpReceiver::Reconfigure(bool track_enabled) { RTC_DCHECK_RUN_ON(worker_thread_); RTC_DCHECK(media_channel_);
diff --git a/pc/audio_rtp_receiver.h b/pc/audio_rtp_receiver.h index 984a80c..209c96a 100644 --- a/pc/audio_rtp_receiver.h +++ b/pc/audio_rtp_receiver.h
@@ -19,9 +19,7 @@ #include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" -#include "api/crypto/frame_decryptor_interface.h" #include "api/dtls_transport_interface.h" -#include "api/frame_transformer_interface.h" #include "api/media_stream_interface.h" #include "api/media_types.h" #include "api/rtc_error.h" @@ -102,16 +100,12 @@ RtpParameters GetParameters() const override; - void SetFrameDecryptor( - scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; - - scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() const override; - // RtpReceiverInternal implementation. void Stop() override; absl::AnyInvocable<void() &&> GetSetupForMediaChannel(uint32_t ssrc) override; absl::AnyInvocable<void() &&> GetSetupForUnsignaledMediaChannel() override; - std::optional<uint32_t> ssrc() const override; + MediaReceiveChannelInterface* media_channel() const override + RTC_RUN_ON(worker_thread_); void NotifyFirstPacketReceived(uint32_t ssrc) override; void NotifyFirstPacketReceivedAfterReceptiveChange(uint32_t ssrc) override; void set_stream_ids(std::vector<std::string> stream_ids) override; @@ -128,8 +122,6 @@ std::vector<RtpSource> GetSources() const override; int AttachmentId() const override { return attachment_id_; } - void SetFrameTransformer( - scoped_refptr<FrameTransformerInterface> frame_transformer) override; private: AudioRtpReceiver( @@ -154,7 +146,6 @@ const scoped_refptr<AudioTrackProxyWithInternal<AudioTrack>> track_; VoiceMediaReceiveChannelInterface* media_channel_ RTC_GUARDED_BY(worker_thread_) = nullptr; - std::optional<uint32_t> signaled_ssrc_ RTC_GUARDED_BY(worker_thread_); std::vector<scoped_refptr<MediaStreamInterface>> streams_ RTC_GUARDED_BY(&signaling_thread_checker_); bool cached_track_enabled_ RTC_GUARDED_BY(&signaling_thread_checker_); @@ -164,15 +155,11 @@ bool received_first_packet_ RTC_GUARDED_BY(&signaling_thread_checker_) = false; const int attachment_id_; - scoped_refptr<FrameDecryptorInterface> frame_decryptor_ - RTC_GUARDED_BY(worker_thread_); scoped_refptr<DtlsTransportInterface> dtls_transport_ RTC_GUARDED_BY(&signaling_thread_checker_); // Stores and updates the playout delay. Handles caching cases if // `SetJitterBufferMinimumDelay` is called before start. JitterBufferDelay delay_ RTC_GUARDED_BY(worker_thread_); - scoped_refptr<FrameTransformerInterface> frame_transformer_ - RTC_GUARDED_BY(worker_thread_); const scoped_refptr<PendingTaskSafetyFlag> worker_thread_safety_; };
diff --git a/pc/rtp_receiver.cc b/pc/rtp_receiver.cc index 0151622..a2b2eaa 100644 --- a/pc/rtp_receiver.cc +++ b/pc/rtp_receiver.cc
@@ -12,11 +12,15 @@ #include <atomic> #include <cstddef> +#include <cstdint> +#include <optional> #include <string> #include <utility> #include <vector> #include "absl/functional/any_invocable.h" +#include "api/crypto/frame_decryptor_interface.h" +#include "api/frame_transformer_interface.h" #include "api/media_stream_interface.h" #include "api/rtc_error.h" #include "api/scoped_refptr.h" @@ -54,6 +58,40 @@ : worker_thread_(worker_thread), enable_sframe_at_owner_(std::move(enable_sframe_at_owner)) {} +std::optional<uint32_t> RtpReceiverBase::ssrc() const { + RTC_DCHECK_RUN_ON(worker_thread_); + if (!signaled_ssrc_.has_value() && media_channel()) { + return media_channel()->GetUnsignaledSsrc(); + } + return signaled_ssrc_; +} + +void RtpReceiverBase::SetFrameDecryptor( + scoped_refptr<FrameDecryptorInterface> frame_decryptor) { + RTC_DCHECK_RUN_ON(worker_thread_); + frame_decryptor_ = std::move(frame_decryptor); + // Special Case: Set the frame decryptor to any value on any existing channel. + if (media_channel() && signaled_ssrc_) { + media_channel()->SetFrameDecryptor(*signaled_ssrc_, frame_decryptor_); + } +} + +scoped_refptr<FrameDecryptorInterface> RtpReceiverBase::GetFrameDecryptor() + const { + RTC_DCHECK_RUN_ON(worker_thread_); + return frame_decryptor_; +} + +void RtpReceiverBase::SetFrameTransformer( + scoped_refptr<FrameTransformerInterface> frame_transformer) { + RTC_DCHECK_RUN_ON(worker_thread_); + frame_transformer_ = std::move(frame_transformer); + if (media_channel()) { + media_channel()->SetDepacketizerToDecoderFrameTransformer( + signaled_ssrc_.value_or(0), frame_transformer_); + } +} + RTCErrorOr<scoped_refptr<SframeDecrypterInterface>> RtpReceiverBase::CreateSframeDecrypterOrError(SframeCipherSuite cipher_suite) { RTC_DCHECK_RUN_ON(&signaling_thread_checker_);
diff --git a/pc/rtp_receiver.h b/pc/rtp_receiver.h index 8f8616c..c3f7120 100644 --- a/pc/rtp_receiver.h +++ b/pc/rtp_receiver.h
@@ -22,7 +22,9 @@ #include <vector> #include "absl/functional/any_invocable.h" +#include "api/crypto/frame_decryptor_interface.h" #include "api/dtls_transport_interface.h" +#include "api/frame_transformer_interface.h" #include "api/media_stream_interface.h" #include "api/rtc_error.h" #include "api/rtp_receiver_interface.h" @@ -45,6 +47,11 @@ // state set to `kEnded`, a final state that cannot be reversed. virtual void Stop() = 0; + // Returns the underlying MediaEngine channel associated with this receiver. + // May return nullptr if no channel is set. + // Must be invoked on the worker thread. + virtual MediaReceiveChannelInterface* media_channel() const = 0; + // Sets the underlying MediaEngine channel associated with this RtpSender. // A VoiceMediaChannel should be used for audio RtpSenders and // a VideoMediaChannel should be used for video RtpSenders. @@ -109,6 +116,15 @@ RTCErrorOr<scoped_refptr<SframeDecrypterInterface>> CreateSframeDecrypterOrError(SframeCipherSuite cipher_suite) override; + std::optional<uint32_t> ssrc() const override; + + void SetFrameDecryptor( + scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; + scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() const override; + + void SetFrameTransformer( + scoped_refptr<FrameTransformerInterface> frame_transformer) override; + protected: explicit RtpReceiverBase( Thread* worker_thread, @@ -116,6 +132,11 @@ RTC_NO_UNIQUE_ADDRESS SequenceChecker signaling_thread_checker_; Thread* const worker_thread_; + std::optional<uint32_t> signaled_ssrc_ RTC_GUARDED_BY(worker_thread_); + scoped_refptr<FrameDecryptorInterface> frame_decryptor_ + RTC_GUARDED_BY(worker_thread_); + scoped_refptr<FrameTransformerInterface> frame_transformer_ + RTC_GUARDED_BY(worker_thread_); private: absl::AnyInvocable<RTCError()> enable_sframe_at_owner_
diff --git a/pc/test/mock_rtp_receiver_internal.h b/pc/test/mock_rtp_receiver_internal.h index 29fbd4f..3f8ab9e 100644 --- a/pc/test/mock_rtp_receiver_internal.h +++ b/pc/test/mock_rtp_receiver_internal.h
@@ -68,6 +68,10 @@ // RtpReceiverInternal methods. MOCK_METHOD(void, Stop, (), (override)); + MOCK_METHOD(MediaReceiveChannelInterface*, + media_channel, + (), + (const, override)); MOCK_METHOD(void, SetMediaChannel, (webrtc::MediaReceiveChannelInterface*),
diff --git a/pc/video_rtp_receiver.cc b/pc/video_rtp_receiver.cc index 5d3bf2b..1705de2 100644 --- a/pc/video_rtp_receiver.cc +++ b/pc/video_rtp_receiver.cc
@@ -19,9 +19,7 @@ #include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" -#include "api/crypto/frame_decryptor_interface.h" #include "api/dtls_transport_interface.h" -#include "api/frame_transformer_interface.h" #include "api/make_ref_counted.h" #include "api/media_stream_interface.h" #include "api/rtc_error.h" @@ -110,32 +108,6 @@ : media_channel_->GetDefaultRtpReceiveParameters(); } -void VideoRtpReceiver::SetFrameDecryptor( - scoped_refptr<FrameDecryptorInterface> frame_decryptor) { - RTC_DCHECK_RUN_ON(worker_thread_); - frame_decryptor_ = std::move(frame_decryptor); - // Special Case: Set the frame decryptor to any value on any existing channel. - if (media_channel_ && signaled_ssrc_) { - media_channel_->SetFrameDecryptor(*signaled_ssrc_, frame_decryptor_); - } -} - -scoped_refptr<FrameDecryptorInterface> VideoRtpReceiver::GetFrameDecryptor() - const { - RTC_DCHECK_RUN_ON(worker_thread_); - return frame_decryptor_; -} - -void VideoRtpReceiver::SetFrameTransformer( - scoped_refptr<FrameTransformerInterface> frame_transformer) { - RTC_DCHECK_RUN_ON(worker_thread_); - frame_transformer_ = std::move(frame_transformer); - if (media_channel_) { - media_channel_->SetDepacketizerToDecoderFrameTransformer( - signaled_ssrc_.value_or(0), frame_transformer_); - } -} - void VideoRtpReceiver::Stop() { RTC_DCHECK_RUN_ON(&signaling_thread_checker_); source_->SetState(MediaSourceInterface::kEnded); @@ -218,12 +190,9 @@ return GetRestartFunctionForMediaChannel(std::nullopt); } -std::optional<uint32_t> VideoRtpReceiver::ssrc() const { +MediaReceiveChannelInterface* VideoRtpReceiver::media_channel() const { RTC_DCHECK_RUN_ON(worker_thread_); - if (!signaled_ssrc_.has_value() && media_channel_) { - return media_channel_->GetUnsignaledSsrc(); - } - return signaled_ssrc_; + return media_channel_; } void VideoRtpReceiver::set_stream_ids(std::vector<std::string> stream_ids) {
diff --git a/pc/video_rtp_receiver.h b/pc/video_rtp_receiver.h index 67cafd1..7305fec 100644 --- a/pc/video_rtp_receiver.h +++ b/pc/video_rtp_receiver.h
@@ -19,9 +19,7 @@ #include "absl/functional/any_invocable.h" #include "absl/strings/string_view.h" -#include "api/crypto/frame_decryptor_interface.h" #include "api/dtls_transport_interface.h" -#include "api/frame_transformer_interface.h" #include "api/media_stream_interface.h" #include "api/media_types.h" #include "api/rtc_error.h" @@ -80,19 +78,12 @@ RtpParameters GetParameters() const override; - void SetFrameDecryptor( - scoped_refptr<FrameDecryptorInterface> frame_decryptor) override; - - scoped_refptr<FrameDecryptorInterface> GetFrameDecryptor() const override; - - void SetFrameTransformer( - scoped_refptr<FrameTransformerInterface> frame_transformer) override; - // RtpReceiverInternal implementation. void Stop() override; absl::AnyInvocable<void() &&> GetSetupForMediaChannel(uint32_t ssrc) override; absl::AnyInvocable<void() &&> GetSetupForUnsignaledMediaChannel() override; - std::optional<uint32_t> ssrc() const override; + MediaReceiveChannelInterface* media_channel() const override + RTC_RUN_ON(worker_thread_); void NotifyFirstPacketReceived(uint32_t ssrc) override; void NotifyFirstPacketReceivedAfterReceptiveChange(uint32_t ssrc) override; void set_stream_ids(std::vector<std::string> stream_ids) override; @@ -151,7 +142,6 @@ const std::string id_; VideoMediaReceiveChannelInterface* media_channel_ RTC_GUARDED_BY(worker_thread_) = nullptr; - std::optional<uint32_t> signaled_ssrc_ RTC_GUARDED_BY(worker_thread_); // `source_` is held here to be able to change the state of the source when // the VideoRtpReceiver is stopped. const scoped_refptr<VideoRtpTrackSource> source_; @@ -163,12 +153,8 @@ bool received_first_packet_ RTC_GUARDED_BY(&signaling_thread_checker_) = false; const int attachment_id_; - scoped_refptr<FrameDecryptorInterface> frame_decryptor_ - RTC_GUARDED_BY(worker_thread_); scoped_refptr<DtlsTransportInterface> dtls_transport_ RTC_GUARDED_BY(&signaling_thread_checker_); - scoped_refptr<FrameTransformerInterface> frame_transformer_ - RTC_GUARDED_BY(worker_thread_); // Stores the minimum jitter buffer delay. Handles caching cases // if `SetJitterBufferMinimumDelay` is called before start. JitterBufferDelay delay_ RTC_GUARDED_BY(worker_thread_);