Index: media/filters/video_decoder_impl_unittest.cc |
diff --git a/media/filters/video_decoder_impl_unittest.cc b/media/filters/video_decoder_impl_unittest.cc |
index 4ab6d65cddef01765ecbe2dae4eb5191eaef9a96..7c321c5f04f057cbc64052c6bffbb1abf3e6b2b8 100644 |
--- a/media/filters/video_decoder_impl_unittest.cc |
+++ b/media/filters/video_decoder_impl_unittest.cc |
@@ -13,6 +13,7 @@ |
#include "media/base/mock_filter_host.h" |
#include "media/base/mock_filters.h" |
#include "media/base/mock_task.h" |
+#include "media/base/video_frame.h" |
#include "media/ffmpeg/ffmpeg_common.h" |
#include "media/filters/ffmpeg_interfaces.h" |
#include "media/filters/ffmpeg_video_decoder.h" |
@@ -49,7 +50,8 @@ class MockFFmpegDemuxerStream : public MockDemuxerStream, |
class MockVideoDecodeEngine : public VideoDecodeEngine { |
public: |
MOCK_METHOD2(Initialize, void(AVStream* stream, Task* done_cb)); |
- MOCK_METHOD4(DecodeFrame, void(Buffer* buffer, AVFrame* yuv_frame, |
+ MOCK_METHOD4(DecodeFrame, void(Buffer* buffer, |
+ scoped_refptr<VideoFrame>* video_frame, |
bool* got_result, Task* done_cb)); |
MOCK_METHOD1(Flush, void(Task* done_cb)); |
MOCK_CONST_METHOD0(state, State()); |
@@ -63,16 +65,17 @@ class DecoderPrivateMock : public VideoDecoderImpl { |
: VideoDecoderImpl(engine) { |
} |
- MOCK_METHOD3(EnqueueVideoFrame, bool(VideoFrame::Format surface_format, |
- const TimeTuple& time, |
- const AVFrame* frame)); |
+ MOCK_METHOD1(EnqueueVideoFrame, |
+ void(const scoped_refptr<VideoFrame>& video_frame)); |
MOCK_METHOD0(EnqueueEmptyFrame, void()); |
- MOCK_METHOD3(CopyPlane, void(size_t plane, const VideoFrame* video_frame, |
+ MOCK_METHOD3(CopyPlane, void(size_t plane, |
+ const scoped_refptr<VideoFrame> video_frame, |
const AVFrame* frame)); |
- MOCK_METHOD4(FindPtsAndDuration, TimeTuple(const AVRational& time_base, |
- const PtsHeap& pts_heap, |
- const TimeTuple& last_pts, |
- const AVFrame* frame)); |
+ MOCK_METHOD4(FindPtsAndDuration, TimeTuple( |
+ const AVRational& time_base, |
+ const PtsHeap& pts_heap, |
+ const TimeTuple& last_pts, |
+ const VideoFrame* frame)); |
MOCK_METHOD0(SignalPipelineError, void()); |
}; |
@@ -110,6 +113,9 @@ class VideoDecoderImplTest : public testing::Test { |
memset(&codec_context_, 0, sizeof(codec_context_)); |
memset(&codec_, 0, sizeof(codec_)); |
memset(&yuv_frame_, 0, sizeof(yuv_frame_)); |
+ base::TimeDelta zero; |
+ VideoFrame::CreateFrame(VideoFrame::YV12, kWidth, kHeight, |
+ zero, zero, &video_frame_); |
stream_.codec = &codec_context_; |
codec_context_.width = kWidth; |
@@ -148,6 +154,7 @@ class VideoDecoderImplTest : public testing::Test { |
AVCodecContext codec_context_; |
AVCodec codec_; |
AVFrame yuv_frame_; |
+ scoped_refptr<VideoFrame> video_frame_; |
StrictMock<MockFFmpeg> mock_ffmpeg_; |
private: |
@@ -262,27 +269,21 @@ TEST_F(VideoDecoderImplTest, FindPtsAndDuration) { |
last_pts.duration = base::TimeDelta::FromMicroseconds(16); |
// Simulate an uninitialized yuv_frame. |
- yuv_frame_.pts = AV_NOPTS_VALUE; |
+ video_frame_->SetTimestamp( |
+ base::TimeDelta::FromMicroseconds(AV_NOPTS_VALUE)); |
VideoDecoderImpl::TimeTuple result_pts = |
- decoder_->FindPtsAndDuration(time_base, pts_heap, last_pts, &yuv_frame_); |
- EXPECT_EQ(116, result_pts.timestamp.InMicroseconds()); |
- EXPECT_EQ(500000, result_pts.duration.InMicroseconds()); |
- |
- // Test that providing no frame has the same result as an uninitialized |
- // frame. |
- result_pts = decoder_->FindPtsAndDuration(time_base, |
- pts_heap, |
- last_pts, |
- NULL); |
+ decoder_->FindPtsAndDuration(time_base, pts_heap, |
+ last_pts, video_frame_.get()); |
EXPECT_EQ(116, result_pts.timestamp.InMicroseconds()); |
EXPECT_EQ(500000, result_pts.duration.InMicroseconds()); |
// Test that having pts == 0 in the frame also behaves like the pts is not |
// provided. This is because FFmpeg set the pts to zero when there is no |
// data for the frame, which means that value is useless to us. |
- yuv_frame_.pts = 0; |
+ video_frame_->SetTimestamp(base::TimeDelta::FromMicroseconds(0)); |
result_pts = |
- decoder_->FindPtsAndDuration(time_base, pts_heap, last_pts, &yuv_frame_); |
+ decoder_->FindPtsAndDuration(time_base, pts_heap, |
+ last_pts, video_frame_.get()); |
EXPECT_EQ(116, result_pts.timestamp.InMicroseconds()); |
EXPECT_EQ(500000, result_pts.duration.InMicroseconds()); |
@@ -291,17 +292,17 @@ TEST_F(VideoDecoderImplTest, FindPtsAndDuration) { |
result_pts = decoder_->FindPtsAndDuration(time_base, |
pts_heap, |
last_pts, |
- &yuv_frame_); |
+ video_frame_.get()); |
EXPECT_EQ(123, result_pts.timestamp.InMicroseconds()); |
EXPECT_EQ(500000, result_pts.duration.InMicroseconds()); |
// Add a pts into the frame and make sure it overrides the timequeue. |
- yuv_frame_.pts = 333; |
- yuv_frame_.repeat_pict = 2; |
+ video_frame_->SetTimestamp(base::TimeDelta::FromMicroseconds(333)); |
+ video_frame_->SetRepeatCount(2); |
result_pts = decoder_->FindPtsAndDuration(time_base, |
pts_heap, |
last_pts, |
- &yuv_frame_); |
+ video_frame_.get()); |
EXPECT_EQ(166500000, result_pts.timestamp.InMicroseconds()); |
EXPECT_EQ(1500000, result_pts.duration.InMicroseconds()); |
} |
@@ -326,40 +327,28 @@ TEST_F(VideoDecoderImplTest, DoDecode_TestStateTransition) { |
EXPECT_CALL(*mock_engine, DecodeFrame(_, _, _,_)) |
.WillOnce(DoAll(SetArgumentPointee<2>(false), |
WithArg<3>(InvokeRunnable()))) |
- .WillOnce(DoAll(SetArgumentPointee<1>(yuv_frame_), |
+ .WillOnce(DoAll(SetArgumentPointee<1>(video_frame_), |
SetArgumentPointee<2>(true), |
WithArg<3>(InvokeRunnable()))) |
.WillOnce(DoAll(SetArgumentPointee<2>(false), |
WithArg<3>(InvokeRunnable()))) |
- .WillOnce(DoAll(SetArgumentPointee<1>(yuv_frame_), |
+ .WillOnce(DoAll(SetArgumentPointee<1>(video_frame_), |
SetArgumentPointee<2>(true), |
WithArg<3>(InvokeRunnable()))) |
- .WillOnce(DoAll(SetArgumentPointee<1>(yuv_frame_), |
+ .WillOnce(DoAll(SetArgumentPointee<1>(video_frame_), |
SetArgumentPointee<2>(true), |
WithArg<3>(InvokeRunnable()))) |
.WillOnce(DoAll(SetArgumentPointee<2>(false), |
WithArg<3>(InvokeRunnable()))); |
- EXPECT_CALL(*mock_engine, GetSurfaceFormat()) |
- .Times(3) |
- .WillRepeatedly(Return(VideoFrame::YV16)); |
EXPECT_CALL(*mock_decoder, FindPtsAndDuration(_, _, _, _)) |
.WillOnce(Return(kTestPts1)) |
.WillOnce(Return(kTestPts2)) |
.WillOnce(Return(kTestPts1)); |
- EXPECT_CALL(*mock_decoder, EnqueueVideoFrame(_, _, _)) |
- .Times(3) |
- .WillRepeatedly(Return(true)); |
+ EXPECT_CALL(*mock_decoder, EnqueueVideoFrame(_)) |
+ .Times(3); |
EXPECT_CALL(*mock_decoder, EnqueueEmptyFrame()) |
.Times(1); |
- // Setup FFmpeg expectations for frame allocations. We do |
- // 6 decodes in this test. |
- EXPECT_CALL(mock_ffmpeg_, AVCodecAllocFrame()) |
- .Times(6) |
- .WillRepeatedly(Return(&yuv_frame_)); |
- EXPECT_CALL(mock_ffmpeg_, AVFree(&yuv_frame_)) |
- .Times(6); |
- |
// Setup callbacks to be executed 6 times. |
TaskMocker done_cb; |
EXPECT_CALL(done_cb, Run()).Times(6); |
@@ -416,37 +405,6 @@ TEST_F(VideoDecoderImplTest, DoDecode_TestStateTransition) { |
EXPECT_TRUE(mock_decoder->pts_heap_.IsEmpty()); |
} |
-TEST_F(VideoDecoderImplTest, DoDecode_EnqueueVideoFrameError) { |
- MockVideoDecodeEngine* mock_engine = new StrictMock<MockVideoDecodeEngine>(); |
- scoped_refptr<DecoderPrivateMock> mock_decoder = |
- new StrictMock<DecoderPrivateMock>(mock_engine); |
- |
- // Setup decoder to decode one frame, but then fail on enqueue. |
- EXPECT_CALL(*mock_engine, DecodeFrame(_, _, _,_)) |
- .WillOnce(DoAll(SetArgumentPointee<1>(yuv_frame_), |
- SetArgumentPointee<2>(true), |
- WithArg<3>(InvokeRunnable()))); |
- EXPECT_CALL(*mock_engine, GetSurfaceFormat()) |
- .WillOnce(Return(VideoFrame::YV16)); |
- EXPECT_CALL(*mock_decoder, FindPtsAndDuration(_, _, _, _)) |
- .WillOnce(Return(kTestPts1)); |
- EXPECT_CALL(*mock_decoder, EnqueueVideoFrame(_, _, _)) |
- .WillOnce(Return(false)); |
- EXPECT_CALL(*mock_decoder, SignalPipelineError()); |
- |
- // Count the callback invoked. |
- TaskMocker done_cb; |
- EXPECT_CALL(done_cb, Run()).Times(1); |
- |
- // Setup FFmpeg expectations for frame allocations. |
- EXPECT_CALL(mock_ffmpeg_, AVCodecAllocFrame()) |
- .WillOnce(Return(&yuv_frame_)); |
- EXPECT_CALL(mock_ffmpeg_, AVFree(&yuv_frame_)); |
- |
- // Attempt the decode. |
- mock_decoder->DoDecode(buffer_, done_cb.CreateTask()); |
-} |
- |
TEST_F(VideoDecoderImplTest, DoDecode_FinishEnqueuesEmptyFrames) { |
MockVideoDecodeEngine* mock_engine = new StrictMock<MockVideoDecodeEngine>(); |
scoped_refptr<DecoderPrivateMock> mock_decoder = |