11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved. 21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be 31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file. 41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <list> 61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include <vector> 71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/basictypes.h" 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h" 101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/ref_counted.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/memory/scoped_ptr.h" 121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/threading/thread.h" 131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h" 141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/buffering_frame_provider.h" 151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/decoder_buffer_base.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/frame_generator_for_test.h" 171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/mock_frame_consumer.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/mock_frame_provider.h" 191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/audio_decoder_config.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/decoder_buffer.h" 211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/video_decoder_config.h" 221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h" 231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast { 251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media { 261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciclass BufferingFrameProviderTest : public testing::Test { 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci public: 291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingFrameProviderTest(); 301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual ~BufferingFrameProviderTest(); 311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Setup the test. 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Configure( 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t frame_count, 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<bool>& provider_delayed_pattern, 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<bool>& consumer_delayed_pattern); 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Start the test. 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void Start(); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci protected: 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<BufferingFrameProvider> buffering_frame_provider_; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<MockFrameConsumer> frame_consumer_; 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci private: 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnTestTimeout(); 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void OnTestCompleted(); 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DISALLOW_COPY_AND_ASSIGN(BufferingFrameProviderTest); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBufferingFrameProviderTest::BufferingFrameProviderTest() { 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciBufferingFrameProviderTest::~BufferingFrameProviderTest() { 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BufferingFrameProviderTest::Configure( 591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t frame_count, 601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<bool>& provider_delayed_pattern, 611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const std::vector<bool>& consumer_delayed_pattern) { 621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci DCHECK_GE(frame_count, 1u); 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Frame generation on the producer and consumer side. 651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<FrameGeneratorForTest::FrameSpec> frame_specs(frame_count); 661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci for (size_t k = 0; k < frame_specs.size() - 1; k++) { 671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_specs[k].has_config = (k == 0); 681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_specs[k].timestamp = base::TimeDelta::FromMilliseconds(40) * k; 691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_specs[k].size = 512; 701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_specs[k].has_decrypt_config = ((k % 3) == 0); 711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_specs[frame_specs.size() - 1].is_eos = true; 731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<FrameGeneratorForTest> frame_generator_provider( 751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new FrameGeneratorForTest(frame_specs)); 761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<FrameGeneratorForTest> frame_generator_consumer( 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new FrameGeneratorForTest(frame_specs)); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<MockFrameProvider> frame_provider(new MockFrameProvider()); 801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_provider->Configure(provider_delayed_pattern, 811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_generator_provider.Pass()); 821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t max_frame_size = 10 * 1024; 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci size_t buffer_size = 10 * max_frame_size; 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffering_frame_provider_.reset( 861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new BufferingFrameProvider( 871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<CodedFrameProvider>(frame_provider.release()), 881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci buffer_size, 891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci max_frame_size, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci BufferingFrameProvider::FrameBufferedCB())); 911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_consumer_.reset( 931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new MockFrameConsumer(buffering_frame_provider_.get())); 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_consumer_->Configure( 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern, 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_generator_consumer.Pass()); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BufferingFrameProviderTest::Start() { 1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_consumer_->Start( 1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&BufferingFrameProviderTest::OnTestCompleted, 1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Unretained(this))); 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BufferingFrameProviderTest::OnTestTimeout() { 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ADD_FAILURE() << "Test timed out"; 1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (base::MessageLoop::current()) 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->QuitWhenIdle(); 1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid BufferingFrameProviderTest::OnTestCompleted() { 1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::MessageLoop::current()->QuitWhenIdle(); 1141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 1151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferingFrameProviderTest, FastProviderSlowConsumer) { 1171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool provider_delayed_pattern[] = { false }; 1181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool consumer_delayed_pattern[] = { true }; 1191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t frame_count = 100u; 1211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Configure( 1221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_count, 1231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern, 1251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern + arraysize(provider_delayed_pattern)), 1261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern, 1281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 1291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 1311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->PostTask( 1321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 1341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->Run(); 1351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferingFrameProviderTest, SlowProviderFastConsumer) { 1381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool provider_delayed_pattern[] = { true }; 1391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool consumer_delayed_pattern[] = { false }; 1401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t frame_count = 100u; 1421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Configure( 1431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_count, 1441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern, 1461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern + arraysize(provider_delayed_pattern)), 1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern, 1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->PostTask( 1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->Run(); 1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciTEST_F(BufferingFrameProviderTest, SlowFastProducerConsumer) { 1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Lengths are prime between each other so we can test a lot of combinations. 1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool provider_delayed_pattern[] = { 1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, true, true, true, true, 1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, false, false, false 1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool consumer_delayed_pattern[] = { 1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci true, true, true, true, true, true, true, 1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci false, false, false, false, false, false, false 1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci }; 1681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const size_t frame_count = 100u; 1701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci Configure( 1711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci frame_count, 1721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern, 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci provider_delayed_pattern + arraysize(provider_delayed_pattern)), 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::vector<bool>( 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern, 1771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci consumer_delayed_pattern + arraysize(consumer_delayed_pattern))); 1781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<base::MessageLoop> message_loop(new base::MessageLoop()); 1801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->PostTask( 1811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci FROM_HERE, 1821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci base::Bind(&BufferingFrameProviderTest::Start, base::Unretained(this))); 1831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci message_loop->Run(); 1841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}; 1851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 1861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace media 1871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} // namespace chromecast 188