Chromium Code Reviews| Index: cc/resources/video_resource_updater.cc |
| diff --git a/cc/resources/video_resource_updater.cc b/cc/resources/video_resource_updater.cc |
| index c20d4b143e2ea2e7b388ffd870a28ccb5165b901..731e99aa5c641c55a4195c56d2e8eacc0194cb76 100644 |
| --- a/cc/resources/video_resource_updater.cc |
| +++ b/cc/resources/video_resource_updater.cc |
| @@ -18,9 +18,28 @@ |
| namespace cc { |
| +namespace { |
| + |
| const ResourceFormat kYUVResourceFormat = LUMINANCE_8; |
| const ResourceFormat kRGBResourceFormat = RGBA_8888; |
| +class SyncPointClientImpl : public media::VideoFrame::SyncPointClient { |
| + public: |
| + explicit SyncPointClientImpl(gpu::gles2::GLES2Interface* gl) : gl_(gl) {} |
| + virtual ~SyncPointClientImpl() {} |
| + virtual uint32 InsertSyncPoint() OVERRIDE { |
| + return GLC(gl_, gl_->InsertSyncPointCHROMIUM()); |
| + } |
| + virtual void WaitSyncPoint(uint32 sync_point) OVERRIDE { |
| + GLC(gl_, gl_->WaitSyncPointCHROMIUM(sync_point)); |
| + } |
| + |
| + private: |
| + gpu::gles2::GLES2Interface* gl_; |
| +}; |
| + |
| +} // namespace |
| + |
| VideoFrameExternalResources::VideoFrameExternalResources() : type(NONE) {} |
| VideoFrameExternalResources::~VideoFrameExternalResources() {} |
| @@ -285,10 +304,21 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForSoftwarePlanes( |
| return external_resources; |
| } |
| -static void ReturnTexture(const scoped_refptr<media::VideoFrame>& frame, |
| - uint32 sync_point, |
| - bool lost_resource) { |
| - frame->AppendReleaseSyncPoint(sync_point); |
| +// static |
| +void VideoResourceUpdater::ReturnTexture( |
| + base::WeakPtr<VideoResourceUpdater> updater, |
| + const scoped_refptr<media::VideoFrame>& video_frame, |
| + uint32 sync_point, |
| + bool lost_resource) { |
| + // TODO(dshwang) this case should be forwarded to the decoder as lost |
| + // resource. |
|
dshwang
2014/07/10 21:44:25
danakj@, use WeakPtr<VideoResourceUpdater> and add
|
| + if (lost_resource || !updater.get()) |
| + return; |
| + // VideoFrame::UpdateReleaseSyncPoint() creates new sync point using the same |
| + // GL context which created the given |sync_point|, so discard the |
| + // |sync_point|. |
| + SyncPointClientImpl client(updater->context_provider_->ContextGL()); |
| + video_frame->UpdateReleaseSyncPoint(&client); |
| } |
| VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
| @@ -326,7 +356,7 @@ VideoFrameExternalResources VideoResourceUpdater::CreateForHardwarePlanes( |
| mailbox_holder->texture_target, |
| mailbox_holder->sync_point)); |
| external_resources.release_callbacks.push_back( |
| - base::Bind(&ReturnTexture, video_frame)); |
| + base::Bind(&ReturnTexture, AsWeakPtr(), video_frame)); |
| return external_resources; |
| } |