libcamera/src/android/camera_request.h
Jacopo Mondi 015fa7f718 android: Remove CameraWorker
The CameraWorker class purpose was to handle acquire fences for incoming
capture requests directed to libcamera.

Now that fences are handled by the core library, it is not required to
handle them in the HAL and the CameraWorker and CaptureRequest classes
can be dropped.

Update the core in CameraDevice class accordingly to queue Requests
directly to the libcamera::Camera and set the release_fence to the
value of the FrameBuffer::fence() for streams of type ::Direct.

While at it make CameraRequest::StreamBuffer::fence a UniqueFD to ease
the management of the fences file descriptor values.

Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
2021-12-11 17:53:40 +01:00

83 lines
1.9 KiB
C++

/* 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"
class CameraBuffer;
class CameraStream;
class Camera3RequestDescriptor
{
public:
enum class Status {
Success,
Error,
};
struct StreamBuffer {
StreamBuffer(CameraStream *stream,
const camera3_stream_buffer_t &buffer,
Camera3RequestDescriptor *request);
~StreamBuffer();
StreamBuffer(StreamBuffer &&);
StreamBuffer &operator=(StreamBuffer &&);
CameraStream *stream;
buffer_handle_t *camera3Buffer;
std::unique_ptr<libcamera::FrameBuffer> frameBuffer;
libcamera::UniqueFD fence;
Status status = Status::Success;
libcamera::FrameBuffer *internalBuffer = nullptr;
const libcamera::FrameBuffer *srcBuffer = nullptr;
std::unique_ptr<CameraBuffer> dstBuffer;
Camera3RequestDescriptor *request;
private:
LIBCAMERA_DISABLE_COPY(StreamBuffer)
};
/* Keeps track of streams requiring post-processing. */
std::map<CameraStream *, StreamBuffer *> pendingStreamsToProcess_
LIBCAMERA_TSA_GUARDED_BY(streamsProcessMutex_);
libcamera::Mutex streamsProcessMutex_;
Camera3RequestDescriptor(libcamera::Camera *camera,
const camera3_capture_request_t *camera3Request);
~Camera3RequestDescriptor();
bool isPending() const { return !complete_; }
uint32_t frameNumber_ = 0;
std::vector<StreamBuffer> buffers_;
CameraMetadata settings_;
std::unique_ptr<libcamera::Request> request_;
std::unique_ptr<CameraMetadata> resultMetadata_;
bool complete_ = false;
Status status_ = Status::Success;
private:
LIBCAMERA_DISABLE_COPY(Camera3RequestDescriptor)
};