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/quad_sink.h" | |
10 #include "cc/layers/video_frame_provider_client_impl.h" | 9 #include "cc/layers/video_frame_provider_client_impl.h" |
11 #include "cc/quads/io_surface_draw_quad.h" | 10 #include "cc/quads/io_surface_draw_quad.h" |
12 #include "cc/quads/stream_video_draw_quad.h" | 11 #include "cc/quads/stream_video_draw_quad.h" |
13 #include "cc/quads/texture_draw_quad.h" | 12 #include "cc/quads/texture_draw_quad.h" |
14 #include "cc/quads/yuv_video_draw_quad.h" | 13 #include "cc/quads/yuv_video_draw_quad.h" |
15 #include "cc/resources/resource_provider.h" | 14 #include "cc/resources/resource_provider.h" |
16 #include "cc/resources/single_release_callback.h" | 15 #include "cc/resources/single_release_callback.h" |
17 #include "cc/trees/layer_tree_impl.h" | 16 #include "cc/trees/layer_tree_impl.h" |
| 17 #include "cc/trees/occlusion_tracker.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 // static | 27 // static |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 117 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
118 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( | 118 unsigned resource_id = resource_provider->CreateResourceFromTextureMailbox( |
119 external_resources.mailboxes[i], | 119 external_resources.mailboxes[i], |
120 SingleReleaseCallback::Create(external_resources.release_callbacks[i])); | 120 SingleReleaseCallback::Create(external_resources.release_callbacks[i])); |
121 frame_resources_.push_back(resource_id); | 121 frame_resources_.push_back(resource_id); |
122 } | 122 } |
123 | 123 |
124 return true; | 124 return true; |
125 } | 125 } |
126 | 126 |
127 void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, | 127 void VideoLayerImpl::AppendQuads( |
128 AppendQuadsData* append_quads_data) { | 128 RenderPass* render_pass, |
| 129 const OcclusionTracker<LayerImpl>& occlusion_tracker, |
| 130 AppendQuadsData* append_quads_data) { |
129 DCHECK(frame_.get()); | 131 DCHECK(frame_.get()); |
130 | 132 |
131 SharedQuadState* shared_quad_state = quad_sink->CreateSharedQuadState(); | 133 SharedQuadState* shared_quad_state = |
| 134 render_pass->CreateAndAppendSharedQuadState(); |
132 PopulateSharedQuadState(shared_quad_state); | 135 PopulateSharedQuadState(shared_quad_state); |
133 | 136 |
134 AppendDebugBorderQuad( | 137 AppendDebugBorderQuad( |
135 quad_sink, content_bounds(), shared_quad_state, append_quads_data); | 138 render_pass, content_bounds(), shared_quad_state, append_quads_data); |
136 | 139 |
137 gfx::Rect quad_rect(content_bounds()); | 140 gfx::Rect quad_rect(content_bounds()); |
138 gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect()); | 141 gfx::Rect opaque_rect(contents_opaque() ? quad_rect : gfx::Rect()); |
139 gfx::Rect visible_rect = frame_->visible_rect(); | 142 gfx::Rect visible_rect = frame_->visible_rect(); |
140 gfx::Size coded_size = frame_->coded_size(); | 143 gfx::Size coded_size = frame_->coded_size(); |
141 | 144 |
142 gfx::Rect visible_quad_rect = quad_sink->UnoccludedContentRect( | 145 gfx::Rect visible_quad_rect = occlusion_tracker.UnoccludedContentRect( |
143 quad_rect, draw_properties().target_space_transform); | 146 quad_rect, draw_properties().target_space_transform); |
144 if (visible_quad_rect.IsEmpty()) | 147 if (visible_quad_rect.IsEmpty()) |
145 return; | 148 return; |
146 | 149 |
147 // Pixels for macroblocked formats. | 150 // Pixels for macroblocked formats. |
148 const float tex_width_scale = | 151 const float tex_width_scale = |
149 static_cast<float>(visible_rect.width()) / coded_size.width(); | 152 static_cast<float>(visible_rect.width()) / coded_size.width(); |
150 const float tex_height_scale = | 153 const float tex_height_scale = |
151 static_cast<float>(visible_rect.height()) / coded_size.height(); | 154 static_cast<float>(visible_rect.height()) / coded_size.height(); |
152 const float tex_x_offset = | 155 const float tex_x_offset = |
(...skipping 18 matching lines...) Expand all Loading... |
171 quad_rect, | 174 quad_rect, |
172 opaque_rect, | 175 opaque_rect, |
173 visible_quad_rect, | 176 visible_quad_rect, |
174 software_resources_[0], | 177 software_resources_[0], |
175 premultiplied_alpha, | 178 premultiplied_alpha, |
176 uv_top_left, | 179 uv_top_left, |
177 uv_bottom_right, | 180 uv_bottom_right, |
178 SK_ColorTRANSPARENT, | 181 SK_ColorTRANSPARENT, |
179 opacity, | 182 opacity, |
180 flipped); | 183 flipped); |
181 quad_sink->Append(texture_quad.PassAs<DrawQuad>()); | 184 render_pass->AppendDrawQuad(texture_quad.PassAs<DrawQuad>()); |
182 break; | 185 break; |
183 } | 186 } |
184 case VideoFrameExternalResources::YUV_RESOURCE: { | 187 case VideoFrameExternalResources::YUV_RESOURCE: { |
185 DCHECK_GE(frame_resources_.size(), 3u); | 188 DCHECK_GE(frame_resources_.size(), 3u); |
186 if (frame_resources_.size() < 3u) | 189 if (frame_resources_.size() < 3u) |
187 break; | 190 break; |
188 YUVVideoDrawQuad::ColorSpace color_space = | 191 YUVVideoDrawQuad::ColorSpace color_space = |
189 frame_->format() == media::VideoFrame::YV12J | 192 frame_->format() == media::VideoFrame::YV12J |
190 ? YUVVideoDrawQuad::REC_601_JPEG | 193 ? YUVVideoDrawQuad::REC_601_JPEG |
191 : YUVVideoDrawQuad::REC_601; | 194 : YUVVideoDrawQuad::REC_601; |
192 gfx::RectF tex_coord_rect( | 195 gfx::RectF tex_coord_rect( |
193 tex_x_offset, tex_y_offset, tex_width_scale, tex_height_scale); | 196 tex_x_offset, tex_y_offset, tex_width_scale, tex_height_scale); |
194 scoped_ptr<YUVVideoDrawQuad> yuv_video_quad = YUVVideoDrawQuad::Create(); | 197 scoped_ptr<YUVVideoDrawQuad> yuv_video_quad = YUVVideoDrawQuad::Create(); |
195 yuv_video_quad->SetNew( | 198 yuv_video_quad->SetNew( |
196 shared_quad_state, | 199 shared_quad_state, |
197 quad_rect, | 200 quad_rect, |
198 opaque_rect, | 201 opaque_rect, |
199 visible_quad_rect, | 202 visible_quad_rect, |
200 tex_coord_rect, | 203 tex_coord_rect, |
201 frame_resources_[0], | 204 frame_resources_[0], |
202 frame_resources_[1], | 205 frame_resources_[1], |
203 frame_resources_[2], | 206 frame_resources_[2], |
204 frame_resources_.size() > 3 ? frame_resources_[3] : 0, | 207 frame_resources_.size() > 3 ? frame_resources_[3] : 0, |
205 color_space); | 208 color_space); |
206 quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>()); | 209 render_pass->AppendDrawQuad(yuv_video_quad.PassAs<DrawQuad>()); |
207 break; | 210 break; |
208 } | 211 } |
209 case VideoFrameExternalResources::RGB_RESOURCE: { | 212 case VideoFrameExternalResources::RGB_RESOURCE: { |
210 DCHECK_EQ(frame_resources_.size(), 1u); | 213 DCHECK_EQ(frame_resources_.size(), 1u); |
211 if (frame_resources_.size() < 1u) | 214 if (frame_resources_.size() < 1u) |
212 break; | 215 break; |
213 bool premultiplied_alpha = true; | 216 bool premultiplied_alpha = true; |
214 gfx::PointF uv_top_left(0.f, 0.f); | 217 gfx::PointF uv_top_left(0.f, 0.f); |
215 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); | 218 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
216 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | 219 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
217 bool flipped = false; | 220 bool flipped = false; |
218 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create(); | 221 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create(); |
219 texture_quad->SetNew(shared_quad_state, | 222 texture_quad->SetNew(shared_quad_state, |
220 quad_rect, | 223 quad_rect, |
221 opaque_rect, | 224 opaque_rect, |
222 visible_quad_rect, | 225 visible_quad_rect, |
223 frame_resources_[0], | 226 frame_resources_[0], |
224 premultiplied_alpha, | 227 premultiplied_alpha, |
225 uv_top_left, | 228 uv_top_left, |
226 uv_bottom_right, | 229 uv_bottom_right, |
227 SK_ColorTRANSPARENT, | 230 SK_ColorTRANSPARENT, |
228 opacity, | 231 opacity, |
229 flipped); | 232 flipped); |
230 quad_sink->Append(texture_quad.PassAs<DrawQuad>()); | 233 render_pass->AppendDrawQuad(texture_quad.PassAs<DrawQuad>()); |
231 break; | 234 break; |
232 } | 235 } |
233 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { | 236 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
234 DCHECK_EQ(frame_resources_.size(), 1u); | 237 DCHECK_EQ(frame_resources_.size(), 1u); |
235 if (frame_resources_.size() < 1u) | 238 if (frame_resources_.size() < 1u) |
236 break; | 239 break; |
237 gfx::Transform scale; | 240 gfx::Transform scale; |
238 scale.Scale(tex_width_scale, tex_height_scale); | 241 scale.Scale(tex_width_scale, tex_height_scale); |
239 scoped_ptr<StreamVideoDrawQuad> stream_video_quad = | 242 scoped_ptr<StreamVideoDrawQuad> stream_video_quad = |
240 StreamVideoDrawQuad::Create(); | 243 StreamVideoDrawQuad::Create(); |
241 stream_video_quad->SetNew( | 244 stream_video_quad->SetNew( |
242 shared_quad_state, | 245 shared_quad_state, |
243 quad_rect, | 246 quad_rect, |
244 opaque_rect, | 247 opaque_rect, |
245 visible_quad_rect, | 248 visible_quad_rect, |
246 frame_resources_[0], | 249 frame_resources_[0], |
247 scale * provider_client_impl_->stream_texture_matrix()); | 250 scale * provider_client_impl_->stream_texture_matrix()); |
248 quad_sink->Append(stream_video_quad.PassAs<DrawQuad>()); | 251 render_pass->AppendDrawQuad(stream_video_quad.PassAs<DrawQuad>()); |
249 break; | 252 break; |
250 } | 253 } |
251 case VideoFrameExternalResources::IO_SURFACE: { | 254 case VideoFrameExternalResources::IO_SURFACE: { |
252 DCHECK_EQ(frame_resources_.size(), 1u); | 255 DCHECK_EQ(frame_resources_.size(), 1u); |
253 if (frame_resources_.size() < 1u) | 256 if (frame_resources_.size() < 1u) |
254 break; | 257 break; |
255 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = | 258 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = |
256 IOSurfaceDrawQuad::Create(); | 259 IOSurfaceDrawQuad::Create(); |
257 io_surface_quad->SetNew(shared_quad_state, | 260 io_surface_quad->SetNew(shared_quad_state, |
258 quad_rect, | 261 quad_rect, |
259 opaque_rect, | 262 opaque_rect, |
260 visible_quad_rect, | 263 visible_quad_rect, |
261 visible_rect.size(), | 264 visible_rect.size(), |
262 frame_resources_[0], | 265 frame_resources_[0], |
263 IOSurfaceDrawQuad::UNFLIPPED); | 266 IOSurfaceDrawQuad::UNFLIPPED); |
264 quad_sink->Append(io_surface_quad.PassAs<DrawQuad>()); | 267 render_pass->AppendDrawQuad(io_surface_quad.PassAs<DrawQuad>()); |
265 break; | 268 break; |
266 } | 269 } |
267 #if defined(VIDEO_HOLE) | 270 #if defined(VIDEO_HOLE) |
268 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not | 271 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not |
269 // maintained by the general compositor team. Please contact the following | 272 // maintained by the general compositor team. Please contact the following |
270 // people instead: | 273 // people instead: |
271 // | 274 // |
272 // wonsik@chromium.org | 275 // wonsik@chromium.org |
273 // ycheo@chromium.org | 276 // ycheo@chromium.org |
274 case VideoFrameExternalResources::HOLE: { | 277 case VideoFrameExternalResources::HOLE: { |
275 DCHECK_EQ(frame_resources_.size(), 0u); | 278 DCHECK_EQ(frame_resources_.size(), 0u); |
276 scoped_ptr<SolidColorDrawQuad> solid_color_draw_quad = | 279 scoped_ptr<SolidColorDrawQuad> solid_color_draw_quad = |
277 SolidColorDrawQuad::Create(); | 280 SolidColorDrawQuad::Create(); |
278 | 281 |
279 // Create a solid color quad with transparent black and force no | 282 // Create a solid color quad with transparent black and force no |
280 // blending / no anti-aliasing. | 283 // blending / no anti-aliasing. |
281 gfx::Rect opaque_rect = quad_rect; | 284 gfx::Rect opaque_rect = quad_rect; |
282 solid_color_draw_quad->SetAll(shared_quad_state, | 285 solid_color_draw_quad->SetAll(shared_quad_state, |
283 quad_rect, | 286 quad_rect, |
284 opaque_rect, | 287 opaque_rect, |
285 visible_quad_rect, | 288 visible_quad_rect, |
286 false, | 289 false, |
287 SK_ColorTRANSPARENT, | 290 SK_ColorTRANSPARENT, |
288 true); | 291 true); |
289 quad_sink->Append(solid_color_draw_quad.PassAs<DrawQuad>()); | 292 render_pass->AppendDrawQuad(solid_color_draw_quad.PassAs<DrawQuad>()); |
290 break; | 293 break; |
291 } | 294 } |
292 #endif // defined(VIDEO_HOLE) | 295 #endif // defined(VIDEO_HOLE) |
293 case VideoFrameExternalResources::NONE: | 296 case VideoFrameExternalResources::NONE: |
294 NOTIMPLEMENTED(); | 297 NOTIMPLEMENTED(); |
295 break; | 298 break; |
296 } | 299 } |
297 } | 300 } |
298 | 301 |
299 void VideoLayerImpl::DidDraw(ResourceProvider* resource_provider) { | 302 void VideoLayerImpl::DidDraw(ResourceProvider* resource_provider) { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
332 void VideoLayerImpl::SetProviderClientImpl( | 335 void VideoLayerImpl::SetProviderClientImpl( |
333 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { | 336 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { |
334 provider_client_impl_ = provider_client_impl; | 337 provider_client_impl_ = provider_client_impl; |
335 } | 338 } |
336 | 339 |
337 const char* VideoLayerImpl::LayerTypeAsString() const { | 340 const char* VideoLayerImpl::LayerTypeAsString() const { |
338 return "cc::VideoLayerImpl"; | 341 return "cc::VideoLayerImpl"; |
339 } | 342 } |
340 | 343 |
341 } // namespace cc | 344 } // namespace cc |
OLD | NEW |