Remove DCHECK on setting audio rcvr encoded transform twice

Failing a DCHECK on a ChannelReceiver having its encoded transform set
more than once contradicts the comment above - this can happen when
reconfiguring a channel, eg as in the web platform test
webrtc/recvonly-transceiver-can-become-sendrecv.https.html.

It was added after the original code by a different author, and indeed
the video side doesn't have such a check.

Bug: chromium:1502781
Change-Id: Id36e52601da34ebc194ff058e4672046379f576e
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/328560
Commit-Queue: Tony Herre <herre@google.com>
Auto-Submit: Tony Herre <herre@google.com>
Commit-Queue: Harald Alvestrand <hta@webrtc.org>
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41246}
diff --git a/audio/BUILD.gn b/audio/BUILD.gn
index ec09e5a..bbc294b 100644
--- a/audio/BUILD.gn
+++ b/audio/BUILD.gn
@@ -241,6 +241,7 @@
       "../rtc_base:logging",
       "../rtc_base:threading",
       "../test:audio_codec_mocks",
+      "../test:mock_frame_transformer",
       "../test:mock_transport",
       "../test:test_support",
       "../test/time_controller",
diff --git a/audio/channel_receive.cc b/audio/channel_receive.cc
index efd9668..8367b00 100644
--- a/audio/channel_receive.cc
+++ b/audio/channel_receive.cc
@@ -925,12 +925,19 @@
 void ChannelReceive::SetDepacketizerToDecoderFrameTransformer(
     rtc::scoped_refptr<webrtc::FrameTransformerInterface> frame_transformer) {
   RTC_DCHECK_RUN_ON(&worker_thread_checker_);
-  // Depending on when the channel is created, the transformer might be set
-  // twice. Don't replace the delegate if it was already initialized.
-  if (!frame_transformer || frame_transformer_delegate_) {
+  if (!frame_transformer) {
     RTC_DCHECK_NOTREACHED() << "Not setting the transformer?";
     return;
   }
+  if (frame_transformer_delegate_) {
+    // Depending on when the channel is created, the transformer might be set
+    // twice. Don't replace the delegate if it was already initialized.
+    // TODO(crbug.com/webrtc/15674): Prevent multiple calls during
+    // reconfiguration.
+    RTC_CHECK_EQ(frame_transformer_delegate_->FrameTransformer(),
+                 frame_transformer);
+    return;
+  }
 
   InitFrameTransformerDelegate(std::move(frame_transformer));
 }
diff --git a/audio/channel_receive_frame_transformer_delegate.cc b/audio/channel_receive_frame_transformer_delegate.cc
index 3cad530..8a7dda8 100644
--- a/audio/channel_receive_frame_transformer_delegate.cc
+++ b/audio/channel_receive_frame_transformer_delegate.cc
@@ -157,4 +157,11 @@
   // originally from this receiver.
   receive_frame_callback_(frame->GetData(), header);
 }
+
+rtc::scoped_refptr<FrameTransformerInterface>
+ChannelReceiveFrameTransformerDelegate::FrameTransformer() {
+  RTC_DCHECK_RUN_ON(&sequence_checker_);
+  return frame_transformer_;
+}
+
 }  // namespace webrtc
diff --git a/audio/channel_receive_frame_transformer_delegate.h b/audio/channel_receive_frame_transformer_delegate.h
index ac7cef0..37ff75c 100644
--- a/audio/channel_receive_frame_transformer_delegate.h
+++ b/audio/channel_receive_frame_transformer_delegate.h
@@ -62,6 +62,8 @@
   // `channel_receive_thread_`, by calling `receive_frame_callback_`.
   void ReceiveFrame(std::unique_ptr<TransformableFrameInterface> frame) const;
 
+  rtc::scoped_refptr<FrameTransformerInterface> FrameTransformer();
+
  protected:
   ~ChannelReceiveFrameTransformerDelegate() override = default;
 
diff --git a/audio/channel_receive_unittest.cc b/audio/channel_receive_unittest.cc
index 4b7b7c0..aab8a95 100644
--- a/audio/channel_receive_unittest.cc
+++ b/audio/channel_receive_unittest.cc
@@ -29,6 +29,7 @@
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mock_audio_decoder_factory.h"
+#include "test/mock_frame_transformer.h"
 #include "test/mock_transport.h"
 #include "test/time_controller/simulated_time_controller.h"
 
@@ -226,6 +227,41 @@
   EXPECT_NE(ProbeCaptureStartNtpTime(*channel), -1);
 }
 
+TEST_F(ChannelReceiveTest, SettingFrameTransformer) {
+  auto channel = CreateTestChannelReceive();
+
+  rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
+      rtc::make_ref_counted<MockFrameTransformer>();
+
+  EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback);
+  channel->SetDepacketizerToDecoderFrameTransformer(mock_frame_transformer);
+
+  // Must start playout, otherwise packet is discarded.
+  channel->StartPlayout();
+
+  RtpPacketReceived packet = CreateRtpPacket();
+
+  // Receive one RTP packet, this should be transformed.
+  EXPECT_CALL(*mock_frame_transformer, Transform);
+  channel->OnRtpPacket(packet);
+}
+
+TEST_F(ChannelReceiveTest, SettingFrameTransformerMultipleTimes) {
+  auto channel = CreateTestChannelReceive();
+
+  rtc::scoped_refptr<MockFrameTransformer> mock_frame_transformer =
+      rtc::make_ref_counted<MockFrameTransformer>();
+
+  EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback);
+  channel->SetDepacketizerToDecoderFrameTransformer(mock_frame_transformer);
+
+  // Set the same transformer again, shouldn't cause any additional callback
+  // registration calls.
+  EXPECT_CALL(*mock_frame_transformer, RegisterTransformedFrameCallback)
+      .Times(0);
+  channel->SetDepacketizerToDecoderFrameTransformer(mock_frame_transformer);
+}
+
 }  // namespace
 }  // namespace voe
 }  // namespace webrtc