| Index: media/filters/video_renderer_impl_unittest.cc
|
| diff --git a/media/filters/video_renderer_impl_unittest.cc b/media/filters/video_renderer_impl_unittest.cc
|
| index b48d9071c2c4c79d756ee21114fb9a587aa70e2c..aee55f7d8da52ea96d29b3886ab84141a093e567 100644
|
| --- a/media/filters/video_renderer_impl_unittest.cc
|
| +++ b/media/filters/video_renderer_impl_unittest.cc
|
| @@ -19,6 +19,8 @@
|
| #include "media/base/mock_filters.h"
|
| #include "media/base/test_helpers.h"
|
| #include "media/base/video_frame.h"
|
| +#include "media/filters/clockless_video_frame_scheduler.h"
|
| +#include "media/filters/video_frame_scheduler_impl.h"
|
| #include "media/filters/video_renderer_impl.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| @@ -46,10 +48,18 @@ class VideoRendererImplTest : public ::testing::Test {
|
|
|
| renderer_.reset(new VideoRendererImpl(
|
| message_loop_.message_loop_proxy(),
|
| + scoped_ptr<VideoFrameScheduler>(
|
| +#if 1
|
| + new ClocklessVideoFrameScheduler(base::Bind(
|
| + &VideoRendererImplTest::OnPaint, base::Unretained(this)))),
|
| +#else
|
| + new VideoFrameSchedulerImpl(
|
| + message_loop_.message_loop_proxy(),
|
| + base::Bind(&VideoRendererImplTest::OnPaint,
|
| + base::Unretained(this)))),
|
| +#endif
|
| decoders.Pass(),
|
| - media::SetDecryptorReadyCB(),
|
| - base::Bind(&VideoRendererImplTest::OnPaint, base::Unretained(this)),
|
| - true));
|
| + media::SetDecryptorReadyCB()));
|
|
|
| demuxer_stream_.set_video_decoder_config(TestVideoConfig::Normal());
|
|
|
| @@ -89,9 +99,6 @@ class VideoRendererImplTest : public ::testing::Test {
|
| EXPECT_CALL(*decoder_, Initialize(_, _))
|
| .WillOnce(RunCallback<1>(PIPELINE_OK));
|
|
|
| - // Set playback rate before anything else happens.
|
| - renderer_->SetPlaybackRate(1.0f);
|
| -
|
| // Initialize, we shouldn't have any reads.
|
| InitializeRenderer(PIPELINE_OK);
|
|
|
| @@ -122,6 +129,11 @@ class VideoRendererImplTest : public ::testing::Test {
|
| base::Unretained(this)));
|
| }
|
|
|
| + void SetPlaybackRate(float playback_rate) {
|
| + SCOPED_TRACE(base::StringPrintf("SetPlaybackRate(%f)", playback_rate));
|
| + renderer_->SetPlaybackRate(playback_rate);
|
| + }
|
| +
|
| void Play() {
|
| SCOPED_TRACE("Play()");
|
| WaitableMessageLoopEvent event;
|
| @@ -216,20 +228,18 @@ class VideoRendererImplTest : public ::testing::Test {
|
| }
|
|
|
| void ResetCurrentFrame() {
|
| - base::AutoLock l(lock_);
|
| current_frame_ = NULL;
|
| }
|
|
|
| scoped_refptr<VideoFrame> GetCurrentFrame() {
|
| - base::AutoLock l(lock_);
|
| return current_frame_;
|
| }
|
|
|
| int GetCurrentTimestampInMs() {
|
| scoped_refptr<VideoFrame> frame = GetCurrentFrame();
|
| - if (!frame.get())
|
| + if (!current_frame_)
|
| return -1;
|
| - return frame->timestamp().InMilliseconds();
|
| + return current_frame_->timestamp().InMilliseconds();
|
| }
|
|
|
| void WaitForError(PipelineStatus expected) {
|
| @@ -268,12 +278,13 @@ class VideoRendererImplTest : public ::testing::Test {
|
| read_cb_.Reset();
|
| decode_results_.pop_front();
|
|
|
| + LOG(ERROR) << __FUNCTION__;
|
| +
|
| message_loop_.PostTask(FROM_HERE, closure);
|
| }
|
|
|
| void AdvanceTimeInMs(int time_ms) {
|
| DCHECK_EQ(&message_loop_, base::MessageLoop::current());
|
| - base::AutoLock l(lock_);
|
| time_ += base::TimeDelta::FromMilliseconds(time_ms);
|
| DCHECK_LE(time_.InMicroseconds(), duration_.InMicroseconds());
|
| }
|
| @@ -287,7 +298,6 @@ class VideoRendererImplTest : public ::testing::Test {
|
|
|
| private:
|
| base::TimeDelta GetTime() {
|
| - base::AutoLock l(lock_);
|
| return time_;
|
| }
|
|
|
| @@ -296,12 +306,13 @@ class VideoRendererImplTest : public ::testing::Test {
|
| }
|
|
|
| void OnPaint(const scoped_refptr<VideoFrame>& frame) {
|
| - base::AutoLock l(lock_);
|
| + LOG(ERROR) << __FUNCTION__ << " ts=" << frame->timestamp().InMicroseconds();
|
| current_frame_ = frame;
|
| }
|
|
|
| void FrameRequested(const scoped_refptr<DecoderBuffer>& buffer,
|
| const VideoDecoder::DecodeCB& read_cb) {
|
| + LOG(ERROR) << __FUNCTION__;
|
| DCHECK_EQ(&message_loop_, base::MessageLoop::current());
|
| CHECK(read_cb_.is_null());
|
| read_cb_ = read_cb;
|
| @@ -338,8 +349,6 @@ class VideoRendererImplTest : public ::testing::Test {
|
|
|
| base::MessageLoop message_loop_;
|
|
|
| - // Used to protect |time_| and |current_frame_|.
|
| - base::Lock lock_;
|
| base::TimeDelta time_;
|
| scoped_refptr<VideoFrame> current_frame_;
|
|
|
| @@ -406,6 +415,7 @@ TEST_F(VideoRendererImplTest, Play) {
|
|
|
| TEST_F(VideoRendererImplTest, EndOfStream_DefaultFrameDuration) {
|
| Initialize();
|
| + SetPlaybackRate(1.0); // Can't reach end of stream with zero playback rate.
|
| Play();
|
|
|
| // Verify that the ended callback fires when the default last frame duration
|
| @@ -424,6 +434,7 @@ TEST_F(VideoRendererImplTest, EndOfStream_DefaultFrameDuration) {
|
| TEST_F(VideoRendererImplTest, EndOfStream_ClipDuration) {
|
| int duration = kVideoDurationInMs + kFrameDurationInMs / 2;
|
| InitializeWithDuration(duration);
|
| + SetPlaybackRate(1.0); // Can't reach end of stream with zero playback rate.
|
| Play();
|
|
|
| // Render all frames except for the last |limits::kMaxVideoFrames| frames
|
| @@ -440,6 +451,7 @@ TEST_F(VideoRendererImplTest, EndOfStream_ClipDuration) {
|
|
|
| // Queue the end of stream frame and wait for the last frame to be rendered.
|
| QueueEndOfStream();
|
| + SatisfyPendingRead();
|
| AdvanceTimeInMs(duration);
|
| WaitForEnded();
|
|
|
| @@ -448,10 +460,12 @@ TEST_F(VideoRendererImplTest, EndOfStream_ClipDuration) {
|
|
|
| TEST_F(VideoRendererImplTest, DecodeError_Playing) {
|
| Initialize();
|
| + SetPlaybackRate(1.0);
|
| Play();
|
|
|
| QueueDecodeError();
|
| - AdvanceTimeInMs(kVideoDurationInMs);
|
| + SatisfyPendingRead();
|
| + // AdvanceTimeInMs(kVideoDurationInMs);
|
| WaitForError(PIPELINE_ERROR_DECODE);
|
| Shutdown();
|
| }
|
| @@ -501,6 +515,7 @@ TEST_F(VideoRendererImplTest, Preroll_RightAfter) {
|
|
|
| TEST_F(VideoRendererImplTest, PlayAfterPreroll) {
|
| Initialize();
|
| + SetPlaybackRate(1.0);
|
| Pause();
|
| Flush();
|
| QueuePrerollFrames(kFrameDurationInMs * 4);
|
| @@ -558,7 +573,7 @@ TEST_F(VideoRendererImplTest, Rebuffer_AlreadyHaveEnoughFrames) {
|
| WaitableMessageLoopEvent event;
|
| renderer_->Preroll(kNoTimestamp(),
|
| event.GetPipelineStatusCB());
|
| -
|
| + SatisfyPendingRead();
|
| event.RunAndWaitForStatus(PIPELINE_OK);
|
|
|
| Play();
|
| @@ -602,6 +617,7 @@ TEST_F(VideoRendererImplTest, GetCurrentFrame_Flushed) {
|
|
|
| TEST_F(VideoRendererImplTest, GetCurrentFrame_EndOfStream) {
|
| Initialize();
|
| + SetPlaybackRate(1.0); // Can't reach end of stream with zero playback rate.
|
| Play();
|
| Pause();
|
| Flush();
|
|
|