Add test::FakeEncodedFrame for testing

Change-Id: I1c8fabe5caf2c723487ec1cd71a379e922026a9d
Bug: webrtc:13996
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260001
Reviewed-by: Erik Språng <sprang@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#36654}
diff --git a/modules/video_coding/BUILD.gn b/modules/video_coding/BUILD.gn
index 96d1704..1d14022 100644
--- a/modules/video_coding/BUILD.gn
+++ b/modules/video_coding/BUILD.gn
@@ -1279,6 +1279,7 @@
       "../../system_wrappers",
       "../../system_wrappers:field_trial",
       "../../system_wrappers:metrics",
+      "../../test:fake_encoded_frame",
       "../../test:fake_video_codecs",
       "../../test:field_trial",
       "../../test:fileutils",
diff --git a/modules/video_coding/frame_buffer3_unittest.cc b/modules/video_coding/frame_buffer3_unittest.cc
index 27a25f2..39fab88 100644
--- a/modules/video_coding/frame_buffer3_unittest.cc
+++ b/modules/video_coding/frame_buffer3_unittest.cc
@@ -12,6 +12,7 @@
 #include <vector>
 
 #include "api/video/encoded_frame.h"
+#include "test/fake_encoded_frame.h"
 #include "test/field_trial.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
@@ -29,67 +30,19 @@
   return Matches(Eq(id))(arg->Id());
 }
 
-class FakeEncodedFrame : public EncodedFrame {
- public:
-  int64_t ReceivedTime() const override { return 0; }
-  int64_t RenderTime() const override { return 0; }
-};
-
-class Builder {
- public:
-  Builder& Time(uint32_t rtp_timestamp) {
-    rtp_timestamp_ = rtp_timestamp;
-    return *this;
-  }
-  Builder& Id(int64_t frame_id) {
-    frame_id_ = frame_id;
-    return *this;
-  }
-  Builder& AsLast() {
-    last_spatial_layer_ = true;
-    return *this;
-  }
-  Builder& Refs(const std::vector<int64_t>& references) {
-    references_ = references;
-    return *this;
-  }
-
-  std::unique_ptr<FakeEncodedFrame> Build() {
-    RTC_CHECK_LE(references_.size(), EncodedFrame::kMaxFrameReferences);
-    RTC_CHECK(rtp_timestamp_.has_value());
-    RTC_CHECK(frame_id_.has_value());
-
-    auto frame = std::make_unique<FakeEncodedFrame>();
-    frame->SetTimestamp(*rtp_timestamp_);
-    frame->SetId(*frame_id_);
-    frame->is_last_spatial_layer = last_spatial_layer_;
-
-    for (int64_t ref : references_) {
-      frame->references[frame->num_references] = ref;
-      frame->num_references++;
-    }
-
-    return frame;
-  }
-
- private:
-  absl::optional<uint32_t> rtp_timestamp_;
-  absl::optional<int64_t> frame_id_;
-  bool last_spatial_layer_ = false;
-  std::vector<int64_t> references_;
-};
-
 TEST(FrameBuffer3Test, RejectInvalidRefs) {
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
   // Ref must be less than the id of this frame.
-  buffer.InsertFrame(Builder().Time(0).Id(0).Refs({0}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(0).Id(0).Refs({0}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
 
   // Duplicate ids are also invalid.
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1, 1}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1, 1}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
 }
 
@@ -100,11 +53,12 @@
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(Builder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(2));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
 }
@@ -114,11 +68,13 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
 
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(3));
 }
 
@@ -127,9 +83,10 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
-  buffer.InsertFrame(Builder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
 }
 
@@ -138,12 +95,14 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).Build());
-  buffer.InsertFrame(Builder().Time(20).Id(3).Refs({1}).Build());
-  buffer.InsertFrame(Builder().Time(20).Id(4).Refs({2, 3}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(3).Refs({1}).Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(4).Refs({2, 3}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(Builder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(4));
 }
 
@@ -154,7 +113,7 @@
 
   EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(),
               Eq(absl::nullopt));
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
   EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
 }
 
@@ -163,9 +122,10 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
   EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
@@ -183,9 +143,11 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
   EXPECT_THAT(buffer.LastDecodableTemporalUnitRtpTimestamp(), Eq(10U));
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
@@ -198,10 +160,10 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(Builder().Time(20).Id(2).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
   EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(20U));
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
   EXPECT_THAT(buffer.NextDecodableTemporalUnitRtpTimestamp(), Eq(10U));
 }
 
@@ -209,18 +171,23 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
                      field_trials);
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({2}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(40).Id(4).Refs({3}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(50).Id(5).Refs({4}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
 
   // Frame buffer is full
-  buffer.InsertFrame(Builder().Time(60).Id(6).Refs({5}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
 
-  buffer.InsertFrame(Builder().Time(70).Id(7).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build());
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
 }
 
@@ -228,9 +195,11 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
 
   buffer.ExtractNextDecodableTemporalUnit();
   buffer.DropNextDecodableTemporalUnit();
@@ -242,15 +211,18 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
 
   buffer.ExtractNextDecodableTemporalUnit();
   buffer.ExtractNextDecodableTemporalUnit();
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(3)));
@@ -260,13 +232,15 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  buffer.InsertFrame(Builder().Time(10).Id(1).Build());
-  buffer.InsertFrame(Builder().Time(10).Id(2).Refs({1}).Build());
-  buffer.InsertFrame(Builder().Time(10).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(3).Refs({2}).AsLast().Build());
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(1), FrameWithId(2), FrameWithId(3)));
 
-  buffer.InsertFrame(Builder().Time(20).Id(4).Refs({3}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build());
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(4)));
 }
@@ -275,11 +249,15 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(30).Id(3).Refs({1}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(40).Id(4).Refs({2}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(50).Id(5).Refs({3}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build());
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(1)));
@@ -292,12 +270,15 @@
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(5)));
 
-  buffer.InsertFrame(Builder().Time(70).Id(7).Refs({5}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build());
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(7)));
-  buffer.InsertFrame(Builder().Time(60).Id(6).Refs({4}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build());
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
-  buffer.InsertFrame(Builder().Time(90).Id(9).Refs({7}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build());
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(9)));
 }
@@ -309,10 +290,12 @@
     FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                        field_trials);
 
-    buffer.InsertFrame(Builder().Time(20).Id(3).AsLast().Build());
+    buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(3)));
-    buffer.InsertFrame(Builder().Time(30).Id(2).AsLast().Build());
+    buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build());
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
   }
 
@@ -322,12 +305,15 @@
     FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                        field_trials);
 
-    buffer.InsertFrame(Builder().Time(20).Id(3).AsLast().Build());
+    buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(3)));
-    buffer.InsertFrame(Builder().Time(30).Id(2).Refs({1}).AsLast().Build());
+    buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build());
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
-    buffer.InsertFrame(Builder().Time(40).Id(1).AsLast().Build());
+    buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build());
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(1)));
   }
@@ -339,18 +325,20 @@
                      field_trials);
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
-  buffer.InsertFrame(Builder().Time(40).Id(4).Refs({2}).Build());
-  buffer.InsertFrame(Builder().Time(40).Id(5).Refs({3, 4}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build());
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
   // Reordered
-  buffer.InsertFrame(Builder().Time(20).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
 }
 
@@ -360,11 +348,13 @@
                      field_trials);
   EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
 
