| Index: media/filters/fake_video_decoder_unittest.cc
|
| diff --git a/media/filters/fake_video_decoder_unittest.cc b/media/filters/fake_video_decoder_unittest.cc
|
| index d376758b07bd1a9fd5c46dd08c8bf4d1a8e0865f..d05a31f980bab78b160393712f09436714098ca6 100644
|
| --- a/media/filters/fake_video_decoder_unittest.cc
|
| +++ b/media/filters/fake_video_decoder_unittest.cc
|
| @@ -18,14 +18,15 @@ static const int kDecodingDelay = 9;
|
| static const int kTotalBuffers = 12;
|
| static const int kDurationMs = 30;
|
|
|
| -class FakeVideoDecoderTest : public testing::Test {
|
| +class FakeVideoDecoderTest : public testing::Test,
|
| + public testing::WithParamInterface<int> {
|
| public:
|
| FakeVideoDecoderTest()
|
| - : decoder_(new FakeVideoDecoder(kDecodingDelay, false)),
|
| + : decoder_(new FakeVideoDecoder(kDecodingDelay, false, GetParam())),
|
| num_input_buffers_(0),
|
| num_decoded_frames_(0),
|
| - decode_status_(VideoDecoder::kNotEnoughData),
|
| - is_decode_pending_(false),
|
| + last_decode_status_(VideoDecoder::kNotEnoughData),
|
| + pending_decode_requests_(0),
|
| is_reset_pending_(false) {}
|
|
|
| virtual ~FakeVideoDecoderTest() {
|
| @@ -55,12 +56,11 @@ class FakeVideoDecoderTest : public testing::Test {
|
| // Callback for VideoDecoder::Read().
|
| void FrameReady(VideoDecoder::Status status,
|
| const scoped_refptr<VideoFrame>& frame) {
|
| - DCHECK(is_decode_pending_);
|
| - ASSERT_TRUE(status == VideoDecoder::kOk ||
|
| - status == VideoDecoder::kNotEnoughData);
|
| - is_decode_pending_ = false;
|
| - decode_status_ = status;
|
| - frame_decoded_ = frame;
|
| + DCHECK_GT(pending_decode_requests_, 0);
|
| +
|
| + --pending_decode_requests_;
|
| + last_decode_status_ = status;
|
| + last_decoded_frame_ = frame;
|
|
|
| if (frame && !frame->end_of_stream())
|
| num_decoded_frames_++;
|
| @@ -70,37 +70,36 @@ class FakeVideoDecoderTest : public testing::Test {
|
| PENDING,
|
| OK,
|
| NOT_ENOUGH_DATA,
|
| - ABROTED,
|
| + ABORTED,
|
| EOS
|
| };
|
|
|
| void ExpectReadResult(CallbackResult result) {
|
| switch (result) {
|
| case PENDING:
|
| - EXPECT_TRUE(is_decode_pending_);
|
| - ASSERT_FALSE(frame_decoded_);
|
| + EXPECT_GT(pending_decode_requests_, 0);
|
| break;
|
| case OK:
|
| - EXPECT_FALSE(is_decode_pending_);
|
| - ASSERT_EQ(VideoDecoder::kOk, decode_status_);
|
| - ASSERT_TRUE(frame_decoded_);
|
| - EXPECT_FALSE(frame_decoded_->end_of_stream());
|
| + EXPECT_EQ(0, pending_decode_requests_);
|
| + ASSERT_EQ(VideoDecoder::kOk, last_decode_status_);
|
| + ASSERT_TRUE(last_decoded_frame_);
|
| + EXPECT_FALSE(last_decoded_frame_->end_of_stream());
|
| break;
|
| case NOT_ENOUGH_DATA:
|
| - EXPECT_FALSE(is_decode_pending_);
|
| - ASSERT_EQ(VideoDecoder::kNotEnoughData, decode_status_);
|
| - ASSERT_FALSE(frame_decoded_);
|
| + EXPECT_EQ(0, pending_decode_requests_);
|
| + ASSERT_EQ(VideoDecoder::kNotEnoughData, last_decode_status_);
|
| + ASSERT_FALSE(last_decoded_frame_);
|
| break;
|
| - case ABROTED:
|
| - EXPECT_FALSE(is_decode_pending_);
|
| - ASSERT_EQ(VideoDecoder::kOk, decode_status_);
|
| - EXPECT_FALSE(frame_decoded_);
|
| + case ABORTED:
|
| + EXPECT_EQ(0, pending_decode_requests_);
|
| + ASSERT_EQ(VideoDecoder::kAborted, last_decode_status_);
|
| + EXPECT_FALSE(last_decoded_frame_);
|
| break;
|
| case EOS:
|
| - EXPECT_FALSE(is_decode_pending_);
|
| - ASSERT_EQ(VideoDecoder::kOk, decode_status_);
|
| - ASSERT_TRUE(frame_decoded_);
|
| - EXPECT_TRUE(frame_decoded_->end_of_stream());
|
| + EXPECT_EQ(0, pending_decode_requests_);
|
| + ASSERT_EQ(VideoDecoder::kOk, last_decode_status_);
|
| + ASSERT_TRUE(last_decoded_frame_);
|
| + EXPECT_TRUE(last_decoded_frame_->end_of_stream());
|
| break;
|
| }
|
| }
|
| @@ -118,9 +117,7 @@ class FakeVideoDecoderTest : public testing::Test {
|
| buffer = DecoderBuffer::CreateEOSBuffer();
|
| }
|
|
|
| - decode_status_ = VideoDecoder::kDecodeError;
|
| - frame_decoded_ = NULL;
|
| - is_decode_pending_ = true;
|
| + ++pending_decode_requests_;
|
|
|
| decoder_->Decode(
|
| buffer,
|
| @@ -131,20 +128,20 @@ class FakeVideoDecoderTest : public testing::Test {
|
| void ReadOneFrame() {
|
| do {
|
| Decode();
|
| - } while (decode_status_ == VideoDecoder::kNotEnoughData &&
|
| - !is_decode_pending_);
|
| + } while (last_decode_status_ == VideoDecoder::kNotEnoughData &&
|
| + pending_decode_requests_ == 0);
|
| }
|
|
|
| void ReadUntilEOS() {
|
| do {
|
| ReadOneFrame();
|
| - } while (frame_decoded_ && !frame_decoded_->end_of_stream());
|
| + } while (last_decoded_frame_ && !last_decoded_frame_->end_of_stream());
|
| }
|
|
|
| void EnterPendingReadState() {
|
| // Pass the initial NOT_ENOUGH_DATA stage.
|
| ReadOneFrame();
|
| - decoder_->HoldNextDecode();
|
| + decoder_->HoldDecode();
|
| ReadOneFrame();
|
| ExpectReadResult(PENDING);
|
| }
|
| @@ -202,7 +199,7 @@ class FakeVideoDecoderTest : public testing::Test {
|
| message_loop_.RunUntilIdle();
|
|
|
| // All pending callbacks must have been fired.
|
| - DCHECK(!is_decode_pending_);
|
| + DCHECK_EQ(pending_decode_requests_, 0);
|
| DCHECK(!is_reset_pending_);
|
| }
|
|
|
| @@ -215,26 +212,33 @@ class FakeVideoDecoderTest : public testing::Test {
|
| int num_decoded_frames_;
|
|
|
| // Callback result/status.
|
| - VideoDecoder::Status decode_status_;
|
| - scoped_refptr<VideoFrame> frame_decoded_;
|
| - bool is_decode_pending_;
|
| + VideoDecoder::Status last_decode_status_;
|
| + scoped_refptr<VideoFrame> last_decoded_frame_;
|
| + int pending_decode_requests_;
|
| bool is_reset_pending_;
|
|
|
| private:
|
| DISALLOW_COPY_AND_ASSIGN(FakeVideoDecoderTest);
|
| };
|
|
|
| -TEST_F(FakeVideoDecoderTest, Initialize) {
|
| +INSTANTIATE_TEST_CASE_P(NoParallelDecode,
|
| + FakeVideoDecoderTest,
|
| + ::testing::Values(1));
|
| +INSTANTIATE_TEST_CASE_P(ParallelDecode,
|
| + FakeVideoDecoderTest,
|
| + ::testing::Values(3));
|
| +
|
| +TEST_P(FakeVideoDecoderTest, Initialize) {
|
| Initialize();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Read_AllFrames) {
|
| +TEST_P(FakeVideoDecoderTest, Read_AllFrames) {
|
| Initialize();
|
| ReadUntilEOS();
|
| EXPECT_EQ(kTotalBuffers, num_decoded_frames_);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Read_DecodingDelay) {
|
| +TEST_P(FakeVideoDecoderTest, Read_DecodingDelay) {
|
| Initialize();
|
|
|
| while (num_input_buffers_ < kTotalBuffers) {
|
| @@ -243,8 +247,8 @@ TEST_F(FakeVideoDecoderTest, Read_DecodingDelay) {
|
| }
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Read_ZeroDelay) {
|
| - decoder_.reset(new FakeVideoDecoder(0, false));
|
| +TEST_P(FakeVideoDecoderTest, Read_ZeroDelay) {
|
| + decoder_.reset(new FakeVideoDecoder(0, false, 1));
|
| Initialize();
|
|
|
| while (num_input_buffers_ < kTotalBuffers) {
|
| @@ -253,22 +257,56 @@ TEST_F(FakeVideoDecoderTest, Read_ZeroDelay) {
|
| }
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Read_Pending_NotEnoughData) {
|
| +TEST_P(FakeVideoDecoderTest, Read_Pending_NotEnoughData) {
|
| Initialize();
|
| - decoder_->HoldNextDecode();
|
| + decoder_->HoldDecode();
|
| ReadOneFrame();
|
| ExpectReadResult(PENDING);
|
| SatisfyReadAndExpect(NOT_ENOUGH_DATA);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Read_Pending_OK) {
|
| +TEST_P(FakeVideoDecoderTest, Read_Pending_OK) {
|
| Initialize();
|
| ReadOneFrame();
|
| EnterPendingReadState();
|
| SatisfyReadAndExpect(OK);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Reinitialize) {
|
| +TEST_P(FakeVideoDecoderTest, Read_Parallel) {
|
| + int max_decode_requests = GetParam();
|
| + if (max_decode_requests < 2)
|
| + return;
|
| +
|
| + Initialize();
|
| + ReadOneFrame();
|
| + decoder_->HoldDecode();
|
| + for (int i = 0; i < max_decode_requests; ++i) {
|
| + ReadOneFrame();
|
| + ExpectReadResult(PENDING);
|
| + }
|
| + EXPECT_EQ(max_decode_requests, pending_decode_requests_);
|
| + SatisfyReadAndExpect(OK);
|
| +}
|
| +
|
| +TEST_P(FakeVideoDecoderTest, ReadWithHold_DecodingDelay) {
|
| + Initialize();
|
| +
|
| + // Hold all decodes and satisfy one decode at a time.
|
| + decoder_->HoldDecode();
|
| + int num_decodes_satisfied = 0;
|
| + while (num_decoded_frames_ == 0) {
|
| + while (pending_decode_requests_ < decoder_->GetMaxDecodeRequests())
|
| + Decode();
|
| + decoder_->SatisfySingleDecode();
|
| + ++num_decodes_satisfied;
|
| + message_loop_.RunUntilIdle();
|
| + }
|
| +
|
| + DCHECK_EQ(num_decoded_frames_, 1);
|
| + DCHECK_EQ(num_decodes_satisfied, kDecodingDelay + 1);
|
| +}
|
| +
|
| +TEST_P(FakeVideoDecoderTest, Reinitialize) {
|
| Initialize();
|
| ReadOneFrame();
|
| InitializeWithConfig(TestVideoConfig::Large());
|
| @@ -277,7 +315,7 @@ TEST_F(FakeVideoDecoderTest, Reinitialize) {
|
|
|
| // Reinitializing the decoder during the middle of the decoding process can
|
| // cause dropped frames.
|
| -TEST_F(FakeVideoDecoderTest, Reinitialize_FrameDropped) {
|
| +TEST_P(FakeVideoDecoderTest, Reinitialize_FrameDropped) {
|
| Initialize();
|
| ReadOneFrame();
|
| Initialize();
|
| @@ -285,66 +323,66 @@ TEST_F(FakeVideoDecoderTest, Reinitialize_FrameDropped) {
|
| EXPECT_LT(num_decoded_frames_, kTotalBuffers);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Reset) {
|
| +TEST_P(FakeVideoDecoderTest, Reset) {
|
| Initialize();
|
| ReadOneFrame();
|
| ResetAndExpect(OK);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Reset_DuringPendingRead) {
|
| +TEST_P(FakeVideoDecoderTest, Reset_DuringPendingRead) {
|
| Initialize();
|
| EnterPendingReadState();
|
| ResetAndExpect(PENDING);
|
| - SatisfyRead();
|
| + SatisfyReadAndExpect(ABORTED);
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Reset_Pending) {
|
| +TEST_P(FakeVideoDecoderTest, Reset_Pending) {
|
| Initialize();
|
| EnterPendingResetState();
|
| SatisfyReset();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Reset_PendingDuringPendingRead) {
|
| +TEST_P(FakeVideoDecoderTest, Reset_PendingDuringPendingRead) {
|
| Initialize();
|
| EnterPendingReadState();
|
| EnterPendingResetState();
|
| - SatisfyRead();
|
| + SatisfyReadAndExpect(ABORTED);
|
| SatisfyReset();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Stop) {
|
| +TEST_P(FakeVideoDecoderTest, Stop) {
|
| Initialize();
|
| ReadOneFrame();
|
| ExpectReadResult(OK);
|
| Stop();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Stop_DuringPendingInitialization) {
|
| +TEST_P(FakeVideoDecoderTest, Stop_DuringPendingInitialization) {
|
| EnterPendingInitState();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Stop_DuringPendingRead) {
|
| +TEST_P(FakeVideoDecoderTest, Stop_DuringPendingRead) {
|
| Initialize();
|
| EnterPendingReadState();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Stop_DuringPendingReset) {
|
| +TEST_P(FakeVideoDecoderTest, Stop_DuringPendingReset) {
|
| Initialize();
|
| EnterPendingResetState();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, Stop_DuringPendingReadAndPendingReset) {
|
| +TEST_P(FakeVideoDecoderTest, Stop_DuringPendingReadAndPendingReset) {
|
| Initialize();
|
| EnterPendingReadState();
|
| EnterPendingResetState();
|
| Stop();
|
| }
|
|
|
| -TEST_F(FakeVideoDecoderTest, GetDecodeOutput) {
|
| - decoder_.reset(new FakeVideoDecoder(kDecodingDelay, true));
|
| +TEST_P(FakeVideoDecoderTest, GetDecodeOutput) {
|
| + decoder_.reset(new FakeVideoDecoder(kDecodingDelay, true, 1));
|
| Initialize();
|
|
|
| while (num_input_buffers_ < kTotalBuffers) {
|
|
|