Index: media/omx/omx_codec_unittest.cc |
diff --git a/media/omx/omx_codec_unittest.cc b/media/omx/omx_codec_unittest.cc |
deleted file mode 100644 |
index 06fa31e593887a0326839c4b7fa33d1419f5963f..0000000000000000000000000000000000000000 |
--- a/media/omx/omx_codec_unittest.cc |
+++ /dev/null |
@@ -1,483 +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. |
- |
-#define _CRT_SECURE_NO_WARNINGS |
- |
-#if 0 |
-#include <deque> |
- |
-#include "base/callback.h" |
-#include "base/message_loop.h" |
-#include "base/task.h" |
-#include "media/base/buffers.h" |
-#include "media/base/mock_filters.h" |
-#include "media/base/mock_task.h" |
-#include "media/ffmpeg/ffmpeg_common.h" |
-#include "media/video/omx_video_decode_engine.h" |
-#include "media/video/video_decode_engine.h" |
-#include "media/omx/mock_omx.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::_; |
-using ::testing::DoAll; |
-using ::testing::InSequence; |
-using ::testing::IsNull; |
-using ::testing::NotNull; |
-using ::testing::Return; |
-using ::testing::SaveArg; |
-using ::testing::SetArgumentPointee; |
-using ::testing::StrEq; |
-using ::testing::StrictMock; |
- |
-namespace media { |
- |
-static const int kBufferCount = 3; |
-static const int kBufferSize = 4096; |
-static const char* kComponentName = "OMX.google.video_decoder.avc"; |
- |
-ACTION(ReturnComponentName) { |
- strcpy(((char**)arg2)[0], kComponentName); |
-} |
- |
-ACTION(GetHandle) { |
- *arg0 = MockOmx::get()->component(); |
- MockOmx::get()->component()->pApplicationPrivate = arg2; |
- memcpy(MockOmx::get()->callbacks(), arg3, sizeof(OMX_CALLBACKTYPE)); |
-} |
- |
-ACTION(GetParameterVideoInit) { |
- ((OMX_PORT_PARAM_TYPE*)arg1)->nStartPortNumber = 0; |
-} |
- |
-ACTION(GetParameterPortDefinition) { |
- OMX_PARAM_PORTDEFINITIONTYPE* port_format = |
- (OMX_PARAM_PORTDEFINITIONTYPE*)arg1; |
- CHECK(port_format->nPortIndex == 0 || port_format->nPortIndex == 1); |
- if (port_format->nPortIndex == 0) |
- port_format->eDir = OMX_DirInput; |
- else |
- port_format->eDir = OMX_DirOutput; |
- port_format->nBufferCountMin = kBufferCount; |
- port_format->nBufferCountActual = kBufferCount; |
- port_format->nBufferSize = kBufferSize; |
-} |
- |
-ACTION(AllocateBuffer) { |
- *arg0 = new OMX_BUFFERHEADERTYPE(); |
- memset(*arg0, 0, sizeof(OMX_BUFFERHEADERTYPE)); |
- (*arg0)->nAllocLen = arg3; |
- (*arg0)->pBuffer = new uint8[arg3]; |
- (*arg0)->nOutputPortIndex = 1; |
- (*arg0)->nInputPortIndex = OMX_ALL; |
-} |
- |
-ACTION(UseBuffer) { |
- *arg0 = new OMX_BUFFERHEADERTYPE(); |
- memset(*arg0, 0, sizeof(OMX_BUFFERHEADERTYPE)); |
- (*arg0)->nOutputPortIndex = OMX_ALL; |
- (*arg0)->nInputPortIndex = 0; |
-} |
- |
-ACTION(FreeBuffer) { |
- if (1 == arg1->nOutputPortIndex) |
- delete [] arg1->pBuffer; |
- delete arg1; |
-} |
- |
-ACTION_P3(SendEvent, event, data1, data2) { |
- (*MockOmx::get()->callbacks()->EventHandler)( |
- MockOmx::get()->component(), |
- MockOmx::get()->component()->pApplicationPrivate, |
- event, static_cast<OMX_U32>(data1), static_cast<OMX_U32>(data2), NULL); |
-} |
- |
-ACTION_P(EmptyBufferDone, output_pool_ptr) { |
- (*MockOmx::get()->callbacks()->EmptyBufferDone)( |
- MockOmx::get()->component(), |
- MockOmx::get()->component()->pApplicationPrivate, |
- arg0); |
- OMX_BUFFERHEADERTYPE* out_buffer = output_pool_ptr->front(); |
- output_pool_ptr->pop_front(); |
- if (arg0->nFlags & OMX_BUFFERFLAG_EOS) |
- out_buffer->nFlags |= OMX_BUFFERFLAG_EOS; |
- out_buffer->nFilledLen = kBufferSize; |
- (*MockOmx::get()->callbacks()->FillBufferDone)( |
- MockOmx::get()->component(), |
- MockOmx::get()->component()->pApplicationPrivate, |
- out_buffer); |
-} |
- |
-ACTION_P(EnqueueOutputBuffer, output_pool_ptr) { |
- output_pool_ptr->push_back(arg0); |
-} |
- |
-ACTION(FillEosBuffer) { |
- arg0->nFlags = OMX_BUFFERFLAG_EOS; |
- arg0->nFilledLen = 0; |
- (*MockOmx::get()->callbacks()->FillBufferDone)( |
- MockOmx::get()->component(), |
- MockOmx::get()->component()->pApplicationPrivate, |
- arg0); |
-} |
- |
-class TestBuffer : public media::Buffer { |
- public: |
- TestBuffer() : size_(0), data_(NULL) { } |
- explicit TestBuffer(int size) : size_(size) { |
- if (size) |
- data_.reset(new uint8[size]); |
- else |
- data_.reset(NULL); |
- } |
- virtual const uint8* GetData() const { |
- return data_.get(); |
- } |
- virtual size_t GetDataSize() const { |
- return size_; |
- } |
- private: |
- virtual ~TestBuffer() { } |
- |
- int size_; |
- scoped_array<uint8> data_; |
- DISALLOW_COPY_AND_ASSIGN(TestBuffer); |
-}; |
- |
-class OmxCodecTest : public testing::Test { |
- public: |
- OmxCodecTest () |
- : input_buffer_count_(0), |
- got_eos_(false), |
- omx_engine_(new OmxVideoDecodeEngine()) { |
- av_stream_.codec = &av_codec_context_; |
- av_codec_context_.width = 16; |
- av_codec_context_.height = 16; |
- feed_done_cb_ = |
- NewCallback(this, &OmxCodecTest::EmptyBufferDoneCallback); |
- decode_done_cb_ = |
- NewCallback(this, &OmxCodecTest::FillBufferDoneCallback); |
- } |
- |
- ~OmxCodecTest() { |
- } |
- |
- protected: |
- void ExpectSettings() { |
- // Return the component name. |
- EXPECT_CALL(*MockOmx::get(), GetComponentsOfRole(_, _, IsNull())) |
- .WillOnce(DoAll(SetArgumentPointee<1>(1), |
- Return(OMX_ErrorNone))); |
- EXPECT_CALL(*MockOmx::get(), GetComponentsOfRole(_, _, NotNull())) |
- .WillOnce(DoAll(SetArgumentPointee<1>(1), |
- ReturnComponentName(), |
- Return(OMX_ErrorNone))); |
- |
- // Handle get parameter calls. |
- EXPECT_CALL(*MockOmx::get(), |
- GetParameter(OMX_IndexParamVideoInit, NotNull())) |
- .WillRepeatedly(DoAll(GetParameterVideoInit(), Return(OMX_ErrorNone))); |
- EXPECT_CALL(*MockOmx::get(), |
- GetParameter(OMX_IndexParamPortDefinition, NotNull())) |
- .WillRepeatedly(DoAll(GetParameterPortDefinition(), |
- Return(OMX_ErrorNone))); |
- |
- // Ignore all set parameter calls. |
- EXPECT_CALL(*MockOmx::get(), SetParameter(_, _)) |
- .WillRepeatedly(Return(OMX_ErrorNone)); |
- } |
- |
- void ExpectToLoaded() { |
- InSequence s; |
- |
- // Expect initialization. |
- EXPECT_CALL(*MockOmx::get(), Init()) |
- .WillOnce(Return(OMX_ErrorNone)); |
- |
- // Return the handle. |
- EXPECT_CALL(*MockOmx::get(), |
- GetHandle(NotNull(), StrEq(kComponentName), |
- NotNull(), NotNull())) |
- .WillOnce(DoAll(GetHandle(), |
- Return(OMX_ErrorNone))); |
- } |
- |
- void ExpectLoadedToIdle() { |
- InSequence s; |
- |
- // Expect transition to idle. |
- EXPECT_CALL(*MockOmx::get(), |
- SendCommand(OMX_CommandStateSet, OMX_StateIdle, _)) |
- .WillOnce( |
- DoAll( |
- SendEvent(OMX_EventCmdComplete, OMX_CommandStateSet, |
- OMX_StateIdle), |
- Return(OMX_ErrorNone))); |
- |
- // Expect allocation of buffers. |
- EXPECT_CALL(*MockOmx::get(), |
- UseBuffer(NotNull(), 0, NotNull(), kBufferSize, _)) |
- .Times(kBufferCount) |
- .WillRepeatedly(DoAll(UseBuffer(), Return(OMX_ErrorNone))); |
- |
- // Expect allocation of output buffers and send command complete. |
- EXPECT_CALL(*MockOmx::get(), |
- AllocateBuffer(NotNull(), 1, IsNull(), kBufferSize)) |
- .Times(kBufferCount) |
- .WillRepeatedly(DoAll(AllocateBuffer(), Return(OMX_ErrorNone))); |
- } |
- |
- void ExpectToExecuting() { |
- InSequence s; |
- |
- // Expect transition to executing. |
- EXPECT_CALL(*MockOmx::get(), |
- SendCommand(OMX_CommandStateSet, OMX_StateExecuting, _)) |
- .WillOnce(DoAll( |
- SendEvent(OMX_EventCmdComplete, OMX_CommandStateSet, |
- OMX_StateExecuting), |
- Return(OMX_ErrorNone))); |
- |
- // Expect initial FillThisBuffer() calls. |
- EXPECT_CALL(*MockOmx::get(), FillThisBuffer(NotNull())) |
- .Times(kBufferCount) |
- .WillRepeatedly(DoAll(EnqueueOutputBuffer(&output_pool_), |
- Return(OMX_ErrorNone))); |
- } |
- |
- void ExpectToIdle() { |
- // Expect going to idle |
- EXPECT_CALL(*MockOmx::get(), |
- SendCommand(OMX_CommandStateSet, OMX_StateIdle, _)) |
- .WillOnce(DoAll( |
- SendEvent(OMX_EventCmdComplete, OMX_CommandStateSet, OMX_StateIdle), |
- Return(OMX_ErrorNone))); |
- } |
- |
- void ExpectIdleToLoaded() { |
- InSequence s; |
- |
- // Expect transition to loaded. |
- EXPECT_CALL(*MockOmx::get(), |
- SendCommand(OMX_CommandStateSet, OMX_StateLoaded, _)) |
- .WillOnce(DoAll( |
- SendEvent(OMX_EventCmdComplete, OMX_CommandStateSet, |
- OMX_StateLoaded), |
- Return(OMX_ErrorNone))); |
- |
- // Expect free buffer for input port. |
- EXPECT_CALL(*MockOmx::get(), FreeBuffer(0, NotNull())) |
- .Times(kBufferCount) |
- .WillRepeatedly(DoAll(FreeBuffer(), Return(OMX_ErrorNone))); |
- |
- EXPECT_CALL(*MockOmx::get(), FreeBuffer(1, NotNull())) |
- .Times(kBufferCount) |
- .WillRepeatedly(DoAll(FreeBuffer(), Return(OMX_ErrorNone))); |
- } |
- |
- void ExpectToEmpty() { |
- InSequence s; |
- |
- EXPECT_CALL(*MockOmx::get(), FreeHandle(MockOmx::get()->component())) |
- .WillOnce(Return(OMX_ErrorNone)); |
- EXPECT_CALL(*MockOmx::get(), Deinit()) |
- .WillOnce(Return(OMX_ErrorNone)); |
- } |
- |
- // TODO(hclam): Make a more generic about when to stop. |
- void ExpectStart() { |
- ExpectToLoaded(); |
- ExpectLoadedToIdle(); |
- ExpectToExecuting(); |
- EXPECT_CALL(init_done_cb_task_, Run()); |
- } |
- |
- void ExpectStop() { |
- EXPECT_CALL(stop_task_, Run()); |
- ExpectToIdle(); |
- ExpectIdleToLoaded(); |
- ExpectToEmpty(); |
- } |
- |
- void EmptyBufferDoneCallback(scoped_refptr<Buffer> buffer) { |
- if (buffer.get()) { |
- input_units_.push_back(buffer); |
- } else { |
- input_buffer_count_++; |
- scoped_refptr<Buffer> buffer_ref = new TestBuffer(input_buffer_count_); |
- input_units_.push_back(buffer_ref); |
- } |
- } |
- |
- void FillBufferDoneCallback(scoped_refptr<VideoFrame> frame) { |
- output_units_.push_back(frame); |
- if (frame->IsEndOfStream()) |
- got_eos_ = true; |
- } |
- |
- void MakeEmptyBufferRequest() { |
- scoped_refptr<Buffer> buffer = input_units_.front(); |
- input_units_.pop_front(); |
- omx_engine_->EmptyThisBuffer(buffer); |
- } |
- |
- void SendEOSInputBuffer() { |
- input_units_.pop_front(); |
- scoped_refptr<Buffer> buffer_ref = new TestBuffer(); |
- input_units_.push_front(buffer_ref); |
- EXPECT_CALL(*MockOmx::get(), EmptyThisBuffer(NotNull())) |
- .WillOnce(DoAll(EmptyBufferDone(&output_pool_), Return(OMX_ErrorNone))) |
- .RetiresOnSaturation(); |
- MakeEmptyBufferRequest(); |
- message_loop_.RunAllPending(); |
- } |
- |
- int input_buffer_count_; |
- |
- std::deque<scoped_refptr<Buffer> > input_units_; |
- std::deque<scoped_refptr<VideoFrame> > output_units_; |
- std::deque<OMX_BUFFERHEADERTYPE*> fill_this_buffer_received_; |
- std::deque<OMX_BUFFERHEADERTYPE*> output_pool_; |
- |
- MockOmx mock_omx_; |
- |
- bool got_eos_; |
- MessageLoop message_loop_; |
- scoped_refptr<OmxVideoDecodeEngine> omx_engine_; |
- |
- AVStream av_stream_; |
- AVCodecContext av_codec_context_; |
- |
- VideoDecodeEngine::ProduceVideoSampleCallback* feed_done_cb_; |
- VideoDecodeEngine::ConsumeVideoFrameCallback* decode_done_cb_; |
- TaskMocker init_done_cb_task_; |
- |
- TaskMocker stop_task_; |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(OmxCodecTest); |
-}; |
- |
-TEST_F(OmxCodecTest, SimpleStartAndStop) { |
- ExpectSettings(); |
- ExpectStart(); |
- omx_engine_->Initialize(&message_loop_, |
- &av_stream_, |
- feed_done_cb_, |
- decode_done_cb_, |
- init_done_cb_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_EQ(kBufferCount, input_buffer_count_); |
- EXPECT_EQ(VideoDecodeEngine::kNormal, omx_engine_->state()); |
- |
- ExpectStop(); |
- omx_engine_->Stop(stop_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
-} |
- |
-TEST_F(OmxCodecTest, NormalFlow) { |
- ExpectSettings(); |
- ExpectStart(); |
- omx_engine_->Initialize(&message_loop_, |
- &av_stream_, |
- feed_done_cb_, |
- decode_done_cb_, |
- init_done_cb_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_EQ(kBufferCount, input_buffer_count_); |
- EXPECT_EQ(VideoDecodeEngine::kNormal, omx_engine_->state()); |
- |
- // Make emptybuffer requests. |
- EXPECT_EQ(0u, output_units_.size()); |
- int count = output_pool_.size(); |
- for (int i = 0; i < kBufferCount; ++i) { |
- // Give input buffers to OmxVideoDecodeEngine. OmxVideoDecodeEngine will |
- // make a new FillThisBuffer() call for each read. |
- EXPECT_CALL(*MockOmx::get(), EmptyThisBuffer(NotNull())) |
- .WillOnce(DoAll(EmptyBufferDone(&output_pool_), Return(OMX_ErrorNone))) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*MockOmx::get(), FillThisBuffer(NotNull())) |
- .WillOnce(DoAll(EnqueueOutputBuffer(&output_pool_), |
- Return(OMX_ErrorNone))) |
- .RetiresOnSaturation(); |
- MakeEmptyBufferRequest(); |
- } |
- message_loop_.RunAllPending(); |
- EXPECT_EQ(kBufferCount, static_cast<int>(input_units_.size())); |
- EXPECT_EQ(kBufferCount, static_cast<int>(output_units_.size())); |
- EXPECT_EQ(count, static_cast<int>(output_pool_.size())); |
- output_units_.clear(); |
- |
- // Send EndOfStream, expect eos flag. |
- SendEOSInputBuffer(); |
- EXPECT_EQ(kBufferCount - 1, static_cast<int>(input_units_.size())); |
- EXPECT_EQ(1, static_cast<int>(output_units_.size())); |
- EXPECT_EQ(count - 1, static_cast<int>(output_pool_.size())); |
- EXPECT_TRUE(got_eos_); |
- |
- // Shutdown. |
- ExpectStop(); |
- omx_engine_->Stop(stop_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
-} |
- |
-TEST_F(OmxCodecTest, RecycleInputBuffers) { |
- ExpectSettings(); |
- ExpectStart(); |
- omx_engine_->Initialize(&message_loop_, |
- &av_stream_, |
- feed_done_cb_, |
- decode_done_cb_, |
- init_done_cb_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
- |
- EXPECT_EQ(kBufferCount, input_buffer_count_); |
- EXPECT_EQ(VideoDecodeEngine::kNormal, omx_engine_->state()); |
- |
- // Make emptybuffer requests, also recycle input buffers |
- EXPECT_EQ(0u, output_units_.size()); |
- int count = output_pool_.size(); |
- int repeat_count = kBufferCount * 2; |
- for (int i = 0; i < repeat_count; ++i) { |
- // Give input buffers to OmxVideoDecodeEngine. OmxVideoDecodeEngine will |
- // make a new FillThisBuffer() call for each read. |
- EXPECT_CALL(*MockOmx::get(), EmptyThisBuffer(NotNull())) |
- .WillOnce(DoAll(EmptyBufferDone(&output_pool_), Return(OMX_ErrorNone))) |
- .RetiresOnSaturation(); |
- EXPECT_CALL(*MockOmx::get(), FillThisBuffer(NotNull())) |
- .WillOnce(DoAll(EnqueueOutputBuffer(&output_pool_), |
- Return(OMX_ErrorNone))) |
- .RetiresOnSaturation(); |
- MakeEmptyBufferRequest(); |
- message_loop_.RunAllPending(); |
- CHECK(kBufferCount == static_cast<int>(input_units_.size())); |
- CHECK(((i % kBufferCount) + 1) == |
- static_cast<int>(input_units_.back()->GetDataSize())); |
- } |
- message_loop_.RunAllPending(); |
- EXPECT_EQ(kBufferCount, static_cast<int>(input_units_.size())); |
- EXPECT_EQ(repeat_count, static_cast<int>(output_units_.size())); |
- EXPECT_EQ(count, static_cast<int>(output_pool_.size())); |
- output_units_.clear(); |
- |
- // Send EndOfStream, expect eos flag. |
- SendEOSInputBuffer(); |
- EXPECT_EQ(kBufferCount - 1, static_cast<int>(input_units_.size())); |
- EXPECT_EQ(1, static_cast<int>(output_units_.size())); |
- EXPECT_EQ(count - 1, static_cast<int>(output_pool_.size())); |
- EXPECT_TRUE(got_eos_); |
- |
- // Shutdown. |
- ExpectStop(); |
- omx_engine_->Stop(stop_task_.CreateTask()); |
- message_loop_.RunAllPending(); |
-} |
- |
-// TODO(hclam): Add test case for dynamic port config. |
-// TODO(hclam): Create a more complicated test case so that read |
-// requests and reply from FillThisBuffer() arrives out of order. |
- |
-} // namespace media |
-#endif |