Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(143)

Side by Side Diff: media/blink/video_frame_compositor.cc

Issue 1053113002: Prime the landing pad for the new video rendering pipeline. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove visibility stuff. Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "media/blink/video_frame_compositor.h" 5 #include "media/blink/video_frame_compositor.h"
6 6
7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h"
7 #include "media/base/video_frame.h" 9 #include "media/base/video_frame.h"
8 10
9 namespace media { 11 namespace media {
10 12
11 static bool IsOpaque(const scoped_refptr<VideoFrame>& frame) { 13 static bool IsOpaque(const scoped_refptr<VideoFrame>& frame) {
12 switch (frame->format()) { 14 switch (frame->format()) {
13 case VideoFrame::UNKNOWN: 15 case VideoFrame::UNKNOWN:
14 case VideoFrame::YV12: 16 case VideoFrame::YV12:
15 case VideoFrame::YV12J: 17 case VideoFrame::YV12J:
16 case VideoFrame::YV12HD: 18 case VideoFrame::YV12HD:
17 case VideoFrame::YV16: 19 case VideoFrame::YV16:
18 case VideoFrame::I420: 20 case VideoFrame::I420:
19 case VideoFrame::YV24: 21 case VideoFrame::YV24:
20 case VideoFrame::NV12: 22 case VideoFrame::NV12:
21 return true; 23 return true;
22 24
23 case VideoFrame::YV12A: 25 case VideoFrame::YV12A:
24 #if defined(VIDEO_HOLE) 26 #if defined(VIDEO_HOLE)
25 case VideoFrame::HOLE: 27 case VideoFrame::HOLE:
26 #endif // defined(VIDEO_HOLE) 28 #endif // defined(VIDEO_HOLE)
27 case VideoFrame::NATIVE_TEXTURE: 29 case VideoFrame::NATIVE_TEXTURE:
28 case VideoFrame::ARGB: 30 case VideoFrame::ARGB:
29 break; 31 break;
30 } 32 }
31 return false; 33 return false;
32 } 34 }
33 35
34 VideoFrameCompositor::VideoFrameCompositor( 36 VideoFrameCompositor::VideoFrameCompositor(
37 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner,
35 const base::Callback<void(gfx::Size)>& natural_size_changed_cb, 38 const base::Callback<void(gfx::Size)>& natural_size_changed_cb,
36 const base::Callback<void(bool)>& opacity_changed_cb) 39 const base::Callback<void(bool)>& opacity_changed_cb)
37 : natural_size_changed_cb_(natural_size_changed_cb), 40 : compositor_task_runner_(compositor_task_runner),
41 natural_size_changed_cb_(natural_size_changed_cb),
38 opacity_changed_cb_(opacity_changed_cb), 42 opacity_changed_cb_(opacity_changed_cb),
39 client_(NULL) { 43 client_(nullptr),
44 callback_(nullptr),
45 rendering_(false) {
40 } 46 }
41 47
42 VideoFrameCompositor::~VideoFrameCompositor() { 48 VideoFrameCompositor::~VideoFrameCompositor() {
49 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
50 DCHECK(!callback_);
51 DCHECK(!rendering_);
43 if (client_) 52 if (client_)
44 client_->StopUsingProvider(); 53 client_->StopUsingProvider();
45 } 54 }
46 55
56 void VideoFrameCompositor::OnRendererStateUpdate() {
57 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
58 if (!client_)
59 return;
60
61 base::AutoLock lock(lock_);
62 if (callback_) {
63 if (rendering_)
64 client_->StartRendering();
65
66 // TODO(dalecurtis): This will need to request the first frame so we have
67 // something to show, even if playback hasn't started yet.
68 } else if (rendering_) {
69 client_->StopRendering();
70 }
71 }
72
73 scoped_refptr<VideoFrame>
74 VideoFrameCompositor::GetCurrentFrameAndUpdateIfStale() {
75 // TODO(dalecurtis): Implement frame refresh when stale.
76 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
77 return GetCurrentFrame();
78 }
79
47 void VideoFrameCompositor::SetVideoFrameProviderClient( 80 void VideoFrameCompositor::SetVideoFrameProviderClient(
48 cc::VideoFrameProvider::Client* client) { 81 cc::VideoFrameProvider::Client* client) {
82 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
49 if (client_) 83 if (client_)
50 client_->StopUsingProvider(); 84 client_->StopUsingProvider();
51 client_ = client; 85 client_ = client;
86 OnRendererStateUpdate();
52 } 87 }
53 88
54 scoped_refptr<VideoFrame> VideoFrameCompositor::GetCurrentFrame() { 89 scoped_refptr<VideoFrame> VideoFrameCompositor::GetCurrentFrame() {
90 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
55 return current_frame_; 91 return current_frame_;
56 } 92 }
57 93
58 void VideoFrameCompositor::PutCurrentFrame( 94 void VideoFrameCompositor::PutCurrentFrame() {
59 const scoped_refptr<VideoFrame>& frame) { 95 DCHECK(compositor_task_runner_->BelongsToCurrentThread());
96 // TODO(dalecurtis): Wire up a flag for RenderCallback::OnFrameDropped().
60 } 97 }
61 98
62 void VideoFrameCompositor::UpdateCurrentFrame( 99 bool VideoFrameCompositor::UpdateCurrentFrame(base::TimeTicks deadline_min,
100 base::TimeTicks deadline_max) {
101 // TODO(dalecurtis): Wire this up to RenderCallback::Render().
102 base::AutoLock lock(lock_);
103 return false;
104 }
105
106 void VideoFrameCompositor::Start(RenderCallback* callback) {
107 NOTREACHED();
108
109 // Called from the media thread.
110 base::AutoLock lock(lock_);
111 callback_ = callback;
112 rendering_ = true;
113 compositor_task_runner_->PostTask(
114 FROM_HERE, base::Bind(&VideoFrameCompositor::OnRendererStateUpdate,
115 base::Unretained(this)));
xhwang 2015/04/13 20:50:29 Hmm, wondering why having both lock and post... If
DaleCurtis 2015/04/13 23:15:06 Because we need to ensure that callback_ is cleare
xhwang 2015/04/14 00:29:52 Thanks for the explanation! Maybe worth some comme
116 }
117
118 void VideoFrameCompositor::Stop() {
119 NOTREACHED();
120
121 base::AutoLock lock(lock_);
122 callback_ = nullptr;
123 rendering_ = false;
124 compositor_task_runner_->PostTask(
125 FROM_HERE, base::Bind(&VideoFrameCompositor::OnRendererStateUpdate,
126 base::Unretained(this)));
xhwang 2015/04/13 20:50:29 ditto
DaleCurtis 2015/04/13 23:15:06 Acknowledged.
127 }
128
129 void VideoFrameCompositor::PaintFrameUsingOldRenderingPath(
63 const scoped_refptr<VideoFrame>& frame) { 130 const scoped_refptr<VideoFrame>& frame) {
131 if (!compositor_task_runner_->BelongsToCurrentThread()) {
132 compositor_task_runner_->PostTask(
133 FROM_HERE,
134 base::Bind(&VideoFrameCompositor::PaintFrameUsingOldRenderingPath,
135 base::Unretained(this), frame));
136 return;
137 }
138
64 if (current_frame_.get() && 139 if (current_frame_.get() &&
65 current_frame_->natural_size() != frame->natural_size()) { 140 current_frame_->natural_size() != frame->natural_size()) {
66 natural_size_changed_cb_.Run(frame->natural_size()); 141 natural_size_changed_cb_.Run(frame->natural_size());
67 } 142 }
68 143
69 if (!current_frame_.get() || IsOpaque(current_frame_) != IsOpaque(frame)) { 144 if (!current_frame_.get() || IsOpaque(current_frame_) != IsOpaque(frame)) {
70 opacity_changed_cb_.Run(IsOpaque(frame)); 145 opacity_changed_cb_.Run(IsOpaque(frame));
71 } 146 }
72 147
73 current_frame_ = frame; 148 current_frame_ = frame;
74 149
75 if (client_) 150 if (client_)
76 client_->DidReceiveFrame(); 151 client_->DidReceiveFrame();
77 } 152 }
78 153
79 } // namespace media 154 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698