[{"id":1917,"web_url":"https://patchwork.libcamera.org/comment/1917/","msgid":"<20190618230727.GO23556@pendragon.ideasonboard.com>","date":"2019-06-18T23:07:27","subject":"Re: [libcamera-devel] [PATCH v3 09/16] libcamera: v4l2_device: Add\n\tenumeration of pixelformats and frame sizes","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 Sun, Jun 16, 2019 at 03:33:55PM +0200, Niklas Söderlund wrote:\n> Add methods to enumerate pixelformats and frame sizes from a v4l2\n> device. The interface is similar to how V4L2Subdevice enumerates mbus\n> codes and frame sizes.\n> \n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> ---\n>  src/libcamera/include/v4l2_device.h |   5 ++\n>  src/libcamera/v4l2_device.cpp       | 110 ++++++++++++++++++++++++++++\n>  2 files changed, 115 insertions(+)\n> \n> diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h\n> index bdecc087fe5afae0..1a67850ac4c1088f 100644\n> --- a/src/libcamera/include/v4l2_device.h\n> +++ b/src/libcamera/include/v4l2_device.h\n> @@ -16,6 +16,7 @@\n>  #include <libcamera/geometry.h>\n>  #include <libcamera/signal.h>\n>  \n> +#include \"formats.h\"\n>  #include \"log.h\"\n>  \n>  namespace libcamera {\n> @@ -132,6 +133,7 @@ public:\n>  \n>  \tint getFormat(V4L2DeviceFormat *format);\n>  \tint setFormat(V4L2DeviceFormat *format);\n> +\tImageFormats formats();\n>  \n>  \tint exportBuffers(BufferPool *pool);\n>  \tint importBuffers(BufferPool *pool);\n> @@ -163,6 +165,9 @@ private:\n>  \tint createPlane(Buffer *buffer, unsigned int plane,\n>  \t\t\tunsigned int length);\n>  \n> +\tstd::vector<unsigned int> enumPixelformats();\n> +\tstd::vector<SizeRange> enumSizes(unsigned int pixelFormat);\n> +\n>  \tBuffer *dequeueBuffer();\n>  \tvoid bufferAvailable(EventNotifier *notifier);\n>  \n> diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> index 0821bd75fb428766..96aa525025629697 100644\n> --- a/src/libcamera/v4l2_device.cpp\n> +++ b/src/libcamera/v4l2_device.cpp\n> @@ -634,6 +634,29 @@ int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format)\n>  \treturn 0;\n>  }\n>  \n> +/**\n> + * \\brief Enumerate all pixel formats and frame sizes\n> + *\n> + * Enumerate all pixel formats and frame sizes supported by the video device.\n> + *\n> + * \\return A list of the supported device formats\n> + */\n> +ImageFormats V4L2Device::formats()\n> +{\n> +\tImageFormats formats;\n> +\n> +\tfor (unsigned int pixelformat : enumPixelformats()) {\n> +\t\tif (formats.addFormat(pixelformat, enumSizes(pixelformat))) {\n> +\t\t\tLOG(V4L2, Error)\n> +\t\t\t\t<< \"Could not add sizes for pixel format \"\n> +\t\t\t\t<< pixelformat;\n> +\t\t\treturn {};\n> +\t\t}\n\nI think you should catch the error from enumSizes() and return {}. I\nwould also extend the documentation a little bit, you can copy the one\nfrom the V4L2Subdevice class.\n\n> +\t}\n> +\n> +\treturn formats;\n> +}\n> +\n>  int V4L2Device::requestBuffers(unsigned int count)\n>  {\n>  \tstruct v4l2_requestbuffers rb = {};\n> @@ -763,6 +786,93 @@ int V4L2Device::createPlane(Buffer *buffer, unsigned int planeIndex,\n>  \treturn 0;\n>  }\n>  \n> +std::vector<unsigned int> V4L2Device::enumPixelformats()\n> +{\n> +\tstd::vector<unsigned int> formats;\n> +\tint ret;\n> +\n> +\tfor (unsigned int index = 0; ; index++) {\n> +\t\tstruct v4l2_fmtdesc pixelformatEnum = {};\n> +\t\tpixelformatEnum.index = index;\n> +\t\tpixelformatEnum.type = bufferType_;\n> +\n> +\t\tret = ioctl(fd_, VIDIOC_ENUM_FMT, &pixelformatEnum);\n> +\t\tif (ret)\n> +\t\t\tbreak;\n> +\n> +\t\tformats.push_back(pixelformatEnum.pixelformat);\n> +\t}\n> +\n> +\tif (ret && errno != EINVAL) {\n> +\t\tret = -errno;\n> +\t\tLOG(V4L2, Error)\n> +\t\t\t<< \"Unable to enumerate pixelformats: \"\n\ns/pixelformats/pixel formats/\n\n> +\t\t\t<< strerror(-ret);\n> +\t\treturn {};\n> +\t}\n> +\n> +\treturn formats;\n> +}\n> +\n> +std::vector<SizeRange> V4L2Device::enumSizes(unsigned int pixelFormat)\n> +{\n> +\tstd::vector<SizeRange> sizes;\n> +\tint ret;\n> +\n> +\tfor (unsigned int index = 0;; index++) {\n> +\t\tstruct v4l2_frmsizeenum frameSize = {};\n> +\t\tframeSize.index = index;\n> +\t\tframeSize.pixel_format = pixelFormat;\n> +\n> +\t\tret = ioctl(fd_, VIDIOC_ENUM_FRAMESIZES, &frameSize);\n> +\t\tif (ret)\n> +\t\t\tbreak;\n> +\n> +\t\tif (index != 0 &&\n> +\t\t    frameSize.type != V4L2_FRMSIZE_TYPE_DISCRETE) {\n> +\t\t\tLOG(V4L2, Error)\n> +\t\t\t\t<< \"Non-zero index for non discrete type\";\n> +\t\t\treturn {};\n> +\t\t}\n> +\n> +\t\tswitch (frameSize.type) {\n> +\t\tcase V4L2_FRMSIZE_TYPE_DISCRETE:\n> +\t\t\tsizes.emplace_back(frameSize.discrete.width,\n> +\t\t\t\t\t   frameSize.discrete.height);\n> +\t\t\tbreak;\n> +\t\tcase V4L2_FRMSIZE_TYPE_CONTINUOUS:\n> +\t\t\tsizes.emplace_back(frameSize.stepwise.min_width,\n> +\t\t\t\t\t   frameSize.stepwise.min_height,\n> +\t\t\t\t\t   frameSize.stepwise.max_width,\n> +\t\t\t\t\t   frameSize.stepwise.max_height);\n> +\t\t\tbreak;\n> +\t\tcase V4L2_FRMSIZE_TYPE_STEPWISE:\n> +\t\t\tsizes.emplace_back(frameSize.stepwise.min_width,\n> +\t\t\t\t\t   frameSize.stepwise.min_height,\n> +\t\t\t\t\t   frameSize.stepwise.max_width,\n> +\t\t\t\t\t   frameSize.stepwise.max_height,\n> +\t\t\t\t\t   frameSize.stepwise.step_width,\n> +\t\t\t\t\t   frameSize.stepwise.step_height);\n> +\t\t\tbreak;\n> +\t\tdefault:\n> +\t\t\tLOG(V4L2, Error)\n> +\t\t\t\t<< \"Unknown VIDIOC_ENUM_FRAMESIZES type: \"\n\nNit-picking, s/://\n\nWith these small issues fixed (and trusting your documentation skills\nfor the formats() method),\n\nReviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n\n> +\t\t\t\t<< frameSize.type;\n> +\t\t\treturn {};\n> +\t\t}\n> +\t}\n> +\n> +\tif (ret && errno != EINVAL) {\n> +\t\tret = -errno;\n> +\t\tLOG(V4L2, Error)\n> +\t\t\t<< \"Unable to enumerate frame sizes: \"\n> +\t\t\t<< strerror(-ret);\n> +\t\treturn {};\n> +\t}\n> +\n> +\treturn sizes;\n> +}\n> +\n>  /**\n>   * \\brief Import the externally allocated \\a pool of buffers\n>   * \\param[in] pool BufferPool of buffers to import","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 1420B61A27\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Jun 2019 01:07:45 +0200 (CEST)","from pendragon.ideasonboard.com\n\t(dfj612yhrgyx302h3jwwy-3.rev.dnainternet.fi\n\t[IPv6:2001:14ba:21f5:5b00:ce28:277f:58d7:3ca4])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id 89E8ED5;\n\tWed, 19 Jun 2019 01:07:44 +0200 (CEST)"],"DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1560899264;\n\tbh=1imwtlzYWcNcEJaDxKE4m6ZbO3bvwE6roehA3q0Qp2o=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=DFhnXxonQdJ+1v7+xlwxKUuWlC7W6jwY23Yy3kRZDMXt+rvcvwntdLUaWWS5Ba3eF\n\tJ/E7F07f83YNa8dEGC0M4Tq3/qOir0TirhB4fYzkLehD7uFjMIAqoybvQwVYRqJMfC\n\t3zaJNlvcXAONHIGH9SWwrNf++rCIwu7YsOBj3qDw=","Date":"Wed, 19 Jun 2019 02:07:27 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190618230727.GO23556@pendragon.ideasonboard.com>","References":"<20190616133402.21934-1-niklas.soderlund@ragnatech.se>\n\t<20190616133402.21934-10-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Type":"text/plain; charset=utf-8","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190616133402.21934-10-niklas.soderlund@ragnatech.se>","User-Agent":"Mutt/1.10.1 (2018-07-13)","Subject":"Re: [libcamera-devel] [PATCH v3 09/16] libcamera: v4l2_device: Add\n\tenumeration of pixelformats and frame sizes","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":"Tue, 18 Jun 2019 23:07:45 -0000"}},{"id":1925,"web_url":"https://patchwork.libcamera.org/comment/1925/","msgid":"<20190619012851.GC15747@bigcity.dyn.berto.se>","date":"2019-06-19T01:28:51","subject":"Re: [libcamera-devel] [PATCH v3 09/16] libcamera: v4l2_device: Add\n\tenumeration of pixelformats and frame sizes","submitter":{"id":5,"url":"https://patchwork.libcamera.org/api/people/5/","name":"Niklas Söderlund","email":"niklas.soderlund@ragnatech.se"},"content":"Hi Laurent,\n\nThanks for your feedback,\n\nOn 2019-06-19 02:07:27 +0300, Laurent Pinchart wrote:\n> Hi Niklas,\n> \n> Thank you for the patch.\n> \n> On Sun, Jun 16, 2019 at 03:33:55PM +0200, Niklas Söderlund wrote:\n> > Add methods to enumerate pixelformats and frame sizes from a v4l2\n> > device. The interface is similar to how V4L2Subdevice enumerates mbus\n> > codes and frame sizes.\n> > \n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> > ---\n> >  src/libcamera/include/v4l2_device.h |   5 ++\n> >  src/libcamera/v4l2_device.cpp       | 110 ++++++++++++++++++++++++++++\n> >  2 files changed, 115 insertions(+)\n> > \n> > diff --git a/src/libcamera/include/v4l2_device.h b/src/libcamera/include/v4l2_device.h\n> > index bdecc087fe5afae0..1a67850ac4c1088f 100644\n> > --- a/src/libcamera/include/v4l2_device.h\n> > +++ b/src/libcamera/include/v4l2_device.h\n> > @@ -16,6 +16,7 @@\n> >  #include <libcamera/geometry.h>\n> >  #include <libcamera/signal.h>\n> >  \n> > +#include \"formats.h\"\n> >  #include \"log.h\"\n> >  \n> >  namespace libcamera {\n> > @@ -132,6 +133,7 @@ public:\n> >  \n> >  \tint getFormat(V4L2DeviceFormat *format);\n> >  \tint setFormat(V4L2DeviceFormat *format);\n> > +\tImageFormats formats();\n> >  \n> >  \tint exportBuffers(BufferPool *pool);\n> >  \tint importBuffers(BufferPool *pool);\n> > @@ -163,6 +165,9 @@ private:\n> >  \tint createPlane(Buffer *buffer, unsigned int plane,\n> >  \t\t\tunsigned int length);\n> >  \n> > +\tstd::vector<unsigned int> enumPixelformats();\n> > +\tstd::vector<SizeRange> enumSizes(unsigned int pixelFormat);\n> > +\n> >  \tBuffer *dequeueBuffer();\n> >  \tvoid bufferAvailable(EventNotifier *notifier);\n> >  \n> > diff --git a/src/libcamera/v4l2_device.cpp b/src/libcamera/v4l2_device.cpp\n> > index 0821bd75fb428766..96aa525025629697 100644\n> > --- a/src/libcamera/v4l2_device.cpp\n> > +++ b/src/libcamera/v4l2_device.cpp\n> > @@ -634,6 +634,29 @@ int V4L2Device::setFormatSingleplane(V4L2DeviceFormat *format)\n> >  \treturn 0;\n> >  }\n> >  \n> > +/**\n> > + * \\brief Enumerate all pixel formats and frame sizes\n> > + *\n> > + * Enumerate all pixel formats and frame sizes supported by the video device.\n> > + *\n> > + * \\return A list of the supported device formats\n> > + */\n> > +ImageFormats V4L2Device::formats()\n> > +{\n> > +\tImageFormats formats;\n> > +\n> > +\tfor (unsigned int pixelformat : enumPixelformats()) {\n> > +\t\tif (formats.addFormat(pixelformat, enumSizes(pixelformat))) {\n> > +\t\t\tLOG(V4L2, Error)\n> > +\t\t\t\t<< \"Could not add sizes for pixel format \"\n> > +\t\t\t\t<< pixelformat;\n> > +\t\t\treturn {};\n> > +\t\t}\n> \n> I think you should catch the error from enumSizes() and return {}. I\n> would also extend the documentation a little bit, you can copy the one\n> from the V4L2Subdevice class.\n\nI agree that enumSizes() should have a error check and I added that for \nnext version. About the documentation I'm not sure what you are asking, \nthe V4L2Device::formats() documentation is already an adapted copy of \nV4L2Subdevice::formats().\n\nI have addressed all other comments in this patch but I have not \ncollected your tag until I understand what you are asking here ;-)\n\n> \n> > +\t}\n> > +\n> > +\treturn formats;\n> > +}\n> > +\n> >  int V4L2Device::requestBuffers(unsigned int count)\n> >  {\n> >  \tstruct v4l2_requestbuffers rb = {};\n> > @@ -763,6 +786,93 @@ int V4L2Device::createPlane(Buffer *buffer, unsigned int planeIndex,\n> >  \treturn 0;\n> >  }\n> >  \n> > +std::vector<unsigned int> V4L2Device::enumPixelformats()\n> > +{\n> > +\tstd::vector<unsigned int> formats;\n> > +\tint ret;\n> > +\n> > +\tfor (unsigned int index = 0; ; index++) {\n> > +\t\tstruct v4l2_fmtdesc pixelformatEnum = {};\n> > +\t\tpixelformatEnum.index = index;\n> > +\t\tpixelformatEnum.type = bufferType_;\n> > +\n> > +\t\tret = ioctl(fd_, VIDIOC_ENUM_FMT, &pixelformatEnum);\n> > +\t\tif (ret)\n> > +\t\t\tbreak;\n> > +\n> > +\t\tformats.push_back(pixelformatEnum.pixelformat);\n> > +\t}\n> > +\n> > +\tif (ret && errno != EINVAL) {\n> > +\t\tret = -errno;\n> > +\t\tLOG(V4L2, Error)\n> > +\t\t\t<< \"Unable to enumerate pixelformats: \"\n> \n> s/pixelformats/pixel formats/\n> \n> > +\t\t\t<< strerror(-ret);\n> > +\t\treturn {};\n> > +\t}\n> > +\n> > +\treturn formats;\n> > +}\n> > +\n> > +std::vector<SizeRange> V4L2Device::enumSizes(unsigned int pixelFormat)\n> > +{\n> > +\tstd::vector<SizeRange> sizes;\n> > +\tint ret;\n> > +\n> > +\tfor (unsigned int index = 0;; index++) {\n> > +\t\tstruct v4l2_frmsizeenum frameSize = {};\n> > +\t\tframeSize.index = index;\n> > +\t\tframeSize.pixel_format = pixelFormat;\n> > +\n> > +\t\tret = ioctl(fd_, VIDIOC_ENUM_FRAMESIZES, &frameSize);\n> > +\t\tif (ret)\n> > +\t\t\tbreak;\n> > +\n> > +\t\tif (index != 0 &&\n> > +\t\t    frameSize.type != V4L2_FRMSIZE_TYPE_DISCRETE) {\n> > +\t\t\tLOG(V4L2, Error)\n> > +\t\t\t\t<< \"Non-zero index for non discrete type\";\n> > +\t\t\treturn {};\n> > +\t\t}\n> > +\n> > +\t\tswitch (frameSize.type) {\n> > +\t\tcase V4L2_FRMSIZE_TYPE_DISCRETE:\n> > +\t\t\tsizes.emplace_back(frameSize.discrete.width,\n> > +\t\t\t\t\t   frameSize.discrete.height);\n> > +\t\t\tbreak;\n> > +\t\tcase V4L2_FRMSIZE_TYPE_CONTINUOUS:\n> > +\t\t\tsizes.emplace_back(frameSize.stepwise.min_width,\n> > +\t\t\t\t\t   frameSize.stepwise.min_height,\n> > +\t\t\t\t\t   frameSize.stepwise.max_width,\n> > +\t\t\t\t\t   frameSize.stepwise.max_height);\n> > +\t\t\tbreak;\n> > +\t\tcase V4L2_FRMSIZE_TYPE_STEPWISE:\n> > +\t\t\tsizes.emplace_back(frameSize.stepwise.min_width,\n> > +\t\t\t\t\t   frameSize.stepwise.min_height,\n> > +\t\t\t\t\t   frameSize.stepwise.max_width,\n> > +\t\t\t\t\t   frameSize.stepwise.max_height,\n> > +\t\t\t\t\t   frameSize.stepwise.step_width,\n> > +\t\t\t\t\t   frameSize.stepwise.step_height);\n> > +\t\t\tbreak;\n> > +\t\tdefault:\n> > +\t\t\tLOG(V4L2, Error)\n> > +\t\t\t\t<< \"Unknown VIDIOC_ENUM_FRAMESIZES type: \"\n> \n> Nit-picking, s/://\n> \n> With these small issues fixed (and trusting your documentation skills\n> for the formats() method),\n> \n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> \n> > +\t\t\t\t<< frameSize.type;\n> > +\t\t\treturn {};\n> > +\t\t}\n> > +\t}\n> > +\n> > +\tif (ret && errno != EINVAL) {\n> > +\t\tret = -errno;\n> > +\t\tLOG(V4L2, Error)\n> > +\t\t\t<< \"Unable to enumerate frame sizes: \"\n> > +\t\t\t<< strerror(-ret);\n> > +\t\treturn {};\n> > +\t}\n> > +\n> > +\treturn sizes;\n> > +}\n> > +\n> >  /**\n> >   * \\brief Import the externally allocated \\a pool of buffers\n> >   * \\param[in] pool BufferPool of buffers to import\n> \n> -- \n> Regards,\n> \n> Laurent Pinchart","headers":{"Return-Path":"<niklas.soderlund@ragnatech.se>","Received":["from mail-lj1-x241.google.com (mail-lj1-x241.google.com\n\t[IPv6:2a00:1450:4864:20::241])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 6068A60C2C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tWed, 19 Jun 2019 03:28:53 +0200 (CEST)","by mail-lj1-x241.google.com with SMTP id m23so1443199lje.12\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 18 Jun 2019 18:28:53 -0700 (PDT)","from localhost (89-233-230-99.cust.bredband2.com. [89.233.230.99])\n\tby smtp.gmail.com with ESMTPSA id\n\tv12sm2823382ljk.22.2019.06.18.18.28.51\n\t(version=TLS1_3 cipher=AEAD-AES256-GCM-SHA384 bits=256/256);\n\tTue, 18 Jun 2019 18:28:51 -0700 (PDT)"],"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=vaRltADEnLQJCcGeIm6fLp0f85PLTFL5bgy/r3ymqj8=;\n\tb=ut8//jDbeIldNyqYoVeS7AZw4pbYoha5SE4gyHiRv0akSYdzP9tHf/5PGhqFzLSiCC\n\tlpxQqx+9vK2/XcRvmJovbkDz1YlA41DnJzwAdUVS+iSpJQKDdOkOkvDEI+HLd/4OVPEG\n\tFYAZg0BLEaqEYlp89aUkH0G8ss2dY8pjKDYZXWua37eZQi+81riulSva8k/RTAPT4IeS\n\t9l5g6VU844/eL4owfDBolYWoICZI0YwFQTymRP+WrIZ2evJmQQn16/B3K3VhPTRETNBF\n\tWZMR2Hez2kRFeUTyLLXNdOd8N7lZnUIWEpDTW0PBpSacAcg9LzUWL81d3jc/Nnx86p6G\n\tB2bw==","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=vaRltADEnLQJCcGeIm6fLp0f85PLTFL5bgy/r3ymqj8=;\n\tb=TZarxfipN50NTUKinTmQS+bBiGafDOwa77lbu2YcxcsdemLJ9KDoyh5YYzaoF2DvHc\n\to4i01V8IzoNBUleUieQv/hYtq/NRUOqcBdOPzyoi9huwYA4vQJtzswDgjzDqsTg8Wjqm\n\t96NCT6gx3AMgePH2Qtovh7gHe+cL1k/ZTTTf17RuW9dSbZKAuRNkIBGWY6PJo9l+IJfW\n\tp1VpOYL88AQSmHMV6Ham2OUVN8DSEn1jHt1ADm128mPlC9mQ0z9Sgz+pH42RTiubkNrA\n\tbhGYM1+HPBRaB0DXDiK6GleYZ259KjZUSKGXv+cOB7sKFEAi1qVScNwTFBsPq5qMfj5j\n\tPBsA==","X-Gm-Message-State":"APjAAAUBdZfLIqRV4PFfies+MoHpWQmxUBfpFQxkxUPeQF8ZyWWSY5P5\n\t80ukj7h7yqHcO/PCheQxtCBGQkintFo=","X-Google-Smtp-Source":"APXvYqyq0LB0g5wXmDlzxn+lssLDGJvfnnpeAFeZ9csMnpDQE8GrF6nh6uIt4ZjrldVTPP9ImJX2pw==","X-Received":"by 2002:a2e:98d7:: with SMTP id\n\ts23mr30931487ljj.179.1560907732716; \n\tTue, 18 Jun 2019 18:28:52 -0700 (PDT)","Date":"Wed, 19 Jun 2019 03:28:51 +0200","From":"Niklas =?iso-8859-1?q?S=F6derlund?= <niklas.soderlund@ragnatech.se>","To":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","Cc":"libcamera-devel@lists.libcamera.org","Message-ID":"<20190619012851.GC15747@bigcity.dyn.berto.se>","References":"<20190616133402.21934-1-niklas.soderlund@ragnatech.se>\n\t<20190616133402.21934-10-niklas.soderlund@ragnatech.se>\n\t<20190618230727.GO23556@pendragon.ideasonboard.com>","MIME-Version":"1.0","Content-Type":"text/plain; charset=iso-8859-1","Content-Disposition":"inline","Content-Transfer-Encoding":"8bit","In-Reply-To":"<20190618230727.GO23556@pendragon.ideasonboard.com>","User-Agent":"Mutt/1.12.0 (2019-05-25)","Subject":"Re: [libcamera-devel] [PATCH v3 09/16] libcamera: v4l2_device: Add\n\tenumeration of pixelformats and frame sizes","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":"Wed, 19 Jun 2019 01:28:53 -0000"}}]