[{"id":34758,"web_url":"https://patchwork.libcamera.org/comment/34758/","msgid":"<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>","date":"2025-07-01T09:07:35","subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 07. 01. 11:06 keltezéssel, Barnabás Pőcze írta:\n> Process the control list passed to `Camera::start()`, and set\n> the V4L2 controls accordingly.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n\nchanges in v2:\n   * process controls before streamOn()\n\nv1: https://patchwork.libcamera.org/patch/23543/\n\n\n>   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 27 +++++++++++++-------\n>   1 file changed, 18 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index d52b88042..4b5816dfd 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -100,7 +100,7 @@ public:\n>   private:\n>   \tint processControl(const UVCCameraData *data, ControlList *controls,\n>   \t\t\t   unsigned int id, const ControlValue &value);\n> -\tint processControls(UVCCameraData *data, Request *request);\n> +\tint processControls(UVCCameraData *data, const ControlList &reqControls);\n>   \n>   \tbool acquireDevice(Camera *camera) override;\n>   \tvoid releaseDevice(Camera *camera) override;\n> @@ -287,7 +287,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>   \treturn data->video_->exportBuffers(count, buffers);\n>   }\n>   \n> -int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n> +int PipelineHandlerUVC::start(Camera *camera, const ControlList *controls)\n>   {\n>   \tUVCCameraData *data = cameraData(camera);\n>   \tunsigned int count = data->stream_.configuration().bufferCount;\n> @@ -296,13 +296,22 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList\n>   \tif (ret < 0)\n>   \t\treturn ret;\n>   \n> -\tret = data->video_->streamOn();\n> -\tif (ret < 0) {\n> -\t\tdata->video_->releaseBuffers();\n> -\t\treturn ret;\n> +\tif (controls) {\n> +\t\tret = processControls(data, *controls);\n> +\t\tif (ret < 0)\n> +\t\t\tgoto err_release_buffers;\n>   \t}\n>   \n> +\tret = data->video_->streamOn();\n> +\tif (ret < 0)\n> +\t\tgoto err_release_buffers;\n> +\n>   \treturn 0;\n> +\n> +err_release_buffers:\n> +\tdata->video_->releaseBuffers();\n> +\n> +\treturn ret;\n>   }\n>   \n>   void PipelineHandlerUVC::stopDevice(Camera *camera)\n> @@ -412,11 +421,11 @@ int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *c\n>   \treturn 0;\n>   }\n>   \n> -int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n> +int PipelineHandlerUVC::processControls(UVCCameraData *data, const ControlList &reqControls)\n>   {\n>   \tControlList controls(data->video_->controls());\n>   \n> -\tfor (const auto &[id, value] : request->controls())\n> +\tfor (const auto &[id, value] : reqControls)\n>   \t\tprocessControl(data, &controls, id, value);\n>   \n>   \tfor (const auto &ctrl : controls)\n> @@ -444,7 +453,7 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n>   \t\treturn -ENOENT;\n>   \t}\n>   \n> -\tint ret = processControls(data, request);\n> +\tint ret = processControls(data, request->controls());\n>   \tif (ret < 0)\n>   \t\treturn ret;\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 40791C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  1 Jul 2025 09:07:40 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E680268E1B;\n\tTue,  1 Jul 2025 11:07:39 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 19F1D68E16\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Jul 2025 11:07:38 +0200 (CEST)","from [192.168.33.8] (185.221.143.107.nat.pool.zt.hu\n\t[185.221.143.107])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CF747C74\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Jul 2025 11:07:15 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"pF76p2VX\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751360835;\n\tbh=xtdvpWx9HaCKHRNAsFiM+t+RrxkWwOshps4n5cJ+F1Q=;\n\th=Date:Subject:From:To:References:In-Reply-To:From;\n\tb=pF76p2VX0ivtSoDqIo+io3io20Ub9KdEgZiH+VLALzzWoqjzcDn6FXHEc0ghiRMzZ\n\tsd5ypUx9zt6M5P2j/vl6eRAtV7KQ97jwBL0X3KS+F9KpT1956R1ib4rWZHWnkvyDX0\n\ttWGqJPIKyS5f1H8elyrMadQe0HWtYs2/LgUyNQoc=","Message-ID":"<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>","Date":"Tue, 1 Jul 2025 11:07:35 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","To":"libcamera-devel@lists.libcamera.org","References":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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":34759,"web_url":"https://patchwork.libcamera.org/comment/34759/","msgid":"<175136115324.2538045.3207996134251564860@ping.linuxembedded.co.uk>","date":"2025-07-01T09:12:33","subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","submitter":{"id":4,"url":"https://patchwork.libcamera.org/api/people/4/","name":"Kieran Bingham","email":"kieran.bingham@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-07-01 10:06:30)\n> Process the control list passed to `Camera::start()`, and set\n> the V4L2 controls accordingly.\n> \n> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> ---\n>  src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 27 +++++++++++++-------\n>  1 file changed, 18 insertions(+), 9 deletions(-)\n> \n> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> index d52b88042..4b5816dfd 100644\n> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> @@ -100,7 +100,7 @@ public:\n>  private:\n>         int processControl(const UVCCameraData *data, ControlList *controls,\n>                            unsigned int id, const ControlValue &value);\n> -       int processControls(UVCCameraData *data, Request *request);\n> +       int processControls(UVCCameraData *data, const ControlList &reqControls);\n>  \n>         bool acquireDevice(Camera *camera) override;\n>         void releaseDevice(Camera *camera) override;\n> @@ -287,7 +287,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>         return data->video_->exportBuffers(count, buffers);\n>  }\n>  \n> -int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n> +int PipelineHandlerUVC::start(Camera *camera, const ControlList *controls)\n>  {\n>         UVCCameraData *data = cameraData(camera);\n>         unsigned int count = data->stream_.configuration().bufferCount;\n> @@ -296,13 +296,22 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList\n>         if (ret < 0)\n>                 return ret;\n>  \n> -       ret = data->video_->streamOn();\n> -       if (ret < 0) {\n> -               data->video_->releaseBuffers();\n> -               return ret;\n> +       if (controls) {\n> +               ret = processControls(data, *controls);\n> +               if (ret < 0)\n> +                       goto err_release_buffers;\n>         }\n>  \n\nThanks, that ordering is better I think.\n\n\nReviewed-by: Kieran Bingham <kieran.bingham@ideasonboard.com>\n\n> +       ret = data->video_->streamOn();\n> +       if (ret < 0)\n> +               goto err_release_buffers;\n> +\n>         return 0;\n> +\n> +err_release_buffers:\n> +       data->video_->releaseBuffers();\n> +\n> +       return ret;\n>  }\n>  \n>  void PipelineHandlerUVC::stopDevice(Camera *camera)\n> @@ -412,11 +421,11 @@ int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *c\n>         return 0;\n>  }\n>  \n> -int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n> +int PipelineHandlerUVC::processControls(UVCCameraData *data, const ControlList &reqControls)\n>  {\n>         ControlList controls(data->video_->controls());\n>  \n> -       for (const auto &[id, value] : request->controls())\n> +       for (const auto &[id, value] : reqControls)\n>                 processControl(data, &controls, id, value);\n>  \n>         for (const auto &ctrl : controls)\n> @@ -444,7 +453,7 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n>                 return -ENOENT;\n>         }\n>  \n> -       int ret = processControls(data, request);\n> +       int ret = processControls(data, request->controls());\n>         if (ret < 0)\n>                 return ret;\n>  \n> -- \n> 2.50.0\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 D6EF3BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  1 Jul 2025 09:12:39 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E36B868E19;\n\tTue,  1 Jul 2025 11:12:38 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id DC78D61528\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Jul 2025 11:12:36 +0200 (CEST)","from pendragon.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 7FABBC74;\n\tTue,  1 Jul 2025 11:12:14 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"J7klnpaj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751361134;\n\tbh=ZyDZSqFtpYOpxnN7T99emaqUMN56TFBrV2C7qE3ijQ4=;\n\th=In-Reply-To:References:Subject:From:To:Date:From;\n\tb=J7klnpajyDxBiKHeiNgXBq7YBPFy+Zu2IuDwtWYCAtu+l1rFETU2ReVgzxmTgRYs6\n\ttNwqHcFuJBdwG+ZtFvserZ8RCkGDqs2do45yo4IGnPif+z/dF6r0GZ79a1cTZAihps\n\tc7tRHyDmkIma+OGfkjRedraDvctInp0bOknI925k=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>","References":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>","Subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","From":"Kieran Bingham <kieran.bingham@ideasonboard.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Date":"Tue, 01 Jul 2025 10:12:33 +0100","Message-ID":"<175136115324.2538045.3207996134251564860@ping.linuxembedded.co.uk>","User-Agent":"alot/0.9.1","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":34763,"web_url":"https://patchwork.libcamera.org/comment/34763/","msgid":"<zxysmai5tlk6wrnl74jm5fgibbal2of2mf6anb3dlyby2cfdbq@2tb6crw43uqr>","date":"2025-07-01T10:49:43","subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","submitter":{"id":232,"url":"https://patchwork.libcamera.org/api/people/232/","name":"Umang Jain","email":"uajain@igalia.com"},"content":"Hi,\n\nOn Tue, Jul 01, 2025 at 11:07:35AM +0200, Barnabás Pőcze wrote:\n> 2025. 07. 01. 11:06 keltezéssel, Barnabás Pőcze írta:\n> > Process the control list passed to `Camera::start()`, and set\n> > the V4L2 controls accordingly.\n> > \n> > Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n\nLGTM\n\n> > ---\n> \n> changes in v2:\n>   * process controls before streamOn()\n> \n> v1: https://patchwork.libcamera.org/patch/23543/\n\nPaul's R-b tag was not collected on v2.\n\nReviewed-by: Umang Jain <uajain@igalia.com>\n> \n> \n> >   src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 27 +++++++++++++-------\n> >   1 file changed, 18 insertions(+), 9 deletions(-)\n> > \n> > diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > index d52b88042..4b5816dfd 100644\n> > --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> > @@ -100,7 +100,7 @@ public:\n> >   private:\n> >   \tint processControl(const UVCCameraData *data, ControlList *controls,\n> >   \t\t\t   unsigned int id, const ControlValue &value);\n> > -\tint processControls(UVCCameraData *data, Request *request);\n> > +\tint processControls(UVCCameraData *data, const ControlList &reqControls);\n> >   \tbool acquireDevice(Camera *camera) override;\n> >   \tvoid releaseDevice(Camera *camera) override;\n> > @@ -287,7 +287,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n> >   \treturn data->video_->exportBuffers(count, buffers);\n> >   }\n> > -int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n> > +int PipelineHandlerUVC::start(Camera *camera, const ControlList *controls)\n> >   {\n> >   \tUVCCameraData *data = cameraData(camera);\n> >   \tunsigned int count = data->stream_.configuration().bufferCount;\n> > @@ -296,13 +296,22 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList\n> >   \tif (ret < 0)\n> >   \t\treturn ret;\n> > -\tret = data->video_->streamOn();\n> > -\tif (ret < 0) {\n> > -\t\tdata->video_->releaseBuffers();\n> > -\t\treturn ret;\n> > +\tif (controls) {\n> > +\t\tret = processControls(data, *controls);\n> > +\t\tif (ret < 0)\n> > +\t\t\tgoto err_release_buffers;\n> >   \t}\n> > +\tret = data->video_->streamOn();\n> > +\tif (ret < 0)\n> > +\t\tgoto err_release_buffers;\n> > +\n> >   \treturn 0;\n> > +\n> > +err_release_buffers:\n> > +\tdata->video_->releaseBuffers();\n> > +\n> > +\treturn ret;\n> >   }\n> >   void PipelineHandlerUVC::stopDevice(Camera *camera)\n> > @@ -412,11 +421,11 @@ int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *c\n> >   \treturn 0;\n> >   }\n> > -int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n> > +int PipelineHandlerUVC::processControls(UVCCameraData *data, const ControlList &reqControls)\n> >   {\n> >   \tControlList controls(data->video_->controls());\n> > -\tfor (const auto &[id, value] : request->controls())\n> > +\tfor (const auto &[id, value] : reqControls)\n> >   \t\tprocessControl(data, &controls, id, value);\n> >   \tfor (const auto &ctrl : controls)\n> > @@ -444,7 +453,7 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n> >   \t\treturn -ENOENT;\n> >   \t}\n> > -\tint ret = processControls(data, request);\n> > +\tint ret = processControls(data, request->controls());\n> >   \tif (ret < 0)\n> >   \t\treturn ret;\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 C9512C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  1 Jul 2025 10:49:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C6E7168E1E;\n\tTue,  1 Jul 2025 12:49:43 +0200 (CEST)","from fanzine2.igalia.com (fanzine2.igalia.com [213.97.179.56])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 081CE6152A\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Jul 2025 12:49:40 +0200 (CEST)","from [49.36.69.141] (helo=uajain)\n\tby fanzine2.igalia.com with esmtpsa \n\t(Cipher TLS1.3:ECDHE_SECP256R1__RSA_PSS_RSAE_SHA256__AES_256_GCM:256)\n\t(Exim) id 1uWYYV-00AvUe-PU; Tue, 01 Jul 2025 12:49:40 +0200"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=igalia.com header.i=@igalia.com\n\theader.b=\"ECqzs/XG\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=igalia.com;\n\ts=20170329;\n\th=In-Reply-To:Content-Transfer-Encoding:Content-Type:MIME-Version\n\t:References:Message-ID:Subject:Cc:To:From:Date:Sender:Reply-To:Content-ID:\n\tContent-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc\n\t:Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe:\n\tList-Post:List-Owner:List-Archive;\n\tbh=EqIuigKAz8soQ0w90eDhh09C3rOBp2Qol7yvahArlwc=;\n\tb=ECqzs/XGS2HPDo8VeG5uVX5yy+\n\t5OQTXx+P+Rdjk5ajrTcyD5rjORBOdL4hxnfeiiCijYhl7/guO4Qkkrxw6jNKRFmdVotVdpynk/2+g\n\t7r1JDLmvSs6JELwNnpTsSPULgRGCoupQQT9GyMRfwUVRodNx/WTMx3cSgunIL0l1uI6mFUESk18Tv\n\tl0R1kQ1p2cLlQF77FsWx2GHuzHjjKxAML2qiHVEZsocQMKAxY8kJeB77KZPAWtKfl+jUo5tcMUSEp\n\tcT4a9x5GuZp9fuKApA9jD0rYRzm6El6cVNBbDj3yKsT8xhpI1O+/GhAzurSrWuXUaY5swpXWIDp6Q\n\t/Ll2VA5A==;","Date":"Tue, 1 Jul 2025 16:19:43 +0530","From":"Umang Jain <uajain@igalia.com>","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","Message-ID":"<zxysmai5tlk6wrnl74jm5fgibbal2of2mf6anb3dlyby2cfdbq@2tb6crw43uqr>","References":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>\n\t<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>","User-Agent":"NeoMutt/20250510-dirty","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":34765,"web_url":"https://patchwork.libcamera.org/comment/34765/","msgid":"<10410f5d-fee7-48e2-a33b-523bcdea6614@ideasonboard.com>","date":"2025-07-01T11:57:41","subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","submitter":{"id":216,"url":"https://patchwork.libcamera.org/api/people/216/","name":"Barnabás Pőcze","email":"barnabas.pocze@ideasonboard.com"},"content":"2025. 07. 01. 12:49 keltezéssel, Umang Jain írta:\n> Hi,\n> \n> On Tue, Jul 01, 2025 at 11:07:35AM +0200, Barnabás Pőcze wrote:\n>> 2025. 07. 01. 11:06 keltezéssel, Barnabás Pőcze írta:\n>>> Process the control list passed to `Camera::start()`, and set\n>>> the V4L2 controls accordingly.\n>>>\n>>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> \n> LGTM\n> \n>>> ---\n>>\n>> changes in v2:\n>>    * process controls before streamOn()\n>>\n>> v1: https://patchwork.libcamera.org/patch/23543/\n> \n> Paul's R-b tag was not collected on v2.\n\nHmm... I thought the changes were significant enough to omit it;\nI like to err on the side of caution, but maybe they aren't as\nsignificant as I had first thought.\n\n\n> \n> Reviewed-by: Umang Jain <uajain@igalia.com>\n>>\n>>\n>>>    src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 27 +++++++++++++-------\n>>>    1 file changed, 18 insertions(+), 9 deletions(-)\n>>>\n>>> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>>> index d52b88042..4b5816dfd 100644\n>>> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>>> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n>>> @@ -100,7 +100,7 @@ public:\n>>>    private:\n>>>    \tint processControl(const UVCCameraData *data, ControlList *controls,\n>>>    \t\t\t   unsigned int id, const ControlValue &value);\n>>> -\tint processControls(UVCCameraData *data, Request *request);\n>>> +\tint processControls(UVCCameraData *data, const ControlList &reqControls);\n>>>    \tbool acquireDevice(Camera *camera) override;\n>>>    \tvoid releaseDevice(Camera *camera) override;\n>>> @@ -287,7 +287,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n>>>    \treturn data->video_->exportBuffers(count, buffers);\n>>>    }\n>>> -int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n>>> +int PipelineHandlerUVC::start(Camera *camera, const ControlList *controls)\n>>>    {\n>>>    \tUVCCameraData *data = cameraData(camera);\n>>>    \tunsigned int count = data->stream_.configuration().bufferCount;\n>>> @@ -296,13 +296,22 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList\n>>>    \tif (ret < 0)\n>>>    \t\treturn ret;\n>>> -\tret = data->video_->streamOn();\n>>> -\tif (ret < 0) {\n>>> -\t\tdata->video_->releaseBuffers();\n>>> -\t\treturn ret;\n>>> +\tif (controls) {\n>>> +\t\tret = processControls(data, *controls);\n>>> +\t\tif (ret < 0)\n>>> +\t\t\tgoto err_release_buffers;\n>>>    \t}\n>>> +\tret = data->video_->streamOn();\n>>> +\tif (ret < 0)\n>>> +\t\tgoto err_release_buffers;\n>>> +\n>>>    \treturn 0;\n>>> +\n>>> +err_release_buffers:\n>>> +\tdata->video_->releaseBuffers();\n>>> +\n>>> +\treturn ret;\n>>>    }\n>>>    void PipelineHandlerUVC::stopDevice(Camera *camera)\n>>> @@ -412,11 +421,11 @@ int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *c\n>>>    \treturn 0;\n>>>    }\n>>> -int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n>>> +int PipelineHandlerUVC::processControls(UVCCameraData *data, const ControlList &reqControls)\n>>>    {\n>>>    \tControlList controls(data->video_->controls());\n>>> -\tfor (const auto &[id, value] : request->controls())\n>>> +\tfor (const auto &[id, value] : reqControls)\n>>>    \t\tprocessControl(data, &controls, id, value);\n>>>    \tfor (const auto &ctrl : controls)\n>>> @@ -444,7 +453,7 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n>>>    \t\treturn -ENOENT;\n>>>    \t}\n>>> -\tint ret = processControls(data, request);\n>>> +\tint ret = processControls(data, request->controls());\n>>>    \tif (ret < 0)\n>>>    \t\treturn ret;\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 2A6B4BDCBF\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue,  1 Jul 2025 11:57:47 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id E2D7668E25;\n\tTue,  1 Jul 2025 13:57:45 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 447EA68E1E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue,  1 Jul 2025 13:57:45 +0200 (CEST)","from [192.168.33.8] (185.221.143.107.nat.pool.zt.hu\n\t[185.221.143.107])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id C1C5A6BE;\n\tTue,  1 Jul 2025 13:57:22 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"lrzduBOR\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751371042;\n\tbh=f6za8W0CcEYPbCq8x1v6c0PeXWBqVEI69Rs6UODMFMg=;\n\th=Date:Subject:To:Cc:References:From:In-Reply-To:From;\n\tb=lrzduBORH8dfY0RIPnvyZdHb4S3w1L2Vd4gxOMaqcwaYCac1yS7B0Q1tIYuQlHX56\n\tcM5vApVe1WEINsR6g7SkrRwY+gvOhqdw7YFj6HJHSJCPjMErRcF5lV+MuA6knWhdXU\n\t36k1rB3P5ayTtlh83yAuvnGUU4yNDhuAbRPbC3h4=","Message-ID":"<10410f5d-fee7-48e2-a33b-523bcdea6614@ideasonboard.com>","Date":"Tue, 1 Jul 2025 13:57:41 +0200","MIME-Version":"1.0","User-Agent":"Mozilla Thunderbird","Subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","To":"Umang Jain <uajain@igalia.com>","Cc":"libcamera-devel@lists.libcamera.org","References":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>\n\t<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>\n\t<zxysmai5tlk6wrnl74jm5fgibbal2of2mf6anb3dlyby2cfdbq@2tb6crw43uqr>","From":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>","Content-Language":"en-US, hu-HU","In-Reply-To":"<zxysmai5tlk6wrnl74jm5fgibbal2of2mf6anb3dlyby2cfdbq@2tb6crw43uqr>","Content-Type":"text/plain; charset=UTF-8; format=flowed","Content-Transfer-Encoding":"8bit","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":34772,"web_url":"https://patchwork.libcamera.org/comment/34772/","msgid":"<175141845426.3028732.8072882815937060653@neptunite.rasen.tech>","date":"2025-07-02T01:07:34","subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","submitter":{"id":17,"url":"https://patchwork.libcamera.org/api/people/17/","name":"Paul Elder","email":"paul.elder@ideasonboard.com"},"content":"Quoting Barnabás Pőcze (2025-07-01 20:57:41)\n> 2025. 07. 01. 12:49 keltezéssel, Umang Jain írta:\n> > Hi,\n> > \n> > On Tue, Jul 01, 2025 at 11:07:35AM +0200, Barnabás Pőcze wrote:\n> >> 2025. 07. 01. 11:06 keltezéssel, Barnabás Pőcze írta:\n> >>> Process the control list passed to `Camera::start()`, and set\n> >>> the V4L2 controls accordingly.\n> >>>\n> >>> Signed-off-by: Barnabás Pőcze <barnabas.pocze@ideasonboard.com>\n> > \n> > LGTM\n> > \n> >>> ---\n> >>\n> >> changes in v2:\n> >>    * process controls before streamOn()\n> >>\n> >> v1: https://patchwork.libcamera.org/patch/23543/\n> > \n> > Paul's R-b tag was not collected on v2.\n> \n> Hmm... I thought the changes were significant enough to omit it;\n> I like to err on the side of caution, but maybe they aren't as\n\nI feel you.\n\n> significant as I had first thought.\n\nI think it's close enough. If it makes you feel better I can tag it again :)\n\n\nReviewed-by: Paul Elder <paul.elder@ideasonboard.com>\n\n> \n> \n> > \n> > Reviewed-by: Umang Jain <uajain@igalia.com>\n> >>\n> >>\n> >>>    src/libcamera/pipeline/uvcvideo/uvcvideo.cpp | 27 +++++++++++++-------\n> >>>    1 file changed, 18 insertions(+), 9 deletions(-)\n> >>>\n> >>> diff --git a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> >>> index d52b88042..4b5816dfd 100644\n> >>> --- a/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> >>> +++ b/src/libcamera/pipeline/uvcvideo/uvcvideo.cpp\n> >>> @@ -100,7 +100,7 @@ public:\n> >>>    private:\n> >>>     int processControl(const UVCCameraData *data, ControlList *controls,\n> >>>                        unsigned int id, const ControlValue &value);\n> >>> -   int processControls(UVCCameraData *data, Request *request);\n> >>> +   int processControls(UVCCameraData *data, const ControlList &reqControls);\n> >>>     bool acquireDevice(Camera *camera) override;\n> >>>     void releaseDevice(Camera *camera) override;\n> >>> @@ -287,7 +287,7 @@ int PipelineHandlerUVC::exportFrameBuffers(Camera *camera, Stream *stream,\n> >>>     return data->video_->exportBuffers(count, buffers);\n> >>>    }\n> >>> -int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList *controls)\n> >>> +int PipelineHandlerUVC::start(Camera *camera, const ControlList *controls)\n> >>>    {\n> >>>     UVCCameraData *data = cameraData(camera);\n> >>>     unsigned int count = data->stream_.configuration().bufferCount;\n> >>> @@ -296,13 +296,22 @@ int PipelineHandlerUVC::start(Camera *camera, [[maybe_unused]] const ControlList\n> >>>     if (ret < 0)\n> >>>             return ret;\n> >>> -   ret = data->video_->streamOn();\n> >>> -   if (ret < 0) {\n> >>> -           data->video_->releaseBuffers();\n> >>> -           return ret;\n> >>> +   if (controls) {\n> >>> +           ret = processControls(data, *controls);\n> >>> +           if (ret < 0)\n> >>> +                   goto err_release_buffers;\n> >>>     }\n> >>> +   ret = data->video_->streamOn();\n> >>> +   if (ret < 0)\n> >>> +           goto err_release_buffers;\n> >>> +\n> >>>     return 0;\n> >>> +\n> >>> +err_release_buffers:\n> >>> +   data->video_->releaseBuffers();\n> >>> +\n> >>> +   return ret;\n> >>>    }\n> >>>    void PipelineHandlerUVC::stopDevice(Camera *camera)\n> >>> @@ -412,11 +421,11 @@ int PipelineHandlerUVC::processControl(const UVCCameraData *data, ControlList *c\n> >>>     return 0;\n> >>>    }\n> >>> -int PipelineHandlerUVC::processControls(UVCCameraData *data, Request *request)\n> >>> +int PipelineHandlerUVC::processControls(UVCCameraData *data, const ControlList &reqControls)\n> >>>    {\n> >>>     ControlList controls(data->video_->controls());\n> >>> -   for (const auto &[id, value] : request->controls())\n> >>> +   for (const auto &[id, value] : reqControls)\n> >>>             processControl(data, &controls, id, value);\n> >>>     for (const auto &ctrl : controls)\n> >>> @@ -444,7 +453,7 @@ int PipelineHandlerUVC::queueRequestDevice(Camera *camera, Request *request)\n> >>>             return -ENOENT;\n> >>>     }\n> >>> -   int ret = processControls(data, request);\n> >>> +   int ret = processControls(data, request->controls());\n> >>>     if (ret < 0)\n> >>>             return ret;\n> >>\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 DF8B4C3237\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Jul 2025 01:07:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1BA4568E2B;\n\tWed,  2 Jul 2025 03:07:44 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[IPv6:2001:4b98:dc2:55:216:3eff:fef7:d647])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C313A6151E\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Jul 2025 03:07:41 +0200 (CEST)","from neptunite.rasen.tech (unknown\n\t[IPv6:2404:7a81:160:2100:9154:ea38:724c:5268])\n\tby perceval.ideasonboard.com (Postfix) with UTF8SMTPSA id 80E8EC75;\n\tWed,  2 Jul 2025 03:07:18 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"okyGDTVE\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1751418439;\n\tbh=p58vxTpgsMo4mOKh0L+ZUOybBL4g5Fb5N3QUizSBrKk=;\n\th=In-Reply-To:References:Subject:From:Cc:To:Date:From;\n\tb=okyGDTVEIeImi9yndvkl6H7AlJ4H12eyH1NnQ5KIKpFooFFHLVBT4O3LetOO4mSH3\n\t/9ydVCinovLFX7kWeAY4jf5orIzx6SUi0CNo9IqksICfD4anyM4Wyb9TF2O+qWDmGi\n\tnHalYp4PYYT+Z43II3PAaqOrAewc7mPwRBxYsqE0=","Content-Type":"text/plain; charset=\"utf-8\"","MIME-Version":"1.0","Content-Transfer-Encoding":"quoted-printable","In-Reply-To":"<10410f5d-fee7-48e2-a33b-523bcdea6614@ideasonboard.com>","References":"<20250701090630.2654208-1-barnabas.pocze@ideasonboard.com>\n\t<f7fcda02-4a01-4f34-893b-ac20833dc7a7@ideasonboard.com>\n\t<zxysmai5tlk6wrnl74jm5fgibbal2of2mf6anb3dlyby2cfdbq@2tb6crw43uqr>\n\t<10410f5d-fee7-48e2-a33b-523bcdea6614@ideasonboard.com>","Subject":"Re: [PATCH v2] libcamera: pipeline: uvcvideo: Handle controls during\n\tstartup","From":"Paul Elder <paul.elder@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","To":"=?utf-8?q?Barnab=C3=A1s_P=C5=91cze?= <barnabas.pocze@ideasonboard.com>,\n\tUmang Jain <uajain@igalia.com>","Date":"Wed, 02 Jul 2025 10:07:34 +0900","Message-ID":"<175141845426.3028732.8072882815937060653@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>"}}]