[{"id":1113,"web_url":"https://patchwork.libcamera.org/comment/1113/","msgid":"<20190323135745.GI4587@pendragon.ideasonboard.com>","date":"2019-03-23T13:57:45","subject":"Re: [libcamera-devel] [PATCH v4 21/31] RFC: libcamera:\n\tpipeline_handlers: Add preAllocateBuffers","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nThank you for the patch.\n\nOn Wed, Mar 20, 2019 at 05:30:45PM +0100, Jacopo Mondi wrote:\n> Add a preAllocateBuffers virtual method to the PipelineHandler base\n> class and call it before performing per-stream memory allocation.\n> \n> Implement the method in the IPU3 pipeline handler to perform memory\n> allocation on the CIO2 unit and the ImgU input and stat video devices.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/libcamera/camera.cpp                 | 10 ++++-\n>  src/libcamera/include/pipeline_handler.h |  5 +++\n>  src/libcamera/pipeline/ipu3/ipu3.cpp     | 54 ++++++++++++++----------\n>  src/libcamera/pipeline_handler.cpp       | 21 ++++++++-\n>  4 files changed, 66 insertions(+), 24 deletions(-)\n> \n> diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> index 8ee9cc086616..8020dff8f8ea 100644\n> --- a/src/libcamera/camera.cpp\n> +++ b/src/libcamera/camera.cpp\n> @@ -455,6 +455,8 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)\n>   */\n>  int Camera::allocateBuffers()\n>  {\n> +\tint ret;\n> +\n>  \tif (disconnected_)\n>  \t\treturn -ENODEV;\n>  \n> @@ -467,8 +469,14 @@ int Camera::allocateBuffers()\n>  \t\treturn -EINVAL;\n>  \t}\n>  \n> +\tret = pipe_->preAllocateBuffers(this, activeStreams_);\n> +\tif (ret) {\n> +\t\tLOG(Camera, Error) << \"Buffers pre-allocation failed\";\n> +\t\treturn ret;\n> +\t}\n> +\n\nI'm not a big fan of pre/post hooks. I think this should the\nPipelineHandler::allocateBuffers() and PipelineHandler::freeBuffers()\nmethods are not correctly designed. It may be better to give them the\nlist of active streams, moving the loop from Camera to the pipeline\nhandlers. That way pipeline handlers could perform any extra step they\nrequire, and even handle dependencies between allocations for different\nstreams if the need arises.\n\n>  \tfor (Stream *stream : activeStreams_) {\n> -\t\tint ret = pipe_->allocateBuffers(this, stream);\n> +\t\tret = pipe_->allocateBuffers(this, stream);\n>  \t\tif (ret) {\n>  \t\t\tLOG(Camera, Error) << \"Failed to allocate buffers\";\n>  \t\t\tfreeBuffers();\n> diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> index acb376e07030..7ce5b67cc7fc 100644\n> --- a/src/libcamera/include/pipeline_handler.h\n> +++ b/src/libcamera/include/pipeline_handler.h\n> @@ -57,6 +57,11 @@ public:\n>  \tvirtual int configureStreams(Camera *camera,\n>  \t\t\t\t     std::map<Stream *, StreamConfiguration> &config) = 0;\n>  \n> +\tvirtual int preAllocateBuffers(Camera *camera,\n> +\t\t\t\t       const std::set<Stream *> &activeStreams)\n> +\t{\n> +\t\treturn 0;\n> +\t}\n>  \tvirtual int allocateBuffers(Camera *camera, Stream *stream) = 0;\n>  \tvirtual int freeBuffers(Camera *camera, Stream *stream) = 0;\n>  \n> diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> index 0507fc380e68..5f323888d84f 100644\n> --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> @@ -105,6 +105,8 @@ public:\n>  \tint configureStreams(Camera *camera,\n>  \t\t\t     std::map<Stream *, StreamConfiguration> &config) override;\n>  \n> +\tint preAllocateBuffers(Camera *camera,\n> +\t\t\t       const std::set<Stream *> &activeStreams) override;\n>  \tint allocateBuffers(Camera *camera, Stream *stream) override;\n>  \tint freeBuffers(Camera *camera, Stream *stream) override;\n>  \n> @@ -451,40 +453,48 @@ int PipelineHandlerIPU3::configureStreams(Camera *camera,\n>  \treturn 0;\n>  }\n>  \n> -int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream)\n> +int PipelineHandlerIPU3::preAllocateBuffers(Camera *camera,\n> +\t\t\t\t\t    const std::set<Stream *> &activeStreams)\n>  {\n>  \tIPU3CameraData *data = cameraData(camera);\n> -\tV4L2Device *viewfinder = data->imgu->viewfinder;\n> -\tV4L2Device *output = data->imgu->output;\n>  \tV4L2Device *input = data->imgu->input;\n>  \tV4L2Device *cio2 = data->cio2.output;\n>  \tV4L2Device *stat = data->imgu->stat;\n>  \tImgUDevice *imgu = data->imgu;\n>  \tint ret;\n>  \n> -\tif (data->cio2.pool.count() == 0) {\n> -\t\t/* Share buffers between CIO2 output and ImgU input. */\n> -\t\tdata->cio2.pool.createBuffers(IPU3_CIO2_BUFFER_COUNT);\n> -\t\tret = cio2->exportBuffers(&data->cio2.pool);\n> -\t\tif (ret) {\n> -\t\t\tLOG(IPU3, Error) << \"Failed to reserve CIO2 memory\";\n> -\t\t\treturn ret;\n> -\t\t}\n> +\t/* Share buffers between CIO2 output and ImgU input. */\n> +\tdata->cio2.pool.createBuffers(IPU3_CIO2_BUFFER_COUNT);\n> +\tret = cio2->exportBuffers(&data->cio2.pool);\n> +\tif (ret) {\n> +\t\tLOG(IPU3, Error) << \"Failed to reserve CIO2 memory\";\n> +\t\treturn ret;\n> +\t}\n>  \n> -\t\tret = input->importBuffers(&data->cio2.pool);\n> -\t\tif (ret) {\n> -\t\t\tLOG(IPU3, Error) << \"Failed to import ImgU memory\";\n> -\t\t\treturn ret;\n> -\t\t}\n> +\tret = input->importBuffers(&data->cio2.pool);\n> +\tif (ret) {\n> +\t\tLOG(IPU3, Error) << \"Failed to import ImgU memory\";\n> +\t\treturn ret;\n> +\t}\n>  \n> -\t\timgu->statPool.createBuffers(IPU3_IMGU_BUFFER_COUNT);\n> -\t\tret = stat->exportBuffers(&imgu->statPool);\n> -\t\tif (ret) {\n> -\t\t\tLOG(IPU3, Error) << \"Failed to reserve ImgU stat memory\";\n> -\t\t\treturn ret;\n> -\t\t}\n> +\timgu->statPool.createBuffers(IPU3_IMGU_BUFFER_COUNT);\n> +\tret = stat->exportBuffers(&imgu->statPool);\n> +\tif (ret) {\n> +\t\tLOG(IPU3, Error) << \"Failed to reserve ImgU stat memory\";\n> +\t\treturn ret;\n>  \t}\n>  \n> +\treturn 0;\n> +}\n> +\n> +int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream)\n> +{\n> +\tIPU3CameraData *data = cameraData(camera);\n> +\tV4L2Device *viewfinder = data->imgu->viewfinder;\n> +\tV4L2Device *output = data->imgu->output;\n> +\tImgUDevice *imgu = data->imgu;\n> +\tint ret;\n> +\n>  \tif (isOutput(data, stream)) {\n>  \t\t/* Export ImgU output buffers to the stream's pool. */\n>  \t\tret = output->exportBuffers(&stream->bufferPool());\n> diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> index 1a858f2638ce..1f556ed789b6 100644\n> --- a/src/libcamera/pipeline_handler.cpp\n> +++ b/src/libcamera/pipeline_handler.cpp\n> @@ -189,6 +189,24 @@ PipelineHandler::~PipelineHandler()\n>   * \\return 0 on success or a negative error code otherwise\n>   */\n>  \n> +/**\n> + * \\fn PipelineHandler::preAllocateBuffers()\n> + * \\brief Perform operations to prepare for memory allocation. Optional for\n> + * pipeline handlers to implement\n> + * \\param[in] camera The camera the streams belongs to\n> + * \\param[in] activeStreams The set of active streams\n> + *\n> + * If operations to prepare for the per-stream memory allocation are required,\n> + * this virtual method provides an entry point for pipeline handlers to do so.\n> + *\n> + * This method is optional to implement for pipeline handlers, and its intended\n> + * caller is the Camera class, which calls it once before performing per-stream\n> + * memory allocation by calling the PipelineHandler::allocateBuffers() method\n> + * once per each active stream.\n> + *\n> + * \\return 0 on success or a negative error code otherwise\n> + */\n> +\n>  /**\n>   * \\fn PipelineHandler::allocateBuffers()\n>   * \\brief Allocate buffers for a stream\n> @@ -198,7 +216,8 @@ PipelineHandler::~PipelineHandler()\n>   * This method allocates buffers internally in the pipeline handler and\n>   * associates them with the stream's buffer pool.\n>   *\n> - * The intended caller of this method is the Camera class.\n> + * The intended caller of this method is the Camera class which calls it\n> + * once per each active stream.\n>   *\n>   * \\return 0 on success or a negative error code otherwise\n>   */","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id EE75D610B6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 23 Mar 2019 14:57:57 +0100 (CET)","from pendragon.ideasonboard.com\n\t(p5269001-ipngn11702marunouchi.tokyo.ocn.ne.jp [114.158.195.1])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A533549;\n\tSat, 23 Mar 2019 14:57:56 +0100 (CET)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1553349477;\n\tbh=hcd+UJsgXEli7w3hVVCq1KuQhOjIvFTUROl+/vnIZkQ=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=BvG8MBGScFn1J2VDAHyDRMXIaq9Skn+SwcqBW+WEUNlyQop77ThR6jIeyxZTUoXnt\n\tP/CsgYRqLQMAA0e3JDb3uSdEmZkQTl5ogT5WaF19XKA7hPhq4ZIJu4LXEnWdZOyhDB\n\tebVhsdwCxVnyED+aL+ZGtZAQCPOHz7Scb5wdl8+Y=","Date":"Sat, 23 Mar 2019 15:57:45 +0200","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190323135745.GI4587@pendragon.ideasonboard.com>","References":"<20190320163055.22056-1-jacopo@jmondi.org>\n\t<20190320163055.22056-22-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20190320163055.22056-22-jacopo@jmondi.org>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v4 21/31] RFC: libcamera:\n\tpipeline_handlers: Add preAllocateBuffers","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Sat, 23 Mar 2019 13:57:58 -0000"}},{"id":1114,"web_url":"https://patchwork.libcamera.org/comment/1114/","msgid":"<20190323140009.xzeom5swqlqxvm6j@uno.localdomain>","date":"2019-03-23T14:00:09","subject":"Re: [libcamera-devel] [PATCH v4 21/31] RFC: libcamera:\n\tpipeline_handlers: Add preAllocateBuffers","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n\nOn Sat, Mar 23, 2019 at 03:57:45PM +0200, Laurent Pinchart wrote:\n> Hi Jacopo,\n>\n> Thank you for the patch.\n>\n> On Wed, Mar 20, 2019 at 05:30:45PM +0100, Jacopo Mondi wrote:\n> > Add a preAllocateBuffers virtual method to the PipelineHandler base\n> > class and call it before performing per-stream memory allocation.\n> >\n> > Implement the method in the IPU3 pipeline handler to perform memory\n> > allocation on the CIO2 unit and the ImgU input and stat video devices.\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/libcamera/camera.cpp                 | 10 ++++-\n> >  src/libcamera/include/pipeline_handler.h |  5 +++\n> >  src/libcamera/pipeline/ipu3/ipu3.cpp     | 54 ++++++++++++++----------\n> >  src/libcamera/pipeline_handler.cpp       | 21 ++++++++-\n> >  4 files changed, 66 insertions(+), 24 deletions(-)\n> >\n> > diff --git a/src/libcamera/camera.cpp b/src/libcamera/camera.cpp\n> > index 8ee9cc086616..8020dff8f8ea 100644\n> > --- a/src/libcamera/camera.cpp\n> > +++ b/src/libcamera/camera.cpp\n> > @@ -455,6 +455,8 @@ int Camera::configureStreams(std::map<Stream *, StreamConfiguration> &config)\n> >   */\n> >  int Camera::allocateBuffers()\n> >  {\n> > +\tint ret;\n> > +\n> >  \tif (disconnected_)\n> >  \t\treturn -ENODEV;\n> >\n> > @@ -467,8 +469,14 @@ int Camera::allocateBuffers()\n> >  \t\treturn -EINVAL;\n> >  \t}\n> >\n> > +\tret = pipe_->preAllocateBuffers(this, activeStreams_);\n> > +\tif (ret) {\n> > +\t\tLOG(Camera, Error) << \"Buffers pre-allocation failed\";\n> > +\t\treturn ret;\n> > +\t}\n> > +\n>\n> I'm not a big fan of pre/post hooks. I think this should the\n> PipelineHandler::allocateBuffers() and PipelineHandler::freeBuffers()\n> methods are not correctly designed. It may be better to give them the\n> list of active streams, moving the loop from Camera to the pipeline\n> handlers. That way pipeline handlers could perform any extra step they\n> require, and even handle dependencies between allocations for different\n> streams if the need arises.\n>\n\nI agree, I'll do this in v5.\n\nThanks\n  j\n\n> >  \tfor (Stream *stream : activeStreams_) {\n> > -\t\tint ret = pipe_->allocateBuffers(this, stream);\n> > +\t\tret = pipe_->allocateBuffers(this, stream);\n> >  \t\tif (ret) {\n> >  \t\t\tLOG(Camera, Error) << \"Failed to allocate buffers\";\n> >  \t\t\tfreeBuffers();\n> > diff --git a/src/libcamera/include/pipeline_handler.h b/src/libcamera/include/pipeline_handler.h\n> > index acb376e07030..7ce5b67cc7fc 100644\n> > --- a/src/libcamera/include/pipeline_handler.h\n> > +++ b/src/libcamera/include/pipeline_handler.h\n> > @@ -57,6 +57,11 @@ public:\n> >  \tvirtual int configureStreams(Camera *camera,\n> >  \t\t\t\t     std::map<Stream *, StreamConfiguration> &config) = 0;\n> >\n> > +\tvirtual int preAllocateBuffers(Camera *camera,\n> > +\t\t\t\t       const std::set<Stream *> &activeStreams)\n> > +\t{\n> > +\t\treturn 0;\n> > +\t}\n> >  \tvirtual int allocateBuffers(Camera *camera, Stream *stream) = 0;\n> >  \tvirtual int freeBuffers(Camera *camera, Stream *stream) = 0;\n> >\n> > diff --git a/src/libcamera/pipeline/ipu3/ipu3.cpp b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > index 0507fc380e68..5f323888d84f 100644\n> > --- a/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > +++ b/src/libcamera/pipeline/ipu3/ipu3.cpp\n> > @@ -105,6 +105,8 @@ public:\n> >  \tint configureStreams(Camera *camera,\n> >  \t\t\t     std::map<Stream *, StreamConfiguration> &config) override;\n> >\n> > +\tint preAllocateBuffers(Camera *camera,\n> > +\t\t\t       const std::set<Stream *> &activeStreams) override;\n> >  \tint allocateBuffers(Camera *camera, Stream *stream) override;\n> >  \tint freeBuffers(Camera *camera, Stream *stream) override;\n> >\n> > @@ -451,40 +453,48 @@ int PipelineHandlerIPU3::configureStreams(Camera *camera,\n> >  \treturn 0;\n> >  }\n> >\n> > -int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream)\n> > +int PipelineHandlerIPU3::preAllocateBuffers(Camera *camera,\n> > +\t\t\t\t\t    const std::set<Stream *> &activeStreams)\n> >  {\n> >  \tIPU3CameraData *data = cameraData(camera);\n> > -\tV4L2Device *viewfinder = data->imgu->viewfinder;\n> > -\tV4L2Device *output = data->imgu->output;\n> >  \tV4L2Device *input = data->imgu->input;\n> >  \tV4L2Device *cio2 = data->cio2.output;\n> >  \tV4L2Device *stat = data->imgu->stat;\n> >  \tImgUDevice *imgu = data->imgu;\n> >  \tint ret;\n> >\n> > -\tif (data->cio2.pool.count() == 0) {\n> > -\t\t/* Share buffers between CIO2 output and ImgU input. */\n> > -\t\tdata->cio2.pool.createBuffers(IPU3_CIO2_BUFFER_COUNT);\n> > -\t\tret = cio2->exportBuffers(&data->cio2.pool);\n> > -\t\tif (ret) {\n> > -\t\t\tLOG(IPU3, Error) << \"Failed to reserve CIO2 memory\";\n> > -\t\t\treturn ret;\n> > -\t\t}\n> > +\t/* Share buffers between CIO2 output and ImgU input. */\n> > +\tdata->cio2.pool.createBuffers(IPU3_CIO2_BUFFER_COUNT);\n> > +\tret = cio2->exportBuffers(&data->cio2.pool);\n> > +\tif (ret) {\n> > +\t\tLOG(IPU3, Error) << \"Failed to reserve CIO2 memory\";\n> > +\t\treturn ret;\n> > +\t}\n> >\n> > -\t\tret = input->importBuffers(&data->cio2.pool);\n> > -\t\tif (ret) {\n> > -\t\t\tLOG(IPU3, Error) << \"Failed to import ImgU memory\";\n> > -\t\t\treturn ret;\n> > -\t\t}\n> > +\tret = input->importBuffers(&data->cio2.pool);\n> > +\tif (ret) {\n> > +\t\tLOG(IPU3, Error) << \"Failed to import ImgU memory\";\n> > +\t\treturn ret;\n> > +\t}\n> >\n> > -\t\timgu->statPool.createBuffers(IPU3_IMGU_BUFFER_COUNT);\n> > -\t\tret = stat->exportBuffers(&imgu->statPool);\n> > -\t\tif (ret) {\n> > -\t\t\tLOG(IPU3, Error) << \"Failed to reserve ImgU stat memory\";\n> > -\t\t\treturn ret;\n> > -\t\t}\n> > +\timgu->statPool.createBuffers(IPU3_IMGU_BUFFER_COUNT);\n> > +\tret = stat->exportBuffers(&imgu->statPool);\n> > +\tif (ret) {\n> > +\t\tLOG(IPU3, Error) << \"Failed to reserve ImgU stat memory\";\n> > +\t\treturn ret;\n> >  \t}\n> >\n> > +\treturn 0;\n> > +}\n> > +\n> > +int PipelineHandlerIPU3::allocateBuffers(Camera *camera, Stream *stream)\n> > +{\n> > +\tIPU3CameraData *data = cameraData(camera);\n> > +\tV4L2Device *viewfinder = data->imgu->viewfinder;\n> > +\tV4L2Device *output = data->imgu->output;\n> > +\tImgUDevice *imgu = data->imgu;\n> > +\tint ret;\n> > +\n> >  \tif (isOutput(data, stream)) {\n> >  \t\t/* Export ImgU output buffers to the stream's pool. */\n> >  \t\tret = output->exportBuffers(&stream->bufferPool());\n> > diff --git a/src/libcamera/pipeline_handler.cpp b/src/libcamera/pipeline_handler.cpp\n> > index 1a858f2638ce..1f556ed789b6 100644\n> > --- a/src/libcamera/pipeline_handler.cpp\n> > +++ b/src/libcamera/pipeline_handler.cpp\n> > @@ -189,6 +189,24 @@ PipelineHandler::~PipelineHandler()\n> >   * \\return 0 on success or a negative error code otherwise\n> >   */\n> >\n> > +/**\n> > + * \\fn PipelineHandler::preAllocateBuffers()\n> > + * \\brief Perform operations to prepare for memory allocation. Optional for\n> > + * pipeline handlers to implement\n> > + * \\param[in] camera The camera the streams belongs to\n> > + * \\param[in] activeStreams The set of active streams\n> > + *\n> > + * If operations to prepare for the per-stream memory allocation are required,\n> > + * this virtual method provides an entry point for pipeline handlers to do so.\n> > + *\n> > + * This method is optional to implement for pipeline handlers, and its intended\n> > + * caller is the Camera class, which calls it once before performing per-stream\n> > + * memory allocation by calling the PipelineHandler::allocateBuffers() method\n> > + * once per each active stream.\n> > + *\n> > + * \\return 0 on success or a negative error code otherwise\n> > + */\n> > +\n> >  /**\n> >   * \\fn PipelineHandler::allocateBuffers()\n> >   * \\brief Allocate buffers for a stream\n> > @@ -198,7 +216,8 @@ PipelineHandler::~PipelineHandler()\n> >   * This method allocates buffers internally in the pipeline handler and\n> >   * associates them with the stream's buffer pool.\n> >   *\n> > - * The intended caller of this method is the Camera class.\n> > + * The intended caller of this method is the Camera class which calls it\n> > + * once per each active stream.\n> >   *\n> >   * \\return 0 on success or a negative error code otherwise\n> >   */\n>\n> --\n> Regards,\n>\n> Laurent Pinchart","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay4-d.mail.gandi.net (relay4-d.mail.gandi.net\n\t[217.70.183.196])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2A7F5610B6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat, 23 Mar 2019 14:59:29 +0100 (CET)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay4-d.mail.gandi.net (Postfix) with ESMTPSA id AFBADE0003;\n\tSat, 23 Mar 2019 13:59:28 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Sat, 23 Mar 2019 15:00:09 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190323140009.xzeom5swqlqxvm6j@uno.localdomain>","References":"<20190320163055.22056-1-jacopo@jmondi.org>\n\t<20190320163055.22056-22-jacopo@jmondi.org>\n\t<20190323135745.GI4587@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"bc4mjjkptxajcgle\"","Content-Disposition":"inline","In-Reply-To":"<20190323135745.GI4587@pendragon.ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v4 21/31] RFC: libcamera:\n\tpipeline_handlers: Add preAllocateBuffers","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","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>","X-List-Received-Date":"Sat, 23 Mar 2019 13:59:29 -0000"}}]