[{"id":3207,"web_url":"https://patchwork.libcamera.org/comment/3207/","msgid":"<20191206230605.GV28879@bigcity.dyn.berto.se>","date":"2019-12-06T23:06:05","subject":"Re: [libcamera-devel] [PATCH v2 10/10] cam: Add option to list\n\tcamera properties","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Jacopo,\n\nThanks for your work.\n\nOn 2019-12-05 21:43:50 +0100, Jacopo Mondi wrote:\n> Add the '-p'|'--props' option to the cam application to list the\n> properties of a camera.\n\nI would make the long option --properties or maybe even \n--list-properties.\n\n> \n> Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/cam/main.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++\n>  src/cam/main.h   |  1 +\n>  2 files changed, 61 insertions(+)\n> \n> diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> index a38cca959aca..7e1eb20d6df7 100644\n> --- a/src/cam/main.cpp\n> +++ b/src/cam/main.cpp\n> @@ -11,6 +11,7 @@\n>  #include <string.h>\n>  \n>  #include <libcamera/libcamera.h>\n> +#include <libcamera/property_ids.h>\n>  \n>  #include \"capture.h\"\n>  #include \"event_loop.h\"\n> @@ -36,6 +37,7 @@ public:\n>  private:\n>  \tint parseOptions(int argc, char *argv[]);\n>  \tint prepareConfig();\n> +\tint listProperties();\n>  \tint infoConfiguration();\n>  \tint run();\n>  \n> @@ -180,6 +182,7 @@ int CamApp::parseOptions(int argc, char *argv[])\n>  \tparser.addOption(OptInfo, OptionNone,\n>  \t\t\t \"Display information about stream(s)\", \"info\");\n>  \tparser.addOption(OptList, OptionNone, \"List all cameras\", \"list\");\n> +\tparser.addOption(OptProps, OptionNone, \"List the cameras properties\", \"props\");\n\nList camera properties ?\n\n>  \n>  \toptions_ = parser.parse(argc, argv);\n>  \tif (!options_.valid())\n> @@ -268,6 +271,47 @@ int CamApp::prepareConfig()\n>  \treturn 0;\n>  }\n>  \n> +int CamApp::listProperties()\n> +{\n> +\tif (!camera_) {\n> +\t\tstd::cout << \"Cannot list properties without a camera\"\n> +\t\t\t  << std::endl;\n> +\t\treturn -EINVAL;\n> +\t}\n> +\n> +\tconst ControlList &properties = camera_->properties();\n> +\tfor (const auto &prop : properties) {\n> +\t\tunsigned int id = prop.first;\n> +\t\tconst auto &ctrlId = properties::properties.find(id);\n> +\t\tconst ControlId *ctrl = ctrlId->second;\n> +\t\tconst ControlValue &value = prop.second;\n> +\n> +\t\tstd::cout << \"Property: \" << ctrl->name() << \" = \";\n> +\n> +\t\tswitch (ctrl->type()) {\n> +\t\tcase ControlTypeBool: {\n> +\t\t\tbool val = value.get<bool>();\n> +\t\t\tstd::cout << (val ? \"True\" : \"False\") << std::endl;\n> +\t\t\tbreak;\n> +\t\t}\n> +\t\tcase ControlTypeInteger32: {\n> +\t\t\tint32_t val = value.get<int32_t>();\n> +\t\t\tstd::cout << val << std::endl;\n> +\t\t\tbreak;\n> +\t\t}\n> +\t\tcase ControlTypeInteger64: {\n> +\t\t\tint64_t val = value.get<int64_t>();\n> +\t\t\tstd::cout << val << std::endl;\n> +\t\t\tbreak;\n> +\t\t}\n> +\t\tdefault:\n> +\t\t\tbreak;\n> +\t\t}\n> +\t}\n> +\n> +\treturn 0;\n> +}\n> +\n>  int CamApp::infoConfiguration()\n>  {\n>  \tif (!config_) {\n> @@ -309,9 +353,25 @@ int CamApp::run()\n>  \t\tfor (const std::shared_ptr<Camera> &cam : cm_->cameras()) {\n>  \t\t\tstd::cout << index << \": \" << cam->name() << std::endl;\n>  \t\t\tindex++;\n> +\n> +\t\t\tconst ControlList &properties = cam->properties();\n> +\t\t\tfor (const auto &prop : properties) {\n> +\t\t\t\tauto it = properties::properties.find(prop.first);\n> +\t\t\t\tif (it == properties::properties.end())\n> +\t\t\t\t\tcontinue;\n> +\n> +\t\t\t\tstd::cout << it->second->name() << \": \" <<\n> +\t\t\t\t\tprop.second.get<int32_t>() << \"\\n\";\n> +\t\t\t}\n\nI don't think we wish to list properties when listing the camera.\n\n>  \t\t}\n>  \t}\n>  \n> +\tif (options_.isSet(OptProps)) {\n> +\t\tret = listProperties();\n> +\t\tif (ret)\n> +\t\t\treturn ret;\n> +\t}\n\nMaybe this shall be merged with the OptInfo option (and it's help \nupdated that it list information about a camera and all its streams)?\n\n> +\n>  \tif (options_.isSet(OptInfo)) {\n>  \t\tret = infoConfiguration();\n>  \t\tif (ret)\n> diff --git a/src/cam/main.h b/src/cam/main.h\n> index 0997476bb335..afcad4353b7d 100644\n> --- a/src/cam/main.h\n> +++ b/src/cam/main.h\n> @@ -14,6 +14,7 @@ enum {\n>  \tOptHelp = 'h',\n>  \tOptInfo = 'I',\n>  \tOptList = 'l',\n> +\tOptProps = 'p',\n>  \tOptStream = 's',\n>  };\n>  \n> -- \n> 2.23.0\n> \n> _______________________________________________\n> libcamera-devel mailing list\n> libcamera-devel@lists.libcamera.org\n> https://lists.libcamera.org/listinfo/libcamera-devel","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lf1-x12d.google.com (mail-lf1-x12d.google.com\n\t[IPv6:2a00:1450:4864:20::12d])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 9318C60BBC\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSat,  7 Dec 2019 00:06:07 +0100 (CET)","by mail-lf1-x12d.google.com with SMTP id 15so6490344lfr.2\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 06 Dec 2019 15:06:07 -0800 (PST)","from localhost (h-93-159.A463.priv.bahnhof.se. [46.59.93.159])\n\tby smtp.gmail.com with ESMTPSA id\n\t22sm8248661ljw.9.2019.12.06.15.06.06\n\t(version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);\n\tFri, 06 Dec 2019 15:06:06 -0800 (PST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=ragnatech-se.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:content-transfer-encoding:in-reply-to\n\t:user-agent; bh=JxZvlAn1xMpLApVysSm7JOORvMd3zF74c0msrJev658=;\n\tb=S6N6K8DczgIGp+ctemjB5lhy/34A9H9rF02UjrTwiAus1JlQejDgrflZ1oQ/lqsopO\n\tRlkWgJdr9G2LsF3G6zUjTnJSrDCNPZjRa23wihXpNq9XKJi60BvDwEw/rXjH1OSswl0l\n\th2ZlZfISU5U6RgSrscFwUPm7EKwYRo3MxFCaA3Wj/Mu13uXTJOzAavKciWotb34LrSeq\n\t1dqDQakjLDJNMETCkyp7UpNH/R6AqN9Hkha2rIMsgi/6czlY9FfvAMzaKIOR2N8TC8ub\n\tUDBJ+5Z4GJ7BhyxbjSCbHPqusudPi3J3A62FjqS8NR1lNrMBsS8NDSLj8DBaSN5Lw2q+\n\ttDEQ==","X-Google-DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:content-transfer-encoding\n\t:in-reply-to:user-agent;\n\tbh=JxZvlAn1xMpLApVysSm7JOORvMd3zF74c0msrJev658=;\n\tb=qvMRlO8+1qZjMX587k/r0BwLYTAa4QhDhxTUpLKBm9rsF3cWwntgEVesWLWKbF51u1\n\tD+9LEIspa981F8srgl6CGhXrbBC6mR/r7QW31a5UjiAMC7KNnt+E5GAaxiAsJp1c9KgK\n\tvPPRde7F8IdKVnGz+4tBM4oZEDUOp7mxZfPOKYMH5BmJk3QAC1nKt7LdzF6otLG3Ippx\n\tw7Oucl0a/sJB6NRse3vH6Bo9J25xGK50S+Hs+MgjQ/zHARRr0ukMMjbYrM3j25zMGqNb\n\t7ep32+R2CEGMFdC0zCN0KFkUza8PlGZEZ4BmYvFaGIrSEwYephKW5rY5rc96yhrgvgnU\n\tbH1A==","X-Gm-Message-State":"APjAAAV270vSIZfMJI2gqkqfuO151qK+kinS+qVBtm+fA9M3/1HJQAly\n\tyuCtZE0hsOw3gLMv5Lr0BPyYbicx2To=","X-Google-Smtp-Source":"APXvYqyfSt4eV8RZxvDOO7KCs1KTpsnF0Fk6/lNkuZliL+Veq3sAbhSRYJmgsKK8dZBaisxfw8aXsQ==","X-Received":"by 2002:a19:8a06:: with SMTP id m6mr8529037lfd.99.1575673566953; \n\tFri, 06 Dec 2019 15:06:06 -0800 (PST)","Date":"Sat, 7 Dec 2019 00:06:05 +0100","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Jacopo Mondi <jacopo@jmondi.org>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191206230605.GV28879@bigcity.dyn.berto.se>","References":"<20191205204350.28196-1-jacopo@jmondi.org>\n\t<20191205204350.28196-11-jacopo@jmondi.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20191205204350.28196-11-jacopo@jmondi.org>","User-Agent":"Mutt/1.12.1 (2019-06-15)","Subject":"Re: [libcamera-devel] [PATCH v2 10/10] cam: Add option to list\n\tcamera properties","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>","X-List-Received-Date":"Fri, 06 Dec 2019 23:06:07 -0000"}},{"id":3224,"web_url":"https://patchwork.libcamera.org/comment/3224/","msgid":"<20191209162641.ldn2ehaaf2if5bet@uno.localdomain>","date":"2019-12-09T16:28:47","subject":"Re: [libcamera-devel] [PATCH v2 10/10] cam: Add option to list\n\tcamera properties","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n\nOn Sat, Dec 07, 2019 at 12:06:05AM +0100, Niklas Söderlund wrote:\n> Hi Jacopo,\n>\n> Thanks for your work.\n>\n> On 2019-12-05 21:43:50 +0100, Jacopo Mondi wrote:\n> > Add the '-p'|'--props' option to the cam application to list the\n> > properties of a camera.\n>\n> I would make the long option --properties or maybe even\n> --list-properties.\n>\n\nack\n\n> >\n> > Signed-off-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/cam/main.cpp | 60 ++++++++++++++++++++++++++++++++++++++++++++++++\n> >  src/cam/main.h   |  1 +\n> >  2 files changed, 61 insertions(+)\n> >\n> > diff --git a/src/cam/main.cpp b/src/cam/main.cpp\n> > index a38cca959aca..7e1eb20d6df7 100644\n> > --- a/src/cam/main.cpp\n> > +++ b/src/cam/main.cpp\n> > @@ -11,6 +11,7 @@\n> >  #include <string.h>\n> >\n> >  #include <libcamera/libcamera.h>\n> > +#include <libcamera/property_ids.h>\n> >\n> >  #include \"capture.h\"\n> >  #include \"event_loop.h\"\n> > @@ -36,6 +37,7 @@ public:\n> >  private:\n> >  \tint parseOptions(int argc, char *argv[]);\n> >  \tint prepareConfig();\n> > +\tint listProperties();\n> >  \tint infoConfiguration();\n> >  \tint run();\n> >\n> > @@ -180,6 +182,7 @@ int CamApp::parseOptions(int argc, char *argv[])\n> >  \tparser.addOption(OptInfo, OptionNone,\n> >  \t\t\t \"Display information about stream(s)\", \"info\");\n> >  \tparser.addOption(OptList, OptionNone, \"List all cameras\", \"list\");\n> > +\tparser.addOption(OptProps, OptionNone, \"List the cameras properties\", \"props\");\n>\n> List camera properties ?\n>\n> >\n> >  \toptions_ = parser.parse(argc, argv);\n> >  \tif (!options_.valid())\n> > @@ -268,6 +271,47 @@ int CamApp::prepareConfig()\n> >  \treturn 0;\n> >  }\n> >\n> > +int CamApp::listProperties()\n> > +{\n> > +\tif (!camera_) {\n> > +\t\tstd::cout << \"Cannot list properties without a camera\"\n> > +\t\t\t  << std::endl;\n> > +\t\treturn -EINVAL;\n> > +\t}\n> > +\n> > +\tconst ControlList &properties = camera_->properties();\n> > +\tfor (const auto &prop : properties) {\n> > +\t\tunsigned int id = prop.first;\n> > +\t\tconst auto &ctrlId = properties::properties.find(id);\n> > +\t\tconst ControlId *ctrl = ctrlId->second;\n> > +\t\tconst ControlValue &value = prop.second;\n> > +\n> > +\t\tstd::cout << \"Property: \" << ctrl->name() << \" = \";\n> > +\n> > +\t\tswitch (ctrl->type()) {\n> > +\t\tcase ControlTypeBool: {\n> > +\t\t\tbool val = value.get<bool>();\n> > +\t\t\tstd::cout << (val ? \"True\" : \"False\") << std::endl;\n> > +\t\t\tbreak;\n> > +\t\t}\n> > +\t\tcase ControlTypeInteger32: {\n> > +\t\t\tint32_t val = value.get<int32_t>();\n> > +\t\t\tstd::cout << val << std::endl;\n> > +\t\t\tbreak;\n> > +\t\t}\n> > +\t\tcase ControlTypeInteger64: {\n> > +\t\t\tint64_t val = value.get<int64_t>();\n> > +\t\t\tstd::cout << val << std::endl;\n> > +\t\t\tbreak;\n> > +\t\t}\n> > +\t\tdefault:\n> > +\t\t\tbreak;\n> > +\t\t}\n> > +\t}\n> > +\n> > +\treturn 0;\n> > +}\n> > +\n> >  int CamApp::infoConfiguration()\n> >  {\n> >  \tif (!config_) {\n> > @@ -309,9 +353,25 @@ int CamApp::run()\n> >  \t\tfor (const std::shared_ptr<Camera> &cam : cm_->cameras()) {\n> >  \t\t\tstd::cout << index << \": \" << cam->name() << std::endl;\n> >  \t\t\tindex++;\n> > +\n> > +\t\t\tconst ControlList &properties = cam->properties();\n> > +\t\t\tfor (const auto &prop : properties) {\n> > +\t\t\t\tauto it = properties::properties.find(prop.first);\n> > +\t\t\t\tif (it == properties::properties.end())\n> > +\t\t\t\t\tcontinue;\n> > +\n> > +\t\t\t\tstd::cout << it->second->name() << \": \" <<\n> > +\t\t\t\t\tprop.second.get<int32_t>() << \"\\n\";\n> > +\t\t\t}\n>\n> I don't think we wish to list properties when listing the camera.\n>\n\nThat's indeed a leftover.\n\n> >  \t\t}\n> >  \t}\n> >\n> > +\tif (options_.isSet(OptProps)) {\n> > +\t\tret = listProperties();\n> > +\t\tif (ret)\n> > +\t\t\treturn ret;\n> > +\t}\n>\n> Maybe this shall be merged with the OptInfo option (and it's help\n> updated that it list information about a camera and all its streams)?\n>\n\nNot sure if your comment applies to the listProperties function or to\nthe leftover. I will keep the two options separate and just take in\nyour suggested changes for now.\n\nThanks\n   j\n\n> > +\n> >  \tif (options_.isSet(OptInfo)) {\n> >  \t\tret = infoConfiguration();\n> >  \t\tif (ret)\n> > diff --git a/src/cam/main.h b/src/cam/main.h\n> > index 0997476bb335..afcad4353b7d 100644\n> > --- a/src/cam/main.h\n> > +++ b/src/cam/main.h\n> > @@ -14,6 +14,7 @@ enum {\n> >  \tOptHelp = 'h',\n> >  \tOptInfo = 'I',\n> >  \tOptList = 'l',\n> > +\tOptProps = 'p',\n> >  \tOptStream = 's',\n> >  };\n> >\n> > --\n> > 2.23.0\n> >\n> > _______________________________________________\n> > libcamera-devel mailing list\n> > libcamera-devel@lists.libcamera.org\n> > https://lists.libcamera.org/listinfo/libcamera-devel\n>\n> --\n> Regards,\n> Niklas Söderlund","headers":{"Return-Path":"<jacopo@jmondi.org>","Received":["from relay5-d.mail.gandi.net (relay5-d.mail.gandi.net\n\t[217.70.183.197])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id D327E60BDB\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon,  9 Dec 2019 17:26:39 +0100 (CET)","from uno.localdomain (93-34-114-233.ip49.fastwebnet.it\n\t[93.34.114.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay5-d.mail.gandi.net (Postfix) with ESMTPSA id 444C71C0004;\n\tMon,  9 Dec 2019 16:26:39 +0000 (UTC)"],"X-Originating-IP":"93.34.114.233","Date":"Mon, 9 Dec 2019 17:28:47 +0100","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20191209162641.ldn2ehaaf2if5bet@uno.localdomain>","References":"<20191205204350.28196-1-jacopo@jmondi.org>\n\t<20191205204350.28196-11-jacopo@jmondi.org>\n\t<20191206230605.GV28879@bigcity.dyn.berto.se>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"hxrjbzeb27lkbpbr\"","Content-Disposition":"inline","In-Reply-To":"<20191206230605.GV28879@bigcity.dyn.berto.se>","Subject":"Re: [libcamera-devel] [PATCH v2 10/10] cam: Add option to list\n\tcamera properties","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>","X-List-Received-Date":"Mon, 09 Dec 2019 16:26:40 -0000"}}]