[libcamera-devel] [PATCH 01/13] meson: ipa: Add mapping for pipeline handler to mojom interface file

Naushir Patuck naush at raspberrypi.com
Wed Apr 26 15:10:45 CEST 2023


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 at raspberrypi.com>
---
 Documentation/guides/ipa.rst      | 19 ++++++++--------
 include/libcamera/ipa/meson.build | 36 ++++++++++++++++++++-----------
 2 files changed, 33 insertions(+), 22 deletions(-)

diff --git a/Documentation/guides/ipa.rst b/Documentation/guides/ipa.rst
index fc0317451e24..89839408672a 100644
--- a/Documentation/guides/ipa.rst
+++ b/Documentation/guides/ipa.rst
@@ -269,35 +269,36 @@ The following is an example of an event interface definition:
 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
-must be added to the ipa_mojom_files object in include/libcamera/ipa/meson.build.
+must be added to the pipeline_ipa_mojom_mapping object in include/libcamera/ipa/meson.build.
+This object maps the pipeline handler name with an ipa interface file.
 
 For example, adding the raspberrypi.mojom file to meson:
 
 .. code-block:: none
 
-        ipa_mojom_files = [
-            'raspberrypi.mojom',
+        pipeline_ipa_mojom_mapping = [
+            'raspberrypi': 'raspberrypi.mojom',
         ]
 
 This will cause the mojo data definition file to be compiled. Specifically, it
 generates five files:
 
 - 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
-  {$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
-  {$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
-  {$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
-  {$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
 handles threading vs isolation transparently. The pipeline handler and the IPA
diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build
index 442ca3dd7e1c..67c31cb04ccf 100644
--- a/include/libcamera/ipa/meson.build
+++ b/include/libcamera/ipa/meson.build
@@ -60,13 +60,15 @@ libcamera_generated_ipa_headers += custom_target('core_ipa_serializer_h',
                       './' +'@INPUT@'
                   ])
 
-ipa_mojom_files = [
-    'ipu3.mojom',
-    'raspberrypi.mojom',
-    'rkisp1.mojom',
-    'vimc.mojom',
-]
-
+# Mapping from pipeline handler name to mojom file
+pipeline_ipa_mojom_mapping = {
+    'ipu3': 'ipu3.mojom',
+    'rkisp1': 'rkisp1.mojom',
+    'raspberrypi': 'raspberrypi.mojom',
+    'vimc': 'vimc.mojom',
+}
+
+ipa_mojom_files = []
 ipa_mojoms = []
 
 #
@@ -75,14 +77,22 @@ ipa_mojoms = []
 
 # TODO Define per-pipeline ControlInfoMap with yaml?
 
-foreach file : ipa_mojom_files
+foreach pipeline, file : pipeline_ipa_mojom_mapping
+
     name = file.split('.')[0]
 
-    if name not in pipelines
+    # Ensure we do not build duplicate mojom modules
+    if (file in ipa_mojom_files)
+        continue
+    endif
+
+    ipa_mojom_files += file
+
+    if pipeline not in pipelines
         continue
     endif
 
-    # {pipeline}.mojom-module
+    # {interface}.mojom-module
     mojom = custom_target(name + '_mojom_module',
                           input : file,
                           output : file + '-module',
@@ -94,7 +104,7 @@ foreach file : ipa_mojom_files
                               '--mojoms', '@INPUT@'
                           ])
 
-    # {pipeline}_ipa_interface.h
+    # {interface}_ipa_interface.h
     header = custom_target(name + '_ipa_interface_h',
                            input : mojom,
                            output : name + '_ipa_interface.h',
@@ -110,7 +120,7 @@ foreach file : ipa_mojom_files
                                './' +'@INPUT@'
                            ])
 
-    # {pipeline}_ipa_serializer.h
+    # {interface}_ipa_serializer.h
     serializer = custom_target(name + '_ipa_serializer_h',
                                input : mojom,
                                output : name + '_ipa_serializer.h',
@@ -124,7 +134,7 @@ foreach file : ipa_mojom_files
                                    './' +'@INPUT@'
                                ])
 
-    # {pipeline}_ipa_proxy.h
+    # {interface}_ipa_proxy.h
     proxy_header = custom_target(name + '_proxy_h',
                                  input : mojom,
                                  output : name + '_ipa_proxy.h',
-- 
2.34.1



More information about the libcamera-devel mailing list