[{"id":15166,"web_url":"https://patchwork.libcamera.org/comment/15166/","msgid":"<YCnrFsEIomGJtlgI@pendragon.ideasonboard.com>","date":"2021-02-15T03:31:34","subject":"Re: [libcamera-devel] [PATCH v8 11/12] libcamera: pipeline,\n\tipa: rkisp1: Support the new IPC mechanism","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 Sat, Feb 13, 2021 at 01:22:24PM +0900, Paul Elder wrote:\n> Add support to the rkisp1 pipeline handler and IPA for the new IPC\n> mechanism.\n> \n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> Reviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> ---\n> Changes in v8:\n> - rebase on \"libcamera: pipeline: rkisp1: configure IPA from configure\n>   method instead of start method\"\n> \n> No change in v7\n> \n> Changes in v6:\n> - move the enum and const from the header to the mojom file\n> - remove the per-pipeline ControlInfoMap\n> - since rkisp1.h has nothing in it anymore, remove it\n> - use the namespace in the pipeline handler and IPA\n> \n> Changes in v5:\n> - import the generated header with the new file name\n> \n> Changes in v4:\n> - rename Controls to controls\n> - rename IPARkISP1CallbackInterface to IPARkISP1EventInterface\n> - rename libcamera_generated_headers to libcamera_generated_ipa_headers\n>   in meson\n> - use the new header name, rkisp1_ipa_interface.h\n> \n> Changes in v3:\n> - change namespacing of base ControlInfoMap structure\n> \n> New in v2\n> ---\n>  include/libcamera/ipa/meson.build        |  1 +\n>  include/libcamera/ipa/rkisp1.h           | 22 -------\n>  include/libcamera/ipa/rkisp1.mojom       | 44 ++++++++++++++\n>  src/ipa/rkisp1/meson.build               |  2 +-\n>  src/ipa/rkisp1/rkisp1.cpp                | 61 +++++++++----------\n>  src/libcamera/pipeline/rkisp1/rkisp1.cpp | 74 ++++++++++++------------\n>  6 files changed, 111 insertions(+), 93 deletions(-)\n>  delete mode 100644 include/libcamera/ipa/rkisp1.h\n>  create mode 100644 include/libcamera/ipa/rkisp1.mojom\n> \n> diff --git a/include/libcamera/ipa/meson.build b/include/libcamera/ipa/meson.build\n> index 67e3f049..d701bccc 100644\n> --- a/include/libcamera/ipa/meson.build\n> +++ b/include/libcamera/ipa/meson.build\n> @@ -56,6 +56,7 @@ libcamera_generated_ipa_headers += custom_target('core_ipa_serializer_h',\n>  \n>  ipa_mojom_files = [\n>      'raspberrypi.mojom',\n> +    'rkisp1.mojom',\n>      'vimc.mojom',\n>  ]\n>  \n> diff --git a/include/libcamera/ipa/rkisp1.h b/include/libcamera/ipa/rkisp1.h\n> deleted file mode 100644\n> index bb824f29..00000000\n> --- a/include/libcamera/ipa/rkisp1.h\n> +++ /dev/null\n> @@ -1,22 +0,0 @@\n> -/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> -/*\n> - * Copyright (C) 2019, Google Inc.\n> - *\n> - * rkisp1.h - Image Processing Algorithm interface for RkISP1\n> - */\n> -#ifndef __LIBCAMERA_IPA_INTERFACE_RKISP1_H__\n> -#define __LIBCAMERA_IPA_INTERFACE_RKISP1_H__\n> -\n> -#ifndef __DOXYGEN__\n> -\n> -enum RkISP1Operations {\n> -\tRKISP1_IPA_ACTION_V4L2_SET = 1,\n> -\tRKISP1_IPA_ACTION_PARAM_FILLED = 2,\n> -\tRKISP1_IPA_ACTION_METADATA = 3,\n> -\tRKISP1_IPA_EVENT_SIGNAL_STAT_BUFFER = 4,\n> -\tRKISP1_IPA_EVENT_QUEUE_REQUEST = 5,\n> -};\n> -\n> -#endif /* __DOXYGEN__ */\n> -\n> -#endif /* __LIBCAMERA_IPA_INTERFACE_RKISP1_H__ */\n> diff --git a/include/libcamera/ipa/rkisp1.mojom b/include/libcamera/ipa/rkisp1.mojom\n> new file mode 100644\n> index 00000000..9270f9c7\n> --- /dev/null\n> +++ b/include/libcamera/ipa/rkisp1.mojom\n> @@ -0,0 +1,44 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +\n> +module ipa.rkisp1;\n> +\n> +import \"include/libcamera/ipa/core.mojom\";\n> +\n> +enum RkISP1Operations {\n> +\tActionV4L2Set = 1,\n> +\tActionParamFilled = 2,\n> +\tActionMetadata = 3,\n> +\tEventSignalStatBuffer = 4,\n> +\tEventQueueRequest = 5,\n> +};\n> +\n> +struct RkISP1Event {\n> +\tRkISP1Operations op;\n> +\tuint32 frame;\n> +\tuint32 bufferId;\n> +\tControlList controls;\n> +};\n> +\n> +struct RkISP1Action {\n> +\tRkISP1Operations op;\n> +\tControlList controls;\n> +};\n> +\n> +interface IPARkISP1Interface {\n> +\tinit(IPASettings settings) => (int32 ret);\n> +\tstart() => (int32 ret);\n> +\tstop();\n> +\n> +\tconfigure(CameraSensorInfo sensorInfo,\n> +\t\t  map<uint32, IPAStream> streamConfig,\n> +\t\t  map<uint32, ControlInfoMap> entityControls) => ();\n> +\n> +\tmapBuffers(array<IPABuffer> buffers);\n> +\tunmapBuffers(array<uint32> ids);\n> +\n> +\t[async] processEvent(RkISP1Event ev);\n> +};\n> +\n> +interface IPARkISP1EventInterface {\n> +\tqueueFrameAction(uint32 frame, RkISP1Action action);\n> +};\n> diff --git a/src/ipa/rkisp1/meson.build b/src/ipa/rkisp1/meson.build\n> index 95eb5393..1a1c7159 100644\n> --- a/src/ipa/rkisp1/meson.build\n> +++ b/src/ipa/rkisp1/meson.build\n> @@ -3,7 +3,7 @@\n>  ipa_name = 'ipa_rkisp1'\n>  \n>  mod = shared_module(ipa_name,\n> -                    'rkisp1.cpp',\n> +                    ['rkisp1.cpp', libcamera_generated_ipa_headers],\n>                      name_prefix : '',\n>                      include_directories : [ipa_includes, libipa_includes],\n>                      dependencies : libcamera_dep,\n> diff --git a/src/ipa/rkisp1/rkisp1.cpp b/src/ipa/rkisp1/rkisp1.cpp\n> index f4812d8d..67bac986 100644\n> --- a/src/ipa/rkisp1/rkisp1.cpp\n> +++ b/src/ipa/rkisp1/rkisp1.cpp\n> @@ -19,7 +19,7 @@\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/ipa/ipa_interface.h>\n>  #include <libcamera/ipa/ipa_module_info.h>\n> -#include <libcamera/ipa/rkisp1.h>\n> +#include <libcamera/ipa/rkisp1_ipa_interface.h>\n>  #include <libcamera/request.h>\n>  \n>  #include \"libcamera/internal/log.h\"\n> @@ -28,25 +28,22 @@ namespace libcamera {\n>  \n>  LOG_DEFINE_CATEGORY(IPARkISP1)\n>  \n> -class IPARkISP1 : public IPAInterface\n> +class IPARkISP1 : public ipa::rkisp1::IPARkISP1Interface\n>  {\n>  public:\n>  \tint init([[maybe_unused]] const IPASettings &settings) override\n>  \t{\n>  \t\treturn 0;\n>  \t}\n> -\tint start([[maybe_unused]] const IPAOperationData &data,\n> -\t\t  [[maybe_unused]] IPAOperationData *result) override { return 0; }\n> +\tint start() override { return 0; }\n>  \tvoid stop() override {}\n>  \n>  \tvoid configure(const CameraSensorInfo &info,\n> -\t\t       const std::map<unsigned int, IPAStream> &streamConfig,\n> -\t\t       const std::map<unsigned int, const ControlInfoMap &> &entityControls,\n> -\t\t       const IPAOperationData &ipaConfig,\n> -\t\t       IPAOperationData *response) override;\n> +\t\t       const std::map<uint32_t, IPAStream> &streamConfig,\n> +\t\t       const std::map<uint32_t, ControlInfoMap> &entityControls) override;\n>  \tvoid mapBuffers(const std::vector<IPABuffer> &buffers) override;\n>  \tvoid unmapBuffers(const std::vector<unsigned int> &ids) override;\n> -\tvoid processEvent(const IPAOperationData &event) override;\n> +\tvoid processEvent(const ipa::rkisp1::RkISP1Event &event) override;\n>  \n>  private:\n>  \tvoid queueRequest(unsigned int frame, rkisp1_params_cfg *params,\n> @@ -79,10 +76,8 @@ private:\n>   * before accessing them.\n>   */\n>  void IPARkISP1::configure([[maybe_unused]] const CameraSensorInfo &info,\n> -\t\t\t  [[maybe_unused]] const std::map<unsigned int, IPAStream> &streamConfig,\n> -\t\t\t  const std::map<unsigned int, const ControlInfoMap &> &entityControls,\n> -\t\t\t  [[maybe_unused]] const IPAOperationData &ipaConfig,\n> -\t\t\t  [[maybe_unused]] IPAOperationData *result)\n> +\t\t\t  [[maybe_unused]] const std::map<uint32_t, IPAStream> &streamConfig,\n> +\t\t\t  const std::map<uint32_t, ControlInfoMap> &entityControls)\n>  {\n>  \tif (entityControls.empty())\n>  \t\treturn;\n> @@ -158,12 +153,12 @@ void IPARkISP1::unmapBuffers(const std::vector<unsigned int> &ids)\n>  \t}\n>  }\n>  \n> -void IPARkISP1::processEvent(const IPAOperationData &event)\n> +void IPARkISP1::processEvent(const ipa::rkisp1::RkISP1Event &event)\n>  {\n> -\tswitch (event.operation) {\n> -\tcase RKISP1_IPA_EVENT_SIGNAL_STAT_BUFFER: {\n> -\t\tunsigned int frame = event.data[0];\n> -\t\tunsigned int bufferId = event.data[1];\n> +\tswitch (event.op) {\n> +\tcase ipa::rkisp1::EventSignalStatBuffer: {\n> +\t\tunsigned int frame = event.frame;\n> +\t\tunsigned int bufferId = event.bufferId;\n>  \n>  \t\tconst rkisp1_stat_buffer *stats =\n>  \t\t\tstatic_cast<rkisp1_stat_buffer *>(buffersMemory_[bufferId]);\n> @@ -171,18 +166,18 @@ void IPARkISP1::processEvent(const IPAOperationData &event)\n>  \t\tupdateStatistics(frame, stats);\n>  \t\tbreak;\n>  \t}\n> -\tcase RKISP1_IPA_EVENT_QUEUE_REQUEST: {\n> -\t\tunsigned int frame = event.data[0];\n> -\t\tunsigned int bufferId = event.data[1];\n> +\tcase ipa::rkisp1::EventQueueRequest: {\n> +\t\tunsigned int frame = event.frame;\n> +\t\tunsigned int bufferId = event.bufferId;\n>  \n>  \t\trkisp1_params_cfg *params =\n>  \t\t\tstatic_cast<rkisp1_params_cfg *>(buffersMemory_[bufferId]);\n>  \n> -\t\tqueueRequest(frame, params, event.controls[0]);\n> +\t\tqueueRequest(frame, params, event.controls);\n>  \t\tbreak;\n>  \t}\n>  \tdefault:\n> -\t\tLOG(IPARkISP1, Error) << \"Unknown event \" << event.operation;\n> +\t\tLOG(IPARkISP1, Error) << \"Unknown event \" << event.op;\n>  \t\tbreak;\n>  \t}\n>  }\n> @@ -202,8 +197,8 @@ void IPARkISP1::queueRequest(unsigned int frame, rkisp1_params_cfg *params,\n>  \t\tparams->module_en_update = RKISP1_CIF_ISP_MODULE_AEC;\n>  \t}\n>  \n> -\tIPAOperationData op;\n> -\top.operation = RKISP1_IPA_ACTION_PARAM_FILLED;\n> +\tipa::rkisp1::RkISP1Action op;\n> +\top.op = ipa::rkisp1::ActionParamFilled;\n>  \n>  \tqueueFrameAction.emit(frame, op);\n>  }\n> @@ -255,13 +250,13 @@ void IPARkISP1::updateStatistics(unsigned int frame,\n>  \n>  void IPARkISP1::setControls(unsigned int frame)\n>  {\n> -\tIPAOperationData op;\n> -\top.operation = RKISP1_IPA_ACTION_V4L2_SET;\n> +\tipa::rkisp1::RkISP1Action op;\n> +\top.op = ipa::rkisp1::ActionV4L2Set;\n>  \n>  \tControlList ctrls(ctrls_);\n>  \tctrls.set(V4L2_CID_EXPOSURE, static_cast<int32_t>(exposure_));\n>  \tctrls.set(V4L2_CID_ANALOGUE_GAIN, static_cast<int32_t>(gain_));\n> -\top.controls.push_back(ctrls);\n> +\top.controls = ctrls;\n>  \n>  \tqueueFrameAction.emit(frame, op);\n>  }\n> @@ -273,9 +268,9 @@ void IPARkISP1::metadataReady(unsigned int frame, unsigned int aeState)\n>  \tif (aeState)\n>  \t\tctrls.set(controls::AeLocked, aeState == 2);\n>  \n> -\tIPAOperationData op;\n> -\top.operation = RKISP1_IPA_ACTION_METADATA;\n> -\top.controls.push_back(ctrls);\n> +\tipa::rkisp1::RkISP1Action op;\n> +\top.op = ipa::rkisp1::ActionMetadata;\n> +\top.controls = ctrls;\n>  \n>  \tqueueFrameAction.emit(frame, op);\n>  }\n> @@ -292,9 +287,9 @@ const struct IPAModuleInfo ipaModuleInfo = {\n>  \t\"rkisp1\",\n>  };\n>  \n> -struct ipa_context *ipaCreate()\n> +IPAInterface *ipaCreate()\n>  {\n> -\treturn new IPAInterfaceWrapper(std::make_unique<IPARkISP1>());\n> +\treturn new IPARkISP1();\n>  }\n>  }\n>  \n> diff --git a/src/libcamera/pipeline/rkisp1/rkisp1.cpp b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> index f15efa9f..d29a3884 100644\n> --- a/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> +++ b/src/libcamera/pipeline/rkisp1/rkisp1.cpp\n> @@ -18,7 +18,9 @@\n>  #include <libcamera/camera.h>\n>  #include <libcamera/control_ids.h>\n>  #include <libcamera/formats.h>\n> -#include <libcamera/ipa/rkisp1.h>\n> +#include <libcamera/ipa/core_ipa_interface.h>\n> +#include <libcamera/ipa/rkisp1_ipa_interface.h>\n> +#include <libcamera/ipa/rkisp1_ipa_proxy.h>\n>  #include <libcamera/request.h>\n>  #include <libcamera/stream.h>\n>  \n> @@ -96,9 +98,11 @@ public:\n>  \tRkISP1MainPath *mainPath_;\n>  \tRkISP1SelfPath *selfPath_;\n>  \n> +\tstd::unique_ptr<ipa::rkisp1::IPAProxyRkISP1> ipa_;\n> +\n>  private:\n>  \tvoid queueFrameAction(unsigned int frame,\n> -\t\t\t      const IPAOperationData &action);\n> +\t\t\t      const ipa::rkisp1::RkISP1Action &action);\n>  \n>  \tvoid metadataReady(unsigned int frame, const ControlList &metadata);\n>  };\n> @@ -298,7 +302,7 @@ RkISP1FrameInfo *RkISP1Frames::find(Request *request)\n>  \n>  int RkISP1CameraData::loadIPA()\n>  {\n> -\tipa_ = IPAManager::createIPA(pipe_, 1, 1);\n> +\tipa_ = IPAManager::createIPA<ipa::rkisp1::IPAProxyRkISP1>(pipe_, 1, 1);\n>  \tif (!ipa_)\n>  \t\treturn -ENOENT;\n>  \n> @@ -311,15 +315,15 @@ int RkISP1CameraData::loadIPA()\n>  }\n>  \n>  void RkISP1CameraData::queueFrameAction(unsigned int frame,\n> -\t\t\t\t\tconst IPAOperationData &action)\n> +\t\t\t\t\tconst ipa::rkisp1::RkISP1Action &action)\n>  {\n> -\tswitch (action.operation) {\n> -\tcase RKISP1_IPA_ACTION_V4L2_SET: {\n> -\t\tconst ControlList &controls = action.controls[0];\n> +\tswitch (action.op) {\n> +\tcase ipa::rkisp1::ActionV4L2Set: {\n> +\t\tconst ControlList &controls = action.controls;\n>  \t\tdelayedCtrls_->push(controls);\n>  \t\tbreak;\n>  \t}\n> -\tcase RKISP1_IPA_ACTION_PARAM_FILLED: {\n> +\tcase ipa::rkisp1::ActionParamFilled: {\n>  \t\tPipelineHandlerRkISP1 *pipe = static_cast<PipelineHandlerRkISP1 *>(pipe_);\n>  \t\tRkISP1FrameInfo *info = frameInfo_.find(frame);\n>  \t\tif (!info)\n> @@ -336,11 +340,11 @@ void RkISP1CameraData::queueFrameAction(unsigned int frame,\n>  \n>  \t\tbreak;\n>  \t}\n> -\tcase RKISP1_IPA_ACTION_METADATA:\n> -\t\tmetadataReady(frame, action.controls[0]);\n> +\tcase ipa::rkisp1::ActionMetadata:\n> +\t\tmetadataReady(frame, action.controls);\n>  \t\tbreak;\n>  \tdefault:\n> -\t\tLOG(RkISP1, Error) << \"Unknown action \" << action.operation;\n> +\t\tLOG(RkISP1, Error) << \"Unknown action \" << action.op;\n>  \t\tbreak;\n>  \t}\n>  }\n> @@ -613,17 +617,13 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>  \t\tif (cfg.stream() == &data->mainPathStream_) {\n>  \t\t\tret = mainPath_.configure(cfg, format);\n>  \t\t\tif (data->mainPath_->isEnabled())\n> -\t\t\t\tstreamConfig[0] = {\n> -\t\t\t\t\t.pixelFormat = cfg.pixelFormat,\n> -\t\t\t\t\t.size = cfg.size,\n> -\t\t\t\t};\n> +\t\t\t\tstreamConfig[0] = IPAStream(cfg.pixelFormat,\n> +\t\t\t\t\t\t\t    cfg.size);\n>  \t\t} else {\n>  \t\t\tret = selfPath_.configure(cfg, format);\n>  \t\t\tif (data->selfPath_->isEnabled())\n> -\t\t\t\tstreamConfig[1] = {\n> -\t\t\t\t\t.pixelFormat = cfg.pixelFormat,\n> -\t\t\t\t\t.size = cfg.size,\n> -\t\t\t\t};\n> +\t\t\t\tstreamConfig[1] = IPAStream(cfg.pixelFormat,\n> +\t\t\t\t\t\t\t    cfg.size);\n>  \t\t}\n>  \n>  \t\tif (ret)\n> @@ -652,11 +652,10 @@ int PipelineHandlerRkISP1::configure(Camera *camera, CameraConfiguration *c)\n>  \t\tret = 0;\n>  \t}\n>  \n> -\tstd::map<unsigned int, const ControlInfoMap &> entityControls;\n> +\tstd::map<uint32_t, ControlInfoMap> entityControls;\n>  \tentityControls.emplace(0, data->sensor_->controls());\n>  \n> -\tIPAOperationData ipaConfig;\n> -\tdata->ipa_->configure(sensorInfo, streamConfig, entityControls, ipaConfig, nullptr);\n> +\tdata->ipa_->configure(sensorInfo, streamConfig, entityControls);\n>  \n>  \treturn 0;\n>  }\n> @@ -696,15 +695,15 @@ int PipelineHandlerRkISP1::allocateBuffers(Camera *camera)\n>  \n>  \tfor (std::unique_ptr<FrameBuffer> &buffer : paramBuffers_) {\n>  \t\tbuffer->setCookie(ipaBufferId++);\n> -\t\tdata->ipaBuffers_.push_back({ .id = buffer->cookie(),\n> -\t\t\t\t\t      .planes = buffer->planes() });\n> +\t\tdata->ipaBuffers_.push_back(IPABuffer(buffer->cookie(),\n> +\t\t\t\t\t\t      buffer->planes()));\n\n\t\tdata->ipaBuffers_.emplace_back(buffer->cookie(),\n\t\t\t\t\t       buffer->planes()));\n\nwould be a bit more efficient.\n\n>  \t\tavailableParamBuffers_.push(buffer.get());\n>  \t}\n>  \n>  \tfor (std::unique_ptr<FrameBuffer> &buffer : statBuffers_) {\n>  \t\tbuffer->setCookie(ipaBufferId++);\n> -\t\tdata->ipaBuffers_.push_back({ .id = buffer->cookie(),\n> -\t\t\t\t\t      .planes = buffer->planes() });\n> +\t\tdata->ipaBuffers_.push_back(IPABuffer(buffer->cookie(),\n> +\t\t\t\t\t\t      buffer->planes()));\n\nSame here.\n\n>  \t\tavailableStatBuffers_.push(buffer.get());\n>  \t}\n>  \n> @@ -758,8 +757,7 @@ int PipelineHandlerRkISP1::start(Camera *camera, [[maybe_unused]] ControlList *c\n>  \tif (ret)\n>  \t\treturn ret;\n>  \n> -\tIPAOperationData ipaData = {};\n> -\tret = data->ipa_->start(ipaData, nullptr);\n> +\tret = data->ipa_->start();\n>  \tif (ret) {\n>  \t\tfreeBuffers(camera);\n>  \t\tLOG(RkISP1, Error)\n> @@ -854,11 +852,12 @@ int PipelineHandlerRkISP1::queueRequestDevice(Camera *camera, Request *request)\n>  \tif (!info)\n>  \t\treturn -ENOENT;\n>  \n> -\tIPAOperationData op;\n> -\top.operation = RKISP1_IPA_EVENT_QUEUE_REQUEST;\n> -\top.data = { data->frame_, info->paramBuffer->cookie() };\n> -\top.controls = { request->controls() };\n> -\tdata->ipa_->processEvent(op);\n> +\tipa::rkisp1::RkISP1Event ev;\n> +\tev.op = ipa::rkisp1::EventQueueRequest;\n> +\tev.frame = data->frame_;\n> +\tev.bufferId = info->paramBuffer->cookie();\n> +\tev.controls = request->controls();\n> +\tdata->ipa_->processEvent(ev);\n>  \n>  \tdata->frame_++;\n>  \n> @@ -1089,10 +1088,11 @@ void PipelineHandlerRkISP1::statReady(FrameBuffer *buffer)\n>  \tif (data->frame_ <= buffer->metadata().sequence)\n>  \t\tdata->frame_ = buffer->metadata().sequence + 1;\n>  \n> -\tIPAOperationData op;\n> -\top.operation = RKISP1_IPA_EVENT_SIGNAL_STAT_BUFFER;\n> -\top.data = { info->frame, info->statBuffer->cookie() };\n> -\tdata->ipa_->processEvent(op);\n> +\tipa::rkisp1::RkISP1Event ev;\n> +\tev.op = ipa::rkisp1::EventSignalStatBuffer;\n> +\tev.frame = info->frame;\n> +\tev.bufferId = info->statBuffer->cookie();\n> +\tdata->ipa_->processEvent(ev);\n>  }\n>  \n>  REGISTER_PIPELINE_HANDLER(PipelineHandlerRkISP1)","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 08CABBD160\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 15 Feb 2021 03:32:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 5C1E4637B3;\n\tMon, 15 Feb 2021 04:32:02 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 5E976602F9\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 15 Feb 2021 04:32:00 +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 B5CE4743;\n\tMon, 15 Feb 2021 04:31:59 +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=\"noGhd503\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1613359920;\n\tbh=SNCFbzKeUyrGvS14KxfiIVguExTuhMWaChn1krcY6YA=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=noGhd503DqDLCqrappIao2r0U4Oqhh5hVZSW1VgxoDe4/UgyOSeSWp47HJtzFQ1em\n\t9iqgacwmJ8bTnN3C318n1EGuoJVW2V71fJhkBeevBsxVqcrh2Oq49ojrL72IepUQM4\n\t8k/IhzpunQOQvEke1mGav3972fEahfaHpiTYML3I=","Date":"Mon, 15 Feb 2021 05:31:34 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<YCnrFsEIomGJtlgI@pendragon.ideasonboard.com>","References":"<20210213042225.112477-1-paul.elder@ideasonboard.com>\n\t<20210213042225.112477-12-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20210213042225.112477-12-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v8 11/12] libcamera: pipeline,\n\tipa: rkisp1: Support the new IPC mechanism","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=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]