mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
Add support for camera sensor information in the libcamera IPA protocol. Define a new 'struct ipa_sensor_info' structure in the IPA context and use it to perform translation between the C and the C++ API. Update the IPAInterface::configure() operation to accept a new CameraSensorInfo parameter and port all users of that function to the new interface. Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>
175 lines
3.7 KiB
C++
175 lines
3.7 KiB
C++
/* SPDX-License-Identifier: LGPL-2.1-or-later */
|
|
/*
|
|
* Copyright (C) 2019, Google Inc.
|
|
*
|
|
* ipa_interface.h - Image Processing Algorithm interface
|
|
*/
|
|
#ifndef __LIBCAMERA_IPA_INTERFACE_H__
|
|
#define __LIBCAMERA_IPA_INTERFACE_H__
|
|
|
|
#include <stddef.h>
|
|
#include <stdint.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
struct ipa_context {
|
|
const struct ipa_context_ops *ops;
|
|
};
|
|
|
|
struct ipa_settings {
|
|
const char *configuration_file;
|
|
};
|
|
|
|
struct ipa_sensor_info {
|
|
const char *model;
|
|
uint8_t bits_per_pixel;
|
|
struct {
|
|
uint32_t width;
|
|
uint32_t height;
|
|
} active_area;
|
|
struct {
|
|
int32_t left;
|
|
int32_t top;
|
|
uint32_t width;
|
|
uint32_t height;
|
|
} analog_crop;
|
|
struct {
|
|
uint32_t width;
|
|
uint32_t height;
|
|
} output_size;
|
|
uint64_t pixel_rate;
|
|
uint32_t line_length;
|
|
};
|
|
|
|
struct ipa_stream {
|
|
unsigned int id;
|
|
unsigned int pixel_format;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
};
|
|
|
|
struct ipa_control_info_map {
|
|
unsigned int id;
|
|
const uint8_t *data;
|
|
size_t size;
|
|
};
|
|
|
|
struct ipa_buffer_plane {
|
|
int dmabuf;
|
|
size_t length;
|
|
};
|
|
|
|
struct ipa_buffer {
|
|
unsigned int id;
|
|
unsigned int num_planes;
|
|
struct ipa_buffer_plane planes[3];
|
|
};
|
|
|
|
struct ipa_control_list {
|
|
const uint8_t *data;
|
|
unsigned int size;
|
|
};
|
|
|
|
struct ipa_operation_data {
|
|
unsigned int operation;
|
|
const uint32_t *data;
|
|
unsigned int num_data;
|
|
const struct ipa_control_list *lists;
|
|
unsigned int num_lists;
|
|
};
|
|
|
|
struct ipa_callback_ops {
|
|
void (*queue_frame_action)(void *cb_ctx, unsigned int frame,
|
|
struct ipa_operation_data &data);
|
|
};
|
|
|
|
struct ipa_context_ops {
|
|
void (*destroy)(struct ipa_context *ctx);
|
|
void *(*get_interface)(struct ipa_context *ctx);
|
|
void (*init)(struct ipa_context *ctx,
|
|
const struct ipa_settings *settings);
|
|
int (*start)(struct ipa_context *ctx);
|
|
void (*stop)(struct ipa_context *ctx);
|
|
void (*register_callbacks)(struct ipa_context *ctx,
|
|
const struct ipa_callback_ops *callbacks,
|
|
void *cb_ctx);
|
|
void (*configure)(struct ipa_context *ctx,
|
|
const struct ipa_sensor_info *sensor_info,
|
|
const struct ipa_stream *streams,
|
|
unsigned int num_streams,
|
|
const struct ipa_control_info_map *maps,
|
|
unsigned int num_maps);
|
|
void (*map_buffers)(struct ipa_context *ctx,
|
|
const struct ipa_buffer *buffers,
|
|
size_t num_buffers);
|
|
void (*unmap_buffers)(struct ipa_context *ctx, const unsigned int *ids,
|
|
size_t num_buffers);
|
|
void (*process_event)(struct ipa_context *ctx,
|
|
const struct ipa_operation_data *data);
|
|
};
|
|
|
|
struct ipa_context *ipaCreate();
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
|
|
#include <map>
|
|
#include <vector>
|
|
|
|
#include <libcamera/buffer.h>
|
|
#include <libcamera/controls.h>
|
|
#include <libcamera/geometry.h>
|
|
#include <libcamera/signal.h>
|
|
|
|
#include "v4l2_controls.h"
|
|
|
|
namespace libcamera {
|
|
|
|
struct IPASettings {
|
|
std::string configurationFile;
|
|
};
|
|
|
|
struct IPAStream {
|
|
unsigned int pixelFormat;
|
|
Size size;
|
|
};
|
|
|
|
struct IPABuffer {
|
|
unsigned int id;
|
|
std::vector<FrameBuffer::Plane> planes;
|
|
};
|
|
|
|
struct IPAOperationData {
|
|
unsigned int operation;
|
|
std::vector<uint32_t> data;
|
|
std::vector<ControlList> controls;
|
|
};
|
|
|
|
struct CameraSensorInfo;
|
|
|
|
class IPAInterface
|
|
{
|
|
public:
|
|
virtual ~IPAInterface() {}
|
|
|
|
virtual int init(const IPASettings &settings) = 0;
|
|
virtual int start() = 0;
|
|
virtual void stop() = 0;
|
|
|
|
virtual void configure(const CameraSensorInfo &sensorInfo,
|
|
const std::map<unsigned int, IPAStream> &streamConfig,
|
|
const std::map<unsigned int, const ControlInfoMap &> &entityControls) = 0;
|
|
|
|
virtual void mapBuffers(const std::vector<IPABuffer> &buffers) = 0;
|
|
virtual void unmapBuffers(const std::vector<unsigned int> &ids) = 0;
|
|
|
|
virtual void processEvent(const IPAOperationData &data) = 0;
|
|
Signal<unsigned int, const IPAOperationData &> queueFrameAction;
|
|
};
|
|
|
|
} /* namespace libcamera */
|
|
#endif
|
|
|
|
#endif /* __LIBCAMERA_IPA_INTERFACE_H__ */
|