FrameBuffer::InsertFrame returns true on successful insertion

This is cleaner than checking the size before and after, as is currently
done in FrameBufferProxy

Bug: webrtc:14168
Change-Id: Iac896ddf7b1b0b8513159451de7cd8a10668a49a
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/265663
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Evan Shrubsole <eshr@webrtc.org>
Reviewed-by: Erik Språng <sprang@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#37222}
diff --git a/api/video/frame_buffer.cc b/api/video/frame_buffer.cc
index 67d5f67..4cdf221 100644
--- a/api/video/frame_buffer.cc
+++ b/api/video/frame_buffer.cc
@@ -67,11 +67,11 @@
       max_size_(max_size),
       decoded_frame_history_(max_decode_history) {}
 
-void FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {
+bool FrameBuffer::InsertFrame(std::unique_ptr<EncodedFrame> frame) {
   if (!ValidReferences(*frame)) {
     RTC_DLOG(LS_WARNING) << "Frame " << frame->Id()
                          << " has invalid references, dropping frame.";
-    return;
+    return false;
   }
 
   if (frame->Id() <= decoded_frame_history_.GetLastDecodedFrameId()) {
@@ -84,7 +84,7 @@
       Clear();
     } else {
       // Already decoded past this frame.
-      return;
+      return false;
     }
   }
 
@@ -95,7 +95,7 @@
       Clear();
     } else {
       // No space for this frame.
-      return;
+      return false;
     }
   }
 
@@ -103,7 +103,7 @@
   auto insert_res = frames_.emplace(frame_id, FrameInfo{std::move(frame)});
   if (!insert_res.second) {
     // Frame has already been inserted.
-    return;
+    return false;
   }
 
   if (frames_.size() == max_size_) {
@@ -113,6 +113,7 @@
 
   PropagateContinuity(insert_res.first);
   FindNextAndLastDecodableTemporalUnit();
+  return true;
 }
 
 absl::InlinedVector<std::unique_ptr<EncodedFrame>, 4>
diff --git a/api/video/frame_buffer.h b/api/video/frame_buffer.h
index 5ab88c5..94edf64 100644
--- a/api/video/frame_buffer.h
+++ b/api/video/frame_buffer.h
@@ -18,7 +18,6 @@
 #include "absl/container/inlined_vector.h"
 #include "absl/types/optional.h"
 #include "api/field_trials_view.h"
-#include "api/units/timestamp.h"
 #include "api/video/encoded_frame.h"
 #include "modules/video_coding/utility/decoded_frames_history.h"
 
@@ -36,7 +35,7 @@
     uint32_t last_rtp_timestamp;
   };
 
-  // The `max_size` determines the maxmimum number of frames the buffer will
+  // The `max_size` determines the maximum number of frames the buffer will
   // store, and max_decode_history determines how far back (by frame ID) the
   // buffer will store if a frame was decoded or not.
   FrameBuffer(int max_size,
@@ -48,8 +47,10 @@
   ~FrameBuffer() = default;
 
   // Inserted frames may only reference backwards, and must have no duplicate
-  // references.
-  void InsertFrame(std::unique_ptr<EncodedFrame> frame);
+  // references. Frame insertion will fail if `frame` is a duplicate, has
+  // already been decoded, invalid, or if the buffer is full and the frame is
+  // not a keyframe. Returns true if the frame was successfully inserted.
+  bool InsertFrame(std::unique_ptr<EncodedFrame> frame);
 
   // Mark all frames belonging to the next decodable temporal unit as decoded
   // and returns them.
diff --git a/api/video/frame_buffer_unittest.cc b/api/video/frame_buffer_unittest.cc
index 41a486f..92e2f67 100644
--- a/api/video/frame_buffer_unittest.cc
+++ b/api/video/frame_buffer_unittest.cc
@@ -13,7 +13,6 @@
 
 #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"
 #include "test/scoped_key_value_config.h"
@@ -35,14 +34,15 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
   // Ref must be less than the id of this frame.
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(0).Id(0).Refs({0}).AsLast().Build());
+  EXPECT_FALSE(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(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(20).Id(2).Refs({1, 1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_FALSE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1, 1}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
 }
 
@@ -53,12 +53,13 @@
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(absl::nullopt));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
+  EXPECT_TRUE(
+      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(2));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
 }
@@ -68,13 +69,14 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(1));
 
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(3));
 }
 
@@ -83,10 +85,11 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build());
+  EXPECT_TRUE(
+      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(2));
 }
 
@@ -95,14 +98,16 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  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_TRUE(
+      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(3).Refs({1}).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(4).Refs({2, 3}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(absl::nullopt));
 
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousTemporalUnitFrameId(), Eq(4));
 }
 
@@ -112,7 +117,8 @@
                      field_trials);
 
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo(), Eq(absl::nullopt));
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
 }
 
