#ifndef MEDIA_GPU_CHROMEOS_NATIVE_PIXMAP_FRAME_RESOURCE_H_
#define MEDIA_GPU_CHROMEOS_NATIVE_PIXMAP_FRAME_RESOURCE_H_
#include <optional>
#include "base/memory/scoped_refptr.h"
#include "base/time/time.h"
#include "base/types/pass_key.h"
#include "media/base/video_frame_layout.h"
#include "media/base/video_frame_metadata.h"
#include "media/gpu/chromeos/frame_resource.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/geometry/rect.h"
#include "ui/gfx/geometry/size.h"
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
namespace media {
class NativePixmapFrameResource : public FrameResource {
public:
NativePixmapFrameResource(base::PassKey<NativePixmapFrameResource>,
const media::VideoFrameLayout& layout,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp,
viz::SharedImageFormat si_format,
const base::UnguessableToken& token,
std::optional<gfx::BufferUsage> buffer_usage,
gfx::NativePixmapHandle handle);
NativePixmapFrameResource(
base::PassKey<NativePixmapFrameResource>,
const media::VideoFrameLayout& layout,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp,
const base::UnguessableToken& token,
std::optional<gfx::BufferUsage> buffer_usage,
scoped_refptr<const gfx::NativePixmapDmaBuf> pixmap);
NativePixmapFrameResource() = delete;
NativePixmapFrameResource(const NativePixmapFrameResource&) = delete;
NativePixmapFrameResource& operator=(const NativePixmapFrameResource&) =
delete;
static scoped_refptr<NativePixmapFrameResource> Create(
const media::VideoFrameLayout& layout,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
std::vector<base::ScopedFD> dmabuf_fds,
base::TimeDelta timestamp);
static scoped_refptr<NativePixmapFrameResource> Create(
media::VideoPixelFormat pixel_format,
const gfx::Size& coded_size,
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp,
gfx::BufferUsage buffer_usage);
static scoped_refptr<NativePixmapFrameResource> Create(
const gfx::Rect& visible_rect,
const gfx::Size& natural_size,
base::TimeDelta timestamp,
gfx::BufferUsage buffer_usage,
scoped_refptr<const gfx::NativePixmapDmaBuf> pixmap);
const NativePixmapFrameResource* AsNativePixmapFrameResource() const override;
bool IsMappable() const override;
const uint8_t* data(size_t plane) const override;
uint8_t* writable_data(size_t plane) override;
const uint8_t* visible_data(size_t plane) const override;
uint8_t* GetWritableVisibleData(size_t plane) override;
size_t NumDmabufFds() const override;
int GetDmabufFd(size_t i) const override;
scoped_refptr<const gfx::NativePixmapDmaBuf> GetNativePixmapDmaBuf()
const override;
gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle() const override;
std::unique_ptr<VideoFrame::ScopedMapping> MapGMBOrSharedImage()
const override;
const VideoFrameLayout& layout() const override;
VideoPixelFormat format() const override;
int stride(size_t plane) const override;
VideoFrame::StorageType storage_type() const override;
int row_bytes(size_t plane) const override;
const gfx::Size& coded_size() const override;
const gfx::Rect& visible_rect() const override;
const gfx::Size& natural_size() const override;
const VideoFrameMetadata& metadata() const override;
VideoFrameMetadata& metadata() override;
void set_metadata(const VideoFrameMetadata& metadata) override;
const base::UnguessableToken& tracking_token() const override;
gfx::ColorSpace ColorSpace() const override;
void set_color_space(const gfx::ColorSpace& color_space) override;
const std::optional<gfx::HDRMetadata>& hdr_metadata() const override;
void set_hdr_metadata(
const std::optional<gfx::HDRMetadata>& hdr_metadata) override;
base::TimeDelta timestamp() const override;
void set_timestamp(base::TimeDelta timestamp) override;
void AddDestructionObserver(base::OnceClosure callback) override;
scoped_refptr<FrameResource> CreateWrappingFrame(
const gfx::Rect& visible_rect,
const gfx::Size& natural_size) override;
std::string AsHumanReadableString() const override;
gfx::GpuMemoryBufferHandle GetGpuMemoryBufferHandleForTesting()
const override;
scoped_refptr<VideoFrame> CreateDmabufVideoFrame() const;
scoped_refptr<VideoFrame> CreateMappableVideoFrame(
gpu::SharedImageInterface* sii) const;
private:
~NativePixmapFrameResource() override;
const scoped_refptr<const gfx::NativePixmapDmaBuf> pixmap_;
const std::optional<gfx::BufferUsage> buffer_usage_;
const media::VideoFrameLayout layout_;
const gfx::Rect visible_rect_;
const gfx::Size natural_size_;
media::VideoFrameMetadata metadata_;
base::TimeDelta timestamp_;
gfx::ColorSpace color_space_;
std::optional<gfx::HDRMetadata> hdr_metadata_;
base::Lock done_callbacks_lock_;
std::vector<base::OnceClosure> done_callbacks_
GUARDED_BY(done_callbacks_lock_);
};
}
#endif