Don't recreate audio receive streams on header extension update.

Bug: webrtc:11993
Change-Id: Ibf45cb846713a6dd991a73bc72b4c5f59e3e26e5
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/222041
Commit-Queue: Tommi <tommi@webrtc.org>
Reviewed-by: Markus Handell <handellm@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34287}
diff --git a/audio/audio_receive_stream.cc b/audio/audio_receive_stream.cc
index 7476e08..623cb26 100644
--- a/audio/audio_receive_stream.cc
+++ b/audio/audio_receive_stream.cc
@@ -254,6 +254,14 @@
   channel_receive_->SetFrameDecryptor(std::move(frame_decryptor));
 }
 
+void AudioReceiveStream::SetRtpExtensions(
+    std::vector<RtpExtension> extensions) {
+  // TODO(bugs.webrtc.org/11993): This is called via WebRtcAudioReceiveStream,
+  // expect to be called on the network thread.
+  RTC_DCHECK_RUN_ON(&worker_thread_checker_);
+  config_.rtp.extensions = std::move(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 27e99f0..b038aff 100644
--- a/audio/audio_receive_stream.h
+++ b/audio/audio_receive_stream.h
@@ -94,6 +94,7 @@
                                        int history_ms) override;
   void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
                              frame_decryptor) override;
+  void SetRtpExtensions(std::vector<RtpExtension> extensions) override;
 
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
diff --git a/call/audio_receive_stream.h b/call/audio_receive_stream.h
index 55e3fdb..54729d0 100644
--- a/call/audio_receive_stream.h
+++ b/call/audio_receive_stream.h
@@ -156,6 +156,9 @@
   virtual void SetDecoderMap(std::map<int, SdpAudioFormat> decoder_map) = 0;
   virtual void SetUseTransportCcAndNackHistory(bool use_transport_cc,
                                                int history_ms) = 0;
+  // Set/change the rtp header extensions. Must be called on the packet
+  // delivery thread.
+  virtual void SetRtpExtensions(std::vector<RtpExtension> extensions) = 0;
 
   // Returns true if the stream has been started.
   virtual bool IsRunning() const = 0;
diff --git a/media/engine/fake_webrtc_call.cc b/media/engine/fake_webrtc_call.cc
index 0190d88..fa5125f 100644
--- a/media/engine/fake_webrtc_call.cc
+++ b/media/engine/fake_webrtc_call.cc
@@ -118,6 +118,11 @@
   config_.frame_decryptor = std::move(frame_decryptor);
 }
 
+void FakeAudioReceiveStream::SetRtpExtensions(
+    std::vector<webrtc::RtpExtension> extensions) {
+  config_.rtp.extensions = std::move(extensions);
+}
+
 webrtc::AudioReceiveStream::Stats FakeAudioReceiveStream::GetStats(
     bool get_and_clear_legacy_stats) const {
   return stats_;
diff --git a/media/engine/fake_webrtc_call.h b/media/engine/fake_webrtc_call.h
index 5a14157..874f971 100644
--- a/media/engine/fake_webrtc_call.h
+++ b/media/engine/fake_webrtc_call.h
@@ -116,6 +116,7 @@
                                        int history_ms) override;
   void SetFrameDecryptor(rtc::scoped_refptr<webrtc::FrameDecryptorInterface>
                              frame_decryptor) override;
+  void SetRtpExtensions(std::vector<webrtc::RtpExtension> extensions) override;
 
   webrtc::AudioReceiveStream::Stats GetStats(
       bool get_and_clear_legacy_stats) const override;
diff --git a/media/engine/webrtc_voice_engine.cc b/media/engine/webrtc_voice_engine.cc
index 575e232..f38474b 100644
--- a/media/engine/webrtc_voice_engine.cc
+++ b/media/engine/webrtc_voice_engine.cc
@@ -1238,11 +1238,10 @@
                                              config_.rtp.nack.rtp_history_ms);
   }
 
-  void SetRtpExtensionsAndRecreateStream(
-      const std::vector<webrtc::RtpExtension>& extensions) {
+  void SetRtpExtensions(const std::vector<webrtc::RtpExtension>& extensions) {
     RTC_DCHECK_RUN_ON(&worker_thread_checker_);
     config_.rtp.extensions = extensions;
-    RecreateAudioReceiveStream();
+    stream_->SetRtpExtensions(extensions);
   }
 
   // Set a new payload type -> decoder map.
@@ -1472,7 +1471,7 @@
   if (recv_rtp_extensions_ != filtered_extensions) {
     recv_rtp_extensions_.swap(filtered_extensions);
     for (auto& it : recv_streams_) {
-      it.second->SetRtpExtensionsAndRecreateStream(recv_rtp_extensions_);
+      it.second->SetRtpExtensions(recv_rtp_extensions_);
     }
   }
   return true;