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();