[{"id":31425,"web_url":"https://patchwork.libcamera.org/comment/31425/","msgid":"<20240926220406.GA27534@pendragon.ideasonboard.com>","date":"2024-09-26T22:04:06","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jaslo,\n\nI think this series is close to being ready, and I would be very happy\nto merge this much awaited feature. Do you plan to send a v3 ?\n\nOn Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> Hi everyone,\n> \n> this is the second version of the patch set to implement gstreamer controls\n> from the yaml files.\n> This now depends on \"[PATCH 00/10] libcamera: Improve code generation for\n> controls\" for the code generation.\n> \n> The following things changed:\n> \n> The (old) third commit fixing a typo has been removed as it is already merged.\n> \n> The first commit is new: it removes the auto-focus-mode property from the\n> device provider where it has been added on accident.\n> \n> The commit message has been updated in the second commit.\n> \n> The third commit, which adds the code that generates the gstreamer controls,\n> now makes use of jinja2 and the new controls.py file. As a consequence the\n> whole code generation has been redone.\n> \n> There are also some new features:\n> \n> It is now possible to read the metadata returned by requests from the gstreamer\n> properties. This is done using a new function readMetadata() which reads the\n> ControlList in requestCompleted().\n> \n> Before a control is set it is now checked whether this control is actually\n> supported by the camera. This is done by checking the cameras ControlInfoMap.\n> \n> The Rectangle type is now supported.\n> \n> Some checks were added to make sure the arrays passed to the element have the\n> correct length.\n> \n> Best regards,\n> \n> Jaslo\n> \n> Jaslo Ziska (3):\n>   gstreamer: Remove auto-focus-mode property from device provider\n>   gstreamer: Remove auto-focus-mode property from libcamerasrc\n>   gstreamer: Generate controls from control_ids_*.yaml files\n> \n>  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n>  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n>  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n>  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n>  src/gstreamer/meson.build                  |  10 +\n>  utils/codegen/controls.py                  |   8 +\n>  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n>  utils/codegen/meson.build                  |   1 +\n>  8 files changed, 528 insertions(+), 46 deletions(-)\n>  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n>  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n>  create mode 100755 utils/codegen/gen-gst-controls.py","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 2DF10C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 26 Sep 2024 22:04:13 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 1AA0E6350F;\n\tFri, 27 Sep 2024 00:04:12 +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 4A3E4634F4\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 27 Sep 2024 00:04:09 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id BCDE322F;\n\tFri, 27 Sep 2024 00:02:40 +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=\"AVTSFjFe\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727388161;\n\tbh=ROCScTbjGt+serLzkqdy3Wz6uAKx7GgwtfWmAOwmd7s=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=AVTSFjFeZfyRjcu2fbUWKJ/2ptgADlwgVOftitxXfx06rjDZ77LHatcdJRSINSNaE\n\tuB49+DdnpeX9sOOT06bdNJoCxEsgV4bQ/q0lHyisbBopcNvaDT+GbjmIBwtiOzFaeR\n\tl4CD5j6/6hx017lkTgoSKOz1bHk3jKEU1aj4Gyqk=","Date":"Fri, 27 Sep 2024 01:04:06 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jaslo Ziska <jaslo@ziska.de>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","Message-ID":"<20240926220406.GA27534@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","In-Reply-To":"<20240813124722.22425-1-jaslo@ziska.de>","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":31464,"web_url":"https://patchwork.libcamera.org/comment/31464/","msgid":"<8734lhzeti.fsf@ziska.de>","date":"2024-09-30T09:11:21","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":173,"url":"https://patchwork.libcamera.org/api/people/173/","name":"Jaslo Ziska","email":"jaslo@ziska.de"},"content":"Hi Laurent,\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> Hi Jaslo,\n>\n> I think this series is close to being ready, and I would be very \n> happy\n> to merge this much awaited feature. Do you plan to send a v3 ?\n\nYes, I very much plan on continuing to work on this. I was a \npretty busy the past month but I should have more time later in \nOctober.\n\nUnfortunately, I don't think that the series is quite ready. \nNicolas had requested some bigger changes in v1 which still need \nto be discussed and implemented and I also want to add the \nreadable/writeable and minimum/maximum properties to the yaml \nfiles (although this could also be done separately after merging).\n\nBest regards,\n\nJaslo\n\n> On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n>> Hi everyone,\n>> \n>> this is the second version of the patch set to implement \n>> gstreamer controls\n>> from the yaml files.\n>> This now depends on \"[PATCH 00/10] libcamera: Improve code \n>> generation for\n>> controls\" for the code generation.\n>> \n>> The following things changed:\n>> \n>> The (old) third commit fixing a typo has been removed as it is \n>> already merged.\n>> \n>> The first commit is new: it removes the auto-focus-mode \n>> property from the\n>> device provider where it has been added on accident.\n>> \n>> The commit message has been updated in the second commit.\n>> \n>> The third commit, which adds the code that generates the \n>> gstreamer controls,\n>> now makes use of jinja2 and the new controls.py file. As a \n>> consequence the\n>> whole code generation has been redone.\n>> \n>> There are also some new features:\n>> \n>> It is now possible to read the metadata returned by requests \n>> from the gstreamer\n>> properties. This is done using a new function readMetadata() \n>> which reads the\n>> ControlList in requestCompleted().\n>> \n>> Before a control is set it is now checked whether this control \n>> is actually\n>> supported by the camera. This is done by checking the cameras \n>> ControlInfoMap.\n>> \n>> The Rectangle type is now supported.\n>> \n>> Some checks were added to make sure the arrays passed to the \n>> element have the\n>> correct length.\n>> \n>> Best regards,\n>> \n>> Jaslo\n>> \n>> Jaslo Ziska (3):\n>>   gstreamer: Remove auto-focus-mode property from device \n>>   provider\n>>   gstreamer: Remove auto-focus-mode property from libcamerasrc\n>>   gstreamer: Generate controls from control_ids_*.yaml files\n>> \n>>  src/gstreamer/gstlibcamera-controls.cpp.in | 296 \n>>  +++++++++++++++++++++\n>>  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n>>  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n>>  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n>>  src/gstreamer/meson.build                  |  10 +\n>>  utils/codegen/controls.py                  |   8 +\n>>  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n>>  utils/codegen/meson.build                  |   1 +\n>>  8 files changed, 528 insertions(+), 46 deletions(-)\n>>  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n>>  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n>>  create mode 100755 utils/codegen/gen-gst-controls.py","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 1E69AC3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Sep 2024 09:11:26 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 82CAE63517;\n\tMon, 30 Sep 2024 11:11:25 +0200 (CEST)","from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[81.169.146.160])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id C10916350F\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Sep 2024 11:11:23 +0200 (CEST)","from archlinux by smtp.strato.de (RZmta 51.2.8 AUTH)\n\twith ESMTPSA id z4431f08U9BMaLe\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tMon, 30 Sep 2024 11:11:22 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ziska.de header.i=@ziska.de header.b=\"qlIsagZF\";\n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"l/8oBH3c\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1727687482; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=P6g3LKiXTN5CqWbI9dIX+jBQsMPCtpwRHvWJ7+r/Li9AigvB/dyr7U+ZawTwa1Iggv\n\t0j2KDNUxJb2XtncWv6cCqS9TRglyzlf3Y6sDTw9vo31w6zoA/u7e/s0/nQ83E60cZT4r\n\tqTsH770bMPebV24xZJc0SBCX0zHSz+eWFxpdYbLg0yx3ZrYJ1lCBRr+D2B9feuTDGO+3\n\tPEUOAzok9TE2FwezM+olzxdrg6gDS2yP9eXX4JtNxS/vG+UpzdatSIR7xLCl5qNnVQyi\n\tE1goAejhKEmkf/FzwOYxJw9/y/PNiwp+uSw2PBciDQl8dgO5JPiC/qPHbX+9u5dlPB/q\n\tNiUw==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; t=1727687482;\n\ts=strato-dkim-0002; d=strato.com;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=E8QMsV2FJGUV+W0xuSxUUSlqGfF0z9yGDnxJn0yk9hQ=;\n\tb=VCPSVJ0EBWTKMWMlNgUIMGUpewnP1E0u/APLHhbBq51473XG0nVR8FFVHcSpSWtEFB\n\tVudqO68ITLnA3vtriokECnspcKCICcjkQd3UXMS8t+lel0ahrdIXWqdSZ1y+G9c72BFE\n\ttf+k9n+hZfZCrQjHcB8aoKQMDuHAZe8BqFJSfvAxNKDRkuhhMB9bWRq8VSrT5feMgm/0\n\tHdb5bev583UZgoRS5x025e8F5lH+H4yfeF6aS9iojlnJapmCiTdETPE6ii48MYwWw6Mb\n\tWT6vcWgKHriOvqa4EUTJ9snQ98IWP8QownwaOmdMJ/prXae/8GTzUw3ezZNlNuRMZX/x\n\t3frw==","ARC-Authentication-Results":"i=1; strato.com;\n    arc=none;\n    dkim=none","X-RZG-CLASS-ID":"mo00","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; t=1727687482;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=E8QMsV2FJGUV+W0xuSxUUSlqGfF0z9yGDnxJn0yk9hQ=;\n\tb=qlIsagZFaJTrAfGeYd2EWTF3LQUP+8NjUT/71i7lwPEyX7zpAvDCTwn5600IiFkc0O\n\tH1PJzqSB/3WHF1faCwICDRQvtFSSgBUf2CRtLD/2gzV82dTgh3dumK4cS9k/Ohc5VxV9\n\tO1zl6Yb0+rOWSI4T7ZkZxjeuftZWxzACPtlbFx7245ELmmfzL7fn3N0ifVVY1L7fVjH8\n\t40NFaD5zR28scPX/rSiHz5Of8Fk3/DU7Et6OrbF7aHBDM+LmV569d705GgwZY8RVeH+r\n\tuFlCxi3u2cPEpz94iaB+UQK6sJoFpb557Z2hnuAz0jrp4gmmqXUTyqiUC95ffLew3ISo\n\tsxHw==","v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1727687482;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=E8QMsV2FJGUV+W0xuSxUUSlqGfF0z9yGDnxJn0yk9hQ=;\n\tb=l/8oBH3cdEVStetjR4T6SQYLl61WrYflW8MZxVzCAdjDR9S/YyUbzzlXTLQ00noLIC\n\tYuHfoUlD91WqLvJtCyCw=="],"X-RZG-AUTH":"\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cE0oq6VPJa3xgc3f/LZxDMZstuYpMJAb/dgTGp\"","From":"Jaslo Ziska <jaslo@ziska.de>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","In-Reply-To":"<20240926220406.GA27534@pendragon.ideasonboard.com> (Laurent\n\tPinchart's message of \"Fri, 27 Sep 2024 01:04:06 +0300\")","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>","Date":"Mon, 30 Sep 2024 11:11:21 +0200","Message-ID":"<8734lhzeti.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; format=flowed","Content-Transfer-Encoding":"7bit","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":31469,"web_url":"https://patchwork.libcamera.org/comment/31469/","msgid":"<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>","date":"2024-09-30T14:42:26","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Hi,\n\nLe lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> Hi Laurent,\n> \n> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > Hi Jaslo,\n> > \n> > I think this series is close to being ready, and I would be very \n> > happy\n> > to merge this much awaited feature. Do you plan to send a v3 ?\n> \n> Yes, I very much plan on continuing to work on this. I was a \n> pretty busy the past month but I should have more time later in \n> October.\n> \n> Unfortunately, I don't think that the series is quite ready. \n> Nicolas had requested some bigger changes in v1 which still need \n> to be discussed and implemented and I also want to add the \n> readable/writeable and minimum/maximum properties to the yaml \n> files (although this could also be done separately after merging).\n\nMy proposal is to program a subset to be exposed as properties, the one that are\nobviously usable and that the documentation make sense. I think you did a great\njob on the generator and adding features later to support controls that have\nmore complex semantic is better then trying to support them all in one go today.\n\nIf the selection is all rw, the marking of that can wait. Min/max would be my\npreference to have, but as we are breaking the API anyway still, we can also do\nsmall break in the gstreamer element later too (as long as its well reported in\nthe release notes).\n\nNicolas \n\n> \n> Best regards,\n> \n> Jaslo\n> \n> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> > > Hi everyone,\n> > > \n> > > this is the second version of the patch set to implement \n> > > gstreamer controls\n> > > from the yaml files.\n> > > This now depends on \"[PATCH 00/10] libcamera: Improve code \n> > > generation for\n> > > controls\" for the code generation.\n> > > \n> > > The following things changed:\n> > > \n> > > The (old) third commit fixing a typo has been removed as it is \n> > > already merged.\n> > > \n> > > The first commit is new: it removes the auto-focus-mode \n> > > property from the\n> > > device provider where it has been added on accident.\n> > > \n> > > The commit message has been updated in the second commit.\n> > > \n> > > The third commit, which adds the code that generates the \n> > > gstreamer controls,\n> > > now makes use of jinja2 and the new controls.py file. As a \n> > > consequence the\n> > > whole code generation has been redone.\n> > > \n> > > There are also some new features:\n> > > \n> > > It is now possible to read the metadata returned by requests \n> > > from the gstreamer\n> > > properties. This is done using a new function readMetadata() \n> > > which reads the\n> > > ControlList in requestCompleted().\n> > > \n> > > Before a control is set it is now checked whether this control \n> > > is actually\n> > > supported by the camera. This is done by checking the cameras \n> > > ControlInfoMap.\n> > > \n> > > The Rectangle type is now supported.\n> > > \n> > > Some checks were added to make sure the arrays passed to the \n> > > element have the\n> > > correct length.\n> > > \n> > > Best regards,\n> > > \n> > > Jaslo\n> > > \n> > > Jaslo Ziska (3):\n> > >   gstreamer: Remove auto-focus-mode property from device \n> > >   provider\n> > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> > >   gstreamer: Generate controls from control_ids_*.yaml files\n> > > \n> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 \n> > >  +++++++++++++++++++++\n> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> > >  src/gstreamer/meson.build                  |  10 +\n> > >  utils/codegen/controls.py                  |   8 +\n> > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> > >  utils/codegen/meson.build                  |   1 +\n> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 E9699C0F1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tMon, 30 Sep 2024 14:42:31 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id BA93D63512;\n\tMon, 30 Sep 2024 16:42:30 +0200 (CEST)","from mail-qt1-x835.google.com (mail-qt1-x835.google.com\n\t[IPv6:2607:f8b0:4864:20::835])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A91F863502\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Sep 2024 16:42:28 +0200 (CEST)","by mail-qt1-x835.google.com with SMTP id\n\td75a77b69052e-4583209a17dso46309041cf.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 30 Sep 2024 07:42:28 -0700 (PDT)","from nicolas-tpx395.lan ([2606:6d00:15:862e::580])\n\tby smtp.gmail.com with ESMTPSA id\n\td75a77b69052e-45c9f2b6c96sm36691861cf.25.2024.09.30.07.42.26\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tMon, 30 Sep 2024 07:42:26 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=ndufresne-ca.20230601.gappssmtp.com\n\theader.i=@ndufresne-ca.20230601.gappssmtp.com\n\theader.b=\"W3vP4s3z\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1727707347;\n\tx=1728312147; darn=lists.libcamera.org; \n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=ya43P2ANKyw9LkPqhYVst1NCE78Lko8jYtUjQbgMhMk=;\n\tb=W3vP4s3zxYOgfuCx1EdIuU1DKfBbHckt6OzzMZfaafoMvy3yvm/QALRZYNwmvrh8rU\n\t4rWdgNk/oK6nhINBfwozu5pTbr1PPOaZj6VEcGkAuKpZEn9mYKk8q5lgxWSoltG/SySm\n\tIC1kxeQMPHlo15UQn7Ps9zaT95nk7PS2JlPs7CcAVNYyDydO5ApLh9ipf9b+ibg00yJ3\n\tNkw9PYjjoiPsEtafs0C7h/UItONk41cFYB6ZzDQ1O+JaWhje5+ZNxqL387Hxj63/MdP5\n\tfie4OkOp2f+cIMoqSGO2/Ifm3U3xscK27PUfgCGzJkf9n1CeEHUTm5rmjwIwZwTQW6If\n\t3GdQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1727707347; x=1728312147;\n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=ya43P2ANKyw9LkPqhYVst1NCE78Lko8jYtUjQbgMhMk=;\n\tb=du1nfjTdb363eupGZ47+U2dSEFUEiMRmsN2VPRIiUockeW/cYvK9tSpViwtPfRZZZ/\n\tKy6sQDShaJ818VX2wXhuWnohoj9bzCLoO2Uqcs2eBa2DZn+mRMXSId4KZKLStBWegBRs\n\tjRS/pTxfhAqtF8qDQxzhVYf0vBYfKg4LyjBn0oJAx8/Bczuy+nN9SJ1KEmFy6oldS6gt\n\tl5Wek/26IBswz66ughqIB9w8AKF6X1DKnBvHvNRgi3lEnjWZWS3mTQ3wJoNT6+Hzg0Yf\n\ttm6mDETJHV74r8rKjqbK3V0pZr3dzT9SP+Z/10nOWise1dX3d90L5turUH9+wZqo3eQ5\n\tjPig==","X-Gm-Message-State":"AOJu0YwSt7P+2h5TbPKtMQZAUyyYcDWFydUR8Ch13nEo84ghATrd3Ufa\n\tCnyRSUgxfioXNCE/4ZnBqUaCX22ywGRlM5Qzm5KDPfWwOaweSFePEZsO5Ua6ybXooIoAotiDJQN\n\tT","X-Google-Smtp-Source":"AGHT+IHd7v5JrMlcl5+Ho6LA3z0CuMFbKg2x1Zfn06AXPhJGnkNSHFDousAgbcL622U/6eyDIglIXQ==","X-Received":"by 2002:a05:622a:306:b0:453:74cc:ce09 with SMTP id\n\td75a77b69052e-45c9f1d6da2mr188482331cf.8.1727707347427; \n\tMon, 30 Sep 2024 07:42:27 -0700 (PDT)","Message-ID":"<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","From":"Nicolas Dufresne <nicolas@ndufresne.ca>","To":"Jaslo Ziska <jaslo@ziska.de>, Laurent Pinchart\n\t<laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Date":"Mon, 30 Sep 2024 10:42:26 -0400","In-Reply-To":"<8734lhzeti.fsf@ziska.de>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.52.4 (3.52.4-1.fc40) ","MIME-Version":"1.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":31519,"web_url":"https://patchwork.libcamera.org/comment/31519/","msgid":"<87h69u3jon.fsf@ziska.de>","date":"2024-10-02T10:04:08","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":173,"url":"https://patchwork.libcamera.org/api/people/173/","name":"Jaslo Ziska","email":"jaslo@ziska.de"},"content":"Hi Nicolas,\n\nNicolas Dufresne <nicolas@ndufresne.ca> writes:\n> Hi,\n>\n> Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n>> Hi Laurent,\n>> \n>> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n>> > Hi Jaslo,\n>> > \n>> > I think this series is close to being ready, and I would be \n>> > very \n>> > happy\n>> > to merge this much awaited feature. Do you plan to send a v3 \n>> > ?\n>> \n>> Yes, I very much plan on continuing to work on this. I was a \n>> pretty busy the past month but I should have more time later in \n>> October.\n>> \n>> Unfortunately, I don't think that the series is quite ready. \n>> Nicolas had requested some bigger changes in v1 which still \n>> need \n>> to be discussed and implemented and I also want to add the \n>> readable/writeable and minimum/maximum properties to the yaml \n>> files (although this could also be done separately after \n>> merging).\n>\n> My proposal is to program a subset to be exposed as properties, \n> the one that are\n> obviously usable and that the documentation make sense. I think \n> you did a great\n> job on the generator and adding features later to support \n> controls that have\n> more complex semantic is better then trying to support them all \n> in one go today.\n\nSounds good. Where would you suggest the list of controls to be \nexposed should be? Maybe just a plain list in the Python generator \nfile?\n\n> If the selection is all rw, the marking of that can wait. \n> Min/max would be my\n> preference to have, but as we are breaking the API anyway still, \n> we can also do\n> small break in the gstreamer element later too (as long as its \n> well reported in\n> the release notes).\n\nYou also suggested a GStreamer property that returns a \nGstStructure which lists all the actually present controls for the \ncamera and their actual limits. Do you still want this implemented \nand if so how do you imagine this structure to be laid out?\n\nBest regards,\n\nJaslo\n\n>\n> Nicolas \n>\n>> \n>> Best regards,\n>> \n>> Jaslo\n>> \n>> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n>> > > Hi everyone,\n>> > > \n>> > > this is the second version of the patch set to implement \n>> > > gstreamer controls\n>> > > from the yaml files.\n>> > > This now depends on \"[PATCH 00/10] libcamera: Improve code \n>> > > generation for\n>> > > controls\" for the code generation.\n>> > > \n>> > > The following things changed:\n>> > > \n>> > > The (old) third commit fixing a typo has been removed as it \n>> > > is \n>> > > already merged.\n>> > > \n>> > > The first commit is new: it removes the auto-focus-mode \n>> > > property from the\n>> > > device provider where it has been added on accident.\n>> > > \n>> > > The commit message has been updated in the second commit.\n>> > > \n>> > > The third commit, which adds the code that generates the \n>> > > gstreamer controls,\n>> > > now makes use of jinja2 and the new controls.py file. As a \n>> > > consequence the\n>> > > whole code generation has been redone.\n>> > > \n>> > > There are also some new features:\n>> > > \n>> > > It is now possible to read the metadata returned by \n>> > > requests \n>> > > from the gstreamer\n>> > > properties. This is done using a new function \n>> > > readMetadata() \n>> > > which reads the\n>> > > ControlList in requestCompleted().\n>> > > \n>> > > Before a control is set it is now checked whether this \n>> > > control \n>> > > is actually\n>> > > supported by the camera. This is done by checking the \n>> > > cameras \n>> > > ControlInfoMap.\n>> > > \n>> > > The Rectangle type is now supported.\n>> > > \n>> > > Some checks were added to make sure the arrays passed to \n>> > > the \n>> > > element have the\n>> > > correct length.\n>> > > \n>> > > Best regards,\n>> > > \n>> > > Jaslo\n>> > > \n>> > > Jaslo Ziska (3):\n>> > >   gstreamer: Remove auto-focus-mode property from device \n>> > >   provider\n>> > >   gstreamer: Remove auto-focus-mode property from \n>> > >   libcamerasrc\n>> > >   gstreamer: Generate controls from control_ids_*.yaml \n>> > >   files\n>> > > \n>> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 \n>> > >  +++++++++++++++++++++\n>> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n>> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n>> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n>> > >  src/gstreamer/meson.build                  |  10 +\n>> > >  utils/codegen/controls.py                  |   8 +\n>> > >  utils/codegen/gen-gst-controls.py          | 151 \n>> > >  +++++++++++\n>> > >  utils/codegen/meson.build                  |   1 +\n>> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n>> > >  create mode 100644 \n>> > >  src/gstreamer/gstlibcamera-controls.cpp.in\n>> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n>> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 A2DB1C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Oct 2024 10:04:14 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 386426351F;\n\tWed,  2 Oct 2024 12:04:13 +0200 (CEST)","from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[85.215.255.21])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id CEAAC63510\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Oct 2024 12:04:11 +0200 (CEST)","from archlinux by smtp.strato.de (RZmta 51.2.8 AUTH)\n\twith ESMTPSA id z4431f092A49oeh\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tWed, 2 Oct 2024 12:04:09 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ziska.de header.i=@ziska.de header.b=\"kI5UCU4Y\";\n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"9Zso+WSW\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1727863449; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=I5FV8IbrAKQ7eZFaixIFOxQTxxqpFNQf7r9uUGLnNz/5+nGOXk3EuwVON9d5nmkGf3\n\tcJCpvhxg368XVCjQ6QlHn+Zygm8jkJVQ6M6Rc39lvDIU2Ojlc9M8mOsucXmM7pXIZTp5\n\tu8ng2/ZOHzhrNuUqT0JYiyqqbF35ls+agFEwVHNBbqs+Mo3qS0RnopdPFWP6wTuixoli\n\t33TrXx5m8LvCBcV2cU3Nfs91NAOvCpZSbR1r0exrBylraJJbriIVjddNW5zVY+FySvcu\n\t4YDgBX1wzh1FCl+VBjpMp5Ou/EBX+CCjtjGWA6ddFGMOinTIToXg9fvGhfvLv1g3nunk\n\tF/eQ==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; t=1727863449;\n\ts=strato-dkim-0002; d=strato.com;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=mm0rtpkkBcReploqodEHYhKXhsettHkmVZNkfAiCqNY=;\n\tb=Kkmjpnvw5zLiy/Sh+AnhPCdiRlVufKwq/BmCfPEuZNk/cUEDflScO0Rj/0E6r+nNXW\n\t3rs6U+7i0QEuzpDizKITPJLb3CQwsXBB/S5iwOk6ynGThg3196GFRLzevRdzEZeMlHit\n\tRkJiqXoxyksmin+bWNNpEZuwmxbLvZ6f1MqPIc8JRL62y8A8QWUgXeRoqIfFJfOKyVPy\n\tMOdhEWUjuThSfuk/SXhQcTBuzcq/tbCNiDqgcjZExQXiOCcNsdM+su5KdFKhFFuDV0lm\n\tH49QXo7HCQXCW2i/4zxp6hiq60Kno6HOgAgYWp7KCR6v6qAGcJ72PFbuyds2rPxW2JTW\n\tqEyg==","ARC-Authentication-Results":"i=1; strato.com;\n    arc=none;\n    dkim=none","X-RZG-CLASS-ID":"mo00","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; t=1727863449;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=mm0rtpkkBcReploqodEHYhKXhsettHkmVZNkfAiCqNY=;\n\tb=kI5UCU4YvA7ag0e+HhJcaayLVUtnit75xuSP/nGOMmnK5bCvNtASZw7ROrPh/DXTvK\n\t9OBc6y1x7B5pk5RP9eXQpgTujvbbgageot+mTZEsbY0Aa6ae9d5S00jAFd0ImHURw41y\n\tZ7LL5tsPjVX675OXzrSYDzutiWJSb3jY+2P2DWJIaDbyY2IaeU/RXv3KUOvbou6iFxrd\n\trPq8WTo3TqqNVUFrosnYcrooW9fUO3X7IaaojMtXk56uKPq+YESwG/tWHhZRGobl7T08\n\t2vSKnWbzG/C89F7PTggX4xB8irzJeVyOPSYBNwy4CBs0aC1FUODkqvrC4CY5jYY8qphh\n\tbZ2w==","v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1727863449;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=mm0rtpkkBcReploqodEHYhKXhsettHkmVZNkfAiCqNY=;\n\tb=9Zso+WSWBvbU5BmyEKUnpk+murweY2Sps5QKdKiqCWbWiRRNEAFyKoIdK8zrhi6cS4\n\t5IdgqnvIOq7MtjMBJ5DA=="],"X-RZG-AUTH":"\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cCh4q+AvJaIeeZIISGPYJ5YO+UwyFLwRTlSBE=\"","From":"Jaslo Ziska <jaslo@ziska.de>","To":"Nicolas Dufresne <nicolas@ndufresne.ca>","Cc":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","In-Reply-To":"<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t(Nicolas Dufresne's message of \"Mon, 30 Sep 2024 10:42:26 -0400\")","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>","Date":"Wed, 02 Oct 2024 12:04:08 +0200","Message-ID":"<87h69u3jon.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"quoted-printable","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":31523,"web_url":"https://patchwork.libcamera.org/comment/31523/","msgid":"<20241002112238.GE6672@pendragon.ideasonboard.com>","date":"2024-10-02T11:22:38","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n> Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n> > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> >> > Hi Jaslo,\n> >> > \n> >> > I think this series is close to being ready, and I would be very happy\n> >> > to merge this much awaited feature. Do you plan to send a v3 ?\n> >> \n> >> Yes, I very much plan on continuing to work on this. I was a \n> >> pretty busy the past month but I should have more time later in \n> >> October.\n> >> \n> >> Unfortunately, I don't think that the series is quite ready. \n> >> Nicolas had requested some bigger changes in v1 which still need \n> >> to be discussed and implemented and I also want to add the \n> >> readable/writeable and minimum/maximum properties to the yaml \n> >> files (although this could also be done separately after \n> >> merging).\n> >\n> > My proposal is to program a subset to be exposed as properties, the one that are\n> > obviously usable and that the documentation make sense. I think you did a great\n> > job on the generator and adding features later to support controls that have\n> > more complex semantic is better then trying to support them all \n> > in one go today.\n> \n> Sounds good. Where would you suggest the list of controls to be \n> exposed should be? Maybe just a plain list in the Python generator \n> file?\n\nThe other option is to store the information in the yaml files. I don't\nhave a very strong opinion, the yaml files have the advantage that all\nthe data related to controls will be in a single place, but the\ngenerator script has the advantage of keeping all gstreamer-related data\nclose to the gstreamer element. That may be useful when it will be time\nto move libcamerasrc from the libcamera repository to the gstreamer\nrepository (if we ever do so). On the other hand, tha yaml files are not\ninstalled, so there would still be issues.\n\nComplete brainstorming mode, I'm wondering if at some point in the\nfuture it would make sense to handle the gstreamer controls in a more\ndynamic fashion by querying libcamera at runtime instead of using code\ngeneration. This doesn't invalidate the approach you've taken here, I\nthink code generation is good for the time being.\n\n> > If the selection is all rw, the marking of that can wait. Min/max would be my\n> > preference to have, but as we are breaking the API anyway still, we can also do\n> > small break in the gstreamer element later too (as long as its well reported in\n> > the release notes).\n> \n> You also suggested a GStreamer property that returns a \n> GstStructure which lists all the actually present controls for the \n> camera and their actual limits. Do you still want this implemented \n> and if so how do you imagine this structure to be laid out?\n> \n> >> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> >> > > Hi everyone,\n> >> > > \n> >> > > this is the second version of the patch set to implement gstreamer controls\n> >> > > from the yaml files.\n> >> > > This now depends on \"[PATCH 00/10] libcamera: Improve code generation for\n> >> > > controls\" for the code generation.\n> >> > > \n> >> > > The following things changed:\n> >> > > \n> >> > > The (old) third commit fixing a typo has been removed as it is already merged.\n> >> > > \n> >> > > The first commit is new: it removes the auto-focus-mode property from the\n> >> > > device provider where it has been added on accident.\n> >> > > \n> >> > > The commit message has been updated in the second commit.\n> >> > > \n> >> > > The third commit, which adds the code that generates the gstreamer controls,\n> >> > > now makes use of jinja2 and the new controls.py file. As a consequence the\n> >> > > whole code generation has been redone.\n> >> > > \n> >> > > There are also some new features:\n> >> > > \n> >> > > It is now possible to read the metadata returned by requests from the gstreamer\n> >> > > properties. This is done using a new function readMetadata() which reads the\n> >> > > ControlList in requestCompleted().\n> >> > > \n> >> > > Before a control is set it is now checked whether this control is actually\n> >> > > supported by the camera. This is done by checking the cameras ControlInfoMap.\n> >> > > \n> >> > > The Rectangle type is now supported.\n> >> > > \n> >> > > Some checks were added to make sure the arrays passed to the element have the\n> >> > > correct length.\n> >> > > \n> >> > > Best regards,\n> >> > > \n> >> > > Jaslo\n> >> > > \n> >> > > Jaslo Ziska (3):\n> >> > >   gstreamer: Remove auto-focus-mode property from device provider\n> >> > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> >> > >   gstreamer: Generate controls from control_ids_*.yaml files\n> >> > > \n> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n> >> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> >> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> >> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> >> > >  src/gstreamer/meson.build                  |  10 +\n> >> > >  utils/codegen/controls.py                  |   8 +\n> >> > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> >> > >  utils/codegen/meson.build                  |   1 +\n> >> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> >> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 0A85DC3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Oct 2024 11:22:44 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C37946351F;\n\tWed,  2 Oct 2024 13:22:42 +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 40F1763510\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Oct 2024 13:22:41 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 79FF55A5;\n\tWed,  2 Oct 2024 13:21:08 +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=\"ts6qTjVU\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727868068;\n\tbh=/26BseQs4aweUhr6X8bPI7DGzvdEsnD4wnOFnnKY0dY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ts6qTjVUKktk5HdPyA6L4Aib8/LQeDaPaZjtMGijTTZLwV3bVy5lbjjgUb9tVvaTA\n\t7oGzLautv4ZG5Gecd+/lhogsyGEsaj5HCSGoT9lBsy0aupbkBvZ5DOjcPKUHGxoPhs\n\tatTcurL1UC9AQZB7rwZIEGqgT13hmmrvv23K+L0E=","Date":"Wed, 2 Oct 2024 14:22:38 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jaslo Ziska <jaslo@ziska.de>","Cc":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","Message-ID":"<20241002112238.GE6672@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<87h69u3jon.fsf@ziska.de>","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":31530,"web_url":"https://patchwork.libcamera.org/comment/31530/","msgid":"<8734lewh2x.fsf@ziska.de>","date":"2024-10-02T17:27:34","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":173,"url":"https://patchwork.libcamera.org/api/people/173/","name":"Jaslo Ziska","email":"jaslo@ziska.de"},"content":"Hi Laurent,\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n>> Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n>> > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a \n>> > écrit :\n>> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n>> >> > Hi Jaslo,\n>> >> > \n>> >> > I think this series is close to being ready, and I would \n>> >> > be very happy\n>> >> > to merge this much awaited feature. Do you plan to send a \n>> >> > v3 ?\n>> >> \n>> >> Yes, I very much plan on continuing to work on this. I was a \n>> >> pretty busy the past month but I should have more time later \n>> >> in \n>> >> October.\n>> >> \n>> >> Unfortunately, I don't think that the series is quite ready. \n>> >> Nicolas had requested some bigger changes in v1 which still \n>> >> need \n>> >> to be discussed and implemented and I also want to add the \n>> >> readable/writeable and minimum/maximum properties to the \n>> >> yaml \n>> >> files (although this could also be done separately after \n>> >> merging).\n>> >\n>> > My proposal is to program a subset to be exposed as \n>> > properties, the one that are\n>> > obviously usable and that the documentation make sense. I \n>> > think you did a great\n>> > job on the generator and adding features later to support \n>> > controls that have\n>> > more complex semantic is better then trying to support them \n>> > all \n>> > in one go today.\n>> \n>> Sounds good. Where would you suggest the list of controls to be \n>> exposed should be? Maybe just a plain list in the Python \n>> generator \n>> file?\n>\n> The other option is to store the information in the yaml files. \n> I don't\n> have a very strong opinion, the yaml files have the advantage \n> that all\n> the data related to controls will be in a single place, but the\n> generator script has the advantage of keeping all \n> gstreamer-related data\n> close to the gstreamer element. That may be useful when it will \n> be time\n> to move libcamerasrc from the libcamera repository to the \n> gstreamer\n> repository (if we ever do so). On the other hand, tha yaml files \n> are not\n> installed, so there would still be issues.\n\nPutting it inside the yaml would be an option, but I don't know \nwhether having GStreamer specific stuff there is so good. But I \nthink this will likely change anyway.\n\n> Complete brainstorming mode, I'm wondering if at some point in \n> the\n> future it would make sense to handle the gstreamer controls in a \n> more\n> dynamic fashion by querying libcamera at runtime instead of \n> using code\n> generation. This doesn't invalidate the approach you've taken \n> here, I\n> think code generation is good for the time being.\n\nIf you mean that the GStreamer properties should get added later \nat runtime then this is unfortunately not possible. This is \nbecause the GStreamer controls are GObject properties and those \nneed to be installed when the GObject object class is initialized. \nAnd because this happens before the GStreamer element is \nconstructed (and therefore also before libcamera gets involved) it \nis not possible to know which properties are present and with \nwhich ranges.\n\nThe one thing that Nicolas suggested is adding a special property \nto the GStreamer element which can then return the available \nproperties and their ranges at runtime. That would be the \nGstStructure which I was asking about.\n\nBest regards,\n\nJaslo\n\n>> > If the selection is all rw, the marking of that can wait. \n>> > Min/max would be my\n>> > preference to have, but as we are breaking the API anyway \n>> > still, we can also do\n>> > small break in the gstreamer element later too (as long as \n>> > its well reported in\n>> > the release notes).\n>> \n>> You also suggested a GStreamer property that returns a \n>> GstStructure which lists all the actually present controls for \n>> the \n>> camera and their actual limits. Do you still want this \n>> implemented \n>> and if so how do you imagine this structure to be laid out?\n>> \n>> >> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska \n>> >> > wrote:\n>> >> > > Hi everyone,\n>> >> > > \n>> >> > > this is the second version of the patch set to implement \n>> >> > > gstreamer controls\n>> >> > > from the yaml files.\n>> >> > > This now depends on \"[PATCH 00/10] libcamera: Improve \n>> >> > > code generation for\n>> >> > > controls\" for the code generation.\n>> >> > > \n>> >> > > The following things changed:\n>> >> > > \n>> >> > > The (old) third commit fixing a typo has been removed as \n>> >> > > it is already merged.\n>> >> > > \n>> >> > > The first commit is new: it removes the auto-focus-mode \n>> >> > > property from the\n>> >> > > device provider where it has been added on accident.\n>> >> > > \n>> >> > > The commit message has been updated in the second \n>> >> > > commit.\n>> >> > > \n>> >> > > The third commit, which adds the code that generates the \n>> >> > > gstreamer controls,\n>> >> > > now makes use of jinja2 and the new controls.py file. As \n>> >> > > a consequence the\n>> >> > > whole code generation has been redone.\n>> >> > > \n>> >> > > There are also some new features:\n>> >> > > \n>> >> > > It is now possible to read the metadata returned by \n>> >> > > requests from the gstreamer\n>> >> > > properties. This is done using a new function \n>> >> > > readMetadata() which reads the\n>> >> > > ControlList in requestCompleted().\n>> >> > > \n>> >> > > Before a control is set it is now checked whether this \n>> >> > > control is actually\n>> >> > > supported by the camera. This is done by checking the \n>> >> > > cameras ControlInfoMap.\n>> >> > > \n>> >> > > The Rectangle type is now supported.\n>> >> > > \n>> >> > > Some checks were added to make sure the arrays passed to \n>> >> > > the element have the\n>> >> > > correct length.\n>> >> > > \n>> >> > > Best regards,\n>> >> > > \n>> >> > > Jaslo\n>> >> > > \n>> >> > > Jaslo Ziska (3):\n>> >> > >   gstreamer: Remove auto-focus-mode property from device \n>> >> > >   provider\n>> >> > >   gstreamer: Remove auto-focus-mode property from \n>> >> > >   libcamerasrc\n>> >> > >   gstreamer: Generate controls from control_ids_*.yaml \n>> >> > >   files\n>> >> > > \n>> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 \n>> >> > >  +++++++++++++++++++++\n>> >> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n>> >> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n>> >> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n>> >> > >  src/gstreamer/meson.build                  |  10 +\n>> >> > >  utils/codegen/controls.py                  |   8 +\n>> >> > >  utils/codegen/gen-gst-controls.py          | 151 \n>> >> > >  +++++++++++\n>> >> > >  utils/codegen/meson.build                  |   1 +\n>> >> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n>> >> > >  create mode 100644 \n>> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in\n>> >> > >  create mode 100644 \n>> >> > >  src/gstreamer/gstlibcamera-controls.h\n>> >> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 37949C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Oct 2024 17:27:42 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 372676351F;\n\tWed,  2 Oct 2024 19:27:41 +0200 (CEST)","from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[81.169.146.219])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 61F7363510\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Oct 2024 19:27:40 +0200 (CEST)","from archlinux by smtp.strato.de (RZmta 51.2.8 AUTH)\n\twith ESMTPSA id z4431f092HRYqQL\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tWed, 2 Oct 2024 19:27:34 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ziska.de header.i=@ziska.de header.b=\"d+de3WHr\";\n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"g+/Hhk+1\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1727890055; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=MUa72exEi21sbxPMrAUCNp9c8XUBsR4y0JSc3tBG8ehXntQ/w/EmMAqFnZpIPfantm\n\tZKYjXyKUbEex78scnw/cyc6lv8zF4mjIy5KwewjGqo6bmbS1LDO/4Bj4CLMPJca7flYk\n\t5l1t5NJE4YDdTfbivjbhfCwhx2e1XmlN3JBZjASwiqijqZkIuVvkNbFpBJSg5Cmn8mVB\n\tslnQUwlDD8iIkHAG0sRXUkvl92TtFMYS8byN4dPL+a92nvcLtGkSexVxYMn0UGLPE/XA\n\tiymIr2QqN3aF3HFduS2zNbkTlQocblx/jNqO/vkNXA2QOA545b5D2aAgC6XoIdyudwLz\n\t7C4A==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; t=1727890055;\n\ts=strato-dkim-0002; d=strato.com;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=QeMsrMrRsYiy6TFabYLRlJv8Kgs26EOJiblKRv/uGzw=;\n\tb=l6vykd7l6NQI67JBbZ63NSYeLZU0WA4oKtJ4t+yqV2lGRCwdrlq098N5+4TYIrFwll\n\t3WsEpyQuZLQnNwbKCiN2CbTsAXi74v3nVWU/CWHXCSIX8vgwVkS5OQUsTrDLVjQup+e5\n\tn22sa3agfUSGng9mFGXELEPrjc9ZIzKAJt/BA1QVc75C9Kj/cRHSEyTEfzogjJp9ltVr\n\tRQzvZgKSSFK+kPoKaLyk14P1wjSk3J/i24fAauPqFQBl72lsvw2X/gnKG7OIgRDFygQq\n\tGjWZSb0uqnTtaBnTlX9bHqjU4bdL2nI+YFplczwTywtKEl/a+QxQiuXjAvpRmixz0TUG\n\tsIag==","ARC-Authentication-Results":"i=1; strato.com;\n    arc=none;\n    dkim=none","X-RZG-CLASS-ID":"mo00","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; t=1727890055;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=QeMsrMrRsYiy6TFabYLRlJv8Kgs26EOJiblKRv/uGzw=;\n\tb=d+de3WHrVy3dF3y9kH4XzUfRWMYsB0anZGATtGYaTxhzEMISwtN8H7uGtic00wLQtM\n\tKS+g7vQhGii8wx5lAxN30DNlcJ+0O1mwEFSwXld3AglDXWoz/4h+MZihS3f2FzygFRrW\n\tF73+5AgAFRHx3N4L4y/v9FbAsIGezb8TZ5fpi5VD5iPAyUtltCeVoQgNS79lkP8sstXD\n\t6vBJ/4uPv6ilLyCnbxnaH1buZlSSnktL59URwpptuWWjtZdALB7IJxVsXHUiPfi+09J1\n\toKxawylSFWzR5FK/kQ0VLvRIdc9NaIeR2W17tWehGCHjRMJ/5L7MQQSgVDrlury0WjlZ\n\tusTg==","v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1727890055;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=QeMsrMrRsYiy6TFabYLRlJv8Kgs26EOJiblKRv/uGzw=;\n\tb=g+/Hhk+15nWNYtksKPDOKnX9FhVFpI2yVN5YwFwEK+kv4sCJaitaqWSW0V9VsMKThE\n\tTW9GqvQpSu47rT1LM2Dg=="],"X-RZG-AUTH":"\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cCh4q+AvJaIeeZIISGPYJ5YO+UwyFLwRTlSBE=\"","From":"Jaslo Ziska <jaslo@ziska.de>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","In-Reply-To":"<20241002112238.GE6672@pendragon.ideasonboard.com> (Laurent\n\tPinchart's message of \"Wed, 2 Oct 2024 14:22:38 +0300\")","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>","Date":"Wed, 02 Oct 2024 19:27:34 +0200","Message-ID":"<8734lewh2x.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"quoted-printable","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":31531,"web_url":"https://patchwork.libcamera.org/comment/31531/","msgid":"<20241002202217.GA6794@pendragon.ideasonboard.com>","date":"2024-10-02T20:22:17","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Wed, Oct 02, 2024 at 07:27:34PM +0200, Jaslo Ziska wrote:\n> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n> >> Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n> >> > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> >> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> >> >> > Hi Jaslo,\n> >> >> > \n> >> >> > I think this series is close to being ready, and I would be very happy\n> >> >> > to merge this much awaited feature. Do you plan to send a v3 ?\n> >> >> \n> >> >> Yes, I very much plan on continuing to work on this. I was a \n> >> >> pretty busy the past month but I should have more time later in \n> >> >> October.\n> >> >> \n> >> >> Unfortunately, I don't think that the series is quite ready. \n> >> >> Nicolas had requested some bigger changes in v1 which still need \n> >> >> to be discussed and implemented and I also want to add the \n> >> >> readable/writeable and minimum/maximum properties to the  yaml \n> >> >> files (although this could also be done separately after \n> >> >> merging).\n> >> >\n> >> > My proposal is to program a subset to be exposed as \n> >> > properties, the one that are\n> >> > obviously usable and that the documentation make sense. I \n> >> > think you did a great\n> >> > job on the generator and adding features later to support \n> >> > controls that have\n> >> > more complex semantic is better then trying to support them all \n> >> > in one go today.\n> >> \n> >> Sounds good. Where would you suggest the list of controls to be \n> >> exposed should be? Maybe just a plain list in the Python generator \n> >> file?\n> >\n> > The other option is to store the information in the yaml files. I don't\n> > have a very strong opinion, the yaml files have the advantage that all\n> > the data related to controls will be in a single place, but the\n> > generator script has the advantage of keeping all gstreamer-related data\n> > close to the gstreamer element. That may be useful when it will be time\n> > to move libcamerasrc from the libcamera repository to the gstreamer\n> > repository (if we ever do so). On the other hand, tha yaml files are not\n> > installed, so there would still be issues.\n> \n> Putting it inside the yaml would be an option, but I don't know \n> whether having GStreamer specific stuff there is so good. But I \n> think this will likely change anyway.\n> \n> > Complete brainstorming mode, I'm wondering if at some point in the\n> > future it would make sense to handle the gstreamer controls in a more\n> > dynamic fashion by querying libcamera at runtime instead of using code\n> > generation. This doesn't invalidate the approach you've taken here, I\n> > think code generation is good for the time being.\n> \n> If you mean that the GStreamer properties should get added later \n> at runtime then this is unfortunately not possible. This is \n> because the GStreamer controls are GObject properties and those \n> need to be installed when the GObject object class is initialized. \n> And because this happens before the GStreamer element is \n> constructed (and therefore also before libcamera gets involved) it \n> is not possible to know which properties are present and with \n> which ranges.\n\nYou can get the list of all the controls that libcamera supports from\nlibcamera::controls::controls. It's a global ControlIdMap variable, a\nmap from control numerical ids to ControlId instances. The ControlId\nclass gives you the control numerical id, its name, type, number of\nelements if it's an array, and enumerators. We're adding the control\nnamespace as well, and could add additional information if needed. We\ndon't need to go this way though.\n\n> The one thing that Nicolas suggested is adding a special property \n> to the GStreamer element which can then return the available \n> properties and their ranges at runtime. That would be the \n> GstStructure which I was asking about.\n> \n> >> > If the selection is all rw, the marking of that can wait. \n> >> > Min/max would be my\n> >> > preference to have, but as we are breaking the API anyway \n> >> > still, we can also do\n> >> > small break in the gstreamer element later too (as long as \n> >> > its well reported in\n> >> > the release notes).\n> >> \n> >> You also suggested a GStreamer property that returns a \n> >> GstStructure which lists all the actually present controls for \n> >> the \n> >> camera and their actual limits. Do you still want this \n> >> implemented \n> >> and if so how do you imagine this structure to be laid out?\n> >> \n> >> >> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska \n> >> >> > wrote:\n> >> >> > > Hi everyone,\n> >> >> > > \n> >> >> > > this is the second version of the patch set to implement \n> >> >> > > gstreamer controls\n> >> >> > > from the yaml files.\n> >> >> > > This now depends on \"[PATCH 00/10] libcamera: Improve \n> >> >> > > code generation for\n> >> >> > > controls\" for the code generation.\n> >> >> > > \n> >> >> > > The following things changed:\n> >> >> > > \n> >> >> > > The (old) third commit fixing a typo has been removed as \n> >> >> > > it is already merged.\n> >> >> > > \n> >> >> > > The first commit is new: it removes the auto-focus-mode \n> >> >> > > property from the\n> >> >> > > device provider where it has been added on accident.\n> >> >> > > \n> >> >> > > The commit message has been updated in the second \n> >> >> > > commit.\n> >> >> > > \n> >> >> > > The third commit, which adds the code that generates the \n> >> >> > > gstreamer controls,\n> >> >> > > now makes use of jinja2 and the new controls.py file. As \n> >> >> > > a consequence the\n> >> >> > > whole code generation has been redone.\n> >> >> > > \n> >> >> > > There are also some new features:\n> >> >> > > \n> >> >> > > It is now possible to read the metadata returned by \n> >> >> > > requests from the gstreamer\n> >> >> > > properties. This is done using a new function \n> >> >> > > readMetadata() which reads the\n> >> >> > > ControlList in requestCompleted().\n> >> >> > > \n> >> >> > > Before a control is set it is now checked whether this \n> >> >> > > control is actually\n> >> >> > > supported by the camera. This is done by checking the \n> >> >> > > cameras ControlInfoMap.\n> >> >> > > \n> >> >> > > The Rectangle type is now supported.\n> >> >> > > \n> >> >> > > Some checks were added to make sure the arrays passed to \n> >> >> > > the element have the\n> >> >> > > correct length.\n> >> >> > > \n> >> >> > > Best regards,\n> >> >> > > \n> >> >> > > Jaslo\n> >> >> > > \n> >> >> > > Jaslo Ziska (3):\n> >> >> > >   gstreamer: Remove auto-focus-mode property from device provider\n> >> >> > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> >> >> > >   gstreamer: Generate controls from control_ids_*.yaml files\n> >> >> > > \n> >> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n> >> >> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> >> >> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> >> >> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> >> >> > >  src/gstreamer/meson.build                  |  10 +\n> >> >> > >  utils/codegen/controls.py                  |   8 +\n> >> >> > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> >> >> > >  utils/codegen/meson.build                  |   1 +\n> >> >> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> >> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> >> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> >> >> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 6DE5EC3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tWed,  2 Oct 2024 20:22:25 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 54CC963510;\n\tWed,  2 Oct 2024 22:22:23 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id E246763510\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed,  2 Oct 2024 22:22:20 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CCA8B3EA;\n\tWed,  2 Oct 2024 22:20:47 +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=\"UCGrA5py\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727900448;\n\tbh=NrlkZelW7e6phERnf4D7kmEyoQRo0IBTHOM0tlNB7Ec=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=UCGrA5pyUICu4oWevBEKhzSMC8NwHAWyzZk5hUlxXJXWhsmJf6TTMPAkNH+tlkiOR\n\tt4YkHNmiLc5ZCp31Pe5JmMGnqCdaU3BfUx3Mz0wOMlzrK6RDgzZ4Gr0Nxev1W3Ofix\n\t1GI97gRRfMJN0eej6QfosLlFHE+/ZvzDZW3G18Mk=","Date":"Wed, 2 Oct 2024 23:22:17 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jaslo Ziska <jaslo@ziska.de>","Cc":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","Message-ID":"<20241002202217.GA6794@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>\n\t<8734lewh2x.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<8734lewh2x.fsf@ziska.de>","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":31557,"web_url":"https://patchwork.libcamera.org/comment/31557/","msgid":"<87iku9xze9.fsf@ziska.de>","date":"2024-10-03T10:18:54","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":173,"url":"https://patchwork.libcamera.org/api/people/173/","name":"Jaslo Ziska","email":"jaslo@ziska.de"},"content":"Hi Laurent,\n\nLaurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> On Wed, Oct 02, 2024 at 07:27:34PM +0200, Jaslo Ziska wrote:\n>> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n>> > On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n>> >> Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n>> >> > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a \n>> >> > écrit :\n>> >> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> \n>> >> >> writes:\n>> >> >> > Hi Jaslo,\n>> >> >> > \n>> >> >> > I think this series is close to being ready, and I \n>> >> >> > would be very happy\n>> >> >> > to merge this much awaited feature. Do you plan to send \n>> >> >> > a v3 ?\n>> >> >> \n>> >> >> Yes, I very much plan on continuing to work on this. I \n>> >> >> was a \n>> >> >> pretty busy the past month but I should have more time \n>> >> >> later in \n>> >> >> October.\n>> >> >> \n>> >> >> Unfortunately, I don't think that the series is quite \n>> >> >> ready. \n>> >> >> Nicolas had requested some bigger changes in v1 which \n>> >> >> still need \n>> >> >> to be discussed and implemented and I also want to add \n>> >> >> the \n>> >> >> readable/writeable and minimum/maximum properties to the \n>> >> >> yaml \n>> >> >> files (although this could also be done separately after \n>> >> >> merging).\n>> >> >\n>> >> > My proposal is to program a subset to be exposed as \n>> >> > properties, the one that are\n>> >> > obviously usable and that the documentation make sense. I \n>> >> > think you did a great\n>> >> > job on the generator and adding features later to support \n>> >> > controls that have\n>> >> > more complex semantic is better then trying to support \n>> >> > them all \n>> >> > in one go today.\n>> >> \n>> >> Sounds good. Where would you suggest the list of controls to \n>> >> be \n>> >> exposed should be? Maybe just a plain list in the Python \n>> >> generator \n>> >> file?\n>> >\n>> > The other option is to store the information in the yaml \n>> > files. I don't\n>> > have a very strong opinion, the yaml files have the advantage \n>> > that all\n>> > the data related to controls will be in a single place, but \n>> > the\n>> > generator script has the advantage of keeping all \n>> > gstreamer-related data\n>> > close to the gstreamer element. That may be useful when it \n>> > will be time\n>> > to move libcamerasrc from the libcamera repository to the \n>> > gstreamer\n>> > repository (if we ever do so). On the other hand, tha yaml \n>> > files are not\n>> > installed, so there would still be issues.\n>> \n>> Putting it inside the yaml would be an option, but I don't know \n>> whether having GStreamer specific stuff there is so good. But I \n>> think this will likely change anyway.\n>> \n>> > Complete brainstorming mode, I'm wondering if at some point \n>> > in the\n>> > future it would make sense to handle the gstreamer controls \n>> > in a more\n>> > dynamic fashion by querying libcamera at runtime instead of \n>> > using code\n>> > generation. This doesn't invalidate the approach you've taken \n>> > here, I\n>> > think code generation is good for the time being.\n>> \n>> If you mean that the GStreamer properties should get added \n>> later \n>> at runtime then this is unfortunately not possible. This is \n>> because the GStreamer controls are GObject properties and those \n>> need to be installed when the GObject object class is \n>> initialized. \n>> And because this happens before the GStreamer element is \n>> constructed (and therefore also before libcamera gets involved) \n>> it \n>> is not possible to know which properties are present and with \n>> which ranges.\n>\n> You can get the list of all the controls that libcamera supports \n> from\n> libcamera::controls::controls. It's a global ControlIdMap \n> variable, a\n> map from control numerical ids to ControlId instances. The \n> ControlId\n> class gives you the control numerical id, its name, type, number \n> of\n> elements if it's an array, and enumerators. We're adding the \n> control\n> namespace as well, and could add additional information if \n> needed. We\n> don't need to go this way though.\n\nAh yes, I think that would work too, I never thought about it that \nway. This still would not help with the actually available \ncontrols for the camera unfortunately.\n\nI don't know which way would be the proper or better way to do it, \nboth ways have their pros and cons.\n\nUsing the yaml files and the code generator has more flexibility \nbut adds the complexity of the extra code. And using the \nlibcamera::controls::controls variable would probably simplify the \ncode but makes the GStreamer element dependent on the information \nwhich are exposed by the variable.\n\nI'm open to both possibilities. Does anyone have opinions on this?\n\nBest regards,\n\nJaslo\n\n>> The one thing that Nicolas suggested is adding a special \n>> property \n>> to the GStreamer element which can then return the available \n>> properties and their ranges at runtime. That would be the \n>> GstStructure which I was asking about.\n>> \n>> >> > If the selection is all rw, the marking of that can wait. \n>> >> > Min/max would be my\n>> >> > preference to have, but as we are breaking the API anyway \n>> >> > still, we can also do\n>> >> > small break in the gstreamer element later too (as long as \n>> >> > its well reported in\n>> >> > the release notes).\n>> >> \n>> >> You also suggested a GStreamer property that returns a \n>> >> GstStructure which lists all the actually present controls \n>> >> for \n>> >> the \n>> >> camera and their actual limits. Do you still want this \n>> >> implemented \n>> >> and if so how do you imagine this structure to be laid out?\n>> >> \n>> >> >> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska \n>> >> >> > wrote:\n>> >> >> > > Hi everyone,\n>> >> >> > > \n>> >> >> > > this is the second version of the patch set to \n>> >> >> > > implement \n>> >> >> > > gstreamer controls\n>> >> >> > > from the yaml files.\n>> >> >> > > This now depends on \"[PATCH 00/10] libcamera: Improve \n>> >> >> > > code generation for\n>> >> >> > > controls\" for the code generation.\n>> >> >> > > \n>> >> >> > > The following things changed:\n>> >> >> > > \n>> >> >> > > The (old) third commit fixing a typo has been removed \n>> >> >> > > as \n>> >> >> > > it is already merged.\n>> >> >> > > \n>> >> >> > > The first commit is new: it removes the \n>> >> >> > > auto-focus-mode \n>> >> >> > > property from the\n>> >> >> > > device provider where it has been added on accident.\n>> >> >> > > \n>> >> >> > > The commit message has been updated in the second \n>> >> >> > > commit.\n>> >> >> > > \n>> >> >> > > The third commit, which adds the code that generates \n>> >> >> > > the \n>> >> >> > > gstreamer controls,\n>> >> >> > > now makes use of jinja2 and the new controls.py file. \n>> >> >> > > As \n>> >> >> > > a consequence the\n>> >> >> > > whole code generation has been redone.\n>> >> >> > > \n>> >> >> > > There are also some new features:\n>> >> >> > > \n>> >> >> > > It is now possible to read the metadata returned by \n>> >> >> > > requests from the gstreamer\n>> >> >> > > properties. This is done using a new function \n>> >> >> > > readMetadata() which reads the\n>> >> >> > > ControlList in requestCompleted().\n>> >> >> > > \n>> >> >> > > Before a control is set it is now checked whether \n>> >> >> > > this \n>> >> >> > > control is actually\n>> >> >> > > supported by the camera. This is done by checking the \n>> >> >> > > cameras ControlInfoMap.\n>> >> >> > > \n>> >> >> > > The Rectangle type is now supported.\n>> >> >> > > \n>> >> >> > > Some checks were added to make sure the arrays passed \n>> >> >> > > to \n>> >> >> > > the element have the\n>> >> >> > > correct length.\n>> >> >> > > \n>> >> >> > > Best regards,\n>> >> >> > > \n>> >> >> > > Jaslo\n>> >> >> > > \n>> >> >> > > Jaslo Ziska (3):\n>> >> >> > >   gstreamer: Remove auto-focus-mode property from \n>> >> >> > >   device provider\n>> >> >> > >   gstreamer: Remove auto-focus-mode property from \n>> >> >> > >   libcamerasrc\n>> >> >> > >   gstreamer: Generate controls from \n>> >> >> > >   control_ids_*.yaml files\n>> >> >> > > \n>> >> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 \n>> >> >> > >  +++++++++++++++++++++\n>> >> >> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n>> >> >> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n>> >> >> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 \n>> >> >> > >  ++--\n>> >> >> > >  src/gstreamer/meson.build                  |  10 +\n>> >> >> > >  utils/codegen/controls.py                  |   8 +\n>> >> >> > >  utils/codegen/gen-gst-controls.py          | 151 \n>> >> >> > >  +++++++++++\n>> >> >> > >  utils/codegen/meson.build                  |   1 +\n>> >> >> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n>> >> >> > >  create mode 100644 \n>> >> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in\n>> >> >> > >  create mode 100644 \n>> >> >> > >  src/gstreamer/gstlibcamera-controls.h\n>> >> >> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 87E16C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Oct 2024 10:18:59 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id AEA616351F;\n\tThu,  3 Oct 2024 12:18:58 +0200 (CEST)","from mo4-p00-ob.smtp.rzone.de (mo4-p00-ob.smtp.rzone.de\n\t[81.169.146.161])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id A8A6062C92\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Oct 2024 12:18:56 +0200 (CEST)","from archlinux by smtp.strato.de (RZmta 51.2.8 AUTH)\n\twith ESMTPSA id z4431f093AIsrzI\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256 bits))\n\t(Client did not present a certificate);\n\tThu, 3 Oct 2024 12:18:54 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (2048-bit key;\n\tunprotected) header.d=ziska.de header.i=@ziska.de header.b=\"olb0O2Pb\";\n\tdkim=permerror (0-bit key) header.d=ziska.de header.i=@ziska.de\n\theader.b=\"ET0vc1H7\"; dkim-atps=neutral","ARC-Seal":"i=1; a=rsa-sha256; t=1727950734; cv=none;\n\td=strato.com; s=strato-dkim-0002;\n\tb=L8U6qCIXODsaRHmi/v4WaDM/XglFNXpyYqVk7h9CjJH9eJOXLrFf0qaGs4CqIqPlKR\n\tMp02V3dU3p4nx+p1seksH072jvfxAh6WuK5K4Ul8eBlWdwUZtqdLXnQAAGh2oiGi6cW1\n\t+fF0BTpSnLTrY+ftZkpQe83wHHd0869njLxJ9zEZmXqQOGdvZeQLxLa1zRKi0y2765kt\n\tDmm/8TPRa5EYKe/kr+EC+BLM3F+yNr7TmtKj5WPu7NMarchkLEfskHcbdbi6K5EzqS37\n\tHtWJ0BZ9JIPmeKNfh3snN7yR/mJ38qbvbULkiQqolppcboC7OSWYoaQO3/pDY9NK75No\n\tfgmA==","ARC-Message-Signature":"i=1; a=rsa-sha256; c=relaxed/relaxed; t=1727950734;\n\ts=strato-dkim-0002; d=strato.com;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=1f4zGvJfz9V1uQGzMALjMb6D5BXc6toqHFzi+VROvCg=;\n\tb=qJJJBLt6BIsdN9nAvX280zf11VsygpBPWXNV23thGbsZDSU5YRDxpT76NQxQ0NVTGR\n\thue0+FR6C1h4k1zkmaLMcKCbSxGtgzgoYgrgy3R7R5dZfw/aALJe/os219+banghUmTA\n\tOlB8wdETYBa9SxTbM+JH01aVuL4tMnzZ4KPLBegPCG2EVzsLoyPCRLN/UNMcLTX1qZoT\n\t9SjKkk52/kTTeWu8W9HXqS3gvF9eCoWtvG5LRHpxV2pt+fE/3r8MEeveDIGo+iKcOxIe\n\t1L3YYLhYJHE/VXDLIOAYa4U5G7VaRl4UZsX2DaFsc4NrtxAEM3iuvBBpLR1NHrHv0QUA\n\tRsmQ==","ARC-Authentication-Results":"i=1; strato.com;\n    arc=none;\n    dkim=none","X-RZG-CLASS-ID":"mo00","DKIM-Signature":["v=1; a=rsa-sha256; c=relaxed/relaxed; t=1727950734;\n\ts=strato-dkim-0002; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=1f4zGvJfz9V1uQGzMALjMb6D5BXc6toqHFzi+VROvCg=;\n\tb=olb0O2PbCUHp9N3o92blo9nDqDJP/9EeC48kzh9h01dEoolkuh17oDmhZ7tAYfL/Fg\n\tvRJVZ3MDMCmB27ZSXXbChisk3kDSI0CgUPgf3jpExj+6kg4twgXItvH8b05n+NPnjJnE\n\tNFU+jyI0XlANFS8AfLtjKosYjjOdBf47EXjYtSS0a3bK4Vd5JZnxrpcIgJ70aaGh6kSE\n\t7vwPmO8VBdCi0XLZ5y4iYaTvVgn8TKdVYP3VvRvr9NrPHpIW0NgQWcGIun3B3VMfN8Hh\n\tgmY6NKrox5sQzC5m3I48VapzzmEQxpFFSEJ3ll61xTGwGmEF9aNMD1KI6gIXYRh5SLd5\n\toCsw==","v=1; a=ed25519-sha256; c=relaxed/relaxed; t=1727950734;\n\ts=strato-dkim-0003; d=ziska.de;\n\th=Message-ID:Date:References:In-Reply-To:Subject:Cc:To:From:Cc:Date:\n\tFrom:Subject:Sender;\n\tbh=1f4zGvJfz9V1uQGzMALjMb6D5BXc6toqHFzi+VROvCg=;\n\tb=ET0vc1H79qbdyF0kM3xHBZYRT2hAHfXzjuOawnklUI8MpUD5Ap7WhXrcxUBIP2Avqo\n\tnT2RgQbZuw55cCk+FQDQ=="],"X-RZG-AUTH":"\":Jm0XeU+IYfb0x77LHmrjN5Wlb7TBwusDqIM6Hizy8VdfzvKi4yoFC9cG0oq+AfJaRnb/wRTSbxi+sIDbr93O2qLPnaU=\"","From":"Jaslo Ziska <jaslo@ziska.de>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","In-Reply-To":"<20241002202217.GA6794@pendragon.ideasonboard.com> (Laurent\n\tPinchart's message of \"Wed, 2 Oct 2024 23:22:17 +0300\")","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>\n\t<8734lewh2x.fsf@ziska.de>\n\t<20241002202217.GA6794@pendragon.ideasonboard.com>","Date":"Thu, 03 Oct 2024 12:18:54 +0200","Message-ID":"<87iku9xze9.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8; format=flowed","Content-Transfer-Encoding":"quoted-printable","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":31563,"web_url":"https://patchwork.libcamera.org/comment/31563/","msgid":"<20241003121057.GC32292@pendragon.ideasonboard.com>","date":"2024-10-03T12:10:57","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"On Thu, Oct 03, 2024 at 12:18:54PM +0200, Jaslo Ziska wrote:\n> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > On Wed, Oct 02, 2024 at 07:27:34PM +0200, Jaslo Ziska wrote:\n> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> >> > On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n> >> >> Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n> >> >> > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> >> >> >> Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> >> >> >> > Hi Jaslo,\n> >> >> >> > \n> >> >> >> > I think this series is close to being ready, and I would be very happy\n> >> >> >> > to merge this much awaited feature. Do you plan to send a v3 ?\n> >> >> >> \n> >> >> >> Yes, I very much plan on continuing to work on this. I was a \n> >> >> >> pretty busy the past month but I should have more time later in \n> >> >> >> October.\n> >> >> >> \n> >> >> >> Unfortunately, I don't think that the series is quite ready. \n> >> >> >> Nicolas had requested some bigger changes in v1 which still need \n> >> >> >> to be discussed and implemented and I also want to add the \n> >> >> >> readable/writeable and minimum/maximum properties to the yaml \n> >> >> >> files (although this could also be done separately after merging).\n> >> >> >\n> >> >> > My proposal is to program a subset to be exposed as properties, the one that are\n> >> >> > obviously usable and that the documentation make sense. I think you did a great\n> >> >> > job on the generator and adding features later to support controls that have\n> >> >> > more complex semantic is better then trying to support them all in one go today.\n> >> >> \n> >> >> Sounds good. Where would you suggest the list of controls to be \n> >> >> exposed should be? Maybe just a plain list in the Python generator \n> >> >> file?\n> >> >\n> >> > The other option is to store the information in the yaml files. I don't\n> >> > have a very strong opinion, the yaml files have the advantage that all\n> >> > the data related to controls will be in a single place, but the\n> >> > generator script has the advantage of keeping all gstreamer-related data\n> >> > close to the gstreamer element. That may be useful when it will be time\n> >> > to move libcamerasrc from the libcamera repository to the gstreamer\n> >> > repository (if we ever do so). On the other hand, tha yaml files are not\n> >> > installed, so there would still be issues.\n> >> \n> >> Putting it inside the yaml would be an option, but I don't know \n> >> whether having GStreamer specific stuff there is so good. But I \n> >> think this will likely change anyway.\n> >> \n> >> > Complete brainstorming mode, I'm wondering if at some point in the\n> >> > future it would make sense to handle the gstreamer controls in a more\n> >> > dynamic fashion by querying libcamera at runtime instead of using code\n> >> > generation. This doesn't invalidate the approach you've taken here, I\n> >> > think code generation is good for the time being.\n> >> \n> >> If you mean that the GStreamer properties should get added later \n> >> at runtime then this is unfortunately not possible. This is \n> >> because the GStreamer controls are GObject properties and those \n> >> need to be installed when the GObject object class is initialized. \n> >> And because this happens before the GStreamer element is \n> >> constructed (and therefore also before libcamera gets involved) it \n> >> is not possible to know which properties are present and with \n> >> which ranges.\n> >\n> > You can get the list of all the controls that libcamera supports from\n> > libcamera::controls::controls. It's a global ControlIdMap variable, a\n> > map from control numerical ids to ControlId instances. The ControlId\n> > class gives you the control numerical id, its name, type, number of\n> > elements if it's an array, and enumerators. We're adding the control\n> > namespace as well, and could add additional information if needed. We\n> > don't need to go this way though.\n> \n> Ah yes, I think that would work too, I never thought about it that \n> way. This still would not help with the actually available \n> controls for the camera unfortunately.\n> \n> I don't know which way would be the proper or better way to do it, \n> both ways have their pros and cons.\n> \n> Using the yaml files and the code generator has more flexibility \n> but adds the complexity of the extra code. And using the \n> libcamera::controls::controls variable would probably simplify the \n> code but makes the GStreamer element dependent on the information \n> which are exposed by the variable.\n\nOne thing missing in ControlId (beside the namespace that we will add\nsoon) that you would need for libcamerasrc is documentation. I'm not too\nkeen on adding that to ControlId, it's lots of text, which would\nprobably then need localization.\n\n> I'm open to both possibilities. Does anyone have opinions on this?\n\nI think it's more important at this point to have a working version than\na perfect version, so I'm fine continuing with the current approach.\n\n> >> The one thing that Nicolas suggested is adding a special property \n> >> to the GStreamer element which can then return the available \n> >> properties and their ranges at runtime. That would be the \n> >> GstStructure which I was asking about.\n> >> \n> >> >> > If the selection is all rw, the marking of that can wait. \n> >> >> > Min/max would be my\n> >> >> > preference to have, but as we are breaking the API anyway \n> >> >> > still, we can also do\n> >> >> > small break in the gstreamer element later too (as long as \n> >> >> > its well reported in\n> >> >> > the release notes).\n> >> >> \n> >> >> You also suggested a GStreamer property that returns a \n> >> >> GstStructure which lists all the actually present controls for the \n> >> >> camera and their actual limits. Do you still want this implemented \n> >> >> and if so how do you imagine this structure to be laid out?\n> >> >> \n> >> >> >> > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> >> >> >> > > Hi everyone,\n> >> >> >> > > \n> >> >> >> > > this is the second version of the patch set to implement gstreamer controls\n> >> >> >> > > from the yaml files.\n> >> >> >> > > This now depends on \"[PATCH 00/10] libcamera: Improve code generation for\n> >> >> >> > > controls\" for the code generation.\n> >> >> >> > > \n> >> >> >> > > The following things changed:\n> >> >> >> > > \n> >> >> >> > > The (old) third commit fixing a typo has been removed as it is already merged.\n> >> >> >> > > \n> >> >> >> > > The first commit is new: it removes the auto-focus-mode property from the\n> >> >> >> > > device provider where it has been added on accident.\n> >> >> >> > > \n> >> >> >> > > The commit message has been updated in the second commit.\n> >> >> >> > > \n> >> >> >> > > The third commit, which adds the code that generates the gstreamer controls,\n> >> >> >> > > now makes use of jinja2 and the new controls.py file. As a consequence the\n> >> >> >> > > whole code generation has been redone.\n> >> >> >> > > \n> >> >> >> > > There are also some new features:\n> >> >> >> > > \n> >> >> >> > > It is now possible to read the metadata returned by requests from the gstreamer\n> >> >> >> > > properties. This is done using a new function readMetadata() which reads the\n> >> >> >> > > ControlList in requestCompleted().\n> >> >> >> > > \n> >> >> >> > > Before a control is set it is now checked whether this control is actually\n> >> >> >> > > supported by the camera. This is done by checking the cameras ControlInfoMap.\n> >> >> >> > > \n> >> >> >> > > The Rectangle type is now supported.\n> >> >> >> > > \n> >> >> >> > > Some checks were added to make sure the arrays passed to the element have the\n> >> >> >> > > correct length.\n> >> >> >> > > \n> >> >> >> > > Best regards,\n> >> >> >> > > \n> >> >> >> > > Jaslo\n> >> >> >> > > \n> >> >> >> > > Jaslo Ziska (3):\n> >> >> >> > >   gstreamer: Remove auto-focus-mode property from device provider\n> >> >> >> > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> >> >> >> > >   gstreamer: Generate controls from control_ids_*.yaml files\n> >> >> >> > > \n> >> >> >> > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n> >> >> >> > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> >> >> >> > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> >> >> >> > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> >> >> >> > >  src/gstreamer/meson.build                  |  10 +\n> >> >> >> > >  utils/codegen/controls.py                  |   8 +\n> >> >> >> > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> >> >> >> > >  utils/codegen/meson.build                  |   1 +\n> >> >> >> > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> >> >> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> >> >> >> > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> >> >> >> > >  create mode 100755 utils/codegen/gen-gst-controls.py","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 AA007C3257\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Oct 2024 12:11:03 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C4EE86351F;\n\tThu,  3 Oct 2024 14:11:02 +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 E7B0862C92\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Oct 2024 14:11:00 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-209-231.bb.dnainternet.fi\n\t[81.175.209.231])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id A5D0218D;\n\tThu,  3 Oct 2024 14:09:27 +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=\"GSq60J4K\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1727957367;\n\tbh=owM2uD2PIKB7UYcIfKtkW4N0L/VmXqTDw47rHyBV6WE=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=GSq60J4KjY6yGTBxkwS656oU7YcSY7RGmWswb8fXMrLvoNUgnGrMMfok74kxuIoI3\n\t4qmsRtYHVGn/gDtsy0N5tSFZGHZW7xeLSHpI++/gK37DmocF4LUCq2WCDwpZwUZrYm\n\tbL4dAZZilZJGPx/KgsmoWxnJrgMZ9DqlTNynI4RI=","Date":"Thu, 3 Oct 2024 15:10:57 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jaslo Ziska <jaslo@ziska.de>","Cc":"Nicolas Dufresne <nicolas@ndufresne.ca>,\n\tlibcamera-devel@lists.libcamera.org","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","Message-ID":"<20241003121057.GC32292@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>\n\t<8734lewh2x.fsf@ziska.de>\n\t<20241002202217.GA6794@pendragon.ideasonboard.com>\n\t<87iku9xze9.fsf@ziska.de>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<87iku9xze9.fsf@ziska.de>","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":31566,"web_url":"https://patchwork.libcamera.org/comment/31566/","msgid":"<f0beaf7219b922c533f21b24649325558afef4e5.camel@ndufresne.ca>","date":"2024-10-03T14:16:39","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Le mercredi 02 octobre 2024 à 14:22 +0300, Laurent Pinchart a écrit :\n> On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n> > Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n> > > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> > > > Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > > > > Hi Jaslo,\n> > > > > \n> > > > > I think this series is close to being ready, and I would be very happy\n> > > > > to merge this much awaited feature. Do you plan to send a v3 ?\n> > > > \n> > > > Yes, I very much plan on continuing to work on this. I was a \n> > > > pretty busy the past month but I should have more time later in \n> > > > October.\n> > > > \n> > > > Unfortunately, I don't think that the series is quite ready. \n> > > > Nicolas had requested some bigger changes in v1 which still need \n> > > > to be discussed and implemented and I also want to add the \n> > > > readable/writeable and minimum/maximum properties to the yaml \n> > > > files (although this could also be done separately after \n> > > > merging).\n> > > \n> > > My proposal is to program a subset to be exposed as properties, the one that are\n> > > obviously usable and that the documentation make sense. I think you did a great\n> > > job on the generator and adding features later to support controls that have\n> > > more complex semantic is better then trying to support them all \n> > > in one go today.\n> > \n> > Sounds good. Where would you suggest the list of controls to be \n> > exposed should be? Maybe just a plain list in the Python generator \n> > file?\n> \n> The other option is to store the information in the yaml files. I don't\n> have a very strong opinion, the yaml files have the advantage that all\n> the data related to controls will be in a single place, but the\n> generator script has the advantage of keeping all gstreamer-related data\n> close to the gstreamer element. That may be useful when it will be time\n> to move libcamerasrc from the libcamera repository to the gstreamer\n> repository (if we ever do so). On the other hand, tha yaml files are not\n> installed, so there would still be issues.\n\nI would start simple and close to GStreamer at this stage. So just a list in the\ngenerator works for me.\n\n> \n> Complete brainstorming mode, I'm wondering if at some point in the\n> future it would make sense to handle the gstreamer controls in a more\n> dynamic fashion by querying libcamera at runtime instead of using code\n> generation. This doesn't invalidate the approach you've taken here, I\n> think code generation is good for the time being.\n\nGObject properties have to be setup at class instance creation time, which can\nonly happen once (unlike instance creation or the contructor). That limits how\n\"dynamic\" this can be. Dynamic class creation is possible, but have never been\ndone for possibly hot-pluggable devices (even though I will likely disable UVC\nsupport in our GStreamer element as folks are struggling getting on part support\nas what the v4l2src offers).\n\nThe code generator is by far a lot more straightforward to follow and maintain\nin my opinion. In the long term, we can use a hand written property to expose\nthe map of supported properties, which isn't different when you use libcamera\ndirectly, since the properties comes in that form.\n\nNicolas\n\n> \n> > > If the selection is all rw, the marking of that can wait. Min/max would be my\n> > > preference to have, but as we are breaking the API anyway still, we can also do\n> > > small break in the gstreamer element later too (as long as its well reported in\n> > > the release notes).\n> > \n> > You also suggested a GStreamer property that returns a \n> > GstStructure which lists all the actually present controls for the \n> > camera and their actual limits. Do you still want this implemented \n> > and if so how do you imagine this structure to be laid out?\n> > \n> > > > > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> > > > > > Hi everyone,\n> > > > > > \n> > > > > > this is the second version of the patch set to implement gstreamer controls\n> > > > > > from the yaml files.\n> > > > > > This now depends on \"[PATCH 00/10] libcamera: Improve code generation for\n> > > > > > controls\" for the code generation.\n> > > > > > \n> > > > > > The following things changed:\n> > > > > > \n> > > > > > The (old) third commit fixing a typo has been removed as it is already merged.\n> > > > > > \n> > > > > > The first commit is new: it removes the auto-focus-mode property from the\n> > > > > > device provider where it has been added on accident.\n> > > > > > \n> > > > > > The commit message has been updated in the second commit.\n> > > > > > \n> > > > > > The third commit, which adds the code that generates the gstreamer controls,\n> > > > > > now makes use of jinja2 and the new controls.py file. As a consequence the\n> > > > > > whole code generation has been redone.\n> > > > > > \n> > > > > > There are also some new features:\n> > > > > > \n> > > > > > It is now possible to read the metadata returned by requests from the gstreamer\n> > > > > > properties. This is done using a new function readMetadata() which reads the\n> > > > > > ControlList in requestCompleted().\n> > > > > > \n> > > > > > Before a control is set it is now checked whether this control is actually\n> > > > > > supported by the camera. This is done by checking the cameras ControlInfoMap.\n> > > > > > \n> > > > > > The Rectangle type is now supported.\n> > > > > > \n> > > > > > Some checks were added to make sure the arrays passed to the element have the\n> > > > > > correct length.\n> > > > > > \n> > > > > > Best regards,\n> > > > > > \n> > > > > > Jaslo\n> > > > > > \n> > > > > > Jaslo Ziska (3):\n> > > > > >   gstreamer: Remove auto-focus-mode property from device provider\n> > > > > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> > > > > >   gstreamer: Generate controls from control_ids_*.yaml files\n> > > > > > \n> > > > > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n> > > > > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> > > > > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> > > > > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> > > > > >  src/gstreamer/meson.build                  |  10 +\n> > > > > >  utils/codegen/controls.py                  |   8 +\n> > > > > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> > > > > >  utils/codegen/meson.build                  |   1 +\n> > > > > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> > > > > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> > > > > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> > > > > >  create mode 100755 utils/codegen/gen-gst-controls.py\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 4266ABD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Oct 2024 14:16:45 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id C234E63524;\n\tThu,  3 Oct 2024 16:16:43 +0200 (CEST)","from mail-qk1-x72d.google.com (mail-qk1-x72d.google.com\n\t[IPv6:2607:f8b0:4864:20::72d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B3C9162C92\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Oct 2024 16:16:41 +0200 (CEST)","by mail-qk1-x72d.google.com with SMTP id\n\taf79cd13be357-7a9aec89347so66714485a.0\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 03 Oct 2024 07:16:41 -0700 (PDT)","from nicolas-tpx395.lan ([2606:6d00:15:862e::7a9])\n\tby smtp.gmail.com with ESMTPSA id\n\taf79cd13be357-7ae6b3dc5a5sm53644385a.124.2024.10.03.07.16.39\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 03 Oct 2024 07:16:39 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=ndufresne-ca.20230601.gappssmtp.com\n\theader.i=@ndufresne-ca.20230601.gappssmtp.com\n\theader.b=\"h2br8FHA\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1727965000;\n\tx=1728569800; darn=lists.libcamera.org; \n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=p9GswE1rYdaCs5/NtEXxvbS9in+Df194lQ8d6Nm9gt4=;\n\tb=h2br8FHAYgTyWKMcVivFwFtm9Lm5RPC7F7FEUSYvs3VfjgehwfYLSXW6Jxnk4ubH7g\n\teIm/cB+aIYFal1m2zTrW9ohhxlGGFyttOjWmQl5tzH4SrsP8OFdq+Rwvf7TGayJPqSKe\n\tvF/ID3XyQ97Y2tXNbH3KLYCzj8AMMzngD+yo6voJGFsSipr9LmhaLK/g6fjWwesmpGib\n\tg8+su/GDfoOdK8uVye18nlvIWYWtkUdB4u/HVBpOV2FLtOF00XgfZGnTuPw5J5jaFP/t\n\tX2IEZHQe+1aEikzcYOcSDNEUbXtk7XRl04mgg9VJQWqBSR543mmqhaDxZc+L4k5shSEL\n\teVXw==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1727965000; x=1728569800;\n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=p9GswE1rYdaCs5/NtEXxvbS9in+Df194lQ8d6Nm9gt4=;\n\tb=NA43ws1ahj2Qn5qfOL1maRtcup84bnDD3m9cUjE3TrZutwFRPSakA6D1KVSzgADoPe\n\tHkqzpzYDHq1I+vi2FxoI17OEdhtG1O7JPw2BxDPAcS690D+WtN3oPeW0ZiCB05LtKrRO\n\t6jX/923/29WdJ8eG22RAARV8wMpZtNQbE+HzWRhn2CKGB2OFmcPyYS+9Tu92/GLSIndh\n\thzfj74pTBnBeskaDeQO7paKBSyXcv01u2U5XKmFcwXqbKhHmR/F01ZUZDD5chRTYCspS\n\tyA936MxYFBcIgXuBy+7rL/YEg3kLgAle9k27Zs4Hx7a2ft+yLdK68dCb8i67dEtiZH7V\n\tu7nA==","X-Gm-Message-State":"AOJu0YzDYJxI2BLjLm2Gp7rAtw6z2y+SDohzHBCJCvDareu+gFjj6zOG\n\t9kf6QFNVftSF616ekuuaLxT261wJXf9b1gyaAC+t8OSiAu4CHbRxrZjUzl6C6RgX8rJ/ogIebZ8\n\t/","X-Google-Smtp-Source":"AGHT+IGFn1LD1ZlRtfAdEbCSPJ6j6HrkAOZTyXF2r2zcskBoEPbeSJlY8PMl7/Ihl74p+jjuhZa5qQ==","X-Received":"by 2002:a05:620a:240f:b0:7a9:c298:60d1 with SMTP id\n\taf79cd13be357-7ae626d5385mr1150641085a.38.1727965000375; \n\tThu, 03 Oct 2024 07:16:40 -0700 (PDT)","Message-ID":"<f0beaf7219b922c533f21b24649325558afef4e5.camel@ndufresne.ca>","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","From":"Nicolas Dufresne <nicolas@ndufresne.ca>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Jaslo Ziska\n\t<jaslo@ziska.de>","Cc":"libcamera-devel@lists.libcamera.org","Date":"Thu, 03 Oct 2024 10:16:39 -0400","In-Reply-To":"<20241002112238.GE6672@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.52.4 (3.52.4-1.fc40) ","MIME-Version":"1.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":31567,"web_url":"https://patchwork.libcamera.org/comment/31567/","msgid":"<03bb4c52f64d3982aa1254cd463a49c384b82140.camel@ndufresne.ca>","date":"2024-10-03T14:19:41","subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","submitter":{"id":30,"url":"https://patchwork.libcamera.org/api/people/30/","name":"Nicolas Dufresne","email":"nicolas@ndufresne.ca"},"content":"Hi,\n\nLe jeudi 03 octobre 2024 à 15:10 +0300, Laurent Pinchart a écrit :\n> On Thu, Oct 03, 2024 at 12:18:54PM +0200, Jaslo Ziska wrote:\n> > Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > > On Wed, Oct 02, 2024 at 07:27:34PM +0200, Jaslo Ziska wrote:\n> > > > Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > > > > On Wed, Oct 02, 2024 at 12:04:08PM +0200, Jaslo Ziska wrote:\n> > > > > > Nicolas Dufresne <nicolas@ndufresne.ca> writes:\n> > > > > > > Le lundi 30 septembre 2024 à 11:11 +0200, Jaslo Ziska a écrit :\n> > > > > > > > Laurent Pinchart <laurent.pinchart@ideasonboard.com> writes:\n> > > > > > > > > Hi Jaslo,\n> > > > > > > > > \n> > > > > > > > > I think this series is close to being ready, and I would be very happy\n> > > > > > > > > to merge this much awaited feature. Do you plan to send a v3 ?\n> > > > > > > > \n> > > > > > > > Yes, I very much plan on continuing to work on this. I was a \n> > > > > > > > pretty busy the past month but I should have more time later in \n> > > > > > > > October.\n> > > > > > > > \n> > > > > > > > Unfortunately, I don't think that the series is quite ready. \n> > > > > > > > Nicolas had requested some bigger changes in v1 which still need \n> > > > > > > > to be discussed and implemented and I also want to add the \n> > > > > > > > readable/writeable and minimum/maximum properties to the yaml \n> > > > > > > > files (although this could also be done separately after merging).\n> > > > > > > \n> > > > > > > My proposal is to program a subset to be exposed as properties, the one that are\n> > > > > > > obviously usable and that the documentation make sense. I think you did a great\n> > > > > > > job on the generator and adding features later to support controls that have\n> > > > > > > more complex semantic is better then trying to support them all in one go today.\n> > > > > > \n> > > > > > Sounds good. Where would you suggest the list of controls to be \n> > > > > > exposed should be? Maybe just a plain list in the Python generator \n> > > > > > file?\n> > > > > \n> > > > > The other option is to store the information in the yaml files. I don't\n> > > > > have a very strong opinion, the yaml files have the advantage that all\n> > > > > the data related to controls will be in a single place, but the\n> > > > > generator script has the advantage of keeping all gstreamer-related data\n> > > > > close to the gstreamer element. That may be useful when it will be time\n> > > > > to move libcamerasrc from the libcamera repository to the gstreamer\n> > > > > repository (if we ever do so). On the other hand, tha yaml files are not\n> > > > > installed, so there would still be issues.\n> > > > \n> > > > Putting it inside the yaml would be an option, but I don't know \n> > > > whether having GStreamer specific stuff there is so good. But I \n> > > > think this will likely change anyway.\n> > > > \n> > > > > Complete brainstorming mode, I'm wondering if at some point in the\n> > > > > future it would make sense to handle the gstreamer controls in a more\n> > > > > dynamic fashion by querying libcamera at runtime instead of using code\n> > > > > generation. This doesn't invalidate the approach you've taken here, I\n> > > > > think code generation is good for the time being.\n> > > > \n> > > > If you mean that the GStreamer properties should get added later \n> > > > at runtime then this is unfortunately not possible. This is \n> > > > because the GStreamer controls are GObject properties and those \n> > > > need to be installed when the GObject object class is initialized. \n> > > > And because this happens before the GStreamer element is \n> > > > constructed (and therefore also before libcamera gets involved) it \n> > > > is not possible to know which properties are present and with \n> > > > which ranges.\n> > > \n> > > You can get the list of all the controls that libcamera supports from\n> > > libcamera::controls::controls. It's a global ControlIdMap variable, a\n> > > map from control numerical ids to ControlId instances. The ControlId\n> > > class gives you the control numerical id, its name, type, number of\n> > > elements if it's an array, and enumerators. We're adding the control\n> > > namespace as well, and could add additional information if needed. We\n> > > don't need to go this way though.\n> > \n> > Ah yes, I think that would work too, I never thought about it that \n> > way. This still would not help with the actually available \n> > controls for the camera unfortunately.\n> > \n> > I don't know which way would be the proper or better way to do it, \n> > both ways have their pros and cons.\n> > \n> > Using the yaml files and the code generator has more flexibility \n> > but adds the complexity of the extra code. And using the \n> > libcamera::controls::controls variable would probably simplify the \n> > code but makes the GStreamer element dependent on the information \n> > which are exposed by the variable.\n> \n> One thing missing in ControlId (beside the namespace that we will add\n> soon) that you would need for libcamerasrc is documentation. I'm not too\n> keen on adding that to ControlId, it's lots of text, which would\n> probably then need localization.\n\nWe have stopped localization of non-user facing text in GStreamer. That means\nthe documentation (including properties, signal, enums description), debug\ntraces and internal errors are not translated.\n\nNicolas\n\n> \n> > I'm open to both possibilities. Does anyone have opinions on this?\n> \n> I think it's more important at this point to have a working version than\n> a perfect version, so I'm fine continuing with the current approach.\n> \n> > > > The one thing that Nicolas suggested is adding a special property \n> > > > to the GStreamer element which can then return the available \n> > > > properties and their ranges at runtime. That would be the \n> > > > GstStructure which I was asking about.\n> > > > \n> > > > > > > If the selection is all rw, the marking of that can wait. \n> > > > > > > Min/max would be my\n> > > > > > > preference to have, but as we are breaking the API anyway \n> > > > > > > still, we can also do\n> > > > > > > small break in the gstreamer element later too (as long as \n> > > > > > > its well reported in\n> > > > > > > the release notes).\n> > > > > > \n> > > > > > You also suggested a GStreamer property that returns a \n> > > > > > GstStructure which lists all the actually present controls for the \n> > > > > > camera and their actual limits. Do you still want this implemented \n> > > > > > and if so how do you imagine this structure to be laid out?\n> > > > > > \n> > > > > > > > > On Tue, Aug 13, 2024 at 02:25:04PM +0200, Jaslo Ziska wrote:\n> > > > > > > > > > Hi everyone,\n> > > > > > > > > > \n> > > > > > > > > > this is the second version of the patch set to implement gstreamer controls\n> > > > > > > > > > from the yaml files.\n> > > > > > > > > > This now depends on \"[PATCH 00/10] libcamera: Improve code generation for\n> > > > > > > > > > controls\" for the code generation.\n> > > > > > > > > > \n> > > > > > > > > > The following things changed:\n> > > > > > > > > > \n> > > > > > > > > > The (old) third commit fixing a typo has been removed as it is already merged.\n> > > > > > > > > > \n> > > > > > > > > > The first commit is new: it removes the auto-focus-mode property from the\n> > > > > > > > > > device provider where it has been added on accident.\n> > > > > > > > > > \n> > > > > > > > > > The commit message has been updated in the second commit.\n> > > > > > > > > > \n> > > > > > > > > > The third commit, which adds the code that generates the gstreamer controls,\n> > > > > > > > > > now makes use of jinja2 and the new controls.py file. As a consequence the\n> > > > > > > > > > whole code generation has been redone.\n> > > > > > > > > > \n> > > > > > > > > > There are also some new features:\n> > > > > > > > > > \n> > > > > > > > > > It is now possible to read the metadata returned by requests from the gstreamer\n> > > > > > > > > > properties. This is done using a new function readMetadata() which reads the\n> > > > > > > > > > ControlList in requestCompleted().\n> > > > > > > > > > \n> > > > > > > > > > Before a control is set it is now checked whether this control is actually\n> > > > > > > > > > supported by the camera. This is done by checking the cameras ControlInfoMap.\n> > > > > > > > > > \n> > > > > > > > > > The Rectangle type is now supported.\n> > > > > > > > > > \n> > > > > > > > > > Some checks were added to make sure the arrays passed to the element have the\n> > > > > > > > > > correct length.\n> > > > > > > > > > \n> > > > > > > > > > Best regards,\n> > > > > > > > > > \n> > > > > > > > > > Jaslo\n> > > > > > > > > > \n> > > > > > > > > > Jaslo Ziska (3):\n> > > > > > > > > >   gstreamer: Remove auto-focus-mode property from device provider\n> > > > > > > > > >   gstreamer: Remove auto-focus-mode property from libcamerasrc\n> > > > > > > > > >   gstreamer: Generate controls from control_ids_*.yaml files\n> > > > > > > > > > \n> > > > > > > > > >  src/gstreamer/gstlibcamera-controls.cpp.in | 296 +++++++++++++++++++++\n> > > > > > > > > >  src/gstreamer/gstlibcamera-controls.h      |  43 +++\n> > > > > > > > > >  src/gstreamer/gstlibcameraprovider.cpp     |  15 --\n> > > > > > > > > >  src/gstreamer/gstlibcamerasrc.cpp          |  50 ++--\n> > > > > > > > > >  src/gstreamer/meson.build                  |  10 +\n> > > > > > > > > >  utils/codegen/controls.py                  |   8 +\n> > > > > > > > > >  utils/codegen/gen-gst-controls.py          | 151 +++++++++++\n> > > > > > > > > >  utils/codegen/meson.build                  |   1 +\n> > > > > > > > > >  8 files changed, 528 insertions(+), 46 deletions(-)\n> > > > > > > > > >  create mode 100644 src/gstreamer/gstlibcamera-controls.cpp.in\n> > > > > > > > > >  create mode 100644 src/gstreamer/gstlibcamera-controls.h\n> > > > > > > > > >  create mode 100755 utils/codegen/gen-gst-controls.py\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 602C4BD80A\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu,  3 Oct 2024 14:19:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 2A06C63524;\n\tThu,  3 Oct 2024 16:19:45 +0200 (CEST)","from mail-qk1-x736.google.com (mail-qk1-x736.google.com\n\t[IPv6:2607:f8b0:4864:20::736])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D91CC62C92\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu,  3 Oct 2024 16:19:43 +0200 (CEST)","by mail-qk1-x736.google.com with SMTP id\n\taf79cd13be357-7a9a7bea3cfso68551685a.1\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 03 Oct 2024 07:19:43 -0700 (PDT)","from nicolas-tpx395.lan ([2606:6d00:15:862e::7a9])\n\tby smtp.gmail.com with ESMTPSA id\n\taf79cd13be357-7ae6b3d421bsm54059785a.73.2024.10.03.07.19.42\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tThu, 03 Oct 2024 07:19:42 -0700 (PDT)"],"Authentication-Results":"lancelot.ideasonboard.com; dkim=pass (2048-bit key;\n\tunprotected) header.d=ndufresne-ca.20230601.gappssmtp.com\n\theader.i=@ndufresne-ca.20230601.gappssmtp.com\n\theader.b=\"BqHd3yeC\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ndufresne-ca.20230601.gappssmtp.com; s=20230601; t=1727965183;\n\tx=1728569983; darn=lists.libcamera.org; \n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:from:to:cc:subject\n\t:date:message-id:reply-to;\n\tbh=fv+eKLiiAKLJhkiebtOFJo0Y9zn1YZqNL4mU8djTTG8=;\n\tb=BqHd3yeCb6drZJ8ifTb4dkNp+7tLW8hB4nslSt56ZffvqtMDfIzuTLhif07xx1OugY\n\tnDNZIZziKvu4bAZsCE/9dBM6lhP/HuVp41pfPkOCpHoFcRAfrV0G2d1XZe6j/Up6BVDt\n\tsjNS0HaJAwtPosjlvovXVoEbiyml935t0Yijr04BgDUi2Maux7uyed6NoBOg9oaULhLX\n\tBzonw+y7vtyCXBIKGnkF6AeF0Bb0FHACz9kU64Kk28zHRwztDqTzJYLEgBcRPPYUfD/8\n\tRPBywDUWMV2ThDUjwO1CXXacU+DCDJuL8XCRdvYk6QUdKb3G5l6I9etn3z9C/m9j6kad\n\tevTQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20230601; t=1727965183; x=1728569983;\n\th=mime-version:user-agent:content-transfer-encoding:references\n\t:in-reply-to:date:cc:to:from:subject:message-id:x-gm-message-state\n\t:from:to:cc:subject:date:message-id:reply-to;\n\tbh=fv+eKLiiAKLJhkiebtOFJo0Y9zn1YZqNL4mU8djTTG8=;\n\tb=t6uzP7AqNIACJlEYkA7aj6zEgBfof9HxeKr0qv/NLPBMGJ4OmIyrLWr0DvtabMxGDU\n\tKAUGNUdzr+ZNAOg4YpznN31xXMmAfVP30/sf5EpWEwy5HuslQVuVinj3610YahqPaLn3\n\tktafeucIak2y4ayqHb/rPwgeiqx7AlSVO3wO+c9YOcPdX5jYiKr29kEZ4XCsaSru6whR\n\t6GO1ndeVBHB/vDrtr9kDSR1Tliiwfk8/Dphqntnrlb0uOJ/FLGNdm43MaDWW18HgLg63\n\tMa07uCF7QIRewresYbQZ+Bpz2/+rlKpS+20ANg+hrJ7HRa+cYJ+E5sGdNR8r5bk3De3Z\n\tvjtw==","X-Gm-Message-State":"AOJu0YxL8fC6HuCLTXha4fOHMNyNQ0pPgSMNbKGrnN4KH4EQw6uoHjxS\n\tiCaKwvVW2vvtHDJoI1fPCHWmoH9abEpVga/hNlrYpcnx0TzaVHJW5wWpbuv9gTw=","X-Google-Smtp-Source":"AGHT+IG3FsPe8UaBILKl/miwzvsJCiHtn6DhUfYlX8W+nsdoau8ntFmZzhkjRz1Jbmfnzk9+c5HHqg==","X-Received":"by 2002:a05:620a:1926:b0:7ac:b89f:5308 with SMTP id\n\taf79cd13be357-7ae626acf0bmr1179778985a.7.1727965182651; \n\tThu, 03 Oct 2024 07:19:42 -0700 (PDT)","Message-ID":"<03bb4c52f64d3982aa1254cd463a49c384b82140.camel@ndufresne.ca>","Subject":"Re: [PATCH v2 0/3] gstreamer: Generate controls from\n\tcontrol_ids_*.yaml files","From":"Nicolas Dufresne <nicolas@ndufresne.ca>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>, Jaslo Ziska\n\t<jaslo@ziska.de>","Cc":"libcamera-devel@lists.libcamera.org","Date":"Thu, 03 Oct 2024 10:19:41 -0400","In-Reply-To":"<20241003121057.GC32292@pendragon.ideasonboard.com>","References":"<20240813124722.22425-1-jaslo@ziska.de>\n\t<20240926220406.GA27534@pendragon.ideasonboard.com>\n\t<8734lhzeti.fsf@ziska.de>\n\t<826435b7709ca29b5fb66d66bc355cf463b4b2fa.camel@ndufresne.ca>\n\t<87h69u3jon.fsf@ziska.de>\n\t<20241002112238.GE6672@pendragon.ideasonboard.com>\n\t<8734lewh2x.fsf@ziska.de>\n\t<20241002202217.GA6794@pendragon.ideasonboard.com>\n\t<87iku9xze9.fsf@ziska.de>\n\t<20241003121057.GC32292@pendragon.ideasonboard.com>","Content-Type":"text/plain; charset=\"UTF-8\"","Content-Transfer-Encoding":"quoted-printable","User-Agent":"Evolution 3.52.4 (3.52.4-1.fc40) ","MIME-Version":"1.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>"}}]