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 | 20 |
21 #if defined(VIDEO_HOLE) | 21 #if defined(VIDEO_HOLE) |
22 #include "cc/quads/solid_color_draw_quad.h" | 22 #include "cc/quads/solid_color_draw_quad.h" |
23 #endif // defined(VIDEO_HOLE) | 23 #endif // defined(VIDEO_HOLE) |
24 | 24 |
25 namespace cc { | 25 namespace cc { |
26 | 26 |
| 27 VideoLayerImpl::FrameResource::FrameResource(ResourceId id, |
| 28 gfx::Size size, |
| 29 bool allow_overlay) |
| 30 : id(id), size(size), allow_overlay(allow_overlay) { |
| 31 } |
| 32 |
27 // static | 33 // static |
28 scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create( | 34 scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create( |
29 LayerTreeImpl* tree_impl, | 35 LayerTreeImpl* tree_impl, |
30 int id, | 36 int id, |
31 VideoFrameProvider* provider, | 37 VideoFrameProvider* provider, |
32 media::VideoRotation video_rotation) { | 38 media::VideoRotation video_rotation) { |
33 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); | 39 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); |
34 DCHECK(tree_impl->proxy()->IsImplThread()); | 40 DCHECK(tree_impl->proxy()->IsImplThread()); |
35 | 41 |
36 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl = | 42 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl = |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 return true; | 124 return true; |
119 } | 125 } |
120 | 126 |
121 DCHECK_EQ(external_resources.mailboxes.size(), | 127 DCHECK_EQ(external_resources.mailboxes.size(), |
122 external_resources.release_callbacks.size()); | 128 external_resources.release_callbacks.size()); |
123 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 129 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
124 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( | 130 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( |
125 external_resources.mailboxes[i], | 131 external_resources.mailboxes[i], |
126 SingleReleaseCallbackImpl::Create( | 132 SingleReleaseCallbackImpl::Create( |
127 external_resources.release_callbacks[i])); | 133 external_resources.release_callbacks[i])); |
128 frame_resources_.push_back(resource_id); | 134 frame_resources_.push_back( |
| 135 FrameResource(resource_id, external_resources.mailboxes[i].size(), |
| 136 external_resources.mailboxes[i].allow_overlay())); |
129 } | 137 } |
130 | 138 |
131 return true; | 139 return true; |
132 } | 140 } |
133 | 141 |
134 void VideoLayerImpl::AppendQuads(RenderPass* render_pass, | 142 void VideoLayerImpl::AppendQuads(RenderPass* render_pass, |
135 AppendQuadsData* append_quads_data) { | 143 AppendQuadsData* append_quads_data) { |
136 DCHECK(frame_.get()); | 144 DCHECK(frame_.get()); |
137 | 145 |
138 gfx::Transform transform = draw_transform(); | 146 gfx::Transform transform = draw_transform(); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 visible_rect.x() / uv_subsampling_factor_x, | 272 visible_rect.x() / uv_subsampling_factor_x, |
265 visible_rect.y() / uv_subsampling_factor_y, | 273 visible_rect.y() / uv_subsampling_factor_y, |
266 visible_rect.width() / uv_subsampling_factor_x, | 274 visible_rect.width() / uv_subsampling_factor_x, |
267 visible_rect.height() / uv_subsampling_factor_y); | 275 visible_rect.height() / uv_subsampling_factor_y); |
268 | 276 |
269 YUVVideoDrawQuad* yuv_video_quad = | 277 YUVVideoDrawQuad* yuv_video_quad = |
270 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 278 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
271 yuv_video_quad->SetNew( | 279 yuv_video_quad->SetNew( |
272 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, | 280 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, |
273 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size, | 281 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size, |
274 frame_resources_[0], frame_resources_[1], frame_resources_[2], | 282 frame_resources_[0].id, frame_resources_[1].id, |
275 frame_resources_.size() > 3 ? frame_resources_[3] : 0, color_space); | 283 frame_resources_[2].id, |
| 284 frame_resources_.size() > 3 ? frame_resources_[3].id : 0, |
| 285 color_space); |
276 ValidateQuadResources(yuv_video_quad); | 286 ValidateQuadResources(yuv_video_quad); |
277 break; | 287 break; |
278 } | 288 } |
279 case VideoFrameExternalResources::RGBA_RESOURCE: | 289 case VideoFrameExternalResources::RGBA_RESOURCE: |
280 case VideoFrameExternalResources::RGB_RESOURCE: { | 290 case VideoFrameExternalResources::RGB_RESOURCE: { |
281 DCHECK_EQ(frame_resources_.size(), 1u); | 291 DCHECK_EQ(frame_resources_.size(), 1u); |
282 if (frame_resources_.size() < 1u) | 292 if (frame_resources_.size() < 1u) |
283 break; | 293 break; |
284 bool premultiplied_alpha = | 294 bool premultiplied_alpha = |
285 (frame_resource_type_ == VideoFrameExternalResources::RGBA_RESOURCE); | 295 (frame_resource_type_ == VideoFrameExternalResources::RGBA_RESOURCE); |
286 gfx::PointF uv_top_left(0.f, 0.f); | 296 gfx::PointF uv_top_left(0.f, 0.f); |
287 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); | 297 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
288 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | 298 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
289 bool flipped = false; | 299 bool flipped = false; |
290 bool nearest_neighbor = false; | 300 bool nearest_neighbor = false; |
291 TextureDrawQuad* texture_quad = | 301 TextureDrawQuad* texture_quad = |
292 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 302 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
293 texture_quad->SetNew(shared_quad_state, | 303 texture_quad->SetNew(shared_quad_state, quad_rect, opaque_rect, |
294 quad_rect, | 304 visible_quad_rect, frame_resources_[0].id, |
295 opaque_rect, | 305 premultiplied_alpha, uv_top_left, uv_bottom_right, |
296 visible_quad_rect, | 306 SK_ColorTRANSPARENT, opacity, flipped, |
297 frame_resources_[0], | |
298 premultiplied_alpha, | |
299 uv_top_left, | |
300 uv_bottom_right, | |
301 SK_ColorTRANSPARENT, | |
302 opacity, | |
303 flipped, | |
304 nearest_neighbor); | 307 nearest_neighbor); |
305 ValidateQuadResources(texture_quad); | 308 ValidateQuadResources(texture_quad); |
306 break; | 309 break; |
307 } | 310 } |
308 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { | 311 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
309 DCHECK_EQ(frame_resources_.size(), 1u); | 312 DCHECK_EQ(frame_resources_.size(), 1u); |
310 if (frame_resources_.size() < 1u) | 313 if (frame_resources_.size() < 1u) |
311 break; | 314 break; |
312 gfx::Transform scale; | 315 gfx::Transform scale; |
313 scale.Scale(tex_width_scale, tex_height_scale); | 316 scale.Scale(tex_width_scale, tex_height_scale); |
314 StreamVideoDrawQuad* stream_video_quad = | 317 StreamVideoDrawQuad* stream_video_quad = |
315 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); | 318 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); |
316 stream_video_quad->SetNew( | 319 stream_video_quad->SetNew( |
317 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, | 320 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, |
318 frame_resources_[0], | 321 frame_resources_[0].id, |
319 scale * provider_client_impl_->StreamTextureMatrix()); | 322 scale * provider_client_impl_->StreamTextureMatrix()); |
| 323 stream_video_quad->resource_size = frame_resources_[0].size; |
| 324 stream_video_quad->allow_overlay = frame_resources_[0].allow_overlay; |
320 ValidateQuadResources(stream_video_quad); | 325 ValidateQuadResources(stream_video_quad); |
321 break; | 326 break; |
322 } | 327 } |
323 case VideoFrameExternalResources::IO_SURFACE: { | 328 case VideoFrameExternalResources::IO_SURFACE: { |
324 DCHECK_EQ(frame_resources_.size(), 1u); | 329 DCHECK_EQ(frame_resources_.size(), 1u); |
325 if (frame_resources_.size() < 1u) | 330 if (frame_resources_.size() < 1u) |
326 break; | 331 break; |
327 IOSurfaceDrawQuad* io_surface_quad = | 332 IOSurfaceDrawQuad* io_surface_quad = |
328 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); | 333 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); |
329 io_surface_quad->SetNew(shared_quad_state, | 334 io_surface_quad->SetNew(shared_quad_state, quad_rect, opaque_rect, |
330 quad_rect, | 335 visible_quad_rect, visible_rect.size(), |
331 opaque_rect, | 336 frame_resources_[0].id, |
332 visible_quad_rect, | |
333 visible_rect.size(), | |
334 frame_resources_[0], | |
335 IOSurfaceDrawQuad::UNFLIPPED); | 337 IOSurfaceDrawQuad::UNFLIPPED); |
336 ValidateQuadResources(io_surface_quad); | 338 ValidateQuadResources(io_surface_quad); |
337 break; | 339 break; |
338 } | 340 } |
339 #if defined(VIDEO_HOLE) | 341 #if defined(VIDEO_HOLE) |
340 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not | 342 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not |
341 // maintained by the general compositor team. Please contact the following | 343 // maintained by the general compositor team. Please contact the following |
342 // people instead: | 344 // people instead: |
343 // | 345 // |
344 // wonsik@chromium.org | 346 // wonsik@chromium.org |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 VideoFrameExternalResources::SOFTWARE_RESOURCE) { | 378 VideoFrameExternalResources::SOFTWARE_RESOURCE) { |
377 for (size_t i = 0; i < software_resources_.size(); ++i) { | 379 for (size_t i = 0; i < software_resources_.size(); ++i) { |
378 software_release_callback_.Run( | 380 software_release_callback_.Run( |
379 0, false, layer_tree_impl()->BlockingMainThreadTaskRunner()); | 381 0, false, layer_tree_impl()->BlockingMainThreadTaskRunner()); |
380 } | 382 } |
381 | 383 |
382 software_resources_.clear(); | 384 software_resources_.clear(); |
383 software_release_callback_.Reset(); | 385 software_release_callback_.Reset(); |
384 } else { | 386 } else { |
385 for (size_t i = 0; i < frame_resources_.size(); ++i) | 387 for (size_t i = 0; i < frame_resources_.size(); ++i) |
386 resource_provider->DeleteResource(frame_resources_[i]); | 388 resource_provider->DeleteResource(frame_resources_[i].id); |
387 frame_resources_.clear(); | 389 frame_resources_.clear(); |
388 } | 390 } |
389 | 391 |
390 provider_client_impl_->PutCurrentFrame(); | 392 provider_client_impl_->PutCurrentFrame(); |
391 frame_ = nullptr; | 393 frame_ = nullptr; |
392 | 394 |
393 provider_client_impl_->ReleaseLock(); | 395 provider_client_impl_->ReleaseLock(); |
394 } | 396 } |
395 | 397 |
396 SimpleEnclosedRegion VideoLayerImpl::VisibleContentOpaqueRegion() const { | 398 SimpleEnclosedRegion VideoLayerImpl::VisibleContentOpaqueRegion() const { |
(...skipping 10 matching lines...) Expand all Loading... |
407 void VideoLayerImpl::SetNeedsRedraw() { | 409 void VideoLayerImpl::SetNeedsRedraw() { |
408 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); | 410 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); |
409 layer_tree_impl()->SetNeedsRedraw(); | 411 layer_tree_impl()->SetNeedsRedraw(); |
410 } | 412 } |
411 | 413 |
412 const char* VideoLayerImpl::LayerTypeAsString() const { | 414 const char* VideoLayerImpl::LayerTypeAsString() const { |
413 return "cc::VideoLayerImpl"; | 415 return "cc::VideoLayerImpl"; |
414 } | 416 } |
415 | 417 |
416 } // namespace cc | 418 } // namespace cc |
OLD | NEW |