OLD | NEW |
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" | 7 #include "base/bind.h" |
8 #include "base/message_loop/message_loop.h" | 8 #include "base/message_loop/message_loop.h" |
9 #include "base/time/default_tick_clock.h" | 9 #include "base/time/default_tick_clock.h" |
10 #include "base/trace_event/trace_event.h" | 10 #include "base/trace_event/trace_event.h" |
11 #include "media/base/video_frame.h" | 11 #include "media/base/video_frame.h" |
12 | 12 |
13 namespace media { | 13 namespace media { |
14 | 14 |
15 // Amount of time to wait between UpdateCurrentFrame() callbacks before starting | 15 // Amount of time to wait between UpdateCurrentFrame() callbacks before starting |
16 // background rendering to keep the Render() callbacks moving. | 16 // background rendering to keep the Render() callbacks moving. |
17 const int kBackgroundRenderingTimeoutMs = 250; | 17 const int kBackgroundRenderingTimeoutMs = 250; |
18 | 18 |
19 VideoFrameCompositor::VideoFrameCompositor( | 19 VideoFrameCompositor::VideoFrameCompositor( |
20 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner, | 20 const scoped_refptr<base::SingleThreadTaskRunner>& compositor_task_runner) |
21 const base::Callback<void(gfx::Size)>& natural_size_changed_cb, | |
22 const base::Callback<void(bool)>& opacity_changed_cb) | |
23 : compositor_task_runner_(compositor_task_runner), | 21 : compositor_task_runner_(compositor_task_runner), |
24 tick_clock_(new base::DefaultTickClock()), | 22 tick_clock_(new base::DefaultTickClock()), |
25 natural_size_changed_cb_(natural_size_changed_cb), | |
26 opacity_changed_cb_(opacity_changed_cb), | |
27 background_rendering_enabled_(true), | 23 background_rendering_enabled_(true), |
28 background_rendering_timer_( | 24 background_rendering_timer_( |
29 FROM_HERE, | 25 FROM_HERE, |
30 base::TimeDelta::FromMilliseconds(kBackgroundRenderingTimeoutMs), | 26 base::TimeDelta::FromMilliseconds(kBackgroundRenderingTimeoutMs), |
31 base::Bind(&VideoFrameCompositor::BackgroundRender, | 27 base::Bind(&VideoFrameCompositor::BackgroundRender, |
32 base::Unretained(this)), | 28 base::Unretained(this)), |
33 // Task is not repeating, CallRender() will reset the task as needed. | 29 // Task is not repeating, CallRender() will reset the task as needed. |
34 false), | 30 false), |
35 client_(nullptr), | 31 client_(nullptr), |
36 rendering_(false), | 32 rendering_(false), |
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 const scoped_refptr<VideoFrame>& frame) { | 182 const scoped_refptr<VideoFrame>& frame) { |
187 DCHECK(compositor_task_runner_->BelongsToCurrentThread()); | 183 DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
188 | 184 |
189 if (frame == current_frame_) | 185 if (frame == current_frame_) |
190 return false; | 186 return false; |
191 | 187 |
192 // Set the flag indicating that the current frame is unrendered, if we get a | 188 // Set the flag indicating that the current frame is unrendered, if we get a |
193 // subsequent PutCurrentFrame() call it will mark it as rendered. | 189 // subsequent PutCurrentFrame() call it will mark it as rendered. |
194 rendered_last_frame_ = false; | 190 rendered_last_frame_ = false; |
195 | 191 |
196 if (!current_frame_ || | |
197 current_frame_->natural_size() != frame->natural_size()) { | |
198 natural_size_changed_cb_.Run(frame->natural_size()); | |
199 } | |
200 | |
201 if (!current_frame_ || | |
202 IsOpaque(current_frame_->format()) != IsOpaque(frame->format())) | |
203 opacity_changed_cb_.Run(IsOpaque(frame->format())); | |
204 | |
205 current_frame_ = frame; | 192 current_frame_ = frame; |
206 return true; | 193 return true; |
207 } | 194 } |
208 | 195 |
209 void VideoFrameCompositor::BackgroundRender() { | 196 void VideoFrameCompositor::BackgroundRender() { |
210 DCHECK(compositor_task_runner_->BelongsToCurrentThread()); | 197 DCHECK(compositor_task_runner_->BelongsToCurrentThread()); |
211 const base::TimeTicks now = tick_clock_->NowTicks(); | 198 const base::TimeTicks now = tick_clock_->NowTicks(); |
212 last_background_render_ = now; | 199 last_background_render_ = now; |
213 bool new_frame = CallRender(now, now + last_interval_, true); | 200 bool new_frame = CallRender(now, now + last_interval_, true); |
214 if (new_frame && client_) | 201 if (new_frame && client_) |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 last_interval_ = deadline_max - deadline_min; | 236 last_interval_ = deadline_max - deadline_min; |
250 | 237 |
251 // Restart the background rendering timer whether we're background rendering | 238 // Restart the background rendering timer whether we're background rendering |
252 // or not; in either case we should wait for |kBackgroundRenderingTimeoutMs|. | 239 // or not; in either case we should wait for |kBackgroundRenderingTimeoutMs|. |
253 if (background_rendering_enabled_) | 240 if (background_rendering_enabled_) |
254 background_rendering_timer_.Reset(); | 241 background_rendering_timer_.Reset(); |
255 return new_frame || had_new_background_frame; | 242 return new_frame || had_new_background_frame; |
256 } | 243 } |
257 | 244 |
258 } // namespace media | 245 } // namespace media |
OLD | NEW |