Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Side by Side Diff: cc/layers/video_layer_impl.cc

Issue 1142343008: cc: Rework overlays to not use the ResourceProvider and pass texture size (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698