[libcamera-devel] [PATCH v4 31/37] ipa: remove libipa
paul.elder at ideasonboard.com
paul.elder at ideasonboard.com
Mon Nov 9 03:25:57 CET 2020
Hi Kieran,
On Fri, Nov 06, 2020 at 11:12:23AM +0000, Kieran Bingham wrote:
> Hi Paul,
>
> On 06/11/2020 10:37, Paul Elder wrote:
> > As every pipeline and have its own proxy, IPAInterfaceWrapper is no
> > longer necessary. Since it's the only member of libipa, remove libipa
> > completely.
>
> Ah, I think I foresee the (imminent?) addition of items to libipa to be
> able to share some common features across open-source IPA modules.
> (closed source ones won't share of course).
Ah, I see.
> Could we have this patch strip out the dead code, but /keep/ the libipa
> itself as a skeleton at least?
Well yes, but... then we'd just have a libipa directory and meson file
but no files to actually build... is that fine?
Thanks,
Paul
>
> > Signed-off-by: Paul Elder <paul.elder at ideasonboard.com>
> > Reviewed-by: Niklas Söderlund <niklas.soderlund at ragnatech.se>
> >
> > ---
> > No change in v4
> >
> > No change in v3
> >
> > No change in v2
> > ---
> > Documentation/Doxyfile.in | 1 -
> > Documentation/meson.build | 2 -
> > src/ipa/libipa/ipa_interface_wrapper.cpp | 285 -----------------------
> > src/ipa/libipa/ipa_interface_wrapper.h | 61 -----
> > src/ipa/libipa/meson.build | 15 --
> > src/ipa/meson.build | 2 -
> > src/ipa/raspberrypi/meson.build | 2 -
> > src/ipa/raspberrypi/raspberrypi.cpp | 2 -
> > src/ipa/rkisp1/meson.build | 3 +-
> > src/ipa/rkisp1/rkisp1.cpp | 2 -
> > src/ipa/vimc/meson.build | 3 +-
> > src/ipa/vimc/vimc.cpp | 2 -
> > test/ipa/ipa_wrappers_test.cpp | 1 -
> > test/ipa/meson.build | 4 +-
> > 14 files changed, 4 insertions(+), 381 deletions(-)
> > delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.cpp
> > delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.h
> > delete mode 100644 src/ipa/libipa/meson.build
> >
> > diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in
> > index 20fa1349..9a7a3fb4 100644
> > --- a/Documentation/Doxyfile.in
> > +++ b/Documentation/Doxyfile.in
> > @@ -789,7 +789,6 @@ WARN_LOGFILE =
> > # Note: If this tag is empty the current directory is searched.
> >
> > INPUT = "@TOP_SRCDIR@/include/libcamera" \
> > - "@TOP_SRCDIR@/src/ipa/libipa" \
> > "@TOP_SRCDIR@/src/libcamera" \
> > "@TOP_BUILDDIR@/include/libcamera" \
> > "@TOP_BUILDDIR@/src/libcamera"
> > diff --git a/Documentation/meson.build b/Documentation/meson.build
> > index 26a12fcd..59107151 100644
> > --- a/Documentation/meson.build
> > +++ b/Documentation/meson.build
> > @@ -27,8 +27,6 @@ if doxygen.found() and dot.found()
> > libcamera_ipa_headers,
> > libcamera_public_headers,
> > libcamera_sources,
> > - libipa_headers,
> > - libipa_sources,
> > ],
> > output : 'api-html',
> > command : [doxygen, doxyfile],
> > diff --git a/src/ipa/libipa/ipa_interface_wrapper.cpp b/src/ipa/libipa/ipa_interface_wrapper.cpp
> > deleted file mode 100644
> > index cee532e3..00000000
> > --- a/src/ipa/libipa/ipa_interface_wrapper.cpp
> > +++ /dev/null
> > @@ -1,285 +0,0 @@
> > -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > -/*
> > - * Copyright (C) 2019, Google Inc.
> > - *
> > - * ipa_interface_wrapper.cpp - Image Processing Algorithm interface wrapper
> > - */
> > -
> > -#include "ipa_interface_wrapper.h"
> > -
> > -#include <map>
> > -#include <string.h>
> > -#include <unistd.h>
> > -#include <vector>
> > -
> > -#include <libcamera/ipa/ipa_interface.h>
> > -
> > -#include "libcamera/internal/byte_stream_buffer.h"
> > -#include "libcamera/internal/camera_sensor.h"
> > -
> > -/**
> > - * \file ipa_interface_wrapper.h
> > - * \brief Image Processing Algorithm interface wrapper
> > - */
> > -
> > -namespace libcamera {
> > -
> > -/**
> > - * \class IPAInterfaceWrapper
> > - * \brief Wrap an IPAInterface and expose it as an ipa_context
> > - *
> > - * This class implements the ipa_context API based on a provided IPAInterface.
> > - * It helps IPAs that implement the IPAInterface API to provide the external
> > - * ipa_context API.
> > - *
> > - * To use the wrapper, an IPA module simple creates a new instance of its
> > - * IPAInterface implementation, and passes it to the constructor of the
> > - * IPAInterfaceWrapper. As IPAInterfaceWrapper inherits from ipa_context, the
> > - * constructed wrapper can then be directly returned from the IPA module's
> > - * ipaCreate() function.
> > - *
> > - * \code{.cpp}
> > - * class MyIPA : public IPAInterface
> > - * {
> > - * ...
> > - * };
> > - *
> > - * struct ipa_context *ipaCreate()
> > - * {
> > - * return new IPAInterfaceWrapper(std::make_unique<MyIPA>());
> > - * }
> > - * \endcode
> > - *
> > - * The wrapper takes ownership of the IPAInterface and will automatically
> > - * delete it when the wrapper is destroyed.
> > - */
> > -
> > -/**
> > - * \brief Construct an IPAInterfaceWrapper wrapping \a interface
> > - * \param[in] interface The interface to wrap
> > - */
> > -IPAInterfaceWrapper::IPAInterfaceWrapper(std::unique_ptr<IPAInterface> interface)
> > - : ipa_(std::move(interface)), callbacks_(nullptr), cb_ctx_(nullptr)
> > -{
> > - ops = &operations_;
> > -
> > - ipa_->queueFrameAction.connect(this, &IPAInterfaceWrapper::queueFrameAction);
> > -}
> > -
> > -void IPAInterfaceWrapper::destroy(struct ipa_context *_ctx)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - delete ctx;
> > -}
> > -
> > -void *IPAInterfaceWrapper::get_interface(struct ipa_context *_ctx)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - return ctx->ipa_.get();
> > -}
> > -
> > -void IPAInterfaceWrapper::init(struct ipa_context *_ctx,
> > - const struct ipa_settings *settings)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - IPASettings ipaSettings{
> > - .configurationFile = settings->configuration_file
> > - };
> > - ctx->ipa_->init(ipaSettings);
> > -}
> > -
> > -int IPAInterfaceWrapper::start(struct ipa_context *_ctx)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - return ctx->ipa_->start();
> > -}
> > -
> > -void IPAInterfaceWrapper::stop(struct ipa_context *_ctx)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - ctx->ipa_->stop();
> > -}
> > -
> > -void IPAInterfaceWrapper::register_callbacks(struct ipa_context *_ctx,
> > - const struct ipa_callback_ops *callbacks,
> > - void *cb_ctx)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - ctx->callbacks_ = callbacks;
> > - ctx->cb_ctx_ = cb_ctx;
> > -}
> > -
> > -void IPAInterfaceWrapper::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)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > -
> > - ctx->serializer_.reset();
> > -
> > - /* Translate the IPA sensor info. */
> > - CameraSensorInfo sensorInfo{};
> > - sensorInfo.model = sensor_info->model;
> > - sensorInfo.bitsPerPixel = sensor_info->bits_per_pixel;
> > - sensorInfo.activeAreaSize = { sensor_info->active_area.width,
> > - sensor_info->active_area.height };
> > - sensorInfo.analogCrop = { sensor_info->analog_crop.left,
> > - sensor_info->analog_crop.top,
> > - sensor_info->analog_crop.width,
> > - sensor_info->analog_crop.height };
> > - sensorInfo.outputSize = { sensor_info->output_size.width,
> > - sensor_info->output_size.height };
> > - sensorInfo.pixelRate = sensor_info->pixel_rate;
> > - sensorInfo.lineLength = sensor_info->line_length;
> > -
> > - /* Translate the IPA stream configurations map. */
> > - std::map<unsigned int, IPAStream> ipaStreams;
> > -
> > - for (unsigned int i = 0; i < num_streams; ++i) {
> > - const struct ipa_stream &stream = streams[i];
> > -
> > - ipaStreams[stream.id] = {
> > - stream.pixel_format,
> > - Size(stream.width, stream.height),
> > - };
> > - }
> > -
> > - /* Translate the IPA entity controls map. */
> > - std::map<unsigned int, const ControlInfoMap &> entityControls;
> > - std::map<unsigned int, ControlInfoMap> infoMaps;
> > -
> > - for (unsigned int i = 0; i < num_maps; ++i) {
> > - const struct ipa_control_info_map &ipa_map = maps[i];
> > - ByteStreamBuffer byteStream(ipa_map.data, ipa_map.size);
> > - unsigned int id = ipa_map.id;
> > -
> > - infoMaps[id] = ctx->serializer_.deserialize<ControlInfoMap>(byteStream);
> > - entityControls.emplace(id, infoMaps[id]);
> > - }
> > -
> > - /* \todo Translate the ipaConfig and result. */
> > - IPAOperationData ipaConfig;
> > - ctx->ipa_->configure(sensorInfo, ipaStreams, entityControls, ipaConfig,
> > - nullptr);
> > -}
> > -
> > -void IPAInterfaceWrapper::map_buffers(struct ipa_context *_ctx,
> > - const struct ipa_buffer *_buffers,
> > - size_t num_buffers)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > - std::vector<IPABuffer> buffers(num_buffers);
> > -
> > - for (unsigned int i = 0; i < num_buffers; ++i) {
> > - const struct ipa_buffer &_buffer = _buffers[i];
> > - IPABuffer &buffer = buffers[i];
> > - std::vector<FrameBuffer::Plane> &planes = buffer.planes;
> > -
> > - buffer.id = _buffer.id;
> > -
> > - planes.resize(_buffer.num_planes);
> > - for (unsigned int j = 0; j < _buffer.num_planes; ++j) {
> > - planes[j].fd = FileDescriptor(_buffer.planes[j].dmabuf);
> > - planes[j].length = _buffer.planes[j].length;
> > - }
> > - }
> > -
> > - ctx->ipa_->mapBuffers(buffers);
> > -}
> > -
> > -void IPAInterfaceWrapper::unmap_buffers(struct ipa_context *_ctx,
> > - const unsigned int *_ids,
> > - size_t num_buffers)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > - std::vector<unsigned int> ids(_ids, _ids + num_buffers);
> > - ctx->ipa_->unmapBuffers(ids);
> > -}
> > -
> > -void IPAInterfaceWrapper::process_event(struct ipa_context *_ctx,
> > - const struct ipa_operation_data *data)
> > -{
> > - IPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);
> > - IPAOperationData opData;
> > -
> > - opData.operation = data->operation;
> > -
> > - opData.data.resize(data->num_data);
> > - memcpy(opData.data.data(), data->data,
> > - data->num_data * sizeof(*data->data));
> > -
> > - opData.controls.resize(data->num_lists);
> > - for (unsigned int i = 0; i < data->num_lists; ++i) {
> > - const struct ipa_control_list *c_list = &data->lists[i];
> > - ByteStreamBuffer byteStream(c_list->data, c_list->size);
> > - opData.controls[i] = ctx->serializer_.deserialize<ControlList>(byteStream);
> > - }
> > -
> > - ctx->ipa_->processEvent(opData);
> > -}
> > -
> > -void IPAInterfaceWrapper::queueFrameAction(unsigned int frame,
> > - const IPAOperationData &data)
> > -{
> > - if (!callbacks_)
> > - return;
> > -
> > - struct ipa_operation_data c_data;
> > - c_data.operation = data.operation;
> > - c_data.data = data.data.data();
> > - c_data.num_data = data.data.size();
> > -
> > - struct ipa_control_list control_lists[data.controls.size()];
> > - c_data.lists = control_lists;
> > - c_data.num_lists = data.controls.size();
> > -
> > - std::size_t listsSize = 0;
> > - for (const auto &list : data.controls)
> > - listsSize += serializer_.binarySize(list);
> > -
> > - std::vector<uint8_t> binaryData(listsSize);
> > - ByteStreamBuffer byteStreamBuffer(binaryData.data(), listsSize);
> > -
> > - unsigned int i = 0;
> > - for (const auto &list : data.controls) {
> > - struct ipa_control_list &c_list = control_lists[i];
> > - c_list.size = serializer_.binarySize(list);
> > -
> > - ByteStreamBuffer b = byteStreamBuffer.carveOut(c_list.size);
> > - serializer_.serialize(list, b);
> > -
> > - c_list.data = b.base();
> > - }
> > -
> > - callbacks_->queue_frame_action(cb_ctx_, frame, c_data);
> > -}
> > -
> > -#ifndef __DOXYGEN__
> > -/*
> > - * This construct confuses Doygen and makes it believe that all members of the
> > - * operations is a member of IPAInterfaceWrapper. It must thus be hidden.
> > - */
> > -const struct ipa_context_ops IPAInterfaceWrapper::operations_ = {
> > - .destroy = &IPAInterfaceWrapper::destroy,
> > - .get_interface = &IPAInterfaceWrapper::get_interface,
> > - .init = &IPAInterfaceWrapper::init,
> > - .start = &IPAInterfaceWrapper::start,
> > - .stop = &IPAInterfaceWrapper::stop,
> > - .register_callbacks = &IPAInterfaceWrapper::register_callbacks,
> > - .configure = &IPAInterfaceWrapper::configure,
> > - .map_buffers = &IPAInterfaceWrapper::map_buffers,
> > - .unmap_buffers = &IPAInterfaceWrapper::unmap_buffers,
> > - .process_event = &IPAInterfaceWrapper::process_event,
> > -};
> > -#endif
> > -
> > -} /* namespace libcamera */
> > diff --git a/src/ipa/libipa/ipa_interface_wrapper.h b/src/ipa/libipa/ipa_interface_wrapper.h
> > deleted file mode 100644
> > index a1c70159..00000000
> > --- a/src/ipa/libipa/ipa_interface_wrapper.h
> > +++ /dev/null
> > @@ -1,61 +0,0 @@
> > -/* SPDX-License-Identifier: LGPL-2.1-or-later */
> > -/*
> > - * Copyright (C) 2019, Google Inc.
> > - *
> > - * ipa_interface_wrapper.h - Image Processing Algorithm interface wrapper
> > - */
> > -#ifndef __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__
> > -#define __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__
> > -
> > -#include <memory>
> > -
> > -#include <libcamera/ipa/ipa_interface.h>
> > -
> > -#include "libcamera/internal/control_serializer.h"
> > -
> > -namespace libcamera {
> > -
> > -class IPAInterfaceWrapper : public ipa_context
> > -{
> > -public:
> > - IPAInterfaceWrapper(std::unique_ptr<IPAInterface> interface);
> > -
> > -private:
> > - static void destroy(struct ipa_context *ctx);
> > - static void *get_interface(struct ipa_context *ctx);
> > - static void init(struct ipa_context *ctx,
> > - const struct ipa_settings *settings);
> > - static int start(struct ipa_context *ctx);
> > - static void stop(struct ipa_context *ctx);
> > - static void register_callbacks(struct ipa_context *ctx,
> > - const struct ipa_callback_ops *callbacks,
> > - void *cb_ctx);
> > - static 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);
> > - static void map_buffers(struct ipa_context *ctx,
> > - const struct ipa_buffer *c_buffers,
> > - size_t num_buffers);
> > - static void unmap_buffers(struct ipa_context *ctx,
> > - const unsigned int *ids,
> > - size_t num_buffers);
> > - static void process_event(struct ipa_context *ctx,
> > - const struct ipa_operation_data *data);
> > -
> > - static const struct ipa_context_ops operations_;
> > -
> > - void queueFrameAction(unsigned int frame, const IPAOperationData &data);
> > -
> > - std::unique_ptr<IPAInterface> ipa_;
> > - const struct ipa_callback_ops *callbacks_;
> > - void *cb_ctx_;
> > -
> > - ControlSerializer serializer_;
> > -};
> > -
> > -} /* namespace libcamera */
> > -
> > -#endif /* __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__ */
> > diff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build
> > deleted file mode 100644
> > index 22626405..00000000
> > --- a/src/ipa/libipa/meson.build
> > +++ /dev/null
> > @@ -1,15 +0,0 @@
> > -# SPDX-License-Identifier: CC0-1.0
> > -
> > -libipa_headers = files([
> > - 'ipa_interface_wrapper.h',
> > -])
> > -
> > -libipa_sources = files([
> > - 'ipa_interface_wrapper.cpp',
> > -])
> > -
> > -libipa_includes = include_directories('..')
> > -
> > -libipa = static_library('ipa', libipa_sources,
> > - include_directories : ipa_includes,
> > - dependencies : libcamera_dep)
> > diff --git a/src/ipa/meson.build b/src/ipa/meson.build
> > index 5a5de267..b11e5d23 100644
> > --- a/src/ipa/meson.build
> > +++ b/src/ipa/meson.build
> > @@ -15,8 +15,6 @@ config_h.set('IPA_CONFIG_DIR',
> > config_h.set('IPA_MODULE_DIR',
> > '"' + join_paths(get_option('prefix'), ipa_install_dir) + '"')
> >
> > -subdir('libipa')
> > -
> > ipa_sign = files('ipa-sign.sh')
> >
> > ipas = ['raspberrypi', 'rkisp1', 'vimc']
> > diff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build
> > index 4331f718..4a0e18cf 100644
> > --- a/src/ipa/raspberrypi/meson.build
> > +++ b/src/ipa/raspberrypi/meson.build
> > @@ -10,7 +10,6 @@ rpi_ipa_deps = [
> >
> > rpi_ipa_includes = [
> > ipa_includes,
> > - libipa_includes,
> > include_directories('controller')
> > ]
> >
> > @@ -46,7 +45,6 @@ mod = shared_module(ipa_name,
> > name_prefix : '',
> > include_directories : rpi_ipa_includes,
> > dependencies : rpi_ipa_deps,
> > - link_with : libipa,
> > install : true,
> > install_dir : ipa_install_dir)
> >
> > diff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp
> > index 316da7bd..592436f8 100644
> > --- a/src/ipa/raspberrypi/raspberrypi.cpp
> > +++ b/src/ipa/raspberrypi/raspberrypi.cpp
> > @@ -23,8 +23,6 @@
> > #include <libcamera/request.h>
> > #include <libcamera/span.h>
> >
> > -#include <libipa/ipa_interface_wrapper.h>
> > -
> > #include "libcamera/internal/camera_sensor.h"
> > #include "libcamera/internal/log.h"
> > #include "libcamera/internal/utils.h"
> > diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build
> > index 3061d53c..bfe8d362 100644
> > --- a/src/ipa/rkisp1/meson.build
> > +++ b/src/ipa/rkisp1/meson.build
> > @@ -5,9 +5,8 @@ ipa_name = 'ipa_rkisp1'
> > mod = shared_module(ipa_name,
> > ['rkisp1.cpp', libcamera_generated_ipa_headers],
> > name_prefix : '',
> > - include_directories : [ipa_includes, libipa_includes],
> > + include_directories : ipa_includes,
> > dependencies : libcamera_dep,
> > - link_with : libipa,
> > install : true,
> > install_dir : ipa_install_dir)
> >
> > diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp
> > index 7bb261c6..c88f1271 100644
> > --- a/src/ipa/rkisp1/rkisp1.cpp
> > +++ b/src/ipa/rkisp1/rkisp1.cpp
> > @@ -23,8 +23,6 @@
> > #include <libcamera/ipa/rkisp1_ipa_interface.h>
> > #include <libcamera/request.h>
> >
> > -#include <libipa/ipa_interface_wrapper.h>
> > -
> > #include "libcamera/internal/log.h"
> >
> > namespace libcamera {
> > diff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build
> > index e982ebba..67440fd8 100644
> > --- a/src/ipa/vimc/meson.build
> > +++ b/src/ipa/vimc/meson.build
> > @@ -5,9 +5,8 @@ ipa_name = 'ipa_vimc'
> > mod = shared_module(ipa_name,
> > ['vimc.cpp', libcamera_generated_ipa_headers],
> > name_prefix : '',
> > - include_directories : [ipa_includes, libipa_includes],
> > + include_directories : ipa_includes,
> > dependencies : libcamera_dep,
> > - link_with : libipa,
> > install : true,
> > install_dir : ipa_install_dir)
> >
> > diff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp
> > index fbf7325e..6b088466 100644
> > --- a/src/ipa/vimc/vimc.cpp
> > +++ b/src/ipa/vimc/vimc.cpp
> > @@ -18,8 +18,6 @@
> > #include <libcamera/ipa/ipa_interface.h>
> > #include <libcamera/ipa/ipa_module_info.h>
> >
> > -#include <libipa/ipa_interface_wrapper.h>
> > -
> > #include "libcamera/internal/file.h"
> > #include "libcamera/internal/log.h"
> >
> > diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp
> > index 59d991cb..0133d8d2 100644
> > --- a/test/ipa/ipa_wrappers_test.cpp
> > +++ b/test/ipa/ipa_wrappers_test.cpp
> > @@ -13,7 +13,6 @@
> > #include <unistd.h>
> >
> > #include <libcamera/controls.h>
> > -#include <libipa/ipa_interface_wrapper.h>
> >
> > #include "libcamera/internal/camera_sensor.h"
> > #include "libcamera/internal/device_enumerator.h"
> > diff --git a/test/ipa/meson.build b/test/ipa/meson.build
> > index ba672f3f..b25bfcf4 100644
> > --- a/test/ipa/meson.build
> > +++ b/test/ipa/meson.build
> > @@ -9,8 +9,8 @@ ipa_test = [
> > foreach t : ipa_test
> > exe = executable(t[0], t[1],
> > dependencies : libcamera_dep,
> > - link_with : [libipa, test_libraries],
> > - include_directories : [libipa_includes, test_includes_internal])
> > + link_with : test_libraries,
> > + include_directories : test_includes_internal)
> >
> > test(t[0], exe, suite : 'ipa')
> > endforeach
> >
>
> --
> Regards
> --
> Kieran
More information about the libcamera-devel
mailing list