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

Unified Diff: media/filters/video_frame_stream_unittest.cc

Issue 15660002: Update VideoFrameStreamTest to use FakeDemuxerStream and FakeVideoDecoder. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase Created 7 years, 7 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 | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/filters/video_frame_stream_unittest.cc
diff --git a/media/filters/video_frame_stream_unittest.cc b/media/filters/video_frame_stream_unittest.cc
index bef2d86a556c966dc369c3394eb0d0478d49f875..8ba927beab3267a11eec7e23d8df90378d0c11e0 100644
--- a/media/filters/video_frame_stream_unittest.cc
+++ b/media/filters/video_frame_stream_unittest.cc
@@ -8,28 +8,35 @@
#include "media/base/gmock_callback_support.h"
#include "media/base/mock_filters.h"
#include "media/base/test_helpers.h"
+#include "media/filters/fake_demuxer_stream.h"
+#include "media/filters/fake_video_decoder.h"
#include "media/filters/video_frame_stream.h"
#include "testing/gtest/include/gtest/gtest.h"
using ::testing::_;
using ::testing::Assign;
-using ::testing::AtMost;
+using ::testing::Invoke;
using ::testing::NiceMock;
-using ::testing::NotNull;
using ::testing::Return;
using ::testing::SaveArg;
-using ::testing::StrictMock;
+
+static const int kNumConfigs = 3;
+static const int kNumBuffersInOneConfig = 5;
+static const int kDecodingDelay = 7;
namespace media {
class VideoFrameStreamTest : public testing::TestWithParam<bool> {
public:
VideoFrameStreamTest()
- : demuxer_stream_(
- new StrictMock<MockDemuxerStream>(DemuxerStream::VIDEO)),
+ : demuxer_stream_(new FakeDemuxerStream(kNumConfigs,
+ kNumBuffersInOneConfig,
+ GetParam())),
decryptor_(new NiceMock<MockDecryptor>()),
- decoder_(new StrictMock<MockVideoDecoder>()),
- is_initialized_(false) {
+ decoder_(new FakeVideoDecoder(kDecodingDelay)),
+ is_initialized_(false),
+ num_decoded_frames_(0),
+ pending_decoder_read_(false) {
ScopedVector<VideoDecoder> decoders;
decoders.push_back(decoder_);
@@ -39,13 +46,6 @@ class VideoFrameStreamTest : public testing::TestWithParam<bool> {
base::Bind(&VideoFrameStreamTest::SetDecryptorReadyCallback,
base::Unretained(this))));
- demuxer_stream_->set_video_decoder_config(GetParam() ?
- TestVideoConfig::NormalEncrypted() : TestVideoConfig::Normal());
-
- EXPECT_CALL(*demuxer_stream_, Read(_))
- .WillRepeatedly(RunCallback<0>(DemuxerStream::kOk,
- scoped_refptr<DecoderBuffer>()));
-
EXPECT_CALL(*this, SetDecryptorReadyCallback(_))
.WillRepeatedly(RunCallback<0>(decryptor_.get()));
@@ -54,148 +54,189 @@ class VideoFrameStreamTest : public testing::TestWithParam<bool> {
EXPECT_CALL(*decryptor_, InitializeVideoDecoder(_, _))
.WillRepeatedly(RunCallback<1>(false));
EXPECT_CALL(*decryptor_, Decrypt(_, _, _))
- .WillRepeatedly(RunCallback<2>(Decryptor::kSuccess,
- scoped_refptr<DecoderBuffer>()));
+ .WillRepeatedly(Invoke(this, &VideoFrameStreamTest::Decrypt));
}
~VideoFrameStreamTest() {
- if (is_initialized_)
- Stop();
-
+ Stop();
EXPECT_FALSE(is_initialized_);
- EXPECT_TRUE(decoder_init_cb_.is_null());
- EXPECT_TRUE(decoder_read_cb_.is_null());
- EXPECT_TRUE(decoder_reset_cb_.is_null());
- EXPECT_TRUE(decoder_stop_cb_.is_null());
}
MOCK_METHOD1(OnStatistics, void(const PipelineStatistics&));
MOCK_METHOD1(SetDecryptorReadyCallback, void(const media::DecryptorReadyCB&));
MOCK_METHOD2(OnInitialized, void(bool, bool));
- MOCK_METHOD2(OnFrameRead, void(VideoDecoder::Status,
- const scoped_refptr<VideoFrame>&));
MOCK_METHOD0(OnReset, void());
MOCK_METHOD0(OnStopped, void());
- void EnterPendingInitializationState() {
- EXPECT_CALL(*decoder_, Initialize(_, _, _))
- .WillOnce(SaveArg<1>(&decoder_init_cb_));
- video_frame_stream_->Initialize(
- demuxer_stream_.get(),
- base::Bind(&VideoFrameStreamTest::OnStatistics, base::Unretained(this)),
- base::Bind(&VideoFrameStreamTest::OnInitialized,
- base::Unretained(this)));
- message_loop_.RunUntilIdle();
- }
-
- void SatisfyPendingInitialization(bool success) {
- EXPECT_CALL(*this, OnInitialized(success, false))
- .WillOnce(SaveArg<0>(&is_initialized_));
- base::ResetAndReturn(&decoder_init_cb_).Run(
- success ? PIPELINE_OK : DECODER_ERROR_NOT_SUPPORTED);
- message_loop_.RunUntilIdle();
-
- // Failed initialization will delete unused decoders.
- if (!success)
- decoder_ = NULL;
+ // Fake Decrypt() function used by DecryptingDemuxerStream. It does nothing
+ // but removes the DecryptConfig to make the buffer unencrypted.
+ void Decrypt(Decryptor::StreamType stream_type,
+ const scoped_refptr<DecoderBuffer>& encrypted,
+ const Decryptor::DecryptCB& decrypt_cb) {
+ DCHECK_EQ(stream_type, Decryptor::kVideo);
+ scoped_refptr<DecoderBuffer> decrypted = DecoderBuffer::CopyFrom(
+ encrypted->GetData(), encrypted->GetDataSize());
+ decrypted->SetTimestamp(encrypted->GetTimestamp());
+ decrypted->SetDuration(encrypted->GetDuration());
+ decrypt_cb.Run(Decryptor::kSuccess, decrypted);
}
- void EnterPendingReadFrameState() {
- EXPECT_CALL(*decoder_, Read(_))
- .WillOnce(SaveArg<0>(&decoder_read_cb_));
- EXPECT_CALL(*this, OnFrameRead(VideoDecoder::kOk, _));
- video_frame_stream_->ReadFrame(base::Bind(
- &VideoFrameStreamTest::OnFrameRead, base::Unretained(this)));
- message_loop_.RunUntilIdle();
- }
-
- void SatisfyPendingReadFrame() {
- base::ResetAndReturn(&decoder_read_cb_).Run(VideoDecoder::kOk,
- scoped_refptr<VideoFrame>());
- message_loop_.RunUntilIdle();
+ // Callback for VideoFrameStream::ReadFrame().
+ void FrameReady(VideoDecoder::Status status,
+ const scoped_refptr<VideoFrame>& frame) {
+ DCHECK(pending_decoder_read_);
+ ASSERT_EQ(VideoDecoder::kOk, status);
+ frame_read_ = frame;
+ if (frame && !frame->IsEndOfStream())
+ num_decoded_frames_++;
+ pending_decoder_read_ = false;
}
- void EnterPendingResetState() {
- EXPECT_CALL(*decoder_, Reset(_))
- .WillOnce(SaveArg<0>(&decoder_reset_cb_));
- EXPECT_CALL(*this, OnReset());
- video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset,
- base::Unretained(this)));
- message_loop_.RunUntilIdle();
+ void ReadUntilPending() {
+ do {
+ frame_read_ = NULL;
+ pending_decoder_read_ = true;
+ video_frame_stream_->ReadFrame(base::Bind(
+ &VideoFrameStreamTest::FrameReady, base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ } while (!pending_decoder_read_);
}
- void SatisfyPendingReset() {
- base::ResetAndReturn(&decoder_reset_cb_).Run();
- message_loop_.RunUntilIdle();
+ enum PendingState {
+ NOT_PENDING,
+ DEMUXER_READ_NORMAL,
+ DEMUXER_READ_CONFIG_CHANGE,
+ DECODER_INIT,
+ DECODER_READ,
+ DECODER_RESET,
+ DECODER_STOP
+ };
+
+ void EnterPendingState(PendingState state) {
+ DCHECK_NE(state, NOT_PENDING);
+ switch (state) {
+ case DEMUXER_READ_NORMAL:
+ demuxer_stream_->HoldNextRead();
+ ReadUntilPending();
+ break;
+
+ case DEMUXER_READ_CONFIG_CHANGE:
+ demuxer_stream_->HoldNextConfigChangeRead();
+ ReadUntilPending();
+ break;
+
+ case DECODER_INIT:
+ decoder_->HoldNextInit();
+ video_frame_stream_->Initialize(
+ demuxer_stream_.get(),
+ base::Bind(&VideoFrameStreamTest::OnStatistics,
+ base::Unretained(this)),
+ base::Bind(&VideoFrameStreamTest::OnInitialized,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ break;
+
+ case DECODER_READ:
+ decoder_->HoldNextRead();
+ ReadUntilPending();
+ break;
+
+ case DECODER_RESET:
+ decoder_->HoldNextReset();
+ video_frame_stream_->Reset(base::Bind(&VideoFrameStreamTest::OnReset,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ break;
+
+ case DECODER_STOP:
+ decoder_->HoldNextStop();
+ video_frame_stream_->Stop(base::Bind(&VideoFrameStreamTest::OnStopped,
+ base::Unretained(this)));
+ message_loop_.RunUntilIdle();
+ break;
+
+ case NOT_PENDING:
+ NOTREACHED();
+ break;
+ }
}
- void EnterPendingStopState() {
- // If initialization failed, we won't call VideoDecoder::Stop() during
- // the stopping process.
- if (decoder_) {
- EXPECT_CALL(*decoder_, Stop(_))
- .WillRepeatedly(SaveArg<0>(&decoder_stop_cb_));
+ void SatisfyPendingCallback(PendingState state) {
+ DCHECK_NE(state, NOT_PENDING);
+ switch (state) {
+ case DEMUXER_READ_NORMAL:
+ case DEMUXER_READ_CONFIG_CHANGE:
+ demuxer_stream_->SatisfyRead();
+ break;
+
+ case DECODER_INIT:
+ EXPECT_CALL(*this, OnInitialized(true, false))
+ .WillOnce(SaveArg<0>(&is_initialized_));
+ decoder_->SatisfyInit();
+ break;
+
+ case DECODER_READ:
+ decoder_->SatisfyRead();
+ break;
+
+ case DECODER_RESET:
+ EXPECT_CALL(*this, OnReset());
+ decoder_->SatisfyReset();
+ break;
+
+ case DECODER_STOP:
+ EXPECT_CALL(*this, OnStopped())
+ .WillOnce(Assign(&is_initialized_, false));
+ decoder_->SatisfyStop();
+ break;
+
+ case NOT_PENDING:
+ NOTREACHED();
+ break;
}
- EXPECT_CALL(*this, OnStopped())
- .WillOnce(Assign(&is_initialized_, false));
- video_frame_stream_->Stop(base::Bind(&VideoFrameStreamTest::OnStopped,
- base::Unretained(this)));
- message_loop_.RunUntilIdle();
- }
-
- void SatisfyPendingStop() {
- // If decoder is not initialized, |decoder_stop_cb_| can be null. In that
- // case, we don't actually need to satisfy the stop callback.
- if (decoder_stop_cb_.is_null())
- return;
- base::ResetAndReturn(&decoder_stop_cb_).Run();
message_loop_.RunUntilIdle();
+ if (!is_initialized_)
+ decoder_ = NULL;
}
void Initialize() {
- EnterPendingInitializationState();
- SatisfyPendingInitialization(true);
- }
-
- void InitializeAndFail() {
- EnterPendingInitializationState();
- SatisfyPendingInitialization(false);
+ EnterPendingState(DECODER_INIT);
+ SatisfyPendingCallback(DECODER_INIT);
}
void ReadFrame() {
- EnterPendingReadFrameState();
- SatisfyPendingReadFrame();
+ EnterPendingState(DECODER_READ);
+ SatisfyPendingCallback(DECODER_READ);
}
void Reset() {
- EnterPendingResetState();
- SatisfyPendingReset();
+ EnterPendingState(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_RESET);
}
void Stop() {
- EnterPendingStopState();
- SatisfyPendingStop();
+ if (!is_initialized_)
+ return;
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_STOP);
}
- private:
base::MessageLoop message_loop_;
scoped_ptr<VideoFrameStream> video_frame_stream_;
- scoped_ptr<StrictMock<MockDemuxerStream> > demuxer_stream_;
- // Use NiceMock since we don't care about most of calls on the decryptor, e.g.
- // RegisterNewKeyCB().
+ scoped_ptr<FakeDemuxerStream> demuxer_stream_;
+ // Use NiceMock since we don't care about most of calls on the decryptor,
+ // e.g. RegisterNewKeyCB().
scoped_ptr<NiceMock<MockDecryptor> > decryptor_;
- StrictMock<MockVideoDecoder>* decoder_; // Owned by |video_frame_stream_|.
-
- // Callbacks to simulate pending decoder operations.
- PipelineStatusCB decoder_init_cb_;
- VideoDecoder::ReadCB decoder_read_cb_;
- base::Closure decoder_reset_cb_;
- base::Closure decoder_stop_cb_;
+ FakeVideoDecoder* decoder_; // Owned by |video_frame_stream_|.
bool is_initialized_;
+ int num_decoded_frames_;
+ bool pending_decoder_read_;
+ scoped_refptr<VideoFrame> frame_read_;
+ private:
DISALLOW_COPY_AND_ASSIGN(VideoFrameStreamTest);
};
@@ -206,25 +247,27 @@ TEST_P(VideoFrameStreamTest, Initialization) {
Initialize();
}
-TEST_P(VideoFrameStreamTest, Initialization_Failed) {
- InitializeAndFail();
-}
-
-TEST_P(VideoFrameStreamTest, ReadFrame) {
+TEST_P(VideoFrameStreamTest, ReadOneFrame) {
Initialize();
ReadFrame();
}
-TEST_P(VideoFrameStreamTest, ReadFrame_Multiple) {
+TEST_P(VideoFrameStreamTest, ReadAllFrames) {
Initialize();
- for (int i = 0; i < 10; ++i)
+ do {
ReadFrame();
+ } while (frame_read_ && !frame_read_->IsEndOfStream());
+
+ const int total_num_frames = kNumConfigs * kNumBuffersInOneConfig;
+ DCHECK_EQ(num_decoded_frames_, total_num_frames);
}
-TEST_P(VideoFrameStreamTest, ReadFrame_AfterReset) {
+TEST_P(VideoFrameStreamTest, Read_AfterReset) {
Initialize();
Reset();
ReadFrame();
+ Reset();
+ ReadFrame();
}
TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
@@ -232,36 +275,53 @@ TEST_P(VideoFrameStreamTest, Reset_AfterInitialization) {
Reset();
}
-TEST_P(VideoFrameStreamTest, Reset_DuringReadFrame) {
+TEST_P(VideoFrameStreamTest, Reset_DuringNormalDemuxerRead) {
+ Initialize();
+ EnterPendingState(DEMUXER_READ_NORMAL);
+ EnterPendingState(DECODER_RESET);
+ SatisfyPendingCallback(DEMUXER_READ_NORMAL);
+ SatisfyPendingCallback(DECODER_RESET);
+}
+
+TEST_P(VideoFrameStreamTest, Reset_DuringConfigChangeDemuxerRead) {
+ Initialize();
+ EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
+ EnterPendingState(DECODER_RESET);
+ SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
+ SatisfyPendingCallback(DECODER_RESET);
+}
+
+TEST_P(VideoFrameStreamTest, Reset_DuringNormalDecoderRead) {
Initialize();
- EnterPendingReadFrameState();
- EnterPendingResetState();
- SatisfyPendingReadFrame();
- SatisfyPendingReset();
+ EnterPendingState(DECODER_READ);
+ EnterPendingState(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_READ);
+ SatisfyPendingCallback(DECODER_RESET);
}
-TEST_P(VideoFrameStreamTest, Reset_AfterReadFrame) {
+TEST_P(VideoFrameStreamTest, Reset_AfterNormalRead) {
Initialize();
ReadFrame();
Reset();
}
+TEST_P(VideoFrameStreamTest, Reset_AfterConfigChangeRead) {
+ Initialize();
+ EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
+ SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
+ Reset();
+ ReadFrame();
+}
+
TEST_P(VideoFrameStreamTest, Stop_BeforeInitialization) {
Stop();
}
TEST_P(VideoFrameStreamTest, Stop_DuringInitialization) {
- EnterPendingInitializationState();
- EnterPendingStopState();
- SatisfyPendingInitialization(true);
- SatisfyPendingStop();
-}
-
-TEST_P(VideoFrameStreamTest, Stop_DuringFailedInitialization) {
- EnterPendingInitializationState();
- EnterPendingStopState();
- SatisfyPendingInitialization(false);
- SatisfyPendingStop();
+ EnterPendingState(DECODER_INIT);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_INIT);
+ SatisfyPendingCallback(DECODER_STOP);
}
TEST_P(VideoFrameStreamTest, Stop_AfterInitialization) {
@@ -269,31 +329,49 @@ TEST_P(VideoFrameStreamTest, Stop_AfterInitialization) {
Stop();
}
-TEST_P(VideoFrameStreamTest, Stop_AfterFailedInitialization) {
- InitializeAndFail();
- Stop();
+TEST_P(VideoFrameStreamTest, Stop_DuringNormalDemuxerRead) {
+ Initialize();
+ EnterPendingState(DEMUXER_READ_NORMAL);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DEMUXER_READ_NORMAL);
+ SatisfyPendingCallback(DECODER_STOP);
}
-TEST_P(VideoFrameStreamTest, Stop_DuringReadFrame) {
+TEST_P(VideoFrameStreamTest, Stop_DuringConfigChangeDemuxerRead) {
Initialize();
- EnterPendingReadFrameState();
- EnterPendingStopState();
- SatisfyPendingReadFrame();
- SatisfyPendingStop();
+ EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
+ SatisfyPendingCallback(DECODER_STOP);
}
-TEST_P(VideoFrameStreamTest, Stop_AfterReadFrame) {
+TEST_P(VideoFrameStreamTest, Stop_DuringNormalDecoderRead) {
+ Initialize();
+ EnterPendingState(DECODER_READ);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_READ);
+ SatisfyPendingCallback(DECODER_STOP);
+}
+
+TEST_P(VideoFrameStreamTest, Stop_AfterNormalRead) {
Initialize();
ReadFrame();
Stop();
}
+TEST_P(VideoFrameStreamTest, Stop_AfterConfigChangeRead) {
+ Initialize();
+ EnterPendingState(DEMUXER_READ_CONFIG_CHANGE);
+ SatisfyPendingCallback(DEMUXER_READ_CONFIG_CHANGE);
+ Stop();
+}
+
TEST_P(VideoFrameStreamTest, Stop_DuringReset) {
Initialize();
- EnterPendingResetState();
- EnterPendingStopState();
- SatisfyPendingReset();
- SatisfyPendingStop();
+ EnterPendingState(DECODER_RESET);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_STOP);
}
TEST_P(VideoFrameStreamTest, Stop_AfterReset) {
@@ -304,22 +382,22 @@ TEST_P(VideoFrameStreamTest, Stop_AfterReset) {
TEST_P(VideoFrameStreamTest, Stop_DuringReadFrame_DuringReset) {
Initialize();
- EnterPendingReadFrameState();
- EnterPendingResetState();
- EnterPendingStopState();
- SatisfyPendingReadFrame();
- SatisfyPendingReset();
- SatisfyPendingStop();
+ EnterPendingState(DECODER_READ);
+ EnterPendingState(DECODER_RESET);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_READ);
+ SatisfyPendingCallback(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_STOP);
}
TEST_P(VideoFrameStreamTest, Stop_AfterReadFrame_DuringReset) {
Initialize();
- EnterPendingReadFrameState();
- EnterPendingResetState();
- SatisfyPendingReadFrame();
- EnterPendingStopState();
- SatisfyPendingReset();
- SatisfyPendingStop();
+ EnterPendingState(DECODER_READ);
+ EnterPendingState(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_READ);
+ EnterPendingState(DECODER_STOP);
+ SatisfyPendingCallback(DECODER_RESET);
+ SatisfyPendingCallback(DECODER_STOP);
}
TEST_P(VideoFrameStreamTest, Stop_AfterReadFrame_AfterReset) {
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698