Index: cc/layers/video_layer_impl.cc |
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc |
index 1db6856a45b276941a8b63a7a62cc33f654d2b8b..9607be33c4646356978d61cda32c6a45620a5b23 100644 |
--- a/cc/layers/video_layer_impl.cc |
+++ b/cc/layers/video_layer_impl.cc |
@@ -37,7 +37,8 @@ scoped_ptr<VideoLayerImpl> VideoLayerImpl::Create( |
VideoLayerImpl::VideoLayerImpl(LayerTreeImpl* tree_impl, int id) |
: LayerImpl(tree_impl, id), |
- frame_(NULL) {} |
+ frame_(NULL), |
+ hardware_resource_(0) {} |
VideoLayerImpl::~VideoLayerImpl() { |
if (!provider_client_impl_->Stopped()) { |
@@ -68,8 +69,6 @@ void VideoLayerImpl::DidBecomeActive() { |
provider_client_impl_->set_active_video_layer(this); |
} |
-static void EmptyCallback(unsigned sync_point, bool lost_resource) {} |
- |
void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) { |
LayerImpl::WillDraw(resource_provider); |
@@ -93,18 +92,8 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) { |
if (!updater_) |
updater_.reset(new VideoResourceUpdater(resource_provider)); |
- VideoFrameExternalResources external_resources; |
- if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE) { |
- // TODO(danakj): To make this work for ubercomp, push this code out to |
- // WebMediaPlayer and have it set a callback so it knows it can reuse the |
- // texture. |
- TextureMailbox::ReleaseCallback empty_callback = base::Bind(&EmptyCallback); |
- external_resources = updater_->CreateForHardwarePlanes( |
- frame_, empty_callback); |
- } else { |
- external_resources = updater_->CreateForSoftwarePlanes(frame_); |
- } |
- |
+ VideoFrameExternalResources external_resources = |
+ updater_->CreateExternalResourcesFromVideoFrame(frame_); |
frame_resource_type_ = external_resources.type; |
if (external_resources.type == |
@@ -115,6 +104,15 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) { |
return; |
} |
+#ifndef VIDEO_FRAME_MAILBOX |
+ if (external_resources.hardware_resource) { |
+ hardware_resource_ = external_resources.hardware_resource; |
+ hardware_release_callback_ = |
+ external_resources.hardware_release_callback; |
+ return; |
+ } |
+#endif |
+ |
for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) { |
frame_resources_.push_back( |
resource_provider->CreateResourceFromTextureMailbox( |
@@ -184,9 +182,11 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
break; |
} |
case VideoFrameExternalResources::RGB_RESOURCE: { |
- DCHECK_EQ(frame_resources_.size(), 1u); |
- if (frame_resources_.size() < 1u) |
- break; |
+ if (!hardware_resource_) { |
+ DCHECK_EQ(frame_resources_.size(), 1u); |
+ if (frame_resources_.size() < 1u) |
+ break; |
+ } |
bool premultiplied_alpha = true; |
gfx::PointF uv_top_left(0.f, 0.f); |
gfx::PointF uv_bottom_right(tex_width_scale, tex_height_scale); |
@@ -196,7 +196,8 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
texture_quad->SetNew(shared_quad_state, |
quad_rect, |
opaque_rect, |
- frame_resources_[0], |
+ hardware_resource_ ? hardware_resource_ |
+ : frame_resources_[0], |
premultiplied_alpha, |
uv_top_left, |
uv_bottom_right, |
@@ -206,9 +207,11 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
break; |
} |
case VideoFrameExternalResources::STREAM_TEXTURE_RESOURCE: { |
- DCHECK_EQ(frame_resources_.size(), 1u); |
- if (frame_resources_.size() < 1u) |
- break; |
+ if (!hardware_resource_) { |
+ DCHECK_EQ(frame_resources_.size(), 1u); |
+ if (frame_resources_.size() < 1u) |
+ break; |
+ } |
gfx::Transform transform( |
provider_client_impl_->stream_texture_matrix()); |
transform.Scale(tex_width_scale, tex_height_scale); |
@@ -217,16 +220,19 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
stream_video_quad->SetNew(shared_quad_state, |
quad_rect, |
opaque_rect, |
- frame_resources_[0], |
+ hardware_resource_ ? hardware_resource_ |
+ : frame_resources_[0], |
transform); |
quad_sink->Append(stream_video_quad.PassAs<DrawQuad>(), |
append_quads_data); |
break; |
} |
case VideoFrameExternalResources::IO_SURFACE: { |
- DCHECK_EQ(frame_resources_.size(), 1u); |
- if (frame_resources_.size() < 1u) |
- break; |
+ if (!hardware_resource_) { |
+ DCHECK_EQ(frame_resources_.size(), 1u); |
+ if (frame_resources_.size() < 1u) |
+ break; |
+ } |
gfx::Size visible_size(visible_rect.width(), visible_rect.height()); |
scoped_ptr<IOSurfaceDrawQuad> io_surface_quad = |
IOSurfaceDrawQuad::Create(); |
@@ -234,7 +240,8 @@ void VideoLayerImpl::AppendQuads(QuadSink* quad_sink, |
quad_rect, |
opaque_rect, |
visible_size, |
- frame_resources_[0], |
+ hardware_resource_ ? hardware_resource_ |
+ : frame_resources_[0], |
IOSurfaceDrawQuad::UNFLIPPED); |
quad_sink->Append(io_surface_quad.PassAs<DrawQuad>(), |
append_quads_data); |
@@ -280,6 +287,10 @@ void VideoLayerImpl::DidDraw(ResourceProvider* resource_provider) { |
software_resources_.clear(); |
software_release_callback_.Reset(); |
+ } else if (hardware_resource_) { |
+ hardware_release_callback_.Run(0, false); |
+ hardware_resource_ = 0; |
+ hardware_release_callback_.Reset(); |
} else { |
for (size_t i = 0; i < frame_resources_.size(); ++i) |
resource_provider->DeleteResource(frame_resources_[i]); |