[{"id":13931,"web_url":"https://patchwork.libcamera.org/comment/13931/","msgid":"<20201126155347.GU3905@pendragon.ideasonboard.com>","date":"2020-11-26T15:53:47","subject":"Re: [libcamera-devel] [PATCH v4 33/37] tests: Remove IPA wrappers\n\ttest","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Paul,\n\nThank you for the patch.\n\nOn Fri, Nov 06, 2020 at 07:37:03PM +0900, Paul Elder wrote:\n> Since we no longer use IPA wrappers, remove the test for it.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> ---\n> No change in v4\n> \n> No change in v3\n> \n> New in v2\n> ---\n>  test/ipa/ipa_wrappers_test.cpp | 451 ---------------------------------\n>  test/ipa/meson.build           |   1 -\n>  2 files changed, 452 deletions(-)\n>  delete mode 100644 test/ipa/ipa_wrappers_test.cpp\n> \n> diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp\n> deleted file mode 100644\n> index 0133d8d2..00000000\n> --- a/test/ipa/ipa_wrappers_test.cpp\n> +++ /dev/null\n> @@ -1,451 +0,0 @@\n> -/* SPDX-License-Identifier: GPL-2.0-or-later */\n> -/*\n> - * Copyright (C) 2019, Google Inc.\n> - *\n> - * ipa_wrappers_test.cpp - Test the IPA interface and context wrappers\n> - */\n> -\n> -#include <fcntl.h>\n> -#include <iostream>\n> -#include <memory>\n> -#include <linux/videodev2.h>\n> -#include <sys/stat.h>\n> -#include <unistd.h>\n> -\n> -#include <libcamera/controls.h>\n> -\n> -#include \"libcamera/internal/camera_sensor.h\"\n> -#include \"libcamera/internal/device_enumerator.h\"\n> -#include \"libcamera/internal/ipa_context_wrapper.h\"\n> -#include \"libcamera/internal/media_device.h\"\n> -#include \"libcamera/internal/v4l2_subdevice.h\"\n> -\n> -#include \"test.h\"\n> -\n> -using namespace libcamera;\n> -using namespace std;\n> -\n> -enum Operation {\n> -\tOp_init,\n> -\tOp_start,\n> -\tOp_stop,\n> -\tOp_configure,\n> -\tOp_mapBuffers,\n> -\tOp_unmapBuffers,\n> -\tOp_processEvent,\n> -};\n> -\n> -class TestIPAInterface : public IPAInterface\n> -{\n> -public:\n> -\tTestIPAInterface()\n> -\t\t: sequence_(0)\n> -\t{\n> -\t}\n> -\n> -\tint init(const IPASettings &settings) override\n> -\t{\n> -\t\tif (settings.configurationFile != \"/ipa/configuration/file\") {\n> -\t\t\tcerr << \"init(): Invalid configuration file\" << endl;\n> -\t\t\treport(Op_init, TestFail);\n> -\t\t\treturn 0;\n> -\t\t}\n> -\n> -\t\treport(Op_init, TestPass);\n> -\t\treturn 0;\n> -\t}\n> -\n> -\tint start() override\n> -\t{\n> -\t\treport(Op_start, TestPass);\n> -\t\treturn 0;\n> -\t}\n> -\n> -\tvoid stop() override\n> -\t{\n> -\t\treport(Op_stop, TestPass);\n> -\t}\n> -\n> -\tvoid configure(const CameraSensorInfo &sensorInfo,\n> -\t\t       const std::map<unsigned int, IPAStream> &streamConfig,\n> -\t\t       const std::map<unsigned int, const ControlInfoMap &> &entityControls,\n> -\t\t       [[maybe_unused]] const IPAOperationData &ipaConfig,\n> -\t\t       [[maybe_unused]] IPAOperationData *result) override\n> -\t{\n> -\t\t/* Verify sensorInfo. */\n> -\t\tif (sensorInfo.outputSize.width != 2560 ||\n> -\t\t    sensorInfo.outputSize.height != 1940) {\n> -\t\t\tcerr << \"configure(): Invalid sensor info size \"\n> -\t\t\t     << sensorInfo.outputSize.toString();\n> -\t\t}\n> -\n> -\t\t/* Verify streamConfig. */\n> -\t\tif (streamConfig.size() != 2) {\n> -\t\t\tcerr << \"configure(): Invalid number of streams \"\n> -\t\t\t     << streamConfig.size() << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\n> -\t\tauto iter = streamConfig.find(1);\n> -\t\tif (iter == streamConfig.end()) {\n> -\t\t\tcerr << \"configure(): No configuration for stream 1\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\t\tconst IPAStream *stream = &iter->second;\n> -\t\tif (stream->pixelFormat != V4L2_PIX_FMT_YUYV ||\n> -\t\t    stream->size != Size{ 1024, 768 }) {\n> -\t\t\tcerr << \"configure(): Invalid configuration for stream 1\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\n> -\t\titer = streamConfig.find(2);\n> -\t\tif (iter == streamConfig.end()) {\n> -\t\t\tcerr << \"configure(): No configuration for stream 2\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\t\tstream = &iter->second;\n> -\t\tif (stream->pixelFormat != V4L2_PIX_FMT_NV12 ||\n> -\t\t    stream->size != Size{ 800, 600 }) {\n> -\t\t\tcerr << \"configure(): Invalid configuration for stream 2\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\n> -\t\t/* Verify entityControls. */\n> -\t\tauto ctrlIter = entityControls.find(42);\n> -\t\tif (ctrlIter == entityControls.end()) {\n> -\t\t\tcerr << \"configure(): Controls not found\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\n> -\t\tconst ControlInfoMap &infoMap = ctrlIter->second;\n> -\n> -\t\tif (infoMap.count(V4L2_CID_BRIGHTNESS) != 1 ||\n> -\t\t    infoMap.count(V4L2_CID_CONTRAST) != 1 ||\n> -\t\t    infoMap.count(V4L2_CID_SATURATION) != 1) {\n> -\t\t\tcerr << \"configure(): Invalid control IDs\" << endl;\n> -\t\t\treturn report(Op_configure, TestFail);\n> -\t\t}\n> -\n> -\t\treport(Op_configure, TestPass);\n> -\t}\n> -\n> -\tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override\n> -\t{\n> -\t\tif (buffers.size() != 2) {\n> -\t\t\tcerr << \"mapBuffers(): Invalid number of buffers \"\n> -\t\t\t     << buffers.size() << endl;\n> -\t\t\treturn report(Op_mapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\tif (buffers[0].id != 10 ||\n> -\t\t    buffers[1].id != 11) {\n> -\t\t\tcerr << \"mapBuffers(): Invalid buffer IDs\" << endl;\n> -\t\t\treturn report(Op_mapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\tif (buffers[0].planes.size() != 3 ||\n> -\t\t    buffers[1].planes.size() != 3) {\n> -\t\t\tcerr << \"mapBuffers(): Invalid number of planes\" << endl;\n> -\t\t\treturn report(Op_mapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\tif (buffers[0].planes[0].length != 4096 ||\n> -\t\t    buffers[0].planes[1].length != 0 ||\n> -\t\t    buffers[0].planes[2].length != 0 ||\n> -\t\t    buffers[0].planes[0].length != 4096 ||\n> -\t\t    buffers[1].planes[1].length != 4096 ||\n> -\t\t    buffers[1].planes[2].length != 0) {\n> -\t\t\tcerr << \"mapBuffers(): Invalid length\" << endl;\n> -\t\t\treturn report(Op_mapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\tif (buffers[0].planes[0].fd.fd() == -1 ||\n> -\t\t    buffers[0].planes[1].fd.fd() != -1 ||\n> -\t\t    buffers[0].planes[2].fd.fd() != -1 ||\n> -\t\t    buffers[0].planes[0].fd.fd() == -1 ||\n> -\t\t    buffers[1].planes[1].fd.fd() == -1 ||\n> -\t\t    buffers[1].planes[2].fd.fd() != -1) {\n> -\t\t\tcerr << \"mapBuffers(): Invalid dmabuf\" << endl;\n> -\t\t\treturn report(Op_mapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\treport(Op_mapBuffers, TestPass);\n> -\t}\n> -\n> -\tvoid unmapBuffers(const std::vector<unsigned int> &ids) override\n> -\t{\n> -\t\tif (ids.size() != 2) {\n> -\t\t\tcerr << \"unmapBuffers(): Invalid number of ids \"\n> -\t\t\t     << ids.size() << endl;\n> -\t\t\treturn report(Op_unmapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\tif (ids[0] != 10 || ids[1] != 11) {\n> -\t\t\tcerr << \"unmapBuffers(): Invalid buffer IDs\" << endl;\n> -\t\t\treturn report(Op_unmapBuffers, TestFail);\n> -\t\t}\n> -\n> -\t\treport(Op_unmapBuffers, TestPass);\n> -\t}\n> -\n> -\tvoid processEvent(const IPAOperationData &data) override\n> -\t{\n> -\t\t/* Verify operation and data. */\n> -\t\tif (data.operation != Op_processEvent) {\n> -\t\t\tcerr << \"processEvent(): Invalid operation \"\n> -\t\t\t     << data.operation << endl;\n> -\t\t\treturn report(Op_processEvent, TestFail);\n> -\t\t}\n> -\n> -\t\tif (data.data != std::vector<unsigned int>{ 1, 2, 3, 4 }) {\n> -\t\t\tcerr << \"processEvent(): Invalid data\" << endl;\n> -\t\t\treturn report(Op_processEvent, TestFail);\n> -\t\t}\n> -\n> -\t\t/* Verify controls. */\n> -\t\tif (data.controls.size() != 1) {\n> -\t\t\tcerr << \"processEvent(): Controls not found\" << endl;\n> -\t\t\treturn report(Op_processEvent, TestFail);\n> -\t\t}\n> -\n> -\t\tconst ControlList &controls = data.controls[0];\n> -\t\tif (controls.get(V4L2_CID_BRIGHTNESS).get<int32_t>() != 10 ||\n> -\t\t    controls.get(V4L2_CID_CONTRAST).get<int32_t>() != 20 ||\n> -\t\t    controls.get(V4L2_CID_SATURATION).get<int32_t>() != 30) {\n> -\t\t\tcerr << \"processEvent(): Invalid controls\" << endl;\n> -\t\t\treturn report(Op_processEvent, TestFail);\n> -\t\t}\n> -\n> -\t\treport(Op_processEvent, TestPass);\n> -\t}\n> -\n> -private:\n> -\tvoid report(Operation op, int status)\n> -\t{\n> -\t\tIPAOperationData data;\n> -\t\tdata.operation = op;\n> -\t\tdata.data.resize(1);\n> -\t\tdata.data[0] = status;\n> -\t\tqueueFrameAction.emit(sequence_++, data);\n> -\t}\n> -\n> -\tunsigned int sequence_;\n> -};\n> -\n> -#define INVOKE(method, ...) \\\n> -\tinvoke(&IPAInterface::method, Op_##method, #method, ##__VA_ARGS__)\n> -\n> -class IPAWrappersTest : public Test\n> -{\n> -public:\n> -\tIPAWrappersTest()\n> -\t\t: subdev_(nullptr), wrapper_(nullptr), sequence_(0), fd_(-1)\n> -\t{\n> -\t}\n> -\n> -protected:\n> -\tint init() override\n> -\t{\n> -\t\t/* Locate the VIMC Sensor B subdevice. */\n> -\t\tenumerator_ = unique_ptr<DeviceEnumerator>(DeviceEnumerator::create());\n> -\t\tif (!enumerator_) {\n> -\t\t\tcerr << \"Failed to create device enumerator\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tif (enumerator_->enumerate()) {\n> -\t\t\tcerr << \"Failed to enumerate media devices\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tDeviceMatch dm(\"vimc\");\n> -\t\tmedia_ = enumerator_->search(dm);\n> -\t\tif (!media_) {\n> -\t\t\tcerr << \"No VIMC media device found: skip test\" << endl;\n> -\t\t\treturn TestSkip;\n> -\t\t}\n> -\n> -\t\tMediaEntity *entity = media_->getEntityByName(\"Sensor A\");\n> -\t\tif (!entity) {\n> -\t\t\tcerr << \"Unable to find media entity 'Sensor A'\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tsubdev_ = new V4L2Subdevice(entity);\n> -\t\tif (subdev_->open() < 0) {\n> -\t\t\tcerr << \"Unable to open 'Sensor A' subdevice\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\t/* Force usage of the C API as that's what we want to test. */\n> -\t\tint ret = setenv(\"LIBCAMERA_IPA_FORCE_C_API\", \"\", 1);\n> -\t\tif (ret)\n> -\t\t\treturn TestFail;\n> -\n> -\t\tstd::unique_ptr<IPAInterface> intf = std::make_unique<TestIPAInterface>();\n> -\t\twrapper_ = new IPAContextWrapper(new IPAInterfaceWrapper(std::move(intf)));\n> -\t\twrapper_->queueFrameAction.connect(this, &IPAWrappersTest::queueFrameAction);\n> -\n> -\t\t/* Create a file descriptor for the buffer-related operations. */\n> -\t\tfd_ = open(\"/tmp\", O_TMPFILE | O_RDWR, 0600);\n> -\t\tif (fd_ == -1)\n> -\t\t\treturn TestFail;\n> -\n> -\t\tret = ftruncate(fd_, 4096);\n> -\t\tif (ret < 0)\n> -\t\t\treturn TestFail;\n> -\n> -\t\treturn TestPass;\n> -\t}\n> -\n> -\tint run() override\n> -\t{\n> -\t\tint ret;\n> -\n> -\t\t/* Test configure(). */\n> -\t\tCameraSensorInfo sensorInfo{\n> -\t\t\t.model = \"sensor\",\n> -\t\t\t.bitsPerPixel = 8,\n> -\t\t\t.activeAreaSize = { 2576, 1956 },\n> -\t\t\t.analogCrop = { 8, 8, 2560, 1940 },\n> -\t\t\t.outputSize = { 2560, 1940 },\n> -\t\t\t.pixelRate = 96000000,\n> -\t\t\t.lineLength = 2918,\n> -\t\t};\n> -\t\tstd::map<unsigned int, IPAStream> config{\n> -\t\t\t{ 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },\n> -\t\t\t{ 2, { V4L2_PIX_FMT_NV12, { 800, 600 } } },\n> -\t\t};\n> -\t\tstd::map<unsigned int, const ControlInfoMap &> controlInfo;\n> -\t\tcontrolInfo.emplace(42, subdev_->controls());\n> -\t\tIPAOperationData ipaConfig;\n> -\t\tret = INVOKE(configure, sensorInfo, config, controlInfo,\n> -\t\t\t     ipaConfig, nullptr);\n> -\t\tif (ret == TestFail)\n> -\t\t\treturn TestFail;\n> -\n> -\t\t/* Test mapBuffers(). */\n> -\t\tstd::vector<IPABuffer> buffers(2);\n> -\t\tbuffers[0].planes.resize(3);\n> -\t\tbuffers[0].id = 10;\n> -\t\tbuffers[0].planes[0].fd = FileDescriptor(fd_);\n> -\t\tbuffers[0].planes[0].length = 4096;\n> -\t\tbuffers[1].id = 11;\n> -\t\tbuffers[1].planes.resize(3);\n> -\t\tbuffers[1].planes[0].fd = FileDescriptor(fd_);\n> -\t\tbuffers[1].planes[0].length = 4096;\n> -\t\tbuffers[1].planes[1].fd = FileDescriptor(fd_);\n> -\t\tbuffers[1].planes[1].length = 4096;\n> -\n> -\t\tret = INVOKE(mapBuffers, buffers);\n> -\t\tif (ret == TestFail)\n> -\t\t\treturn TestFail;\n> -\n> -\t\t/* Test unmapBuffers(). */\n> -\t\tstd::vector<unsigned int> bufferIds = { 10, 11 };\n> -\t\tret = INVOKE(unmapBuffers, bufferIds);\n> -\t\tif (ret == TestFail)\n> -\t\t\treturn TestFail;\n> -\n> -\t\t/* Test processEvent(). */\n> -\t\tIPAOperationData data;\n> -\t\tdata.operation = Op_processEvent;\n> -\t\tdata.data = { 1, 2, 3, 4 };\n> -\t\tdata.controls.emplace_back(subdev_->controls());\n> -\n> -\t\tControlList &controls = data.controls.back();\n> -\t\tcontrols.set(V4L2_CID_BRIGHTNESS, static_cast<int32_t>(10));\n> -\t\tcontrols.set(V4L2_CID_CONTRAST, static_cast<int32_t>(20));\n> -\t\tcontrols.set(V4L2_CID_SATURATION, static_cast<int32_t>(30));\n> -\n> -\t\tret = INVOKE(processEvent, data);\n> -\t\tif (ret == TestFail)\n> -\t\t\treturn TestFail;\n> -\n> -\t\t/*\n> -\t\t * Test init(), start() and stop() last to ensure nothing in the\n> -\t\t * wrappers or serializer depends on them being called first.\n> -\t\t */\n> -\t\tIPASettings settings{\n> -\t\t\t.configurationFile = \"/ipa/configuration/file\"\n> -\t\t};\n> -\t\tret = INVOKE(init, settings);\n> -\t\tif (ret == TestFail) {\n> -\t\t\tcerr << \"Failed to run init()\";\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tret = INVOKE(start);\n> -\t\tif (ret == TestFail) {\n> -\t\t\tcerr << \"Failed to run start()\";\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tret = INVOKE(stop);\n> -\t\tif (ret == TestFail) {\n> -\t\t\tcerr << \"Failed to run stop()\";\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\treturn TestPass;\n> -\t}\n> -\n> -\tvoid cleanup() override\n> -\t{\n> -\t\tdelete wrapper_;\n> -\t\tdelete subdev_;\n> -\n> -\t\tif (fd_ != -1)\n> -\t\t\tclose(fd_);\n> -\t}\n> -\n> -private:\n> -\ttemplate<typename T, typename... Args1, typename... Args2>\n> -\tint invoke(T (IPAInterface::*func)(Args1...), Operation op,\n> -\t\t   const char *name, Args2... args)\n> -\t{\n> -\t\tdata_ = IPAOperationData();\n> -\t\t(wrapper_->*func)(args...);\n> -\n> -\t\tif (frame_ != sequence_) {\n> -\t\t\tcerr << \"IPAInterface::\" << name\n> -\t\t\t     << \"(): invalid frame number \" << frame_\n> -\t\t\t     << \", expected \" << sequence_;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tsequence_++;\n> -\n> -\t\tif (data_.operation != op) {\n> -\t\t\tcerr << \"IPAInterface::\" << name\n> -\t\t\t     << \"(): failed to propagate\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\tif (data_.data[0] != TestPass) {\n> -\t\t\tcerr << \"IPAInterface::\" << name\n> -\t\t\t     << \"(): reported an error\" << endl;\n> -\t\t\treturn TestFail;\n> -\t\t}\n> -\n> -\t\treturn TestPass;\n> -\t}\n> -\n> -\tvoid queueFrameAction(unsigned int frame, const IPAOperationData &data)\n> -\t{\n> -\t\tframe_ = frame;\n> -\t\tdata_ = data;\n> -\t}\n> -\n> -\tstd::shared_ptr<MediaDevice> media_;\n> -\tstd::unique_ptr<DeviceEnumerator> enumerator_;\n> -\tV4L2Subdevice *subdev_;\n> -\n> -\tIPAContextWrapper *wrapper_;\n> -\tIPAOperationData data_;\n> -\tunsigned int sequence_;\n> -\tunsigned int frame_;\n> -\tint fd_;\n> -};\n> -\n> -TEST_REGISTER(IPAWrappersTest)\n> diff --git a/test/ipa/meson.build b/test/ipa/meson.build\n> index fce58a31..f83bb29e 100644\n> --- a/test/ipa/meson.build\n> +++ b/test/ipa/meson.build\n> @@ -3,7 +3,6 @@\n>  ipa_test = [\n>      ['ipa_module_test',     'ipa_module_test.cpp'],\n>      ['ipa_interface_test',  'ipa_interface_test.cpp'],\n> -    ['ipa_wrappers_test',   'ipa_wrappers_test.cpp'],\n>  ]\n>  \n>  foreach t : ipa_test","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 F169EBE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 26 Nov 2020 15:53:57 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B9F2863472;\n\tThu, 26 Nov 2020 16:53:57 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 78A0563469\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 26 Nov 2020 16:53:56 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 02A03A1B;\n\tThu, 26 Nov 2020 16:53:55 +0100 (CET)"],"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=\"rxqmpH8o\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1606406036;\n\tbh=dGjeTRhgz0HZoDLt5tsazl1oGJQRfEf+a+KMfKxexsw=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=rxqmpH8oYqtwZOxxQgW2CRmozgaOpqrNbC5bimpFe7VX29hooOpdxey94Cwq6PQ+w\n\tq7eBZ91Y1kMF6s4PzQ4hqUabnI2y+rpYMyN6qz71MY7aBvGni8SMCPzI5dLTupXQ5n\n\t+p5f9alp5ER/p6J5cz1mkP79M0O2h4aYIFU+LmKs=","Date":"Thu, 26 Nov 2020 17:53:47 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<20201126155347.GU3905@pendragon.ideasonboard.com>","References":"<20201106103707.49660-1-paul.elder@ideasonboard.com>\n\t<20201106103707.49660-34-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201106103707.49660-34-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 33/37] tests: Remove IPA wrappers\n\ttest","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":13932,"web_url":"https://patchwork.libcamera.org/comment/13932/","msgid":"<20201126155458.GV3905@pendragon.ideasonboard.com>","date":"2020-11-26T15:54:58","subject":"Re: [libcamera-devel] [PATCH v4 33/37] tests: Remove IPA wrappers\n\ttest","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Nov 26, 2020 at 05:53:47PM +0200, Laurent Pinchart wrote:\n> Hi Paul,\n> \n> Thank you for the patch.\n> \n> On Fri, Nov 06, 2020 at 07:37:03PM +0900, Paul Elder wrote:\n> > Since we no longer use IPA wrappers, remove the test for it.\n> > \n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nBy the way, one way to avoid squashing this in a huge patch for the\nfinal version will be to move it earlier in the series, with the commit\nmessage updated to state that the wrappers will be removed.\n\n> > ---\n> > No change in v4\n> > \n> > No change in v3\n> > \n> > New in v2\n> > ---\n> >  test/ipa/ipa_wrappers_test.cpp | 451 ---------------------------------\n> >  test/ipa/meson.build           |   1 -\n> >  2 files changed, 452 deletions(-)\n> >  delete mode 100644 test/ipa/ipa_wrappers_test.cpp\n> > \n> > diff --git a/test/ipa/ipa_wrappers_test.cpp b/test/ipa/ipa_wrappers_test.cpp\n> > deleted file mode 100644\n> > index 0133d8d2..00000000\n> > --- a/test/ipa/ipa_wrappers_test.cpp\n> > +++ /dev/null\n> > @@ -1,451 +0,0 @@\n> > -/* SPDX-License-Identifier: GPL-2.0-or-later */\n> > -/*\n> > - * Copyright (C) 2019, Google Inc.\n> > - *\n> > - * ipa_wrappers_test.cpp - Test the IPA interface and context wrappers\n> > - */\n> > -\n> > -#include <fcntl.h>\n> > -#include <iostream>\n> > -#include <memory>\n> > -#include <linux/videodev2.h>\n> > -#include <sys/stat.h>\n> > -#include <unistd.h>\n> > -\n> > -#include <libcamera/controls.h>\n> > -\n> > -#include \"libcamera/internal/camera_sensor.h\"\n> > -#include \"libcamera/internal/device_enumerator.h\"\n> > -#include \"libcamera/internal/ipa_context_wrapper.h\"\n> > -#include \"libcamera/internal/media_device.h\"\n> > -#include \"libcamera/internal/v4l2_subdevice.h\"\n> > -\n> > -#include \"test.h\"\n> > -\n> > -using namespace libcamera;\n> > -using namespace std;\n> > -\n> > -enum Operation {\n> > -\tOp_init,\n> > -\tOp_start,\n> > -\tOp_stop,\n> > -\tOp_configure,\n> > -\tOp_mapBuffers,\n> > -\tOp_unmapBuffers,\n> > -\tOp_processEvent,\n> > -};\n> > -\n> > -class TestIPAInterface : public IPAInterface\n> > -{\n> > -public:\n> > -\tTestIPAInterface()\n> > -\t\t: sequence_(0)\n> > -\t{\n> > -\t}\n> > -\n> > -\tint init(const IPASettings &settings) override\n> > -\t{\n> > -\t\tif (settings.configurationFile != \"/ipa/configuration/file\") {\n> > -\t\t\tcerr << \"init(): Invalid configuration file\" << endl;\n> > -\t\t\treport(Op_init, TestFail);\n> > -\t\t\treturn 0;\n> > -\t\t}\n> > -\n> > -\t\treport(Op_init, TestPass);\n> > -\t\treturn 0;\n> > -\t}\n> > -\n> > -\tint start() override\n> > -\t{\n> > -\t\treport(Op_start, TestPass);\n> > -\t\treturn 0;\n> > -\t}\n> > -\n> > -\tvoid stop() override\n> > -\t{\n> > -\t\treport(Op_stop, TestPass);\n> > -\t}\n> > -\n> > -\tvoid configure(const CameraSensorInfo &sensorInfo,\n> > -\t\t       const std::map<unsigned int, IPAStream> &streamConfig,\n> > -\t\t       const std::map<unsigned int, const ControlInfoMap &> &entityControls,\n> > -\t\t       [[maybe_unused]] const IPAOperationData &ipaConfig,\n> > -\t\t       [[maybe_unused]] IPAOperationData *result) override\n> > -\t{\n> > -\t\t/* Verify sensorInfo. */\n> > -\t\tif (sensorInfo.outputSize.width != 2560 ||\n> > -\t\t    sensorInfo.outputSize.height != 1940) {\n> > -\t\t\tcerr << \"configure(): Invalid sensor info size \"\n> > -\t\t\t     << sensorInfo.outputSize.toString();\n> > -\t\t}\n> > -\n> > -\t\t/* Verify streamConfig. */\n> > -\t\tif (streamConfig.size() != 2) {\n> > -\t\t\tcerr << \"configure(): Invalid number of streams \"\n> > -\t\t\t     << streamConfig.size() << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tauto iter = streamConfig.find(1);\n> > -\t\tif (iter == streamConfig.end()) {\n> > -\t\t\tcerr << \"configure(): No configuration for stream 1\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\t\tconst IPAStream *stream = &iter->second;\n> > -\t\tif (stream->pixelFormat != V4L2_PIX_FMT_YUYV ||\n> > -\t\t    stream->size != Size{ 1024, 768 }) {\n> > -\t\t\tcerr << \"configure(): Invalid configuration for stream 1\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\n> > -\t\titer = streamConfig.find(2);\n> > -\t\tif (iter == streamConfig.end()) {\n> > -\t\t\tcerr << \"configure(): No configuration for stream 2\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\t\tstream = &iter->second;\n> > -\t\tif (stream->pixelFormat != V4L2_PIX_FMT_NV12 ||\n> > -\t\t    stream->size != Size{ 800, 600 }) {\n> > -\t\t\tcerr << \"configure(): Invalid configuration for stream 2\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\n> > -\t\t/* Verify entityControls. */\n> > -\t\tauto ctrlIter = entityControls.find(42);\n> > -\t\tif (ctrlIter == entityControls.end()) {\n> > -\t\t\tcerr << \"configure(): Controls not found\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tconst ControlInfoMap &infoMap = ctrlIter->second;\n> > -\n> > -\t\tif (infoMap.count(V4L2_CID_BRIGHTNESS) != 1 ||\n> > -\t\t    infoMap.count(V4L2_CID_CONTRAST) != 1 ||\n> > -\t\t    infoMap.count(V4L2_CID_SATURATION) != 1) {\n> > -\t\t\tcerr << \"configure(): Invalid control IDs\" << endl;\n> > -\t\t\treturn report(Op_configure, TestFail);\n> > -\t\t}\n> > -\n> > -\t\treport(Op_configure, TestPass);\n> > -\t}\n> > -\n> > -\tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override\n> > -\t{\n> > -\t\tif (buffers.size() != 2) {\n> > -\t\t\tcerr << \"mapBuffers(): Invalid number of buffers \"\n> > -\t\t\t     << buffers.size() << endl;\n> > -\t\t\treturn report(Op_mapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (buffers[0].id != 10 ||\n> > -\t\t    buffers[1].id != 11) {\n> > -\t\t\tcerr << \"mapBuffers(): Invalid buffer IDs\" << endl;\n> > -\t\t\treturn report(Op_mapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (buffers[0].planes.size() != 3 ||\n> > -\t\t    buffers[1].planes.size() != 3) {\n> > -\t\t\tcerr << \"mapBuffers(): Invalid number of planes\" << endl;\n> > -\t\t\treturn report(Op_mapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (buffers[0].planes[0].length != 4096 ||\n> > -\t\t    buffers[0].planes[1].length != 0 ||\n> > -\t\t    buffers[0].planes[2].length != 0 ||\n> > -\t\t    buffers[0].planes[0].length != 4096 ||\n> > -\t\t    buffers[1].planes[1].length != 4096 ||\n> > -\t\t    buffers[1].planes[2].length != 0) {\n> > -\t\t\tcerr << \"mapBuffers(): Invalid length\" << endl;\n> > -\t\t\treturn report(Op_mapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (buffers[0].planes[0].fd.fd() == -1 ||\n> > -\t\t    buffers[0].planes[1].fd.fd() != -1 ||\n> > -\t\t    buffers[0].planes[2].fd.fd() != -1 ||\n> > -\t\t    buffers[0].planes[0].fd.fd() == -1 ||\n> > -\t\t    buffers[1].planes[1].fd.fd() == -1 ||\n> > -\t\t    buffers[1].planes[2].fd.fd() != -1) {\n> > -\t\t\tcerr << \"mapBuffers(): Invalid dmabuf\" << endl;\n> > -\t\t\treturn report(Op_mapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\treport(Op_mapBuffers, TestPass);\n> > -\t}\n> > -\n> > -\tvoid unmapBuffers(const std::vector<unsigned int> &ids) override\n> > -\t{\n> > -\t\tif (ids.size() != 2) {\n> > -\t\t\tcerr << \"unmapBuffers(): Invalid number of ids \"\n> > -\t\t\t     << ids.size() << endl;\n> > -\t\t\treturn report(Op_unmapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (ids[0] != 10 || ids[1] != 11) {\n> > -\t\t\tcerr << \"unmapBuffers(): Invalid buffer IDs\" << endl;\n> > -\t\t\treturn report(Op_unmapBuffers, TestFail);\n> > -\t\t}\n> > -\n> > -\t\treport(Op_unmapBuffers, TestPass);\n> > -\t}\n> > -\n> > -\tvoid processEvent(const IPAOperationData &data) override\n> > -\t{\n> > -\t\t/* Verify operation and data. */\n> > -\t\tif (data.operation != Op_processEvent) {\n> > -\t\t\tcerr << \"processEvent(): Invalid operation \"\n> > -\t\t\t     << data.operation << endl;\n> > -\t\t\treturn report(Op_processEvent, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tif (data.data != std::vector<unsigned int>{ 1, 2, 3, 4 }) {\n> > -\t\t\tcerr << \"processEvent(): Invalid data\" << endl;\n> > -\t\t\treturn report(Op_processEvent, TestFail);\n> > -\t\t}\n> > -\n> > -\t\t/* Verify controls. */\n> > -\t\tif (data.controls.size() != 1) {\n> > -\t\t\tcerr << \"processEvent(): Controls not found\" << endl;\n> > -\t\t\treturn report(Op_processEvent, TestFail);\n> > -\t\t}\n> > -\n> > -\t\tconst ControlList &controls = data.controls[0];\n> > -\t\tif (controls.get(V4L2_CID_BRIGHTNESS).get<int32_t>() != 10 ||\n> > -\t\t    controls.get(V4L2_CID_CONTRAST).get<int32_t>() != 20 ||\n> > -\t\t    controls.get(V4L2_CID_SATURATION).get<int32_t>() != 30) {\n> > -\t\t\tcerr << \"processEvent(): Invalid controls\" << endl;\n> > -\t\t\treturn report(Op_processEvent, TestFail);\n> > -\t\t}\n> > -\n> > -\t\treport(Op_processEvent, TestPass);\n> > -\t}\n> > -\n> > -private:\n> > -\tvoid report(Operation op, int status)\n> > -\t{\n> > -\t\tIPAOperationData data;\n> > -\t\tdata.operation = op;\n> > -\t\tdata.data.resize(1);\n> > -\t\tdata.data[0] = status;\n> > -\t\tqueueFrameAction.emit(sequence_++, data);\n> > -\t}\n> > -\n> > -\tunsigned int sequence_;\n> > -};\n> > -\n> > -#define INVOKE(method, ...) \\\n> > -\tinvoke(&IPAInterface::method, Op_##method, #method, ##__VA_ARGS__)\n> > -\n> > -class IPAWrappersTest : public Test\n> > -{\n> > -public:\n> > -\tIPAWrappersTest()\n> > -\t\t: subdev_(nullptr), wrapper_(nullptr), sequence_(0), fd_(-1)\n> > -\t{\n> > -\t}\n> > -\n> > -protected:\n> > -\tint init() override\n> > -\t{\n> > -\t\t/* Locate the VIMC Sensor B subdevice. */\n> > -\t\tenumerator_ = unique_ptr<DeviceEnumerator>(DeviceEnumerator::create());\n> > -\t\tif (!enumerator_) {\n> > -\t\t\tcerr << \"Failed to create device enumerator\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tif (enumerator_->enumerate()) {\n> > -\t\t\tcerr << \"Failed to enumerate media devices\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tDeviceMatch dm(\"vimc\");\n> > -\t\tmedia_ = enumerator_->search(dm);\n> > -\t\tif (!media_) {\n> > -\t\t\tcerr << \"No VIMC media device found: skip test\" << endl;\n> > -\t\t\treturn TestSkip;\n> > -\t\t}\n> > -\n> > -\t\tMediaEntity *entity = media_->getEntityByName(\"Sensor A\");\n> > -\t\tif (!entity) {\n> > -\t\t\tcerr << \"Unable to find media entity 'Sensor A'\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tsubdev_ = new V4L2Subdevice(entity);\n> > -\t\tif (subdev_->open() < 0) {\n> > -\t\t\tcerr << \"Unable to open 'Sensor A' subdevice\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\t/* Force usage of the C API as that's what we want to test. */\n> > -\t\tint ret = setenv(\"LIBCAMERA_IPA_FORCE_C_API\", \"\", 1);\n> > -\t\tif (ret)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\tstd::unique_ptr<IPAInterface> intf = std::make_unique<TestIPAInterface>();\n> > -\t\twrapper_ = new IPAContextWrapper(new IPAInterfaceWrapper(std::move(intf)));\n> > -\t\twrapper_->queueFrameAction.connect(this, &IPAWrappersTest::queueFrameAction);\n> > -\n> > -\t\t/* Create a file descriptor for the buffer-related operations. */\n> > -\t\tfd_ = open(\"/tmp\", O_TMPFILE | O_RDWR, 0600);\n> > -\t\tif (fd_ == -1)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\tret = ftruncate(fd_, 4096);\n> > -\t\tif (ret < 0)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\treturn TestPass;\n> > -\t}\n> > -\n> > -\tint run() override\n> > -\t{\n> > -\t\tint ret;\n> > -\n> > -\t\t/* Test configure(). */\n> > -\t\tCameraSensorInfo sensorInfo{\n> > -\t\t\t.model = \"sensor\",\n> > -\t\t\t.bitsPerPixel = 8,\n> > -\t\t\t.activeAreaSize = { 2576, 1956 },\n> > -\t\t\t.analogCrop = { 8, 8, 2560, 1940 },\n> > -\t\t\t.outputSize = { 2560, 1940 },\n> > -\t\t\t.pixelRate = 96000000,\n> > -\t\t\t.lineLength = 2918,\n> > -\t\t};\n> > -\t\tstd::map<unsigned int, IPAStream> config{\n> > -\t\t\t{ 1, { V4L2_PIX_FMT_YUYV, { 1024, 768 } } },\n> > -\t\t\t{ 2, { V4L2_PIX_FMT_NV12, { 800, 600 } } },\n> > -\t\t};\n> > -\t\tstd::map<unsigned int, const ControlInfoMap &> controlInfo;\n> > -\t\tcontrolInfo.emplace(42, subdev_->controls());\n> > -\t\tIPAOperationData ipaConfig;\n> > -\t\tret = INVOKE(configure, sensorInfo, config, controlInfo,\n> > -\t\t\t     ipaConfig, nullptr);\n> > -\t\tif (ret == TestFail)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\t/* Test mapBuffers(). */\n> > -\t\tstd::vector<IPABuffer> buffers(2);\n> > -\t\tbuffers[0].planes.resize(3);\n> > -\t\tbuffers[0].id = 10;\n> > -\t\tbuffers[0].planes[0].fd = FileDescriptor(fd_);\n> > -\t\tbuffers[0].planes[0].length = 4096;\n> > -\t\tbuffers[1].id = 11;\n> > -\t\tbuffers[1].planes.resize(3);\n> > -\t\tbuffers[1].planes[0].fd = FileDescriptor(fd_);\n> > -\t\tbuffers[1].planes[0].length = 4096;\n> > -\t\tbuffers[1].planes[1].fd = FileDescriptor(fd_);\n> > -\t\tbuffers[1].planes[1].length = 4096;\n> > -\n> > -\t\tret = INVOKE(mapBuffers, buffers);\n> > -\t\tif (ret == TestFail)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\t/* Test unmapBuffers(). */\n> > -\t\tstd::vector<unsigned int> bufferIds = { 10, 11 };\n> > -\t\tret = INVOKE(unmapBuffers, bufferIds);\n> > -\t\tif (ret == TestFail)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\t/* Test processEvent(). */\n> > -\t\tIPAOperationData data;\n> > -\t\tdata.operation = Op_processEvent;\n> > -\t\tdata.data = { 1, 2, 3, 4 };\n> > -\t\tdata.controls.emplace_back(subdev_->controls());\n> > -\n> > -\t\tControlList &controls = data.controls.back();\n> > -\t\tcontrols.set(V4L2_CID_BRIGHTNESS, static_cast<int32_t>(10));\n> > -\t\tcontrols.set(V4L2_CID_CONTRAST, static_cast<int32_t>(20));\n> > -\t\tcontrols.set(V4L2_CID_SATURATION, static_cast<int32_t>(30));\n> > -\n> > -\t\tret = INVOKE(processEvent, data);\n> > -\t\tif (ret == TestFail)\n> > -\t\t\treturn TestFail;\n> > -\n> > -\t\t/*\n> > -\t\t * Test init(), start() and stop() last to ensure nothing in the\n> > -\t\t * wrappers or serializer depends on them being called first.\n> > -\t\t */\n> > -\t\tIPASettings settings{\n> > -\t\t\t.configurationFile = \"/ipa/configuration/file\"\n> > -\t\t};\n> > -\t\tret = INVOKE(init, settings);\n> > -\t\tif (ret == TestFail) {\n> > -\t\t\tcerr << \"Failed to run init()\";\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tret = INVOKE(start);\n> > -\t\tif (ret == TestFail) {\n> > -\t\t\tcerr << \"Failed to run start()\";\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tret = INVOKE(stop);\n> > -\t\tif (ret == TestFail) {\n> > -\t\t\tcerr << \"Failed to run stop()\";\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\treturn TestPass;\n> > -\t}\n> > -\n> > -\tvoid cleanup() override\n> > -\t{\n> > -\t\tdelete wrapper_;\n> > -\t\tdelete subdev_;\n> > -\n> > -\t\tif (fd_ != -1)\n> > -\t\t\tclose(fd_);\n> > -\t}\n> > -\n> > -private:\n> > -\ttemplate<typename T, typename... Args1, typename... Args2>\n> > -\tint invoke(T (IPAInterface::*func)(Args1...), Operation op,\n> > -\t\t   const char *name, Args2... args)\n> > -\t{\n> > -\t\tdata_ = IPAOperationData();\n> > -\t\t(wrapper_->*func)(args...);\n> > -\n> > -\t\tif (frame_ != sequence_) {\n> > -\t\t\tcerr << \"IPAInterface::\" << name\n> > -\t\t\t     << \"(): invalid frame number \" << frame_\n> > -\t\t\t     << \", expected \" << sequence_;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tsequence_++;\n> > -\n> > -\t\tif (data_.operation != op) {\n> > -\t\t\tcerr << \"IPAInterface::\" << name\n> > -\t\t\t     << \"(): failed to propagate\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\tif (data_.data[0] != TestPass) {\n> > -\t\t\tcerr << \"IPAInterface::\" << name\n> > -\t\t\t     << \"(): reported an error\" << endl;\n> > -\t\t\treturn TestFail;\n> > -\t\t}\n> > -\n> > -\t\treturn TestPass;\n> > -\t}\n> > -\n> > -\tvoid queueFrameAction(unsigned int frame, const IPAOperationData &data)\n> > -\t{\n> > -\t\tframe_ = frame;\n> > -\t\tdata_ = data;\n> > -\t}\n> > -\n> > -\tstd::shared_ptr<MediaDevice> media_;\n> > -\tstd::unique_ptr<DeviceEnumerator> enumerator_;\n> > -\tV4L2Subdevice *subdev_;\n> > -\n> > -\tIPAContextWrapper *wrapper_;\n> > -\tIPAOperationData data_;\n> > -\tunsigned int sequence_;\n> > -\tunsigned int frame_;\n> > -\tint fd_;\n> > -};\n> > -\n> > -TEST_REGISTER(IPAWrappersTest)\n> > diff --git a/test/ipa/meson.build b/test/ipa/meson.build\n> > index fce58a31..f83bb29e 100644\n> > --- a/test/ipa/meson.build\n> > +++ b/test/ipa/meson.build\n> > @@ -3,7 +3,6 @@\n> >  ipa_test = [\n> >      ['ipa_module_test',     'ipa_module_test.cpp'],\n> >      ['ipa_interface_test',  'ipa_interface_test.cpp'],\n> > -    ['ipa_wrappers_test',   'ipa_wrappers_test.cpp'],\n> >  ]\n> >  \n> >  foreach t : ipa_test","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 76489BE176\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 26 Nov 2020 15:55:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 4322A6347E;\n\tThu, 26 Nov 2020 16:55:09 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 46B9A63469\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 26 Nov 2020 16:55:07 +0100 (CET)","from pendragon.ideasonboard.com (62-78-145-57.bb.dnainternet.fi\n\t[62.78.145.57])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id D14C6A1B;\n\tThu, 26 Nov 2020 16:55:06 +0100 (CET)"],"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=\"JyASQvPA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1606406107;\n\tbh=pmdFG8NQIrdHWnBY8R2aldfCa9B+t98hHOM/3ka68iY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=JyASQvPA5MRFAYGwbqNyVUH+FMFrPm+wG6VfHa+xru5I66otinM4/K1Jfmdjpsc9Y\n\tbwrJp85MjIMioKj9GowvWWiFV5Ehuku5lTHBMEAW9rHJmtj3X3nAIM2P08WTvl68t/\n\tFqgQAdYowrrurpt68EgebMVf8q9AYM9EJ+1UrIzw=","Date":"Thu, 26 Nov 2020 17:54:58 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<20201126155458.GV3905@pendragon.ideasonboard.com>","References":"<20201106103707.49660-1-paul.elder@ideasonboard.com>\n\t<20201106103707.49660-34-paul.elder@ideasonboard.com>\n\t<20201126155347.GU3905@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201126155347.GU3905@pendragon.ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v4 33/37] tests: Remove IPA wrappers\n\ttest","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"us-ascii\"","Content-Transfer-Encoding":"7bit","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]