| 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); |
| 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 |