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" |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
118 return true; | 118 return true; |
119 } | 119 } |
120 | 120 |
121 DCHECK_EQ(external_resources.mailboxes.size(), | 121 DCHECK_EQ(external_resources.mailboxes.size(), |
122 external_resources.release_callbacks.size()); | 122 external_resources.release_callbacks.size()); |
123 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 123 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
124 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( | 124 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( |
125 external_resources.mailboxes[i], | 125 external_resources.mailboxes[i], |
126 SingleReleaseCallbackImpl::Create( | 126 SingleReleaseCallbackImpl::Create( |
127 external_resources.release_callbacks[i])); | 127 external_resources.release_callbacks[i])); |
128 frame_resources_.push_back(resource_id); | 128 frame_resources_.push_back(FrameResource( |
| 129 resource_id, external_resources.mailboxes[i].size_in_pixels(), |
| 130 external_resources.mailboxes[i].allow_overlay())); |
129 } | 131 } |
130 | 132 |
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(); |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
264 visible_rect.x() / uv_subsampling_factor_x, | 266 visible_rect.x() / uv_subsampling_factor_x, |
265 visible_rect.y() / uv_subsampling_factor_y, | 267 visible_rect.y() / uv_subsampling_factor_y, |
266 visible_rect.width() / uv_subsampling_factor_x, | 268 visible_rect.width() / uv_subsampling_factor_x, |
267 visible_rect.height() / uv_subsampling_factor_y); | 269 visible_rect.height() / uv_subsampling_factor_y); |
268 | 270 |
269 YUVVideoDrawQuad* yuv_video_quad = | 271 YUVVideoDrawQuad* yuv_video_quad = |
270 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); | 272 render_pass->CreateAndAppendDrawQuad<YUVVideoDrawQuad>(); |
271 yuv_video_quad->SetNew( | 273 yuv_video_quad->SetNew( |
272 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, | 274 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, | 275 ya_tex_coord_rect, uv_tex_coord_rect, ya_tex_size, uv_tex_size, |
274 frame_resources_[0], frame_resources_[1], frame_resources_[2], | 276 frame_resources_[0].id, frame_resources_[1].id, |
275 frame_resources_.size() > 3 ? frame_resources_[3] : 0, color_space); | 277 frame_resources_[2].id, |
| 278 frame_resources_.size() > 3 ? frame_resources_[3].id : 0, |
| 279 color_space); |
276 ValidateQuadResources(yuv_video_quad); | 280 ValidateQuadResources(yuv_video_quad); |
277 break; | 281 break; |
278 } | 282 } |
279 case VideoFrameExternalResources::RGBA_RESOURCE: | 283 case VideoFrameExternalResources::RGBA_RESOURCE: |
280 case VideoFrameExternalResources::RGB_RESOURCE: { | 284 case VideoFrameExternalResources::RGB_RESOURCE: { |
281 DCHECK_EQ(frame_resources_.size(), 1u); | 285 DCHECK_EQ(frame_resources_.size(), 1u); |
282 if (frame_resources_.size() < 1u) | 286 if (frame_resources_.size() < 1u) |
283 break; | 287 break; |
284 bool premultiplied_alpha = | 288 bool premultiplied_alpha = |
285 (frame_resource_type_ == VideoFrameExternalResources::RGBA_RESOURCE); | 289 (frame_resource_type_ == VideoFrameExternalResources::RGBA_RESOURCE); |
286 gfx::PointF uv_top_left(0.f, 0.f); | 290 gfx::PointF uv_top_left(0.f, 0.f); |
287 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); | 291 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
288 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | 292 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
289 bool flipped = false; | 293 bool flipped = false; |
290 bool nearest_neighbor = false; | 294 bool nearest_neighbor = false; |
291 TextureDrawQuad* texture_quad = | 295 TextureDrawQuad* texture_quad = |
292 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); | 296 render_pass->CreateAndAppendDrawQuad<TextureDrawQuad>(); |
293 texture_quad->SetNew(shared_quad_state, | 297 texture_quad->SetNew(shared_quad_state, quad_rect, opaque_rect, |
294 quad_rect, | 298 visible_quad_rect, frame_resources_[0].id, |
295 opaque_rect, | 299 premultiplied_alpha, uv_top_left, uv_bottom_right, |
296 visible_quad_rect, | 300 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); | 301 nearest_neighbor); |
305 ValidateQuadResources(texture_quad); | 302 ValidateQuadResources(texture_quad); |
306 break; | 303 break; |
307 } | 304 } |
308 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { | 305 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
309 DCHECK_EQ(frame_resources_.size(), 1u); | 306 DCHECK_EQ(frame_resources_.size(), 1u); |
310 if (frame_resources_.size() < 1u) | 307 if (frame_resources_.size() < 1u) |
311 break; | 308 break; |
312 gfx::Transform scale; | 309 gfx::Transform scale; |
313 scale.Scale(tex_width_scale, tex_height_scale); | 310 scale.Scale(tex_width_scale, tex_height_scale); |
314 StreamVideoDrawQuad* stream_video_quad = | 311 StreamVideoDrawQuad* stream_video_quad = |
315 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); | 312 render_pass->CreateAndAppendDrawQuad<StreamVideoDrawQuad>(); |
316 stream_video_quad->SetNew( | 313 stream_video_quad->SetNew( |
317 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, | 314 shared_quad_state, quad_rect, opaque_rect, visible_quad_rect, |
318 frame_resources_[0], | 315 frame_resources_[0].id, frame_resources_[0].size_in_pixels, |
| 316 frame_resources_[0].allow_overlay, |
319 scale * provider_client_impl_->StreamTextureMatrix()); | 317 scale * provider_client_impl_->StreamTextureMatrix()); |
320 ValidateQuadResources(stream_video_quad); | 318 ValidateQuadResources(stream_video_quad); |
321 break; | 319 break; |
322 } | 320 } |
323 case VideoFrameExternalResources::IO_SURFACE: { | 321 case VideoFrameExternalResources::IO_SURFACE: { |
324 DCHECK_EQ(frame_resources_.size(), 1u); | 322 DCHECK_EQ(frame_resources_.size(), 1u); |
325 if (frame_resources_.size() < 1u) | 323 if (frame_resources_.size() < 1u) |
326 break; | 324 break; |
327 IOSurfaceDrawQuad* io_surface_quad = | 325 IOSurfaceDrawQuad* io_surface_quad = |
328 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); | 326 render_pass->CreateAndAppendDrawQuad<IOSurfaceDrawQuad>(); |
329 io_surface_quad->SetNew(shared_quad_state, | 327 io_surface_quad->SetNew(shared_quad_state, quad_rect, opaque_rect, |
330 quad_rect, | 328 visible_quad_rect, visible_rect.size(), |
331 opaque_rect, | 329 frame_resources_[0].id, |
332 visible_quad_rect, | |
333 visible_rect.size(), | |
334 frame_resources_[0], | |
335 IOSurfaceDrawQuad::UNFLIPPED); | 330 IOSurfaceDrawQuad::UNFLIPPED); |
336 ValidateQuadResources(io_surface_quad); | 331 ValidateQuadResources(io_surface_quad); |
337 break; | 332 break; |
338 } | 333 } |
339 #if defined(VIDEO_HOLE) | 334 #if defined(VIDEO_HOLE) |
340 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not | 335 // This block and other blocks wrapped around #if defined(VIDEO_HOLE) is not |
341 // maintained by the general compositor team. Please contact the following | 336 // maintained by the general compositor team. Please contact the following |
342 // people instead: | 337 // people instead: |
343 // | 338 // |
344 // wonsik@chromium.org | 339 // wonsik@chromium.org |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
376 VideoFrameExternalResources::SOFTWARE_RESOURCE) { | 371 VideoFrameExternalResources::SOFTWARE_RESOURCE) { |
377 for (size_t i = 0; i < software_resources_.size(); ++i) { | 372 for (size_t i = 0; i < software_resources_.size(); ++i) { |
378 software_release_callback_.Run( | 373 software_release_callback_.Run( |
379 0, false, layer_tree_impl()->BlockingMainThreadTaskRunner()); | 374 0, false, layer_tree_impl()->BlockingMainThreadTaskRunner()); |
380 } | 375 } |
381 | 376 |
382 software_resources_.clear(); | 377 software_resources_.clear(); |
383 software_release_callback_.Reset(); | 378 software_release_callback_.Reset(); |
384 } else { | 379 } else { |
385 for (size_t i = 0; i < frame_resources_.size(); ++i) | 380 for (size_t i = 0; i < frame_resources_.size(); ++i) |
386 resource_provider->DeleteResource(frame_resources_[i]); | 381 resource_provider->DeleteResource(frame_resources_[i].id); |
387 frame_resources_.clear(); | 382 frame_resources_.clear(); |
388 } | 383 } |
389 | 384 |
390 provider_client_impl_->PutCurrentFrame(); | 385 provider_client_impl_->PutCurrentFrame(); |
391 frame_ = nullptr; | 386 frame_ = nullptr; |
392 | 387 |
393 provider_client_impl_->ReleaseLock(); | 388 provider_client_impl_->ReleaseLock(); |
394 } | 389 } |
395 | 390 |
396 SimpleEnclosedRegion VideoLayerImpl::VisibleContentOpaqueRegion() const { | 391 SimpleEnclosedRegion VideoLayerImpl::VisibleContentOpaqueRegion() const { |
(...skipping 10 matching lines...) Expand all Loading... |
407 void VideoLayerImpl::SetNeedsRedraw() { | 402 void VideoLayerImpl::SetNeedsRedraw() { |
408 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); | 403 SetUpdateRect(gfx::UnionRects(update_rect(), gfx::Rect(bounds()))); |
409 layer_tree_impl()->SetNeedsRedraw(); | 404 layer_tree_impl()->SetNeedsRedraw(); |
410 } | 405 } |
411 | 406 |
412 const char* VideoLayerImpl::LayerTypeAsString() const { | 407 const char* VideoLayerImpl::LayerTypeAsString() const { |
413 return "cc::VideoLayerImpl"; | 408 return "cc::VideoLayerImpl"; |
414 } | 409 } |
415 | 410 |
416 } // namespace cc | 411 } // namespace cc |
OLD | NEW |