1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/test/test_video_frame_provider.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/base/video_frame.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace content { 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 147dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestVideoFrameProvider::TestVideoFrameProvider( 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& size, 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::TimeDelta& frame_duration, 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const base::Closure& error_cb, 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const VideoFrameProvider::RepaintCB& repaint_cb) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : message_loop_proxy_(base::MessageLoopProxy::current()), 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) size_(size), 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_(kStopped), 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_duration_(frame_duration), 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_cb_(error_cb), 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_cb_(repaint_cb) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 277dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochTestVideoFrameProvider::~TestVideoFrameProvider() {} 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestVideoFrameProvider::Start() { 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << "TestVideoFrameProvider::Start"; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = kStarted; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_proxy_->PostTask( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&TestVideoFrameProvider::GenerateFrame, this)); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestVideoFrameProvider::Stop() { 397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << "TestVideoFrameProvider::Stop"; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = kStopped; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestVideoFrameProvider::Play() { 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << "TestVideoFrameProvider::Play"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == kPaused) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = kStarted; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestVideoFrameProvider::Pause() { 527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << "TestVideoFrameProvider::Pause"; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == kStarted) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) state_ = kPaused; 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid TestVideoFrameProvider::GenerateFrame() { 597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch DVLOG(1) << "TestVideoFrameProvider::GenerateFrame"; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(message_loop_proxy_->BelongsToCurrentThread()); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == kStopped) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (state_ == kStarted) { 65a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) // Always allocate a new frame filled with white color. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<media::VideoFrame> video_frame = 67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) media::VideoFrame::CreateColorFrame( 68a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) size_, 255, 128, 128, current_time_); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(wjia): set pixel data to pre-defined patterns if it's desired to 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // verify frame content. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) repaint_cb_.Run(video_frame); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) current_time_ += frame_duration_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) message_loop_proxy_->PostDelayedTask( 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FROM_HERE, 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch base::Bind(&TestVideoFrameProvider::GenerateFrame, this), 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frame_duration_); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} // namespace content 84