Index: cc/resources/video_resource_updater.cc |
diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc |
index 9a72d64171d8a465c1b900f1868dafe5b1414bc3..1b60d0b07497b6a64835c727ac817151f31be2be 100644 |
--- a/cc/resources/video_resource_updater.cc |
+++ b/cc/resources/video_resource_updater.cc |
@@ -19,8 +19,7 @@ const unsigned kRGBResourceFormat = GL_RGBA; |
namespace cc { |
-VideoFrameExternalResources::VideoFrameExternalResources() |
- : type(NONE), hardware_resource(0) {} |
+VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {} |
VideoFrameExternalResources::~VideoFrameExternalResources() {} |
@@ -42,6 +41,18 @@ void VideoResourceUpdater::DeleteResource(unsigned resource_id) { |
resource_id)); |
} |
+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 |
@@ -108,9 +119,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) |
@@ -308,11 +316,15 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( |
return external_resources; |
} |
+static void ReturnTexture( |
+ scoped_refptr<media::VideoFrame::MailboxHolder> mailbox_holder, |
+ unsigned sync_point, |
+ bool lost_resource) { |
+ mailbox_holder->Return(sync_point); |
+} |
+ |
VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
const scoped_refptr<media::VideoFrame>& video_frame) { |
- if (!VerifyFrame(video_frame)) |
- return VideoFrameExternalResources(); |
- |
media::VideoFrame::Format frame_format = video_frame->format(); |
DCHECK_EQ(frame_format, media::VideoFrame::NATIVE_TEXTURE); |
@@ -341,33 +353,18 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
return VideoFrameExternalResources(); |
} |
- external_resources.hardware_resource = |
- resource_provider_->CreateResourceFromExternalTexture( |
- video_frame->texture_target(), |
- video_frame->texture_id()); |
- if (external_resources.hardware_resource) |
- all_resources_.push_back(external_resources.hardware_resource); |
+ scoped_refptr<media::VideoFrame::MailboxHolder> mailbox_holder = |
+ video_frame->texture_mailbox(); |
TextureMailbox::ReleaseCallback callback_to_return_resource = |
- base::Bind(&ReturnTexture, |
- AsWeakPtr(), |
- external_resources.hardware_resource); |
- external_resources.hardware_release_callback = callback_to_return_resource; |
- return external_resources; |
-} |
+ base::Bind(&ReturnTexture, mailbox_holder); |
-// static |
-void VideoResourceUpdater::ReturnTexture( |
- base::WeakPtr<VideoResourceUpdater> updater, |
- unsigned resource_id, |
- unsigned sync_point, |
- bool lost_resource) { |
- if (!updater.get()) { |
- // Resource was already deleted. |
- return; |
- } |
- |
- updater->DeleteResource(resource_id); |
+ external_resources.mailboxes.push_back( |
+ TextureMailbox(mailbox_holder->mailbox(), |
+ callback_to_return_resource, |
+ video_frame->texture_target(), |
+ mailbox_holder->sync_point())); |
+ return external_resources; |
} |
// static |