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

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

Issue 14199002: Send hardware video frames with mailboxes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: video-mailbox: virtualandroid Created 7 years, 5 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 | Annotate | Revision Log
« no previous file with comments | « cc/layers/video_layer_impl.h ('k') | cc/resources/video_resource_updater.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/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
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
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
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
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
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
OLDNEW
« no previous file with comments | « cc/layers/video_layer_impl.h ('k') | cc/resources/video_resource_updater.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698