0

media/gpu/chromeos: Add FrameResource NativePixmap accessor functions

HasNativePixmap() and GetNativePixmapDmaBuf() give users of
FrameResource a way to access an underlying NativePixmapDmaBuf of a
frame. The new method replaces the NativePixmapFrameResource-specific
method GetNativePixmapDmaBuf().

VideoFrameResource objects will never return true for HasNativePixmap().

Bug: b:277581596
Test: Chrome compiles and links
Test: Media unit tests pass.
Change-Id: I3c0ac87120556e5c78e055747323db4a1128d12c
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5381361
Commit-Queue: Nathan Hebert <nhebert@chromium.org>
Reviewed-by: Hirokazu Honda <hiroh@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1276705}
This commit is contained in:
Nathan Hebert
2024-03-22 05:25:21 +00:00
committed by Chromium LUCI CQ
parent b20ad2e642
commit fdce2f2815
6 changed files with 40 additions and 10 deletions

@@ -89,6 +89,17 @@ class FrameResource : public base::RefCountedThreadSafe<FrameResource> {
virtual scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf() virtual scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf()
const = 0; const = 0;
// Returns true if |this| is backed by a NativePixmap.
bool HasNativePixmap() const {
return static_cast<bool>(GetNativePixmapDmaBuf());
}
// Gets the NativePixmapDmaBuf backing |this|. Ownership is retained by
// |this| unless the returned value is copied. Then a reference is taken by
// the caller.
virtual const scoped_refptr<const gfx::NativePixmapDmaBuf>&
GetNativePixmapDmaBuf() const = 0;
// Create a shared GPU memory handle to |this|'s data. // Create a shared GPU memory handle to |this|'s data.
virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle() const = 0; virtual gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle() const = 0;

@@ -305,6 +305,11 @@ NativePixmapFrameResource::CreateNativePixmapDmaBuf() const {
std::move(native_pixmap_handle)); std::move(native_pixmap_handle));
} }
const scoped_refptr<const gfx::NativePixmapDmaBuf>&
NativePixmapFrameResource::GetNativePixmapDmaBuf() const {
return pixmap_;
}
gfx::GpuMemoryBufferHandle gfx::GpuMemoryBufferHandle
NativePixmapFrameResource::CreateGpuMemoryBufferHandle() const { NativePixmapFrameResource::CreateGpuMemoryBufferHandle() const {
// Duplicate FD's into a new NativePixmapHandle // Duplicate FD's into a new NativePixmapHandle
@@ -494,9 +499,4 @@ scoped_refptr<VideoFrame> NativePixmapFrameResource::CreateVideoFrame() const {
return video_frame; return video_frame;
} }
const scoped_refptr<const gfx::NativePixmapDmaBuf>&
NativePixmapFrameResource::GetNativePixmapDmaBuf() const {
return pixmap_;
}
} // namespace media } // namespace media

@@ -73,6 +73,8 @@ class NativePixmapFrameResource : public FrameResource {
int GetDmabufFd(size_t i) const override; int GetDmabufFd(size_t i) const override;
scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf() scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf()
const override; const override;
const scoped_refptr<const gfx::NativePixmapDmaBuf>& GetNativePixmapDmaBuf()
const override;
// CreateGpuMemoryBufferHandle() will duplicate file descriptors to make a // CreateGpuMemoryBufferHandle() will duplicate file descriptors to make a
// gfx::GpuMemoryBufferHandle. The GpuMemoryBufferId will match // gfx::GpuMemoryBufferHandle. The GpuMemoryBufferId will match
// GetSharedMemoryId(). Doing this helps with identification of original // GetSharedMemoryId(). Doing this helps with identification of original
@@ -112,11 +114,6 @@ class NativePixmapFrameResource : public FrameResource {
// reclamation. // reclamation.
scoped_refptr<VideoFrame> CreateVideoFrame() const; scoped_refptr<VideoFrame> CreateVideoFrame() const;
// Returns a reference to |this|'s backing NativePixmap. Ownership of
// the NativePixmap is retained by |this|.
const scoped_refptr<const gfx::NativePixmapDmaBuf>& GetNativePixmapDmaBuf()
const;
private: private:
~NativePixmapFrameResource() override; ~NativePixmapFrameResource() override;

@@ -76,6 +76,14 @@ VideoFrameResource::CreateNativePixmapDmaBuf() const {
return media::CreateNativePixmapDmaBuf(frame_.get()); return media::CreateNativePixmapDmaBuf(frame_.get());
} }
const scoped_refptr<const gfx::NativePixmapDmaBuf>&
VideoFrameResource::GetNativePixmapDmaBuf() const {
// |invalid_dmabuf| is stored as static so we can return a reference to it.
static const scoped_refptr<const gfx::NativePixmapDmaBuf> invalid_dmabuf;
return invalid_dmabuf;
}
gfx::GpuMemoryBufferHandle VideoFrameResource::CreateGpuMemoryBufferHandle() gfx::GpuMemoryBufferHandle VideoFrameResource::CreateGpuMemoryBufferHandle()
const { const {
return media::CreateGpuMemoryBufferHandle(frame_.get()); return media::CreateGpuMemoryBufferHandle(frame_.get());

@@ -37,6 +37,10 @@ class VideoFrameResource : public FrameResource {
int GetDmabufFd(size_t i) const override; int GetDmabufFd(size_t i) const override;
scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf() scoped_refptr<gfx::NativePixmapDmaBuf> CreateNativePixmapDmaBuf()
const override; const override;
// GetNativePixmapDmaBuf() always returns an invalid NativePixmap, since there
// is no NativePixmap-backed VideoFrame.
const scoped_refptr<const gfx::NativePixmapDmaBuf>& GetNativePixmapDmaBuf()
const override;
gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle() const override; gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle() const override;
gfx::GpuMemoryBuffer* GetGpuMemoryBuffer() const override; gfx::GpuMemoryBuffer* GetGpuMemoryBuffer() const override;
gfx::GenericSharedMemoryId GetSharedMemoryId() const override; gfx::GenericSharedMemoryId GetSharedMemoryId() const override;

@@ -81,4 +81,14 @@ TEST(VideoFrameResourceTest, WrappingLifecycle) {
ASSERT_TRUE(orig->HasAtLeastOneRef()); ASSERT_TRUE(orig->HasAtLeastOneRef());
ASSERT_FALSE(orig->HasOneRef()); ASSERT_FALSE(orig->HasOneRef());
} }
TEST(VideoFrameResourceTest, HasNativePixmap) {
const VideoPixelFormat kPixelFormat = PIXEL_FORMAT_NV12;
constexpr gfx::Size kCodedSize(320, 240);
scoped_refptr<FrameResource> frame =
VideoFrameResource::Create(CreateMockDmaBufVideoFrame(
kPixelFormat, kCodedSize, /*visible_rect=*/gfx::Rect(kCodedSize),
/*natural_size=*/kCodedSize));
ASSERT_FALSE(frame->HasNativePixmap());
}
} // namespace media } // namespace media