Home | History | Annotate | Download | only in test
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/test/test_video_frame_provider.h"
      6 
      7 #include "base/bind.h"
      8 #include "base/location.h"
      9 #include "base/message_loop/message_loop_proxy.h"
     10 #include "media/base/video_frame.h"
     11 
     12 namespace content {
     13 
     14 TestVideoFrameProvider::TestVideoFrameProvider(
     15     const gfx::Size& size,
     16     const base::TimeDelta& frame_duration,
     17     const base::Closure& error_cb,
     18     const VideoFrameProvider::RepaintCB& repaint_cb)
     19     : message_loop_proxy_(base::MessageLoopProxy::current()),
     20       size_(size),
     21       state_(kStopped),
     22       frame_duration_(frame_duration),
     23       error_cb_(error_cb),
     24       repaint_cb_(repaint_cb) {
     25 }
     26 
     27 TestVideoFrameProvider::~TestVideoFrameProvider() {}
     28 
     29 void TestVideoFrameProvider::Start() {
     30   DVLOG(1) << "TestVideoFrameProvider::Start";
     31   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
     32   state_ = kStarted;
     33   message_loop_proxy_->PostTask(
     34       FROM_HERE,
     35       base::Bind(&TestVideoFrameProvider::GenerateFrame, this));
     36 }
     37 
     38 void TestVideoFrameProvider::Stop() {
     39   DVLOG(1) << "TestVideoFrameProvider::Stop";
     40   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
     41   state_ = kStopped;
     42 }
     43 
     44 void TestVideoFrameProvider::Play() {
     45   DVLOG(1) << "TestVideoFrameProvider::Play";
     46   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
     47   if (state_ == kPaused)
     48     state_ = kStarted;
     49 }
     50 
     51 void TestVideoFrameProvider::Pause() {
     52   DVLOG(1) << "TestVideoFrameProvider::Pause";
     53   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
     54   if (state_ == kStarted)
     55     state_ = kPaused;
     56 }
     57 
     58 void TestVideoFrameProvider::GenerateFrame() {
     59   DVLOG(1) << "TestVideoFrameProvider::GenerateFrame";
     60   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
     61   if (state_ == kStopped)
     62     return;
     63 
     64   if (state_ == kStarted) {
     65     // Always allocate a new frame filled with white color.
     66     scoped_refptr<media::VideoFrame> video_frame =
     67         media::VideoFrame::CreateColorFrame(
     68             size_, 255, 128, 128, current_time_);
     69 
     70     // TODO(wjia): set pixel data to pre-defined patterns if it's desired to
     71     // verify frame content.
     72 
     73     repaint_cb_.Run(video_frame);
     74   }
     75 
     76   current_time_ += frame_duration_;
     77   message_loop_proxy_->PostDelayedTask(
     78       FROM_HERE,
     79       base::Bind(&TestVideoFrameProvider::GenerateFrame, this),
     80       frame_duration_);
     81 }
     82 
     83 }  // namespace content
     84