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 fc1cb14adc668df9a71d9084b5a42b46f40788fb..9bd62b184203b1637769e12b168fa9b0407f157e 100644 |
--- a/media/filters/fake_video_decoder_unittest.cc |
+++ b/media/filters/fake_video_decoder_unittest.cc |
@@ -9,25 +9,23 @@ |
#include "media/base/mock_filters.h" |
#include "media/base/test_helpers.h" |
#include "media/base/video_frame.h" |
-#include "media/filters/fake_demuxer_stream.h" |
#include "media/filters/fake_video_decoder.h" |
#include "testing/gtest/include/gtest/gtest.h" |
namespace media { |
static const int kDecodingDelay = 9; |
-static const int kNumConfigs = 3; |
-static const int kNumBuffersInOneConfig = 9; |
-static const int kNumInputBuffers = kNumConfigs * kNumBuffersInOneConfig; |
+static const int kTotalBuffers = 12; |
+static const int kDurationMs = 30; |
class FakeVideoDecoderTest : public testing::Test { |
public: |
FakeVideoDecoderTest() |
: decoder_(new FakeVideoDecoder(kDecodingDelay)), |
- demuxer_stream_( |
- new FakeDemuxerStream(kNumConfigs, kNumBuffersInOneConfig, false)), |
+ num_input_buffers_(0), |
num_decoded_frames_(0), |
- is_read_pending_(false), |
+ decode_status_(VideoDecoder::kNotEnoughData), |
+ is_decode_pending_(false), |
is_reset_pending_(false), |
is_stop_pending_(false) {} |
@@ -35,12 +33,17 @@ class FakeVideoDecoderTest : public testing::Test { |
StopAndExpect(OK); |
} |
- void Initialize() { |
- decoder_->Initialize(demuxer_stream_.get(), |
+ void InitializeWithConfig(const VideoDecoderConfig& config) { |
+ decoder_->Initialize(config, |
NewExpectedStatusCB(PIPELINE_OK), |
base::Bind(&MockStatisticsCB::OnStatistics, |
base::Unretained(&statistics_cb_))); |
message_loop_.RunUntilIdle(); |
+ current_config_ = config; |
+ } |
+ |
+ void Initialize() { |
+ InitializeWithConfig(TestVideoConfig::Normal()); |
} |
void EnterPendingInitState() { |
@@ -56,19 +59,21 @@ class FakeVideoDecoderTest : public testing::Test { |
// Callback for VideoDecoder::Read(). |
void FrameReady(VideoDecoder::Status status, |
const scoped_refptr<VideoFrame>& frame) { |
- DCHECK(is_read_pending_); |
- ASSERT_EQ(VideoDecoder::kOk, status); |
- |
- is_read_pending_ = false; |
- frame_read_ = frame; |
- |
- if (frame.get() && !frame->IsEndOfStream()) |
+ DCHECK(is_decode_pending_); |
+ ASSERT_TRUE(status == VideoDecoder::kOk || |
+ status == VideoDecoder::kNotEnoughData); |
+ is_decode_pending_ = false; |
+ decode_status_ = status; |
+ frame_decoded_ = frame; |
+ |
+ if (frame && !frame->IsEndOfStream()) |
num_decoded_frames_++; |
} |
enum CallbackResult { |
PENDING, |
OK, |
+ NOT_ENOUGH_DATA, |
ABROTED, |
EOS |
}; |
@@ -76,50 +81,86 @@ class FakeVideoDecoderTest : public testing::Test { |
void ExpectReadResult(CallbackResult result) { |
switch (result) { |
case PENDING: |
- EXPECT_TRUE(is_read_pending_); |
- ASSERT_FALSE(frame_read_.get()); |
+ EXPECT_TRUE(is_decode_pending_); |
+ ASSERT_FALSE(frame_decoded_); |
break; |
case OK: |
- EXPECT_FALSE(is_read_pending_); |
- ASSERT_TRUE(frame_read_.get()); |
- EXPECT_FALSE(frame_read_->IsEndOfStream()); |
+ EXPECT_FALSE(is_decode_pending_); |
+ ASSERT_EQ(VideoDecoder::kOk, decode_status_); |
+ ASSERT_TRUE(frame_decoded_); |
+ EXPECT_FALSE(frame_decoded_->IsEndOfStream()); |
+ break; |
+ case NOT_ENOUGH_DATA: |
+ EXPECT_FALSE(is_decode_pending_); |
+ ASSERT_EQ(VideoDecoder::kNotEnoughData, decode_status_); |
+ ASSERT_FALSE(frame_decoded_); |
break; |
case ABROTED: |
- EXPECT_FALSE(is_read_pending_); |
- EXPECT_FALSE(frame_read_.get()); |
+ EXPECT_FALSE(is_decode_pending_); |
+ ASSERT_EQ(VideoDecoder::kOk, decode_status_); |
+ EXPECT_FALSE(frame_decoded_); |
break; |
case EOS: |
- EXPECT_FALSE(is_read_pending_); |
- ASSERT_TRUE(frame_read_.get()); |
- EXPECT_TRUE(frame_read_->IsEndOfStream()); |
+ EXPECT_FALSE(is_decode_pending_); |
+ ASSERT_EQ(VideoDecoder::kOk, decode_status_); |
+ ASSERT_TRUE(frame_decoded_); |
+ EXPECT_TRUE(frame_decoded_->IsEndOfStream()); |
break; |
} |
} |
- void ReadOneFrame() { |
- frame_read_ = NULL; |
- is_read_pending_ = true; |
- decoder_->Read( |
+ void Decode() { |
+ scoped_refptr<DecoderBuffer> buffer; |
+ |
+ if (num_input_buffers_ < kTotalBuffers) { |
+ buffer = CreateFakeVideoBufferForTest( |
+ current_config_, |
+ base::TimeDelta::FromMilliseconds(kDurationMs * num_input_buffers_), |
+ base::TimeDelta::FromMilliseconds(kDurationMs)); |
+ num_input_buffers_++; |
+ } else { |
+ buffer = DecoderBuffer::CreateEOSBuffer(); |
+ } |
+ |
+ decode_status_ = VideoDecoder::kDecodeError; |
+ frame_decoded_ = NULL; |
+ is_decode_pending_ = true; |
+ |
+ decoder_->Decode( |
+ buffer, |
base::Bind(&FakeVideoDecoderTest::FrameReady, base::Unretained(this))); |
message_loop_.RunUntilIdle(); |
} |
+ void ReadOneFrame() { |
+ do { |
+ Decode(); |
+ } while (decode_status_ == VideoDecoder::kNotEnoughData && |
+ !is_decode_pending_); |
+ } |
+ |
void ReadUntilEOS() { |
do { |
ReadOneFrame(); |
- } while (frame_read_.get() && !frame_read_->IsEndOfStream()); |
+ } while (frame_decoded_ && !frame_decoded_->IsEndOfStream()); |
} |
void EnterPendingReadState() { |
+ // Pass the initial NOT_ENOUGH_DATA stage. |
+ ReadOneFrame(); |
decoder_->HoldNextRead(); |
ReadOneFrame(); |
ExpectReadResult(PENDING); |
} |
- void SatisfyRead() { |
+ void SatisfyReadAndExpect(CallbackResult result) { |
decoder_->SatisfyRead(); |
message_loop_.RunUntilIdle(); |
- ExpectReadResult(OK); |
+ ExpectReadResult(result); |
+ } |
+ |
+ void SatisfyRead() { |
+ SatisfyReadAndExpect(OK); |
} |
// Callback for VideoDecoder::Reset(). |
@@ -198,49 +239,19 @@ class FakeVideoDecoderTest : public testing::Test { |
ExpectStopResult(OK); |
} |
- // Callback for DemuxerStream::Read so that we can skip frames to trigger a |
- // config change. |
- void BufferReady(bool* config_changed, |
- DemuxerStream::Status status, |
- const scoped_refptr<DecoderBuffer>& buffer) { |
- if (status == DemuxerStream::kConfigChanged) |
- *config_changed = true; |
- } |
- |
- void ChangeConfig() { |
- bool config_changed = false; |
- while (!config_changed) { |
- demuxer_stream_->Read(base::Bind(&FakeVideoDecoderTest::BufferReady, |
- base::Unretained(this), |
- &config_changed)); |
- message_loop_.RunUntilIdle(); |
- } |
- } |
- |
- void EnterPendingDemuxerReadState() { |
- demuxer_stream_->HoldNextRead(); |
- ReadOneFrame(); |
- } |
- |
- void SatisfyDemuxerRead() { |
- demuxer_stream_->SatisfyRead(); |
- message_loop_.RunUntilIdle(); |
- } |
- |
- void AbortDemuxerRead() { |
- demuxer_stream_->Reset(); |
- message_loop_.RunUntilIdle(); |
- } |
- |
base::MessageLoop message_loop_; |
+ VideoDecoderConfig current_config_; |
+ |
scoped_ptr<FakeVideoDecoder> decoder_; |
- scoped_ptr<FakeDemuxerStream> demuxer_stream_; |
MockStatisticsCB statistics_cb_; |
+ |
+ int num_input_buffers_; |
int num_decoded_frames_; |
// Callback result/status. |
- scoped_refptr<VideoFrame> frame_read_; |
- bool is_read_pending_; |
+ VideoDecoder::Status decode_status_; |
+ scoped_refptr<VideoFrame> frame_decoded_; |
+ bool is_decode_pending_; |
bool is_reset_pending_; |
bool is_stop_pending_; |
@@ -255,24 +266,15 @@ TEST_F(FakeVideoDecoderTest, Initialize) { |
TEST_F(FakeVideoDecoderTest, Read_AllFrames) { |
Initialize(); |
ReadUntilEOS(); |
- EXPECT_EQ(kNumInputBuffers, num_decoded_frames_); |
-} |
- |
-TEST_F(FakeVideoDecoderTest, Read_AbortedDemuxerRead) { |
- Initialize(); |
- demuxer_stream_->HoldNextRead(); |
- ReadOneFrame(); |
- AbortDemuxerRead(); |
- ExpectReadResult(ABROTED); |
+ EXPECT_EQ(kTotalBuffers, num_decoded_frames_); |
} |
TEST_F(FakeVideoDecoderTest, Read_DecodingDelay) { |
Initialize(); |
- while (demuxer_stream_->num_buffers_returned() < kNumInputBuffers) { |
+ while (num_input_buffers_ < kTotalBuffers) { |
ReadOneFrame(); |
- EXPECT_EQ(demuxer_stream_->num_buffers_returned(), |
- num_decoded_frames_ + kDecodingDelay); |
+ EXPECT_EQ(num_input_buffers_, num_decoded_frames_ + kDecodingDelay); |
} |
} |
@@ -280,25 +282,32 @@ TEST_F(FakeVideoDecoderTest, Read_ZeroDelay) { |
decoder_.reset(new FakeVideoDecoder(0)); |
Initialize(); |
- while (demuxer_stream_->num_buffers_returned() < kNumInputBuffers) { |
+ while (num_input_buffers_ < kTotalBuffers) { |
ReadOneFrame(); |
- EXPECT_EQ(demuxer_stream_->num_buffers_returned(), num_decoded_frames_); |
+ EXPECT_EQ(num_input_buffers_, num_decoded_frames_); |
} |
} |
-TEST_F(FakeVideoDecoderTest, Read_Pending) { |
+TEST_F(FakeVideoDecoderTest, Read_Pending_NotEnoughData) { |
Initialize(); |
+ decoder_->HoldNextRead(); |
+ ReadOneFrame(); |
+ ExpectReadResult(PENDING); |
+ SatisfyReadAndExpect(NOT_ENOUGH_DATA); |
+} |
+ |
+TEST_F(FakeVideoDecoderTest, Read_Pending_OK) { |
+ Initialize(); |
+ ReadOneFrame(); |
EnterPendingReadState(); |
- SatisfyRead(); |
+ SatisfyReadAndExpect(OK); |
} |
TEST_F(FakeVideoDecoderTest, Reinitialize) { |
Initialize(); |
- VideoDecoderConfig old_config = demuxer_stream_->video_decoder_config(); |
- ChangeConfig(); |
- VideoDecoderConfig new_config = demuxer_stream_->video_decoder_config(); |
- EXPECT_FALSE(new_config.Matches(old_config)); |
- Initialize(); |
+ ReadOneFrame(); |
+ InitializeWithConfig(TestVideoConfig::Large()); |
+ ReadOneFrame(); |
} |
// Reinitializing the decoder during the middle of the decoding process can |
@@ -308,7 +317,7 @@ TEST_F(FakeVideoDecoderTest, Reinitialize_FrameDropped) { |
ReadOneFrame(); |
Initialize(); |
ReadUntilEOS(); |
- EXPECT_LT(num_decoded_frames_, kNumInputBuffers); |
+ EXPECT_LT(num_decoded_frames_, kTotalBuffers); |
} |
TEST_F(FakeVideoDecoderTest, Reset) { |
@@ -317,22 +326,6 @@ TEST_F(FakeVideoDecoderTest, Reset) { |
ResetAndExpect(OK); |
} |
-TEST_F(FakeVideoDecoderTest, Reset_DuringPendingDemuxerRead) { |
- Initialize(); |
- EnterPendingDemuxerReadState(); |
- ResetAndExpect(PENDING); |
- SatisfyDemuxerRead(); |
- ExpectReadResult(ABROTED); |
-} |
- |
-TEST_F(FakeVideoDecoderTest, Reset_DuringPendingDemuxerRead_Aborted) { |
- Initialize(); |
- EnterPendingDemuxerReadState(); |
- ResetAndExpect(PENDING); |
- AbortDemuxerRead(); |
- ExpectReadResult(ABROTED); |
-} |
- |
TEST_F(FakeVideoDecoderTest, Reset_DuringPendingRead) { |
Initialize(); |
EnterPendingReadState(); |
@@ -368,25 +361,6 @@ TEST_F(FakeVideoDecoderTest, Stop_DuringPendingInitialization) { |
SatisfyStop(); |
} |
-TEST_F(FakeVideoDecoderTest, Stop_DuringPendingDemuxerRead) { |
- Initialize(); |
- EnterPendingDemuxerReadState(); |
- StopAndExpect(PENDING); |
- SatisfyDemuxerRead(); |
- ExpectReadResult(ABROTED); |
-} |
- |
-TEST_F(FakeVideoDecoderTest, Stop_DuringPendingDemuxerRead_Aborted) { |
- Initialize(); |
- EnterPendingDemuxerReadState(); |
- ResetAndExpect(PENDING); |
- StopAndExpect(PENDING); |
- SatisfyDemuxerRead(); |
- ExpectReadResult(ABROTED); |
- ExpectResetResult(OK); |
- ExpectStopResult(OK); |
-} |
- |
TEST_F(FakeVideoDecoderTest, Stop_DuringPendingRead) { |
Initialize(); |
EnterPendingReadState(); |