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" | 9 #include "cc/layers/quad_sink.h" |
10 #include "cc/layers/video_frame_provider_client_impl.h" | 10 #include "cc/layers/video_frame_provider_client_impl.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 VideoFrameProvider* provider) { | 30 VideoFrameProvider* provider) { |
31 scoped_ptr<VideoLayerImpl> layer(new VideoLayerImpl(tree_impl, id)); | 31 scoped_ptr<VideoLayerImpl> layer(new VideoLayerImpl(tree_impl, id)); |
32 layer->SetProviderClientImpl(VideoFrameProviderClientImpl::Create(provider)); | 32 layer->SetProviderClientImpl(VideoFrameProviderClientImpl::Create(provider)); |
33 DCHECK(tree_impl->proxy()->IsImplThread()); | 33 DCHECK(tree_impl->proxy()->IsImplThread()); |
34 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); | 34 DCHECK(tree_impl->proxy()->IsMainThreadBlocked()); |
35 return layer.Pass(); | 35 return layer.Pass(); |
36 } | 36 } |
37 | 37 |
38 VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, int id) | 38 VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, int id) |
39 : LayerImpl(tree_impl, id), | 39 : LayerImpl(tree_impl, id), |
40 frame_(NULL), | 40 frame_(NULL) {} |
41 hardware_resource_(0) {} | |
42 | 41 |
43 VideoLayerImpl::~VideoLayerImpl() { | 42 VideoLayerImpl::~VideoLayerImpl() { |
44 if (!provider_client_impl_->Stopped()) { | 43 if (!provider_client_impl_->Stopped()) { |
45 // In impl side painting, we may have a pending and active layer | 44 // In impl side painting, we may have a pending and active layer |
46 // associated with the video provider at the same time. Both have a ref | 45 // associated with the video provider at the same time. Both have a ref |
47 // on the VideoFrameProviderClientImpl, but we stop when the first | 46 // on the VideoFrameProviderClientImpl, but we stop when the first |
48 // LayerImpl (the one on the pending tree) is destroyed since we know | 47 // LayerImpl (the one on the pending tree) is destroyed since we know |
49 // the main thread is blocked for this commit. | 48 // the main thread is blocked for this commit. |
50 DCHECK(layer_tree_impl()->proxy()->IsImplThread()); | 49 DCHECK(layer_tree_impl()->proxy()->IsImplThread()); |
51 DCHECK(layer_tree_impl()->proxy()->IsMainThreadBlocked()); | 50 DCHECK(layer_tree_impl()->proxy()->IsMainThreadBlocked()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 | 88 |
90 provider_client_impl_->ReleaseLock(); | 89 provider_client_impl_->ReleaseLock(); |
91 return false; | 90 return false; |
92 } | 91 } |
93 | 92 |
94 LayerImpl::WillDraw(draw_mode, resource_provider); | 93 LayerImpl::WillDraw(draw_mode, resource_provider); |
95 | 94 |
96 if (!updater_) | 95 if (!updater_) |
97 updater_.reset(new VideoResourceUpdater(resource_provider)); | 96 updater_.reset(new VideoResourceUpdater(resource_provider)); |
98 | 97 |
99 VideoFrameExternalResources external_resources; | 98 VideoFrameExternalResources external_resources = |
100 if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE) | 99 updater_->CreateExternalResourcesFromVideoFrame(frame_); |
101 external_resources = updater_->CreateForHardwarePlanes(frame_); | |
102 else | |
103 external_resources = updater_->CreateForSoftwarePlanes(frame_); | |
104 | |
105 frame_resource_type_ = external_resources.type; | 100 frame_resource_type_ = external_resources.type; |
106 | 101 |
107 if (external_resources.type == | 102 if (external_resources.type == |
108 VideoFrameExternalResources::SOFTWARE_RESOURCE) { | 103 VideoFrameExternalResources::SOFTWARE_RESOURCE) { |
109 software_resources_ = external_resources.software_resources; | 104 software_resources_ = external_resources.software_resources; |
110 software_release_callback_ = | 105 software_release_callback_ = |
111 external_resources.software_release_callback; | 106 external_resources.software_release_callback; |
112 return true; | 107 return true; |
113 } | 108 } |
114 | 109 |
115 if (external_resources.hardware_resource) { | |
116 hardware_resource_ = external_resources.hardware_resource; | |
117 hardware_release_callback_ = | |
118 external_resources.hardware_release_callback; | |
119 return true; | |
120 } | |
121 | |
122 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { | 110 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
123 frame_resources_.push_back( | 111 frame_resources_.push_back( |
124 resource_provider->CreateResourceFromTextureMailbox( | 112 resource_provider->CreateResourceFromTextureMailbox( |
125 external_resources.mailboxes[i])); | 113 external_resources.mailboxes[i])); |
126 } | 114 } |
127 | 115 |
128 return true; | 116 return true; |
129 } | 117 } |
130 | 118 |
131 void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, | 119 void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
184 tex_scale, | 172 tex_scale, |
185 frame_resources_[0], | 173 frame_resources_[0], |
186 frame_resources_[1], | 174 frame_resources_[1], |
187 frame_resources_[2], | 175 frame_resources_[2], |
188 frame_resources_.size() > 3 ? | 176 frame_resources_.size() > 3 ? |
189 frame_resources_[3] : 0); | 177 frame_resources_[3] : 0); |
190 quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data); | 178 quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data); |
191 break; | 179 break; |
192 } | 180 } |
193 case VideoFrameExternalResources::RGB_RESOURCE: { | 181 case VideoFrameExternalResources::RGB_RESOURCE: { |
194 if (!hardware_resource_) { | 182 DCHECK_EQ(frame_resources_.size(), 1u); |
195 DCHECK_EQ(frame_resources_.size(), 1u); | 183 if (frame_resources_.size() < 1u) |
196 if (frame_resources_.size() < 1u) | 184 break; |
197 break; | |
198 } | |
199 bool premultiplied_alpha = true; | 185 bool premultiplied_alpha = true; |
200 gfx::PointF uv_top_left(0.f, 0.f); | 186 gfx::PointF uv_top_left(0.f, 0.f); |
201 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); | 187 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
202 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; | 188 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; |
203 bool flipped = false; | 189 bool flipped = false; |
204 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create(); | 190 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create(); |
205 texture_quad->SetNew(shared_quad_state, | 191 texture_quad->SetNew(shared_quad_state, |
206 quad_rect, | 192 quad_rect, |
207 opaque_rect, | 193 opaque_rect, |
208 hardware_resource_ ? hardware_resource_ | 194 frame_resources_[0], |
209 : frame_resources_[0], | |
210 premultiplied_alpha, | 195 premultiplied_alpha, |
211 uv_top_left, | 196 uv_top_left, |
212 uv_bottom_right, | 197 uv_bottom_right, |
213 opacity, | 198 opacity, |
214 flipped); | 199 flipped); |
215 quad_sink->Append(texture_quad.PassAs<DrawQuad>(), append_quads_data); | 200 quad_sink->Append(texture_quad.PassAs<DrawQuad>(), append_quads_data); |
216 break; | 201 break; |
217 } | 202 } |
218 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { | 203 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
219 if (!hardware_resource_) { | 204 DCHECK_EQ(frame_resources_.size(), 1u); |
220 DCHECK_EQ(frame_resources_.size(), 1u); | 205 if (frame_resources_.size() < 1u) |
221 if (frame_resources_.size() < 1u) | 206 break; |
222 break; | |
223 } | |
224 gfx::Transform transform( | 207 gfx::Transform transform( |
225 provider_client_impl_->stream_texture_matrix()); | 208 provider_client_impl_->stream_texture_matrix()); |
226 transform.Scale(tex_width_scale, tex_height_scale); | 209 transform.Scale(tex_width_scale, tex_height_scale); |
227 scoped_ptr<StreamVideoDrawQuad> stream_video_quad = | 210 scoped_ptr<StreamVideoDrawQuad> stream_video_quad = |
228 StreamVideoDrawQuad::Create(); | 211 StreamVideoDrawQuad::Create(); |
229 stream_video_quad->SetNew(shared_quad_state, | 212 stream_video_quad->SetNew(shared_quad_state, |
230 quad_rect, | 213 quad_rect, |
231 opaque_rect, | 214 opaque_rect, |
232 hardware_resource_ ? hardware_resource_ | 215 frame_resources_[0], |
233 : frame_resources_[0], | |
234 transform); | 216 transform); |
235 quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(), | 217 quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(), |
236 append_quads_data); | 218 append_quads_data); |
237 break; | 219 break; |
238 } | 220 } |
239 case VideoFrameExternalResources::IO_SURFACE: { | 221 case VideoFrameExternalResources::IO_SURFACE: { |
240 if (!hardware_resource_) { | 222 DCHECK_EQ(frame_resources_.size(), 1u); |
241 DCHECK_EQ(frame_resources_.size(), 1u); | 223 if (frame_resources_.size() < 1u) |
242 if (frame_resources_.size() < 1u) | 224 break; |
243 break; | |
244 } | |
245 gfx::Size visible_size(visible_rect.width(), visible_rect.height()); | 225 gfx::Size visible_size(visible_rect.width(), visible_rect.height()); |
246 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = | 226 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = |
247 IOSurfaceDrawQuad::Create(); | 227 IOSurfaceDrawQuad::Create(); |
248 io_surface_quad->SetNew(shared_quad_state, | 228 io_surface_quad->SetNew(shared_quad_state, |
249 quad_rect, | 229 quad_rect, |
250 opaque_rect, | 230 opaque_rect, |
251 visible_size, | 231 visible_size, |
252 hardware_resource_ ? hardware_resource_ | 232 frame_resources_[0], |
253 : frame_resources_[0], | |
254 IOSurfaceDrawQuad::UNFLIPPED); | 233 IOSurfaceDrawQuad::UNFLIPPED); |
255 quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(), | 234 quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(), |
256 append_quads_data); | 235 append_quads_data); |
257 break; | 236 break; |
258 } | 237 } |
259 #if defined(GOOGLE_TV) | 238 #if defined(GOOGLE_TV) |
260 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not | 239 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not |
261 // maintained by the general compositor team. Please contact the following | 240 // maintained by the general compositor team. Please contact the following |
262 // people instead: | 241 // people instead: |
263 // | 242 // |
(...skipping 25 matching lines...) Expand all Loading... |
289 | 268 |
290 DCHECK(frame_.get()); | 269 DCHECK(frame_.get()); |
291 | 270 |
292 if (frame_resource_type_ == | 271 if (frame_resource_type_ == |
293 VideoFrameExternalResources::SOFTWARE_RESOURCE) { | 272 VideoFrameExternalResources::SOFTWARE_RESOURCE) { |
294 for (size_t i = 0; i < software_resources_.size(); ++i) | 273 for (size_t i = 0; i < software_resources_.size(); ++i) |
295 software_release_callback_.Run(0, false); | 274 software_release_callback_.Run(0, false); |
296 | 275 |
297 software_resources_.clear(); | 276 software_resources_.clear(); |
298 software_release_callback_.Reset(); | 277 software_release_callback_.Reset(); |
299 } else if (hardware_resource_) { | |
300 hardware_release_callback_.Run(0, false); | |
301 hardware_resource_ = 0; | |
302 hardware_release_callback_.Reset(); | |
303 } else { | 278 } else { |
304 for (size_t i = 0; i < frame_resources_.size(); ++i) | 279 for (size_t i = 0; i < frame_resources_.size(); ++i) |
305 resource_provider->DeleteResource(frame_resources_[i]); | 280 resource_provider->DeleteResource(frame_resources_[i]); |
306 frame_resources_.clear(); | 281 frame_resources_.clear(); |
307 } | 282 } |
308 | 283 |
309 provider_client_impl_->PutCurrentFrame(frame_); | 284 provider_client_impl_->PutCurrentFrame(frame_); |
310 frame_ = NULL; | 285 frame_ = NULL; |
311 | 286 |
312 provider_client_impl_->ReleaseLock(); | 287 provider_client_impl_->ReleaseLock(); |
(...skipping 11 matching lines...) Expand all Loading... |
324 void VideoLayerImpl::SetProviderClientImpl( | 299 void VideoLayerImpl::SetProviderClientImpl( |
325 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { | 300 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { |
326 provider_client_impl_ = provider_client_impl; | 301 provider_client_impl_ = provider_client_impl; |
327 } | 302 } |
328 | 303 |
329 const char* VideoLayerImpl::LayerTypeAsString() const { | 304 const char* VideoLayerImpl::LayerTypeAsString() const { |
330 return "cc::VideoLayerImpl"; | 305 return "cc::VideoLayerImpl"; |
331 } | 306 } |
332 | 307 |
333 } // namespace cc | 308 } // namespace cc |
OLD | NEW |