| 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..7f2769504d27e3c2f0624863fb83d35cf178b959 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);
|
|
|
| @@ -94,16 +93,10 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) {
|
| 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 {
|
| + if (frame_->format() == media::VideoFrame::NATIVE_TEXTURE)
|
| + external_resources = updater_->CreateForHardwarePlanes(frame_);
|
| + else
|
| external_resources = updater_->CreateForSoftwarePlanes(frame_);
|
| - }
|
|
|
| frame_resource_type_ = external_resources.type;
|
|
|
| @@ -115,6 +108,13 @@ void VideoLayerImpl::WillDraw(ResourceProvider* resource_provider) {
|
| return;
|
| }
|
|
|
| + if (external_resources.hardware_resource) {
|
| + hardware_resource_ = external_resources.hardware_resource;
|
| + hardware_release_callback_ =
|
| + external_resources.hardware_release_callback;
|
| + return;
|
| + }
|
| +
|
| for (size_t i = 0; i < external_resources.mailboxes.size(); ++i) {
|
| frame_resources_.push_back(
|
| resource_provider->CreateResourceFromTextureMailbox(
|
| @@ -184,9 +184,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 +198,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 +209,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 +222,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 +242,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 +289,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]);
|
|
|