Add getter for rtp header extensions for receiver classes.

This is to avoid accessing the array via the config struct.
Moving forward we might want to consider using the RtpHeaderExtensionMap
instead of a std::vector of RtpExtension.

Bug: webrtc:11993
Change-Id: I8469dbbd9bb95a69f87b5912bfc4bf8b8f603beb
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/261317
Reviewed-by: Niels Moller <nisse@webrtc.org>
Commit-Queue: Tomas Gunnarsson <tommi@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36820}
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
index d4c7910..f45f608 100644
--- a/audio/audio_receive_stream.cc
+++ b/audio/audio_receive_stream.cc
@@ -265,6 +265,11 @@
   config_.rtp.extensions = std::move(extensions);
 }
 
+const std::vector<RtpExtension>& AudioReceiveStream::GetRtpExtensions() const {
+  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
+  return config_.rtp.extensions;
+}
+
 webrtc::AudioReceiveStream::Stats AudioReceiveStream::GetStats(
     bool get_and_clear_legacy_stats) const {
   RTC_DCHECK_RUN_ON(&worker_thread_checker_);
diff --git a/audio/audio_receive_stream.h b/audio/audio_receive_stream.h
index 252ab13..6a4c022 100644
--- a/audio/audio_receive_stream.h
+++ b/audio/audio_receive_stream.h
@@ -95,6 +95,7 @@
   void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
                              frame_decryptor) override;
   void SetRtpExtensions(std::vector<RtpExtension> extensions) override;
+  const std::vector<RtpExtension>& GetRtpExtensions() const override;
 
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
diff --git a/call/call.cc b/call/call.cc
index 0703fd4..ae6c767 100644
--- a/call/call.cc
+++ b/call/call.cc
@@ -79,10 +79,10 @@
   return true;
 }
 
-bool UseSendSideBwe(const ReceiveStream::RtpConfig& rtp) {
-  if (!rtp.transport_cc)
+bool UseSendSideBwe(const ReceiveStream* stream) {
+  if (!stream->rtp_config().transport_cc)
     return false;
-  for (const auto& extension : rtp.extensions) {
+  for (const auto& extension : stream->GetRtpExtensions()) {
     if (extension.uri == RtpExtension::kTransportSequenceNumberUri ||
         extension.uri == RtpExtension::kTransportSequenceNumberV2Uri)
       return true;
@@ -1010,8 +1010,7 @@
 
   uint32_t ssrc = audio_receive_stream->remote_ssrc();
   receive_side_cc_
-      .GetRemoteBitrateEstimator(
-          UseSendSideBwe(audio_receive_stream->rtp_config()))
+      .GetRemoteBitrateEstimator(UseSendSideBwe(audio_receive_stream))
       ->RemoveStream(ssrc);
 
   audio_receive_streams_.erase(audio_receive_stream);
@@ -1189,6 +1188,7 @@
   // TODO(bugs.webrtc.org/11993): Unregister on the network thread.
   receive_stream_impl->UnregisterFromTransport();
 
+  // TODO(tommi): Remove `rtp()` accessor.
   const webrtc::VideoReceiveStream::Config::Rtp& rtp =
       receive_stream_impl->rtp();
 
@@ -1201,7 +1201,8 @@
   video_receive_streams_.erase(receive_stream_impl);
   ConfigureSync(receive_stream_impl->sync_group());
 
-  receive_side_cc_.GetRemoteBitrateEstimator(UseSendSideBwe(rtp))
+  receive_side_cc_
+      .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl))
       ->RemoveStream(rtp.remote_ssrc);
 
   UpdateAggregateNetworkState();
@@ -1251,8 +1252,7 @@
   // Remove all SSRCs pointing to the FlexfecReceiveStreamImpl to be
   // destroyed.
   receive_side_cc_
-      .GetRemoteBitrateEstimator(
-          UseSendSideBwe(receive_stream_impl->rtp_config()))
+      .GetRemoteBitrateEstimator(UseSendSideBwe(receive_stream_impl))
       ->RemoveStream(ssrc);
 
   delete receive_stream_impl;
@@ -1694,10 +1694,10 @@
   }
 
   packet.IdentifyExtensions(
-      RtpHeaderExtensionMap(it->second->rtp_config().extensions));
+      RtpHeaderExtensionMap(it->second->GetRtpExtensions()));
 
   if (use_send_side_bwe) {
-    *use_send_side_bwe = UseSendSideBwe(it->second->rtp_config());
+    *use_send_side_bwe = UseSendSideBwe(it->second);
   }
 
   return true;
diff --git a/call/flexfec_receive_stream_impl.cc b/call/flexfec_receive_stream_impl.cc
index 6c8378d..24e2120 100644
--- a/call/flexfec_receive_stream_impl.cc
+++ b/call/flexfec_receive_stream_impl.cc
@@ -210,4 +210,10 @@
       std::move(extensions);
 }
 
+const std::vector<RtpExtension>& FlexfecReceiveStreamImpl::GetRtpExtensions()
+    const {
+  RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
+  return config_.rtp.extensions;
+}
+
 }  // namespace webrtc
diff --git a/call/flexfec_receive_stream_impl.h b/call/flexfec_receive_stream_impl.h
index c640ac6..0bc9faa 100644
--- a/call/flexfec_receive_stream_impl.h
+++ b/call/flexfec_receive_stream_impl.h
@@ -60,6 +60,7 @@
 
   // ReceiveStream impl.
   void SetRtpExtensions(std::vector<RtpExtension> extensions) override;
