/* SPDX-License-Identifier: LGPL-2.1-or-later */ module libcamera; /** * \file core_ipa_interface.h * \brief libcamera structs for IPAs */ /* * Things that can be defined here (and in other mojom files): * - consts * - enums * - structs * * Attributes: * - skipHeader - structs only, and only in core.mojom * - Do not generate a C++ definition for the structure * - Any type used in a mojom interface definition must have a corresponding * definition in a mojom file for the code generator to accept it, except * for types solely used as map/array members for which a definition is not * required * - This attribute allows defining a symbol for the code generator that * corresponds to a libcamera type without duplicating its definition in the * generated C++ headers * - skipSerdes - structs only, and only in core.mojom * - All types need a (de)serializer to be defined in order to be transported * over IPC. The (de)serializer can be: * - Manually implemented as a template specialization in * ipa_data_serializer.cpp in the libcamera sources * - Generated at build time for types defined in a mojom file * - This attribute instructs the build system that a (de)serializer is * available for the type and there's no need to generate one * - hasFd - struct fields or empty structs only * - Designate that this field or empty struct contains a SharedFD * * Rules: * - If the type is defined in a libcamera C++ header *and* a (de)serializer is * available then the type shall be declared as empty with both attributes * associated and specified as: [skipHeader, skipSerdes] * - Example: [skipHeader, skipSerdes] ControlList {}; * - If the type is defined in libcamera but no (de)serializer is available * then the type definition in the core.mojom file should have the * [skipHeader] attribute only * - A (de)serializer will be generated for the type * - If a type definition has [skipHeader], then the header where the type is * defined must be included in ipa_interface.h * - Types that are solely used as array/map members do not require a mojom * definition if one exists in libcamera * - Nested types (e.g. FrameBuffer::Plane) cannot be defined in mojom * - If used in mojom, the nested type shall be defined in a C++ header * and a (de)serializer shall be provided * - Nested types can only be used as array/map members * - When using the type, the C++ namespace separator :: is replaced with a * dot * - In example, to use the FrameBuffer::Plane type in mojom: * - Provide a definition of the FrameBuffer::Plane type in a C++ header * - Include the header in ipa_interface.h * - Provide a (de)serializer implementation ipa_data_serializer.cpp * - In mojom, reference the type as FrameBuffer.Plane and only as map/array * member * - [skipHeader] and [skipSerdes] only work here in core.mojom * - If a field in a struct has a SharedFD, but is not explicitly * defined so in mojom, then the field must be marked with the [hasFd] * attribute * * \todo Generate documentation from Doxygen comments in .mojom files * \todo Figure out how to keep the skipHeader structs in sync with their * C++ definitions, and the skipSerdes structs in sync with their * (de)serializers */ [skipSerdes, skipHeader] struct ControlInfoMap {}; [skipSerdes, skipHeader] struct ControlList {}; [skipSerdes, skipHeader] struct SharedFD {}; [skipHeader] struct Point { int32 x; int32 y; }; [skipHeader] struct Size { uint32 width; uint32 height; }; [skipHeader] struct SizeRange { Size min; Size max; uint32 hStep; uint32 vStep; }; [skipHeader] struct Rectangle { int32 x; int32 y; uint32 width; uint32 height; }; /** * \struct IPACameraSensorInfo * \brief Report the image sensor characteristics * * The structure reports image sensor characteristics used by IPA modules to * tune their algorithms based on the image sensor model currently in use and * its configuration. * * The reported information describes the sensor's intrinsics characteristics, * such as its pixel array size and the sensor model name, as well as * information relative to the currently configured mode, such as the produced * image size and the bit depth of the requested image format. * * Instances of this structure are meant to be assembled by the CameraSensor * class by inspecting the sensor static properties as well as information * relative to the current configuration. */ /** * \var IPACameraSensorInfo::model * \brief The image sensor model name * * The sensor model name is a free-formed string that uniquely identifies the * sensor model. */ /** * \var IPACameraSensorInfo::bitsPerPixel * \brief The number of bits per pixel of the image format produced by the * image sensor */ /** * \var IPACameraSensorInfo::activeAreaSize * \brief The size of the pixel array active area of the sensor */ /** * \var IPACameraSensorInfo::analogCrop * \brief The portion of the pixel array active area which is read-out and * processed * * The analog crop rectangle top-left corner is defined as the displacement * from the top-left corner of the pixel array active area. The rectangle * horizontal and vertical sizes define the portion of the pixel array which * is read-out and provided to the sensor's internal processing pipeline, before * any pixel sub-sampling method, such as pixel binning, skipping and averaging * take place. */ /** * \var IPACameraSensorInfo::outputSize * \brief The size of the images produced by the camera sensor * * The output image size defines the horizontal and vertical sizes of the images * produced by the image sensor. The output image size is defined as the end * result of the sensor's internal image processing pipeline stages, applied on * the pixel array portion defined by the analog crop rectangle. Each image * processing stage that performs pixel sub-sampling techniques, such as pixel * binning or skipping, or perform any additional digital scaling concur in the * definition of the output image size. */ /** * \var IPACameraSensorInfo::pixelRate * \brief The number of pixels produced in a second * * To obtain the read-out time in seconds of a full line: * * \verbatim lineDuration(s) = lineLength(pixels) / pixelRate(pixels per second) \endverbatim */ /** * \var IPACameraSensorInfo::lineLength * \brief Total line length in pixels * * The total line length in pixel clock periods, including blanking. */ /** * \var IPACameraSensorInfo::minFrameLength * \brief The minimum allowable frame length in units of lines * * The sensor frame length comprises of active output lines and blanking lines * in a frame. The minimum frame length value dictates the minimum allowable * frame duration of the sensor mode. * * To obtain the minimum frame duration: * * \verbatim frameDuration(s) = minFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second) \endverbatim */ /** * \var IPACameraSensorInfo::maxFrameLength * \brief The maximum allowable frame length in units of lines * * The sensor frame length comprises of active output lines and blanking lines * in a frame. The maximum frame length value dictates the maximum allowable * frame duration of the sensor mode. * * To obtain the maximum frame duration: * * \verbatim frameDuration(s) = maxFrameLength(lines) * lineLength(pixels) / pixelRate(pixels per second) \endverbatim */ struct IPACameraSensorInfo { string model; uint32 bitsPerPixel; Size activeAreaSize; Rectangle analogCrop; Size outputSize; uint64 pixelRate; uint32 lineLength; uint32 minFrameLength; uint32 maxFrameLength; }; /** * \struct IPABuffer * \brief Buffer information for the IPA interface * * The IPABuffer structure associates buffer memory with a unique ID. It is * used to map buffers to the IPA with IPAInterface::mapBuffers(), after which * buffers will be identified by their ID in the IPA interface. */ /** * \var IPABuffer::id * \brief The buffer unique ID * * Buffers mapped to the IPA are identified by numerical unique IDs. The IDs * are chosen by the pipeline handler to fulfil the following constraints: * * - IDs shall be positive integers different than zero * - IDs shall be unique among all mapped buffers * * When buffers are unmapped with IPAInterface::unmapBuffers() their IDs are * freed and may be reused for new buffer mappings. */ /** * \var IPABuffer::planes * \brief The buffer planes description * * Stores the dmabuf handle and length for each plane of the buffer. */ struct IPABuffer { uint32 id; [hasFd] array planes; }; /** * \struct IPASettings * \brief IPA interface initialization settings * * The IPASettings structure stores data passed to the IPAInterface::init() * function. The data contains settings that don't depend on a particular camera * or pipeline configuration and are valid for the whole life time of the IPA * interface. */ /** * \var IPASettings::configurationFile * \brief The name of the IPA configuration file * * This field may be an empty string if the IPA doesn't require a configuration * file. */ /** * \var IPASettings::sensorModel * \brief The sensor model name * * Provides the sensor model name to the IPA. */ struct IPASettings { string configurationFile; string sensorModel; }; /** * \struct IPAStream * \brief Stream configuration for the IPA interface * * The IPAStream structure stores stream configuration parameters needed by the * IPAInterface::configure() function. It mirrors the StreamConfiguration class * that is not suitable for this purpose due to not being serializable. */ /** * \var IPAStream::pixelFormat * \brief The stream pixel format */ /** * \var IPAStream::size * \brief The stream size in pixels */ struct IPAStream { uint32 pixelFormat; Size size; };