[{"id":14284,"web_url":"https://patchwork.libcamera.org/comment/14284/","msgid":"<X9zZlYG434p+fEwN@wyvern>","date":"2020-12-18T16:32:21","subject":"Re: [libcamera-devel] [PATCH v5 09/23] tests: Remove IPA wrappers\n\ttest","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Paul,\n\nThanks for your patch.\n\nOn 2020-12-05 19:30:52 +0900, Paul Elder wrote:\n> Since we will soon no longer use IPA wrappers, remove the test for it.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> \n> ---\n> Changes in v5:\n> - move earlier in series\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 | 452 ---------------------------------\n>  test/ipa/meson.build           |   1 -\n>  2 files changed, 453 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 59d991cb..00000000\n> --- a/test/ipa/ipa_wrappers_test.cpp\n> +++ /dev/null\n> @@ -1,452 +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> -#include <libipa/ipa_interface_wrapper.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 ba672f3f..e4f0818a 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\n> -- \n> 2.27.0\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","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 1D3DBC0F1A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 18 Dec 2020 16:32:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id DF39C61595;\n\tFri, 18 Dec 2020 17:32:25 +0100 (CET)","from mail-lf1-x142.google.com (mail-lf1-x142.google.com\n\t[IPv6:2a00:1450:4864:20::142])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 3A8106052C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 18 Dec 2020 17:32:25 +0100 (CET)","by mail-lf1-x142.google.com with SMTP id m25so6838036lfc.11\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 18 Dec 2020 08:32:25 -0800 (PST)","from localhost ([185.224.57.161]) by smtp.gmail.com with ESMTPSA id\n\tb9sm967849lji.68.2020.12.18.08.32.23\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 18 Dec 2020 08:32:23 -0800 (PST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ragnatech-se.20150623.gappssmtp.com\n\theader.i=@ragnatech-se.20150623.gappssmtp.com\n\theader.b=\"eBDXJGHv\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to;\n\tbh=L2qHb4dPbjFWQnIxiplMS7u21O+dN/vqEVGhA6INHsc=;\n\tb=eBDXJGHvu+uNx/MRDHaLk6rjJ2GPKuh9GByfWi9BjgNz+rrU4e+ZzqPxxCeaawhH3e\n\th54TasXiP3IDoBVlFgXlgeJw9/wXQyDUHF0jnO/it87NITlHJ3Hwxbme4T9MtpmzkKIq\n\tPTolVJotQ7e2K3Hg6NyVUdl16b37po0qNGIfqD3YP4w/VOzhrEAt0pNaUN6uF2kUZvAe\n\tB8w0cfPIuJVfot6X4bxmr9cVYLx9J6q/qw1dS4g6h7xoS6rFDzwOVGzMPzsM59dohww7\n\t9sjxupN9QTC2XEQdPDt2uhnXdQLp27Iy/4h3A03tOC5w5dqshvoEgy2HiCLT2rwJae9m\n\tsocg==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to;\n\tbh=L2qHb4dPbjFWQnIxiplMS7u21O+dN/vqEVGhA6INHsc=;\n\tb=kBqNBPRGrXinw5QldrSkIOebbABXaAPc/Ylj2pbxHrU4MIlSwncCVPR4ya/D7IFXmf\n\tnZ9Q89DVAVxkwywI/BHoqdGaybmbXox1nzf77fZ+vKheSGT6f8PHXU78GlGD/yk+wO+x\n\ttO4MFDLDX7xVEnptAC0D2lNJQ2hF7u2zcsQk4HjHWIdLBmpeecrD2OwVvQc4jqfK/MDy\n\tca0VygDv4kOtjFEZVaf5pa96Caw9eH2rwYZFp5D+1KXBsdATZ3v/qGDEU3WDQDOJksSm\n\trzmKHk8EEwaTgOX0mlBnGIowHe5QVEgP/h9fn2cUW/yHWae/DULQdkA4V+g40NBoMDH3\n\tVghQ==","X-Gm-Message-State":"AOAM5339b90mFFYRjSqzVeNzBCP2gUBROGV5INS/fgViGA5pmo9KK9/W\n\tom/0VBtj5UfSSlB5i9DaEBh6lgK7IoY95DWA","X-Google-Smtp-Source":"ABdhPJw+It60G6szbWxmkH1kCEww4ihYUkFnOKDiMwO498ZxJxG6aEeluHkLLw5wNLOC+uAmYpIfrA==","X-Received":"by 2002:a05:6512:3586:: with SMTP id\n\tm6mr1720097lfr.318.1608309144571; \n\tFri, 18 Dec 2020 08:32:24 -0800 (PST)","Date":"Fri, 18 Dec 2020 17:32:21 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<X9zZlYG434p+fEwN@wyvern>","References":"<20201205103106.242080-1-paul.elder@ideasonboard.com>\n\t<20201205103106.242080-10-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20201205103106.242080-10-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v5 09/23] 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=\"iso-8859-1\"","Content-Transfer-Encoding":"quoted-printable","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]