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