Chromium Code Reviews| Index: media/base/video_frame.cc |
| diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc |
| index 64e898987d5d213e51f8cc90ef3ecf8bfda1dda2..3c382847a52bd9a36e74fc60b2385b92777434e1 100644 |
| --- a/media/base/video_frame.cc |
| +++ b/media/base/video_frame.cc |
| @@ -106,6 +106,9 @@ scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture( |
| frame->mailbox_holder_ = mailbox_holder.Pass(); |
| frame->mailbox_holder_release_cb_ = mailbox_holder_release_cb; |
| frame->read_pixels_cb_ = read_pixels_cb; |
| +#ifndef NDEBUG |
| + frame->debug_initial_sync_point_ = frame->mailbox_holder_->sync_point; |
| +#endif |
| return frame; |
| } |
| @@ -406,6 +409,9 @@ VideoFrame::VideoFrame(VideoFrame::Format format, |
| coded_size_(coded_size), |
| visible_rect_(visible_rect), |
| natural_size_(natural_size), |
| +#ifndef NDEBUG |
| + debug_initial_sync_point_(0), |
| +#endif |
| shared_memory_handle_(base::SharedMemory::NULLHandle()), |
| timestamp_(timestamp), |
| end_of_stream_(end_of_stream) { |
| @@ -415,8 +421,21 @@ VideoFrame::VideoFrame(VideoFrame::Format format, |
| VideoFrame::~VideoFrame() { |
| if (!mailbox_holder_release_cb_.is_null()) { |
| - base::ResetAndReturn(&mailbox_holder_release_cb_) |
| - .Run(mailbox_holder_.Pass()); |
| + std::vector<uint32> release_sync_points; |
| + { |
| + base::AutoLock locker(release_sync_point_lock_); |
|
Ami GONE FROM CHROMIUM
2014/04/11 20:55:17
locking in a dtor is a code-smell. If anything ca
dshwang
2014/04/22 19:16:51
I reserve this code as I explained.
IMO ensuring t
|
| + release_sync_points_.swap(release_sync_points); |
| + } |
| +#ifndef NDEBUG |
| + // VideoFrame doesn't use |mailbox_holder_->sync_point| as release sync |
| + // point because VideoFrame can have multiple clients. i.e. the compositor, |
| + // webgl. So VideoFrame uses |release_sync_points_| unlike webgl. |
| + // mailbox_holder_->sync_point must be not changed by clients. |
| + DCHECK_EQ(debug_initial_sync_point_, mailbox_holder_->sync_point); |
|
Ami GONE FROM CHROMIUM
2014/04/11 20:55:17
This would be even easier to guarantee if nobody h
dshwang
2014/04/22 19:16:51
That's good idea. I make mailbox_holder const. And
|
| + for (size_t i = 0; i < release_sync_points.size(); i++) |
| + DCHECK_NE(debug_initial_sync_point_, release_sync_points[i]); |
|
Ami GONE FROM CHROMIUM
2014/04/11 20:55:17
What guarantees that wrap-around doesn't hit this?
|
| +#endif |
| + base::ResetAndReturn(&mailbox_holder_release_cb_).Run(release_sync_points); |
| } |
| if (!no_longer_needed_cb_.is_null()) |
| base::ResetAndReturn(&no_longer_needed_cb_).Run(); |
| @@ -497,6 +516,14 @@ base::SharedMemoryHandle VideoFrame::shared_memory_handle() const { |
| return shared_memory_handle_; |
| } |
| +void VideoFrame::AppendReleaseSyncPoint(uint32 sync_point) { |
| + DCHECK_EQ(format_, NATIVE_TEXTURE); |
| + if (!sync_point) |
|
Ami GONE FROM CHROMIUM
2014/04/11 20:55:17
OOC where does it say that a sync_point of zero me
danakj
2014/04/14 13:19:31
Hm, it's a convention we follow to return 0 when w
dshwang
2014/04/22 19:16:51
Thank you for kind explanation. I agree, so I rese
|
| + return; |
| + base::AutoLock locker(release_sync_point_lock_); |
| + release_sync_points_.push_back(sync_point); |
| +} |
| + |
| void VideoFrame::HashFrameForTesting(base::MD5Context* context) { |
| for (int plane = 0; plane < kMaxPlanes; ++plane) { |
| if (!IsValidPlane(plane)) |