-  buffer.InsertFrame(Builder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(20).Id(2).Refs({1}).Build());
-  buffer.InsertFrame(Builder().Time(20).Id(3).Refs({2}).AsLast().Build());
-  buffer.InsertFrame(Builder().Time(40).Id(4).Refs({1}).Build());
-  buffer.InsertFrame(Builder().Time(40).Id(5).Refs({4}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
+  buffer.InsertFrame(test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build());
+  buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build());
 
   buffer.ExtractNextDecodableTemporalUnit();
   EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
diff --git a/test/BUILD.gn b/test/BUILD.gn
index a958b12..9157a9e 100644
--- a/test/BUILD.gn
+++ b/test/BUILD.gn
@@ -1120,3 +1120,18 @@
     "../rtc_base:rtc_json",
   ]
 }
+
+rtc_library("fake_encoded_frame") {
+  testonly = true
+  sources = [
+    "fake_encoded_frame.cc",
+    "fake_encoded_frame.h",
+  ]
+  deps = [
+    ":test_support",
+    "../api:rtp_packet_info",
+    "../api/video:encoded_frame",
+    "../api/video:video_rtp_headers",
+  ]
+  absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
+}
diff --git a/test/fake_encoded_frame.cc b/test/fake_encoded_frame.cc
new file mode 100644
index 0000000..7a1bd75
--- /dev/null
+++ b/test/fake_encoded_frame.cc
@@ -0,0 +1,135 @@
+/*
+ *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "test/fake_encoded_frame.h"
+
+namespace webrtc::test {
+
+void PrintTo(const EncodedFrame& frame,
+             std::ostream* os) /* no-presubmit-check TODO(webrtc:8982) */ {
+  *os << "EncodedFrame with id=" << frame.Id() << " rtp=" << frame.Timestamp()
+      << " size=" << frame.size() << " refs=[";
+  for (size_t ref = 0; ref < frame.num_references; ++ref) {
+    *os << frame.references[ref] << ",";
+  }
+  *os << "]";
+}
+
+int64_t FakeEncodedFrame::ReceivedTime() const {
+  return received_time_;
+}
+
+int64_t FakeEncodedFrame::RenderTime() const {
+  return _renderTimeMs;
+}
+
+void FakeEncodedFrame::SetReceivedTime(int64_t received_time) {
+  received_time_ = received_time;
+}
+
+void FakeEncodedFrame::SetPayloadType(int payload_type) {
+  _payloadType = payload_type;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::Time(uint32_t rtp_timestamp) {
+  rtp_timestamp_ = rtp_timestamp;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::Id(int64_t frame_id) {
+  frame_id_ = frame_id;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::AsLast() {
+  last_spatial_layer_ = true;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::Refs(
+    const std::vector<int64_t>& references) {
+  references_ = references;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::PlayoutDelay(
+    VideoPlayoutDelay playout_delay) {
+  playout_delay_ = playout_delay;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::SpatialLayer(int spatial_layer) {
+  spatial_layer_ = spatial_layer;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::ReceivedTime(Timestamp receive_time) {
+  received_time_ = receive_time;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::Size(size_t size) {
+  size_ = size;
+  return *this;
+}
+
+std::unique_ptr<FakeEncodedFrame> FakeFrameBuilder::Build() {
+  RTC_CHECK_LE(references_.size(), EncodedFrame::kMaxFrameReferences);
+
+  auto frame = std::make_unique<FakeEncodedFrame>();
+  frame->is_last_spatial_layer = last_spatial_layer_;
+  frame->SetEncodedData(EncodedImageBuffer::Create(size_));
+
+  if (rtp_timestamp_)
+    frame->SetTimestamp(*rtp_timestamp_);
+  if (frame_id_)
+    frame->SetId(*frame_id_);
+  if (playout_delay_)
+    frame->SetPlayoutDelay(*playout_delay_);
+  for (int64_t ref : references_) {
+    frame->references[frame->num_references] = ref;
+    frame->num_references++;
+  }
+  if (spatial_layer_)
+    frame->SetSpatialIndex(spatial_layer_);
+  if (received_time_)
+    frame->SetReceivedTime(received_time_->ms());
+  if (payload_type_)
+    frame->SetPayloadType(*payload_type_);
+  if (ntp_time_)
+    frame->ntp_time_ms_ = ntp_time_->ms();
+  if (rotation_)
+    frame->rotation_ = *rotation_;
+  if (packet_infos_)
+    frame->SetPacketInfos(*packet_infos_);
+  return frame;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::PayloadType(int payload_type) {
+  payload_type_ = payload_type;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::NtpTime(Timestamp ntp_time) {
+  ntp_time_ = ntp_time;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::Rotation(VideoRotation rotation) {
+  rotation_ = rotation;
+  return *this;
+}
+
+FakeFrameBuilder& FakeFrameBuilder::PacketInfos(RtpPacketInfos packet_infos) {
+  packet_infos_ = packet_infos;
+  return *this;
+}
+
+}  // namespace webrtc::test
diff --git a/test/fake_encoded_frame.h b/test/fake_encoded_frame.h
new file mode 100644
index 0000000..6af9a40
--- /dev/null
+++ b/test/fake_encoded_frame.h
@@ -0,0 +1,84 @@
+/*
+ *  Copyright (c) 2022 The WebRTC project authors. All Rights Reserved.
+ *
+ *  Use of this source code is governed by a BSD-style license
+ *  that can be found in the LICENSE file in the root of the source
+ *  tree. An additional intellectual property rights grant can be found
+ *  in the file PATENTS.  All contributing project authors may
+ *  be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef TEST_FAKE_ENCODED_FRAME_H_
+#define TEST_FAKE_ENCODED_FRAME_H_
+
+#include <memory>
+#include <ostream>  // no-presubmit-check TODO(webrtc:8982)
+#include <vector>
+
+#include "api/rtp_packet_infos.h"
+#include "api/video/encoded_frame.h"
+#include "api/video/video_rotation.h"
+#include "test/gmock.h"
+
+namespace webrtc::test {
+
+// For test printing.
+void PrintTo(const EncodedFrame& frame,
+             std::ostream* os);  // no-presubmit-check TODO(webrtc:8982)
+
+class FakeEncodedFrame : public EncodedFrame {
+ public:
+  // Always 10ms delay and on time.
+  int64_t ReceivedTime() const override;
+  int64_t RenderTime() const override;
+
+  // Setters for protected variables.
+  void SetReceivedTime(int64_t received_time);
+  void SetPayloadType(int payload_type);
+
+ private:
+  int64_t received_time_;
+};
+
+MATCHER_P(WithId, id, "") {
+  return ::testing::Matches(::testing::Eq(id))(arg.Id());
+}
+
+MATCHER_P(FrameWithSize, id, "") {
+  return ::testing::Matches(::testing::Eq(id))(arg.size());
+}
+
+class FakeFrameBuilder {
+ public:
+  FakeFrameBuilder& Time(uint32_t rtp_timestamp);
+  FakeFrameBuilder& Id(int64_t frame_id);
+  FakeFrameBuilder& AsLast();
+  FakeFrameBuilder& Refs(const std::vector<int64_t>& references);
+  FakeFrameBuilder& PlayoutDelay(VideoPlayoutDelay playout_delay);
+  FakeFrameBuilder& SpatialLayer(int spatial_layer);
+  FakeFrameBuilder& ReceivedTime(Timestamp receive_time);
+  FakeFrameBuilder& Size(size_t size);
+  FakeFrameBuilder& PayloadType(int payload_type);
+  FakeFrameBuilder& NtpTime(Timestamp ntp_time);
+  FakeFrameBuilder& Rotation(VideoRotation rotation);
+  FakeFrameBuilder& PacketInfos(RtpPacketInfos packet_infos);
+  std::unique_ptr<FakeEncodedFrame> Build();
+
+ private:
+  absl::optional<uint32_t> rtp_timestamp_;
+  absl::optional<int64_t> frame_id_;
+  absl::optional<VideoPlayoutDelay> playout_delay_;
+  absl::optional<int> spatial_layer_;
+  absl::optional<Timestamp> received_time_;
+  absl::optional<int> payload_type_;
+  absl::optional<Timestamp> ntp_time_;
+  absl::optional<VideoRotation> rotation_;
+  absl::optional<RtpPacketInfos> packet_infos_;
+  std::vector<int64_t> references_;
+  bool last_spatial_layer_ = false;
+  size_t size_ = 10;
+};
+
+}  // namespace webrtc::test
+
+#endif  // TEST_FAKE_ENCODED_FRAME_H_
diff --git a/video/BUILD.gn b/video/BUILD.gn
index 0c9c76d..5848403 100644
--- a/video/BUILD.gn
+++ b/video/BUILD.gn
@@ -950,6 +950,7 @@
       "../system_wrappers:metrics",
       "../test:direct_transport",
       "../test:encoder_settings",
+      "../test:fake_encoded_frame",
       "../test:fake_video_codecs",
       "../test:field_trial",
       "../test:fileutils",
@@ -965,7 +966,6 @@
       "../test:video_test_common",
       "../test/time_controller",
       "adaptation:video_adaptation",
-      "//testing/gtest",
     ]
     absl_deps = [
       "//third_party/abseil-cpp/absl/algorithm:container",
diff --git a/video/frame_buffer_proxy_unittest.cc b/video/frame_buffer_proxy_unittest.cc
index d6f97db..6babcda 100644
--- a/video/frame_buffer_proxy_unittest.cc
+++ b/video/frame_buffer_proxy_unittest.cc
@@ -28,6 +28,7 @@
 #include "api/video/video_timing.h"
 #include "rtc_base/checks.h"
 #include "rtc_base/event.h"
+#include "test/fake_encoded_frame.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/run_loop.h"
@@ -51,16 +52,6 @@
 
 namespace webrtc {
 
-// For test printing.
-void PrintTo(const EncodedFrame& frame, std::ostream* os) {
-  *os << "EncodedFrame with id=" << frame.Id() << " rtp=" << frame.Timestamp()
-      << " size=" << frame.size() << " refs=[";
-  for (size_t ref = 0; ref < frame.num_references; ++ref) {
-    *os << frame.references[ref] << ",";
-  }
-  *os << "]";
-}
-
 namespace {
 
 constexpr size_t kFrameSize = 10;
@@ -69,28 +60,6 @@
 const VideoPlayoutDelay kZeroPlayoutDelay = {0, 0};
 constexpr Timestamp kClockStart = Timestamp::Millis(1000);
 
-class FakeEncodedFrame : public EncodedFrame {
- public:
-  // Always 10ms delay and on time.
-  int64_t ReceivedTime() const override { return received_time_; }
-  int64_t RenderTime() const override { return _renderTimeMs; }
-
-  void SetReceivedTime(int64_t received_time) {
-    received_time_ = received_time;
-  }
-
- private:
-  int64_t received_time_;
-};
-
-MATCHER_P(WithId, id, "") {
-  return Matches(Eq(id))(arg.Id());
-}
-
-MATCHER_P(FrameWithSize, id, "") {
-  return Matches(Eq(id))(arg.size());
-}
-
 auto TimedOut() {
   return Optional(VariantWith<TimeDelta>(_));
 }
@@ -99,80 +68,17 @@
   return Optional(VariantWith<std::unique_ptr<EncodedFrame>>(Pointee(m)));
 }
 
-class Builder {
- public:
-  Builder& Time(uint32_t rtp_timestamp) {
-    rtp_timestamp_ = rtp_timestamp;
-    return *this;
+std::unique_ptr<test::FakeEncodedFrame> WithReceiveTimeFromRtpTimestamp(
+    std::unique_ptr<test::FakeEncodedFrame> frame) {
+  if (frame->Timestamp() == 0) {
+    frame->SetReceivedTime(kClockStart.ms());
+  } else {
+    frame->SetReceivedTime(
+        TimeDelta::Seconds(frame->Timestamp() / 90000.0).ms() +
+        kClockStart.ms());
   }
-  Builder& Id(int64_t frame_id) {
-    frame_id_ = frame_id;
-    return *this;
-  }
-  Builder& AsLast() {
-    last_spatial_layer_ = true;
-    return *this;
-  }
-  Builder& Refs(const std::vector<int64_t>& references) {
-    references_ = references;
-    return *this;
-  }
-  Builder& PlayoutDelay(VideoPlayoutDelay playout_delay) {
-    playout_delay_ = playout_delay;
-    return *this;
-  }
-  Builder& SpatialLayer(int spatial_layer) {
-    spatial_layer_ = spatial_layer;
-    return *this;
-  }
-  Builder& ReceivedTime(Timestamp receive_time) {
-    received_time_ = receive_time;
-    return *this;
-  }
-
-  std::unique_ptr<FakeEncodedFrame> Build() {
-    RTC_CHECK_LE(references_.size(), EncodedFrame::kMaxFrameReferences);
-    RTC_CHECK(rtp_timestamp_);
-    RTC_CHECK(frame_id_);
-
-    auto frame = std::make_unique<FakeEncodedFrame>();
-    frame->SetTimestamp(*rtp_timestamp_);
-    frame->SetId(*frame_id_);
-    frame->is_last_spatial_layer = last_spatial_layer_;
-    frame->SetEncodedData(EncodedImageBuffer::Create(kFrameSize));
-
-    if (playout_delay_)
-      frame->SetPlayoutDelay(*playout_delay_);
-
-    for (int64_t ref : references_) {
-      frame->references[frame->num_references] = ref;
-      frame->num_references++;
-    }
-    if (spatial_layer_) {
-      frame->SetSpatialIndex(spatial_layer_);
-    }
-    if (received_time_) {
-      frame->SetReceivedTime(received_time_->ms());
-    } else {
-      if (*rtp_timestamp_ == 0)
-        frame->SetReceivedTime(kClockStart.ms());
-      frame->SetReceivedTime(
-          TimeDelta::Seconds(*rtp_timestamp_ / 90000.0).ms() +
-          kClockStart.ms());
-    }
-
-    return frame;
-  }
-
- private:
-  absl::optional<uint32_t> rtp_timestamp_;
-  absl::optional<int64_t> frame_id_;
-  absl::optional<VideoPlayoutDelay> playout_delay_;
-  absl::optional<int> spatial_layer_;
-  absl::optional<Timestamp> received_time_;
-  bool last_spatial_layer_ = false;
-  std::vector<int64_t> references_;
-};
+  return frame;
+}
 
 class VCMReceiveStatisticsCallbackMock : public VCMReceiveStatisticsCallback {
  public:
@@ -349,19 +255,20 @@
   StartNextDecodeForceKeyframe();
   time_controller_.AdvanceTime(TimeDelta::Millis(50));
 
-  auto frame = Builder().Id(0).Time(0).AsLast().Build();
+  auto frame = test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build();
   proxy_->InsertFrame(std::move(frame));
 
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 }
 
 TEST_P(FrameBufferProxyTest, DeltaFrameTimeoutAfterKeyframeExtracted) {
   StartNextDecodeForceKeyframe();
 
   time_controller_.AdvanceTime(TimeDelta::Millis(50));
-  auto frame = Builder().Id(0).Time(0).AsLast().Build();
+  auto frame = test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build();
   proxy_->InsertFrame(std::move(frame));
-  EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForKeyframe), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForKeyframe),
+              Frame(test::WithId(0)));
 
   StartNextDecode();
   time_controller_.AdvanceTime(TimeDelta::Millis(50));
@@ -376,44 +283,64 @@
 
 TEST_P(FrameBufferProxyTest, DependantFramesAreScheduled) {
   StartNextDecodeForceKeyframe();
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   StartNextDecode();
 
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).AsLast().Refs({0}).Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(1)));
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(1)));
 }
 
 TEST_P(FrameBufferProxyTest, SpatialLayersAreScheduled) {
   StartNextDecodeForceKeyframe();
-  proxy_->InsertFrame(Builder().Id(0).SpatialLayer(0).Time(0).Build());
-  proxy_->InsertFrame(Builder().Id(1).SpatialLayer(1).Time(0).Build());
-  proxy_->InsertFrame(Builder().Id(2).SpatialLayer(2).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()),
-              Frame(AllOf(WithId(0), FrameWithSize(3 * kFrameSize))));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(0).SpatialLayer(0).Time(0).Build()));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(1).SpatialLayer(1).Time(0).Build()));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(2).SpatialLayer(2).Time(0).AsLast().Build()));
+  EXPECT_THAT(
+      WaitForFrameOrTimeout(TimeDelta::Zero()),
+      Frame(AllOf(test::WithId(0), test::FrameWithSize(3 * kFrameSize))));
 
-  proxy_->InsertFrame(Builder().Id(3).Time(kFps30Rtp).SpatialLayer(0).Build());
-  proxy_->InsertFrame(Builder().Id(4).Time(kFps30Rtp).SpatialLayer(1).Build());
-  proxy_->InsertFrame(
-      Builder().Id(5).Time(kFps30Rtp).SpatialLayer(2).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(3).Time(kFps30Rtp).SpatialLayer(0).Build()));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(4).Time(kFps30Rtp).SpatialLayer(1).Build()));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(test::FakeFrameBuilder()
+                                                          .Id(5)
+                                                          .Time(kFps30Rtp)
+                                                          .SpatialLayer(2)
+                                                          .AsLast()
+                                                          .Build()));
 
   StartNextDecode();
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay * 10),
-              Frame(AllOf(WithId(3), FrameWithSize(3 * kFrameSize))));
+  EXPECT_THAT(
+      WaitForFrameOrTimeout(kFps30Delay * 10),
+      Frame(AllOf(test::WithId(3), test::FrameWithSize(3 * kFrameSize))));
 }
 
 TEST_P(FrameBufferProxyTest, OutstandingFrameTasksAreCancelledAfterDeletion) {
   StartNextDecodeForceKeyframe();
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build()));
   // Get keyframe. Delta frame should now be scheduled.
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   StartNextDecode();
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).AsLast().Refs({0}).Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(test::FakeFrameBuilder()
+                                                          .Id(1)
+                                                          .Time(kFps30Rtp)
+                                                          .AsLast()
+                                                          .Refs({0})
+                                                          .Build()));
   proxy_->StopOnWorker();
   // Wait for 2x max wait time. Since we stopped, this should cause no timeouts
   // or frame-ready callbacks.
@@ -424,20 +351,24 @@
   StartNextDecodeForceKeyframe();
 
   // Start with a keyframe.
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   ResetLastResult();
   // Insert a delta frame.
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).AsLast().Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
 
   // Advancing time should not result in a frame since the scheduler has not
   // been signalled that we are ready.
   EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Eq(absl::nullopt));
   // Signal ready.
   StartNextDecode();
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(1)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(1)));
 }
 
 TEST_P(FrameBufferProxyTest, LateFrameDropped) {
@@ -445,22 +376,30 @@
   //   F1
   //   /
   // F0 --> F2
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
   // Start with a keyframe.
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   StartNextDecode();
 
   // Simulate late F1 which arrives after F2.
   time_controller_.AdvanceTime(kFps30Delay * 2);
-  proxy_->InsertFrame(
-      Builder().Id(2).Time(2 * kFps30Rtp).AsLast().Refs({0}).Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(2)));
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(2)
+                          .Time(2 * kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(2)));
 
   StartNextDecode();
 
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(1 * kFps30Rtp).AsLast().Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(1 * kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
   // Confirm frame 1 is never scheduled by timing out.
   EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForFrame), TimedOut());
 }
@@ -470,40 +409,53 @@
   //   F1
   //   /
   // F0 --> F2
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
 
   // Start with a keyframe.
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).AsLast().Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(
-      Builder().Id(2).Time(2 * kFps30Rtp).AsLast().Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(2)
+                          .Time(2 * kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
 
   // Halting time should result in F1 being skipped.
   time_controller_.AdvanceTime(kFps30Delay * 2);
   StartNextDecode();
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(2)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(2)));
   EXPECT_EQ(dropped_frames(), 1);
 }
 
 TEST_P(FrameBufferProxyTest, ForceKeyFrame) {
   StartNextDecodeForceKeyframe();
   // Initial keyframe.
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   StartNextDecodeForceKeyframe();
 
   // F2 is the next keyframe, and should be extracted since a keyframe was
   // forced.
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(kFps30Rtp)
+                          .AsLast()
+                          .Refs({0})
+                          .Build());
   proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).AsLast().Refs({0}).Build());
-  proxy_->InsertFrame(Builder().Id(2).Time(kFps30Rtp * 2).AsLast().Build());
+      test::FakeFrameBuilder().Id(2).Time(kFps30Rtp * 2).AsLast().Build());
 
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay * 3), Frame(WithId(2)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay * 3), Frame(test::WithId(2)));
 }
 
 TEST_P(FrameBufferProxyTest, SlowDecoderDropsTemporalLayers) {
@@ -513,40 +465,60 @@
   //   F1 --> F3 --> F5
   //   /      /     /
   // F0 --> F2 --> F4
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
   // Keyframe received.
   // Don't start next decode until slow delay.
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(1 * kFps30Rtp).Refs({0}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(1)
+                          .Time(1 * kFps30Rtp)
+                          .Refs({0})
+                          .AsLast()
+                          .Build());
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(
-      Builder().Id(2).Time(2 * kFps30Rtp).Refs({0}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(2)
+                          .Time(2 * kFps30Rtp)
+                          .Refs({0})
+                          .AsLast()
+                          .Build());
 
   // Simulate decode taking 3x FPS rate.
   time_controller_.AdvanceTime(kFps30Delay * 1.5);
   StartNextDecode();
   // F2 is the best frame since decoding was so slow that F1 is too old.
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay * 2), Frame(WithId(2)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay * 2), Frame(test::WithId(2)));
   EXPECT_EQ(dropped_frames(), 1);
   time_controller_.AdvanceTime(kFps30Delay / 2);
 
-  proxy_->InsertFrame(
-      Builder().Id(3).Time(3 * kFps30Rtp).Refs({1, 2}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(3)
+                          .Time(3 * kFps30Rtp)
+                          .Refs({1, 2})
+                          .AsLast()
+                          .Build());
   time_controller_.AdvanceTime(kFps30Delay / 2);
-  proxy_->InsertFrame(
-      Builder().Id(4).Time(4 * kFps30Rtp).Refs({2}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(4)
+                          .Time(4 * kFps30Rtp)
+                          .Refs({2})
+                          .AsLast()
+                          .Build());
   time_controller_.AdvanceTime(kFps30Delay / 2);
 
   // F4 is the best frame since decoding was so slow that F1 is too old.
   time_controller_.AdvanceTime(kFps30Delay);
   StartNextDecode();
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(4)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(4)));
 
-  proxy_->InsertFrame(
-      Builder().Id(5).Time(5 * kFps30Rtp).Refs({3, 4}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder()
+                          .Id(5)
+                          .Time(5 * kFps30Rtp)
+                          .Refs({3, 4})
+                          .AsLast()
+                          .Build());
   time_controller_.AdvanceTime(kFps30Delay / 2);
 
   // F5 is not decodable since F4 was decoded, so a timeout is expected.
@@ -563,20 +535,29 @@
 TEST_P(FrameBufferProxyTest, NewFrameInsertedWhileWaitingToReleaseFrame) {
   StartNextDecodeForceKeyframe();
   // Initial keyframe.
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build()));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   time_controller_.AdvanceTime(kFps30Delay / 2);
-  proxy_->InsertFrame(
-      Builder().Id(1).Time(kFps30Rtp).Refs({0}).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(test::FakeFrameBuilder()
+                                                          .Id(1)
+                                                          .Time(kFps30Rtp)
+                                                          .Refs({0})
+                                                          .AsLast()
+                                                          .Build()));
   StartNextDecode();
   EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Eq(absl::nullopt));
 
   // Scheduler is waiting to deliver Frame 1 now. Insert Frame 2. Frame 1 should
   // be delivered still.
-  proxy_->InsertFrame(
-      Builder().Id(2).Time(kFps30Rtp * 2).Refs({0}).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(1)));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(test::FakeFrameBuilder()
+                                                          .Id(2)
+                                                          .Time(kFps30Rtp * 2)
+                                                          .Refs({0})
+                                                          .AsLast()
+                                                          .Build()));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(1)));
 }
 
 TEST_P(FrameBufferProxyTest, SameFrameNotScheduledTwice) {
@@ -592,34 +573,40 @@
   StartNextDecodeForceKeyframe();
 
   // First keyframe.
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Millis(15)), Frame(WithId(0)));
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build()));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Millis(15)),
+              Frame(test::WithId(0)));
 
   StartNextDecode();
 
   // Warmup VCMTiming for 30fps.
   for (int i = 1; i <= 30; ++i) {
-    proxy_->InsertFrame(Builder().Id(i).Time(i * kFps30Rtp).AsLast().Build());
-    EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(i)));
+    proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+        test::FakeFrameBuilder().Id(i).Time(i * kFps30Rtp).AsLast().Build()));
+    EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(i)));
     StartNextDecode();
   }
 
   // F2 arrives and is scheduled.
-  proxy_->InsertFrame(Builder().Id(32).Time(32 * kFps30Rtp).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(32).Time(32 * kFps30Rtp).AsLast().Build()));
 
   // F3 arrives before F2 is extracted.
   time_controller_.AdvanceTime(kFps30Delay);
-  proxy_->InsertFrame(Builder().Id(33).Time(33 * kFps30Rtp).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(33).Time(33 * kFps30Rtp).AsLast().Build()));
 
   // F1 arrives and is fast-forwarded since it is too late.
   // F2 is already scheduled and should not be rescheduled.
   time_controller_.AdvanceTime(kFps30Delay / 2);
-  proxy_->InsertFrame(Builder().Id(31).Time(31 * kFps30Rtp).AsLast().Build());
+  proxy_->InsertFrame(WithReceiveTimeFromRtpTimestamp(
+      test::FakeFrameBuilder().Id(31).Time(31 * kFps30Rtp).AsLast().Build()));
 
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(32)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(32)));
   StartNextDecode();
 
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(33)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(33)));
   StartNextDecode();
   EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForFrame), TimedOut());
   EXPECT_EQ(dropped_frames(), 1);
@@ -633,8 +620,8 @@
   // Fake timing having received decoded frame.
   timing_.StopDecodeTimer(TimeDelta::Millis(1), clock_->CurrentTime());
   StartNextDecodeForceKeyframe();
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   // Flush stats posted on the decode queue.
   time_controller_.AdvanceTime(TimeDelta::Zero());
@@ -646,8 +633,8 @@
       .Times(1);
 
   StartNextDecodeForceKeyframe();
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
-  proxy_->InsertFrame(Builder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build());
   // Flush stats posted on the decode queue.
   time_controller_.AdvanceTime(TimeDelta::Zero());
 }
@@ -658,8 +645,8 @@
   // `OnCompleteFrame` should not be called for the first two frames since they
   // do not complete the temporal layer.
   EXPECT_CALL(stats_callback_, OnCompleteFrame(_, _, _)).Times(0);
-  proxy_->InsertFrame(Builder().Id(0).Time(0).Build());
-  proxy_->InsertFrame(Builder().Id(1).Time(0).Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(1).Time(0).Refs({0}).Build());
   time_controller_.AdvanceTime(TimeDelta::Zero());
   // Flush stats posted on the decode queue.
   ::testing::Mock::VerifyAndClearExpectations(&stats_callback_);
@@ -669,7 +656,8 @@
   EXPECT_CALL(stats_callback_,
               OnCompleteFrame(false, kFrameSize, VideoContentType::UNSPECIFIED))
       .Times(1);
-  proxy_->InsertFrame(Builder().Id(2).Time(0).Refs({0, 1}).AsLast().Build());
+  proxy_->InsertFrame(
+      test::FakeFrameBuilder().Id(2).Time(0).Refs({0, 1}).AsLast().Build());
   // Flush stats posted on the decode queue.
   time_controller_.AdvanceTime(TimeDelta::Zero());
 }
@@ -684,8 +672,9 @@
   // do not complete the temporal layer. Frame 1 arrives later, at which time
   // this frame can finally be considered complete.
   EXPECT_CALL(stats_callback_, OnCompleteFrame(_, _, _)).Times(0);
-  proxy_->InsertFrame(Builder().Id(0).Time(0).Build());
-  proxy_->InsertFrame(Builder().Id(2).Time(0).Refs({0, 1}).AsLast().Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(0).Time(0).Build());
+  proxy_->InsertFrame(
+      test::FakeFrameBuilder().Id(2).Time(0).Refs({0, 1}).AsLast().Build());
   time_controller_.AdvanceTime(TimeDelta::Zero());
   // Flush stats posted on the decode queue.
   ::testing::Mock::VerifyAndClearExpectations(&stats_callback_);
@@ -693,7 +682,7 @@
   EXPECT_CALL(stats_callback_,
               OnCompleteFrame(false, kFrameSize, VideoContentType::UNSPECIFIED))
       .Times(1);
-  proxy_->InsertFrame(Builder().Id(1).Time(0).Refs({0}).Build());
+  proxy_->InsertFrame(test::FakeFrameBuilder().Id(1).Time(0).Refs({0}).Build());
   // Flush stats posted on the decode queue.
   time_controller_.AdvanceTime(TimeDelta::Zero());
 }
@@ -711,23 +700,23 @@
   // First keyframe. The receive time must be explicitly set in this test since
   // the RTP derived time used in all tests does not work when the long pause
   // happens later in the test.
-  proxy_->InsertFrame(Builder()
+  proxy_->InsertFrame(test::FakeFrameBuilder()
                           .Id(0)
                           .Time(kBaseRtp)
                           .ReceivedTime(clock_->CurrentTime())
                           .AsLast()
                           .Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(0)));
 
   // 1 more frame to warmup VCMTiming for 30fps.
   StartNextDecode();
-  proxy_->InsertFrame(Builder()
+  proxy_->InsertFrame(test::FakeFrameBuilder()
                           .Id(1)
                           .Time(kBaseRtp + kFps30Rtp)
                           .ReceivedTime(clock_->CurrentTime())
                           .AsLast()
                           .Build());
-  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(1)));
+  EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(1)));
 
   // Pause the stream for such a long time it incurs an RTP timestamp rollover
   // by over half.
@@ -746,7 +735,7 @@
   EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForFrame), Eq(absl::nullopt));
   time_controller_.AdvanceTime(kRolloverDelay - kMaxWaitForFrame);
   StartNextDecode();
-  proxy_->InsertFrame(Builder()
+  proxy_->InsertFrame(test::FakeFrameBuilder()
                           .Id(2)
                           .Time(kRolloverRtp)
                           .ReceivedTime(clock_->CurrentTime())
@@ -754,7 +743,7 @@
                           .Build());
   // FrameBuffer2 drops the frame, while FrameBuffer3 will continue the stream.
   if (!IsFrameBuffer2Enabled(field_trials_)) {
-    EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(WithId(2)));
+    EXPECT_THAT(WaitForFrameOrTimeout(kFps30Delay), Frame(test::WithId(2)));
   } else {
     EXPECT_THAT(WaitForFrameOrTimeout(kMaxWaitForFrame), TimedOut());
   }
@@ -776,22 +765,22 @@
   StartNextDecodeForceKeyframe();
   timing_.set_min_playout_delay(TimeDelta::Zero());
   timing_.set_max_playout_delay(TimeDelta::Millis(10));
-  auto frame = Builder().Id(0).Time(0).AsLast().Build();
+  auto frame = test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build();
   // Playout delay of 0 implies low-latency rendering.
   frame->SetPlayoutDelay({0, 10});
   proxy_->InsertFrame(std::move(frame));
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   // Delta frame would normally wait here, but should decode at the pacing rate
   // in low-latency mode.
   StartNextDecode();
-  frame = Builder().Id(1).Time(kFps30Rtp).AsLast().Build();
+  frame = test::FakeFrameBuilder().Id(1).Time(kFps30Rtp).AsLast().Build();
   frame->SetPlayoutDelay({0, 10});
   proxy_->InsertFrame(std::move(frame));
   // Pacing is set to 16ms in the field trial so we should not decode yet.
   EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Eq(absl::nullopt));
   time_controller_.AdvanceTime(TimeDelta::Millis(16));
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(1)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(1)));
 }
 
 TEST_P(LowLatencyFrameBufferProxyTest, ZeroPlayoutDelayFullQueue) {
@@ -799,15 +788,16 @@
   StartNextDecodeForceKeyframe();
   timing_.set_min_playout_delay(TimeDelta::Zero());
   timing_.set_max_playout_delay(TimeDelta::Millis(10));
-  auto frame = Builder().Id(0).Time(0).AsLast().Build();
+  auto frame = test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build();
   // Playout delay of 0 implies low-latency rendering.
   frame->SetPlayoutDelay({0, 10});
   proxy_->InsertFrame(std::move(frame));
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   // Queue up 5 frames (configured max queue size for 0-playout delay pacing).
   for (int id = 1; id <= 6; ++id) {
-    frame = Builder().Id(id).Time(kFps30Rtp * id).AsLast().Build();
+    frame =
+        test::FakeFrameBuilder().Id(id).Time(kFps30Rtp * id).AsLast().Build();
     frame->SetPlayoutDelay({0, 10});
     proxy_->InsertFrame(std::move(frame));
   }
@@ -815,7 +805,7 @@
   // The queue is at its max size for zero playout delay pacing, so the pacing
   // should be ignored and the next frame should be decoded instantly.
   StartNextDecode();
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(1)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(1)));
 }
 
 TEST_P(LowLatencyFrameBufferProxyTest, MinMaxDelayZeroLowLatencyMode) {
@@ -823,21 +813,21 @@
   StartNextDecodeForceKeyframe();
   timing_.set_min_playout_delay(TimeDelta::Zero());
   timing_.set_max_playout_delay(TimeDelta::Zero());
-  auto frame = Builder().Id(0).Time(0).AsLast().Build();
+  auto frame = test::FakeFrameBuilder().Id(0).Time(0).AsLast().Build();
   // Playout delay of 0 implies low-latency rendering.
   frame->SetPlayoutDelay({0, 0});
   proxy_->InsertFrame(std::move(frame));
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(0)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(0)));
 
   // Delta frame would normally wait here, but should decode at the pacing rate
   // in low-latency mode.
   StartNextDecode();
-  frame = Builder().Id(1).Time(kFps30Rtp).AsLast().Build();
+  frame = test::FakeFrameBuilder().Id(1).Time(kFps30Rtp).AsLast().Build();
   frame->SetPlayoutDelay({0, 0});
   proxy_->InsertFrame(std::move(frame));
   // The min/max=0 version of low-latency rendering will result in a large
   // negative decode wait time, so the frame should be ready right away.
-  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(WithId(1)));
+  EXPECT_THAT(WaitForFrameOrTimeout(TimeDelta::Zero()), Frame(test::WithId(1)));
 }
 
 INSTANTIATE_TEST_SUITE_P(
diff --git a/video/video_receive_stream2_unittest.cc b/video/video_receive_stream2_unittest.cc
index 4111e8e..317a322 100644
--- a/video/video_receive_stream2_unittest.cc
+++ b/video/video_receive_stream2_unittest.cc
@@ -34,6 +34,7 @@
 #include "rtc_base/event.h"
 #include "system_wrappers/include/clock.h"
 #include "test/fake_decoder.h"
+#include "test/fake_encoded_frame.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/mock_transport.h"
@@ -59,19 +60,6 @@
 
 constexpr int kDefaultTimeOutMs = 50;
 
-class FrameObjectFake : public EncodedFrame {
- public:
-  void SetPayloadType(uint8_t payload_type) { _payloadType = payload_type; }
-
-  void SetRotation(const VideoRotation& rotation) { rotation_ = rotation; }
-
-  void SetNtpTime(int64_t ntp_time_ms) { ntp_time_ms_ = ntp_time_ms; }
-
-  int64_t ReceivedTime() const override { return 0; }
-
-  int64_t RenderTime() const override { return _renderTimeMs; }
-};
-
 }  // namespace
 
 class VideoReceiveStream2Test : public ::testing::Test {
@@ -159,8 +147,8 @@
 
 TEST_F(VideoReceiveStream2Test, PlayoutDelay) {
   const VideoPlayoutDelay kPlayoutDelayMs = {123, 321};
-  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
-  test_frame->SetId(0);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame =
+      test::FakeFrameBuilder().Id(0).AsLast().Build();
   test_frame->SetPlayoutDelay(kPlayoutDelayMs);
 
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
@@ -196,8 +184,8 @@
       timing_->GetTimings().max_playout_delay;
   const VideoPlayoutDelay kPlayoutDelayMs = {123, -1};
 
-  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
-  test_frame->SetId(0);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame =
+      test::FakeFrameBuilder().Id(0).AsLast().Build();
   test_frame->SetPlayoutDelay(kPlayoutDelayMs);
 
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
@@ -214,8 +202,8 @@
       timing_->GetTimings().min_playout_delay;
   const VideoPlayoutDelay kPlayoutDelayMs = {-1, 321};
 
-  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
-  test_frame->SetId(0);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame =
+      test::FakeFrameBuilder().Id(0).AsLast().Build();
   test_frame->SetPlayoutDelay(kPlayoutDelayMs);
 
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
@@ -229,21 +217,21 @@
 
 TEST_F(VideoReceiveStream2Test, MaxCompositionDelayNotSetByDefault) {
   // Default with no playout delay set.
-  std::unique_ptr<FrameObjectFake> test_frame0(new FrameObjectFake());
-  test_frame0->SetId(0);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame0 =
+      test::FakeFrameBuilder().Id(0).AsLast().Build();
   video_receive_stream_->OnCompleteFrame(std::move(test_frame0));
   EXPECT_FALSE(timing_->MaxCompositionDelayInFrames());
 
   // Max composition delay not set for playout delay 0,0.
-  std::unique_ptr<FrameObjectFake> test_frame1(new FrameObjectFake());
-  test_frame1->SetId(1);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame1 =
+      test::FakeFrameBuilder().Id(1).AsLast().Build();
   test_frame1->SetPlayoutDelay({0, 0});
   video_receive_stream_->OnCompleteFrame(std::move(test_frame1));
   EXPECT_FALSE(timing_->MaxCompositionDelayInFrames());
 
   // Max composition delay not set for playout delay X,Y, where X,Y>0.
-  std::unique_ptr<FrameObjectFake> test_frame2(new FrameObjectFake());
-  test_frame2->SetId(2);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame2 =
+      test::FakeFrameBuilder().Id(2).AsLast().Build();
   test_frame2->SetPlayoutDelay({10, 30});
   video_receive_stream_->OnCompleteFrame(std::move(test_frame2));
   EXPECT_FALSE(timing_->MaxCompositionDelayInFrames());
@@ -253,8 +241,8 @@
   // Max composition delay set if playout delay X,Y, where X=0,Y>0.
   const VideoPlayoutDelay kPlayoutDelayMs = {0, 50};
   const int kExpectedMaxCompositionDelayInFrames = 3;  // ~50 ms at 60 fps.
-  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
-  test_frame->SetId(0);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame =
+      test::FakeFrameBuilder().Id(0).AsLast().Build();
   test_frame->SetPlayoutDelay(kPlayoutDelayMs);
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
   EXPECT_EQ(kExpectedMaxCompositionDelayInFrames,
@@ -321,24 +309,29 @@
 };
 
 TEST_F(VideoReceiveStream2TestWithFakeDecoder, PassesNtpTime) {
-  const int64_t kNtpTimestamp = 12345;
-  auto test_frame = std::make_unique<FrameObjectFake>();
-  test_frame->SetPayloadType(99);
-  test_frame->SetId(0);
-  test_frame->SetNtpTime(kNtpTimestamp);
+  const Timestamp kNtpTimestamp = Timestamp::Millis(12345);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame =
+      test::FakeFrameBuilder()
+          .Id(0)
+          .PayloadType(99)
+          .NtpTime(kNtpTimestamp)
+          .AsLast()
+          .Build();
 
   video_receive_stream_->Start();
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
   EXPECT_TRUE(fake_renderer_.WaitForRenderedFrame(kDefaultTimeOutMs));
-  EXPECT_EQ(kNtpTimestamp, fake_renderer_.ntp_time_ms());
+  EXPECT_EQ(kNtpTimestamp.ms(), fake_renderer_.ntp_time_ms());
 }
 
 TEST_F(VideoReceiveStream2TestWithFakeDecoder, PassesRotation) {
   const webrtc::VideoRotation kRotation = webrtc::kVideoRotation_180;
-  auto test_frame = std::make_unique<FrameObjectFake>();
-  test_frame->SetPayloadType(99);
-  test_frame->SetId(0);
-  test_frame->SetRotation(kRotation);
+  std::unique_ptr<test::FakeEncodedFrame> test_frame = test::FakeFrameBuilder()
+                                                           .Id(0)
+                                                           .PayloadType(99)
+                                                           .Rotation(kRotation)
+                                                           .AsLast()
+                                                           .Build();
 
   video_receive_stream_->Start();
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
@@ -348,11 +341,13 @@
 }
 
 TEST_F(VideoReceiveStream2TestWithFakeDecoder, PassesPacketInfos) {
-  auto test_frame = std::make_unique<FrameObjectFake>();
-  test_frame->SetPayloadType(99);
-  test_frame->SetId(0);
   RtpPacketInfos packet_infos = CreatePacketInfos(3);
-  test_frame->SetPacketInfos(packet_infos);
+  auto test_frame = test::FakeFrameBuilder()
+                        .Id(0)
+                        .PayloadType(99)
+                        .PacketInfos(packet_infos)
+                        .AsLast()
+                        .Build();
 
   video_receive_stream_->Start();
   video_receive_stream_->OnCompleteFrame(std::move(test_frame));
@@ -367,9 +362,8 @@
   constexpr uint32_t kRtpTimestamp = 12345;
 
   // Prepare one video frame with per-packet information.
-  auto test_frame = std::make_unique<FrameObjectFake>();
-  test_frame->SetPayloadType(99);
-  test_frame->SetId(0);
+  auto test_frame =
+      test::FakeFrameBuilder().Id(0).PayloadType(99).AsLast().Build();
   RtpPacketInfos packet_infos;
   {
     RtpPacketInfos::vector_type infos;
@@ -439,22 +433,21 @@
   }
 }
 
-std::unique_ptr<FrameObjectFake> MakeFrameWithResolution(
+std::unique_ptr<test::FakeEncodedFrame> MakeFrameWithResolution(
     VideoFrameType frame_type,
     int picture_id,
     int width,
     int height) {
-  auto frame = std::make_unique<FrameObjectFake>();
-  frame->SetPayloadType(99);
-  frame->SetId(picture_id);
+  auto frame =
+      test::FakeFrameBuilder().Id(picture_id).PayloadType(99).AsLast().Build();
   frame->SetFrameType(frame_type);
   frame->_encodedWidth = width;
   frame->_encodedHeight = height;
   return frame;
 }
 
-std::unique_ptr<FrameObjectFake> MakeFrame(VideoFrameType frame_type,
-                                           int picture_id) {
+std::unique_ptr<test::FakeEncodedFrame> MakeFrame(VideoFrameType frame_type,
+                                                  int picture_id) {
   return MakeFrameWithResolution(frame_type, picture_id, 320, 240);
 }
 
diff --git a/video/video_stream_decoder_impl_unittest.cc b/video/video_stream_decoder_impl_unittest.cc
index dd11e8c..d0cf925 100644
--- a/video/video_stream_decoder_impl_unittest.cc
+++ b/video/video_stream_decoder_impl_unittest.cc
@@ -14,6 +14,7 @@
 
 #include "api/video/i420_buffer.h"
 #include "api/video_codecs/video_decoder.h"
+#include "test/fake_encoded_frame.h"
 #include "test/gmock.h"
 #include "test/gtest.h"
 #include "test/scoped_key_value_config.h"
@@ -22,7 +23,6 @@
 namespace webrtc {
 namespace {
 using ::testing::_;
-using ::testing::ByMove;
 using ::testing::NiceMock;
 using ::testing::Return;
 
@@ -127,35 +127,6 @@
   NiceMock<StubVideoDecoder> av1_decoder_;
 };
 
-class FakeEncodedFrame : public EncodedFrame {
- public:
-  int64_t ReceivedTime() const override { return 0; }
-  int64_t RenderTime() const override { return 0; }
-
-  // Setters for protected variables.
-  void SetPayloadType(int payload_type) { _payloadType = payload_type; }
-};
-
-class FrameBuilder {
- public:
-  FrameBuilder() : frame_(std::make_unique<FakeEncodedFrame>()) {}
-
-  FrameBuilder& WithPayloadType(int payload_type) {
-    frame_->SetPayloadType(payload_type);
-    return *this;
-  }
-
-  FrameBuilder& WithPictureId(int picture_id) {
-    frame_->SetId(picture_id);
-    return *this;
-  }
-
-  std::unique_ptr<FakeEncodedFrame> Build() { return std::move(frame_); }
-
- private:
-  std::unique_ptr<FakeEncodedFrame> frame_;
-};
-
 class VideoStreamDecoderImplTest : public ::testing::Test {
  public:
   VideoStreamDecoderImplTest()
@@ -179,7 +150,8 @@
 };
 
 TEST_F(VideoStreamDecoderImplTest, InsertAndDecodeFrame) {
-  video_stream_decoder_.OnFrame(FrameBuilder().WithPayloadType(1).Build());
+  video_stream_decoder_.OnFrame(
+      test::FakeFrameBuilder().PayloadType(1).AsLast().Build());
   EXPECT_CALL(callbacks_, OnDecodedFrame);
   time_controller_.AdvanceTime(TimeDelta::Millis(1));
 }
@@ -190,7 +162,8 @@
 }
 
 TEST_F(VideoStreamDecoderImplTest, NonDecodableStateWaitingForDeltaFrame) {
-  video_stream_decoder_.OnFrame(FrameBuilder().WithPayloadType(1).Build());
+  video_stream_decoder_.OnFrame(
+      test::FakeFrameBuilder().PayloadType(1).AsLast().Build());
   EXPECT_CALL(callbacks_, OnDecodedFrame);
   time_controller_.AdvanceTime(TimeDelta::Millis(1));
   EXPECT_CALL(callbacks_, OnNonDecodableState);
@@ -198,7 +171,8 @@
 }
 
 TEST_F(VideoStreamDecoderImplTest, InsertAndDecodeFrameWithKeyframeRequest) {
-  video_stream_decoder_.OnFrame(FrameBuilder().WithPayloadType(1).Build());
+  video_stream_decoder_.OnFrame(
+      test::FakeFrameBuilder().PayloadType(1).AsLast().Build());
   EXPECT_CALL(decoder_factory_.Vp8Decoder(), DecodeCall)
       .WillOnce(Return(WEBRTC_VIDEO_CODEC_OK_REQUEST_KEYFRAME));
   EXPECT_CALL(callbacks_, OnDecodedFrame);
@@ -207,7 +181,12 @@
 }
 
 TEST_F(VideoStreamDecoderImplTest, FailToInitDecoder) {
-  video_stream_decoder_.OnFrame(FrameBuilder().WithPayloadType(1).Build());
+  video_stream_decoder_.OnFrame(
+      test::FakeFrameBuilder()
+          .ReceivedTime(time_controller_.GetClock()->CurrentTime())
+          .PayloadType(1)
+          .AsLast()
+          .Build());
   ON_CALL(decoder_factory_.Vp8Decoder(), Configure)
       .WillByDefault(Return(false));
   EXPECT_CALL(callbacks_, OnNonDecodableState);
@@ -215,7 +194,8 @@
 }
 
 TEST_F(VideoStreamDecoderImplTest, FailToDecodeFrame) {
-  video_stream_decoder_.OnFrame(FrameBuilder().WithPayloadType(1).Build());
+  video_stream_decoder_.OnFrame(
+      test::FakeFrameBuilder().PayloadType(1).AsLast().Build());
   ON_CALL(decoder_factory_.Vp8Decoder(), DecodeCall)
       .WillByDefault(Return(WEBRTC_VIDEO_CODEC_ERROR));
   EXPECT_CALL(callbacks_, OnNonDecodableState);
@@ -225,13 +205,13 @@
 TEST_F(VideoStreamDecoderImplTest, ChangeFramePayloadType) {
   constexpr TimeDelta kFrameInterval = TimeDelta::Millis(1000 / 60);
   video_stream_decoder_.OnFrame(
-      FrameBuilder().WithPayloadType(1).WithPictureId(0).Build());
+      test::FakeFrameBuilder().PayloadType(1).Id(0).AsLast().Build());
   EXPECT_CALL(decoder_factory_.Vp8Decoder(), DecodeCall);
   EXPECT_CALL(callbacks_, OnDecodedFrame);
   time_controller_.AdvanceTime(kFrameInterval);
 
   video_stream_decoder_.OnFrame(
-      FrameBuilder().WithPayloadType(2).WithPictureId(1).Build());
+      test::FakeFrameBuilder().PayloadType(2).Id(1).AsLast().Build());
   EXPECT_CALL(decoder_factory_.Av1Decoder(), DecodeCall);
   EXPECT_CALL(callbacks_, OnDecodedFrame);
   time_controller_.AdvanceTime(kFrameInterval);