Index: cc/resources/video_resource_updater.cc |
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc |
index a2365ed5aeee38e93f2f1c045c28593ee18a6c2a..06ccde2d6ea3fe69aecc68d233d7f1f4ce946759 100644 |
--- a/cc/resources/video_resource_updater.cc |
+++ b/cc/resources/video_resource_updater.cc |
@@ -19,7 +19,13 @@ const unsigned kRGBResourceFormat = GL_RGBA; |
namespace cc { |
-VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {} |
+VideoFrameExternalResources::VideoFrameExternalResources() |
+#ifdef VIDEO_FRAME_MAILBOX |
+ : type(NONE) {} |
+#else |
+ : type(NONE), |
+ hardware_resource(0) {} |
+#endif |
VideoFrameExternalResources::~VideoFrameExternalResources() {} |
@@ -34,6 +40,18 @@ VideoResourceUpdater::~VideoResourceUpdater() { |
} |
} |
+VideoFrameExternalResources VideoResourceUpdater:: |
+ CreateExternalResourcesFromVideoFrame( |
+ const scoped_refptr<media::VideoFrame>& video_frame) { |
+ if (!VerifyFrame(video_frame)) |
+ return VideoFrameExternalResources(); |
+ |
+ if (video_frame->format() == media::VideoFrame::NATIVE_TEXTURE) |
+ return CreateForHardwarePlanes(video_frame); |
+ else |
+ return CreateForSoftwarePlanes(video_frame); |
+} |
+ |
bool VideoResourceUpdater::VerifyFrame( |
const scoped_refptr<media::VideoFrame>& video_frame) { |
// If these fail, we'll have to add logic that handles offset bitmap/texture |
@@ -97,9 +115,6 @@ static gfx::Size SoftwarePlaneDimension( |
VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( |
const scoped_refptr<media::VideoFrame>& video_frame) { |
- if (!VerifyFrame(video_frame)) |
- return VideoFrameExternalResources(); |
- |
media::VideoFrame::Format input_frame_format = video_frame->format(); |
#if defined(GOOGLE_TV) |
@@ -289,11 +304,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( |
} |
VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
- const scoped_refptr<media::VideoFrame>& video_frame, |
- const TextureMailbox::ReleaseCallback& release_callback) { |
- if (!VerifyFrame(video_frame)) |
- return VideoFrameExternalResources(); |
- |
+ const scoped_refptr<media::VideoFrame>& video_frame) { |
media::VideoFrame::Format frame_format = video_frame->format(); |
DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); |
@@ -322,37 +333,54 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
return VideoFrameExternalResources(); |
} |
- gpu::Mailbox mailbox; |
- GLC(context, context->genMailboxCHROMIUM(mailbox.name)); |
- GLC(context, context->bindTexture(GL_TEXTURE_2D, video_frame->texture_id())); |
- GLC(context, context->produceTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name)); |
- GLC(context, context->bindTexture(GL_TEXTURE_2D, 0)); |
+#ifndef VIDEO_FRAME_MAILBOX |
+ ResourceProvider::ResourceId hardware_resource = 0; |
+ hardware_resource = resource_provider_->CreateResourceFromExternalTexture( |
+ video_frame->texture_id()); |
+#endif |
+ // Hold a reference to the VideoFrame in the callback, so the frame stays |
+ // alive while the texture is in use. As long as the frame is alive, the |
+ // texture inside it will not be reused by the decoder. |
TextureMailbox::ReleaseCallback callback_to_return_resource = |
+#ifdef VIDEO_FRAME_MAILBOX |
+ base::Bind(&ReturnTexture, video_frame); |
+#else |
base::Bind(&ReturnTexture, |
+ video_frame, |
base::Unretained(resource_provider_), |
- release_callback, |
- video_frame->texture_id(), |
- mailbox); |
- external_resources.mailboxes.push_back( |
- TextureMailbox(mailbox, callback_to_return_resource)); |
+ hardware_resource); |
+#endif |
+ |
+#ifdef VIDEO_FRAME_MAILBOX |
+ external_resources.mailboxes.push_back( |
+ TextureMailbox(video_frame->texture_mailbox(), |
+ callback_to_return_resource, |
+ video_frame->texture_mailbox_sync_point())); |
+#else |
+ external_resources.hardware_resource = hardware_resource; |
+ external_resources.hardware_release_callback = callback_to_return_resource; |
+#endif |
return external_resources; |
} |
// static |
void VideoResourceUpdater::ReturnTexture( |
+ scoped_refptr<media::VideoFrame> video_frame, |
+#ifndef VIDEO_FRAME_MAILBOX |
ResourceProvider* resource_provider, |
- TextureMailbox::ReleaseCallback callback, |
- unsigned texture_id, |
- gpu::Mailbox mailbox, |
+ unsigned resource_id, |
+#endif |
unsigned sync_point, |
bool lost_resource) { |
- WebKit::WebGraphicsContext3D* context = |
- resource_provider->GraphicsContext3D(); |
- GLC(context, context->bindTexture(GL_TEXTURE_2D, texture_id)); |
- GLC(context, context->consumeTextureCHROMIUM(GL_TEXTURE_2D, mailbox.name)); |
- GLC(context, context->bindTexture(GL_TEXTURE_2D, 0)); |
- callback.Run(sync_point, lost_resource); |
+#ifndef VIDEO_FRAME_MAILBOX |
+ resource_provider->DeleteResource(resource_id); |
+#else |
+ video_frame->set_texture_mailbox_sync_point(sync_point); |
+#endif |
+ |
+ // Dropping the reference to VideoFrame here releases the texture back to the |
+ // decoder. |
} |
// static |