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

Unified Diff: media/video/ffmpeg_video_decode_engine_unittest.cc

Issue 8417019: Simplify VideoDecodeEngine interface by making everything synchronous. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix for CaptureVideoDecoder Created 9 years, 1 month 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 | « media/video/ffmpeg_video_decode_engine.cc ('k') | media/video/video_decode_engine.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/video/ffmpeg_video_decode_engine_unittest.cc
diff --git a/media/video/ffmpeg_video_decode_engine_unittest.cc b/media/video/ffmpeg_video_decode_engine_unittest.cc
deleted file mode 100644
index f2cf348ff89e63519ee778b692cf5d8b1bed3202..0000000000000000000000000000000000000000
--- a/media/video/ffmpeg_video_decode_engine_unittest.cc
+++ /dev/null
@@ -1,286 +0,0 @@
-// Copyright (c) 2011 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop.h"
-#include "media/base/data_buffer.h"
-#include "media/base/pipeline.h"
-#include "media/base/test_data_util.h"
-#include "media/filters/ffmpeg_glue.h"
-#include "media/video/ffmpeg_video_decode_engine.h"
-#include "testing/gmock/include/gmock/gmock.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-using ::testing::_;
-using ::testing::DoAll;
-using ::testing::Return;
-using ::testing::ReturnNull;
-using ::testing::SaveArg;
-using ::testing::SetArgumentPointee;
-using ::testing::StrictMock;
-
-namespace media {
-
-static const VideoFrame::Format kVideoFormat = VideoFrame::YV12;
-static const gfx::Size kCodedSize(320, 240);
-static const gfx::Rect kVisibleRect(320, 240);
-static const gfx::Size kNaturalSize(522, 288);
-static const AVRational kFrameRate = { 100, 1 };
-static const AVRational kAspectRatio = { 1, 1 };
-
-ACTION_P2(DemuxComplete, engine, buffer) {
- engine->ConsumeVideoSample(buffer);
-}
-
-class FFmpegVideoDecodeEngineTest
- : public testing::Test,
- public VideoDecodeEngine::EventHandler {
- public:
- FFmpegVideoDecodeEngineTest()
- : config_(kCodecVP8, kVideoFormat, kCodedSize, kVisibleRect,
- kFrameRate.num, kFrameRate.den,
- kAspectRatio.num, kAspectRatio.den,
- NULL, 0) {
- CHECK(FFmpegGlue::GetInstance());
-
- // Setup FFmpeg structures.
- frame_buffer_.reset(new uint8[kCodedSize.GetArea()]);
-
- test_engine_.reset(new FFmpegVideoDecodeEngine());
-
- ReadTestDataFile("vp8-I-frame-320x240", &i_frame_buffer_);
- ReadTestDataFile("vp8-corrupt-I-frame", &corrupt_i_frame_buffer_);
-
- end_of_stream_buffer_ = new DataBuffer(0);
- }
-
- ~FFmpegVideoDecodeEngineTest() {
- test_engine_.reset();
- }
-
- void Initialize() {
- EXPECT_CALL(*this, OnInitializeComplete(true));
- test_engine_->Initialize(this, config_);
- }
-
- // Decodes the single compressed frame in |buffer| and writes the
- // uncompressed output to |video_frame|. This method works with single
- // and multithreaded decoders. End of stream buffers are used to trigger
- // the frame to be returned in the multithreaded decoder case.
- void DecodeASingleFrame(const scoped_refptr<Buffer>& buffer,
- scoped_refptr<VideoFrame>* video_frame) {
- EXPECT_CALL(*this, ProduceVideoSample(_))
- .WillOnce(DemuxComplete(test_engine_.get(), buffer))
- .WillRepeatedly(DemuxComplete(test_engine_.get(),
- end_of_stream_buffer_));
-
- EXPECT_CALL(*this, ConsumeVideoFrame(_, _))
- .WillOnce(SaveArg<0>(video_frame));
- CallProduceVideoFrame();
- }
-
- // Decodes |i_frame_buffer_| and then decodes the data contained in
- // the file named |test_file_name|. This function expects both buffers
- // to decode to frames that are the same size.
- void DecodeIFrameThenTestFile(const std::string& test_file_name) {
- Initialize();
-
- scoped_refptr<VideoFrame> video_frame_a;
- scoped_refptr<VideoFrame> video_frame_b;
-
- scoped_refptr<Buffer> buffer;
- ReadTestDataFile(test_file_name, &buffer);
-
- EXPECT_CALL(*this, ProduceVideoSample(_))
- .WillOnce(DemuxComplete(test_engine_.get(), i_frame_buffer_))
- .WillOnce(DemuxComplete(test_engine_.get(), buffer))
- .WillRepeatedly(DemuxComplete(test_engine_.get(),
- end_of_stream_buffer_));
-
- EXPECT_CALL(*this, ConsumeVideoFrame(_, _))
- .WillOnce(SaveArg<0>(&video_frame_a))
- .WillOnce(SaveArg<0>(&video_frame_b));
- CallProduceVideoFrame();
- CallProduceVideoFrame();
-
- size_t expected_width = static_cast<size_t>(kVisibleRect.width());
- size_t expected_height = static_cast<size_t>(kVisibleRect.height());
-
- EXPECT_EQ(expected_width, video_frame_a->width());
- EXPECT_EQ(expected_height, video_frame_a->height());
- EXPECT_EQ(expected_width, video_frame_b->width());
- EXPECT_EQ(expected_height, video_frame_b->height());
- }
-
- // VideoDecodeEngine::EventHandler implementation.
- MOCK_METHOD2(ConsumeVideoFrame,
- void(scoped_refptr<VideoFrame>, const PipelineStatistics&));
- MOCK_METHOD1(ProduceVideoSample, void(scoped_refptr<Buffer>));
- MOCK_METHOD1(OnInitializeComplete, void(bool));
- MOCK_METHOD0(OnUninitializeComplete, void());
- MOCK_METHOD0(OnFlushComplete, void());
- MOCK_METHOD0(OnSeekComplete, void());
- MOCK_METHOD0(OnError, void());
-
- void CallProduceVideoFrame() {
- test_engine_->ProduceVideoFrame(VideoFrame::CreateFrame(
- VideoFrame::YV12, kVisibleRect.width(), kVisibleRect.height(),
- kNoTimestamp, kNoTimestamp));
- }
-
- protected:
- VideoDecoderConfig config_;
- scoped_ptr<FFmpegVideoDecodeEngine> test_engine_;
- scoped_array<uint8_t> frame_buffer_;
- scoped_refptr<Buffer> i_frame_buffer_;
- scoped_refptr<Buffer> corrupt_i_frame_buffer_;
- scoped_refptr<Buffer> end_of_stream_buffer_;
-
- private:
- DISALLOW_COPY_AND_ASSIGN(FFmpegVideoDecodeEngineTest);
-};
-
-TEST_F(FFmpegVideoDecodeEngineTest, Initialize_Normal) {
- Initialize();
-}
-
-TEST_F(FFmpegVideoDecodeEngineTest, Initialize_FindDecoderFails) {
- VideoDecoderConfig config(kUnknownVideoCodec, kVideoFormat,
- kCodedSize, kVisibleRect,
- kFrameRate.num, kFrameRate.den,
- kAspectRatio.num, kAspectRatio.den,
- NULL, 0);
-
- // Test avcodec_find_decoder() returning NULL.
- EXPECT_CALL(*this, OnInitializeComplete(false));
- test_engine_->Initialize(this, config);
-}
-
-TEST_F(FFmpegVideoDecodeEngineTest, Initialize_OpenDecoderFails) {
- // Specify Theora w/o extra data so that avcodec_open() fails.
- VideoDecoderConfig config(kCodecTheora, kVideoFormat,
- kCodedSize, kVisibleRect,
- kFrameRate.num, kFrameRate.den,
- kAspectRatio.num, kAspectRatio.den,
- NULL, 0);
- EXPECT_CALL(*this, OnInitializeComplete(false));
- test_engine_->Initialize(this, config);
-}
-
-TEST_F(FFmpegVideoDecodeEngineTest, Initialize_UnsupportedPixelFormat) {
- // Ensure decoder handles unsupport pixel formats without crashing.
- VideoDecoderConfig config(kCodecVP8, VideoFrame::INVALID,
- kCodedSize, kVisibleRect,
- kFrameRate.num, kFrameRate.den,
- kAspectRatio.num, kAspectRatio.den,
- NULL, 0);
- EXPECT_CALL(*this, OnInitializeComplete(false));
- test_engine_->Initialize(this, config);
-}
-
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_Normal) {
- Initialize();
-
- // Simulate decoding a single frame.
- scoped_refptr<VideoFrame> video_frame;
- DecodeASingleFrame(i_frame_buffer_, &video_frame);
-
- // |video_frame| timestamp is 0 because we set the timestamp based off
- // the buffer timestamp.
- ASSERT_TRUE(video_frame);
- EXPECT_EQ(0, video_frame->GetTimestamp().ToInternalValue());
- EXPECT_EQ(10000, video_frame->GetDuration().ToInternalValue());
-}
-
-
-// Verify current behavior for 0 byte frames. FFmpeg simply ignores
-// the 0 byte frames.
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_0ByteFrame) {
- Initialize();
-
- scoped_refptr<DataBuffer> zero_byte_buffer = new DataBuffer(1);
-
- scoped_refptr<VideoFrame> video_frame_a;
- scoped_refptr<VideoFrame> video_frame_b;
- scoped_refptr<VideoFrame> video_frame_c;
-
- EXPECT_CALL(*this, ProduceVideoSample(_))
- .WillOnce(DemuxComplete(test_engine_.get(), i_frame_buffer_))
- .WillOnce(DemuxComplete(test_engine_.get(), zero_byte_buffer))
- .WillOnce(DemuxComplete(test_engine_.get(), i_frame_buffer_))
- .WillRepeatedly(DemuxComplete(test_engine_.get(),
- end_of_stream_buffer_));
-
- EXPECT_CALL(*this, ConsumeVideoFrame(_, _))
- .WillOnce(SaveArg<0>(&video_frame_a))
- .WillOnce(SaveArg<0>(&video_frame_b))
- .WillOnce(SaveArg<0>(&video_frame_c));
- CallProduceVideoFrame();
- CallProduceVideoFrame();
- CallProduceVideoFrame();
-
- EXPECT_TRUE(video_frame_a);
- EXPECT_TRUE(video_frame_b);
- EXPECT_FALSE(video_frame_c);
-}
-
-
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_DecodeError) {
- Initialize();
-
- EXPECT_CALL(*this, ProduceVideoSample(_))
- .WillOnce(DemuxComplete(test_engine_.get(), corrupt_i_frame_buffer_))
- .WillRepeatedly(DemuxComplete(test_engine_.get(), i_frame_buffer_));
- EXPECT_CALL(*this, OnError());
-
- CallProduceVideoFrame();
-}
-
-// Multi-threaded decoders have different behavior than single-threaded
-// decoders at the end of the stream. Multithreaded decoders hide errors
-// that happen on the last |codec_context_->thread_count| frames to avoid
-// prematurely signalling EOS. This test just exposes that behavior so we can
-// detect if it changes.
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_DecodeErrorAtEndOfStream) {
- Initialize();
-
- EXPECT_CALL(*this, ProduceVideoSample(_))
- .WillOnce(DemuxComplete(test_engine_.get(), corrupt_i_frame_buffer_))
- .WillRepeatedly(DemuxComplete(test_engine_.get(), end_of_stream_buffer_));
-
- scoped_refptr<VideoFrame> video_frame;
- EXPECT_CALL(*this, ConsumeVideoFrame(_, _))
- .WillOnce(SaveArg<0>(&video_frame));
- CallProduceVideoFrame();
-
- EXPECT_FALSE(video_frame);
-}
-
-// Decode |i_frame_buffer_| and then a frame with a larger width and verify
-// the output size didn't change.
-// TODO(acolwell): Fix InvalidRead detected by Valgrind
-//TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_LargerWidth) {
-// DecodeIFrameThenTestFile("vp8-I-frame-640x240");
-//}
-
-// Decode |i_frame_buffer_| and then a frame with a smaller width and verify
-// the output size didn't change.
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_SmallerWidth) {
- DecodeIFrameThenTestFile("vp8-I-frame-160x240");
-}
-
-// Decode |i_frame_buffer_| and then a frame with a larger height and verify
-// the output size didn't change.
-// TODO(acolwell): Fix InvalidRead detected by Valgrind
-//TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_LargerHeight) {
-// DecodeIFrameThenTestFile("vp8-I-frame-320x480");
-//}
-
-// Decode |i_frame_buffer_| and then a frame with a smaller height and verify
-// the output size didn't change.
-TEST_F(FFmpegVideoDecodeEngineTest, DecodeFrame_SmallerHeight) {
- DecodeIFrameThenTestFile("vp8-I-frame-320x120");
-}
-
-} // namespace media
« no previous file with comments | « media/video/ffmpeg_video_decode_engine.cc ('k') | media/video/video_decode_engine.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698