summaryrefslogtreecommitdiffstats
path: root/cc/layers/video_layer_impl.cc
diff options
context:
space:
mode:
authordanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-13 16:47:51 +0000
committerdanakj@chromium.org <danakj@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-04-13 16:47:51 +0000
commit7a80d3d4b037284b13543f5bddf230b9e808e44f (patch)
tree19559c375a5541d9668728c80a8151672f46e8c9 /cc/layers/video_layer_impl.cc
parent72f4e33df08a6106d236ddd9d1f29041367aa5a5 (diff)
downloadchromium_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.cc61
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]);