+  const std::vector<RtpExtension>& GetRtpExtensions() const override;
   const RtpConfig& rtp_config() const override { return config_.rtp; }
   uint32_t remote_ssrc() const { return config_.rtp.remote_ssrc; }
 
diff --git a/call/receive_stream.h b/call/receive_stream.h
index a6756fc..5413387 100644
--- a/call/receive_stream.h
+++ b/call/receive_stream.h
@@ -55,6 +55,11 @@
   // delivery thread.
   virtual void SetRtpExtensions(std::vector<RtpExtension> extensions) = 0;
 
+  // Access the currently set rtp extensions. Must be called on the packet
+  // delivery thread.
+  // TODO(tommi): Consider using `RtpHeaderExtensionMap` instead.
+  virtual const std::vector<RtpExtension>& GetRtpExtensions() const = 0;
+
   // Called on the packet delivery thread since some members of the config may
   // change mid-stream (e.g. the local ssrc). All mutation must also happen on
   // the packet delivery thread. Return value can be assumed to
diff --git a/media/engine/fake_webrtc_call.cc b/media/engine/fake_webrtc_call.cc
index 20651d1..d235e20 100644
--- a/media/engine/fake_webrtc_call.cc
+++ b/media/engine/fake_webrtc_call.cc
@@ -130,6 +130,11 @@
   config_.rtp.extensions = std::move(extensions);
 }
 
+const std::vector<webrtc::RtpExtension>&
+FakeAudioReceiveStream::GetRtpExtensions() const {
+  return config_.rtp.extensions;
+}
+
 webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats(
     bool get_and_clear_legacy_stats) const {
   return stats_;
@@ -380,6 +385,11 @@
   config_.rtp.extensions = std::move(extensions);
 }
 
+const std::vector<webrtc::RtpExtension>&
+FakeVideoReceiveStream::GetRtpExtensions() const {
+  return config_.rtp.extensions;
+}
+
 void FakeVideoReceiveStream::Start() {
   receiving_ = true;
 }
@@ -402,6 +412,11 @@
   config_.rtp.extensions = std::move(extensions);
 }
 
+const std::vector<webrtc::RtpExtension>&
+FakeFlexfecReceiveStream::GetRtpExtensions() const {
+  return config_.rtp.extensions;
+}
+
 const webrtc::FlexfecReceiveStream::Config&
 FakeFlexfecReceiveStream::GetConfig() const {
   return config_;
diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h
index 338996a..47d7b18 100644
--- a/media/engine/fake_webrtc_call.h
+++ b/media/engine/fake_webrtc_call.h
@@ -128,6 +128,7 @@
   void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
                              frame_decryptor) override;
   void SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions) override;
+  const std::vector<webrtc::RtpExtension>& GetRtpExtensions() const override;
 
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
@@ -266,6 +267,7 @@
  private:
   // webrtc::VideoReceiveStream implementation.
   void SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions) override;
+  const std::vector<webrtc::RtpExtension>& GetRtpExtensions() const override;
 
   const webrtc::ReceiveStream::RtpConfig& rtp_config() const override {
     return config_.rtp;
@@ -298,6 +300,7 @@
       const webrtc::FlexfecReceiveStream::Config& config);
 
   void SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions) override;
+  const std::vector<webrtc::RtpExtension>& GetRtpExtensions() const override;
 
   const webrtc::ReceiveStream::RtpConfig& rtp_config() const override {
     return config_.rtp;
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 1672a71..82a30ff 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -1262,9 +1262,8 @@
   webrtc::RtpParameters GetRtpParameters() const {
     webrtc::RtpParameters rtp_parameters;
     rtp_parameters.encodings.emplace_back();
-    const auto& config = stream_->rtp_config();
     rtp_parameters.encodings[0].ssrc = stream_->remote_ssrc();
-    rtp_parameters.header_extensions = config.extensions;
+    rtp_parameters.header_extensions = stream_->GetRtpExtensions();
     return rtp_parameters;
   }
 
diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc
index 890edc6..dcc2f80 100644
--- a/video/video_receive_stream2.cc
+++ b/video/video_receive_stream2.cc
@@ -487,6 +487,12 @@
   c.rtp.extensions = std::move(extensions);
 }
 
+const std::vector<RtpExtension>& VideoReceiveStream2::GetRtpExtensions() const {
+  RTC_DCHECK_RUN_ON(&packet_sequence_checker_);
+  // TODO(tommi): return the state held by `rtp_video_stream_receiver_`.
+  return config_.rtp.extensions;
+}
+
 void VideoReceiveStream2::CreateAndRegisterExternalDecoder(
     const Decoder& decoder) {
   TRACE_EVENT0("webrtc",
diff --git a/video/video_receive_stream2.h b/video/video_receive_stream2.h
index 726e91b..e5acf30 100644
--- a/video/video_receive_stream2.h
+++ b/video/video_receive_stream2.h
@@ -135,6 +135,7 @@
   void Stop() override;
 
   void SetRtpExtensions(std::vector<RtpExtension> extensions) override;
+  const std::vector<RtpExtension>& GetRtpExtensions() const override;
 
   const RtpConfig& rtp_config() const override { return rtp(); }