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