| Index: media/base/video_frame.cc
|
| diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
|
| index 272d41dc4c691597a227abbaab023a31a86fc98d..63b9bf5ef81dd8578d0db6525b1a859bf2e0c7e2 100644
|
| --- a/media/base/video_frame.cc
|
| +++ b/media/base/video_frame.cc
|
| @@ -641,6 +641,7 @@ VideoFrame::VideoFrame(VideoFrame::Format format,
|
| mailbox_holder_(mailbox_holder.Pass()),
|
| shared_memory_handle_(base::SharedMemory::NULLHandle()),
|
| timestamp_(timestamp),
|
| + release_sync_point_(0),
|
| end_of_stream_(end_of_stream) {
|
| DCHECK(IsValidConfig(format_, coded_size_, visible_rect_, natural_size_));
|
|
|
| @@ -650,12 +651,13 @@ VideoFrame::VideoFrame(VideoFrame::Format format,
|
|
|
| VideoFrame::~VideoFrame() {
|
| if (!mailbox_holder_release_cb_.is_null()) {
|
| - std::vector<uint32> release_sync_points;
|
| + uint32 release_sync_point;
|
| {
|
| + // To ensure |release_sync_point_| is visible on this thread.
|
| base::AutoLock locker(release_sync_point_lock_);
|
| - release_sync_points_.swap(release_sync_points);
|
| + release_sync_point = release_sync_point_;
|
| }
|
| - base::ResetAndReturn(&mailbox_holder_release_cb_).Run(release_sync_points);
|
| + base::ResetAndReturn(&mailbox_holder_release_cb_).Run(release_sync_point);
|
| }
|
| if (!no_longer_needed_cb_.is_null())
|
| base::ResetAndReturn(&no_longer_needed_cb_).Run();
|
| @@ -807,12 +809,15 @@ base::SharedMemoryHandle VideoFrame::shared_memory_handle() const {
|
| return shared_memory_handle_;
|
| }
|
|
|
| -void VideoFrame::AppendReleaseSyncPoint(uint32 sync_point) {
|
| +void VideoFrame::UpdateReleaseSyncPoint(SyncPointClient* client) {
|
| DCHECK_EQ(format_, NATIVE_TEXTURE);
|
| - if (!sync_point)
|
| - return;
|
| base::AutoLock locker(release_sync_point_lock_);
|
| - release_sync_points_.push_back(sync_point);
|
| + // Must wait the previous sync point before inserting a new sync point so that
|
| + // |mailbox_holder_release_cb_| guarantees the previous sync point occurred
|
| + // when it waits |release_sync_point_|.
|
| + if (release_sync_point_)
|
| + client->WaitSyncPoint(release_sync_point_);
|
| + release_sync_point_ = client->InsertSyncPoint();
|
| }
|
|
|
| #if defined(OS_POSIX)
|
|
|