[{"id":2248,"web_url":"https://patchwork.libcamera.org/comment/2248/","msgid":"<20190714072231.lg5juqmjmttgenc2@uno.localdomain>","date":"2019-07-14T07:22:31","subject":"Re: [libcamera-devel] [PATCH v2 12/16] libcamera: buffer: Add\n\tdmabuf file descriptors","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Laurent,\n   thanks for the update\n\nOn Sat, Jul 13, 2019 at 08:23:47PM +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n>\n> In addition to referencing buffer memory by index, add support to\n> referencing it using dmabuf file descriptors. This will be used to\n> reference buffer memory allocated outside of libcamera and import it.\n>\n> The dmabuf file descriptors are stored in an array in the Buffer class,\n> and a new Stream::createBuffer() overload is added to construct a buffer\n> from dmabuf file descriptor.\n>\n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n>  include/libcamera/buffer.h |  3 +++\n>  include/libcamera/stream.h |  1 +\n>  src/libcamera/buffer.cpp   | 13 ++++++++++-\n>  src/libcamera/request.cpp  |  5 ++++\n>  src/libcamera/stream.cpp   | 47 +++++++++++++++++++++++++++++++++++++-\n>  5 files changed, 67 insertions(+), 2 deletions(-)\n>\n> diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\n> index f5ba6207bcef..f8569a6b67f3 100644\n> --- a/include/libcamera/buffer.h\n> +++ b/include/libcamera/buffer.h\n> @@ -7,6 +7,7 @@\n>  #ifndef __LIBCAMERA_BUFFER_H__\n>  #define __LIBCAMERA_BUFFER_H__\n>\n> +#include <array>\n>  #include <stdint.h>\n>  #include <vector>\n>\n> @@ -75,6 +76,7 @@ public:\n>  \tBuffer &operator=(const Buffer &) = delete;\n>\n>  \tunsigned int index() const { return index_; }\n> +\tconst std::array<int, 3> &dmabufs() const { return dmabuf_; }\n>\n>  \tunsigned int bytesused() const { return bytesused_; }\n>  \tuint64_t timestamp() const { return timestamp_; }\n> @@ -95,6 +97,7 @@ private:\n>  \tvoid setRequest(Request *request) { request_ = request; }\n>\n>  \tunsigned int index_;\n> +\tstd::array<int, 3> dmabuf_;\n>\n>  \tunsigned int bytesused_;\n>  \tuint64_t timestamp_;\n> diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h\n> index 08eb8cc7d5c7..1883d9e9b9c5 100644\n> --- a/include/libcamera/stream.h\n> +++ b/include/libcamera/stream.h\n> @@ -75,6 +75,7 @@ public:\n>  \tStream();\n>\n>  \tstd::unique_ptr<Buffer> createBuffer(unsigned int index);\n> +\tstd::unique_ptr<Buffer> createBuffer(const std::array<int, 3> &fds);\n>\n>  \tBufferPool &bufferPool() { return bufferPool_; }\n>  \tstd::vector<BufferMemory> &buffers() { return bufferPool_.buffers(); }\n> diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\n> index ecbf25246a55..99358633a088 100644\n> --- a/src/libcamera/buffer.cpp\n> +++ b/src/libcamera/buffer.cpp\n> @@ -269,7 +269,8 @@ void BufferPool::destroyBuffers()\n>   * for a stream with Stream::createBuffer().\n>   */\n>  Buffer::Buffer(unsigned int index, const Buffer *metadata)\n> -\t: index_(index), status_(Buffer::BufferSuccess), request_(nullptr),\n> +\t: index_(index), dmabuf_({ -1, -1, -1 }),\n> +\t  status_(Buffer::BufferSuccess), request_(nullptr),\n>  \t  stream_(nullptr)\n>  {\n>  \tif (metadata) {\n> @@ -289,6 +290,16 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n>   * \\return The buffer index\n>   */\n>\n> +/**\n> + * \\fn Buffer::dmabufs()\n> + * \\brief Retrieve the dmabuf file descriptors for all buffer planes\n> + *\n> + * The dmabufs array contains one dmabuf file descriptor per plane. Unused\n> + * entries are set to -1.\n> + *\n> + * \\return The dmabuf file descriptors\n> + */\n> +\n>  /**\n>   * \\fn Buffer::bytesused()\n>   * \\brief Retrieve the number of bytes occupied by the data in the buffer\n> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> index 19131472710b..ee2158fc7a9c 100644\n> --- a/src/libcamera/request.cpp\n> +++ b/src/libcamera/request.cpp\n> @@ -106,10 +106,15 @@ Request::~Request()\n>   *\n>   * \\return 0 on success or a negative error code otherwise\n>   * \\retval -EEXIST The request already contains a buffer for the stream\n> + * \\retval -EINVAL The buffer does not reference a valid Stream\n>   */\n>  int Request::addBuffer(std::unique_ptr<Buffer> buffer)\n>  {\n>  \tStream *stream = buffer->stream();\n> +\tif (!stream) {\n> +\t\tLOG(Request, Error) << \"Invalid stream reference\";\n> +\t\treturn -EINVAL;\n> +\t}\n>\n>  \tauto it = bufferMap_.find(stream);\n>  \tif (it != bufferMap_.end()) {\n> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\n> index 94aa4810f6b9..e6aa1b643a37 100644\n> --- a/src/libcamera/stream.cpp\n> +++ b/src/libcamera/stream.cpp\n> @@ -424,17 +424,26 @@ Stream::Stream()\n>  }\n>\n>  /**\n> - * \\brief Create a Buffer instance\n> + * \\brief Create a Buffer instance referencing the memory buffer \\a index\n>   * \\param[in] index The desired buffer index\n>   *\n>   * This method creates a Buffer instance that references a BufferMemory from\n>   * the stream's buffers pool by its \\a index. The index shall be lower than the\n>   * number of buffers in the pool.\n>   *\n> + * This method is only valid for streams that use the InternalMemory type. It\n> + * will return a null pointer when called on streams using the ExternalMemory\n> + * type.\n> + *\n>   * \\return A newly created Buffer on success or nullptr otherwise\n>   */\n>  std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index)\n>  {\n> +\tif (memoryType_ != InternalMemory) {\n> +\t\tLOG(Stream, Error) << \"Invalid stream memory type\";\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tif (index >= bufferPool_.count()) {\n>  \t\tLOG(Stream, Error) << \"Invalid buffer index \" << index;\n>  \t\treturn nullptr;\n> @@ -447,6 +456,42 @@ std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index)\n>  \treturn std::unique_ptr<Buffer>(buffer);\n>  }\n>\n> +/**\n> + * \\brief Create a Buffer instance that represents a memory area identified by\n> + * dmabuf file descriptors\n> + * \\param[in] fds The dmabuf file descriptors for each plane\n> + *\n> + * This method creates a Buffer instance that references buffer memory\n> + * allocated outside of libcamera through dmabuf file descriptors. The \\a\n> + * dmabuf array shall contain a file descriptor for each plane in the buffer,\n> + * and unused entries shall be set to -1.\n> + *\n> + * The buffer is created without a valid index, as it does not yet map to any of\n> + * the stream's BufferMemory instances. An index will be assigned at the time\n> + * the buffer is queued to the camera in a request. Applications may thus\n> + * create any number of Buffer instances, providing that no more than the\n> + * number of buffers allocated for the stream are queued at any given time.\n> + *\n> + * This method is only valid for streams that use the InternalMemory type. It\n> + * will return a null pointer when called on streams using the ExternalMemory\n> + * type.\n\nIt's actually the other way around!\n\nThanks\n  j\n\n> + *\n> + * \\return A newly created Buffer on success or nullptr otherwise\n> + */\n> +std::unique_ptr<Buffer> Stream::createBuffer(const std::array<int, 3> &fds)\n> +{\n> +\tif (memoryType_ != ExternalMemory) {\n> +\t\tLOG(Stream, Error) << \"Invalid stream memory type\";\n> +\t\treturn nullptr;\n> +\t}\n> +\n> +\tBuffer *buffer = new Buffer();\n> +\tbuffer->dmabuf_ = fds;\n> +\tbuffer->stream_ = this;\n> +\n> +\treturn std::unique_ptr<Buffer>(buffer);\n> +}\n> +\n>  /**\n>   * \\fn Stream::bufferPool()\n>   * \\brief Retrieve the buffer pool for the stream\n> --\n> Regards,\n>\n> Laurent Pinchart\n>\n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay1-d.mail.gandi.net (relay1-d.mail.gandi.net\n\t[217.70.183.193])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 4F58F60E3F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 09:22:02 +0200 (CEST)","from uno.localdomain (softbank126159224182.bbtec.net\n\t[126.159.224.182]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay1-d.mail.gandi.net (Postfix) with ESMTPSA id 2899B24000A;\n\tSun, 14 Jul 2019 07:21:16 +0000 (UTC)"],"X-Originating-IP":"126.159.224.182","Date":"Sun, 14 Jul 2019 09:22:31 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190714072231.lg5juqmjmttgenc2@uno.localdomain>","References":"<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>\n\t<20190713172351.25452-13-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"ryusoz3mn6lfut3w\"","Content-Disposition":"inline","In-Reply-To":"<20190713172351.25452-13-laurent.pinchart@ideasonboard.com>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH v2 12/16] libcamera: buffer: Add\n\tdmabuf file descriptors","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":"Sun, 14 Jul 2019 07:22:02 -0000"}},{"id":2265,"web_url":"https://patchwork.libcamera.org/comment/2265/","msgid":"<20190714105246.GJ31102@wyvern>","date":"2019-07-14T10:52:46","subject":"Re: [libcamera-devel] [PATCH v2 12/16] libcamera: buffer: Add\n\tdmabuf file descriptors","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo and Laurent,\n\nThanks for your patch.\n\nOn 2019-07-13 20:23:47 +0300, Laurent Pinchart wrote:\n> From: Jacopo Mondi <jacopo@jmondi.org>\n> \n> In addition to referencing buffer memory by index, add support to\n> referencing it using dmabuf file descriptors. This will be used to\n> reference buffer memory allocated outside of libcamera and import it.\n> \n> The dmabuf file descriptors are stored in an array in the Buffer class,\n> and a new Stream::createBuffer() overload is added to construct a buffer\n> from dmabuf file descriptor.\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\nReviewed-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n\n> ---\n>  include/libcamera/buffer.h |  3 +++\n>  include/libcamera/stream.h |  1 +\n>  src/libcamera/buffer.cpp   | 13 ++++++++++-\n>  src/libcamera/request.cpp  |  5 ++++\n>  src/libcamera/stream.cpp   | 47 +++++++++++++++++++++++++++++++++++++-\n>  5 files changed, 67 insertions(+), 2 deletions(-)\n> \n> diff --git a/include/libcamera/buffer.h b/include/libcamera/buffer.h\n> index f5ba6207bcef..f8569a6b67f3 100644\n> --- a/include/libcamera/buffer.h\n> +++ b/include/libcamera/buffer.h\n> @@ -7,6 +7,7 @@\n>  #ifndef __LIBCAMERA_BUFFER_H__\n>  #define __LIBCAMERA_BUFFER_H__\n>  \n> +#include <array>\n>  #include <stdint.h>\n>  #include <vector>\n>  \n> @@ -75,6 +76,7 @@ public:\n>  \tBuffer &operator=(const Buffer &) = delete;\n>  \n>  \tunsigned int index() const { return index_; }\n> +\tconst std::array<int, 3> &dmabufs() const { return dmabuf_; }\n>  \n>  \tunsigned int bytesused() const { return bytesused_; }\n>  \tuint64_t timestamp() const { return timestamp_; }\n> @@ -95,6 +97,7 @@ private:\n>  \tvoid setRequest(Request *request) { request_ = request; }\n>  \n>  \tunsigned int index_;\n> +\tstd::array<int, 3> dmabuf_;\n>  \n>  \tunsigned int bytesused_;\n>  \tuint64_t timestamp_;\n> diff --git a/include/libcamera/stream.h b/include/libcamera/stream.h\n> index 08eb8cc7d5c7..1883d9e9b9c5 100644\n> --- a/include/libcamera/stream.h\n> +++ b/include/libcamera/stream.h\n> @@ -75,6 +75,7 @@ public:\n>  \tStream();\n>  \n>  \tstd::unique_ptr<Buffer> createBuffer(unsigned int index);\n> +\tstd::unique_ptr<Buffer> createBuffer(const std::array<int, 3> &fds);\n>  \n>  \tBufferPool &bufferPool() { return bufferPool_; }\n>  \tstd::vector<BufferMemory> &buffers() { return bufferPool_.buffers(); }\n> diff --git a/src/libcamera/buffer.cpp b/src/libcamera/buffer.cpp\n> index ecbf25246a55..99358633a088 100644\n> --- a/src/libcamera/buffer.cpp\n> +++ b/src/libcamera/buffer.cpp\n> @@ -269,7 +269,8 @@ void BufferPool::destroyBuffers()\n>   * for a stream with Stream::createBuffer().\n>   */\n>  Buffer::Buffer(unsigned int index, const Buffer *metadata)\n> -\t: index_(index), status_(Buffer::BufferSuccess), request_(nullptr),\n> +\t: index_(index), dmabuf_({ -1, -1, -1 }),\n> +\t  status_(Buffer::BufferSuccess), request_(nullptr),\n>  \t  stream_(nullptr)\n>  {\n>  \tif (metadata) {\n> @@ -289,6 +290,16 @@ Buffer::Buffer(unsigned int index, const Buffer *metadata)\n>   * \\return The buffer index\n>   */\n>  \n> +/**\n> + * \\fn Buffer::dmabufs()\n> + * \\brief Retrieve the dmabuf file descriptors for all buffer planes\n> + *\n> + * The dmabufs array contains one dmabuf file descriptor per plane. Unused\n> + * entries are set to -1.\n> + *\n> + * \\return The dmabuf file descriptors\n> + */\n> +\n>  /**\n>   * \\fn Buffer::bytesused()\n>   * \\brief Retrieve the number of bytes occupied by the data in the buffer\n> diff --git a/src/libcamera/request.cpp b/src/libcamera/request.cpp\n> index 19131472710b..ee2158fc7a9c 100644\n> --- a/src/libcamera/request.cpp\n> +++ b/src/libcamera/request.cpp\n> @@ -106,10 +106,15 @@ Request::~Request()\n>   *\n>   * \\return 0 on success or a negative error code otherwise\n>   * \\retval -EEXIST The request already contains a buffer for the stream\n> + * \\retval -EINVAL The buffer does not reference a valid Stream\n>   */\n>  int Request::addBuffer(std::unique_ptr<Buffer> buffer)\n>  {\n>  \tStream *stream = buffer->stream();\n> +\tif (!stream) {\n> +\t\tLOG(Request, Error) << \"Invalid stream reference\";\n> +\t\treturn -EINVAL;\n> +\t}\n>  \n>  \tauto it = bufferMap_.find(stream);\n>  \tif (it != bufferMap_.end()) {\n> diff --git a/src/libcamera/stream.cpp b/src/libcamera/stream.cpp\n> index 94aa4810f6b9..e6aa1b643a37 100644\n> --- a/src/libcamera/stream.cpp\n> +++ b/src/libcamera/stream.cpp\n> @@ -424,17 +424,26 @@ Stream::Stream()\n>  }\n>  \n>  /**\n> - * \\brief Create a Buffer instance\n> + * \\brief Create a Buffer instance referencing the memory buffer \\a index\n>   * \\param[in] index The desired buffer index\n>   *\n>   * This method creates a Buffer instance that references a BufferMemory from\n>   * the stream's buffers pool by its \\a index. The index shall be lower than the\n>   * number of buffers in the pool.\n>   *\n> + * This method is only valid for streams that use the InternalMemory type. It\n> + * will return a null pointer when called on streams using the ExternalMemory\n> + * type.\n> + *\n>   * \\return A newly created Buffer on success or nullptr otherwise\n>   */\n>  std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index)\n>  {\n> +\tif (memoryType_ != InternalMemory) {\n> +\t\tLOG(Stream, Error) << \"Invalid stream memory type\";\n> +\t\treturn nullptr;\n> +\t}\n> +\n>  \tif (index >= bufferPool_.count()) {\n>  \t\tLOG(Stream, Error) << \"Invalid buffer index \" << index;\n>  \t\treturn nullptr;\n> @@ -447,6 +456,42 @@ std::unique_ptr<Buffer> Stream::createBuffer(unsigned int index)\n>  \treturn std::unique_ptr<Buffer>(buffer);\n>  }\n>  \n> +/**\n> + * \\brief Create a Buffer instance that represents a memory area identified by\n> + * dmabuf file descriptors\n> + * \\param[in] fds The dmabuf file descriptors for each plane\n> + *\n> + * This method creates a Buffer instance that references buffer memory\n> + * allocated outside of libcamera through dmabuf file descriptors. The \\a\n> + * dmabuf array shall contain a file descriptor for each plane in the buffer,\n> + * and unused entries shall be set to -1.\n> + *\n> + * The buffer is created without a valid index, as it does not yet map to any of\n> + * the stream's BufferMemory instances. An index will be assigned at the time\n> + * the buffer is queued to the camera in a request. Applications may thus\n> + * create any number of Buffer instances, providing that no more than the\n> + * number of buffers allocated for the stream are queued at any given time.\n> + *\n> + * This method is only valid for streams that use the InternalMemory type. It\n> + * will return a null pointer when called on streams using the ExternalMemory\n> + * type.\n> + *\n> + * \\return A newly created Buffer on success or nullptr otherwise\n> + */\n> +std::unique_ptr<Buffer> Stream::createBuffer(const std::array<int, 3> &fds)\n> +{\n> +\tif (memoryType_ != ExternalMemory) {\n> +\t\tLOG(Stream, Error) << \"Invalid stream memory type\";\n> +\t\treturn nullptr;\n> +\t}\n> +\n> +\tBuffer *buffer = new Buffer();\n> +\tbuffer->dmabuf_ = fds;\n> +\tbuffer->stream_ = this;\n> +\n> +\treturn std::unique_ptr<Buffer>(buffer);\n> +}\n> +\n>  /**\n>   * \\fn Stream::bufferPool()\n>   * \\brief Retrieve the buffer pool for the stream\n> -- \n> Regards,\n> \n> Laurent Pinchart\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-pg1-x542.google.com (mail-pg1-x542.google.com\n\t[IPv6:2607:f8b0:4864:20::542])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D3E2C61572\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 12:52:52 +0200 (CEST)","by mail-pg1-x542.google.com with SMTP id i8so6384755pgm.13\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun, 14 Jul 2019 03:52:52 -0700 (PDT)","from localhost (softbank126159224182.bbtec.net. [126.159.224.182])\n\tby smtp.gmail.com with ESMTPSA id\n\tj16sm11214819pjz.31.2019.07.14.03.52.49\n\t(version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256);\n\tSun, 14 Jul 2019 03:52:50 -0700 (PDT)"],"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\t:user-agent; bh=uiHzexmdiMjhaAwKwmwmQAoGv1++n59GzRhObvz8S1A=;\n\tb=CXcx5M7+beMEGSuCSGkcM9+U7q+HQk6kNh2ceY0enZSFa3FlxutMIc5JK8pA2TtAhK\n\t4JPSummDl2/Mfw3/0qHLYIV3bvUDSd2qAp7CxDRd6g6JDje0NuGmG9prclh2KyWyWi0X\n\t/9NcVp6kIlK6h3pIfZt+hnI+B7ToK7VPERMsTB5wzB8qibloj3FnJeAz4S/O4pErHVgK\n\tg++5bkqkMYv0JOvL+T3cC398nM7NQscEa1bg7pNr7XubaFfoOzQIwbJ8+hx0XcnGbvum\n\thXjMHK9EsJvFnC5JlAYbPMRujP0q6Ltq6mmlBSUauxuOlUJf1mXAkiLfZMqaS5h2a3IR\n\teWRg==","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:user-agent;\n\tbh=uiHzexmdiMjhaAwKwmwmQAoGv1++n59GzRhObvz8S1A=;\n\tb=eA1dswJthAa4EWcZMZogdyHXBL64ZwmxdYXFTCQVF9Ykortj8o9YozJOZkp5CAjB+N\n\tH0P4PJhEIBfLdd+VNzO+iX1ZNe/OosvSU2r2/QeGARWZ/96W3alLf7EbWoUdoNszgu3B\n\tPSsq+3vEAP7kdjRYuggct5Sgf2ltI+9IUFXGSfSHGgjR7QZIKjzVoV1akS/+LR60XtP3\n\tuT49+/ruUaSrvKtT7eW3Fqzf50YL8QXoNCPknKxZC09kec6JPaG62LQUsVqJt5St4Uia\n\tT2KQ5t4H+1+c3W4Zqb8DsSKn5Xj9rJiHbyZakHwO1A0v/j4fzz9aLRf+l2hWzEfVYa+U\n\tDy2w==","X-Gm-Message-State":"APjAAAXTToUlE2mFMlSoRmG/zXX0Yiehc4acUSEaHLi2qtCWiZE14J61\n\tsMPsZQxuALiEzJWCI1elCafKxojr1Vo=","X-Google-Smtp-Source":"APXvYqwzbuBaKxoYf8vWVgVFflLt8Uc6HSIk7aysMPKMX0pQEDxMOC1LIHBQJ8cYYk1MoQIgalgD7g==","X-Received":"by 2002:a63:4f45:: with SMTP id\n\tp5mr21424297pgl.326.1563101571427; \n\tSun, 14 Jul 2019 03:52:51 -0700 (PDT)","Date":"Sun, 14 Jul 2019 19:52:46 +0900","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190714105246.GJ31102@wyvern>","References":"<20190713172351.25452-1-laurent.pinchart@ideasonboard.com>\n\t<20190713172351.25452-13-laurent.pinchart@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190713172351.25452-13-laurent.pinchart@ideasonboard.com>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 12/16] libcamera: buffer: Add\n\tdmabuf file descriptors","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":"Sun, 14 Jul 2019 10:52:53 -0000"}}]