12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "media/base/test_helpers.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/bind.h" 8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/logging.h" 9ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/message_loop/message_loop.h" 107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "base/pickle.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/test/test_timeouts.h" 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/timer/timer.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "media/base/audio_buffer.h" 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/base/bind_to_current_loop.h" 167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "media/base/decoder_buffer.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/gfx/rect.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::_; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using ::testing::StrictMock; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace media { 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Utility mock for testing methods expecting Closures and PipelineStatusCBs. 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockCallback : public base::RefCountedThreadSafe<MockCallback> { 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockCallback(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD0(Run, void()); 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(RunWithStatus, void(PipelineStatus)); 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class base::RefCountedThreadSafe<MockCallback>; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~MockCallback(); 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockCallback); 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockCallback::MockCallback() {} 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)MockCallback::~MockCallback() {} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Closure NewExpectedClosure() { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*callback, Run()); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::Bind(&MockCallback::Run, callback); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PipelineStatusCB NewExpectedStatusCB(PipelineStatus status) { 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*callback, RunWithStatus(status)); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return base::Bind(&MockCallback::RunWithStatus, callback); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WaitableMessageLoopEvent::WaitableMessageLoopEvent() 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) : message_loop_(base::MessageLoop::current()), 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signaled_(false), 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_(PIPELINE_OK) { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(message_loop_); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)WaitableMessageLoopEvent::~WaitableMessageLoopEvent() {} 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::Closure WaitableMessageLoopEvent::GetClosure() { 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(message_loop_, base::MessageLoop::current()); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return BindToCurrentLoop(base::Bind( 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WaitableMessageLoopEvent::OnCallback, base::Unretained(this), 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PIPELINE_OK)); 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)PipelineStatusCB WaitableMessageLoopEvent::GetPipelineStatusCB() { 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(message_loop_, base::MessageLoop::current()); 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) return BindToCurrentLoop(base::Bind( 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WaitableMessageLoopEvent::OnCallback, base::Unretained(this))); 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitableMessageLoopEvent::RunAndWait() { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) RunAndWaitForStatus(PIPELINE_OK); 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitableMessageLoopEvent::RunAndWaitForStatus(PipelineStatus expected) { 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(message_loop_, base::MessageLoop::current()); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (signaled_) { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, status_); 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::Timer timer(false, false); 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) timer.Start(FROM_HERE, TestTimeouts::action_timeout(), base::Bind( 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) &WaitableMessageLoopEvent::OnTimeout, base::Unretained(this))); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_->Run(); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(signaled_); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(expected, status_); 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitableMessageLoopEvent::OnCallback(PipelineStatus status) { 97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(message_loop_, base::MessageLoop::current()); 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) signaled_ = true; 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) status_ = status; 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_->QuitWhenIdle(); 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WaitableMessageLoopEvent::OnTimeout() { 104c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DCHECK_EQ(message_loop_, base::MessageLoop::current()); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ADD_FAILURE() << "Timed out waiting for message loop to quit"; 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) message_loop_->QuitWhenIdle(); 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static VideoDecoderConfig GetTestConfig(VideoCodec codec, 110c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size coded_size, 111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) bool is_encrypted) { 112c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Rect visible_rect(coded_size.width(), coded_size.height()); 113c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) gfx::Size natural_size = coded_size; 114c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return VideoDecoderConfig(codec, VIDEO_CODEC_PROFILE_UNKNOWN, 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VideoFrame::YV12, coded_size, visible_rect, natural_size, 117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) NULL, 0, is_encrypted); 118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const gfx::Size kNormalSize(320, 240); 121c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const gfx::Size kLargeSize(640, 480); 122c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 123c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VideoDecoderConfig TestVideoConfig::Invalid() { 124c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTestConfig(kUnknownVideoCodec, kNormalSize, false); 125c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 126c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 127c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VideoDecoderConfig TestVideoConfig::Normal() { 128c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTestConfig(kCodecVP8, kNormalSize, false); 129c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 130c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VideoDecoderConfig TestVideoConfig::NormalEncrypted() { 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTestConfig(kCodecVP8, kNormalSize, true); 133c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 134c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 135c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VideoDecoderConfig TestVideoConfig::Large() { 136c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTestConfig(kCodecVP8, kLargeSize, false); 137c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 138c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)VideoDecoderConfig TestVideoConfig::LargeEncrypted() { 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return GetTestConfig(kCodecVP8, kLargeSize, true); 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size TestVideoConfig::NormalCodedSize() { 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kNormalSize; 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)gfx::Size TestVideoConfig::LargeCodedSize() { 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return kLargeSize; 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 150c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 151eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochtemplate <class T> 152a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)scoped_refptr<AudioBuffer> MakeAudioBuffer(SampleFormat format, 15323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChannelLayout channel_layout, 154010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t channel_count, 15523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int sample_rate, 156a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T start, 157a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) T increment, 158010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t frames, 159010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta timestamp) { 160010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const size_t channels = ChannelLayoutToChannelCount(channel_layout); 161010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_refptr<AudioBuffer> output = 162010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) AudioBuffer::CreateBuffer(format, 163010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) channel_layout, 164010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<int>(channel_count), 165010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) sample_rate, 166010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<int>(frames)); 167a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) output->set_timestamp(timestamp); 168eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 169010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const bool is_planar = 170010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) format == kSampleFormatPlanarS16 || format == kSampleFormatPlanarF32; 171010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) 172010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) // Values in channel 0 will be: 173eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start 174eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start + increment 175eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start + 2 * increment, ... 176a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // While, values in channel 1 will be: 177eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start + frames * increment 178eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start + (frames + 1) * increment 179eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch // start + (frames + 2) * increment, ... 180010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t ch = 0; ch < channels; ++ch) { 181010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) T* buffer = 182010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) reinterpret_cast<T*>(output->channel_data()[is_planar ? ch : 0]); 183010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) const T v = static_cast<T>(start + ch * frames * increment); 184010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) for (size_t i = 0; i < frames; ++i) { 185010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) buffer[is_planar ? i : ch + i * channels] = 186010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) static_cast<T>(v + i * increment); 187eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 188eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch } 189a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return output; 190a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 191a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 192a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Instantiate all the types of MakeAudioBuffer() and 193a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// MakeAudioBuffer() needed. 194a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#define DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(type) \ 195a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) template scoped_refptr<AudioBuffer> MakeAudioBuffer<type>( \ 196a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) SampleFormat format, \ 19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) ChannelLayout channel_layout, \ 198010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t channel_count, \ 19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) int sample_rate, \ 200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) type start, \ 201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) type increment, \ 202010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) size_t frames, \ 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) base::TimeDelta start_time) 204a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(uint8); 205a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(int16); 206a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(int32); 207a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)DEFINE_MAKE_AUDIO_BUFFER_INSTANCE(float); 208eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 2097dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochstatic const char kFakeVideoBufferHeader[] = "FakeVideoBufferForTest"; 2107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochscoped_refptr<DecoderBuffer> CreateFakeVideoBufferForTest( 2127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const VideoDecoderConfig& config, 2137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::TimeDelta timestamp, base::TimeDelta duration) { 2147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch Pickle pickle; 2157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pickle.WriteString(kFakeVideoBufferHeader); 2167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pickle.WriteInt(config.coded_size().width()); 2177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pickle.WriteInt(config.coded_size().height()); 2187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pickle.WriteInt64(timestamp.InMilliseconds()); 2197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch scoped_refptr<DecoderBuffer> buffer = DecoderBuffer::CopyFrom( 2217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<const uint8*>(pickle.data()), 2227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static_cast<int>(pickle.size())); 223ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer->set_timestamp(timestamp); 224ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer->set_duration(duration); 2257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return buffer; 2277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochbool VerifyFakeVideoBufferForTest( 2307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const scoped_refptr<DecoderBuffer>& buffer, 2317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const VideoDecoderConfig& config) { 2327dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch // Check if the input |buffer| matches the |config|. 233ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch PickleIterator pickle(Pickle(reinterpret_cast<const char*>(buffer->data()), 234ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch buffer->data_size())); 2357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch std::string header; 2367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int width = 0; 2377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch int height = 0; 2387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch bool success = pickle.ReadString(&header) && pickle.ReadInt(&width) && 2397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch pickle.ReadInt(&height); 2407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch return (success && header == kFakeVideoBufferHeader && 2417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch width == config.coded_size().width() && 2427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch height == config.coded_size().height()); 2437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch} 2447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 2456e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CallbackPairChecker::CallbackPairChecker() : expecting_b_(false) { 2466e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2476e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2486e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)CallbackPairChecker::~CallbackPairChecker() { 2496e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(expecting_b_); 2506e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2526e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void CallbackPairChecker::RecordACalled() { 2536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_FALSE(expecting_b_); 2546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) expecting_b_ = true; 2556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2566e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)void CallbackPairChecker::RecordBCalled() { 2586e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_TRUE(expecting_b_); 2596e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) expecting_b_ = false; 2606e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)} 2616e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 2622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace media 263