@@ -121,10 +127,12 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
@@ -142,11 +150,12 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->last_rtp_timestamp, Eq(10U));
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
@@ -159,10 +168,12 @@
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).AsLast().Build()));
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(20U));
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
   EXPECT_THAT(buffer.DecodableTemporalUnitsInfo()->next_rtp_timestamp, Eq(10U));
 }
 
@@ -170,23 +181,25 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/5, /*max_decode_history=*/10,
                      field_trials);
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({2}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({3}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(50).Id(5).Refs({4}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
 
   // Frame buffer is full
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build());
+  EXPECT_FALSE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(60).Id(6).Refs({5}).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(5));
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(70).Id(7).AsLast().Build()));
   EXPECT_THAT(buffer.LastContinuousFrameId(), Eq(7));
 }
 
@@ -194,11 +207,12 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
 
   buffer.ExtractNextDecodableTemporalUnit();
   buffer.DropNextDecodableTemporalUnit();
@@ -210,19 +224,20 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
 
   buffer.ExtractNextDecodableTemporalUnit();
   buffer.ExtractNextDecodableTemporalUnit();
 
-  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_FALSE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_FALSE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(3)));
 }
@@ -231,15 +246,17 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  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_TRUE(
+      buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(2).Refs({1}).Build()));
+  EXPECT_TRUE(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(
-      test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(4).Refs({3}).AsLast().Build()));
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(4)));
 }
@@ -248,15 +265,16 @@
   test::ScopedKeyValueConfig field_trials;
   FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                      field_trials);
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(30).Id(3).Refs({1}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(50).Id(5).Refs({3}).AsLast().Build()));
 
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(1)));
@@ -269,15 +287,15 @@
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(5)));
 
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(70).Id(7).Refs({5}).AsLast().Build()));
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(7)));
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build());
+  EXPECT_FALSE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(60).Id(6).Refs({4}).AsLast().Build()));
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(90).Id(9).Refs({7}).AsLast().Build()));
   EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
               ElementsAre(FrameWithId(9)));
 }
@@ -289,12 +307,12 @@
     FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                        field_trials);
 
-    buffer.InsertFrame(
-        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
+    EXPECT_TRUE(buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(3)));
-    buffer.InsertFrame(
-        test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build());
+    EXPECT_FALSE(buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(30).Id(2).AsLast().Build()));
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
   }
 
@@ -304,15 +322,15 @@
     FrameBuffer buffer(/*max_frame_slots=*/10, /*max_decode_history=*/100,
                        field_trials);
 
-    buffer.InsertFrame(
-        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build());
+    EXPECT_TRUE(buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(20).Id(3).AsLast().Build()));
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(3)));
-    buffer.InsertFrame(
-        test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build());
+    EXPECT_FALSE(buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(30).Id(2).Refs({1}).AsLast().Build()));
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(), IsEmpty());
-    buffer.InsertFrame(
-        test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build());
+    EXPECT_TRUE(buffer.InsertFrame(
+        test::FakeFrameBuilder().Time(40).Id(1).AsLast().Build()));
     EXPECT_THAT(buffer.ExtractNextDecodableTemporalUnit(),
                 ElementsAre(FrameWithId(1)));
   }
@@ -324,20 +342,23 @@
                      field_trials);
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(0));
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
-  buffer.InsertFrame(test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
-  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_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({2}).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(5).Refs({3, 4}).AsLast().Build()));
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(1));
 
   // Reordered
-  buffer.InsertFrame(
-      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
   EXPECT_THAT(buffer.GetTotalNumberOfContinuousTemporalUnits(), Eq(3));
 }
 
@@ -347,13 +368,16 @@
                      field_trials);
   EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
 
-  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());
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(10).Id(1).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(2).Refs({1}).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(20).Id(3).Refs({2}).AsLast().Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(4).Refs({1}).Build()));
+  EXPECT_TRUE(buffer.InsertFrame(
+      test::FakeFrameBuilder().Time(40).Id(5).Refs({4}).AsLast().Build()));
 
   buffer.ExtractNextDecodableTemporalUnit();
   EXPECT_THAT(buffer.GetTotalNumberOfDroppedFrames(), Eq(0));
diff --git a/video/frame_buffer_proxy.cc b/video/frame_buffer_proxy.cc
index 601e66e..3657fba 100644
--- a/video/frame_buffer_proxy.cc
+++ b/video/frame_buffer_proxy.cc
@@ -252,9 +252,7 @@
     RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
     FrameMetadata metadata(*frame);
     int complete_units = buffer_->GetTotalNumberOfContinuousTemporalUnits();
-    size_t size = buffer_->CurrentSize();
-    buffer_->InsertFrame(std::move(frame));
-    if (size != buffer_->CurrentSize()) {
+    if (buffer_->InsertFrame(std::move(frame))) {
       RTC_DCHECK(metadata.receive_time) << "Frame receive time must be set!";
       if (!metadata.delayed_by_retransmission && metadata.receive_time)
         timing_->IncomingTimestamp(metadata.rtp_timestamp,