• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
TestVideoFrameProvider(const gfx::Size & size,const base::TimeDelta & frame_duration,const base::Closure & error_cb,const VideoFrameProvider::RepaintCB & repaint_cb)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 
~TestVideoFrameProvider()27 TestVideoFrameProvider::~TestVideoFrameProvider() {}
28 
Start()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 
Stop()38 void TestVideoFrameProvider::Stop() {
39   DVLOG(1) << "TestVideoFrameProvider::Stop";
40   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
41   state_ = kStopped;
42 }
43 
Play()44 void TestVideoFrameProvider::Play() {
45   DVLOG(1) << "TestVideoFrameProvider::Play";
46   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
47   if (state_ == kPaused)
48     state_ = kStarted;
49 }
50 
Pause()51 void TestVideoFrameProvider::Pause() {
52   DVLOG(1) << "TestVideoFrameProvider::Pause";
53   DCHECK(message_loop_proxy_->BelongsToCurrentThread());
54   if (state_ == kStarted)
55     state_ = kPaused;
56 }
57 
GenerateFrame()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