Index: chromecast/media/cma/ipc_streamer/av_streamer_unittest.cc |
diff --git a/chromecast/media/cma/ipc_streamer/av_streamer_unittest.cc b/chromecast/media/cma/ipc_streamer/av_streamer_unittest.cc |
deleted file mode 100644 |
index 46ca5d02b052acd812ee6df359f6c52af17d8824..0000000000000000000000000000000000000000 |
--- a/chromecast/media/cma/ipc_streamer/av_streamer_unittest.cc |
+++ /dev/null |
@@ -1,322 +0,0 @@ |
-// Copyright 2014 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 <stddef.h> |
-#include <stdint.h> |
- |
-#include <list> |
-#include <memory> |
-#include <utility> |
-#include <vector> |
- |
-#include "base/bind.h" |
-#include "base/macros.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/threading/thread.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "base/time/time.h" |
-#include "chromecast/media/cma/ipc/media_memory_chunk.h" |
-#include "chromecast/media/cma/ipc/media_message_fifo.h" |
-#include "chromecast/media/cma/ipc_streamer/av_streamer_proxy.h" |
-#include "chromecast/media/cma/ipc_streamer/coded_frame_provider_host.h" |
-#include "chromecast/media/cma/test/frame_generator_for_test.h" |
-#include "chromecast/media/cma/test/mock_frame_consumer.h" |
-#include "chromecast/media/cma/test/mock_frame_provider.h" |
-#include "chromecast/public/media/cast_decoder_buffer.h" |
-#include "media/base/audio_decoder_config.h" |
-#include "media/base/decoder_buffer.h" |
-#include "media/base/video_decoder_config.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace chromecast { |
-namespace media { |
- |
-namespace { |
- |
-class FifoMemoryChunk : public MediaMemoryChunk { |
- public: |
- FifoMemoryChunk(void* mem, size_t size) |
- : mem_(mem), size_(size) {} |
- ~FifoMemoryChunk() override {} |
- |
- void* data() const override { return mem_; } |
- size_t size() const override { return size_; } |
- bool valid() const override { return true; } |
- |
- private: |
- void* mem_; |
- size_t size_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FifoMemoryChunk); |
-}; |
- |
-} // namespace |
- |
-class AvStreamerTest : public testing::Test { |
- public: |
- AvStreamerTest(); |
- ~AvStreamerTest() override; |
- |
- // Setups the test. |
- void Configure(size_t frame_count, |
- const std::vector<bool>& provider_delayed_pattern, |
- const std::vector<bool>& consumer_delayed_pattern, |
- bool delay_flush); |
- |
- // Starts the test. |
- void Start(); |
- |
- // Back to back flush |
- void FlushThenStop(); |
- |
- // Timeout indicates test failure |
- void OnTestTimeout(); |
- |
- protected: |
- std::unique_ptr<uint64_t[]> fifo_mem_; |
- |
- std::unique_ptr<AvStreamerProxy> av_buffer_proxy_; |
- std::unique_ptr<CodedFrameProviderHost> coded_frame_provider_host_; |
- std::unique_ptr<MockFrameConsumer> frame_consumer_; |
- |
- // number of pending cb in StopAndFlush |
- int stop_and_flush_cb_count_; |
- |
- private: |
- void OnTestCompleted(); |
- |
- void OnFifoRead(); |
- void OnFifoWrite(); |
- |
- void OnStopAndFlush(); |
- |
- DISALLOW_COPY_AND_ASSIGN(AvStreamerTest); |
-}; |
- |
-AvStreamerTest::AvStreamerTest() { |
-} |
- |
-AvStreamerTest::~AvStreamerTest() { |
-} |
- |
-void AvStreamerTest::Configure( |
- size_t frame_count, |
- const std::vector<bool>& provider_delayed_pattern, |
- const std::vector<bool>& consumer_delayed_pattern, |
- bool delay_flush) { |
- // Frame generation on the producer and consumer side. |
- std::vector<FrameGeneratorForTest::FrameSpec> frame_specs; |
- frame_specs.resize(frame_count); |
- for (size_t k = 0; k < frame_specs.size() - 1; k++) { |
- frame_specs[k].has_config = (k == 0); |
- frame_specs[k].timestamp = base::TimeDelta::FromMilliseconds(40) * k; |
- frame_specs[k].size = 512; |
- frame_specs[k].has_decrypt_config = ((k % 3) == 0); |
- } |
- frame_specs.back().is_eos = true; |
- |
- std::unique_ptr<FrameGeneratorForTest> frame_generator_provider( |
- new FrameGeneratorForTest(frame_specs)); |
- std::unique_ptr<FrameGeneratorForTest> frame_generator_consumer( |
- new FrameGeneratorForTest(frame_specs)); |
- |
- std::unique_ptr<MockFrameProvider> frame_provider(new MockFrameProvider()); |
- frame_provider->Configure(provider_delayed_pattern, |
- std::move(frame_generator_provider)); |
- frame_provider->SetDelayFlush(delay_flush); |
- |
- size_t fifo_size_div_8 = 512; |
- fifo_mem_.reset(new uint64_t[fifo_size_div_8]); |
- std::unique_ptr<MediaMessageFifo> producer_fifo(new MediaMessageFifo( |
- std::unique_ptr<MediaMemoryChunk>( |
- new FifoMemoryChunk(&fifo_mem_[0], fifo_size_div_8 * 8)), |
- true)); |
- std::unique_ptr<MediaMessageFifo> consumer_fifo(new MediaMessageFifo( |
- std::unique_ptr<MediaMemoryChunk>( |
- new FifoMemoryChunk(&fifo_mem_[0], fifo_size_div_8 * 8)), |
- false)); |
- producer_fifo->ObserveWriteActivity( |
- base::Bind(&AvStreamerTest::OnFifoWrite, base::Unretained(this))); |
- consumer_fifo->ObserveReadActivity( |
- base::Bind(&AvStreamerTest::OnFifoRead, base::Unretained(this))); |
- |
- av_buffer_proxy_.reset( |
- new AvStreamerProxy()); |
- av_buffer_proxy_->SetCodedFrameProvider( |
- std::unique_ptr<CodedFrameProvider>(frame_provider.release())); |
- av_buffer_proxy_->SetMediaMessageFifo(std::move(producer_fifo)); |
- |
- coded_frame_provider_host_.reset( |
- new CodedFrameProviderHost(std::move(consumer_fifo))); |
- |
- frame_consumer_.reset( |
- new MockFrameConsumer(coded_frame_provider_host_.get())); |
- frame_consumer_->Configure(consumer_delayed_pattern, false, |
- std::move(frame_generator_consumer)); |
- |
- stop_and_flush_cb_count_ = 0; |
-} |
- |
-void AvStreamerTest::Start() { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&AvStreamerProxy::Start, |
- base::Unretained(av_buffer_proxy_.get()))); |
- |
- frame_consumer_->Start( |
- base::Bind(&AvStreamerTest::OnTestCompleted, |
- base::Unretained(this))); |
-} |
- |
-void AvStreamerTest::FlushThenStop() { |
- base::Closure cb = |
- base::Bind(&AvStreamerTest::OnStopAndFlush, base::Unretained(this)); |
- |
- stop_and_flush_cb_count_++; |
- av_buffer_proxy_->StopAndFlush(cb); |
- |
- ASSERT_EQ(stop_and_flush_cb_count_, 1); |
- |
- stop_and_flush_cb_count_++; |
- av_buffer_proxy_->StopAndFlush(cb); |
-} |
- |
-void AvStreamerTest::OnTestTimeout() { |
- ADD_FAILURE() << "Test timed out"; |
- if (base::MessageLoop::current()) |
- base::MessageLoop::current()->QuitWhenIdle(); |
-} |
- |
-void AvStreamerTest::OnTestCompleted() { |
- base::MessageLoop::current()->QuitWhenIdle(); |
-} |
- |
-void AvStreamerTest::OnFifoWrite() { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, |
- base::Bind(&CodedFrameProviderHost::OnFifoWriteEvent, |
- base::Unretained(coded_frame_provider_host_.get()))); |
-} |
- |
-void AvStreamerTest::OnFifoRead() { |
- base::ThreadTaskRunnerHandle::Get()->PostTask( |
- FROM_HERE, base::Bind(&AvStreamerProxy::OnFifoReadEvent, |
- base::Unretained(av_buffer_proxy_.get()))); |
-} |
- |
-void AvStreamerTest::OnStopAndFlush() { |
- stop_and_flush_cb_count_--; |
- if (stop_and_flush_cb_count_ == 0) { |
- OnTestCompleted(); |
- } |
-} |
- |
-TEST_F(AvStreamerTest, FastProviderSlowConsumer) { |
- bool provider_delayed_pattern[] = { false }; |
- bool consumer_delayed_pattern[] = { true }; |
- |
- const size_t frame_count = 100u; |
- Configure(frame_count, |
- std::vector<bool>( |
- provider_delayed_pattern, |
- provider_delayed_pattern + arraysize(provider_delayed_pattern)), |
- std::vector<bool>( |
- consumer_delayed_pattern, |
- consumer_delayed_pattern + arraysize(consumer_delayed_pattern)), |
- false); |
- |
- std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- message_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&AvStreamerTest::Start, base::Unretained(this))); |
- message_loop->Run(); |
-} |
- |
-TEST_F(AvStreamerTest, SlowProviderFastConsumer) { |
- bool provider_delayed_pattern[] = { true }; |
- bool consumer_delayed_pattern[] = { false }; |
- |
- const size_t frame_count = 100u; |
- Configure(frame_count, |
- std::vector<bool>( |
- provider_delayed_pattern, |
- provider_delayed_pattern + arraysize(provider_delayed_pattern)), |
- std::vector<bool>( |
- consumer_delayed_pattern, |
- consumer_delayed_pattern + arraysize(consumer_delayed_pattern)), |
- false); |
- |
- std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- message_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&AvStreamerTest::Start, base::Unretained(this))); |
- message_loop->Run(); |
-} |
- |
-TEST_F(AvStreamerTest, SlowFastProducerConsumer) { |
- // Pattern lengths are prime between each other |
- // so that a lot of combinations can be tested. |
- bool provider_delayed_pattern[] = { |
- true, true, true, true, true, |
- false, false, false, false |
- }; |
- bool consumer_delayed_pattern[] = { |
- true, true, true, true, true, true, true, |
- false, false, false, false, false, false, false |
- }; |
- |
- const size_t frame_count = 100u; |
- Configure(frame_count, |
- std::vector<bool>( |
- provider_delayed_pattern, |
- provider_delayed_pattern + arraysize(provider_delayed_pattern)), |
- std::vector<bool>( |
- consumer_delayed_pattern, |
- consumer_delayed_pattern + arraysize(consumer_delayed_pattern)), |
- false); |
- |
- std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- message_loop->PostTask( |
- FROM_HERE, |
- base::Bind(&AvStreamerTest::Start, base::Unretained(this))); |
- message_loop->Run(); |
-} |
- |
-// Test case for when AvStreamerProxy::StopAndFlush is invoked while a previous |
-// flush is pending. This can happen when pipeline is stopped while a seek/flush |
-// is pending. |
-TEST_F(AvStreamerTest, StopInFlush) { |
- // We don't care about the delayed pattern. Setting to true to make sure the |
- // test won't exit before flush is called. |
- bool dummy_delayed_pattern[] = {true}; |
- std::vector<bool> dummy_delayed_pattern_vector( |
- dummy_delayed_pattern, |
- dummy_delayed_pattern + arraysize(dummy_delayed_pattern)); |
- const size_t frame_count = 100u; |
- |
- // Delay flush callback in frame provider |
- Configure(frame_count, dummy_delayed_pattern_vector, |
- dummy_delayed_pattern_vector, true); |
- |
- std::unique_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); |
- |
- // Flush takes 10ms to finish. 1s timeout is enough for this test. |
- message_loop->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&AvStreamerTest::OnTestTimeout, base::Unretained(this)), |
- base::TimeDelta::FromSeconds(1)); |
- |
- message_loop->PostTask( |
- FROM_HERE, base::Bind(&AvStreamerTest::Start, base::Unretained(this))); |
- |
- // Let AvStreamerProxy run for a while. Fire flush and stop later |
- message_loop->PostDelayedTask( |
- FROM_HERE, |
- base::Bind(&AvStreamerTest::FlushThenStop, base::Unretained(this)), |
- base::TimeDelta::FromMilliseconds(10)); |
- |
- message_loop->Run(); |
-} |
- |
-} // namespace media |
-} // namespace chromecast |