blob: 7af49b15595d23670cb065557ca1c7f6411064d3 [file] [log] [blame]
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef MEDIA_GPU_CHROMEOS_PLATFORM_VIDEO_FRAME_UTILS_H_
#define MEDIA_GPU_CHROMEOS_PLATFORM_VIDEO_FRAME_UTILS_H_
#include <optional>
#include <set>
#include "base/memory/scoped_refptr.h"
#include "base/unguessable_token.h"
#include "media/base/video_frame.h"
#include "media/gpu/media_gpu_export.h"
#include "ui/gfx/buffer_types.h"
#include "ui/gfx/gpu_memory_buffer_handle.h"
#include "ui/gfx/linux/native_pixmap_dmabuf.h"
namespace gpu {
class SharedImageInterface;
} // namespace gpu
namespace media {
// Used to create UnguessableTokens that are guaranteed to be unique with
// respect to others that are generated by this class.
class UniqueTrackingTokenHelper {
public:
UniqueTrackingTokenHelper();
UniqueTrackingTokenHelper(const UniqueTrackingTokenHelper&) = delete;
UniqueTrackingTokenHelper& operator=(const UniqueTrackingTokenHelper&) =
delete;
~UniqueTrackingTokenHelper();
// Clears all tokens. Used when releasing all frames.
void ClearTokens();
// Clears a token from the helper. Called when a token is no longer used to
// ensure the helper does not leak tokens.
void ClearToken(const base::UnguessableToken& token);
// SetUniqueTrackingToken sets a unique |tracking_token| in |metadata|. Note
// that this operation is not idempotent. Subsequent calls will always
// produce a new, unique tracking token.
void SetUniqueTrackingToken(VideoFrameMetadata& metadata);
private:
// Initializes |tokens_| with an empty UnguessableToken. This ensures that
// users cannot insert an empty token.
void Initialize();
// Generates a unique UnguessableToken.
base::UnguessableToken GenerateToken();
// The expectation is that this class will be used for frame pools where the
// number of tokens will be relatively small. I.e. tens of tokens at most.
// If this is not true, then we should figure out why, so crashing Chrome is
// reasonable.
static constexpr size_t kMaxNumberOfTokens = 1000;
std::set<base::UnguessableToken> tokens_;
};
// Creates a GpuMemoryBufferHandle. This function is thread safe.
gfx::GpuMemoryBufferHandle AllocateGpuMemoryBufferHandle(
VideoPixelFormat pixel_format,
const gfx::Size& coded_size,
gfx::BufferUsage buffer_usage);
// Creates a STORAGE_GPU_MEMORY_BUFFER VideoFrame backed by a NATIVE_PIXMAP
// GpuMemoryBuffer or Mappable SharedImage allocated with |buffer_usage|.
// See //media/base/video_frame.h for the other parameters. This function is
// thread-safe.
MEDIA_GPU_EXPORT scoped_refptr<VideoFrame> CreateMappableVideoFrame(
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,
gpu::SharedImageInterface* sii);
// Creates a STORAGE_GPU_MEMORY_BUFFER VideoFrame from a GpuMemoryBufferHandle.
// See //media/base/video_frame.h for the other parameters. This function is
// thread-safe.
scoped_refptr<VideoFrame> CreateVideoFrameFromGpuMemoryBufferHandle(
gfx::GpuMemoryBufferHandle gmb_handle,
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,
gpu::SharedImageInterface* sii);
// Creates a STORAGE_DMABUFS VideoFrame whose buffer is allocated with
// |buffer_usage|. See //media/base/video_frame.h for the other parameters. This
// function is thread-safe.
MEDIA_GPU_EXPORT scoped_refptr<VideoFrame> CreatePlatformVideoFrame(
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);
// Returns the VideoFrameLayout of a VideoFrame allocated with
// CreatePlatformVideoFrame(), i.e., all parameters are forwarded to that
// function (|visible_rect| is set to gfx::Rect(|coded_size|), |natural_size| is
// set to |coded_size|, and |timestamp| is set to base::TimeDelta()). This
// function is not cheap as it allocates a buffer. Returns std::nullopt if the
// buffer allocation fails. This function is thread-safe.
MEDIA_GPU_EXPORT std::optional<VideoFrameLayout> GetPlatformVideoFrameLayout(
VideoPixelFormat pixel_format,
const gfx::Size& coded_size,
gfx::BufferUsage buffer_usage);
// Create a shared GPU memory handle to the |video_frame|'s data.
MEDIA_GPU_EXPORT gfx::GpuMemoryBufferHandle CreateGpuMemoryBufferHandle(
const VideoFrame* video_frame);
// Create a NativePixmap that references the DMA Bufs of |video_frame|. The
// returned pixmap is only a DMA Buf container and should not be used for
// compositing/scanout.
MEDIA_GPU_EXPORT scoped_refptr<gfx::NativePixmapDmaBuf>
CreateNativePixmapDmaBuf(const VideoFrame* video_frame);
} // namespace media
#endif // MEDIA_GPU_CHROMEOS_PLATFORM_VIDEO_FRAME_UTILS_H_