[{"id":1711,"web_url":"https://patchwork.libcamera.org/comment/1711/","msgid":"<20190527185511.vum33cr3wzvnxjxe@uno.localdomain>","date":"2019-05-27T18:55:11","subject":"Re: [libcamera-devel] [PATCH 06/17] libcamera: v4l2_subdevice:\n\tBreakout mbus code enumeration","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas,\n\nOn Mon, May 27, 2019 at 02:15:32AM +0200, Niklas Söderlund wrote:\n> Simplify frame size enumeration by breaking out mbus code enumeration in\n> a helper. Making the code easier to read while also preparing for\n> enhancing the frame size enumeration. There is no functional change.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> ---\n>  src/libcamera/include/v4l2_subdevice.h |  1 +\n>  src/libcamera/v4l2_subdevice.cpp       | 60 +++++++++++++++-----------\n>  2 files changed, 35 insertions(+), 26 deletions(-)\n>\n> diff --git a/src/libcamera/include/v4l2_subdevice.h b/src/libcamera/include/v4l2_subdevice.h\n> index 3e4e5107aebeee06..e714e2575022c04d 100644\n> --- a/src/libcamera/include/v4l2_subdevice.h\n> +++ b/src/libcamera/include/v4l2_subdevice.h\n> @@ -57,6 +57,7 @@ protected:\n>  \tstd::string logPrefix() const;\n>\n>  private:\n> +\tstd::vector<unsigned int> enumPadCodes(unsigned int pad);\n>  \tint enumPadSizes(unsigned int pad, unsigned int code,\n>  \t\t\t std::vector<SizeRange> *size);\n>\n> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> index fceee33156e94212..51b0ffaafb3e668e 100644\n> --- a/src/libcamera/v4l2_subdevice.cpp\n> +++ b/src/libcamera/v4l2_subdevice.cpp\n> @@ -203,37 +203,15 @@ int V4L2Subdevice::setCompose(unsigned int pad, Rectangle *rect)\n>  FormatEnum V4L2Subdevice::formats(unsigned int pad)\n>  {\n>  \tFormatEnum formatMap = {};\n> -\tstruct v4l2_subdev_mbus_code_enum mbusEnum = {};\n> -\tint ret;\n>\n>  \tif (pad >= entity_->pads().size()) {\n>  \t\tLOG(V4L2Subdev, Error) << \"Invalid pad: \" << pad;\n> -\t\treturn formatMap;\n> +\t\treturn {};\n>  \t}\n>\n> -\tmbusEnum.pad = pad;\n> -\tmbusEnum.index = 0;\n> -\tmbusEnum.which = V4L2_SUBDEV_FORMAT_ACTIVE;\n> -\twhile (true) {\n> -\t\tret = ioctl(fd_, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbusEnum);\n> -\t\tif (ret)\n> -\t\t\tbreak;\n> -\n> -\t\tret = enumPadSizes(pad, mbusEnum.code,\n> -\t\t\t\t   &formatMap[mbusEnum.code]);\n> -\t\tif (ret)\n> -\t\t\tbreak;\n> -\n> -\t\tmbusEnum.index++;\n> -\t}\n> -\n> -\tif (ret && (errno != EINVAL && errno != ENOTTY)) {\n> -\t\tret = -errno;\n> -\t\tLOG(V4L2Subdev, Error)\n> -\t\t\t<< \"Unable to enumerate formats on pad \" << pad\n> -\t\t\t<< \": \" << strerror(-ret);\n> -\t\tformatMap.clear();\n> -\t}\n> +\tfor (unsigned int code : enumPadCodes(pad))\n> +\t\tif (enumPadSizes(pad, code, &formatMap[code]))\n> +\t\t\treturn {};\n>\n>  \treturn formatMap;\n>  }\n> @@ -328,6 +306,36 @@ std::string V4L2Subdevice::logPrefix() const\n>  \treturn \"'\" + entity_->name() + \"'\";\n>  }\n>\n> +std::vector<unsigned int> V4L2Subdevice::enumPadCodes(unsigned int pad)\n> +{\n> +\tstd::vector<unsigned int> codes;\n> +\tint ret;\n> +\n> +\tfor (unsigned int index = 0;; index++) {\n> +\t\tstruct v4l2_subdev_mbus_code_enum mbusEnum = {\n> +\t\t\t.pad = pad,\n> +\t\t\t.index = index,\n> +\t\t\t.which = V4L2_SUBDEV_FORMAT_ACTIVE,\n> +\t\t};\n> +\n> +\t\tret = ioctl(fd_, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbusEnum);\n> +\t\tif (ret)\n> +\t\t\tbreak;\n> +\n> +\t\tcodes.push_back(mbusEnum.code);\n> +\t}\n> +\n> +\tif (ret && errno != EINVAL) {\n\nI think you should handle -ENOTTY, otherwise devices not supporting\nframe enumeration would fail (which is maybe intended, don't know)\n\nThanks\n   j\n\n> +\t\tret = errno;\n> +\t\tLOG(V4L2Subdev, Error)\n> +\t\t\t<< \"Unable to enumerate formats on pad \" << pad\n> +\t\t\t<< \": \" << strerror(ret);\n> +\t\treturn {};\n> +\t}\n> +\n> +\treturn codes;\n> +}\n> +\n>  int V4L2Subdevice::enumPadSizes(unsigned int pad,unsigned int code,\n>  \t\t\t\tstd::vector<SizeRange> *sizes)\n>  {\n> --\n> 2.21.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":"<jacopo@jmondi.org>","Received":["from relay3-d.mail.gandi.net (relay3-d.mail.gandi.net\n\t[217.70.183.195])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 2EB1360E47\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tMon, 27 May 2019 20:54:05 +0200 (CEST)","from uno.localdomain (2-224-242-101.ip172.fastwebnet.it\n\t[2.224.242.101]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay3-d.mail.gandi.net (Postfix) with ESMTPSA id B4B6160009;\n\tMon, 27 May 2019 18:54:03 +0000 (UTC)"],"X-Originating-IP":"2.224.242.101","Date":"Mon, 27 May 2019 20:55:11 +0200","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":"<20190527185511.vum33cr3wzvnxjxe@uno.localdomain>","References":"<20190527001543.13593-1-niklas.soderlund@ragnatech.se>\n\t<20190527001543.13593-7-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"multipart/signed; micalg=pgp-sha256;\n\tprotocol=\"application/pgp-signature\"; boundary=\"2vwqg4jp5ywse2zb\"","Content-Disposition":"inline","In-Reply-To":"<20190527001543.13593-7-niklas.soderlund@ragnatech.se>","User-Agent":"NeoMutt/20180716","Subject":"Re: [libcamera-devel] [PATCH 06/17] libcamera: v4l2_subdevice:\n\tBreakout mbus code enumeration","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Mon, 27 May 2019 18:54:05 -0000"}},{"id":1803,"web_url":"https://patchwork.libcamera.org/comment/1803/","msgid":"<20190609123615.GE4778@pendragon.ideasonboard.com>","date":"2019-06-09T12:36:15","subject":"Re: [libcamera-devel] [PATCH 06/17] libcamera: v4l2_subdevice:\n\tBreakout mbus code enumeration","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Niklas,\n\nThank you for the patch.\n\nOn Mon, May 27, 2019 at 08:55:11PM +0200, Jacopo Mondi wrote:\n> On Mon, May 27, 2019 at 02:15:32AM +0200, Niklas Söderlund wrote:\n> > Simplify frame size enumeration by breaking out mbus code enumeration in\n> > a helper. Making the code easier to read while also preparing for\n\ns/. Making/, making/\n\n> > enhancing the frame size enumeration. There is no functional change.\n> >\n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > ---\n> >  src/libcamera/include/v4l2_subdevice.h |  1 +\n> >  src/libcamera/v4l2_subdevice.cpp       | 60 +++++++++++++++-----------\n> >  2 files changed, 35 insertions(+), 26 deletions(-)\n> >\n> > diff --git a/src/libcamera/include/v4l2_subdevice.h b/src/libcamera/include/v4l2_subdevice.h\n> > index 3e4e5107aebeee06..e714e2575022c04d 100644\n> > --- a/src/libcamera/include/v4l2_subdevice.h\n> > +++ b/src/libcamera/include/v4l2_subdevice.h\n> > @@ -57,6 +57,7 @@ protected:\n> >  \tstd::string logPrefix() const;\n> >\n> >  private:\n> > +\tstd::vector<unsigned int> enumPadCodes(unsigned int pad);\n> >  \tint enumPadSizes(unsigned int pad, unsigned int code,\n> >  \t\t\t std::vector<SizeRange> *size);\n> >\n> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> > index fceee33156e94212..51b0ffaafb3e668e 100644\n> > --- a/src/libcamera/v4l2_subdevice.cpp\n> > +++ b/src/libcamera/v4l2_subdevice.cpp\n> > @@ -203,37 +203,15 @@ int V4L2Subdevice::setCompose(unsigned int pad, Rectangle *rect)\n> >  FormatEnum V4L2Subdevice::formats(unsigned int pad)\n> >  {\n> >  \tFormatEnum formatMap = {};\n> > -\tstruct v4l2_subdev_mbus_code_enum mbusEnum = {};\n> > -\tint ret;\n> >\n> >  \tif (pad >= entity_->pads().size()) {\n> >  \t\tLOG(V4L2Subdev, Error) << \"Invalid pad: \" << pad;\n> > -\t\treturn formatMap;\n> > +\t\treturn {};\n> >  \t}\n> >\n> > -\tmbusEnum.pad = pad;\n> > -\tmbusEnum.index = 0;\n> > -\tmbusEnum.which = V4L2_SUBDEV_FORMAT_ACTIVE;\n> > -\twhile (true) {\n> > -\t\tret = ioctl(fd_, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbusEnum);\n> > -\t\tif (ret)\n> > -\t\t\tbreak;\n> > -\n> > -\t\tret = enumPadSizes(pad, mbusEnum.code,\n> > -\t\t\t\t   &formatMap[mbusEnum.code]);\n> > -\t\tif (ret)\n> > -\t\t\tbreak;\n> > -\n> > -\t\tmbusEnum.index++;\n> > -\t}\n> > -\n> > -\tif (ret && (errno != EINVAL && errno != ENOTTY)) {\n> > -\t\tret = -errno;\n> > -\t\tLOG(V4L2Subdev, Error)\n> > -\t\t\t<< \"Unable to enumerate formats on pad \" << pad\n> > -\t\t\t<< \": \" << strerror(-ret);\n> > -\t\tformatMap.clear();\n> > -\t}\n> > +\tfor (unsigned int code : enumPadCodes(pad))\n> > +\t\tif (enumPadSizes(pad, code, &formatMap[code]))\n> > +\t\t\treturn {};\n> >\n> >  \treturn formatMap;\n> >  }\n> > @@ -328,6 +306,36 @@ std::string V4L2Subdevice::logPrefix() const\n> >  \treturn \"'\" + entity_->name() + \"'\";\n> >  }\n> >\n> > +std::vector<unsigned int> V4L2Subdevice::enumPadCodes(unsigned int pad)\n> > +{\n> > +\tstd::vector<unsigned int> codes;\n> > +\tint ret;\n> > +\n> > +\tfor (unsigned int index = 0;; index++) {\n\ns/;;/; ;/\n\n> > +\t\tstruct v4l2_subdev_mbus_code_enum mbusEnum = {\n> > +\t\t\t.pad = pad,\n> > +\t\t\t.index = index,\n> > +\t\t\t.which = V4L2_SUBDEV_FORMAT_ACTIVE,\n> > +\t\t};\n> > +\n> > +\t\tret = ioctl(fd_, VIDIOC_SUBDEV_ENUM_MBUS_CODE, &mbusEnum);\n> > +\t\tif (ret)\n> > +\t\t\tbreak;\n> > +\n> > +\t\tcodes.push_back(mbusEnum.code);\n> > +\t}\n> > +\n> > +\tif (ret && errno != EINVAL) {\n> \n> I think you should handle -ENOTTY, otherwise devices not supporting\n> frame enumeration would fail (which is maybe intended, don't know)\n\nThat's a failure, so we should return an empty vector, but we could\npossibly skip the error message.\n\n> > +\t\tret = errno;\n> > +\t\tLOG(V4L2Subdev, Error)\n> > +\t\t\t<< \"Unable to enumerate formats on pad \" << pad\n> > +\t\t\t<< \": \" << strerror(ret);\n> > +\t\treturn {};\n> > +\t}\n> > +\n> > +\treturn codes;\n> > +}\n> > +\n> >  int V4L2Subdevice::enumPadSizes(unsigned int pad,unsigned int code,\n> >  \t\t\t\tstd::vector<SizeRange> *sizes)\n> >  {","headers":{"Return-Path":"<laurent.pinchart@ideasonboard.com>","Received":["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 E8FF761D57\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tSun,  9 Jun 2019 14:36:29 +0200 (CEST)","from pendragon.ideasonboard.com (unknown\n\t[IPv6:2a02:a03f:44f0:8500:ca05:8177:199c:fed4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 5E3895D;\n\tSun,  9 Jun 2019 14:36:29 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1560083789;\n\tbh=zE3nzHdxx27m99QYe4QEVm7lqN95/9S1Dl3RVU/vKjY=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=SCfgozkuoel68m2cvfYS3/dyR06GK3NOJMJM89ABy8yKJHlM9U00G6dnmXDMkJ67y\n\tXkMakbZOeo2kIapSa9NXiEqE5/hWJOtE7Ez8F1bEzjQzYGQE0IxWHQact206G3WF62\n\tXdU1Jrjgto5Rf7lRl6oytr9M4Z1QYi0PLBB0CZpE=","Date":"Sun, 9 Jun 2019 15:36:15 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"Jacopo Mondi <jacopo@jmondi.org>, libcamera-devel@lists.libcamera.org","Message-ID":"<20190609123615.GE4778@pendragon.ideasonboard.com>","References":"<20190527001543.13593-1-niklas.soderlund@ragnatech.se>\n\t<20190527001543.13593-7-niklas.soderlund@ragnatech.se>\n\t<20190527185511.vum33cr3wzvnxjxe@uno.localdomain>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190527185511.vum33cr3wzvnxjxe@uno.localdomain>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH 06/17] libcamera: v4l2_subdevice:\n\tBreakout mbus code enumeration","X-BeenThere":"libcamera-devel@lists.libcamera.org","X-Mailman-Version":"2.1.23","Precedence":"list","List-Id":"<libcamera-devel.lists.libcamera.org>","List-Unsubscribe":"<https://lists.libcamera.org/options/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=unsubscribe>","List-Archive":"<https://lists.libcamera.org/pipermail/libcamera-devel/>","List-Post":"<mailto:libcamera-devel@lists.libcamera.org>","List-Help":"<mailto:libcamera-devel-request@lists.libcamera.org?subject=help>","List-Subscribe":"<https://lists.libcamera.org/listinfo/libcamera-devel>,\n\t<mailto:libcamera-devel-request@lists.libcamera.org?subject=subscribe>","X-List-Received-Date":"Sun, 09 Jun 2019 12:36:30 -0000"}}]