Remove WebRTC-FrameBuffer3 field trial

The new frame buffer is already the default. Sync decoding can now be
inferred by the presence of a metronome rather than using the field
trial.

Tests have been updated to use the DecodeSynchronizer rather than the
field trial.

Bug: webrtc:14003
Change-Id: I33b457feaf4eac1500f3bf828680e445ae4d93cf
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/274163
Auto-Submit: Evan Shrubsole <eshr@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38011}
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 8033802..7c14b8f 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -55,6 +55,7 @@
   deps = [
     ":frame_cadence_adapter",
     ":frame_dumping_decoder",
+    ":task_queue_frame_decode_scheduler",
     ":unique_timestamp_counter",
     ":video_stream_buffer_controller",
     ":video_stream_encoder_impl",
@@ -239,6 +240,7 @@
   ]
   deps = [
     ":decode_synchronizer",
+    ":frame_decode_scheduler",
     ":frame_decode_timing",
     ":task_queue_frame_decode_scheduler",
     ":video_receive_stream_timeout_tracker",
diff --git a/video/video_receive_stream2.cc b/video/video_receive_stream2.cc
index 0c2ab0f..647f4e5 100644
--- a/video/video_receive_stream2.cc
+++ b/video/video_receive_stream2.cc
@@ -54,6 +54,7 @@
 #include "video/call_stats2.h"
 #include "video/frame_dumping_decoder.h"
 #include "video/receive_statistics_proxy2.h"
+#include "video/task_queue_frame_decode_scheduler.h"
 
 namespace webrtc {
 
@@ -227,7 +228,6 @@
           TimeDelta::Millis(config_.rtp.nack.rtp_history_ms),
           false)),
       maximum_pre_stream_decoders_("max", kDefaultMaximumPreStreamDecoders),
-      decode_sync_(decode_sync),
       decode_queue_(task_queue_factory_->CreateTaskQueue(
           "DecodingQueue",
           TaskQueueFactory::Priority::HIGH)) {
@@ -251,9 +251,13 @@
 
   timing_->set_render_delay(TimeDelta::Millis(config_.render_delay_ms));
 
-  buffer_ = VideoStreamBufferController::CreateFromFieldTrial(
+  std::unique_ptr<FrameDecodeScheduler> scheduler =
+      decode_sync ? decode_sync->CreateSynchronizedFrameScheduler()
+                  : std::make_unique<TaskQueueFrameDecodeScheduler>(
+                        clock, call_->worker_thread());
+  buffer_ = std::make_unique<VideoStreamBufferController>(
       clock_, call_->worker_thread(), timing_.get(), &stats_proxy_, this,
-      max_wait_for_keyframe_, max_wait_for_frame_, decode_sync_,
+      max_wait_for_keyframe_, max_wait_for_frame_, std::move(scheduler),
       call_->trials());
 
   if (rtx_ssrc()) {
diff --git a/video/video_receive_stream2.h b/video/video_receive_stream2.h
index 9d4cac7..6b3d1ce 100644
--- a/video/video_receive_stream2.h
+++ b/video/video_receive_stream2.h
@@ -339,8 +339,6 @@
   // any video frame has been received.
   FieldTrialParameter<int> maximum_pre_stream_decoders_;
 
-  DecodeSynchronizer* decode_sync_;
-
   // Defined last so they are destroyed before all other members.
   rtc::TaskQueue decode_queue_;
 
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc
index 0a587fc..79c680f 100644
--- a/video/video_receive_stream2_unittest.cc
+++ b/video/video_receive_stream2_unittest.cc
@@ -203,12 +203,6 @@
                      &fake_metronome_,
                      time_controller_.GetMainThread()),
         h264_decoder_factory_(&mock_decoder_) {
-    if (UseMetronome()) {
-      fake_call_.SetFieldTrial("WebRTC-FrameBuffer3/arm:SyncDecoding/");
-    } else {
-      fake_call_.SetFieldTrial("WebRTC-FrameBuffer3/arm:FrameBuffer3/");
-    }
-
     // By default, mock decoder factory is backed by VideoDecoderProxyFactory.
     ON_CALL(mock_h264_decoder_factory_, CreateVideoDecoder)
         .WillByDefault(
@@ -270,7 +264,7 @@
             time_controller_.GetTaskQueueFactory(), &fake_call_,
             kDefaultNumCpuCores, &packet_router_, config_.Copy(), &call_stats_,
             clock_, absl::WrapUnique(timing_), &nack_periodic_processor_,
-            GetParam() ? &decode_sync_ : nullptr, nullptr);
+            UseMetronome() ? &decode_sync_ : nullptr, nullptr);
     video_receive_stream_->RegisterWithTransport(
         &rtp_stream_receiver_controller_);
     if (state)
diff --git a/video/video_stream_buffer_controller.cc b/video/video_stream_buffer_controller.cc
index 037754d..801b91c 100644
--- a/video/video_stream_buffer_controller.cc
+++ b/video/video_stream_buffer_controller.cc
@@ -28,6 +28,7 @@
 #include "rtc_base/checks.h"
 #include "rtc_base/logging.h"
 #include "rtc_base/thread_annotations.h"
+#include "video/frame_decode_scheduler.h"
 #include "video/frame_decode_timing.h"
 #include "video/task_queue_frame_decode_scheduler.h"
 #include "video/video_receive_stream_timeout_tracker.h"
@@ -70,68 +71,8 @@
   return *ts;
 }
 
-enum class FrameBufferArm {
-  kFrameBuffer3,
-  kSyncDecode,
-};
-
-constexpr const char* kFrameBufferFieldTrial = "WebRTC-FrameBuffer3";
-
-FrameBufferArm ParseFrameBufferFieldTrial(const FieldTrialsView& field_trials) {
-  webrtc::FieldTrialEnum<FrameBufferArm> arm(
-      "arm", FrameBufferArm::kFrameBuffer3,
-      {
-          {"FrameBuffer3", FrameBufferArm::kFrameBuffer3},
-          {"SyncDecoding", FrameBufferArm::kSyncDecode},
-      });
-  ParseFieldTrial({&arm}, field_trials.Lookup(kFrameBufferFieldTrial));
-  return arm.Get();
-}
-
 }  // namespace
 
