Check IsRunning() in VideoSendStreamImpl::SignalEncoderActive

Ensure VideoSendStreamImpl does not register allocation on stray encoded
image if there is no active encodings.

Bug: chromium:41497180
Change-Id: I32afd7cc71f154dff240934e2be1745d8ead127c
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/338920
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Per Kjellander <perkj@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#41708}
diff --git a/video/video_send_stream_impl.cc b/video/video_send_stream_impl.cc
index 8c748dd..ec63b51 100644
--- a/video/video_send_stream_impl.cc
+++ b/video/video_send_stream_impl.cc
@@ -522,6 +522,7 @@
   RTC_DCHECK_RUN_ON(&thread_checker_);
   RTC_LOG(LS_INFO) << "~VideoSendStreamImpl: " << config_.ToString();
   RTC_DCHECK(!started());
+  RTC_DCHECK(!IsRunning());
   transport_->DestroyRtpVideoSender(rtp_video_sender_);
 }
 
@@ -764,7 +765,7 @@
 
 void VideoSendStreamImpl::SignalEncoderActive() {
   RTC_DCHECK_RUN_ON(&thread_checker_);
-  if (rtp_video_sender_->IsActive()) {
+  if (IsRunning()) {
     RTC_LOG(LS_INFO) << "SignalEncoderActive, Encoder is active.";
     bitrate_allocator_->AddObserver(this, GetAllocationConfig());
   }
diff --git a/video/video_send_stream_impl_unittest.cc b/video/video_send_stream_impl_unittest.cc
index fe5f999..f6b43cb 100644
--- a/video/video_send_stream_impl_unittest.cc
+++ b/video/video_send_stream_impl_unittest.cc
@@ -70,6 +70,7 @@
 namespace {
 using ::testing::_;
 using ::testing::AllOf;
+using ::testing::AnyNumber;
 using ::testing::Field;
 using ::testing::Invoke;
 using ::testing::Mock;
@@ -271,6 +272,56 @@
   vss_impl->Stop();
 }
 
+TEST_F(VideoSendStreamImplTest,
+       DoNotRegistersAsBitrateObserverOnStrayEncodedImage) {
+  auto vss_impl = CreateVideoSendStreamImpl(TestVideoEncoderConfig());
+
+  EncodedImage encoded_image;
+  CodecSpecificInfo codec_specific;
+  ON_CALL(rtp_video_sender_, OnEncodedImage)
+      .WillByDefault(Return(
+          EncodedImageCallback::Result(EncodedImageCallback::Result::OK)));
+
+  EXPECT_CALL(bitrate_allocator_, AddObserver(vss_impl.get(), _))
+      .Times(AnyNumber());
+  vss_impl->Start();
+  time_controller_.AdvanceTime(TimeDelta::Zero());
+
+  // VideoSendStreamImpl gets an allocated bitrate.
+  const uint32_t kBitrateBps = 100000;
+  EXPECT_CALL(rtp_video_sender_, GetPayloadBitrateBps())
+      .Times(1)
+      .WillOnce(Return(kBitrateBps));
+  static_cast<BitrateAllocatorObserver*>(vss_impl.get())
+      ->OnBitrateUpdated(CreateAllocation(kBitrateBps));
+  // A frame is encoded.
+  encoder_queue_->PostTask([&] {
+    static_cast<EncodedImageCallback*>(vss_impl.get())
+        ->OnEncodedImage(encoded_image, &codec_specific);
+  });
+
+  // Expect allocation to be removed if encoder stop producing frames.
+  EXPECT_CALL(bitrate_allocator_, RemoveObserver(vss_impl.get())).Times(1);
+  time_controller_.AdvanceTime(TimeDelta::Seconds(5));
+  Mock::VerifyAndClearExpectations(&bitrate_allocator_);
+
+  EXPECT_CALL(bitrate_allocator_, AddObserver(vss_impl.get(), _)).Times(0);
+
+  VideoEncoderConfig no_active_encodings = TestVideoEncoderConfig();
+  no_active_encodings.simulcast_layers[0].active = false;
+  vss_impl->ReconfigureVideoEncoder(std::move(no_active_encodings));
+
+  // Expect that allocation in not resumed if a stray encoded image is received.
+  encoder_queue_->PostTask([&] {
+    static_cast<EncodedImageCallback*>(vss_impl.get())
+        ->OnEncodedImage(encoded_image, &codec_specific);
+  });
+
+  time_controller_.AdvanceTime(TimeDelta::Zero());
+
+  vss_impl->Stop();
+}
+
 TEST_F(VideoSendStreamImplTest, UpdatesObserverOnConfigurationChange) {
   const bool kSuspend = false;
   config_.suspend_below_min_bitrate = kSuspend;