| Index: media/base/video_frame.cc
|
| diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
|
| index 87766651ce36d4d7d2ed7e8dca1ddd50c5a9fe9c..3d014550d356370696efbb910492eb89f5b8be30 100644
|
| --- a/media/base/video_frame.cc
|
| +++ b/media/base/video_frame.cc
|
| @@ -50,8 +50,14 @@ scoped_refptr<VideoFrame> VideoFrame::CreateFrame(
|
| return NULL;
|
| }
|
| DCHECK(IsValidConfig(format, new_coded_size, visible_rect, natural_size));
|
| - scoped_refptr<VideoFrame> frame(new VideoFrame(
|
| - format, new_coded_size, visible_rect, natural_size, timestamp, false));
|
| + scoped_refptr<VideoFrame> frame(
|
| + new VideoFrame(format,
|
| + new_coded_size,
|
| + visible_rect,
|
| + natural_size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + timestamp,
|
| + false));
|
| frame->AllocateYUV();
|
| return frame;
|
| }
|
| @@ -145,9 +151,9 @@ scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture(
|
| coded_size,
|
| visible_rect,
|
| natural_size,
|
| + mailbox_holder.Pass(),
|
| timestamp,
|
| false));
|
| - frame->mailbox_holder_ = mailbox_holder.Pass();
|
| frame->mailbox_holder_release_cb_ = mailbox_holder_release_cb;
|
| frame->read_pixels_cb_ = read_pixels_cb;
|
|
|
| @@ -178,8 +184,14 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalPackedMemory(
|
|
|
| switch (format) {
|
| case I420: {
|
| - scoped_refptr<VideoFrame> frame(new VideoFrame(
|
| - format, coded_size, visible_rect, natural_size, timestamp, false));
|
| + scoped_refptr<VideoFrame> frame(
|
| + new VideoFrame(format,
|
| + coded_size,
|
| + visible_rect,
|
| + natural_size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + timestamp,
|
| + false));
|
| frame->shared_memory_handle_ = handle;
|
| frame->strides_[kYPlane] = coded_size.width();
|
| frame->strides_[kUPlane] = coded_size.width() / 2;
|
| @@ -213,8 +225,14 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData(
|
| if (!IsValidConfig(format, coded_size, visible_rect, natural_size))
|
| return NULL;
|
|
|
| - scoped_refptr<VideoFrame> frame(new VideoFrame(
|
| - format, coded_size, visible_rect, natural_size, timestamp, false));
|
| + scoped_refptr<VideoFrame> frame(
|
| + new VideoFrame(format,
|
| + coded_size,
|
| + visible_rect,
|
| + natural_size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + timestamp,
|
| + false));
|
| frame->strides_[kYPlane] = y_stride;
|
| frame->strides_[kUPlane] = u_stride;
|
| frame->strides_[kVPlane] = v_stride;
|
| @@ -236,9 +254,14 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
|
| CHECK(frame->format() != NATIVE_TEXTURE);
|
|
|
| DCHECK(frame->visible_rect().Contains(visible_rect));
|
| - scoped_refptr<VideoFrame> wrapped_frame(new VideoFrame(
|
| - frame->format(), frame->coded_size(), visible_rect, natural_size,
|
| - frame->timestamp(), frame->end_of_stream()));
|
| + scoped_refptr<VideoFrame> wrapped_frame(
|
| + new VideoFrame(frame->format(),
|
| + frame->coded_size(),
|
| + visible_rect,
|
| + natural_size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + frame->timestamp(),
|
| + frame->end_of_stream()));
|
|
|
| for (size_t i = 0; i < NumPlanes(frame->format()); ++i) {
|
| wrapped_frame->strides_[i] = frame->stride(i);
|
| @@ -255,6 +278,7 @@ scoped_refptr<VideoFrame> VideoFrame::CreateEOSFrame() {
|
| gfx::Size(),
|
| gfx::Rect(),
|
| gfx::Size(),
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| kNoTimestamp(),
|
| true);
|
| }
|
| @@ -290,8 +314,14 @@ scoped_refptr<VideoFrame> VideoFrame::CreateBlackFrame(const gfx::Size& size) {
|
| scoped_refptr<VideoFrame> VideoFrame::CreateHoleFrame(
|
| const gfx::Size& size) {
|
| DCHECK(IsValidConfig(VideoFrame::HOLE, size, gfx::Rect(size), size));
|
| - scoped_refptr<VideoFrame> frame(new VideoFrame(
|
| - VideoFrame::HOLE, size, gfx::Rect(size), size, base::TimeDelta(), false));
|
| + scoped_refptr<VideoFrame> frame(
|
| + new VideoFrame(VideoFrame::HOLE,
|
| + size,
|
| + gfx::Rect(size),
|
| + size,
|
| + scoped_ptr<gpu::MailboxHolder>(),
|
| + base::TimeDelta(),
|
| + false));
|
| return frame;
|
| }
|
| #endif // defined(VIDEO_HOLE)
|
| @@ -453,12 +483,14 @@ VideoFrame::VideoFrame(VideoFrame::Format format,
|
| const gfx::Size& coded_size,
|
| const gfx::Rect& visible_rect,
|
| const gfx::Size& natural_size,
|
| + scoped_ptr<gpu::MailboxHolder> mailbox_holder,
|
| base::TimeDelta timestamp,
|
| bool end_of_stream)
|
| : format_(format),
|
| coded_size_(coded_size),
|
| visible_rect_(visible_rect),
|
| natural_size_(natural_size),
|
| + mailbox_holder_(mailbox_holder.Pass()),
|
| shared_memory_handle_(base::SharedMemory::NULLHandle()),
|
| timestamp_(timestamp),
|
| end_of_stream_(end_of_stream) {
|
| @@ -470,8 +502,12 @@ 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_);
|
| + release_sync_points_.swap(release_sync_points);
|
| + }
|
| + base::ResetAndReturn(&mailbox_holder_release_cb_).Run(release_sync_points);
|
| }
|
| if (!no_longer_needed_cb_.is_null())
|
| base::ResetAndReturn(&no_longer_needed_cb_).Run();
|
| @@ -543,7 +579,7 @@ uint8* VideoFrame::data(size_t plane) const {
|
| return data_[plane];
|
| }
|
|
|
| -gpu::MailboxHolder* VideoFrame::mailbox_holder() const {
|
| +const gpu::MailboxHolder* VideoFrame::mailbox_holder() const {
|
| DCHECK_EQ(format_, NATIVE_TEXTURE);
|
| return mailbox_holder_.get();
|
| }
|
| @@ -552,6 +588,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)
|
| + 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))
|
|
|