mirror of
https://git.libcamera.org/libcamera/libcamera.git
synced 2025-07-13 07:19:45 +03:00
meson: ipa: Add mapping for pipeline handler to mojom interface file
Allow an arbitrary mapping between the pipeline handler and IPA mojom interface file in the build system. This removes the 1:1 mapping of pipeline handler name to mojom filename, and allows more flexibility to pipeline developers. Signed-off-by: Naushir Patuck <naush@raspberrypi.com> Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
parent
8258bd6ad6
commit
312e9910ba
2 changed files with 48 additions and 25 deletions
|
@ -19,6 +19,16 @@ connect to, in order to receive data from the IPA asynchronously. In addition,
|
||||||
it contains any custom data structures that the pipeline handler and IPA may
|
it contains any custom data structures that the pipeline handler and IPA may
|
||||||
pass to each other.
|
pass to each other.
|
||||||
|
|
||||||
|
It is possible to use the same IPA interface with multiple pipeline handlers
|
||||||
|
on different hardware platforms. Generally in such cases, these platforms would
|
||||||
|
have a common hardware ISP pipeline. For instance, the rkisp1 pipeline handler
|
||||||
|
supports both the RK3399 and the i.MX8MP as they integrate the same ISP.
|
||||||
|
However, the i.MX8MP has a more complex camera pipeline, which may call for a
|
||||||
|
dedicated pipeline handler in the future. As the ISP is the same as for RK3399,
|
||||||
|
the same IPA interface could be used for both pipeline handlers. The build files
|
||||||
|
provide a mapping from pipeline handler to the IPA interface name as detailed in
|
||||||
|
:ref:`compiling-section`.
|
||||||
|
|
||||||
The IPA protocol refers to the agreement between the pipeline handler and the
|
The IPA protocol refers to the agreement between the pipeline handler and the
|
||||||
IPA regarding the expected response(s) from the IPA for given calls to the IPA.
|
IPA regarding the expected response(s) from the IPA for given calls to the IPA.
|
||||||
This protocol doesn't need to be declared anywhere in code, but it shall be
|
This protocol doesn't need to be declared anywhere in code, but it shall be
|
||||||
|
@ -43,7 +53,7 @@ interface definition is thus written by the pipeline handler author, based on
|
||||||
how they design the interactions between the pipeline handler and the IPA.
|
how they design the interactions between the pipeline handler and the IPA.
|
||||||
|
|
||||||
The entire IPA interface, including the functions, signals, and any custom
|
The entire IPA interface, including the functions, signals, and any custom
|
||||||
structs shall be defined in a file named {pipeline_name}.mojom under
|
structs shall be defined in a file named {interface_name}.mojom under
|
||||||
include/libcamera/ipa/.
|
include/libcamera/ipa/.
|
||||||
|
|
||||||
.. _mojo Interface Definition Language: https://chromium.googlesource.com/chromium/src.git/+/master/mojo/public/tools/bindings/README.md
|
.. _mojo Interface Definition Language: https://chromium.googlesource.com/chromium/src.git/+/master/mojo/public/tools/bindings/README.md
|
||||||
|
@ -150,7 +160,7 @@ and the Event IPA interface, which describes the signals received by the
|
||||||
pipeline handler that the IPA can emit. Both must be defined. This section
|
pipeline handler that the IPA can emit. Both must be defined. This section
|
||||||
focuses on the Main IPA interface.
|
focuses on the Main IPA interface.
|
||||||
|
|
||||||
The main interface must be named as IPA{pipeline_name}Interface.
|
The main interface must be named as IPA{interface_name}Interface.
|
||||||
|
|
||||||
The functions that the pipeline handler can call from the IPA may be
|
The functions that the pipeline handler can call from the IPA may be
|
||||||
synchronous or asynchronous. Synchronous functions do not return until the IPA
|
synchronous or asynchronous. Synchronous functions do not return until the IPA
|
||||||
|
@ -243,7 +253,7 @@ then it may be empty. These emissions are meant to notify the pipeline handler
|
||||||
of some event, such as request data is ready, and *must not* be used to drive
|
of some event, such as request data is ready, and *must not* be used to drive
|
||||||
the camera pipeline from the IPA.
|
the camera pipeline from the IPA.
|
||||||
|
|
||||||
The event interface must be named as IPA{pipeline_name}EventInterface.
|
The event interface must be named as IPA{interface_name}EventInterface.
|
||||||
|
|
||||||
Functions defined in the event interface are implicitly asynchronous.
|
Functions defined in the event interface are implicitly asynchronous.
|
||||||
Thus they cannot return any value. Specifying the [async] tag is not
|
Thus they cannot return any value. Specifying the [async] tag is not
|
||||||
|
@ -266,38 +276,42 @@ The following is an example of an event interface definition:
|
||||||
setStaggered(libcamera.ControlList controls);
|
setStaggered(libcamera.ControlList controls);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
.. _compiling-section:
|
||||||
|
|
||||||
Compiling the IPA interface
|
Compiling the IPA interface
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
After the IPA interface is defined in include/libcamera/ipa/{pipeline_name}.mojom,
|
After the IPA interface is defined in include/libcamera/ipa/{interface_name}.mojom,
|
||||||
an entry for it must be added in meson so that it can be compiled. The filename
|
an entry for it must be added in meson so that it can be compiled. The filename
|
||||||
must be added to the ipa_mojom_files object in include/libcamera/ipa/meson.build.
|
must be added to the pipeline_ipa_mojom_mapping variable in
|
||||||
|
include/libcamera/ipa/meson.build. This variable maps the pipeline handler name
|
||||||
|
to its IPA interface file.
|
||||||
|
|
||||||
For example, adding the raspberrypi.mojom file to meson:
|
For example, adding the raspberrypi.mojom file to meson:
|
||||||
|
|
||||||
.. code-block:: none
|
.. code-block:: none
|
||||||
|
|
||||||
ipa_mojom_files = [
|
pipeline_ipa_mojom_mapping = [
|
||||||
'raspberrypi.mojom',
|
'rpi/vc4': 'raspberrypi.mojom',
|
||||||
]
|
]
|
||||||
|
|
||||||
This will cause the mojo data definition file to be compiled. Specifically, it
|
This will cause the mojo data definition file to be compiled. Specifically, it
|
||||||
generates five files:
|
generates five files:
|
||||||
|
|
||||||
- a header describing the custom data structures, and the complete IPA
|
- a header describing the custom data structures, and the complete IPA
|
||||||
interface (at {$build_dir}/include/libcamera/ipa/{pipeline}_ipa_interface.h)
|
interface (at {$build_dir}/include/libcamera/ipa/{interface}_ipa_interface.h)
|
||||||
|
|
||||||
- a serializer implementing de/serialization for the custom data structures (at
|
- a serializer implementing de/serialization for the custom data structures (at
|
||||||
{$build_dir}/include/libcamera/ipa/{pipeline}_ipa_serializer.h)
|
{$build_dir}/include/libcamera/ipa/{interface}_ipa_serializer.h)
|
||||||
|
|
||||||
- a proxy header describing a specialized IPA proxy (at
|
- a proxy header describing a specialized IPA proxy (at
|
||||||
{$build_dir}/include/libcamera/ipa/{pipeline}_ipa_proxy.h)
|
{$build_dir}/include/libcamera/ipa/{interface}_ipa_proxy.h)
|
||||||
|
|
||||||
- a proxy source implementing the IPA proxy (at
|
- a proxy source implementing the IPA proxy (at
|
||||||
{$build_dir}/src/libcamera/proxy/{pipeline}_ipa_proxy.cpp)
|
{$build_dir}/src/libcamera/proxy/{interface}_ipa_proxy.cpp)
|
||||||
|
|
||||||
- a proxy worker source implementing the other end of the IPA proxy (at
|
- a proxy worker source implementing the other end of the IPA proxy (at
|
||||||
{$build_dir}/src/libcamera/proxy/worker/{pipeline}_ipa_proxy_worker.cpp)
|
{$build_dir}/src/libcamera/proxy/worker/{interface}_ipa_proxy_worker.cpp)
|
||||||
|
|
||||||
The IPA proxy serves as the layer between the pipeline handler and the IPA, and
|
The IPA proxy serves as the layer between the pipeline handler and the IPA, and
|
||||||
handles threading vs isolation transparently. The pipeline handler and the IPA
|
handles threading vs isolation transparently. The pipeline handler and the IPA
|
||||||
|
@ -312,7 +326,7 @@ file, the following header must be included:
|
||||||
|
|
||||||
.. code-block:: C++
|
.. code-block:: C++
|
||||||
|
|
||||||
#include <libcamera/ipa/{pipeline_name}_ipa_interface.h>
|
#include <libcamera/ipa/{interface_name}_ipa_interface.h>
|
||||||
|
|
||||||
The POD types of the structs simply become their C++ counterparts, eg. uint32
|
The POD types of the structs simply become their C++ counterparts, eg. uint32
|
||||||
in mojo will become uint32_t in C++. mojo map becomes C++ std::map, and mojo
|
in mojo will become uint32_t in C++. mojo map becomes C++ std::map, and mojo
|
||||||
|
|
|
@ -60,13 +60,15 @@ libcamera_generated_ipa_headers += custom_target('core_ipa_serializer_h',
|
||||||
'./' +'@INPUT@'
|
'./' +'@INPUT@'
|
||||||
])
|
])
|
||||||
|
|
||||||
ipa_mojom_files = [
|
# Mapping from pipeline handler name to mojom file
|
||||||
'ipu3.mojom',
|
pipeline_ipa_mojom_mapping = {
|
||||||
'raspberrypi.mojom',
|
'ipu3': 'ipu3.mojom',
|
||||||
'rkisp1.mojom',
|
'rkisp1': 'rkisp1.mojom',
|
||||||
'vimc.mojom',
|
'raspberrypi': 'raspberrypi.mojom',
|
||||||
]
|
'vimc': 'vimc.mojom',
|
||||||
|
}
|
||||||
|
|
||||||
|
ipa_mojom_files = []
|
||||||
ipa_mojoms = []
|
ipa_mojoms = []
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -75,14 +77,21 @@ ipa_mojoms = []
|
||||||
|
|
||||||
# TODO Define per-pipeline ControlInfoMap with yaml?
|
# TODO Define per-pipeline ControlInfoMap with yaml?
|
||||||
|
|
||||||
foreach file : ipa_mojom_files
|
foreach pipeline, file : pipeline_ipa_mojom_mapping
|
||||||
name = file.split('.')[0]
|
name = file.split('.')[0]
|
||||||
|
|
||||||
if name not in pipelines
|
# Ensure we do not build duplicate mojom modules
|
||||||
|
if file in ipa_mojom_files
|
||||||
continue
|
continue
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# {pipeline}.mojom-module
|
ipa_mojom_files += file
|
||||||
|
|
||||||
|
if pipeline not in pipelines
|
||||||
|
continue
|
||||||
|
endif
|
||||||
|
|
||||||
|
# {interface}.mojom-module
|
||||||
mojom = custom_target(name + '_mojom_module',
|
mojom = custom_target(name + '_mojom_module',
|
||||||
input : file,
|
input : file,
|
||||||
output : file + '-module',
|
output : file + '-module',
|
||||||
|
@ -94,7 +103,7 @@ foreach file : ipa_mojom_files
|
||||||
'--mojoms', '@INPUT@'
|
'--mojoms', '@INPUT@'
|
||||||
])
|
])
|
||||||
|
|
||||||
# {pipeline}_ipa_interface.h
|
# {interface}_ipa_interface.h
|
||||||
header = custom_target(name + '_ipa_interface_h',
|
header = custom_target(name + '_ipa_interface_h',
|
||||||
input : mojom,
|
input : mojom,
|
||||||
output : name + '_ipa_interface.h',
|
output : name + '_ipa_interface.h',
|
||||||
|
@ -110,7 +119,7 @@ foreach file : ipa_mojom_files
|
||||||
'./' +'@INPUT@'
|
'./' +'@INPUT@'
|
||||||
])
|
])
|
||||||
|
|
||||||
# {pipeline}_ipa_serializer.h
|
# {interface}_ipa_serializer.h
|
||||||
serializer = custom_target(name + '_ipa_serializer_h',
|
serializer = custom_target(name + '_ipa_serializer_h',
|
||||||
input : mojom,
|
input : mojom,
|
||||||
output : name + '_ipa_serializer.h',
|
output : name + '_ipa_serializer.h',
|
||||||
|
@ -124,7 +133,7 @@ foreach file : ipa_mojom_files
|
||||||
'./' +'@INPUT@'
|
'./' +'@INPUT@'
|
||||||
])
|
])
|
||||||
|
|
||||||
# {pipeline}_ipa_proxy.h
|
# {interface}_ipa_proxy.h
|
||||||
proxy_header = custom_target(name + '_proxy_h',
|
proxy_header = custom_target(name + '_proxy_h',
|
||||||
input : mojom,
|
input : mojom,
|
||||||
output : name + '_ipa_proxy.h',
|
output : name + '_ipa_proxy.h',
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue