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