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

Unified 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: Ifdefed 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 side-by-side diff with in-line comments
Download patch
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]);

Powered by Google App Engine
This is Rietveld 408576698