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

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: Use the texture target in the hardware video frame Created 7 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 | Annotate | Revision Log
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 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
85 // Drop any resources used by the updater if there is no frame to display. 84 // Drop any resources used by the updater if there is no frame to display.
86 updater_.reset(); 85 updater_.reset();
87 86
88 provider_client_impl_->ReleaseLock(); 87 provider_client_impl_->ReleaseLock();
89 return; 88 return;
90 } 89 }
91 90
92 if (!updater_) 91 if (!updater_)
93 updater_.reset(new VideoResourceUpdater(resource_provider)); 92 updater_.reset(new VideoResourceUpdater(resource_provider));
94 93
95 VideoFrameExternalResources external_resources; 94 VideoFrameExternalResources external_resources =
96 if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE) 95 updater_->CreateExternalResourcesFromVideoFrame(frame_);
97 external_resources = updater_->CreateForHardwarePlanes(frame_);
98 else
99 external_resources = updater_->CreateForSoftwarePlanes(frame_);
100
101 frame_resource_type_ = external_resources.type; 96 frame_resource_type_ = external_resources.type;
102 97
103 if (external_resources.type == 98 if (external_resources.type ==
104 VideoFrameExternalResources::SOFTWARE_RESOURCE) { 99 VideoFrameExternalResources::SOFTWARE_RESOURCE) {
105 software_resources_ = external_resources.software_resources; 100 software_resources_ = external_resources.software_resources;
106 software_release_callback_ = 101 software_release_callback_ =
107 external_resources.software_release_callback; 102 external_resources.software_release_callback;
108 return; 103 return;
109 } 104 }
110 105
111 if (external_resources.hardware_resource) {
112 hardware_resource_ = external_resources.hardware_resource;
113 hardware_release_callback_ =
114 external_resources.hardware_release_callback;
115 return;
116 }
117
118 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { 106 for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) {
119 frame_resources_.push_back( 107 frame_resources_.push_back(
120 resource_provider->CreateResourceFromTextureMailbox( 108 resource_provider->CreateResourceFromTextureMailbox(
121 external_resources.mailboxes[i])); 109 external_resources.mailboxes[i]));
122 } 110 }
123 } 111 }
124 112
125 void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, 113 void VideoLayerImpl::AppendQuads(QuadSink* quad_sink,
126 AppendQuadsData* append_quads_data) { 114 AppendQuadsData* append_quads_data) {
127 if (!frame_) 115 if (!frame_)
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 quad_rect, 165 quad_rect,
178 opaque_rect, 166 opaque_rect,
179 tex_scale, 167 tex_scale,
180 frame_resources_[0], 168 frame_resources_[0],
181 frame_resources_[1], 169 frame_resources_[1],
182 frame_resources_[2]); 170 frame_resources_[2]);
183 quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data); 171 quad_sink->Append(yuv_video_quad.PassAs<DrawQuad>(), append_quads_data);
184 break; 172 break;
185 } 173 }
186 case VideoFrameExternalResources::RGB_RESOURCE: { 174 case VideoFrameExternalResources::RGB_RESOURCE: {
187 if (!hardware_resource_) { 175 DCHECK_EQ(frame_resources_.size(), 1u);
188 DCHECK_EQ(frame_resources_.size(), 1u); 176 if (frame_resources_.size() < 1u)
189 if (frame_resources_.size() < 1u) 177 break;
190 break;
191 }
192 bool premultiplied_alpha = true; 178 bool premultiplied_alpha = true;
193 gfx::PointF uv_top_left(0.f, 0.f); 179 gfx::PointF uv_top_left(0.f, 0.f);
194 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); 180 gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale);
195 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f}; 181 float opacity[] = {1.0f, 1.0f, 1.0f, 1.0f};
196 bool flipped = false; 182 bool flipped = false;
197 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create(); 183 scoped_ptr<TextureDrawQuad> texture_quad = TextureDrawQuad::Create();
198 texture_quad->SetNew(shared_quad_state, 184 texture_quad->SetNew(shared_quad_state,
199 quad_rect, 185 quad_rect,
200 opaque_rect, 186 opaque_rect,
201 hardware_resource_ ? hardware_resource_ 187 frame_resources_[0],
202 : frame_resources_[0],
203 premultiplied_alpha, 188 premultiplied_alpha,
204 uv_top_left, 189 uv_top_left,
205 uv_bottom_right, 190 uv_bottom_right,
206 opacity, 191 opacity,
207 flipped); 192 flipped);
208 quad_sink->Append(texture_quad.PassAs<DrawQuad>(), append_quads_data); 193 quad_sink->Append(texture_quad.PassAs<DrawQuad>(), append_quads_data);
209 break; 194 break;
210 } 195 }
211 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { 196 case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: {
212 if (!hardware_resource_) { 197 DCHECK_EQ(frame_resources_.size(), 1u);
213 DCHECK_EQ(frame_resources_.size(), 1u); 198 if (frame_resources_.size() < 1u)
214 if (frame_resources_.size() < 1u) 199 break;
215 break;
216 }
217 gfx::Transform transform( 200 gfx::Transform transform(
218 provider_client_impl_->stream_texture_matrix()); 201 provider_client_impl_->stream_texture_matrix());
219 transform.Scale(tex_width_scale, tex_height_scale); 202 transform.Scale(tex_width_scale, tex_height_scale);
220 scoped_ptr<StreamVideoDrawQuad> stream_video_quad = 203 scoped_ptr<StreamVideoDrawQuad> stream_video_quad =
221 StreamVideoDrawQuad::Create(); 204 StreamVideoDrawQuad::Create();
222 stream_video_quad->SetNew(shared_quad_state, 205 stream_video_quad->SetNew(shared_quad_state,
223 quad_rect, 206 quad_rect,
224 opaque_rect, 207 opaque_rect,
225 hardware_resource_ ? hardware_resource_ 208 frame_resources_[0],
226 : frame_resources_[0],
227 transform); 209 transform);
228 quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(), 210 quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(),
229 append_quads_data); 211 append_quads_data);
230 break; 212 break;
231 } 213 }
232 case VideoFrameExternalResources::IO_SURFACE: { 214 case VideoFrameExternalResources::IO_SURFACE: {
233 if (!hardware_resource_) { 215 DCHECK_EQ(frame_resources_.size(), 1u);
234 DCHECK_EQ(frame_resources_.size(), 1u); 216 if (frame_resources_.size() < 1u)
235 if (frame_resources_.size() < 1u) 217 break;
236 break;
237 }
238 gfx::Size visible_size(visible_rect.width(), visible_rect.height()); 218 gfx::Size visible_size(visible_rect.width(), visible_rect.height());
239 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = 219 scoped_ptr<IOSurfaceDrawQuad> io_surface_quad =
240 IOSurfaceDrawQuad::Create(); 220 IOSurfaceDrawQuad::Create();
241 io_surface_quad->SetNew(shared_quad_state, 221 io_surface_quad->SetNew(shared_quad_state,
242 quad_rect, 222 quad_rect,
243 opaque_rect, 223 opaque_rect,
244 visible_size, 224 visible_size,
245 hardware_resource_ ? hardware_resource_ 225 frame_resources_[0],
246 : frame_resources_[0],
247 IOSurfaceDrawQuad::UNFLIPPED); 226 IOSurfaceDrawQuad::UNFLIPPED);
248 quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(), 227 quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(),
249 append_quads_data); 228 append_quads_data);
250 break; 229 break;
251 } 230 }
252 #if defined(GOOGLE_TV) 231 #if defined(GOOGLE_TV)
253 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not 232 // This block and other blocks wrapped around #if defined(GOOGLE_TV) is not
254 // maintained by the general compositor team. Please contact the following 233 // maintained by the general compositor team. Please contact the following
255 // people instead: 234 // people instead:
256 // 235 //
(...skipping 25 matching lines...) Expand all
282 if (!frame_) 261 if (!frame_)
283 return; 262 return;
284 263
285 if (frame_resource_type_ == 264 if (frame_resource_type_ ==
286 VideoFrameExternalResources::SOFTWARE_RESOURCE) { 265 VideoFrameExternalResources::SOFTWARE_RESOURCE) {
287 for (size_t i = 0; i < software_resources_.size(); ++i) 266 for (size_t i = 0; i < software_resources_.size(); ++i)
288 software_release_callback_.Run(0, false); 267 software_release_callback_.Run(0, false);
289 268
290 software_resources_.clear(); 269 software_resources_.clear();
291 software_release_callback_.Reset(); 270 software_release_callback_.Reset();
292 } else if (hardware_resource_) {
293 hardware_release_callback_.Run(0, false);
294 hardware_resource_ = 0;
295 hardware_release_callback_.Reset();
296 } else { 271 } else {
297 for (size_t i = 0; i < frame_resources_.size(); ++i) 272 for (size_t i = 0; i < frame_resources_.size(); ++i)
298 resource_provider->DeleteResource(frame_resources_[i]); 273 resource_provider->DeleteResource(frame_resources_[i]);
299 frame_resources_.clear(); 274 frame_resources_.clear();
300 } 275 }
301 276
302 provider_client_impl_->PutCurrentFrame(frame_); 277 provider_client_impl_->PutCurrentFrame(frame_);
303 frame_ = NULL; 278 frame_ = NULL;
304 279
305 provider_client_impl_->ReleaseLock(); 280 provider_client_impl_->ReleaseLock();
(...skipping 11 matching lines...) Expand all
317 void VideoLayerImpl::SetProviderClientImpl( 292 void VideoLayerImpl::SetProviderClientImpl(
318 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) { 293 scoped_refptr<VideoFrameProviderClientImpl> provider_client_impl) {
319 provider_client_impl_ = provider_client_impl; 294 provider_client_impl_ = provider_client_impl;
320 } 295 }
321 296
322 const char* VideoLayerImpl::LayerTypeAsString() const { 297 const char* VideoLayerImpl::LayerTypeAsString() const {
323 return "VideoLayer"; 298 return "VideoLayer";
324 } 299 }
325 300
326 } // namespace cc 301 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698