-std::unique_ptr<VideoStreamBufferController>
-VideoStreamBufferController::CreateFromFieldTrial(
-    Clock* clock,
-    TaskQueueBase* worker_queue,
-    VCMTiming* timing,
-    VCMReceiveStatisticsCallback* stats_proxy,
-    FrameSchedulingReceiver* receiver,
-    TimeDelta max_wait_for_keyframe,
-    TimeDelta max_wait_for_frame,
-    DecodeSynchronizer* decode_sync,
-    const FieldTrialsView& field_trials) {
-  switch (ParseFrameBufferFieldTrial(field_trials)) {
-    case FrameBufferArm::kSyncDecode: {
-      std::unique_ptr<FrameDecodeScheduler> scheduler;
-      if (decode_sync) {
-        scheduler = decode_sync->CreateSynchronizedFrameScheduler();
-      } else {
-        RTC_LOG(LS_ERROR) << "In FrameBuffer with sync decode trial, but "
-                             "no DecodeSynchronizer was present!";
-        // Crash in debug, but in production use the task queue scheduler.
-        RTC_DCHECK_NOTREACHED();
-        scheduler = std::make_unique<TaskQueueFrameDecodeScheduler>(
-            clock, worker_queue);
-      }
-      return std::make_unique<VideoStreamBufferController>(
-          clock, worker_queue, timing, stats_proxy, receiver,
-          max_wait_for_keyframe, max_wait_for_frame, std::move(scheduler),
-          field_trials);
-    }
-    case FrameBufferArm::kFrameBuffer3:
-      ABSL_FALLTHROUGH_INTENDED;
-    default: {
-      auto scheduler =
-          std::make_unique<TaskQueueFrameDecodeScheduler>(clock, worker_queue);
-      return std::make_unique<VideoStreamBufferController>(
-          clock, worker_queue, timing, stats_proxy, receiver,
-          max_wait_for_keyframe, max_wait_for_frame, std::move(scheduler),
-          field_trials);
-    }
-  }
-}
-
 VideoStreamBufferController::VideoStreamBufferController(
     Clock* clock,
     TaskQueueBase* worker_queue,
diff --git a/video/video_stream_buffer_controller.h b/video/video_stream_buffer_controller.h
index 5251545..ed79b0f 100644
--- a/video/video_stream_buffer_controller.h
+++ b/video/video_stream_buffer_controller.h
@@ -38,17 +38,6 @@
 
 class VideoStreamBufferController {
  public:
-  static std::unique_ptr<VideoStreamBufferController> CreateFromFieldTrial(
-      Clock* clock,
-      TaskQueueBase* worker_queue,
-      VCMTiming* timing,
-      VCMReceiveStatisticsCallback* stats_proxy,
-      FrameSchedulingReceiver* receiver,
-      TimeDelta max_wait_for_keyframe,
-      TimeDelta max_wait_for_frame,
-      DecodeSynchronizer* decode_sync,
-      const FieldTrialsView& field_trials);
-  virtual ~VideoStreamBufferController() = default;
   VideoStreamBufferController(
       Clock* clock,
       TaskQueueBase* worker_queue,
@@ -59,6 +48,7 @@
       TimeDelta max_wait_for_frame,
       std::unique_ptr<FrameDecodeScheduler> frame_decode_scheduler,
       const FieldTrialsView& field_trials);
+  virtual ~VideoStreamBufferController() = default;
 
   void Stop();
   void SetProtectionMode(VCMVideoProtection protection_mode);
diff --git a/video/video_stream_buffer_controller_unittest.cc b/video/video_stream_buffer_controller_unittest.cc
index 7f7d8db..9c627ca 100644
--- a/video/video_stream_buffer_controller_unittest.cc
+++ b/video/video_stream_buffer_controller_unittest.cc
@@ -15,6 +15,7 @@
 #include <limits>
 #include <memory>
 #include <string>
+#include <tuple>
 #include <utility>
 #include <vector>
 
@@ -33,6 +34,7 @@
 #include "test/scoped_key_value_config.h"
 #include "test/time_controller/simulated_time_controller.h"
 #include "video/decode_synchronizer.h"
+#include "video/task_queue_frame_decode_scheduler.h"
 
 using ::testing::_;
 using ::testing::AllOf;
@@ -107,11 +109,12 @@
 constexpr auto kMaxWaitForKeyframe = TimeDelta::Millis(500);
 constexpr auto kMaxWaitForFrame = TimeDelta::Millis(1500);
 class VideoStreamBufferControllerFixture
-    : public ::testing::WithParamInterface<std::string>,
+    : public ::testing::WithParamInterface<std::tuple<bool, std::string>>,
       public FrameSchedulingReceiver {
  public:
   VideoStreamBufferControllerFixture()
-      : field_trials_(GetParam()),
+      : sync_decoding_(std::get<0>(GetParam())),
+        field_trials_(std::get<1>(GetParam())),
         time_controller_(kClockStart),
         clock_(time_controller_.GetClock()),
         fake_metronome_(time_controller_.GetTaskQueueFactory(),
@@ -120,7 +123,7 @@
                      &fake_metronome_,
                      time_controller_.GetMainThread()),
         timing_(clock_, field_trials_),
-        buffer_(VideoStreamBufferController::CreateFromFieldTrial(
+        buffer_(std::make_unique<VideoStreamBufferController>(
             clock_,
             time_controller_.GetMainThread(),
             &timing_,
@@ -128,7 +131,10 @@
             this,
             kMaxWaitForKeyframe,
             kMaxWaitForFrame,
-            &decode_sync_,
+            sync_decoding_ ? decode_sync_.CreateSynchronizedFrameScheduler()
+                           : std::make_unique<TaskQueueFrameDecodeScheduler>(
+                                 clock_,
+                                 time_controller_.GetMainThread()),
             field_trials_)) {
     // Avoid starting with negative render times.
     timing_.set_min_playout_delay(TimeDelta::Millis(10));
@@ -198,6 +204,7 @@
   int dropped_frames() const { return dropped_frames_; }
 
  protected:
+  const bool sync_decoding_;
   test::ScopedKeyValueConfig field_trials_;
   GlobalSimulatedTimeController time_controller_;
   Clock* const clock_;
@@ -732,11 +739,14 @@
   EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(2)));
 }
 
-INSTANTIATE_TEST_SUITE_P(
-    VideoStreamBufferController,
-    VideoStreamBufferControllerTest,
-    ::testing::Values("WebRTC-FrameBuffer3/arm:FrameBuffer3/",
-                      "WebRTC-FrameBuffer3/arm:SyncDecoding/"));
+INSTANTIATE_TEST_SUITE_P(VideoStreamBufferController,
+                         VideoStreamBufferControllerTest,
+                         ::testing::Combine(::testing::Bool(),
+                                            ::testing::Values("")),
+                         [](const auto& info) {
+                           return std::get<0>(info.param) ? "SyncDecoding"
+                                                          : "UnsyncedDecoding";
+                         });
 
 class LowLatencyVideoStreamBufferControllerTest
     : public ::testing::Test,
@@ -817,10 +827,11 @@
 INSTANTIATE_TEST_SUITE_P(
     VideoStreamBufferController,
     LowLatencyVideoStreamBufferControllerTest,
-    ::testing::Values(
-        "WebRTC-FrameBuffer3/arm:FrameBuffer3/"
-        "WebRTC-ZeroPlayoutDelay/min_pacing:16ms,max_decode_queue_size:5/",
-        "WebRTC-FrameBuffer3/arm:SyncDecoding/"
-        "WebRTC-ZeroPlayoutDelay/min_pacing:16ms,max_decode_queue_size:5/"));
+    ::testing::Combine(
+        ::testing::Bool(),
+        ::testing::Values(
+            "WebRTC-ZeroPlayoutDelay/min_pacing:16ms,max_decode_queue_size:5/",
+            "WebRTC-ZeroPlayoutDelay/"
+            "min_pacing:16ms,max_decode_queue_size:5/")));
 
 }  // namespace webrtc