Show a patch.

GET /api/patches/9941/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 9941,
    "url": "https://patchwork.libcamera.org/api/patches/9941/?format=api",
    "web_url": "https://patchwork.libcamera.org/patch/9941/",
    "project": {
        "id": 1,
        "url": "https://patchwork.libcamera.org/api/projects/1/?format=api",
        "name": "libcamera",
        "link_name": "libcamera",
        "list_id": "libcamera_core",
        "list_email": "libcamera-devel@lists.libcamera.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": ""
    },
    "msgid": "<20201002143154.468162-34-paul.elder@ideasonboard.com>",
    "date": "2020-10-02T14:31:49",
    "name": "[libcamera-devel,v3,33/38] ipa: remove libipa",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": false,
    "hash": "2021edaa2c1da768fca5f482c6e2a9f96b796fdf",
    "submitter": {
        "id": 17,
        "url": "https://patchwork.libcamera.org/api/people/17/?format=api",
        "name": "Paul Elder",
        "email": "paul.elder@ideasonboard.com"
    },
    "delegate": null,
    "mbox": "https://patchwork.libcamera.org/patch/9941/mbox/",
    "series": [
        {
            "id": 1348,
            "url": "https://patchwork.libcamera.org/api/series/1348/?format=api",
            "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=1348",
            "date": "2020-10-02T14:31:16",
            "name": "IPA isolation implementation",
            "version": 3,
            "mbox": "https://patchwork.libcamera.org/series/1348/mbox/"
        }
    ],
    "comments": "https://patchwork.libcamera.org/api/patches/9941/comments/",
    "check": "pending",
    "checks": "https://patchwork.libcamera.org/api/patches/9941/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "<libcamera-devel-bounces@lists.libcamera.org>",
        "X-Original-To": "parsemail@patchwork.libcamera.org",
        "Delivered-To": "parsemail@patchwork.libcamera.org",
        "Received": [
            "from lancelot.ideasonboard.com (lancelot.ideasonboard.com\n\t[92.243.16.209])\n\tby patchwork.libcamera.org (Postfix) with ESMTPS id 7856FC3B5C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri,  2 Oct 2020 14:33:27 +0000 (UTC)",
            "from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 44EA463BCA;\n\tFri,  2 Oct 2020 16:33:27 +0200 (CEST)",
            "from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 371A263B98\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri,  2 Oct 2020 16:33:26 +0200 (CEST)",
            "from pyrite.rasen.tech (unknown\n\t[IPv6:2400:4051:61:600:2c71:1b79:d06d:5032])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 22E43FD1;\n\tFri,  2 Oct 2020 16:33:23 +0200 (CEST)"
        ],
        "Authentication-Results": "lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"FIhmPEUx\"; dkim-atps=neutral",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1601649205;\n\tbh=CWvGQOwsETu2PiugNCLEbxflcHtP4qbRCth8pLez6yc=;\n\th=From:To:Cc:Subject:Date:In-Reply-To:References:From;\n\tb=FIhmPEUxXHTF6JaNJHPbdZFOxZPFtJSSgsKDJfDuzDGq5d4TA/XE/0oU6+MQuQmRF\n\tJMJ5bWK8Ps8mqfpbnCo+IjOXgjA48pcc0+M57QsJu/jVUnE2/MgvXdKsUP8uHcZnZ9\n\tQduEG/nH4z7TjNJuONqVINBgJnY3au5JsfO5jsSQ=",
        "From": "Paul Elder <paul.elder@ideasonboard.com>",
        "To": "libcamera-devel@lists.libcamera.org",
        "Date": "Fri,  2 Oct 2020 23:31:49 +0900",
        "Message-Id": "<20201002143154.468162-34-paul.elder@ideasonboard.com>",
        "X-Mailer": "git-send-email 2.27.0",
        "In-Reply-To": "<20201002143154.468162-1-paul.elder@ideasonboard.com>",
        "References": "<20201002143154.468162-1-paul.elder@ideasonboard.com>",
        "MIME-Version": "1.0",
        "Subject": "[libcamera-devel] [PATCH v3 33/38] ipa: remove libipa",
        "X-BeenThere": "libcamera-devel@lists.libcamera.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "<libcamera-devel.lists.libcamera.org>",
        "List-Unsubscribe": "<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>",
        "List-Archive": "<https://lists.libcamera.org/pipermail/libcamera-devel/>",
        "List-Post": "<mailto:libcamera-devel@lists.libcamera.org>",
        "List-Help": "<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>",
        "List-Subscribe": "<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"utf-8\"",
        "Content-Transfer-Encoding": "base64",
        "Errors-To": "libcamera-devel-bounces@lists.libcamera.org",
        "Sender": "\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"
    },
    "content": "As every pipeline and have its own proxy, IPAInterfaceWrapper is no\nlonger necessary. Since it's the only member of libipa, remove libipa\ncompletely.\n\nSigned-off-by: Paul Elder <paul.elder@ideasonboard.com>\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n---\nNo change in v3\n\nNo change in v2\n---\n Documentation/Doxyfile.in                |   1 -\n Documentation/meson.build                |   2 -\n src/ipa/libipa/ipa_interface_wrapper.cpp | 285 -----------------------\n src/ipa/libipa/ipa_interface_wrapper.h   |  61 -----\n src/ipa/libipa/meson.build               |  15 --\n src/ipa/meson.build                      |   2 -\n src/ipa/raspberrypi/meson.build          |   2 -\n src/ipa/raspberrypi/raspberrypi.cpp      |   2 -\n src/ipa/rkisp1/meson.build               |   3 +-\n src/ipa/rkisp1/rkisp1.cpp                |   2 -\n src/ipa/vimc/meson.build                 |   3 +-\n src/ipa/vimc/vimc.cpp                    |   2 -\n test/ipa/ipa_wrappers_test.cpp           |   1 -\n test/ipa/meson.build                     |   4 +-\n 14 files changed, 4 insertions(+), 381 deletions(-)\n delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.cpp\n delete mode 100644 src/ipa/libipa/ipa_interface_wrapper.h\n delete mode 100644 src/ipa/libipa/meson.build",
    "diff": "diff --git a/Documentation/Doxyfile.in b/Documentation/Doxyfile.in\nindex 71509ff7..5ccd0d05 100644\n--- a/Documentation/Doxyfile.in\n+++ b/Documentation/Doxyfile.in\n@@ -789,7 +789,6 @@ WARN_LOGFILE           =\n # Note: If this tag is empty the current directory is searched.\n \n INPUT                  = \"@TOP_SRCDIR@/include/libcamera\" \\\n-\t\t\t \"@TOP_SRCDIR@/src/ipa/libipa\" \\\n \t\t\t \"@TOP_SRCDIR@/src/libcamera\" \\\n \t\t\t \"@TOP_BUILDDIR@/include/libcamera\" \\\n \t\t\t \"@TOP_BUILDDIR@/src/libcamera\"\ndiff --git a/Documentation/meson.build b/Documentation/meson.build\nindex d3d64f71..7d850cd8 100644\n--- a/Documentation/meson.build\n+++ b/Documentation/meson.build\n@@ -27,8 +27,6 @@ if doxygen.found() and dot.found()\n                       libcamera_ipa_headers,\n                       libcamera_public_headers,\n                       libcamera_sources,\n-                      libipa_headers,\n-                      libipa_sources,\n                   ],\n                   output : 'api-html',\n                   command : [doxygen, doxyfile],\ndiff --git a/src/ipa/libipa/ipa_interface_wrapper.cpp b/src/ipa/libipa/ipa_interface_wrapper.cpp\ndeleted file mode 100644\nindex cee532e3..00000000\n--- a/src/ipa/libipa/ipa_interface_wrapper.cpp\n+++ /dev/null\n@@ -1,285 +0,0 @@\n-/* SPDX-License-Identifier: LGPL-2.1-or-later */\n-/*\n- * Copyright (C) 2019, Google Inc.\n- *\n- * ipa_interface_wrapper.cpp - Image Processing Algorithm interface wrapper\n- */\n-\n-#include \"ipa_interface_wrapper.h\"\n-\n-#include <map>\n-#include <string.h>\n-#include <unistd.h>\n-#include <vector>\n-\n-#include <libcamera/ipa/ipa_interface.h>\n-\n-#include \"libcamera/internal/byte_stream_buffer.h\"\n-#include \"libcamera/internal/camera_sensor.h\"\n-\n-/**\n- * \\file ipa_interface_wrapper.h\n- * \\brief Image Processing Algorithm interface wrapper\n- */\n-\n-namespace libcamera {\n-\n-/**\n- * \\class IPAInterfaceWrapper\n- * \\brief Wrap an IPAInterface and expose it as an ipa_context\n- *\n- * This class implements the ipa_context API based on a provided IPAInterface.\n- * It helps IPAs that implement the IPAInterface API to provide the external\n- * ipa_context API.\n- *\n- * To use the wrapper, an IPA module simple creates a new instance of its\n- * IPAInterface implementation, and passes it to the constructor of the\n- * IPAInterfaceWrapper. As IPAInterfaceWrapper inherits from ipa_context, the\n- * constructed wrapper can then be directly returned from the IPA module's\n- * ipaCreate() function.\n- *\n- * \\code{.cpp}\n- * class MyIPA : public IPAInterface\n- * {\n- * \t...\n- * };\n- *\n- * struct ipa_context *ipaCreate()\n- * {\n- * \treturn new IPAInterfaceWrapper(std::make_unique<MyIPA>());\n- * }\n- * \\endcode\n- *\n- * The wrapper takes ownership of the IPAInterface and will automatically\n- * delete it when the wrapper is destroyed.\n- */\n-\n-/**\n- * \\brief Construct an IPAInterfaceWrapper wrapping \\a interface\n- * \\param[in] interface The interface to wrap\n- */\n-IPAInterfaceWrapper::IPAInterfaceWrapper(std::unique_ptr<IPAInterface> interface)\n-\t: ipa_(std::move(interface)), callbacks_(nullptr), cb_ctx_(nullptr)\n-{\n-\tops = &operations_;\n-\n-\tipa_->queueFrameAction.connect(this, &IPAInterfaceWrapper::queueFrameAction);\n-}\n-\n-void IPAInterfaceWrapper::destroy(struct ipa_context *_ctx)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\tdelete ctx;\n-}\n-\n-void *IPAInterfaceWrapper::get_interface(struct ipa_context *_ctx)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\treturn ctx->ipa_.get();\n-}\n-\n-void IPAInterfaceWrapper::init(struct ipa_context *_ctx,\n-\t\t\t       const struct ipa_settings *settings)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\tIPASettings ipaSettings{\n-\t\t.configurationFile = settings->configuration_file\n-\t};\n-\tctx->ipa_->init(ipaSettings);\n-}\n-\n-int IPAInterfaceWrapper::start(struct ipa_context *_ctx)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\treturn ctx->ipa_->start();\n-}\n-\n-void IPAInterfaceWrapper::stop(struct ipa_context *_ctx)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\tctx->ipa_->stop();\n-}\n-\n-void IPAInterfaceWrapper::register_callbacks(struct ipa_context *_ctx,\n-\t\t\t\t\t     const struct ipa_callback_ops *callbacks,\n-\t\t\t\t\t     void *cb_ctx)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\tctx->callbacks_ = callbacks;\n-\tctx->cb_ctx_ = cb_ctx;\n-}\n-\n-void IPAInterfaceWrapper::configure(struct ipa_context *_ctx,\n-\t\t\t\t    const struct ipa_sensor_info *sensor_info,\n-\t\t\t\t    const struct ipa_stream *streams,\n-\t\t\t\t    unsigned int num_streams,\n-\t\t\t\t    const struct ipa_control_info_map *maps,\n-\t\t\t\t    unsigned int num_maps)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\n-\tctx->serializer_.reset();\n-\n-\t/* Translate the IPA sensor info. */\n-\tCameraSensorInfo sensorInfo{};\n-\tsensorInfo.model = sensor_info->model;\n-\tsensorInfo.bitsPerPixel = sensor_info->bits_per_pixel;\n-\tsensorInfo.activeAreaSize = { sensor_info->active_area.width,\n-\t\t\t\t      sensor_info->active_area.height };\n-\tsensorInfo.analogCrop = { sensor_info->analog_crop.left,\n-\t\t\t\t  sensor_info->analog_crop.top,\n-\t\t\t\t  sensor_info->analog_crop.width,\n-\t\t\t\t  sensor_info->analog_crop.height };\n-\tsensorInfo.outputSize = { sensor_info->output_size.width,\n-\t\t\t\t  sensor_info->output_size.height };\n-\tsensorInfo.pixelRate = sensor_info->pixel_rate;\n-\tsensorInfo.lineLength = sensor_info->line_length;\n-\n-\t/* Translate the IPA stream configurations map. */\n-\tstd::map<unsigned int, IPAStream> ipaStreams;\n-\n-\tfor (unsigned int i = 0; i < num_streams; ++i) {\n-\t\tconst struct ipa_stream &stream = streams[i];\n-\n-\t\tipaStreams[stream.id] = {\n-\t\t\tstream.pixel_format,\n-\t\t\tSize(stream.width, stream.height),\n-\t\t};\n-\t}\n-\n-\t/* Translate the IPA entity controls map. */\n-\tstd::map<unsigned int, const ControlInfoMap &> entityControls;\n-\tstd::map<unsigned int, ControlInfoMap> infoMaps;\n-\n-\tfor (unsigned int i = 0; i < num_maps; ++i) {\n-\t\tconst struct ipa_control_info_map &ipa_map = maps[i];\n-\t\tByteStreamBuffer byteStream(ipa_map.data, ipa_map.size);\n-\t\tunsigned int id = ipa_map.id;\n-\n-\t\tinfoMaps[id] = ctx->serializer_.deserialize<ControlInfoMap>(byteStream);\n-\t\tentityControls.emplace(id, infoMaps[id]);\n-\t}\n-\n-\t/* \\todo Translate the ipaConfig and result. */\n-\tIPAOperationData ipaConfig;\n-\tctx->ipa_->configure(sensorInfo, ipaStreams, entityControls, ipaConfig,\n-\t\t\t     nullptr);\n-}\n-\n-void IPAInterfaceWrapper::map_buffers(struct ipa_context *_ctx,\n-\t\t\t\t      const struct ipa_buffer *_buffers,\n-\t\t\t\t      size_t num_buffers)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\tstd::vector<IPABuffer> buffers(num_buffers);\n-\n-\tfor (unsigned int i = 0; i < num_buffers; ++i) {\n-\t\tconst struct ipa_buffer &_buffer = _buffers[i];\n-\t\tIPABuffer &buffer = buffers[i];\n-\t\tstd::vector<FrameBuffer::Plane> &planes = buffer.planes;\n-\n-\t\tbuffer.id = _buffer.id;\n-\n-\t\tplanes.resize(_buffer.num_planes);\n-\t\tfor (unsigned int j = 0; j < _buffer.num_planes; ++j) {\n-\t\t\tplanes[j].fd = FileDescriptor(_buffer.planes[j].dmabuf);\n-\t\t\tplanes[j].length = _buffer.planes[j].length;\n-\t\t}\n-\t}\n-\n-\tctx->ipa_->mapBuffers(buffers);\n-}\n-\n-void IPAInterfaceWrapper::unmap_buffers(struct ipa_context *_ctx,\n-\t\t\t\t\tconst unsigned int *_ids,\n-\t\t\t\t\tsize_t num_buffers)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\tstd::vector<unsigned int> ids(_ids, _ids + num_buffers);\n-\tctx->ipa_->unmapBuffers(ids);\n-}\n-\n-void IPAInterfaceWrapper::process_event(struct ipa_context *_ctx,\n-\t\t\t\t\tconst struct ipa_operation_data *data)\n-{\n-\tIPAInterfaceWrapper *ctx = static_cast<IPAInterfaceWrapper *>(_ctx);\n-\tIPAOperationData opData;\n-\n-\topData.operation = data->operation;\n-\n-\topData.data.resize(data->num_data);\n-\tmemcpy(opData.data.data(), data->data,\n-\t       data->num_data * sizeof(*data->data));\n-\n-\topData.controls.resize(data->num_lists);\n-\tfor (unsigned int i = 0; i < data->num_lists; ++i) {\n-\t\tconst struct ipa_control_list *c_list = &data->lists[i];\n-\t\tByteStreamBuffer byteStream(c_list->data, c_list->size);\n-\t\topData.controls[i] = ctx->serializer_.deserialize<ControlList>(byteStream);\n-\t}\n-\n-\tctx->ipa_->processEvent(opData);\n-}\n-\n-void IPAInterfaceWrapper::queueFrameAction(unsigned int frame,\n-\t\t\t\t\t   const IPAOperationData &data)\n-{\n-\tif (!callbacks_)\n-\t\treturn;\n-\n-\tstruct ipa_operation_data c_data;\n-\tc_data.operation = data.operation;\n-\tc_data.data = data.data.data();\n-\tc_data.num_data = data.data.size();\n-\n-\tstruct ipa_control_list control_lists[data.controls.size()];\n-\tc_data.lists = control_lists;\n-\tc_data.num_lists = data.controls.size();\n-\n-\tstd::size_t listsSize = 0;\n-\tfor (const auto &list : data.controls)\n-\t\tlistsSize += serializer_.binarySize(list);\n-\n-\tstd::vector<uint8_t> binaryData(listsSize);\n-\tByteStreamBuffer byteStreamBuffer(binaryData.data(), listsSize);\n-\n-\tunsigned int i = 0;\n-\tfor (const auto &list : data.controls) {\n-\t\tstruct ipa_control_list &c_list = control_lists[i];\n-\t\tc_list.size = serializer_.binarySize(list);\n-\n-\t\tByteStreamBuffer b = byteStreamBuffer.carveOut(c_list.size);\n-\t\tserializer_.serialize(list, b);\n-\n-\t\tc_list.data = b.base();\n-\t}\n-\n-\tcallbacks_->queue_frame_action(cb_ctx_, frame, c_data);\n-}\n-\n-#ifndef __DOXYGEN__\n-/*\n- * This construct confuses Doygen and makes it believe that all members of the\n- * operations is a member of IPAInterfaceWrapper. It must thus be hidden.\n- */\n-const struct ipa_context_ops IPAInterfaceWrapper::operations_ = {\n-\t.destroy = &IPAInterfaceWrapper::destroy,\n-\t.get_interface = &IPAInterfaceWrapper::get_interface,\n-\t.init = &IPAInterfaceWrapper::init,\n-\t.start = &IPAInterfaceWrapper::start,\n-\t.stop = &IPAInterfaceWrapper::stop,\n-\t.register_callbacks = &IPAInterfaceWrapper::register_callbacks,\n-\t.configure = &IPAInterfaceWrapper::configure,\n-\t.map_buffers = &IPAInterfaceWrapper::map_buffers,\n-\t.unmap_buffers = &IPAInterfaceWrapper::unmap_buffers,\n-\t.process_event = &IPAInterfaceWrapper::process_event,\n-};\n-#endif\n-\n-} /* namespace libcamera */\ndiff --git a/src/ipa/libipa/ipa_interface_wrapper.h b/src/ipa/libipa/ipa_interface_wrapper.h\ndeleted file mode 100644\nindex a1c70159..00000000\n--- a/src/ipa/libipa/ipa_interface_wrapper.h\n+++ /dev/null\n@@ -1,61 +0,0 @@\n-/* SPDX-License-Identifier: LGPL-2.1-or-later */\n-/*\n- * Copyright (C) 2019, Google Inc.\n- *\n- * ipa_interface_wrapper.h - Image Processing Algorithm interface wrapper\n- */\n-#ifndef __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__\n-#define __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__\n-\n-#include <memory>\n-\n-#include <libcamera/ipa/ipa_interface.h>\n-\n-#include \"libcamera/internal/control_serializer.h\"\n-\n-namespace libcamera {\n-\n-class IPAInterfaceWrapper : public ipa_context\n-{\n-public:\n-\tIPAInterfaceWrapper(std::unique_ptr<IPAInterface> interface);\n-\n-private:\n-\tstatic void destroy(struct ipa_context *ctx);\n-\tstatic void *get_interface(struct ipa_context *ctx);\n-\tstatic void init(struct ipa_context *ctx,\n-\t\t\t const struct ipa_settings *settings);\n-\tstatic int start(struct ipa_context *ctx);\n-\tstatic void stop(struct ipa_context *ctx);\n-\tstatic void register_callbacks(struct ipa_context *ctx,\n-\t\t\t\t       const struct ipa_callback_ops *callbacks,\n-\t\t\t\t       void *cb_ctx);\n-\tstatic void configure(struct ipa_context *ctx,\n-\t\t\t      const struct ipa_sensor_info *sensor_info,\n-\t\t\t      const struct ipa_stream *streams,\n-\t\t\t      unsigned int num_streams,\n-\t\t\t      const struct ipa_control_info_map *maps,\n-\t\t\t      unsigned int num_maps);\n-\tstatic void map_buffers(struct ipa_context *ctx,\n-\t\t\t\tconst struct ipa_buffer *c_buffers,\n-\t\t\t\tsize_t num_buffers);\n-\tstatic void unmap_buffers(struct ipa_context *ctx,\n-\t\t\t\t  const unsigned int *ids,\n-\t\t\t\t  size_t num_buffers);\n-\tstatic void process_event(struct ipa_context *ctx,\n-\t\t\t\t  const struct ipa_operation_data *data);\n-\n-\tstatic const struct ipa_context_ops operations_;\n-\n-\tvoid queueFrameAction(unsigned int frame, const IPAOperationData &data);\n-\n-\tstd::unique_ptr<IPAInterface> ipa_;\n-\tconst struct ipa_callback_ops *callbacks_;\n-\tvoid *cb_ctx_;\n-\n-\tControlSerializer serializer_;\n-};\n-\n-} /* namespace libcamera */\n-\n-#endif /* __LIBCAMERA_IPA_INTERFACE_WRAPPER_H__ */\ndiff --git a/src/ipa/libipa/meson.build b/src/ipa/libipa/meson.build\ndeleted file mode 100644\nindex 22626405..00000000\n--- a/src/ipa/libipa/meson.build\n+++ /dev/null\n@@ -1,15 +0,0 @@\n-# SPDX-License-Identifier: CC0-1.0\n-\n-libipa_headers = files([\n-    'ipa_interface_wrapper.h',\n-])\n-\n-libipa_sources = files([\n-    'ipa_interface_wrapper.cpp',\n-])\n-\n-libipa_includes = include_directories('..')\n-\n-libipa = static_library('ipa', libipa_sources,\n-                        include_directories : ipa_includes,\n-                        dependencies : libcamera_dep)\ndiff --git a/src/ipa/meson.build b/src/ipa/meson.build\nindex 5a5de267..b11e5d23 100644\n--- a/src/ipa/meson.build\n+++ b/src/ipa/meson.build\n@@ -15,8 +15,6 @@ config_h.set('IPA_CONFIG_DIR',\n config_h.set('IPA_MODULE_DIR',\n              '\"' + join_paths(get_option('prefix'), ipa_install_dir) + '\"')\n \n-subdir('libipa')\n-\n ipa_sign = files('ipa-sign.sh')\n \n ipas = ['raspberrypi', 'rkisp1', 'vimc']\ndiff --git a/src/ipa/raspberrypi/meson.build b/src/ipa/raspberrypi/meson.build\nindex 27c29249..57596166 100644\n--- a/src/ipa/raspberrypi/meson.build\n+++ b/src/ipa/raspberrypi/meson.build\n@@ -10,7 +10,6 @@ rpi_ipa_deps = [\n \n rpi_ipa_includes = [\n     ipa_includes,\n-    libipa_includes,\n     include_directories('controller')\n ]\n \n@@ -46,7 +45,6 @@ mod = shared_module(ipa_name,\n                     name_prefix : '',\n                     include_directories : rpi_ipa_includes,\n                     dependencies : rpi_ipa_deps,\n-                    link_with : libipa,\n                     install : true,\n                     install_dir : ipa_install_dir)\n \ndiff --git a/src/ipa/raspberrypi/raspberrypi.cpp b/src/ipa/raspberrypi/raspberrypi.cpp\nindex 0e23a476..fcaf9b6c 100644\n--- a/src/ipa/raspberrypi/raspberrypi.cpp\n+++ b/src/ipa/raspberrypi/raspberrypi.cpp\n@@ -23,8 +23,6 @@\n #include <libcamera/request.h>\n #include <libcamera/span.h>\n \n-#include <libipa/ipa_interface_wrapper.h>\n-\n #include \"libcamera/internal/camera_sensor.h\"\n #include \"libcamera/internal/log.h\"\n #include \"libcamera/internal/utils.h\"\ndiff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build\nindex 30953c13..f0f0a1a2 100644\n--- a/src/ipa/rkisp1/meson.build\n+++ b/src/ipa/rkisp1/meson.build\n@@ -5,9 +5,8 @@ ipa_name = 'ipa_rkisp1'\n mod = shared_module(ipa_name,\n                     ['rkisp1.cpp', libcamera_generated_headers],\n                     name_prefix : '',\n-                    include_directories : [ipa_includes, libipa_includes],\n+                    include_directories : ipa_includes,\n                     dependencies : libcamera_dep,\n-                    link_with : libipa,\n                     install : true,\n                     install_dir : ipa_install_dir)\n \ndiff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\nindex 4fec397b..89a24e5b 100644\n--- a/src/ipa/rkisp1/rkisp1.cpp\n+++ b/src/ipa/rkisp1/rkisp1.cpp\n@@ -23,8 +23,6 @@\n #include <libcamera/ipa/rkisp1_generated.h>\n #include <libcamera/request.h>\n \n-#include <libipa/ipa_interface_wrapper.h>\n-\n #include \"libcamera/internal/log.h\"\n \n namespace libcamera {\ndiff --git a/src/ipa/vimc/meson.build b/src/ipa/vimc/meson.build\nindex b2b7a09d..c9cbdf57 100644\n--- a/src/ipa/vimc/meson.build\n+++ b/src/ipa/vimc/meson.build\n@@ -5,9 +5,8 @@ ipa_name = 'ipa_vimc'\n mod = shared_module(ipa_name,\n                     ['vimc.cpp', libcamera_generated_headers],\n                     name_prefix : '',\n-                    include_directories : [ipa_includes, libipa_includes],\n+                    include_directories : ipa_includes,\n                     dependencies : libcamera_dep,\n-                    link_with : libipa,\n                     install : true,\n                     install_dir : ipa_install_dir)\n \ndiff --git a/src/ipa/vimc/vimc.cpp b/src/ipa/vimc/vimc.cpp\nindex 00ec7b80..1693ffac 100644\n--- a/src/ipa/vimc/vimc.cpp\n+++ b/src/ipa/vimc/vimc.cpp\n@@ -18,8 +18,6 @@\n #include <libcamera/ipa/ipa_interface.h>\n #include <libcamera/ipa/ipa_module_info.h>\n \n-#include <libipa/ipa_interface_wrapper.h>\n-\n #include \"libcamera/internal/file.h\"\n #include \"libcamera/internal/log.h\"\n \ndiff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp\nindex 59d991cb..0133d8d2 100644\n--- a/test/ipa/ipa_wrappers_test.cpp\n+++ b/test/ipa/ipa_wrappers_test.cpp\n@@ -13,7 +13,6 @@\n #include <unistd.h>\n \n #include <libcamera/controls.h>\n-#include <libipa/ipa_interface_wrapper.h>\n \n #include \"libcamera/internal/camera_sensor.h\"\n #include \"libcamera/internal/device_enumerator.h\"\ndiff --git a/test/ipa/meson.build b/test/ipa/meson.build\nindex ba672f3f..b25bfcf4 100644\n--- a/test/ipa/meson.build\n+++ b/test/ipa/meson.build\n@@ -9,8 +9,8 @@ ipa_test = [\n foreach t : ipa_test\n     exe = executable(t[0], t[1],\n                      dependencies : libcamera_dep,\n-                     link_with : [libipa, test_libraries],\n-                     include_directories : [libipa_includes, test_includes_internal])\n+                     link_with : test_libraries,\n+                     include_directories : test_includes_internal)\n \n     test(t[0], exe, suite : 'ipa')\n endforeach\n",
    "prefixes": [
        "libcamera-devel",
        "v3",
        "33/38"
    ]
}