Fix race in CallPerfTest.Bitrate_Kbps_PadsToMinTransmitBitrate

Task posted by OnSendRtp might be scheduled after `send_stream_` is
destroyed. Fix by using a PendingTaskSafetyFlag, killed from the
OnStreamsStopped callback.

Bug: webrtc:12726
Change-Id: I935917a3d80e82c3536261d72059448fb7aac00d
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/228643
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Niels Moller <nisse@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#34754}
diff --git a/call/BUILD.gn b/call/BUILD.gn
index d542f4b..fc8fd34 100644
--- a/call/BUILD.gn
+++ b/call/BUILD.gn
@@ -535,9 +535,9 @@
         "../rtc_base:checks",
         "../rtc_base:rtc_base_approved",
         "../rtc_base:task_queue_for_test",
-        "../rtc_base:task_queue_for_test",
         "../rtc_base:threading",
         "../rtc_base/synchronization:mutex",
+        "../rtc_base/task_utils:pending_task_safety_flag",
         "../rtc_base/task_utils:repeating_task",
         "../system_wrappers",
         "../system_wrappers:metrics",
diff --git a/call/call_perf_tests.cc b/call/call_perf_tests.cc
index 71bd490..9596323 100644
--- a/call/call_perf_tests.cc
+++ b/call/call_perf_tests.cc
@@ -31,6 +31,7 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/synchronization/mutex.h"
 #include "rtc_base/task_queue_for_test.h"
+#include "rtc_base/task_utils/pending_task_safety_flag.h"
 #include "rtc_base/thread.h"
 #include "rtc_base/thread_annotations.h"
 #include "system_wrappers/include/metrics.h"
@@ -668,12 +669,13 @@
                                       : (kMaxEncodeBitrateKbps +
                                          kAcceptableBitrateErrorMargin / 2)),
           num_bitrate_observations_in_range_(0),
-          task_queue_(task_queue) {}
+          task_queue_(task_queue),
+          task_safety_flag_(PendingTaskSafetyFlag::CreateDetached()) {}
 
    private:
     // TODO(holmer): Run this with a timer instead of once per packet.
     Action OnSendRtp(const uint8_t* packet, size_t length) override {
-      task_queue_->PostTask(ToQueuedTask([this]() {
+      task_queue_->PostTask(ToQueuedTask(task_safety_flag_, [this]() {
         VideoSendStream::Stats stats = send_stream_->GetStats();
 
         if (!stats.substreams.empty()) {
@@ -701,6 +703,8 @@
       send_stream_ = send_stream;
     }
 
+    void OnStreamsStopped() override { task_safety_flag_->SetNotAlive(); }
+
     void ModifyVideoConfigs(
         VideoSendStream::Config* send_config,
         std::vector<VideoReceiveStream::Config>* receive_configs,
@@ -729,6 +733,7 @@
     int num_bitrate_observations_in_range_;
     std::vector<double> bitrate_kbps_list_;
     TaskQueueBase* task_queue_;
+    rtc::scoped_refptr<PendingTaskSafetyFlag> task_safety_flag_;
   } test(pad_to_min_bitrate, task_queue());
 
   fake_encoder_max_bitrate_ = kMaxEncodeBitrateKbps;