diff options
author | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-13 16:47:51 +0000 |
---|---|---|
committer | danakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-04-13 16:47:51 +0000 |
commit | 7a80d3d4b037284b13543f5bddf230b9e808e44f (patch) | |
tree | 19559c375a5541d9668728c80a8151672f46e8c9 /cc/layers/video_layer_impl.cc | |
parent | 72f4e33df08a6106d236ddd9d1f29041367aa5a5 (diff) | |
download | chromium_src-7a80d3d4b037284b13543f5bddf230b9e808e44f.zip chromium_src-7a80d3d4b037284b13543f5bddf230b9e808e44f.tar.gz chromium_src-7a80d3d4b037284b13543f5bddf230b9e808e44f.tar.bz2 |
cc: Don't do produce/consume on the texture id given in VideoFrame.
This texture id is used for hardware readback to webgl, so producing
the texture id breaks that path.
Instead, add a hardware_resource ResourceId to pass along with the
video frame resources to the VideoLayerImpl. This is a resource id
wrapping the hardware decoder texture. Once we have shared mailboxes
this can be removed, and we can just pass the Mailbox from the
VideoFrame to the video layer.
R=enne,piman
BUG=179729
Review URL: https://chromiumcodereview.appspot.com/14007004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@194108 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'cc/layers/video_layer_impl.cc')
-rw-r--r-- | cc/layers/video_layer_impl.cc | 61 |
1 files changed, 37 insertions, 24 deletions
diff --git a/cc/layers/video_layer_impl.cc b/cc/layers/video_layer_impl.cc index 1db6856..7f27695 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]); |