Index: media/base/video_frame.cc |
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc |
index b3458a5954992b542094c217e46011d77576f7b5..24f0e7b19a70a8cbb59c9aa5a467dd0f6c44bbe4 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; |
} |
@@ -113,7 +116,7 @@ scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture( |
void VideoFrame::ReadPixelsFromNativeTexture(const SkBitmap& pixels) { |
DCHECK_EQ(format_, NATIVE_TEXTURE); |
if (!read_pixels_cb_.is_null()) |
- read_pixels_cb_.Run(pixels); |
+ read_pixels_cb_.Run(this, pixels); |
} |
// static |
@@ -403,6 +406,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) { |
@@ -412,8 +418,22 @@ VideoFrame::VideoFrame(VideoFrame::Format format, |
VideoFrame::~VideoFrame() { |
if (!mailbox_holder_release_cb_.is_null()) { |
+ std::vector<uint32> release_sync_points; |
+ { |
+ base::AutoLock locker(release_sync_point_lock_); |
+ 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); |
+ for (size_t i = 0; i < release_sync_points.size(); i++) |
+ DCHECK_NE(debug_initial_sync_point_, release_sync_points[i]); |
+#endif |
base::ResetAndReturn(&mailbox_holder_release_cb_) |
- .Run(mailbox_holder_.Pass()); |
+ .Run(mailbox_holder_.Pass(), release_sync_points); |
} |
if (!no_longer_needed_cb_.is_null()) |
base::ResetAndReturn(&no_longer_needed_cb_).Run(); |
@@ -494,6 +514,12 @@ base::SharedMemoryHandle VideoFrame::shared_memory_handle() const { |
return shared_memory_handle_; |
} |
+void VideoFrame::AppendReleaseSyncPoint(uint32 sync_point) { |
+ DCHECK_EQ(format_, NATIVE_TEXTURE); |
+ 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)) |