blob: f104fe1cbf51a945f8fcd6964382e41b9f9e1b28 [file] [log] [blame]
/*
* 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 CAMERA_COMMON_CAMERA_BUFFER_MANAGER_IMPL_H_
#define CAMERA_COMMON_CAMERA_BUFFER_MANAGER_IMPL_H_
#include "camera_buffer_manager.h"
#include <map>
#include <memory>
#include <mutex>
#include "allocator.h"
// A V4L2 extension format which represents 32bit RGBX-8-8-8-8 format. This
// corresponds to DRM_FORMAT_XBGR8888 which is used as the underlying format for
// the HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINEND format on all CrOS boards.
#define V4L2_PIX_FMT_RGBX32 v4l2_fourcc('X', 'B', '2', '4')
#define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0')
#define V4L2_PIX_FMT_P010M v4l2_fourcc('P', 'M', '1', '0')
// A 10-bit bayer format for private reprocessing on MediaTek ISP P1. It's a
// private RAW format that other DRM drivers will never support and thus making
// it not upstreamable (i.e., defined in official DRM headers). The define
// should be kept in sync with cs/chromeos_public/src/platform/minigbm/drv.h
#define DRM_FORMAT_MTISP_SXYZW10 fourcc_code('M', 'B', '1', '0')
struct native_handle;
typedef const native_handle* buffer_handle_t;
struct android_ycbcr;
namespace crosLibcamera {
class CameraBufferManagerImpl : public CameraBufferManager {
public:
explicit CameraBufferManagerImpl(std::unique_ptr<Allocator> allocator);
CameraBufferManagerImpl(const CameraBufferManagerImpl&) = delete;
CameraBufferManagerImpl& operator=(const CameraBufferManagerImpl&) = delete;
// CameraBufferManager implementation.
~CameraBufferManagerImpl() override = default;
int Allocate(size_t width,
size_t height,
uint32_t format,
uint32_t hal_usage,
buffer_handle_t* out_buffer,
uint32_t* out_stride) override;
int Free(buffer_handle_t buffer) override;
int Register(buffer_handle_t buffer) override;
int Deregister(buffer_handle_t buffer) override;
int Lock(buffer_handle_t buffer,
uint32_t hal_usage,
uint32_t x,
uint32_t y,
uint32_t width,
uint32_t height,
void** out_addr) override;
int LockYCbCr(buffer_handle_t buffer,
uint32_t hal_usage,
uint32_t x,
uint32_t y,
uint32_t width,
uint32_t height,
struct android_ycbcr* out_ycbcr) override;
int Unlock(buffer_handle_t buffer) override;
uint32_t ResolveDrmFormat(uint32_t hal_format, uint32_t hal_usage) override;
private:
friend class CameraBufferManager;
struct BufferContext {
// The backing buffer object of the DMA-buf.
std::unique_ptr<Allocator::BufferObject> bo;
int refcount = 0;
};
// Resolves the HAL pixel format |hal_format| to the actual DRM format, based
// on the gralloc usage flags set in |hal_usage|. The |gbm_flags| will be set
// if the format is resolved successfully.
uint32_t ResolveFormat(uint32_t hal_format,
uint32_t hal_usage,
uint32_t* gbm_flags);
// Maps |buffer| and returns the mapped address.
//
// Args:
// |buffer|: The buffer handle to map.
// |hal_usage|: Currently omitted and is reserved for future use.
// |plane|: The plane to map.
//
// Returns:
// The mapped address on success; MAP_FAILED on failure.
void* Map(buffer_handle_t buffer, uint32_t hal_usage, uint32_t plane);
// Unmaps |buffer|.
//
// Args:
// |buffer|: The buffer handle to unmap.
// |plane|: The plane to unmap.
//
// Returns:
// 0 on success; -EINVAL if |buffer| is invalid.
int Unmap(buffer_handle_t buffer, uint32_t plane);
// Lock to guard access member variables.
std::mutex lock_;
std::unique_ptr<Allocator> allocator_;
std::map<buffer_handle_t, BufferContext> buffers_;
};
} // namespace crosLibcamera
#endif // CAMERA_COMMON_CAMERA_BUFFER_MANAGER_IMPL_H_