| /* 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) |
| }; |