Index: media/renderers/video_renderer_impl_unittest.cc |
diff --git a/media/renderers/video_renderer_impl_unittest.cc b/media/renderers/video_renderer_impl_unittest.cc |
index 18a0f77dfcf9b0170beb4f5b417514645ecfadca..aac5c1ddd780b18868724cd48a96ffab0fcf9556 100644 |
--- a/media/renderers/video_renderer_impl_unittest.cc |
+++ b/media/renderers/video_renderer_impl_unittest.cc |
@@ -22,6 +22,7 @@ |
#include "media/base/null_video_sink.h" |
#include "media/base/test_helpers.h" |
#include "media/base/video_frame.h" |
+#include "media/base/wall_clock_time_source.h" |
#include "media/renderers/video_renderer_impl.h" |
#include "testing/gtest/include/gtest/gtest.h" |
@@ -66,6 +67,7 @@ class VideoRendererImplTest : public testing::TestWithParam<bool> { |
renderer_->disable_new_video_renderer_for_testing(); |
renderer_->SetTickClockForTesting(scoped_ptr<base::TickClock>(tick_clock_)); |
null_video_sink_->set_tick_clock_for_testing(tick_clock_); |
+ time_source_.set_tick_clock_for_testing(tick_clock_); |
// Start wallclock time at a non-zero value. |
AdvanceWallclockTimeInMs(12345); |
@@ -108,8 +110,9 @@ class VideoRendererImplTest : public testing::TestWithParam<bool> { |
PipelineStatus decoder_status) { |
if (low_delay) |
demuxer_stream_.set_liveness(DemuxerStream::LIVENESS_LIVE); |
- EXPECT_CALL(*decoder_, Initialize(_, _, _, _)).WillOnce( |
- DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(decoder_status))); |
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _)) |
+ .WillOnce( |
+ DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(decoder_status))); |
EXPECT_CALL(*this, OnWaitingForDecryptionKey()).Times(0); |
renderer_->Initialize( |
&demuxer_stream_, status_cb, media::SetDecryptorReadyCB(), |
@@ -118,16 +121,18 @@ class VideoRendererImplTest : public testing::TestWithParam<bool> { |
base::Bind(&StrictMock<MockCB>::BufferingStateChange, |
base::Unretained(&mock_cb_)), |
ended_event_.GetClosure(), error_event_.GetPipelineStatusCB(), |
- base::Bind(&VideoRendererImplTest::GetWallClockTime, |
- base::Unretained(this)), |
+ base::Bind(&WallClockTimeSource::GetWallClockTimes, |
+ base::Unretained(&time_source_)), |
base::Bind(&VideoRendererImplTest::OnWaitingForDecryptionKey, |
base::Unretained(this))); |
} |
void StartPlayingFrom(int milliseconds) { |
SCOPED_TRACE(base::StringPrintf("StartPlayingFrom(%d)", milliseconds)); |
- renderer_->StartPlayingFrom( |
- base::TimeDelta::FromMilliseconds(milliseconds)); |
+ const base::TimeDelta media_time = |
+ base::TimeDelta::FromMilliseconds(milliseconds); |
+ time_source_.SetMediaTime(media_time); |
+ renderer_->StartPlayingFrom(media_time); |
message_loop_.RunUntilIdle(); |
} |
@@ -263,6 +268,9 @@ class VideoRendererImplTest : public testing::TestWithParam<bool> { |
DCHECK_EQ(&message_loop_, base::MessageLoop::current()); |
base::AutoLock l(lock_); |
time_ += base::TimeDelta::FromMilliseconds(time_ms); |
+ time_source_.StopTicking(); |
+ time_source_.SetMediaTime(time_); |
+ time_source_.StartTicking(); |
} |
bool has_ended() const { |
@@ -289,12 +297,9 @@ class VideoRendererImplTest : public testing::TestWithParam<bool> { |
PipelineStatistics last_pipeline_statistics_; |
- private: |
- base::TimeTicks GetWallClockTime(base::TimeDelta time) { |
- base::AutoLock l(lock_); |
- return tick_clock_->NowTicks() + (time - time_); |
- } |
+ WallClockTimeSource time_source_; |
+ private: |
void DecodeRequested(const scoped_refptr<DecoderBuffer>& buffer, |
const VideoDecoder::DecodeCB& decode_cb) { |
DCHECK_EQ(&message_loop_, base::MessageLoop::current()); |
@@ -434,6 +439,7 @@ TEST_P(VideoRendererImplTest, DecodeError_Playing) { |
EXPECT_CALL(mock_cb_, BufferingStateChange(BUFFERING_HAVE_ENOUGH)); |
StartPlayingFrom(0); |
renderer_->OnTimeStateChanged(true); |
+ time_source_.StartTicking(); |
AdvanceTimeInMs(10); |
QueueFrames("error"); |
@@ -496,6 +502,8 @@ TEST_P(VideoRendererImplTest, StartPlayingFrom_LowDelay) { |
SatisfyPendingRead(); |
renderer_->OnTimeStateChanged(true); |
+ time_source_.StartTicking(); |
+ |
WaitableMessageLoopEvent event; |
EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(10))) |
.WillOnce(RunClosure(event.GetClosure())); |
@@ -545,10 +553,17 @@ TEST_P(VideoRendererImplTest, Underflow) { |
{ |
SCOPED_TRACE("Waiting for frame drops"); |
WaitableMessageLoopEvent event; |
- EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(30))) |
- .Times(0); |
- EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60))) |
- .Times(0); |
+ |
+ // Note: Starting the TimeSource will cause the old VideoRendererImpl to |
+ // start rendering frames on its own thread, so the first frame may be |
+ // received. |
+ time_source_.StartTicking(); |
+ if (GetParam()) |
+ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(30))).Times(0); |
+ else |
+ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(30))).Times(AnyNumber()); |
+ |
+ EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(60))).Times(0); |
EXPECT_CALL(mock_cb_, FrameReceived(HasTimestamp(90))) |
.WillOnce(RunClosure(event.GetClosure())); |
AdvanceTimeInMs(91); |
@@ -675,6 +690,7 @@ TEST_P(VideoRendererImplTest, RenderingStartedThenStopped) { |
} |
renderer_->OnTimeStateChanged(true); |
+ time_source_.StartTicking(); |
// Suspend all future callbacks and synthetically advance the media time, |
// because this is a background render, we won't underflow by waiting until |