[{"id":36707,"web_url":"https://patchwork.libcamera.org/comment/36707/","msgid":"<176236117199.2116251.1516621692421650973@neptunite.rasen.tech>","date":"2025-11-05T16:46:11","subject":"Re: [PATCH v2 06/35] libcamera: converter: Add V4L2 request support","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Stefan Klug (2025-10-23 23:48:07)\n> Add V4L2 request support to the V4L2M2MConverter class. Extend the\n> functions related to buffer queuing with an optional request parameter\n> that gets passed to the lower layers.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\nLooks good to me.\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> ---\n>  include/libcamera/internal/converter.h               |  4 +++-\n>  .../internal/converter/converter_v4l2_m2m.h          |  6 ++++--\n>  src/libcamera/converter.cpp                          |  3 +++\n>  src/libcamera/converter/converter_v4l2_m2m.cpp       | 12 ++++++++----\n>  4 files changed, 18 insertions(+), 7 deletions(-)\n> \n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 4915af7ac5de..4b811686fcf6 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -22,6 +22,7 @@\n>  #include <libcamera/base/signal.h>\n>  \n>  #include <libcamera/geometry.h>\n> +#include \"libcamera/internal/v4l2_request.h\"\n>  \n>  namespace libcamera {\n>  \n> @@ -79,7 +80,8 @@ public:\n>         virtual void stop() = 0;\n>  \n>         virtual int queueBuffers(FrameBuffer *input,\n> -                                const std::map<const Stream *, FrameBuffer *> &outputs) = 0;\n> +                                const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                                const V4L2Request *request = nullptr) = 0;\n>  \n>         virtual int setInputCrop(const Stream *stream, Rectangle *rect) = 0;\n>         virtual std::pair<Rectangle, Rectangle> inputCropBounds() = 0;\n> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> index d316754040dd..1b2a88c4a608 100644\n> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> @@ -66,7 +66,8 @@ public:\n>                            Alignment align = Alignment::Down) override;\n>  \n>         int queueBuffers(FrameBuffer *input,\n> -                        const std::map<const Stream *, FrameBuffer *> &outputs) override;\n> +                        const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                        const V4L2Request *request = nullptr) override;\n>  \n>         int setInputCrop(const Stream *stream, Rectangle *rect) override;\n>         std::pair<Rectangle, Rectangle> inputCropBounds() override { return inputCropBounds_; }\n> @@ -88,7 +89,8 @@ private:\n>                 int start();\n>                 void stop();\n>  \n> -               int queueBuffers(FrameBuffer *input, FrameBuffer *output);\n> +               int queueBuffers(FrameBuffer *input, FrameBuffer *output,\n> +                                const V4L2Request *request = nullptr);\n>  \n>                 int setInputSelection(unsigned int target, Rectangle *rect);\n>                 int getInputSelection(unsigned int target, Rectangle *rect);\n> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> index 142fb29a1272..ec0a6db6c035 100644\n> --- a/src/libcamera/converter.cpp\n> +++ b/src/libcamera/converter.cpp\n> @@ -205,11 +205,14 @@ Converter::~Converter()\n>   * \\param[in] input The frame buffer to apply the conversion\n>   * \\param[out] outputs The container holding the output stream pointers and\n>   * their respective frame buffer outputs.\n> + * \\param[in] request An optional request\n>   *\n>   * This function queues the \\a input frame buffer on the output streams of the\n>   * \\a outputs map key and retrieve the output frame buffer indicated by the\n>   * buffer map value.\n>   *\n> + * If \\a request is provided the buffers are tied to that request.\n> + *\n>   * \\return 0 on success or a negative error code otherwise\n>   */\n>  \n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index b2bd54f368d8..ff11a9735db7 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -22,6 +22,7 @@\n>  #include <libcamera/stream.h>\n>  \n>  #include \"libcamera/internal/media_device.h\"\n> +#include \"libcamera/internal/v4l2_request.h\"\n>  #include \"libcamera/internal/v4l2_videodevice.h\"\n>  \n>  /**\n> @@ -197,9 +198,11 @@ void V4L2M2MConverter::V4L2M2MStream::stop()\n>         m2m_->output()->releaseBuffers();\n>  }\n>  \n> -int V4L2M2MConverter::V4L2M2MStream::queueBuffers(FrameBuffer *input, FrameBuffer *output)\n> +int V4L2M2MConverter::V4L2M2MStream::queueBuffers(FrameBuffer *input,\n> +                                                 FrameBuffer *output,\n> +                                                 const V4L2Request *request)\n>  {\n> -       int ret = m2m_->output()->queueBuffer(input);\n> +       int ret = m2m_->output()->queueBuffer(input, request);\n>         if (ret < 0)\n>                 return ret;\n>  \n> @@ -696,7 +699,8 @@ int V4L2M2MConverter::validateOutput(StreamConfiguration *cfg, bool *adjusted,\n>   * \\copydoc libcamera::Converter::queueBuffers\n>   */\n>  int V4L2M2MConverter::queueBuffers(FrameBuffer *input,\n> -                                  const std::map<const Stream *, FrameBuffer *> &outputs)\n> +                                  const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                                  const V4L2Request *request)\n>  {\n>         std::set<FrameBuffer *> outputBufs;\n>         int ret;\n> @@ -721,7 +725,7 @@ int V4L2M2MConverter::queueBuffers(FrameBuffer *input,\n>  \n>         /* Queue the input and output buffers to all the streams. */\n>         for (auto [stream, buffer] : outputs) {\n> -               ret = streams_.at(stream)->queueBuffers(input, buffer);\n> +               ret = streams_.at(stream)->queueBuffers(input, buffer, request);\n>                 if (ret < 0)\n>                         return ret;\n>         }\n> -- \n> 2.48.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 3E9AABDE4C\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  5 Nov 2025 16:46:21 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 099DA609DE;\n\tWed,  5 Nov 2025 17:46:21 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 0C2DF609D8\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  5 Nov 2025 17:46:19 +0100 (CET)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:d4d0:27ea:7a74:8a9e])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 3CCB6C71;\n\tWed,  5 Nov 2025 17:44:23 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"IoWxYPb6\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762361064;\n\tbh=P/6pvzmUZ/4M9I48x32K9bvR6XND2CyjmrrzKGahEnU=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=IoWxYPb6Dxuh1nJa23oZ7tXVhYBMwDYM8dsC4/SCYl61a2aqAgh1X9OTDGETXdhMB\n\tlCHDE6D7KvxoZ/5trY3R0fgVjPEctDpjExI24XQklf9nwotN5iMCqVTpBNjlBCG4s9\n\t5TJjEi21Q9tjd+B8ORLZOlTTHirH2CAF4vadN73c=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251023144841.403689-7-stefan.klug@ideasonboard.com>","References":"<20251023144841.403689-1-stefan.klug@ideasonboard.com>\n\t<20251023144841.403689-7-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 06/35] libcamera: converter: Add V4L2 request support","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 06 Nov 2025 01:46:11 +0900","Message-ID":"<176236117199.2116251.1516621692421650973@neptunite.rasen.tech>","User-Agent":"alot/0.0.0","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":36734,"web_url":"https://patchwork.libcamera.org/comment/36734/","msgid":"<176243702687.288410.5425938832646785802@isaac-ThinkPad-T16-Gen-2>","date":"2025-11-06T13:50:26","subject":"Re: [PATCH v2 06/35] libcamera: converter: Add V4L2 request support","submitter":{"id":215,"url":"https://patchwork.libcamera.org/api/people/215/","name":"Isaac Scott","email":"isaac.scott@ideasonboard.com"},"content":"Hi Stefan,\n\nThank you for the patch!\n\n\nQuoting Stefan Klug (2025-10-23 15:48:07)\n> Add V4L2 request support to the V4L2M2MConverter class. Extend the\n> functions related to buffer queuing with an optional request parameter\n> that gets passed to the lower layers.\n> \n> Signed-off-by: Stefan Klug <stefan.klug@ideasonboard.com>\n\nReviewed-by: Isaac Scott <isaac.scott@ideasonboard.com>\n\n> ---\n>  include/libcamera/internal/converter.h               |  4 +++-\n>  .../internal/converter/converter_v4l2_m2m.h          |  6 ++++--\n>  src/libcamera/converter.cpp                          |  3 +++\n>  src/libcamera/converter/converter_v4l2_m2m.cpp       | 12 ++++++++----\n>  4 files changed, 18 insertions(+), 7 deletions(-)\n> \n> diff --git a/include/libcamera/internal/converter.h b/include/libcamera/internal/converter.h\n> index 4915af7ac5de..4b811686fcf6 100644\n> --- a/include/libcamera/internal/converter.h\n> +++ b/include/libcamera/internal/converter.h\n> @@ -22,6 +22,7 @@\n>  #include <libcamera/base/signal.h>\n>  \n>  #include <libcamera/geometry.h>\n> +#include \"libcamera/internal/v4l2_request.h\"\n>  \n>  namespace libcamera {\n>  \n> @@ -79,7 +80,8 @@ public:\n>         virtual void stop() = 0;\n>  \n>         virtual int queueBuffers(FrameBuffer *input,\n> -                                const std::map<const Stream *, FrameBuffer *> &outputs) = 0;\n> +                                const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                                const V4L2Request *request = nullptr) = 0;\n>  \n>         virtual int setInputCrop(const Stream *stream, Rectangle *rect) = 0;\n>         virtual std::pair<Rectangle, Rectangle> inputCropBounds() = 0;\n> diff --git a/include/libcamera/internal/converter/converter_v4l2_m2m.h b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> index d316754040dd..1b2a88c4a608 100644\n> --- a/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> +++ b/include/libcamera/internal/converter/converter_v4l2_m2m.h\n> @@ -66,7 +66,8 @@ public:\n>                            Alignment align = Alignment::Down) override;\n>  \n>         int queueBuffers(FrameBuffer *input,\n> -                        const std::map<const Stream *, FrameBuffer *> &outputs) override;\n> +                        const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                        const V4L2Request *request = nullptr) override;\n>  \n>         int setInputCrop(const Stream *stream, Rectangle *rect) override;\n>         std::pair<Rectangle, Rectangle> inputCropBounds() override { return inputCropBounds_; }\n> @@ -88,7 +89,8 @@ private:\n>                 int start();\n>                 void stop();\n>  \n> -               int queueBuffers(FrameBuffer *input, FrameBuffer *output);\n> +               int queueBuffers(FrameBuffer *input, FrameBuffer *output,\n> +                                const V4L2Request *request = nullptr);\n>  \n>                 int setInputSelection(unsigned int target, Rectangle *rect);\n>                 int getInputSelection(unsigned int target, Rectangle *rect);\n> diff --git a/src/libcamera/converter.cpp b/src/libcamera/converter.cpp\n> index 142fb29a1272..ec0a6db6c035 100644\n> --- a/src/libcamera/converter.cpp\n> +++ b/src/libcamera/converter.cpp\n> @@ -205,11 +205,14 @@ Converter::~Converter()\n>   * \\param[in] input The frame buffer to apply the conversion\n>   * \\param[out] outputs The container holding the output stream pointers and\n>   * their respective frame buffer outputs.\n> + * \\param[in] request An optional request\n>   *\n>   * This function queues the \\a input frame buffer on the output streams of the\n>   * \\a outputs map key and retrieve the output frame buffer indicated by the\n>   * buffer map value.\n>   *\n> + * If \\a request is provided the buffers are tied to that request.\n> + *\n>   * \\return 0 on success or a negative error code otherwise\n>   */\n>  \n> diff --git a/src/libcamera/converter/converter_v4l2_m2m.cpp b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> index b2bd54f368d8..ff11a9735db7 100644\n> --- a/src/libcamera/converter/converter_v4l2_m2m.cpp\n> +++ b/src/libcamera/converter/converter_v4l2_m2m.cpp\n> @@ -22,6 +22,7 @@\n>  #include <libcamera/stream.h>\n>  \n>  #include \"libcamera/internal/media_device.h\"\n> +#include \"libcamera/internal/v4l2_request.h\"\n>  #include \"libcamera/internal/v4l2_videodevice.h\"\n>  \n>  /**\n> @@ -197,9 +198,11 @@ void V4L2M2MConverter::V4L2M2MStream::stop()\n>         m2m_->output()->releaseBuffers();\n>  }\n>  \n> -int V4L2M2MConverter::V4L2M2MStream::queueBuffers(FrameBuffer *input, FrameBuffer *output)\n> +int V4L2M2MConverter::V4L2M2MStream::queueBuffers(FrameBuffer *input,\n> +                                                 FrameBuffer *output,\n> +                                                 const V4L2Request *request)\n>  {\n> -       int ret = m2m_->output()->queueBuffer(input);\n> +       int ret = m2m_->output()->queueBuffer(input, request);\n>         if (ret < 0)\n>                 return ret;\n>  \n> @@ -696,7 +699,8 @@ int V4L2M2MConverter::validateOutput(StreamConfiguration *cfg, bool *adjusted,\n>   * \\copydoc libcamera::Converter::queueBuffers\n>   */\n>  int V4L2M2MConverter::queueBuffers(FrameBuffer *input,\n> -                                  const std::map<const Stream *, FrameBuffer *> &outputs)\n> +                                  const std::map<const Stream *, FrameBuffer *> &outputs,\n> +                                  const V4L2Request *request)\n>  {\n>         std::set<FrameBuffer *> outputBufs;\n>         int ret;\n> @@ -721,7 +725,7 @@ int V4L2M2MConverter::queueBuffers(FrameBuffer *input,\n>  \n>         /* Queue the input and output buffers to all the streams. */\n>         for (auto [stream, buffer] : outputs) {\n> -               ret = streams_.at(stream)->queueBuffers(input, buffer);\n> +               ret = streams_.at(stream)->queueBuffers(input, buffer, request);\n>                 if (ret < 0)\n>                         return ret;\n>         }\n> -- \n> 2.48.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 557D9C3241\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  6 Nov 2025 13:50:32 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 3773260A9D;\n\tThu,  6 Nov 2025 14:50:31 +0100 (CET)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 14CFD606E6\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  6 Nov 2025 14:50:30 +0100 (CET)","from thinkpad.ideasonboard.com\n\t(cpc89244-aztw30-2-0-cust6594.18-1.cable.virginm.net [86.31.185.195])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id DA708BB;\n\tThu,  6 Nov 2025 14:48:34 +0100 (CET)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ejDM4Ikk\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1762436915;\n\tbh=HdxNxKZw3g54XHhIpHeV6p0CVVMiEe4sZeTjMhJVL5g=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=ejDM4IkkLCtfHr7V64KOnt1cl2lFL6a3SArOSE0WVt1Nc9kiYnxzLrLZgEAsZXVKD\n\tiWkOCcDZd/h7QrIYMT76EyQ4f4SheTJmnC1kLSaQhEuKffIvTn47oddWZ38RLVXOmB\n\tUMLG46Zv8w7su8ZRtkIaIlpWzrN9i8FhjS+1Exx4=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20251023144841.403689-7-stefan.klug@ideasonboard.com>","References":"<20251023144841.403689-1-stefan.klug@ideasonboard.com>\n\t<20251023144841.403689-7-stefan.klug@ideasonboard.com>","Subject":"Re: [PATCH v2 06/35] libcamera: converter: Add V4L2 request support","From":"Isaac Scott <isaac.scott@ideasonboard.com>","Cc":"Stefan Klug <stefan.klug@ideasonboard.com>","To":"Stefan Klug <stefan.klug@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Thu, 06 Nov 2025 13:50:26 +0000","Message-ID":"<176243702687.288410.5425938832646785802@isaac-ThinkPad-T16-Gen-2>","User-Agent":"alot/0.10","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>","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]