[{"id":26101,"web_url":"https://patchwork.libcamera.org/comment/26101/","msgid":"<20221216151705.ffu2svgavvhqadnn@uno.localdomain>","date":"2022-12-16T15:17:05","subject":"Re: [libcamera-devel] [PATCH v9 06/18] libcamera: pipeline: simple:\n\tDon't rely on bufferCount","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Paul\n\nOn Fri, Dec 16, 2022 at 09:29:27PM +0900, Paul Elder via libcamera-devel wrote:\n> From: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n>\n> Currently the simple pipeline handler relies on bufferCount to decide on\n> the number of buffers to allocate internally when a converter is in use\n> and for the number of V4L2 buffer slots to reserve. Instead, the number\n> of internal buffers should be the minimum required by the pipeline to\n> keep the requests flowing, in order to avoid wasting memory, while the\n> number of V4L2 buffer slots should be greater than the expected number\n> of requests queued by the application, in order to avoid thrashing\n> dmabuf mappings, which would degrade performance.\n>\n> Stop relying on bufferCount for these numbers and instead set them to\n> appropriate, and independent, constants.\n>\n> Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n>\n> ---\n> Changes in v9:\n> - rebased\n>\n> Changes in v8:\n> - New\n> ---\n>  include/libcamera/internal/converter.h        |  3 ++-\n>  .../internal/converter/converter_v4l2_m2m.h   |  6 +++--\n>  .../converter/converter_v4l2_m2m.cpp          | 12 +++++-----\n>  src/libcamera/pipeline/simple/simple.cpp      | 22 ++++++++++++++-----\n>  4 files changed, 30 insertions(+), 13 deletions(-)\n>\n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 834ec5ab..32490fe0 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -49,7 +49,8 @@ public:\n>  \tvirtual int exportBuffers(unsigned int output, unsigned int count,\n>  \t\t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n>\n> -\tvirtual int start() = 0;\n> +\tvirtual int start(unsigned int internalBufferCount,\n> +\t\t\t  unsigned int bufferSlotCount) = 0;\n>  \tvirtual void stop() = 0;\n>\n>  \tvirtual int queueBuffers(FrameBuffer *input,\n> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> index 815916d0..1f471071 100644\n> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> @@ -50,7 +50,8 @@ public:\n>  \tint exportBuffers(unsigned int ouput, unsigned int count,\n>  \t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers);\n>\n> -\tint start();\n> +\tint start(unsigned int internalBufferCount,\n> +\t\t  unsigned int bufferSlotCount);\n>  \tvoid stop();\n>\n>  \tint queueBuffers(FrameBuffer *input,\n> @@ -69,7 +70,8 @@ private:\n>  \t\tint exportBuffers(unsigned int count,\n>  \t\t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers);\n>\n> -\t\tint start();\n> +\t\tint start(unsigned int internalBufferCount,\n> +\t\t\t  unsigned int bufferSlotCount);\n>  \t\tvoid stop();\n>\n>  \t\tint queueBuffers(FrameBuffer *input, FrameBuffer *output);\n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index 2a4d1d99..9d25f25a 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -107,13 +107,14 @@ int V4L2M2MConverter::Stream::exportBuffers(unsigned int count,\n>  \treturn m2m_->capture()->exportBuffers(count, buffers);\n>  }\n>\n> -int V4L2M2MConverter::Stream::start()\n> +int V4L2M2MConverter::Stream::start(unsigned int internalBufferCount,\n> +\t\t\t\t    unsigned int bufferSlotCount)\n>  {\n> -\tint ret = m2m_->output()->importBuffers(inputBufferCount_);\n> +\tint ret = m2m_->output()->importBuffers(internalBufferCount);\n>  \tif (ret < 0)\n>  \t\treturn ret;\n>\n> -\tret = m2m_->capture()->importBuffers(outputBufferCount_);\n> +\tret = m2m_->capture()->importBuffers(bufferSlotCount);\n\nAre inputBufferCount_ and outputBufferCount_ used anymore ?\nAnd to be honest I would keep the names as they are\n\nAlso the number of output buffers could be defined by the converter\nclass itself ?\n\n>  \tif (ret < 0) {\n>  \t\tstop();\n>  \t\treturn ret;\n> @@ -373,12 +374,13 @@ int V4L2M2MConverter::exportBuffers(unsigned int output, unsigned int count,\n>  /**\n>   * \\copydoc libcamera::Converter::start\n>   */\n> -int V4L2M2MConverter::start()\n> +int V4L2M2MConverter::start(unsigned int internalBufferCount,\n> +\t\t\t    unsigned int bufferSlotCount)\n>  {\n>  \tint ret;\n>\n>  \tfor (Stream &stream : streams_) {\n> -\t\tret = stream.start();\n> +\t\tret = stream.start(internalBufferCount, bufferSlotCount);\n>  \t\tif (ret < 0) {\n>  \t\t\tstop();\n>  \t\t\treturn ret;\n> diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> index 6b7c6d5c..196e5252 100644\n> --- a/src/libcamera/pipeline/simple/simple.cpp\n> +++ b/src/libcamera/pipeline/simple/simple.cpp\n> @@ -339,6 +339,7 @@ protected:\n>\n>  private:\n>  \tstatic constexpr unsigned int kNumInternalBuffers = 3;\n> +\tstatic constexpr unsigned int kSimpleBufferSlotCount = 16;\n>\n>  \tstruct EntityData {\n>  \t\tstd::unique_ptr<V4L2VideoDevice> video;\n> @@ -1232,17 +1233,27 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t\treturn -EBUSY;\n>  \t}\n>\n> +\t/*\n> +\t * Number of internal buffers that will be used to move video capture\n> +\t * device frames to the converter.\n> +\t *\n> +\t * \\todo Make this depend on the driver in use instead of being\n> +\t * hardcoded. In order to not drop frames, the realtime requirements for\n> +\t * each device should be checked, so it may not be as simple as just\n> +\t * using the minimum number of buffers required by the driver.\n> +\t */\n> +\tstatic constexpr unsigned int internalBufferCount = 3;\n> +\n>  \tif (data->useConverter_) {\n>  \t\t/*\n>  \t\t * When using the converter allocate a fixed number of internal\n>  \t\t * buffers.\n>  \t\t */\n> -\t\tret = video->allocateBuffers(kNumInternalBuffers,\n> +\t\tret = video->allocateBuffers(internalBufferCount,\n>  \t\t\t\t\t     &data->converterBuffers_);\n>  \t} else {\n> -\t\t/* Otherwise, prepare for using buffers from the only stream. */\n> -\t\tStream *stream = &data->streams_[0];\n> -\t\tret = video->importBuffers(stream->configuration().bufferCount);\n> +\t\t/* Otherwise, prepare for using buffers. */\n> +\t\tret = video->importBuffers(kSimpleBufferSlotCount);\n>  \t}\n>  \tif (ret < 0) {\n>  \t\treleasePipeline(data);\n> @@ -1258,7 +1269,8 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n>  \t}\n>\n>  \tif (data->useConverter_) {\n> -\t\tret = data->converter_->start();\n> +\t\tret = data->converter_->start(internalBufferCount,\n> +\t\t\t\t\t      kSimpleBufferSlotCount);\n>  \t\tif (ret < 0) {\n>  \t\t\tstop(camera);\n>  \t\t\treturn ret;\n> --\n> 2.35.1\n>","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 936EEC3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 16 Dec 2022 15:17:09 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id F297A6339E;\n\tFri, 16 Dec 2022 16:17:08 +0100 (CET)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[IPv6:2001:4b98:dc4:8::226])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D7290603D0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 16 Dec 2022 16:17:07 +0100 (CET)","(Authenticated sender: jacopo@jmondi.org)\n\tby mail.gandi.net (Postfix) with ESMTPSA id 25F60C0003;\n\tFri, 16 Dec 2022 15:17:06 +0000 (UTC)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1671203829;\n\tbh=431fdUpkWx2KV8cnW9KT78TI90l8ODfEiQcVRuxmkhg=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=IhgjOto/behAylL6rmdJDEjATFh5oD/bFjaxNQpWbJG2oFAxTfFle26FTPUVVUcqF\n\txx00k7E2NHxLeF79yXMaSmNBEYRiBwVpdZDwAEl+9ce6fRgv86arBUAqFURGxjtbUG\n\tDdG1tJuWmCk//UA/hIGfWP+9nAOENoC8h9SKlhZklud8aSBbXjNyNEZYaTE1gaPmQV\n\tzyoV8EcGBS8tEfwmZWjhRvEro/0rHB6Ghm15e0UZSZoBjgBtRldsozeSdZpuaax00h\n\tFfkb+2ySEk8RX0U2gI4xZUvrzs/2epJYQWbkJbwYex2UbcXhMkUr+iX4DbuXhzux2P\n\tEkcm6Ylgumibw==","Date":"Fri, 16 Dec 2022 16:17:05 +0100","To":"Paul Elder <paul.elder@ideasonboard.com>","Message-ID":"<20221216151705.ffu2svgavvhqadnn@uno.localdomain>","References":"<20221216122939.256534-1-paul.elder@ideasonboard.com>\n\t<20221216122939.256534-7-paul.elder@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20221216122939.256534-7-paul.elder@ideasonboard.com>","Subject":"Re: [libcamera-devel] [PATCH v9 06/18] libcamera: pipeline: simple:\n\tDon't rely on bufferCount","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>","From":"Jacopo Mondi via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":26144,"web_url":"https://patchwork.libcamera.org/comment/26144/","msgid":"<Y6Ytvsk4Zsz0SdXF@pyrite.rasen.tech>","date":"2022-12-23T22:37:50","subject":"Re: [libcamera-devel] [PATCH v9 06/18] libcamera: pipeline: simple:\n\tDon't rely on bufferCount","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Fri, Dec 16, 2022 at 04:17:05PM +0100, Jacopo Mondi wrote:\n> Hi Paul\n> \n> On Fri, Dec 16, 2022 at 09:29:27PM +0900, Paul Elder via libcamera-devel wrote:\n> > From: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> >\n> > Currently the simple pipeline handler relies on bufferCount to decide on\n> > the number of buffers to allocate internally when a converter is in use\n> > and for the number of V4L2 buffer slots to reserve. Instead, the number\n> > of internal buffers should be the minimum required by the pipeline to\n> > keep the requests flowing, in order to avoid wasting memory, while the\n> > number of V4L2 buffer slots should be greater than the expected number\n> > of requests queued by the application, in order to avoid thrashing\n> > dmabuf mappings, which would degrade performance.\n> >\n> > Stop relying on bufferCount for these numbers and instead set them to\n> > appropriate, and independent, constants.\n> >\n> > Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>\n> > Reviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n> > Signed-off-by: Paul Elder <paul.elder@ideasonboard.com>\n> >\n> > ---\n> > Changes in v9:\n> > - rebased\n> >\n> > Changes in v8:\n> > - New\n> > ---\n> >  include/libcamera/internal/converter.h        |  3 ++-\n> >  .../internal/converter/converter_v4l2_m2m.h   |  6 +++--\n> >  .../converter/converter_v4l2_m2m.cpp          | 12 +++++-----\n> >  src/libcamera/pipeline/simple/simple.cpp      | 22 ++++++++++++++-----\n> >  4 files changed, 30 insertions(+), 13 deletions(-)\n> >\n> > diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> > index 834ec5ab..32490fe0 100644\n> > --- a/include/libcamera/internal/converter.h\n> > +++ b/include/libcamera/internal/converter.h\n> > @@ -49,7 +49,8 @@ public:\n> >  \tvirtual int exportBuffers(unsigned int output, unsigned int count,\n> >  \t\t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers) = 0;\n> >\n> > -\tvirtual int start() = 0;\n> > +\tvirtual int start(unsigned int internalBufferCount,\n> > +\t\t\t  unsigned int bufferSlotCount) = 0;\n> >  \tvirtual void stop() = 0;\n> >\n> >  \tvirtual int queueBuffers(FrameBuffer *input,\n> > diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> > index 815916d0..1f471071 100644\n> > --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> > +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> > @@ -50,7 +50,8 @@ public:\n> >  \tint exportBuffers(unsigned int ouput, unsigned int count,\n> >  \t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers);\n> >\n> > -\tint start();\n> > +\tint start(unsigned int internalBufferCount,\n> > +\t\t  unsigned int bufferSlotCount);\n> >  \tvoid stop();\n> >\n> >  \tint queueBuffers(FrameBuffer *input,\n> > @@ -69,7 +70,8 @@ private:\n> >  \t\tint exportBuffers(unsigned int count,\n> >  \t\t\t\t  std::vector<std::unique_ptr<FrameBuffer>> *buffers);\n> >\n> > -\t\tint start();\n> > +\t\tint start(unsigned int internalBufferCount,\n> > +\t\t\t  unsigned int bufferSlotCount);\n> >  \t\tvoid stop();\n> >\n> >  \t\tint queueBuffers(FrameBuffer *input, FrameBuffer *output);\n> > diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > index 2a4d1d99..9d25f25a 100644\n> > --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> > @@ -107,13 +107,14 @@ int V4L2M2MConverter::Stream::exportBuffers(unsigned int count,\n> >  \treturn m2m_->capture()->exportBuffers(count, buffers);\n> >  }\n> >\n> > -int V4L2M2MConverter::Stream::start()\n> > +int V4L2M2MConverter::Stream::start(unsigned int internalBufferCount,\n> > +\t\t\t\t    unsigned int bufferSlotCount)\n> >  {\n> > -\tint ret = m2m_->output()->importBuffers(inputBufferCount_);\n> > +\tint ret = m2m_->output()->importBuffers(internalBufferCount);\n> >  \tif (ret < 0)\n> >  \t\treturn ret;\n> >\n> > -\tret = m2m_->capture()->importBuffers(outputBufferCount_);\n> > +\tret = m2m_->capture()->importBuffers(bufferSlotCount);\n> \n> Are inputBufferCount_ and outputBufferCount_ used anymore ?\n\nNo they're not.\n\n> And to be honest I would keep the names as they are\n\nHm, yeah, good point.\n\n> \n> Also the number of output buffers could be defined by the converter\n> class itself ?\n\nGood idea.\n\n\nPaul\n\n> \n> >  \tif (ret < 0) {\n> >  \t\tstop();\n> >  \t\treturn ret;\n> > @@ -373,12 +374,13 @@ int V4L2M2MConverter::exportBuffers(unsigned int output, unsigned int count,\n> >  /**\n> >   * \\copydoc libcamera::Converter::start\n> >   */\n> > -int V4L2M2MConverter::start()\n> > +int V4L2M2MConverter::start(unsigned int internalBufferCount,\n> > +\t\t\t    unsigned int bufferSlotCount)\n> >  {\n> >  \tint ret;\n> >\n> >  \tfor (Stream &stream : streams_) {\n> > -\t\tret = stream.start();\n> > +\t\tret = stream.start(internalBufferCount, bufferSlotCount);\n> >  \t\tif (ret < 0) {\n> >  \t\t\tstop();\n> >  \t\t\treturn ret;\n> > diff --git a/src/libcamera/pipeline/simple/simple.cpp b/src/libcamera/pipeline/simple/simple.cpp\n> > index 6b7c6d5c..196e5252 100644\n> > --- a/src/libcamera/pipeline/simple/simple.cpp\n> > +++ b/src/libcamera/pipeline/simple/simple.cpp\n> > @@ -339,6 +339,7 @@ protected:\n> >\n> >  private:\n> >  \tstatic constexpr unsigned int kNumInternalBuffers = 3;\n> > +\tstatic constexpr unsigned int kSimpleBufferSlotCount = 16;\n> >\n> >  \tstruct EntityData {\n> >  \t\tstd::unique_ptr<V4L2VideoDevice> video;\n> > @@ -1232,17 +1233,27 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n> >  \t\treturn -EBUSY;\n> >  \t}\n> >\n> > +\t/*\n> > +\t * Number of internal buffers that will be used to move video capture\n> > +\t * device frames to the converter.\n> > +\t *\n> > +\t * \\todo Make this depend on the driver in use instead of being\n> > +\t * hardcoded. In order to not drop frames, the realtime requirements for\n> > +\t * each device should be checked, so it may not be as simple as just\n> > +\t * using the minimum number of buffers required by the driver.\n> > +\t */\n> > +\tstatic constexpr unsigned int internalBufferCount = 3;\n> > +\n> >  \tif (data->useConverter_) {\n> >  \t\t/*\n> >  \t\t * When using the converter allocate a fixed number of internal\n> >  \t\t * buffers.\n> >  \t\t */\n> > -\t\tret = video->allocateBuffers(kNumInternalBuffers,\n> > +\t\tret = video->allocateBuffers(internalBufferCount,\n> >  \t\t\t\t\t     &data->converterBuffers_);\n> >  \t} else {\n> > -\t\t/* Otherwise, prepare for using buffers from the only stream. */\n> > -\t\tStream *stream = &data->streams_[0];\n> > -\t\tret = video->importBuffers(stream->configuration().bufferCount);\n> > +\t\t/* Otherwise, prepare for using buffers. */\n> > +\t\tret = video->importBuffers(kSimpleBufferSlotCount);\n> >  \t}\n> >  \tif (ret < 0) {\n> >  \t\treleasePipeline(data);\n> > @@ -1258,7 +1269,8 @@ int SimplePipelineHandler::start(Camera *camera, [[maybe_unused]] const ControlL\n> >  \t}\n> >\n> >  \tif (data->useConverter_) {\n> > -\t\tret = data->converter_->start();\n> > +\t\tret = data->converter_->start(internalBufferCount,\n> > +\t\t\t\t\t      kSimpleBufferSlotCount);\n> >  \t\tif (ret < 0) {\n> >  \t\t\tstop(camera);\n> >  \t\t\treturn ret;\n> > --\n> > 2.35.1\n> >","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 354A4C3200\n\tfor <parsemail@patchwork.libcamera.org>;\n\tFri, 23 Dec 2022 22:37:58 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id B74C0623B8;\n\tFri, 23 Dec 2022 23:37: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 DF3FD62398\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 23 Dec 2022 23:37:56 +0100 (CET)","from pyrite.rasen.tech (unknown\n\t[IPv6:2604:2d80:ad8a:9000:1bf9:855b:22de:3645])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id ECA4F8B;\n\tFri, 23 Dec 2022 23:37:55 +0100 (CET)"],"DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/simple; d=libcamera.org;\n\ts=mail; t=1671835077;\n\tbh=YkDjcimvda3Yb6trQlHx3FJBG/ndY+4Cl3zojKpXdpM=;\n\th=Date:To:References:In-Reply-To:Subject:List-Id:List-Unsubscribe:\n\tList-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc:\n\tFrom;\n\tb=0kP6hZmnnAbEyvdaj2Fg8Nrbz3rR84Y5teyVa78nZfnS/5iqZU5xs0RZqFrOq/N6S\n\tUaOIDIXYFv3SCCu0JPSAmqtGbCrCnjpSDtGTm485JgYRqVE9UJuTOKfRQwdLDKATZ8\n\tJiPX9NBC/YVuJGNXquVeysdwKpmPe7AykZVZ3mzufWWinga1m0ba5fUWaWrwMEuhAX\n\tOf3IKfKXTgzfP6K94HMkQ0yH0ov9Dyi6oBAdpCXxdzolfh8F8u33dYdZaMuip1VpRy\n\tuGadhNpECy8qkqXHFKorcN7Gk8d7akUS1oRXld3XlVXjOxC1WRFFbrdGNqydk3b6kb\n\tb2e5aj6J2o2QQ==","v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1671835076;\n\tbh=YkDjcimvda3Yb6trQlHx3FJBG/ndY+4Cl3zojKpXdpM=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DrOWBwIOvQ5ppg5hGRkNq05rsf1xI/2TBvInKeAbAVertgVNTAF+GvRlROxMX0OnJ\n\tRTv4oZZQLq8JOdCzp8BfR6tqB8JU3KY95/AJWEmRYiGnAC7I3fqFFAQvMo4yWra4JJ\n\taFEPpaVDm6a9C2Ptx9C3cqntVSrycskycJ4QfXeE="],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key; \n\tunprotected) header.d=ideasonboard.com\n\theader.i=@ideasonboard.com\n\theader.b=\"DrOWBwIO\"; dkim-atps=neutral","Date":"Fri, 23 Dec 2022 16:37:50 -0600","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<Y6Ytvsk4Zsz0SdXF@pyrite.rasen.tech>","References":"<20221216122939.256534-1-paul.elder@ideasonboard.com>\n\t<20221216122939.256534-7-paul.elder@ideasonboard.com>\n\t<20221216151705.ffu2svgavvhqadnn@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20221216151705.ffu2svgavvhqadnn@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v9 06/18] libcamera: pipeline: simple:\n\tDon't rely on bufferCount","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>","From":"Paul Elder via libcamera-devel <libcamera-devel@lists.libcamera.org>","Reply-To":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]