summaryrefslogtreecommitdiff
path: root/src/ipa/raspberrypi/controller/rpi/focus.hpp
diff options
context:
space:
mode:
authorJacopo Mondi <jacopo@jmondi.org>2022-09-13 16:42:12 +0200
committerJacopo Mondi <jacopo.mondi@ideasonboard.com>2023-03-11 13:14:00 +0100
commite53dda8bb82b7fda38fd2d11afa10babe3c51a6b (patch)
treed0cb9886c7bb0f89652392e2416f1c50a3cde9f8 /src/ipa/raspberrypi/controller/rpi/focus.hpp
parent97da589e657467f1d1e5d48b7fb838e1ad9e988d (diff)
ipa: rkisp: Add support for ExposureValue
Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
Diffstat (limited to 'src/ipa/raspberrypi/controller/rpi/focus.hpp')
0 files changed, 0 insertions, 0 deletions
f='#n134'>134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
/* SPDX-License-Identifier: LGPL-2.1-or-later */
/*
 * Copyright (C) 2019, Google Inc.
 *
 * camera_proxy.cpp - Proxy to camera devices
 */

#include "camera_proxy.h"

#include <system/camera_metadata.h>

#include <libcamera/object.h>

#include "log.h"
#include "message.h"
#include "utils.h"

#include "camera_device.h"
#include "thread_rpc.h"

using namespace libcamera;

LOG_DECLARE_CATEGORY(HAL);

/*
 * \class CameraProxy
 *
 * The CameraProxy wraps a CameraDevice and implements the camera3_device_t
 * API, bridging calls received from the camera framework to the CameraDevice.
 *
 * Bridging operation calls between the framework and the CameraDevice is
 * required as the two run in two different threads and certain operations,
 * such as queueing a new capture request to the camera, shall be called in
 * the thread that dispatches events. Other operations do not require any
 * bridging and resolve to direct function calls on the CameraDevice instance
 * instead.
 */

static int hal_dev_initialize(const struct camera3_device *dev,
			      const camera3_callback_ops_t *callback_ops)
{
	if (!dev)
		return -EINVAL;

	CameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);
	proxy->initialize(callback_ops);

	return 0;
}

static int hal_dev_configure_streams(const struct camera3_device *dev,
				     camera3_stream_configuration_t *stream_list)
{
	if (!dev)
		return -EINVAL;

	CameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);
	return proxy->configureStreams(stream_list);
}

static const camera_metadata_t *
hal_dev_construct_default_request_settings(const struct camera3_device *dev,
					   int type)
{
	if (!dev)
		return nullptr;

	CameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);
	return proxy->constructDefaultRequestSettings(type);
}

static int hal_dev_process_capture_request(const struct camera3_device *dev,
					   camera3_capture_request_t *request)
{
	if (!dev)
		return -EINVAL;

	CameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);
	return proxy->processCaptureRequest(request);
}

static void hal_dev_dump(const struct camera3_device *dev, int fd)
{
}

static int hal_dev_flush(const struct camera3_device *dev)
{
	return 0;
}

static int hal_dev_close(hw_device_t *hw_device)
{
	if (!hw_device)
		return -EINVAL;

	camera3_device_t *dev = reinterpret_cast<camera3_device_t *>(hw_device);
	CameraProxy *proxy = reinterpret_cast<CameraProxy *>(dev->priv);

	proxy->close();

	return 0;
}

static camera3_device_ops hal_dev_ops = {
	.initialize = hal_dev_initialize,
	.configure_streams = hal_dev_configure_streams,
	.register_stream_buffers = nullptr,
	.construct_default_request_settings = hal_dev_construct_default_request_settings,
	.process_capture_request = hal_dev_process_capture_request,
	.get_metadata_vendor_tag_ops = nullptr,
	.dump = hal_dev_dump,
	.flush = hal_dev_flush,
	.reserved = { nullptr },
};

CameraProxy::CameraProxy(unsigned int id, const std::shared_ptr<Camera> &camera)
	: id_(id)
{
	cameraDevice_ = new CameraDevice(id, camera);
}

CameraProxy::~CameraProxy()
{
	delete cameraDevice_;
}

int CameraProxy::open(const hw_module_t *hardwareModule)
{
	int ret = cameraDevice_->open();
	if (ret)
		return ret;

	/* Initialize the hw_device_t in the instance camera3_module_t. */
	camera3Device_.common.tag = HARDWARE_DEVICE_TAG;
	camera3Device_.common.version = CAMERA_DEVICE_API_VERSION_3_3;
	camera3Device_.common.module = (hw_module_t *)hardwareModule;
	camera3Device_.common.close = hal_dev_close;

	/*
	 * The camera device operations. These actually implement
	 * the Android Camera HALv3 interface.
	 */
	camera3Device_.ops = &hal_dev_ops;
	camera3Device_.priv = this;

	return 0;
}

void CameraProxy::close()
{
	ThreadRpc rpcRequest;
	rpcRequest.tag = ThreadRpc::Close;

	threadRpcCall(rpcRequest);
}

void CameraProxy::initialize(const camera3_callback_ops_t *callbacks)
{
	cameraDevice_->setCallbacks(callbacks);
}

const camera_metadata_t *CameraProxy::getStaticMetadata()
{
	return cameraDevice_->getStaticMetadata();
}