Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(648)

Unified Diff: media/filters/video_renderer_impl_unittest.cc

Issue 297553002: Add callback in VideoDecoder and AudioDecoder to return decoded frames. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/filters/video_frame_stream_unittest.cc ('k') | media/filters/vpx_video_decoder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 e51391cda4781912b825ecb3983df0f1fc24e26a..6bf6ca1a5886acd52bf9a2668eedab44f1978275 100644
--- a/media/filters/video_renderer_impl_unittest.cc
+++ b/media/filters/video_renderer_impl_unittest.cc
@@ -32,6 +32,7 @@ using ::testing::Invoke;
using ::testing::NiceMock;
using ::testing::NotNull;
using ::testing::Return;
+using ::testing::SaveArg;
using ::testing::StrictMock;
namespace media {
@@ -67,9 +68,9 @@ class VideoRendererImplTest : public ::testing::Test {
demuxer_stream_.set_video_decoder_config(TestVideoConfig::Normal());
// We expect these to be called but we don't care how/when.
- EXPECT_CALL(demuxer_stream_, Read(_))
- .WillRepeatedly(RunCallback<0>(DemuxerStream::kOk,
- DecoderBuffer::CreateEOSBuffer()));
+ EXPECT_CALL(demuxer_stream_, Read(_)).WillRepeatedly(
+ RunCallback<0>(DemuxerStream::kOk,
+ scoped_refptr<DecoderBuffer>(new DecoderBuffer(0))));
EXPECT_CALL(*decoder_, Stop())
.WillRepeatedly(Invoke(this, &VideoRendererImplTest::StopRequested));
EXPECT_CALL(statistics_cb_object_, OnStatistics(_))
@@ -90,16 +91,13 @@ class VideoRendererImplTest : public ::testing::Test {
void InitializeWithLowDelay(bool low_delay) {
// Monitor decodes from the decoder.
EXPECT_CALL(*decoder_, Decode(_, _))
- .WillRepeatedly(Invoke(this, &VideoRendererImplTest::FrameRequested));
+ .WillRepeatedly(Invoke(this, &VideoRendererImplTest::DecodeRequested));
EXPECT_CALL(*decoder_, Reset(_))
.WillRepeatedly(Invoke(this, &VideoRendererImplTest::FlushRequested));
InSequence s;
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(RunCallback<2>(PIPELINE_OK));
-
// Set playback rate before anything else happens.
renderer_->SetPlaybackRate(1.0f);
@@ -110,11 +108,15 @@ class VideoRendererImplTest : public ::testing::Test {
void InitializeRenderer(PipelineStatus expected, bool low_delay) {
SCOPED_TRACE(base::StringPrintf("InitializeRenderer(%d)", expected));
WaitableMessageLoopEvent event;
- CallInitialize(event.GetPipelineStatusCB(), low_delay);
+ CallInitialize(event.GetPipelineStatusCB(), low_delay, expected);
event.RunAndWaitForStatus(expected);
}
- void CallInitialize(const PipelineStatusCB& status_cb, bool low_delay) {
+ void CallInitialize(const PipelineStatusCB& status_cb,
+ bool low_delay,
+ PipelineStatus decoder_status) {
+ EXPECT_CALL(*decoder_, Initialize(_, _, _, _)).WillOnce(
+ DoAll(SaveArg<3>(&output_cb_), RunCallback<2>(decoder_status)));
renderer_->Initialize(
&demuxer_stream_,
low_delay,
@@ -219,7 +221,7 @@ class VideoRendererImplTest : public ::testing::Test {
}
bool IsReadPending() {
- return !read_cb_.is_null();
+ return !decode_cb_.is_null();
}
void WaitForError(PipelineStatus expected) {
@@ -234,31 +236,31 @@ class VideoRendererImplTest : public ::testing::Test {
void WaitForPendingRead() {
SCOPED_TRACE("WaitForPendingRead()");
- if (!read_cb_.is_null())
+ if (!decode_cb_.is_null())
return;
- DCHECK(wait_for_pending_read_cb_.is_null());
+ DCHECK(wait_for_pending_decode_cb_.is_null());
WaitableMessageLoopEvent event;
- wait_for_pending_read_cb_ = event.GetClosure();
+ wait_for_pending_decode_cb_ = event.GetClosure();
event.RunAndWait();
- DCHECK(!read_cb_.is_null());
- DCHECK(wait_for_pending_read_cb_.is_null());
+ DCHECK(!decode_cb_.is_null());
+ DCHECK(wait_for_pending_decode_cb_.is_null());
}
void SatisfyPendingRead() {
- CHECK(!read_cb_.is_null());
+ CHECK(!decode_cb_.is_null());
CHECK(!decode_results_.empty());
- base::Closure closure = base::Bind(
- read_cb_, decode_results_.front().first,
- decode_results_.front().second);
-
- read_cb_.Reset();
+ // Post tasks for OutputCB and DecodeCB.
+ scoped_refptr<VideoFrame> frame = decode_results_.front().second;
+ if (frame)
+ message_loop_.PostTask(FROM_HERE, base::Bind(output_cb_, frame));
+ message_loop_.PostTask(
+ FROM_HERE, base::Bind(base::ResetAndReturn(&decode_cb_),
+ decode_results_.front().first));
decode_results_.pop_front();
-
- message_loop_.PostTask(FROM_HERE, closure);
}
void AdvanceTimeInMs(int time_ms) {
@@ -292,15 +294,15 @@ class VideoRendererImplTest : public ::testing::Test {
return base::TimeDelta::FromMilliseconds(kVideoDurationInMs);
}
- void FrameRequested(const scoped_refptr<DecoderBuffer>& buffer,
- const VideoDecoder::DecodeCB& read_cb) {
+ void DecodeRequested(const scoped_refptr<DecoderBuffer>& buffer,
+ const VideoDecoder::DecodeCB& decode_cb) {
DCHECK_EQ(&message_loop_, base::MessageLoop::current());
- CHECK(read_cb_.is_null());
- read_cb_ = read_cb;
+ CHECK(decode_cb_.is_null());
+ decode_cb_ = decode_cb;
// Wake up WaitForPendingRead() if needed.
- if (!wait_for_pending_read_cb_.is_null())
- base::ResetAndReturn(&wait_for_pending_read_cb_).Run();
+ if (!wait_for_pending_decode_cb_.is_null())
+ base::ResetAndReturn(&wait_for_pending_decode_cb_).Run();
if (decode_results_.empty())
return;
@@ -311,7 +313,7 @@ class VideoRendererImplTest : public ::testing::Test {
void FlushRequested(const base::Closure& callback) {
DCHECK_EQ(&message_loop_, base::MessageLoop::current());
decode_results_.clear();
- if (!read_cb_.is_null()) {
+ if (!decode_cb_.is_null()) {
QueueFrames("abort");
SatisfyPendingRead();
}
@@ -322,7 +324,7 @@ class VideoRendererImplTest : public ::testing::Test {
void StopRequested() {
DCHECK_EQ(&message_loop_, base::MessageLoop::current());
decode_results_.clear();
- if (!read_cb_.is_null()) {
+ if (!decode_cb_.is_null()) {
QueueFrames("abort");
SatisfyPendingRead();
}
@@ -335,14 +337,15 @@ class VideoRendererImplTest : public ::testing::Test {
base::TimeDelta time_;
// Used for satisfying reads.
- VideoDecoder::DecodeCB read_cb_;
+ VideoDecoder::OutputCB output_cb_;
+ VideoDecoder::DecodeCB decode_cb_;
base::TimeDelta next_frame_timestamp_;
WaitableMessageLoopEvent error_event_;
WaitableMessageLoopEvent ended_event_;
- // Run during FrameRequested() to unblock WaitForPendingRead().
- base::Closure wait_for_pending_read_cb_;
+ // Run during DecodeRequested() to unblock WaitForPendingRead().
+ base::Closure wait_for_pending_decode_cb_;
std::deque<std::pair<
VideoDecoder::Status, scoped_refptr<VideoFrame> > > decode_results_;
@@ -378,9 +381,7 @@ static void ExpectNotCalled(PipelineStatus) {
}
TEST_F(VideoRendererImplTest, StopWhileInitializing) {
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(RunCallback<2>(PIPELINE_OK));
- CallInitialize(base::Bind(&ExpectNotCalled), false);
+ CallInitialize(base::Bind(&ExpectNotCalled), false, PIPELINE_OK);
Stop();
// ~VideoRendererImpl() will CHECK() if we left anything initialized.
@@ -581,55 +582,9 @@ TEST_F(VideoRendererImplTest, StopDuringOutstandingRead) {
event.RunAndWait();
}
-TEST_F(VideoRendererImplTest, AbortPendingRead_Playing) {
- Initialize();
- QueueFrames("0 10 20 30");
- EXPECT_CALL(mock_display_cb_, Display(HasTimestamp(0)));
- Preroll(0, PIPELINE_OK);
- Play();
-
- // Check that there is an outstanding Read() request.
- EXPECT_TRUE(IsReadPending());
-
- QueueFrames("abort");
- SatisfyPendingRead();
-
- Flush();
- QueueFrames("60 70 80 90");
- EXPECT_CALL(mock_display_cb_, Display(HasTimestamp(60)));
- Preroll(60, PIPELINE_OK);
- Shutdown();
-}
-
-TEST_F(VideoRendererImplTest, AbortPendingRead_Flush) {
- Initialize();
- QueueFrames("0 10 20 30");
- EXPECT_CALL(mock_display_cb_, Display(HasTimestamp(0)));
- Preroll(0, PIPELINE_OK);
- Play();
-
- // Check that there is an outstanding Read() request.
- EXPECT_TRUE(IsReadPending());
-
- Flush();
- Shutdown();
-}
-
-TEST_F(VideoRendererImplTest, AbortPendingRead_Preroll) {
- Initialize();
- QueueFrames("0 10 abort");
- EXPECT_CALL(mock_display_cb_, Display(HasTimestamp(0)));
- Preroll(0, PIPELINE_OK);
- Shutdown();
-}
-
TEST_F(VideoRendererImplTest, VideoDecoder_InitFailure) {
InSequence s;
-
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(RunCallback<2>(DECODER_ERROR_NOT_SUPPORTED));
InitializeRenderer(DECODER_ERROR_NOT_SUPPORTED, false);
-
Stop();
}
« no previous file with comments | « media/filters/video_frame_stream_unittest.cc ('k') | media/filters/vpx_video_decoder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698