| Index: chrome/renderer/gpu_video_decoder_host_unittest.cc
|
| ===================================================================
|
| --- chrome/renderer/gpu_video_decoder_host_unittest.cc (revision 78516)
|
| +++ chrome/renderer/gpu_video_decoder_host_unittest.cc (working copy)
|
| @@ -1,265 +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/message_loop.h"
|
| -#include "chrome/renderer/gpu_video_decoder_host.h"
|
| -#include "content/common/message_router.h"
|
| -#include "content/common/gpu_messages.h"
|
| -#include "media/base/pipeline.h"
|
| -#include "media/video/video_mock_objects.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -using testing::_;
|
| -using testing::DoAll;
|
| -using testing::NotNull;
|
| -using testing::Return;
|
| -using testing::SetArgumentPointee;
|
| -
|
| -static const int kContextRouteId = 50;
|
| -static const int kDecoderHostId = 51;
|
| -static const int kDecoderId = 51;
|
| -static const int kVideoFrames = 3;
|
| -static const int kWidth = 320;
|
| -static const int kHeight = 240;
|
| -static const int kFrameRateNumerator = 25;
|
| -static const int kFrameRateDenominator = 1;
|
| -static const int kTransportBufferSize = 1024;
|
| -
|
| -ACTION_P(SimulateAllocateVideoFrames, frames) {
|
| - // Fake some texture IDs here.
|
| - media::VideoFrame::GlTexture textures[] = {4, 5, 6};
|
| - for (int i = 0; i < kVideoFrames; ++i) {
|
| - scoped_refptr<media::VideoFrame> frame;
|
| - media::VideoFrame::CreateFrameGlTexture(media::VideoFrame::YV12,
|
| - kWidth, kHeight, textures,
|
| - &frame);
|
| - frames->push_back(frame);
|
| - arg4->push_back(frame);
|
| - }
|
| -
|
| - // Execute the callback to complete the task.
|
| - arg5->Run();
|
| - delete arg5;
|
| -}
|
| -
|
| -ACTION_P2(SendMessage, handler, msg) {
|
| - handler->OnMessageReceived(msg);
|
| -}
|
| -
|
| -class GpuVideoDecoderHostTest : public testing::Test,
|
| - public IPC::Message::Sender,
|
| - public media::VideoDecodeEngine::EventHandler {
|
| - public:
|
| - // This method is used to dispatch IPC messages to mock methods.
|
| - virtual bool Send(IPC::Message* msg) {
|
| - EXPECT_TRUE(msg);
|
| - if (!msg)
|
| - return false;
|
| -
|
| - bool handled = true;
|
| - IPC_BEGIN_MESSAGE_MAP(GpuVideoDecoderHostTest, *msg)
|
| - IPC_MESSAGE_HANDLER(GpuChannelMsg_CreateVideoDecoder,
|
| - OnCreateVideoDecoder)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_Initialize,
|
| - OnInitialize)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_Destroy,
|
| - OnDestroy)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_Flush,
|
| - OnFlush)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_EmptyThisBuffer,
|
| - OnEmptyThisBuffer)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_VideoFrameAllocated,
|
| - OnVideoFrameAllocated)
|
| - IPC_MESSAGE_HANDLER(GpuVideoDecoderMsg_ProduceVideoFrame,
|
| - OnProduceVideoFrame)
|
| - IPC_MESSAGE_UNHANDLED_ERROR()
|
| - IPC_END_MESSAGE_MAP()
|
| - EXPECT_TRUE(handled);
|
| - delete msg;
|
| - return true;
|
| - }
|
| -
|
| - // Mock methods for outgoing messages.
|
| - MOCK_METHOD1(OnInitialize, void(GpuVideoDecoderInitParam param));
|
| - MOCK_METHOD0(OnDestroy, void());
|
| - MOCK_METHOD0(OnFlush, void());
|
| - MOCK_METHOD1(OnEmptyThisBuffer,
|
| - void(GpuVideoDecoderInputBufferParam param));
|
| - MOCK_METHOD1(OnProduceVideoFrame, void(int32 frame_id));
|
| - MOCK_METHOD2(OnVideoFrameAllocated,
|
| - void(int32 frame_id, std::vector<uint32> textures));
|
| - MOCK_METHOD2(OnCreateVideoDecoder,
|
| - void(int32 context_route_id, int32 decoder_host_id));
|
| -
|
| - // Mock methods for VideoDecodeEngine::EventHandler.
|
| - MOCK_METHOD1(ProduceVideoSample,
|
| - void(scoped_refptr<media::Buffer> buffer));
|
| - MOCK_METHOD2(ConsumeVideoFrame,
|
| - void(scoped_refptr<media::VideoFrame> frame,
|
| - const media::PipelineStatistics& statistics));
|
| - MOCK_METHOD1(OnInitializeComplete,
|
| - void(const media::VideoCodecInfo& info));
|
| - MOCK_METHOD0(OnUninitializeComplete, void());
|
| - MOCK_METHOD0(OnFlushComplete, void());
|
| - MOCK_METHOD0(OnSeekComplete, void());
|
| - MOCK_METHOD0(OnError, void());
|
| - MOCK_METHOD1(OnFormatChange,
|
| - void(media::VideoStreamInfo stream_info));
|
| -
|
| - void Initialize() {
|
| - decoder_host_.reset(
|
| - new GpuVideoDecoderHost(&router_, this, kContextRouteId,
|
| - kDecoderHostId));
|
| - shared_memory_.reset(new base::SharedMemory());
|
| - shared_memory_->CreateAnonymous(kTransportBufferSize);
|
| -
|
| - GpuVideoDecoderHostMsg_CreateVideoDecoderDone msg1(kDecoderHostId,
|
| - kDecoderId);
|
| - EXPECT_CALL(*this, OnCreateVideoDecoder(kContextRouteId, kDecoderHostId))
|
| - .WillOnce(SendMessage(decoder_host_.get(), msg1));
|
| -
|
| - GpuVideoDecoderInitDoneParam param;
|
| - param.success = true;
|
| - param.input_buffer_size = kTransportBufferSize;
|
| - param.input_buffer_handle = shared_memory_->handle();
|
| -
|
| - GpuVideoDecoderHostMsg_InitializeACK msg2(kDecoderHostId, param);
|
| - EXPECT_CALL(*this, OnInitialize(_))
|
| - .WillOnce(SendMessage(decoder_host_.get(), msg2));
|
| - EXPECT_CALL(*this, OnInitializeComplete(_));
|
| -
|
| - media::VideoCodecConfig config(
|
| - media::kCodecH264,
|
| - kWidth,
|
| - kHeight,
|
| - kFrameRateNumerator,
|
| - kFrameRateDenominator,
|
| - NULL,
|
| - 0);
|
| - decoder_host_->Initialize(&message_loop_, this, &context_, config);
|
| - message_loop_.RunAllPending();
|
| - }
|
| -
|
| - void Uninitialize() {
|
| - // A message is sent to GPU process to destroy the decoder.
|
| - GpuVideoDecoderHostMsg_DestroyACK msg(kDecoderHostId);
|
| - EXPECT_CALL(*this, OnDestroy())
|
| - .WillOnce(SendMessage(decoder_host_.get(), msg));
|
| - EXPECT_CALL(context_, ReleaseAllVideoFrames());
|
| - EXPECT_CALL(*this, OnUninitializeComplete());
|
| - decoder_host_->Uninitialize();
|
| - }
|
| -
|
| - void AllocateVideoFrames() {
|
| - // Expect context is called to allocate video frames.
|
| - EXPECT_CALL(context_,
|
| - AllocateVideoFrames(kVideoFrames, kWidth, kHeight,
|
| - media::VideoFrame::YV12,
|
| - NotNull(), NotNull()))
|
| - .WillOnce(SimulateAllocateVideoFrames(&frames_))
|
| - .RetiresOnSaturation();
|
| -
|
| - // Expect that we send the video frames to the GPU process.
|
| - EXPECT_CALL(*this, OnVideoFrameAllocated(_, _))
|
| - .Times(kVideoFrames)
|
| - .RetiresOnSaturation();
|
| -
|
| - // Pretend that a message is sent to GpuVideoDecoderHost to allocate
|
| - // video frames.
|
| - GpuVideoDecoderHostMsg_AllocateVideoFrames msg(
|
| - kDecoderHostId, kVideoFrames, kWidth, kHeight,
|
| - static_cast<int32>(media::VideoFrame::YV12));
|
| - decoder_host_->OnMessageReceived(msg);
|
| - }
|
| -
|
| - void ReleaseVideoFrames() {
|
| - // Expect that context is called to release all video frames.
|
| - EXPECT_CALL(context_, ReleaseAllVideoFrames())
|
| - .RetiresOnSaturation();
|
| -
|
| - // Pretend a message is sent to release all video frames.
|
| - GpuVideoDecoderHostMsg_ReleaseAllVideoFrames msg(kDecoderHostId);
|
| - decoder_host_->OnMessageReceived(msg);
|
| -
|
| - // Clear the list of video frames allocated.
|
| - frames_.clear();
|
| - }
|
| -
|
| - void ProduceVideoFrame(int first_frame_id) {
|
| - for (int i = 0; i < kVideoFrames; ++i) {
|
| - // Expect that a request is received to produce a video frame.
|
| - GpuVideoDecoderHostMsg_ConsumeVideoFrame msg(
|
| - kDecoderHostId, first_frame_id + i, 0, 0, 0);
|
| - EXPECT_CALL(*this, OnProduceVideoFrame(first_frame_id + i))
|
| - .WillOnce(SendMessage(decoder_host_.get(), msg))
|
| - .RetiresOnSaturation();
|
| -
|
| - // Expect that a reply is made when a video frame is ready.
|
| - EXPECT_CALL(*this, ConsumeVideoFrame(frames_[i], _))
|
| - .RetiresOnSaturation();
|
| -
|
| - // Use the allocated video frames to make a request.
|
| - decoder_host_->ProduceVideoFrame(frames_[i]);
|
| - }
|
| - }
|
| -
|
| - private:
|
| - MessageLoop message_loop_;
|
| - MessageRouter router_;
|
| - media::MockVideoDecodeContext context_;
|
| -
|
| - scoped_ptr<GpuVideoDecoderHost> decoder_host_;
|
| - scoped_ptr<base::SharedMemory> shared_memory_;
|
| -
|
| - // Keeps the video frames allocated.
|
| - std::vector<scoped_refptr<media::VideoFrame> > frames_;
|
| -};
|
| -
|
| -// Test that when we initialize GpuVideoDecoderHost the corresponding
|
| -// IPC messages are sent and at the end OnInitializeComplete() is
|
| -// called with the right parameters.
|
| -TEST_F(GpuVideoDecoderHostTest, Initialize) {
|
| - Initialize();
|
| -}
|
| -
|
| -// Test that the sequence of method calls and IPC messages is correct.
|
| -// And at the end OnUninitializeComplete() is called.
|
| -TEST_F(GpuVideoDecoderHostTest, Uninitialize) {
|
| - Initialize();
|
| - Uninitialize();
|
| -}
|
| -
|
| -// Test that IPC messages are sent to GpuVideoDecoderHost and it
|
| -// calls VideoDecodeContext to allocate textures and send these
|
| -// textures back to the GPU process by IPC messages.
|
| -TEST_F(GpuVideoDecoderHostTest, AllocateVideoFrames) {
|
| - Initialize();
|
| - AllocateVideoFrames();
|
| - Uninitialize();
|
| -}
|
| -
|
| -// Test that IPC messages are sent to GpuVideoDecoderHost to
|
| -// release textures and VideoDecodeContext is called correctly.
|
| -TEST_F(GpuVideoDecoderHostTest, ReleaseVideoFrames) {
|
| - Initialize();
|
| - AllocateVideoFrames();
|
| - ReleaseVideoFrames();
|
| - AllocateVideoFrames();
|
| - ReleaseVideoFrames();
|
| - Uninitialize();
|
| -}
|
| -
|
| -// Test the sequence of IPC messages and methods calls for a decode
|
| -// routine. This tests the output port only.
|
| -TEST_F(GpuVideoDecoderHostTest, ProduceVideoFrame) {
|
| - Initialize();
|
| - AllocateVideoFrames();
|
| - ProduceVideoFrame(0);
|
| - ReleaseVideoFrames();
|
| - AllocateVideoFrames();
|
| - ProduceVideoFrame(kVideoFrames);
|
| - ReleaseVideoFrames();
|
| - Uninitialize();
|
| -}
|
|
|