blob: 3a4d97fce50aa16d5c9dac8ba6bf8f372bd96dba [file] [log] [blame]
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
* Copyright (C) 2019-2021, Google Inc.
*
* camera_request.h - libcamera Android Camera Request Descriptor
*/
#pragma once
#include <map>
#include <memory>
#include <vector>
#include <libcamera/base/class.h>
#include <libcamera/base/mutex.h>
#include <libcamera/base/unique_fd.h>
#include <libcamera/camera.h>
#include <libcamera/framebuffer.h>
#include <hardware/camera3.h>
#include "camera_metadata.h"
#include "hal_framebuffer.h"
#ifdef HAVE_ANDROID_OS
#include "mm/BufferAdapter.h"
#endif
class CameraBuffer;
class CameraStream;
class Camera3ResultDescriptor;
class Camera3RequestDescriptor;
class StreamBuffer
{
public:
enum class Status {
Success,
Error,
};
StreamBuffer(CameraStream *stream,
const camera3_stream_buffer_t &buffer,
Camera3RequestDescriptor *request);
~StreamBuffer();
StreamBuffer(StreamBuffer &&);
StreamBuffer &operator=(StreamBuffer &&);
struct JpegExifMetadata {
int64_t sensorExposureTime;
int32_t sensorSensitivityISO;
float lensFocalLength;
};
CameraStream *stream;
buffer_handle_t *camera3Buffer;
std::unique_ptr<HALFrameBuffer> frameBuffer;
libcamera::UniqueFD fence;
Status status = Status::Success;
const libcamera::FrameBuffer *srcBuffer = nullptr;
std::unique_ptr<CameraBuffer> dstBuffer;
std::optional<JpegExifMetadata> jpegExifMetadata;
Camera3ResultDescriptor *result;
Camera3RequestDescriptor *request;
private:
LIBCAMERA_DISABLE_COPY(StreamBuffer)
};
class Camera3ResultDescriptor
{
public:
Camera3ResultDescriptor(Camera3RequestDescriptor *request);
~Camera3ResultDescriptor();
Camera3RequestDescriptor *request_;
uint32_t metadataPackIndex_;
std::unique_ptr<CameraMetadata> resultMetadata_;
std::vector<StreamBuffer *> buffers_;
/* Keeps track of buffers waiting for post-processing. */
std::list<StreamBuffer *> pendingBuffersToProcess_;
bool completed_;
private:
LIBCAMERA_DISABLE_COPY(Camera3ResultDescriptor)
};
class Camera3RequestDescriptor
{
public:
enum class Status {
Pending,
Success,
Cancelled,
};
Camera3RequestDescriptor(libcamera::Camera *camera,
#ifdef HAVE_ANDROID_OS
std::shared_ptr<android::BufferAdapter> bufferAdaptor,
#endif
const camera3_capture_request_t *camera3Request);
~Camera3RequestDescriptor();
uint32_t frameNumber_ = 0;
std::vector<StreamBuffer> buffers_;
CameraMetadata settings_;
std::unique_ptr<libcamera::Request> request_;
std::map<CameraStream *, libcamera::FrameBuffer *> internalBuffers_;
Status status_;
uint32_t nextPartialResultIndex_;
std::unique_ptr<Camera3ResultDescriptor> finalResult_;
std::vector<std::unique_ptr<Camera3ResultDescriptor>> partialResults_;
bool completed_;
private:
LIBCAMERA_DISABLE_COPY(Camera3RequestDescriptor)
};