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

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

Issue 1044093005: Preliminary compositor disabling patch. Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 8 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 #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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698