blob: 1198afe4d880bdc73445bc0e23bc1ff763529c9a [file] [log] [blame] [edit]
// Copyright 2023 The Chromium Authors
// Copyright 2024 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef FAKE_IMAGE_H_
#define FAKE_IMAGE_H_
#include <va/va.h>
#include <memory>
#include <vector>
namespace libvafake {
class FakeBuffer;
class FakeDriver;
// Class used for tracking a VAImage and all information relevant to it.
//
// The metadata (ID, format, dimensions, number of planes, and plane
// stride/offset) of a FakeImage is immutable. The accessors for such metadata
// are thread-safe. The contents of the backing FakeBuffer object are mutable,
// but the reference to that FakeBuffer is immutable, i.e., the backing buffer
// is always the same, but the contents may change. Thus, while the accessor for
// the FakeBuffer is thread-safe, writes and reads to this buffer must be
// synchronized externally.
//
// Note: Currently the FakeImage only supports the NV12 image format.
class FakeImage {
public:
using IdType = VAImageID;
// Creates a FakeImage using the specified metadata (|id|, |format|, |width|,
// and |height|). The |fake_driver| is used to create a backing FakeBuffer and
// manage its lifetime. Thus, the |fake_driver| must outlive the created
// `FakeImage`. Upon return, *|va_image| is filled with all the fields needed
// by the libva client to use the image.
static std::unique_ptr<FakeImage> Create(IdType id,
const VAImageFormat& format,
int width,
int height,
FakeDriver& fake_driver,
VAImage* va_image);
FakeImage(const FakeImage&) = delete;
FakeImage& operator=(const FakeImage&) = delete;
~FakeImage();
IdType GetID() const;
const VAImageFormat& GetFormat() const;
int GetWidth() const;
int GetHeight() const;
const FakeBuffer& GetBuffer() const;
uint32_t GetPlaneStride(size_t plane) const;
uint32_t GetPlaneOffset(size_t plane) const;
private:
struct Plane {
Plane(uint32_t stride, uint32_t offset);
const uint32_t stride;
const uint32_t offset;
};
FakeImage(IdType id,
const VAImageFormat& format,
int width,
int height,
std::vector<Plane> planes,
const FakeBuffer& buffer,
FakeDriver& driver);
const IdType id_;
const VAImageFormat format_;
const int width_;
const int height_;
const std::vector<Plane> planes_;
const FakeBuffer& buffer_;
FakeDriver& driver_;
};
} // namespace libvafake
#endif // FAKE_IMAGE_H_