[{"id":11424,"web_url":"https://patchwork.libcamera.org/comment/11424/","msgid":"<20200718150046.GA555842@oden.dyn.berto.se>","date":"2020-07-18T15:00:46","subject":"Re: [libcamera-devel] [PATCH v3 01/10] libcamera: pipeline:\n\traspberrypi: Move RPiStream into a separate file","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Naushir,\n\nThanks for your work.\n\nOn 2020-07-17 09:54:01 +0100, Naushir Patuck wrote:\n> Put RPiStream into the RPi namespace and add a new log category (RPISTREAM)\n\nI would mention there is no functional change in the commit message.\n\n> \n> Signed-off-by: Naushir Patuck <naush@raspberrypi.com>\n> ---\n>  .../pipeline/raspberrypi/meson.build          |   1 +\n>  .../pipeline/raspberrypi/raspberrypi.cpp      | 193 ++----------------\n>  .../pipeline/raspberrypi/rpi_stream.cpp       | 116 +++++++++++\n>  .../pipeline/raspberrypi/rpi_stream.h         |  97 +++++++++\n>  4 files changed, 233 insertions(+), 174 deletions(-)\n>  create mode 100644 src/libcamera/pipeline/raspberrypi/rpi_stream.cpp\n>  create mode 100644 src/libcamera/pipeline/raspberrypi/rpi_stream.h\n> \n> diff --git a/src/libcamera/pipeline/raspberrypi/meson.build b/src/libcamera/pipeline/raspberrypi/meson.build\n> index dcfe07c5..6d6b893e 100644\n> --- a/src/libcamera/pipeline/raspberrypi/meson.build\n> +++ b/src/libcamera/pipeline/raspberrypi/meson.build\n> @@ -2,5 +2,6 @@\n>  \n>  libcamera_sources += files([\n>      'raspberrypi.cpp',\n> +    'rpi_stream.cpp',\n>      'staggered_ctrl.cpp',\n>  ])\n> diff --git a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> index 718749af..09514697 100644\n> --- a/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> +++ b/src/libcamera/pipeline/raspberrypi/raspberrypi.cpp\n> @@ -18,7 +18,6 @@\n>  #include <libcamera/logging.h>\n>  #include <libcamera/property_ids.h>\n>  #include <libcamera/request.h>\n> -#include <libcamera/stream.h>\n>  \n>  #include <linux/videodev2.h>\n>  \n> @@ -31,6 +30,7 @@\n>  #include \"libcamera/internal/v4l2_controls.h\"\n>  #include \"libcamera/internal/v4l2_videodevice.h\"\n>  \n> +#include \"rpi_stream.h\"\n>  #include \"staggered_ctrl.h\"\n>  #include \"vcsm.h\"\n>  \n> @@ -122,165 +122,10 @@ V4L2DeviceFormat findBestMode(V4L2PixFmtMap &formatsMap, const Size &req)\n>  \treturn bestMode;\n>  }\n>  \n> -} /* namespace */\n> -\n> -/*\n> - * Device stream abstraction for either an internal or external stream.\n> - * Used for both Unicam and the ISP.\n> - */\n> -class RPiStream : public Stream\n> -{\n> -public:\n> -\tRPiStream()\n> -\t{\n> -\t}\n> -\n> -\tRPiStream(const char *name, MediaEntity *dev, bool importOnly = false)\n> -\t\t: external_(false), importOnly_(importOnly), name_(name),\n> -\t\t  dev_(std::make_unique<V4L2VideoDevice>(dev))\n> -\t{\n> -\t}\n> -\n> -\tV4L2VideoDevice *dev() const\n> -\t{\n> -\t\treturn dev_.get();\n> -\t}\n> -\n> -\tvoid setExternal(bool external)\n> -\t{\n> -\t\texternal_ = external;\n> -\t}\n> -\n> -\tbool isExternal() const\n> -\t{\n> -\t\t/*\n> -\t\t * Import streams cannot be external.\n> -\t\t *\n> -\t\t * RAW capture is a special case where we simply copy the RAW\n> -\t\t * buffer out of the request. All other buffer handling happens\n> -\t\t * as if the stream is internal.\n> -\t\t */\n> -\t\treturn external_ && !importOnly_;\n> -\t}\n> -\n> -\tbool isImporter() const\n> -\t{\n> -\t\treturn importOnly_;\n> -\t}\n> -\n> -\tvoid reset()\n> -\t{\n> -\t\texternal_ = false;\n> -\t\tinternalBuffers_.clear();\n> -\t}\n> -\n> -\tstd::string name() const\n> -\t{\n> -\t\treturn name_;\n> -\t}\n> -\n> -\tvoid setExternalBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n> -\t{\n> -\t\texternalBuffers_ = buffers;\n> -\t}\n> -\n> -\tconst std::vector<std::unique_ptr<FrameBuffer>> *getBuffers() const\n> -\t{\n> -\t\treturn external_ ? externalBuffers_ : &internalBuffers_;\n> -\t}\n> -\n> -\tvoid releaseBuffers()\n> -\t{\n> -\t\tdev_->releaseBuffers();\n> -\t\tif (!external_ && !importOnly_)\n> -\t\t\tinternalBuffers_.clear();\n> -\t}\n> -\n> -\tint importBuffers(unsigned int count)\n> -\t{\n> -\t\treturn dev_->importBuffers(count);\n> -\t}\n> -\n> -\tint allocateBuffers(unsigned int count)\n> -\t{\n> -\t\treturn dev_->allocateBuffers(count, &internalBuffers_);\n> -\t}\n> -\n> -\tint queueBuffers()\n> -\t{\n> -\t\tif (external_)\n> -\t\t\treturn 0;\n> -\n> -\t\tfor (auto &b : internalBuffers_) {\n> -\t\t\tint ret = dev_->queueBuffer(b.get());\n> -\t\t\tif (ret) {\n> -\t\t\t\tLOG(RPI, Error) << \"Failed to queue buffers for \"\n> -\t\t\t\t\t\t<< name_;\n> -\t\t\t\treturn ret;\n> -\t\t\t}\n> -\t\t}\n> -\n> -\t\treturn 0;\n> -\t}\n> -\n> -\tbool findFrameBuffer(FrameBuffer *buffer) const\n> -\t{\n> -\t\tauto start = external_ ? externalBuffers_->begin() : internalBuffers_.begin();\n> -\t\tauto end = external_ ? externalBuffers_->end() : internalBuffers_.end();\n> -\n> -\t\tif (importOnly_)\n> -\t\t\treturn false;\n> -\n> -\t\tif (std::find_if(start, end,\n> -\t\t\t\t [buffer](std::unique_ptr<FrameBuffer> const &ref) { return ref.get() == buffer; }) != end)\n> -\t\t\treturn true;\n> -\n> -\t\treturn false;\n> -\t}\n> -\n> -private:\n> -\t/*\n> -\t * Indicates that this stream is active externally, i.e. the buffers\n> -\t * are provided by the application.\n> -\t */\n> -\tbool external_;\n> -\t/* Indicates that this stream only imports buffers, e.g. ISP input. */\n> -\tbool importOnly_;\n> -\t/* Stream name identifier. */\n> -\tstd::string name_;\n> -\t/* The actual device stream. */\n> -\tstd::unique_ptr<V4L2VideoDevice> dev_;\n> -\t/* Internally allocated framebuffers associated with this device stream. */\n> -\tstd::vector<std::unique_ptr<FrameBuffer>> internalBuffers_;\n> -\t/* Externally allocated framebuffers associated with this device stream. */\n> -\tstd::vector<std::unique_ptr<FrameBuffer>> *externalBuffers_;\n> -};\n> -\n> -/*\n> - * The following class is just a convenient (and typesafe) array of device\n> - * streams indexed with an enum class.\n> - */\n>  enum class Unicam : unsigned int { Image, Embedded };\n>  enum class Isp : unsigned int { Input, Output0, Output1, Stats };\n>  \n> -template<typename E, std::size_t N>\n> -class RPiDevice : public std::array<class RPiStream, N>\n> -{\n> -private:\n> -\tconstexpr auto index(E e) const noexcept\n> -\t{\n> -\t\treturn static_cast<std::underlying_type_t<E>>(e);\n> -\t}\n> -public:\n> -\tRPiStream &operator[](E e)\n> -\t{\n> -\t\treturn std::array<class RPiStream, N>::operator[](index(e));\n> -\t}\n> -\tconst RPiStream &operator[](E e) const\n> -\t{\n> -\t\treturn std::array<class RPiStream, N>::operator[](index(e));\n> -\t}\n> -};\n> +} /* namespace */\n>  \n>  class RPiCameraData : public CameraData\n>  {\n> @@ -317,15 +162,15 @@ public:\n>  \tvoid ispOutputDequeue(FrameBuffer *buffer);\n>  \n>  \tvoid clearIncompleteRequests();\n> -\tvoid handleStreamBuffer(FrameBuffer *buffer, const RPiStream *stream);\n> +\tvoid handleStreamBuffer(FrameBuffer *buffer, const RPi::RPiStream *stream);\n>  \tvoid handleState();\n>  \n>  \tCameraSensor *sensor_;\n>  \t/* Array of Unicam and ISP device streams and associated buffers/streams. */\n> -\tRPiDevice<Unicam, 2> unicam_;\n> -\tRPiDevice<Isp, 4> isp_;\n> +\tRPi::RPiDevice<Unicam, 2> unicam_;\n> +\tRPi::RPiDevice<Isp, 4> isp_;\n>  \t/* The vector below is just for convenience when iterating over all streams. */\n> -\tstd::vector<RPiStream *> streams_;\n> +\tstd::vector<RPi::RPiStream *> streams_;\n>  \t/* Buffers passed to the IPA. */\n>  \tstd::vector<IPABuffer> ipaBuffers_;\n>  \n> @@ -774,7 +619,7 @@ int PipelineHandlerRPi::configure(Camera *camera, CameraConfiguration *config)\n>  int PipelineHandlerRPi::exportFrameBuffers(Camera *camera, Stream *stream,\n>  \t\t\t\t\t   std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n>  {\n> -\tRPiStream *s = static_cast<RPiStream *>(stream);\n> +\tRPi::RPiStream *s = static_cast<RPi::RPiStream *>(stream);\n>  \tunsigned int count = stream->configuration().bufferCount;\n>  \tint ret = s->dev()->exportBuffers(count, buffers);\n>  \n> @@ -920,14 +765,14 @@ bool PipelineHandlerRPi::match(DeviceEnumerator *enumerator)\n>  \tstd::unique_ptr<RPiCameraData> data = std::make_unique<RPiCameraData>(this);\n>  \n>  \t/* Locate and open the unicam video streams. */\n> -\tdata->unicam_[Unicam::Embedded] = RPiStream(\"Unicam Embedded\", unicam_->getEntityByName(\"unicam-embedded\"));\n> -\tdata->unicam_[Unicam::Image] = RPiStream(\"Unicam Image\", unicam_->getEntityByName(\"unicam-image\"));\n> +\tdata->unicam_[Unicam::Embedded] = RPi::RPiStream(\"Unicam Embedded\", unicam_->getEntityByName(\"unicam-embedded\"));\n> +\tdata->unicam_[Unicam::Image] = RPi::RPiStream(\"Unicam Image\", unicam_->getEntityByName(\"unicam-image\"));\n>  \n>  \t/* Tag the ISP input stream as an import stream. */\n> -\tdata->isp_[Isp::Input] = RPiStream(\"ISP Input\", isp_->getEntityByName(\"bcm2835-isp0-output0\"), true);\n> -\tdata->isp_[Isp::Output0] = RPiStream(\"ISP Output0\", isp_->getEntityByName(\"bcm2835-isp0-capture1\"));\n> -\tdata->isp_[Isp::Output1] = RPiStream(\"ISP Output1\", isp_->getEntityByName(\"bcm2835-isp0-capture2\"));\n> -\tdata->isp_[Isp::Stats] = RPiStream(\"ISP Stats\", isp_->getEntityByName(\"bcm2835-isp0-capture3\"));\n> +\tdata->isp_[Isp::Input] = RPi::RPiStream(\"ISP Input\", isp_->getEntityByName(\"bcm2835-isp0-output0\"), true);\n> +\tdata->isp_[Isp::Output0] = RPi::RPiStream(\"ISP Output0\", isp_->getEntityByName(\"bcm2835-isp0-capture1\"));\n> +\tdata->isp_[Isp::Output1] = RPi::RPiStream(\"ISP Output1\", isp_->getEntityByName(\"bcm2835-isp0-capture2\"));\n> +\tdata->isp_[Isp::Stats] = RPi::RPiStream(\"ISP Stats\", isp_->getEntityByName(\"bcm2835-isp0-capture3\"));\n>  \n>  \t/* This is just for convenience so that we can easily iterate over all streams. */\n>  \tfor (auto &stream : data->unicam_)\n> @@ -1017,7 +862,7 @@ int PipelineHandlerRPi::prepareBuffers(Camera *camera)\n>  \t */\n>  \tunsigned int maxBuffers = 0;\n>  \tfor (const Stream *s : camera->streams())\n> -\t\tif (static_cast<const RPiStream *>(s)->isExternal())\n> +\t\tif (static_cast<const RPi::RPiStream *>(s)->isExternal())\n>  \t\t\tmaxBuffers = std::max(maxBuffers, s->configuration().bufferCount);\n>  \n>  \tfor (auto const stream : data->streams_) {\n> @@ -1278,12 +1123,12 @@ done:\n>  \n>  void RPiCameraData::unicamBufferDequeue(FrameBuffer *buffer)\n>  {\n> -\tconst RPiStream *stream = nullptr;\n> +\tconst RPi::RPiStream *stream = nullptr;\n>  \n>  \tif (state_ == State::Stopped)\n>  \t\treturn;\n>  \n> -\tfor (RPiStream const &s : unicam_) {\n> +\tfor (RPi::RPiStream const &s : unicam_) {\n>  \t\tif (s.findFrameBuffer(buffer)) {\n>  \t\t\tstream = &s;\n>  \t\t\tbreak;\n> @@ -1339,12 +1184,12 @@ void RPiCameraData::ispInputDequeue(FrameBuffer *buffer)\n>  \n>  void RPiCameraData::ispOutputDequeue(FrameBuffer *buffer)\n>  {\n> -\tconst RPiStream *stream = nullptr;\n> +\tconst RPi::RPiStream *stream = nullptr;\n>  \n>  \tif (state_ == State::Stopped)\n>  \t\treturn;\n>  \n> -\tfor (RPiStream const &s : isp_) {\n> +\tfor (RPi::RPiStream const &s : isp_) {\n>  \t\tif (s.findFrameBuffer(buffer)) {\n>  \t\t\tstream = &s;\n>  \t\t\tbreak;\n> @@ -1425,7 +1270,7 @@ void RPiCameraData::clearIncompleteRequests()\n>  \t}\n>  }\n>  \n> -void RPiCameraData::handleStreamBuffer(FrameBuffer *buffer, const RPiStream *stream)\n> +void RPiCameraData::handleStreamBuffer(FrameBuffer *buffer, const RPi::RPiStream *stream)\n>  {\n>  \tif (stream->isExternal()) {\n>  \t\tif (!dropFrame_) {\n> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp\n> new file mode 100644\n> index 00000000..57e5cf72\n> --- /dev/null\n> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.cpp\n> @@ -0,0 +1,116 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2020, Raspberry Pi (Trading) Ltd.\n> + *\n> + * rpi_stream.cpp - Raspberry Pi device stream abstraction class.\n> + */\n> +#include \"libcamera/internal/log.h\"\n> +\n> +#include \"rpi_stream.h\"\n\nThe \"own\" header file should be included first in the cpp file. This is \nso that it's detectable if the \"own\" header file is complete or depends \non includes from other files above it in the cpp file.\n\n> +\n> +namespace libcamera {\n> +\n> +LOG_DEFINE_CATEGORY(RPISTREAM)\n> +\n> +namespace RPi {\n> +\n> +V4L2VideoDevice *RPiStream::dev() const\n> +{\n> +\treturn dev_.get();\n> +}\n> +\n> +void RPiStream::setExternal(bool external)\n> +{\n> +\texternal_ = external;\n> +}\n> +\n> +bool RPiStream::isExternal() const\n> +{\n> +\t/*\n> +\t * Import streams cannot be external.\n> +\t *\n> +\t * RAW capture is a special case where we simply copy the RAW\n> +\t * buffer out of the request. All other buffer handling happens\n> +\t * as if the stream is internal.\n> +\t */\n> +\treturn external_ && !importOnly_;\n> +}\n> +\n> +bool RPiStream::isImporter() const\n> +{\n> +\treturn importOnly_;\n> +}\n> +\n> +void RPiStream::reset()\n> +{\n> +\texternal_ = false;\n> +\tinternalBuffers_.clear();\n> +}\n> +\n> +std::string RPiStream::name() const\n> +{\n> +\treturn name_;\n> +}\n> +\n> +void RPiStream::setExternalBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers)\n> +{\n> +\texternalBuffers_ = buffers;\n> +}\n> +\n> +const std::vector<std::unique_ptr<FrameBuffer>> *RPiStream::getBuffers() const\n> +{\n> +\treturn external_ ? externalBuffers_ : &internalBuffers_;\n> +}\n> +\n> +void RPiStream::releaseBuffers()\n> +{\n> +\tdev_->releaseBuffers();\n> +\tif (!external_ && !importOnly_)\n> +\t\tinternalBuffers_.clear();\n> +}\n> +\n> +int RPiStream::importBuffers(unsigned int count)\n> +{\n> +\treturn dev_->importBuffers(count);\n> +}\n> +\n> +int RPiStream::allocateBuffers(unsigned int count)\n> +{\n> +\treturn dev_->allocateBuffers(count, &internalBuffers_);\n> +}\n> +\n> +int RPiStream::queueBuffers()\n> +{\n> +\tif (external_)\n> +\t\treturn 0;\n> +\n> +\tfor (auto &b : internalBuffers_) {\n> +\t\tint ret = dev_->queueBuffer(b.get());\n> +\t\tif (ret) {\n> +\t\t\tLOG(RPISTREAM, Error) << \"Failed to queue buffers for \"\n> +\t\t\t\t\t      << name_;\n> +\t\t\treturn ret;\n> +\t\t}\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n> +bool RPiStream::findFrameBuffer(FrameBuffer *buffer) const\n> +{\n> +\tauto start = external_ ? externalBuffers_->begin() : internalBuffers_.begin();\n> +\tauto end = external_ ? externalBuffers_->end() : internalBuffers_.end();\n> +\n> +\tif (importOnly_)\n> +\t\treturn false;\n> +\n> +\tif (std::find_if(start, end,\n> +\t\t\t [buffer](std::unique_ptr<FrameBuffer> const &ref) { return ref.get() == buffer; }) != end)\n> +\t\treturn true;\n> +\n> +\treturn false;\n> +}\n> +\n> +} /* namespace RPi */\n> +\n> +} /* namespace libcamera */\n> diff --git a/src/libcamera/pipeline/raspberrypi/rpi_stream.h b/src/libcamera/pipeline/raspberrypi/rpi_stream.h\n> new file mode 100644\n> index 00000000..40fff81d\n> --- /dev/null\n> +++ b/src/libcamera/pipeline/raspberrypi/rpi_stream.h\n> @@ -0,0 +1,97 @@\n> +/* SPDX-License-Identifier: LGPL-2.1-or-later */\n> +/*\n> + * Copyright (C) 2020, Raspberry Pi (Trading) Ltd.\n> + *\n> + * rpi_stream.h - Raspberry Pi device stream abstraction class.\n> + */\n> +#ifndef __LIBCAMERA_PIPELINE_RPI_STREAM_H__\n> +#define __LIBCAMERA_PIPELINE_RPI_STREAM_H__\n> +\n> +#include <queue>\n> +#include <string>\n> +#include <vector>\n> +\n> +#include \"libcamera/internal/v4l2_videodevice.h\"\n> +#include <libcamera/stream.h>\n\nThis looks odd, to follow the style of other files I would move this \naround to:\n\n    #include <queue>\n    #include <string>\n    #include <vector>\n\n    #include <libcamera/stream.h>\n\n    #include \"libcamera/internal/v4l2_videodevice.h\"\n\n\nWith these small nits fixed,\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> +\n> +namespace libcamera {\n> +\n> +namespace RPi {\n> +\n> +/*\n> + * Device stream abstraction for either an internal or external stream.\n> + * Used for both Unicam and the ISP.\n> + */\n> +class RPiStream : public Stream\n> +{\n> +public:\n> +\tRPiStream()\n> +\t{\n> +\t}\n> +\n> +\tRPiStream(const char *name, MediaEntity *dev, bool importOnly = false)\n> +\t\t: external_(false), importOnly_(importOnly), name_(name),\n> +\t\t  dev_(std::make_unique<V4L2VideoDevice>(dev))\n> +\t{\n> +\t}\n> +\n> +\tV4L2VideoDevice *dev() const;\n> +\tvoid setExternal(bool external);\n> +\tbool isExternal() const;\n> +\tbool isImporter() const;\n> +\tvoid reset();\n> +\tstd::string name() const;\n> +\tvoid setExternalBuffers(std::vector<std::unique_ptr<FrameBuffer>> *buffers);\n> +\tconst std::vector<std::unique_ptr<FrameBuffer>> *getBuffers() const;\n> +\tvoid releaseBuffers();\n> +\tint importBuffers(unsigned int count);\n> +\tint allocateBuffers(unsigned int count);\n> +\tint queueBuffers();\n> +\tbool findFrameBuffer(FrameBuffer *buffer) const;\n> +\n> +private:\n> +\t/*\n> +\t * Indicates that this stream is active externally, i.e. the buffers\n> +\t * are provided by the application.\n> +\t */\n> +\tbool external_;\n> +\t/* Indicates that this stream only imports buffers, e.g. ISP input. */\n> +\tbool importOnly_;\n> +\t/* Stream name identifier. */\n> +\tstd::string name_;\n> +\t/* The actual device stream. */\n> +\tstd::unique_ptr<V4L2VideoDevice> dev_;\n> +\t/* Internally allocated framebuffers associated with this device stream. */\n> +\tstd::vector<std::unique_ptr<FrameBuffer>> internalBuffers_;\n> +\t/* Externally allocated framebuffers associated with this device stream. */\n> +\tstd::vector<std::unique_ptr<FrameBuffer>> *externalBuffers_;\n> +};\n> +\n> +/*\n> + * The following class is just a convenient (and typesafe) array of device\n> + * streams indexed with an enum class.\n> + */\n> +template<typename E, std::size_t N>\n> +class RPiDevice : public std::array<class RPiStream, N>\n> +{\n> +private:\n> +\tconstexpr auto index(E e) const noexcept\n> +\t{\n> +\t\treturn static_cast<std::underlying_type_t<E>>(e);\n> +\t}\n> +public:\n> +\tRPiStream &operator[](E e)\n> +\t{\n> +\t\treturn std::array<class RPiStream, N>::operator[](index(e));\n> +\t}\n> +\tconst RPiStream &operator[](E e) const\n> +\t{\n> +\t\treturn std::array<class RPiStream, N>::operator[](index(e));\n> +\t}\n> +};\n> +\n> +} /* namespace RPi */\n> +\n> +} /* namespace libcamera */\n> +\n> +#endif /* __LIBCAMERA_PIPELINE_RPI_STREAM_H__ */\n> -- \n> 2.25.1\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 775C2C0109\n\tfor <parsemail@patchwork.libcamera.org>;\n\tSat, 18 Jul 2020 15:00:52 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A82B6605B2;\n\tSat, 18 Jul 2020 17:00:51 +0200 (CEST)","from mail-lj1-x233.google.com (mail-lj1-x233.google.com\n\t[IPv6:2a00:1450:4864:20::233])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 7835E60493\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 18 Jul 2020 17:00:49 +0200 (CEST)","by mail-lj1-x233.google.com with SMTP id d17so15870872ljl.3\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 18 Jul 2020 08:00:49 -0700 (PDT)","from localhost (h-209-203.A463.priv.bahnhof.se. [155.4.209.203])\n\tby smtp.gmail.com with ESMTPSA id\n\te20sm2223782lja.137.2020.07.18.08.00.47\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tSat, 18 Jul 2020 08:00:47 -0700 (PDT)"],"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=\"RSM0/nv5\"; 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=dQWsnYKCrHVCqlP4EK9nbvmEPrrPPHZ3B8UQvbeOV8Y=;\n\tb=RSM0/nv5L8i+02Bs7bywcbZQSdRP73rXSj/4DdS5VjnhB90g0jSDfYU0xeX/u69kao\n\tAT1/i3L09TDLHxFjn1y8uLMFlGXq26bQDxYCWDm6+20xDfgXuiB6F/aiAGfG3Mm6hHsC\n\tSoZX7rR0acENAwmNJRB0BNuAuNjlX0F6IPZ7w66uEHTZRcYnyX6xTTVGpAQRbGI6lTX1\n\tlkeVV6A5g/QUfXHHlBLl1Xbkx1UuuZysRY5+pc6z++chqpLtXcNbVBRccnKKNgXESgId\n\t/Ntj9hkkKVma2Zdy4Dww0L4BcDf7ZOzGxHTQVSSlinaM2WBY+5ILzJSqKhH1L9XqwLPf\n\tSJvA==","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=dQWsnYKCrHVCqlP4EK9nbvmEPrrPPHZ3B8UQvbeOV8Y=;\n\tb=B+nEZK1oMcgUH4QPsfwgzwrUdSaUKT7iCTzugcPhitP+nQStL06UfWN/o/3NVMvbsQ\n\tVYNwasnCvY1bxdRkywVkNmhrWONhYFYNvT5gPWh22kZK963DqpdgfoEnfghSDXNfbavw\n\tBemRG73hptWBI5IiDJ0wlEDB8m5Bi0t2dM/ZB9qBr6jGstbRbu2DcAS8VM5qLlsYsUKq\n\tM+eFtbPBaLVH0nhYXmcrz5sHkcvO8+JBFkyJ1PyqWZoMCB5hNydU/FwR0Jp6Lkh9LmpV\n\tJ5+Ye12ICKGpawPjAS+e6EaiRTqyiuk7Ss8mP1Yzk1Zc+X8t67CS3zbg1O77zCHFvqWp\n\tkudQ==","X-Gm-Message-State":"AOAM533wj/w400G193knoA5/hgsPVnC9nt+rfQxgGSzqEFvhztRhqP7v\n\tfQ6KkyPoqauLW2LOS/Lqqv4Sww==","X-Google-Smtp-Source":"ABdhPJxI8Wxgk/Y9CWC6v5qkMsLA5O7CozLlJnXDUnLFNRDS086vpR0ZL+KRxNUOVl3FE/gkGMxcxg==","X-Received":"by 2002:a05:651c:323:: with SMTP id\n\tb3mr6108859ljp.318.1595084448369; \n\tSat, 18 Jul 2020 08:00:48 -0700 (PDT)","Date":"Sat, 18 Jul 2020 17:00:46 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Naushir Patuck <naush@raspberrypi.com>","Message-ID":"<20200718150046.GA555842@oden.dyn.berto.se>","References":"<20200717085410.732308-1-naush@raspberrypi.com>\n\t<20200717085410.732308-2-naush@raspberrypi.com>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200717085410.732308-2-naush@raspberrypi.com>","Subject":"Re: [libcamera-devel] [PATCH v3 01/10] libcamera: pipeline:\n\traspberrypi: Move RPiStream into a separate file","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>"}}]