Chromium Code Reviews| Index: media/filters/ffmpeg_video_decoder_unittest.cc |
| diff --git a/media/filters/ffmpeg_video_decoder_unittest.cc b/media/filters/ffmpeg_video_decoder_unittest.cc |
| index b111ac38a8435d17f1e2c4133155932e06d616fc..7519f647cd15e15f6ca297785e1404e13a8c78f6 100644 |
| --- a/media/filters/ffmpeg_video_decoder_unittest.cc |
| +++ b/media/filters/ffmpeg_video_decoder_unittest.cc |
| @@ -13,7 +13,6 @@ |
| #include "media/base/filters.h" |
| #include "media/base/limits.h" |
| #include "media/base/mock_callback.h" |
| -#include "media/base/mock_filter_host.h" |
| #include "media/base/mock_filters.h" |
| #include "media/base/test_data_util.h" |
| #include "media/base/video_frame.h" |
| @@ -56,8 +55,6 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| base::Unretained(this))) { |
| CHECK(FFmpegGlue::GetInstance()); |
| - decoder_->set_host(&host_); |
| - |
| // Initialize various test buffers. |
| frame_buffer_.reset(new uint8[kCodedSize.GetArea()]); |
| end_of_stream_buffer_ = new DataBuffer(0); |
| @@ -120,19 +117,23 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| // decoding state. |
| void EnterDecodingState() { |
| scoped_refptr<VideoFrame> video_frame; |
| - DecodeSingleFrame(i_frame_buffer_, &video_frame); |
| + VideoDecoder::Status status; |
| + DecodeSingleFrame(i_frame_buffer_, &video_frame, &status); |
| ASSERT_TRUE(video_frame); |
| EXPECT_FALSE(video_frame->IsEndOfStream()); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
|
Ami GONE FROM CHROMIUM
2012/04/27 16:49:14
order should be: actual,expected
(to match thousan
xhwang
2012/04/27 23:22:30
Done.
|
| } |
| // Sets up expectations and actions to put FFmpegVideoDecoder in an end |
| // of stream state. |
| void EnterEndOfStreamState() { |
| scoped_refptr<VideoFrame> video_frame; |
| - Read(&video_frame); |
| + VideoDecoder::Status status; |
| + Read(&video_frame, &status); |
| ASSERT_TRUE(video_frame); |
| EXPECT_TRUE(video_frame->IsEndOfStream()); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
| } |
| // Decodes the single compressed frame in |buffer| and writes the |
| @@ -140,14 +141,15 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| // and multithreaded decoders. End of stream buffers are used to trigger |
| // the frame to be returned in the multithreaded decoder case. |
| void DecodeSingleFrame(const scoped_refptr<Buffer>& buffer, |
| - scoped_refptr<VideoFrame>* video_frame) { |
| + scoped_refptr<VideoFrame>* video_frame, |
| + VideoDecoder::Status* status) { |
| EXPECT_CALL(*demuxer_, Read(_)) |
| .WillOnce(ReturnBuffer(buffer)) |
| .WillRepeatedly(ReturnBuffer(end_of_stream_buffer_)); |
| EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| - Read(video_frame); |
| + Read(video_frame, status); |
| } |
| // Decodes |i_frame_buffer_| and then decodes the data contained in |
| @@ -160,6 +162,8 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| scoped_refptr<VideoFrame> video_frame_a; |
| scoped_refptr<VideoFrame> video_frame_b; |
| + VideoDecoder::Status status_a; |
| + VideoDecoder::Status status_b; |
| scoped_refptr<Buffer> buffer; |
| ReadTestDataFile(test_file_name, &buffer); |
| @@ -172,8 +176,8 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| EXPECT_CALL(statistics_cb_, OnStatistics(_)) |
| .Times(2); |
| - Read(&video_frame_a); |
| - Read(&video_frame_b); |
| + Read(&video_frame_a, &status_a); |
| + Read(&video_frame_b, &status_b); |
| size_t original_width = static_cast<size_t>(kVisibleRect.width()); |
| size_t original_height = static_cast<size_t>(kVisibleRect.height()); |
| @@ -184,24 +188,27 @@ class FFmpegVideoDecoderTest : public testing::Test { |
| EXPECT_EQ(original_height, video_frame_a->height()); |
| EXPECT_EQ(expected_width, video_frame_b->width()); |
| EXPECT_EQ(expected_height, video_frame_b->height()); |
| + EXPECT_EQ(VideoDecoder::kOk, status_a); |
| + EXPECT_EQ(VideoDecoder::kOk, status_b); |
| } |
| - void Read(scoped_refptr<VideoFrame>* video_frame) { |
| - EXPECT_CALL(*this, FrameReady(_)) |
| - .WillOnce(SaveArg<0>(video_frame)); |
| + void Read(scoped_refptr<VideoFrame>* video_frame, |
| + VideoDecoder::Status* status) { |
| + EXPECT_CALL(*this, FrameReady(_, _)) |
| + .WillOnce(DoAll(SaveArg<0>(video_frame), SaveArg<1>(status))); |
| decoder_->Read(read_cb_); |
| message_loop_.RunAllPending(); |
| } |
| - MOCK_METHOD1(FrameReady, void(scoped_refptr<VideoFrame>)); |
| + MOCK_METHOD2(FrameReady, void(scoped_refptr<VideoFrame>, |
| + VideoDecoder::Status)); |
| MessageLoop message_loop_; |
| scoped_refptr<FFmpegVideoDecoder> decoder_; |
| scoped_refptr<StrictMock<MockDemuxerStream> > demuxer_; |
| MockStatisticsCB statistics_cb_; |
| - StrictMock<MockFilterHost> host_; |
| VideoDecoderConfig config_; |
| VideoDecoder::ReadCB read_cb_; |
| @@ -262,10 +269,12 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_Normal) { |
| // Simulate decoding a single frame. |
| scoped_refptr<VideoFrame> video_frame; |
| - DecodeSingleFrame(i_frame_buffer_, &video_frame); |
| + VideoDecoder::Status status; |
| + DecodeSingleFrame(i_frame_buffer_, &video_frame, &status); |
| ASSERT_TRUE(video_frame); |
| EXPECT_FALSE(video_frame->IsEndOfStream()); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
| } |
| // Verify current behavior for 0 byte frames. FFmpeg simply ignores |
| @@ -278,6 +287,9 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_0ByteFrame) { |
| scoped_refptr<VideoFrame> video_frame_a; |
| scoped_refptr<VideoFrame> video_frame_b; |
| scoped_refptr<VideoFrame> video_frame_c; |
| + VideoDecoder::Status status_a; |
| + VideoDecoder::Status status_b; |
| + VideoDecoder::Status status_c; |
| EXPECT_CALL(*demuxer_, Read(_)) |
| .WillOnce(ReturnBuffer(i_frame_buffer_)) |
| @@ -288,9 +300,9 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_0ByteFrame) { |
| EXPECT_CALL(statistics_cb_, OnStatistics(_)) |
| .Times(2); |
| - Read(&video_frame_a); |
| - Read(&video_frame_b); |
| - Read(&video_frame_c); |
| + Read(&video_frame_a, &status_a); |
| + Read(&video_frame_b, &status_b); |
| + Read(&video_frame_c, &status_c); |
| ASSERT_TRUE(video_frame_a); |
| ASSERT_TRUE(video_frame_b); |
| @@ -299,6 +311,10 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_0ByteFrame) { |
| EXPECT_FALSE(video_frame_a->IsEndOfStream()); |
| EXPECT_FALSE(video_frame_b->IsEndOfStream()); |
| EXPECT_TRUE(video_frame_c->IsEndOfStream()); |
| + |
| + EXPECT_EQ(VideoDecoder::kOk, status_a); |
| + EXPECT_EQ(VideoDecoder::kOk, status_b); |
| + EXPECT_EQ(VideoDecoder::kOk, status_c); |
| } |
| TEST_F(FFmpegVideoDecoderTest, DecodeFrame_DecodeError) { |
| @@ -312,14 +328,14 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_DecodeError) { |
| // least one successful decode but we don't expect FrameReady() to be |
| // executed as an error is raised instead. |
| EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| - EXPECT_CALL(host_, SetError(PIPELINE_ERROR_DECODE)); |
| // Our read should still get satisfied with end of stream frame during an |
| // error. |
| scoped_refptr<VideoFrame> video_frame; |
| - Read(&video_frame); |
| - ASSERT_TRUE(video_frame); |
| - EXPECT_TRUE(video_frame->IsEndOfStream()); |
| + VideoDecoder::Status status; |
| + Read(&video_frame, &status); |
| + EXPECT_FALSE(video_frame); |
| + EXPECT_EQ(VideoDecoder::kDecodeError, status); |
| message_loop_.RunAllPending(); |
| } |
| @@ -333,10 +349,12 @@ TEST_F(FFmpegVideoDecoderTest, DecodeFrame_DecodeErrorAtEndOfStream) { |
| Initialize(); |
| scoped_refptr<VideoFrame> video_frame; |
| - DecodeSingleFrame(corrupt_i_frame_buffer_, &video_frame); |
| + VideoDecoder::Status status; |
| + DecodeSingleFrame(corrupt_i_frame_buffer_, &video_frame, &status); |
| ASSERT_TRUE(video_frame); |
| EXPECT_TRUE(video_frame->IsEndOfStream()); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
| } |
| // Decode |i_frame_buffer_| and then a frame with a larger width and verify |
| @@ -372,10 +390,12 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_Normal) { |
| encrypted_i_frame_buffer_->SetDecryptConfig(scoped_ptr<DecryptConfig>( |
| new DecryptConfig(kKeyId, arraysize(kKeyId) - 1))); |
| scoped_refptr<VideoFrame> video_frame; |
| - DecodeSingleFrame(encrypted_i_frame_buffer_, &video_frame); |
| + VideoDecoder::Status status; |
| + DecodeSingleFrame(encrypted_i_frame_buffer_, &video_frame, &status); |
| ASSERT_TRUE(video_frame); |
| EXPECT_FALSE(video_frame->IsEndOfStream()); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
| } |
| // No key is provided to the decryptor and we expect to see a decrypt error. |
| @@ -388,14 +408,14 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_NoKey) { |
| EXPECT_CALL(*demuxer_, Read(_)) |
| .WillRepeatedly(ReturnBuffer(encrypted_i_frame_buffer_)); |
| - EXPECT_CALL(host_, SetError(PIPELINE_ERROR_DECRYPT)); |
| // Our read should still get satisfied with end of stream frame during an |
| // error. |
| scoped_refptr<VideoFrame> video_frame; |
| - Read(&video_frame); |
| - ASSERT_TRUE(video_frame); |
| - EXPECT_TRUE(video_frame->IsEndOfStream()); |
| + VideoDecoder::Status status; |
| + Read(&video_frame, &status); |
| + EXPECT_FALSE(video_frame); |
| + EXPECT_EQ(VideoDecoder::kDecryptError, status); |
| message_loop_.RunAllPending(); |
| } |
| @@ -416,17 +436,19 @@ TEST_F(FFmpegVideoDecoderTest, DecodeEncryptedFrame_WrongKey) { |
| // attempts to decode the content, however we're unable to distinguish between |
| // the two (see http://crbug.com/124434). |
| EXPECT_CALL(statistics_cb_, OnStatistics(_)); |
| - EXPECT_CALL(host_, SetError(PIPELINE_ERROR_DECODE)); |
| -#else |
| - EXPECT_CALL(host_, SetError(PIPELINE_ERROR_DECRYPT)); |
| #endif |
| // Our read should still get satisfied with end of stream frame during an |
| // error. |
| scoped_refptr<VideoFrame> video_frame; |
| - Read(&video_frame); |
| - ASSERT_TRUE(video_frame); |
| - EXPECT_TRUE(video_frame->IsEndOfStream()); |
| + VideoDecoder::Status status; |
| + Read(&video_frame, &status); |
| + EXPECT_FALSE(video_frame); |
| +#if defined(OS_LINUX) |
| + EXPECT_EQ(VideoDecoder::kDecodeError, status); |
| +#else |
| + EXPECT_EQ(VideoDecoder::kDecryptError, status); |
| +#endif |
| message_loop_.RunAllPending(); |
| } |
| @@ -491,7 +513,8 @@ TEST_F(FFmpegVideoDecoderTest, Flush_DuringPendingRead) { |
| // Flush the decoder. |
| Flush(); |
| - EXPECT_CALL(*this, FrameReady(scoped_refptr<VideoFrame>())); |
| + EXPECT_CALL(*this, FrameReady(scoped_refptr<VideoFrame>(), |
| + VideoDecoder::kOk)); |
| read_cb.Run(i_frame_buffer_); |
| message_loop_.RunAllPending(); |
| @@ -549,8 +572,11 @@ TEST_F(FFmpegVideoDecoderTest, AbortPendingRead) { |
| .WillOnce(ReturnBuffer(scoped_refptr<Buffer>())); |
| scoped_refptr<VideoFrame> video_frame; |
| - Read(&video_frame); |
| + VideoDecoder::Status status; |
| + |
| + Read(&video_frame, &status); |
| EXPECT_FALSE(video_frame); |
| + EXPECT_EQ(VideoDecoder::kOk, status); |
| } |
| // Test aborted read on the demuxer stream. |
| @@ -576,7 +602,7 @@ TEST_F(FFmpegVideoDecoderTest, AbortPendingReadDuringFlush) { |
| // Make sure we get a NULL video frame returned. |
| scoped_refptr<VideoFrame> video_frame; |
| - EXPECT_CALL(*this, FrameReady(_)) |
| + EXPECT_CALL(*this, FrameReady(_, VideoDecoder::kOk)) |
| .WillOnce(SaveArg<0>(&video_frame)); |
| message_loop_.RunAllPending(); |