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_);