Ensure render time is zero when playout delay is zero so that minimal latency in the render pipeline is ensured.

Bug: webrtc:9135
Change-Id: Id9ae8ec59536808ba8923c73dd46abfe3fa6fe79
Reviewed-on: https://webrtc-review.googlesource.com/75600
Commit-Queue: Stefan Holmer <stefan@webrtc.org>
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#23309}
diff --git a/modules/video_coding/frame_buffer2_unittest.cc b/modules/video_coding/frame_buffer2_unittest.cc
index 84682fd..304910a 100644
--- a/modules/video_coding/frame_buffer2_unittest.cc
+++ b/modules/video_coding/frame_buffer2_unittest.cc
@@ -133,7 +133,10 @@
       : clock_(0),
         timing_(&clock_),
         jitter_estimator_(&clock_),
-        buffer_(&clock_, &jitter_estimator_, &timing_, &stats_callback_),
+        buffer_(new FrameBuffer(&clock_,
+                                &jitter_estimator_,
+                                &timing_,
+                                &stats_callback_)),
         rand_(0x34678213),
         tear_down_(false),
         extract_thread_(&ExtractLoop, this, "Extract Thread"),
@@ -168,7 +171,7 @@
     for (size_t r = 0; r < references.size(); ++r)
       frame->references[r] = references[r];
 
-    return buffer_.InsertFrame(std::move(frame));
+    return buffer_->InsertFrame(std::move(frame));
   }
 
   void ExtractFrame(int64_t max_wait_time = 0, bool keyframe_required = false) {
@@ -176,7 +179,7 @@
     if (max_wait_time == 0) {
       std::unique_ptr<EncodedFrame> frame;
       FrameBuffer::ReturnReason res =
-          buffer_.NextFrame(0, &frame, keyframe_required);
+          buffer_->NextFrame(0, &frame, keyframe_required);
       if (res != FrameBuffer::ReturnReason::kStopped)
         frames_.emplace_back(std::move(frame));
       crit_.Leave();
@@ -215,7 +218,7 @@
 
         std::unique_ptr<EncodedFrame> frame;
         FrameBuffer::ReturnReason res =
-            tfb->buffer_.NextFrame(tfb->max_wait_time_, &frame);
+            tfb->buffer_->NextFrame(tfb->max_wait_time_, &frame);
         if (res != FrameBuffer::ReturnReason::kStopped)
           tfb->frames_.emplace_back(std::move(frame));
       }
@@ -227,7 +230,7 @@
   SimulatedClock clock_;
   VCMTimingFake timing_;
   ::testing::NiceMock<VCMJitterEstimatorMock> jitter_estimator_;
-  FrameBuffer buffer_;
+  std::unique_ptr<FrameBuffer> buffer_;
   std::vector<std::unique_ptr<EncodedFrame>> frames_;
   Random rand_;
   ::testing::NiceMock<VCMReceiveStatisticsCallbackMock> stats_callback_;
@@ -271,11 +274,25 @@
   std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
   test_frame->id.picture_id = 0;
   test_frame->SetPlayoutDelay(kPlayoutDelayMs);
-  buffer_.InsertFrame(std::move(test_frame));
+  buffer_->InsertFrame(std::move(test_frame));
   EXPECT_EQ(kPlayoutDelayMs.min_ms, timing_.min_playout_delay());
   EXPECT_EQ(kPlayoutDelayMs.max_ms, timing_.max_playout_delay());
 }
 
+TEST_F(TestFrameBuffer2, ZeroPlayoutDelay) {
+  VCMTiming timing(&clock_);
+  buffer_.reset(
+      new FrameBuffer(&clock_, &jitter_estimator_, &timing, &stats_callback_));
+  const PlayoutDelay kPlayoutDelayMs = {0, 0};
+  std::unique_ptr<FrameObjectFake> test_frame(new FrameObjectFake());
+  test_frame->id.picture_id = 0;
+  test_frame->SetPlayoutDelay(kPlayoutDelayMs);
+  buffer_->InsertFrame(std::move(test_frame));
+  ExtractFrame(0, false);
+  CheckFrame(0, 0, 0);
+  EXPECT_EQ(0, frames_[0]->RenderTimeMs());
+}
+
 // Flaky test, see bugs.webrtc.org/7068.
 TEST_F(TestFrameBuffer2, DISABLED_OneUnorderedSuperFrame) {
   uint16_t pid = Rand();
@@ -433,7 +450,7 @@
   InsertFrame(pid, 0, ts, false);
   ExtractFrame();
 
-  buffer_.SetProtectionMode(kProtectionNackFEC);
+  buffer_->SetProtectionMode(kProtectionNackFEC);
   EXPECT_CALL(jitter_estimator_, GetJitterEstimate(0.0));
   InsertFrame(pid + 1, 0, ts, false);
   ExtractFrame();
@@ -507,7 +524,7 @@
     frame->num_references = 0;
     frame->inter_layer_predicted = false;
 
-    EXPECT_EQ(buffer_.InsertFrame(std::move(frame)), pid);
+    EXPECT_EQ(buffer_->InsertFrame(std::move(frame)), pid);
   }
 
   ExtractFrame();