OLD | NEW |
---|---|
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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 "cc/layers/video_layer_impl.h" | 5 #include "cc/layers/video_layer_impl.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "cc/layers/video_frame_provider_client_impl.h" | 9 #include "cc/layers/video_frame_provider_client_impl.h" |
10 #include "cc/quads/io_surface_draw_quad.h" | 10 #include "cc/quads/io_surface_draw_quad.h" |
11 #include "cc/quads/stream_video_draw_quad.h" | 11 #include "cc/quads/stream_video_draw_quad.h" |
12 #include "cc/quads/texture_draw_quad.h" | 12 #include "cc/quads/texture_draw_quad.h" |
13 #include "cc/quads/yuv_video_draw_quad.h" | 13 #include "cc/quads/yuv_video_draw_quad.h" |
14 #include "cc/resources/resource_provider.h" | 14 #include "cc/resources/resource_provider.h" |
15 #include "cc/resources/single_release_callback_impl.h" | 15 #include "cc/resources/single_release_callback_impl.h" |
16 #include "cc/trees/layer_tree_impl.h" | 16 #include "cc/trees/layer_tree_impl.h" |
17 #include "cc/trees/occlusion.h" | 17 #include "cc/trees/occlusion.h" |
18 #include "cc/trees/proxy.h" | 18 #include "cc/trees/proxy.h" |
19 #include "media/base/video_frame.h" | 19 #include "media/base/video_frame.h" |
20 #include "ui/gfx/geometry/rect_conversions.h" | |
20 | 21 |
21 #if defined(VIDEO_HOLE) | 22 #if defined(VIDEO_HOLE) |
22 #include "cc/quads/solid_color_draw_quad.h" | 23 #include "cc/quads/solid_color_draw_quad.h" |
23 #endif // defined(VIDEO_HOLE) | 24 #endif // defined(VIDEO_HOLE) |
24 | 25 |
25 namespace cc { | 26 namespace cc { |
26 | 27 |
27 // static | 28 // static |
28 scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create( | 29 scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create( |
29 LayerTreeImpl* tree_impl, | 30 LayerTreeImpl* tree_impl, |
30 int id, | 31 int id, |
31 VideoFrameProvider* provider, | 32 VideoFrameProvider* provider, |
32 media::VideoRotation video_rotation) { | 33 media::VideoRotation video_rotation) { |
33 scoped_ptr<VideoLayerImpl> layer( | 34 scoped_ptr<VideoLayerImpl> layer( |
34 new VideoLayerImpl(tree_impl, id, video_rotation)); | 35 new VideoLayerImpl(tree_impl, id, video_rotation)); |
35 layer->SetProviderClientImpl(VideoFrameProviderClientImpl::Create(provider)); | 36 layer->SetProviderClientImpl(VideoFrameProviderClientImpl::Create(provider)); |
36 DCHECK(tree_impl->proxy()->IsImplThread()); | 37 DCHECK(tree_impl->proxy()->IsImplThread()); |
37 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); | 38 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); |
38 return layer.Pass(); | 39 return layer.Pass(); |
39 } | 40 } |
40 | 41 |
41 VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, | 42 VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, |
42 int id, | 43 int id, |
43 media::VideoRotation video_rotation) | 44 media::VideoRotation video_rotation) |
44 : LayerImpl(tree_impl, id), | 45 : LayerImpl(tree_impl, id), |
45 frame_(nullptr), | 46 frame_(nullptr), |
46 video_rotation_(video_rotation) { | 47 video_rotation_(video_rotation), |
48 video_can_overlay_(false) { | |
47 } | 49 } |
48 | 50 |
49 VideoLayerImpl::~VideoLayerImpl() { | 51 VideoLayerImpl::~VideoLayerImpl() { |
50 if (!provider_client_impl_->Stopped()) { | 52 if (!provider_client_impl_->Stopped()) { |
51 // In impl side painting, we may have a pending and active layer | 53 // In impl side painting, we may have a pending and active layer |
52 // associated with the video provider at the same time. Both have a ref | 54 // associated with the video provider at the same time. Both have a ref |
53 // on the VideoFrameProviderClientImpl, but we stop when the first | 55 // on the VideoFrameProviderClientImpl, but we stop when the first |
54 // LayerImpl (the one on the pending tree) is destroyed since we know | 56 // LayerImpl (the one on the pending tree) is destroyed since we know |
55 // the main thread is blocked for this commit. | 57 // the main thread is blocked for this commit. |
56 DCHECK(layer_tree_impl()->proxy()->IsImplThread()); | 58 DCHECK(layer_tree_impl()->proxy()->IsImplThread()); |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
118 return true; | 120 return true; |
119 } | 121 } |
120 | 122 |
121 DCHECK_EQ(external_resources.mailboxes.size(), | 123 DCHECK_EQ(external_resources.mailboxes.size(), |
122 external_resources.release_callbacks.size()); | 124 external_resources.release_callbacks.size()); |
123 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 125 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
124 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( | 126 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( |
125 external_resources.mailboxes[i], | 127 external_resources.mailboxes[i], |
126 SingleReleaseCallbackImpl::Create( | 128 SingleReleaseCallbackImpl::Create( |
127 external_resources.release_callbacks[i])); | 129 external_resources.release_callbacks[i])); |
130 video_can_overlay_ = resource_provider->AllowOverlay(resource_id); | |
danakj
2015/04/03 22:10:17
this is in a loop, so it would only take the value
achaulk
2015/04/07 18:52:59
Ah, yeah I'll probably just move it outside the lo
| |
128 frame_resources_.push_back(resource_id); | 131 frame_resources_.push_back(resource_id); |
129 } | 132 } |
130 | |
131 return true; | 133 return true; |
132 } | 134 } |
133 | 135 |
134 void VideoLayerImpl::AppendQuads(RenderPass* render_pass, | 136 void VideoLayerImpl::AppendQuads(RenderPass* render_pass, |
135 AppendQuadsData* append_quads_data) { | 137 AppendQuadsData* append_quads_data) { |
136 DCHECK(frame_.get()); | 138 DCHECK(frame_.get()); |
137 | 139 |
138 gfx::Transform transform = draw_transform(); | 140 gfx::Transform transform = draw_transform(); |
139 gfx::Size rotated_size = content_bounds(); | 141 gfx::Size rotated_size = content_bounds(); |
140 | 142 |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
209 opaque_rect, | 211 opaque_rect, |
210 visible_quad_rect, | 212 visible_quad_rect, |
211 software_resources_[0], | 213 software_resources_[0], |
212 premultiplied_alpha, | 214 premultiplied_alpha, |
213 uv_top_left, | 215 uv_top_left, |
214 uv_bottom_right, | 216 uv_bottom_right, |
215 SK_ColorTRANSPARENT, | 217 SK_ColorTRANSPARENT, |
216 opacity, | 218 opacity, |
217 flipped, | 219 flipped, |
218 nearest_neighbor); | 220 nearest_neighbor); |
221 texture_quad->damaged = video_can_overlay_; | |
219 break; | 222 break; |
220 } | 223 } |
221 case VideoFrameExternalResources::YUV_RESOURCE: { | 224 case VideoFrameExternalResources::YUV_RESOURCE: { |
222 DCHECK_GE(frame_resources_.size(), 3u); | 225 DCHECK_GE(frame_resources_.size(), 3u); |
223 if (frame_resources_.size() < 3u) | 226 if (frame_resources_.size() < 3u) |
224 break; | 227 break; |
225 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; | 228 YUVVideoDrawQuad::ColorSpace color_space = YUVVideoDrawQuad::REC_601; |
226 if (frame_->format() == media::VideoFrame::YV12J) { | 229 if (frame_->format() == media::VideoFrame::YV12J) { |
227 color_space = YUVVideoDrawQuad::JPEG; | 230 color_space = YUVVideoDrawQuad::JPEG; |
228 } else if (frame_->format() == media::VideoFrame::YV12HD) { | 231 } else if (frame_->format() == media::VideoFrame::YV12HD) { |
229 color_space = YUVVideoDrawQuad::REC_709; | 232 color_space = YUVVideoDrawQuad::REC_709; |
230 } | 233 } |
231 | 234 |
232 gfx::RectF tex_coord_rect( | 235 gfx::RectF tex_coord_rect( |
233 tex_x_offset, tex_y_offset, tex_width_scale, tex_height_scale); | 236 tex_x_offset, tex_y_offset, tex_width_scale, tex_height_scale); |
234 YUVVideoDrawQuad* yuv_video_quad = | 237 YUVVideoDrawQuad* yuv_video_quad = |
235 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 238 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
236 yuv_video_quad->SetNew( | 239 yuv_video_quad->SetNew( |
237 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, | 240 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, |
238 tex_coord_rect, coded_size, frame_resources_[0], frame_resources_[1], | 241 tex_coord_rect, coded_size, frame_resources_[0], frame_resources_[1], |
239 frame_resources_[2], | 242 frame_resources_[2], |
240 frame_resources_.size() > 3 ? frame_resources_[3] : 0, color_space); | 243 frame_resources_.size() > 3 ? frame_resources_[3] : 0, color_space); |
244 yuv_video_quad->damaged = video_can_overlay_; | |
241 break; | 245 break; |
242 } | 246 } |
243 case VideoFrameExternalResources::RGB_RESOURCE: { | 247 case VideoFrameExternalResources::RGB_RESOURCE: { |
244 DCHECK_EQ(frame_resources_.size(), 1u); | 248 DCHECK_EQ(frame_resources_.size(), 1u); |
245 if (frame_resources_.size() < 1u) | 249 if (frame_resources_.size() < 1u) |
246 break; | 250 break; |
247 bool premultiplied_alpha = true; | 251 bool premultiplied_alpha = true; |
248 gfx::PointF uv_top_left(0.f, 0.f); | 252 gfx::PointF uv_top_left(0.f, 0.f); |
249 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); | 253 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
250 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | 254 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
251 bool flipped = false; | 255 bool flipped = false; |
252 bool nearest_neighbor = false; | 256 bool nearest_neighbor = false; |
253 TextureDrawQuad* texture_quad = | 257 TextureDrawQuad* texture_quad = |
254 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 258 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
255 texture_quad->SetNew(shared_quad_state, | 259 texture_quad->SetNew(shared_quad_state, |
256 quad_rect, | 260 quad_rect, |
257 opaque_rect, | 261 opaque_rect, |
258 visible_quad_rect, | 262 visible_quad_rect, |
259 frame_resources_[0], | 263 frame_resources_[0], |
260 premultiplied_alpha, | 264 premultiplied_alpha, |
261 uv_top_left, | 265 uv_top_left, |
262 uv_bottom_right, | 266 uv_bottom_right, |
263 SK_ColorTRANSPARENT, | 267 SK_ColorTRANSPARENT, |
264 opacity, | 268 opacity, |
265 flipped, | 269 flipped, |
266 nearest_neighbor); | 270 nearest_neighbor); |
271 texture_quad->damaged = video_can_overlay_; | |
267 break; | 272 break; |
268 } | 273 } |
269 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { | 274 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
270 DCHECK_EQ(frame_resources_.size(), 1u); | 275 DCHECK_EQ(frame_resources_.size(), 1u); |
271 if (frame_resources_.size() < 1u) | 276 if (frame_resources_.size() < 1u) |
272 break; | 277 break; |
273 gfx::Transform scale; | 278 gfx::Transform scale; |
274 scale.Scale(tex_width_scale, tex_height_scale); | 279 scale.Scale(tex_width_scale, tex_height_scale); |
275 StreamVideoDrawQuad* stream_video_quad = | 280 StreamVideoDrawQuad* stream_video_quad = |
276 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); | 281 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); |
277 stream_video_quad->SetNew( | 282 stream_video_quad->SetNew( |
278 shared_quad_state, | 283 shared_quad_state, |
279 quad_rect, | 284 quad_rect, |
280 opaque_rect, | 285 opaque_rect, |
281 visible_quad_rect, | 286 visible_quad_rect, |
282 frame_resources_[0], | 287 frame_resources_[0], |
283 scale * provider_client_impl_->stream_texture_matrix()); | 288 scale * provider_client_impl_->stream_texture_matrix()); |
289 stream_video_quad->damaged = video_can_overlay_; | |
284 break; | 290 break; |
285 } | 291 } |
286 case VideoFrameExternalResources::IO_SURFACE: { | 292 case VideoFrameExternalResources::IO_SURFACE: { |
287 DCHECK_EQ(frame_resources_.size(), 1u); | 293 DCHECK_EQ(frame_resources_.size(), 1u); |
288 if (frame_resources_.size() < 1u) | 294 if (frame_resources_.size() < 1u) |
289 break; | 295 break; |
290 IOSurfaceDrawQuad* io_surface_quad = | 296 IOSurfaceDrawQuad* io_surface_quad = |
291 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); | 297 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); |
292 io_surface_quad->SetNew(shared_quad_state, | 298 io_surface_quad->SetNew(shared_quad_state, |
293 quad_rect, | 299 quad_rect, |
294 opaque_rect, | 300 opaque_rect, |
295 visible_quad_rect, | 301 visible_quad_rect, |
296 visible_rect.size(), | 302 visible_rect.size(), |
297 frame_resources_[0], | 303 frame_resources_[0], |
298 IOSurfaceDrawQuad::UNFLIPPED); | 304 IOSurfaceDrawQuad::UNFLIPPED); |
305 io_surface_quad->damaged = video_can_overlay_; | |
299 break; | 306 break; |
300 } | 307 } |
301 #if defined(VIDEO_HOLE) | 308 #if defined(VIDEO_HOLE) |
302 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not | 309 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not |
303 // maintained by the general compositor team. Please contact the following | 310 // maintained by the general compositor team. Please contact the following |
304 // people instead: | 311 // people instead: |
305 // | 312 // |
306 // wonsik@chromium.org | 313 // wonsik@chromium.org |
307 // lcwu@chromium.org | 314 // lcwu@chromium.org |
308 case VideoFrameExternalResources::HOLE: { | 315 case VideoFrameExternalResources::HOLE: { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
353 frame_ = nullptr; | 360 frame_ = nullptr; |
354 | 361 |
355 provider_client_impl_->ReleaseLock(); | 362 provider_client_impl_->ReleaseLock(); |
356 } | 363 } |
357 | 364 |
358 void VideoLayerImpl::ReleaseResources() { | 365 void VideoLayerImpl::ReleaseResources() { |
359 updater_ = nullptr; | 366 updater_ = nullptr; |
360 } | 367 } |
361 | 368 |
362 void VideoLayerImpl::SetNeedsRedraw() { | 369 void VideoLayerImpl::SetNeedsRedraw() { |
363 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); | 370 if (video_can_overlay_) |
371 SetOverlayUpdateRect( | |
372 gfx::UnionRects(overlay_update_rect(), gfx::Rect(bounds()))); | |
373 else | |
374 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); | |
364 layer_tree_impl()->SetNeedsRedraw(); | 375 layer_tree_impl()->SetNeedsRedraw(); |
365 } | 376 } |
366 | 377 |
367 void VideoLayerImpl::SetProviderClientImpl( | 378 void VideoLayerImpl::SetProviderClientImpl( |
368 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { | 379 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { |
369 provider_client_impl_ = provider_client_impl; | 380 provider_client_impl_ = provider_client_impl; |
370 } | 381 } |
371 | 382 |
372 const char* VideoLayerImpl::LayerTypeAsString() const { | 383 const char* VideoLayerImpl::LayerTypeAsString() const { |
373 return "cc::VideoLayerImpl"; | 384 return "cc::VideoLayerImpl"; |
374 } | 385 } |
375 | 386 |
376 } // namespace cc | 387 } // namespace cc |
OLD | NEW |