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 "chromecast/media/cma/base/mock_frame_provider.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/bind.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/location.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/message_loop/message_loop_proxy.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/time/time.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/decoder_buffer_base.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chromecast/media/cma/base/frame_generator_for_test.h"
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/audio_decoder_config.h"
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/decoder_buffer.h"
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "media/base/video_decoder_config.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "testing/gtest/include/gtest/gtest.h"
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/rect.h"
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/gfx/size.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace chromecast {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace media {
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMockFrameProvider::MockFrameProvider() {
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciMockFrameProvider::~MockFrameProvider() {
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockFrameProvider::Configure(
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const std::vector<bool>& delayed_task_pattern,
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    scoped_ptr<FrameGeneratorForTest> frame_generator) {
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  delayed_task_pattern_ = delayed_task_pattern;
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pattern_idx_ = 0;
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  frame_generator_.reset(frame_generator.release());
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockFrameProvider::Read(const ReadCB& read_cb) {
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool delayed = delayed_task_pattern_[pattern_idx_];
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  pattern_idx_ = (pattern_idx_ + 1) % delayed_task_pattern_.size();
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (delayed) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoopProxy::current()->PostDelayedTask(
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE,
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&MockFrameProvider::DoRead,
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   base::Unretained(this), read_cb),
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::TimeDelta::FromMilliseconds(1));
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  } else {
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    base::MessageLoopProxy::current()->PostTask(
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FROM_HERE,
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        base::Bind(&MockFrameProvider::DoRead,
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                   base::Unretained(this), read_cb));
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockFrameProvider::Flush(const base::Closure& flush_cb) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  flush_cb.Run();
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccivoid MockFrameProvider::DoRead(const ReadCB& read_cb) {
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  bool has_config = frame_generator_->HasDecoderConfig();
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  scoped_refptr<DecoderBufferBase> buffer(frame_generator_->Generate());
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ASSERT_TRUE(buffer.get());
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::media::AudioDecoderConfig audio_config;
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  ::media::VideoDecoderConfig video_config;
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (has_config) {
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Size coded_size(640, 480);
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Rect visible_rect(640, 480);
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    gfx::Size natural_size(640, 480);
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    video_config = ::media::VideoDecoderConfig(
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ::media::kCodecH264,
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ::media::VIDEO_CODEC_PROFILE_UNKNOWN,
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        ::media::VideoFrame::YV12,
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        coded_size,
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        visible_rect,
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        natural_size,
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        NULL, 0,
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        false);
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    audio_config = ::media::AudioDecoderConfig(
831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ::media::kCodecAAC,
841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ::media::kSampleFormatS16,
851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      ::media::CHANNEL_LAYOUT_STEREO,
861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      44100,
871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      NULL, 0,
881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      false);
891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
911320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  read_cb.Run(buffer, audio_config, video_config);
921320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
931320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace media
951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace chromecast
96