Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Unified Diff: media/base/video_frame.cc

Issue 1117423002: media: Let VideoFrame carry more than one native texture. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address reveman's comments. Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/base/video_frame.cc
diff --git a/media/base/video_frame.cc b/media/base/video_frame.cc
index c837159958739edb5d4d3708d1dab8af0bc45562..b2433f142bd34c924c30d6a02a4fb28e38831939 100644
--- a/media/base/video_frame.cc
+++ b/media/base/video_frame.cc
@@ -140,14 +140,10 @@ scoped_refptr<VideoFrame> VideoFrame::CreateFrame(
const gfx::Size new_coded_size = AdjustCodedSize(format, coded_size);
DCHECK(IsValidConfig(format, new_coded_size, visible_rect, natural_size));
+ gpu::MailboxHolder mailboxes[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(format,
- new_coded_size,
- visible_rect,
- natural_size,
- scoped_ptr<gpu::MailboxHolder>(),
- timestamp,
- false));
+ new VideoFrame(format, new_coded_size, visible_rect, natural_size,
+ mailboxes, TEXTURE_RGBA, timestamp, false));
frame->AllocateYUV();
return frame;
}
@@ -243,23 +239,43 @@ bool VideoFrame::IsValidConfig(VideoFrame::Format format,
// static
scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture(
- scoped_ptr<gpu::MailboxHolder> mailbox_holder,
+ const gpu::MailboxHolder& mailbox_holder,
const ReleaseMailboxCB& mailbox_holder_release_cb,
const gfx::Size& coded_size,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp,
bool allow_overlay) {
- scoped_refptr<VideoFrame> frame(new VideoFrame(NATIVE_TEXTURE,
- coded_size,
- visible_rect,
- natural_size,
- mailbox_holder.Pass(),
- timestamp,
- false));
- frame->mailbox_holder_release_cb_ = mailbox_holder_release_cb;
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
+ mailbox_holders[kARGBPlane] = mailbox_holder;
+ scoped_refptr<VideoFrame> frame(
+ new VideoFrame(NATIVE_TEXTURE, coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_RGBA, timestamp, false));
+ frame->mailbox_holders_release_cb_ = mailbox_holder_release_cb;
frame->allow_overlay_ = allow_overlay;
+ return frame;
+}
+// static
+scoped_refptr<VideoFrame> VideoFrame::WrapYUV420NativeTextures(
+ const gpu::MailboxHolder& y_mailbox_holder,
+ const gpu::MailboxHolder& u_mailbox_holder,
+ const gpu::MailboxHolder& v_mailbox_holder,
+ const ReleaseMailboxCB& mailbox_holder_release_cb,
+ const gfx::Size& coded_size,
+ const gfx::Rect& visible_rect,
+ const gfx::Size& natural_size,
+ base::TimeDelta timestamp,
+ bool allow_overlay) {
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
+ mailbox_holders[kYPlane] = y_mailbox_holder;
+ mailbox_holders[kUPlane] = u_mailbox_holder;
+ mailbox_holders[kVPlane] = v_mailbox_holder;
+ scoped_refptr<VideoFrame> frame(
+ new VideoFrame(NATIVE_TEXTURE, coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_YUV_420, timestamp, false));
+ frame->mailbox_holders_release_cb_ = mailbox_holder_release_cb;
+ frame->allow_overlay_ = allow_overlay;
return frame;
}
@@ -284,14 +300,10 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalPackedMemory(
switch (format) {
case VideoFrame::I420: {
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(format,
- new_coded_size,
- visible_rect,
- natural_size,
- scoped_ptr<gpu::MailboxHolder>(),
- timestamp,
- false));
+ new VideoFrame(format, new_coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_RGBA, timestamp, false));
frame->shared_memory_handle_ = handle;
frame->shared_memory_offset_ = data_offset;
frame->strides_[kYPlane] = new_coded_size.width();
@@ -326,14 +338,10 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalYuvData(
const gfx::Size new_coded_size = AdjustCodedSize(format, coded_size);
CHECK(IsValidConfig(format, new_coded_size, visible_rect, natural_size));
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(format,
- new_coded_size,
- visible_rect,
- natural_size,
- scoped_ptr<gpu::MailboxHolder>(),
- timestamp,
- false));
+ new VideoFrame(format, new_coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_RGBA, timestamp, false));
frame->strides_[kYPlane] = y_stride;
frame->strides_[kUPlane] = u_stride;
frame->strides_[kVPlane] = v_stride;
@@ -364,14 +372,10 @@ scoped_refptr<VideoFrame> VideoFrame::WrapExternalDmabufs(
return NULL;
}
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(format,
- coded_size,
- visible_rect,
- natural_size,
- scoped_ptr<gpu::MailboxHolder>(),
- timestamp,
- false));
+ new VideoFrame(format, coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_RGBA, timestamp, false));
for (size_t i = 0; i < dmabuf_fds.size(); ++i) {
int duped_fd = HANDLE_EINTR(dup(dmabuf_fds[i]));
@@ -424,14 +428,10 @@ scoped_refptr<VideoFrame> VideoFrame::WrapCVPixelBuffer(
if (!IsValidConfig(format, coded_size, visible_rect, natural_size))
return NULL;
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(format,
- coded_size,
- visible_rect,
- natural_size,
- scoped_ptr<gpu::MailboxHolder>(),
- timestamp,
- false));
+ new VideoFrame(format, coded_size, visible_rect, natural_size,
+ mailbox_holders, TEXTURE_RGBA, timestamp, false));
frame->cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN);
return frame;
@@ -449,14 +449,11 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
CHECK_NE(frame->format(), NATIVE_TEXTURE);
DCHECK(frame->visible_rect().Contains(visible_rect));
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
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()));
+ new VideoFrame(frame->format(), frame->coded_size(), visible_rect,
+ natural_size, mailbox_holders, TEXTURE_RGBA,
+ frame->timestamp(), frame->end_of_stream()));
for (size_t i = 0; i < NumPlanes(frame->format()); ++i) {
wrapped_frame->strides_[i] = frame->stride(i);
@@ -469,13 +466,10 @@ scoped_refptr<VideoFrame> VideoFrame::WrapVideoFrame(
// static
scoped_refptr<VideoFrame> VideoFrame::CreateEOSFrame() {
- return new VideoFrame(VideoFrame::UNKNOWN,
- gfx::Size(),
- gfx::Rect(),
- gfx::Size(),
- scoped_ptr<gpu::MailboxHolder>(),
- kNoTimestamp(),
- true);
+ gpu::MailboxHolder mailbox_holders[kMaxPlanes];
+ return new VideoFrame(VideoFrame::UNKNOWN, gfx::Size(), gfx::Rect(),
+ gfx::Size(), mailbox_holders, TEXTURE_RGBA,
+ kNoTimestamp(), true);
}
// static
@@ -522,14 +516,10 @@ scoped_refptr<VideoFrame> VideoFrame::CreateTransparentFrame(
scoped_refptr<VideoFrame> VideoFrame::CreateHoleFrame(
const gfx::Size& size) {
DCHECK(IsValidConfig(VideoFrame::HOLE, size, gfx::Rect(size), size));
+ gpu::MailboxHolder mailboxes[kMaxPlanes];
scoped_refptr<VideoFrame> frame(
- new VideoFrame(VideoFrame::HOLE,
- size,
- gfx::Rect(size),
- size,
- scoped_ptr<gpu::MailboxHolder>(),
- base::TimeDelta(),
- false));
+ new VideoFrame(VideoFrame::HOLE, size, gfx::Rect(size), size, mailboxes,
+ TEXTURE_RGBA, base::TimeDelta(), false));
return frame;
}
#endif // defined(VIDEO_HOLE)
@@ -562,6 +552,18 @@ size_t VideoFrame::NumPlanes(Format format) {
return 0;
}
+// static
+size_t VideoFrame::NumTextures(TextureFormat texture_format) {
+ switch (texture_format) {
+ case TEXTURE_RGBA:
+ return 1;
+ case TEXTURE_YUV_420:
+ return 3;
+ }
+
+ NOTREACHED();
+ return 0;
+}
// static
size_t VideoFrame::AllocationSize(Format format, const gfx::Size& coded_size) {
@@ -664,14 +666,15 @@ 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,
+ const gpu::MailboxHolder(&mailbox_holders)[kMaxPlanes],
+ VideoFrame::TextureFormat texture_format,
base::TimeDelta timestamp,
bool end_of_stream)
: format_(format),
+ texture_format_(texture_format),
coded_size_(coded_size),
visible_rect_(visible_rect),
natural_size_(natural_size),
- mailbox_holder_(mailbox_holder.Pass()),
shared_memory_handle_(base::SharedMemory::NULLHandle()),
shared_memory_offset_(0),
timestamp_(timestamp),
@@ -679,13 +682,13 @@ VideoFrame::VideoFrame(VideoFrame::Format format,
end_of_stream_(end_of_stream),
allow_overlay_(false) {
DCHECK(IsValidConfig(format_, coded_size_, visible_rect_, natural_size_));
-
+ memcpy(&mailbox_holders_, mailbox_holders, sizeof(mailbox_holders_));
memset(&strides_, 0, sizeof(strides_));
memset(&data_, 0, sizeof(data_));
}
VideoFrame::~VideoFrame() {
- if (!mailbox_holder_release_cb_.is_null()) {
+ if (!mailbox_holders_release_cb_.is_null()) {
uint32 release_sync_point;
{
// To ensure that changes to |release_sync_point_| are visible on this
@@ -693,7 +696,7 @@ VideoFrame::~VideoFrame() {
base::AutoLock locker(release_sync_point_lock_);
release_sync_point = release_sync_point_;
}
- base::ResetAndReturn(&mailbox_holder_release_cb_).Run(release_sync_point);
+ base::ResetAndReturn(&mailbox_holders_release_cb_).Run(release_sync_point);
}
if (!no_longer_needed_cb_.is_null())
base::ResetAndReturn(&no_longer_needed_cb_).Run();
@@ -771,9 +774,10 @@ uint8* VideoFrame::visible_data(size_t plane) {
static_cast<const VideoFrame*>(this)->visible_data(plane));
}
-const gpu::MailboxHolder* VideoFrame::mailbox_holder() const {
+const gpu::MailboxHolder& VideoFrame::mailbox_holder(size_t texture) const {
DCHECK_EQ(format_, NATIVE_TEXTURE);
- return mailbox_holder_.get();
+ DCHECK_LT(texture, NumTextures(texture_format_));
+ return mailbox_holders_[texture];
}
base::SharedMemoryHandle VideoFrame::shared_memory_handle() const {
@@ -788,7 +792,7 @@ void VideoFrame::UpdateReleaseSyncPoint(SyncPointClient* client) {
DCHECK_EQ(format_, NATIVE_TEXTURE);
base::AutoLock locker(release_sync_point_lock_);
// Must wait on the previous sync point before inserting a new sync point so
- // that |mailbox_holder_release_cb_| guarantees the previous sync point
+ // that |mailbox_holders_release_cb_| guarantees the previous sync point
// occurred when it waits on |release_sync_point_|.
if (release_sync_point_)
client->WaitSyncPoint(release_sync_point_);

Powered by Google App Engine
This is Rietveld 408576698