[{"id":11468,"web_url":"https://patchwork.libcamera.org/comment/11468/","msgid":"<20200721152022.7bxpphcdh57l4aer@uno.localdomain>","date":"2020-07-21T15:20:22","subject":"Re: [libcamera-devel] [PATCH v2 1/3] libcamera: v4l2_subdevice:\n\tReplace ImageFormats with a map","submitter":{"id":3,"url":"https://patchwork.libcamera.org/api/people/3/","name":"Jacopo Mondi","email":"jacopo@jmondi.org"},"content":"Hi Niklas\n\nOn Tue, Jul 21, 2020 at 03:55:39PM +0200, Niklas Söderlund wrote:\n> Replace the V4L2Subdevice usage of the ImageFormats class with a\n> std::map and the utils::map_keys() helper.\n>\n> Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> ---\n> * Changes since RFC\n> - Fix spelling in commit message.\n> - Prevent double lookup in CameraSensor::getFormat().\n> - Preserve error message in V4L2Subdevice::formats().\n> ---\n>  include/libcamera/internal/camera_sensor.h  |  6 ++----\n>  include/libcamera/internal/v4l2_subdevice.h |  4 +++-\n>  src/libcamera/camera_sensor.cpp             | 13 +++++++------\n>  src/libcamera/v4l2_subdevice.cpp            | 12 +++++++++---\n>  test/v4l2_subdevice/list_formats.cpp        | 16 ++++++++--------\n>  5 files changed, 29 insertions(+), 22 deletions(-)\n>\n> diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\n> index 7f07413f95602881..06c8292ca30129de 100644\n> --- a/include/libcamera/internal/camera_sensor.h\n> +++ b/include/libcamera/internal/camera_sensor.h\n> @@ -16,13 +16,11 @@\n>\n>  #include \"libcamera/internal/formats.h\"\n>  #include \"libcamera/internal/log.h\"\n> +#include \"libcamera/internal/v4l2_subdevice.h\"\n>\n>  namespace libcamera {\n>\n>  class MediaEntity;\n> -class V4L2Subdevice;\n> -\n> -struct V4L2SubdeviceFormat;\n>\n>  struct CameraSensorInfo {\n>  \tstd::string model;\n> @@ -75,7 +73,7 @@ private:\n>\n>  \tstd::string model_;\n>\n> -\tImageFormats formats_;\n> +\tV4L2Subdevice::Formats formats_;\n>  \tSize resolution_;\n>  \tstd::vector<unsigned int> mbusCodes_;\n>  \tstd::vector<Size> sizes_;\n> diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h\n> index a3ecf123f640dd54..02ee3e914a8b1d92 100644\n> --- a/include/libcamera/internal/v4l2_subdevice.h\n> +++ b/include/libcamera/internal/v4l2_subdevice.h\n> @@ -32,6 +32,8 @@ struct V4L2SubdeviceFormat {\n>  class V4L2Subdevice : public V4L2Device\n>  {\n>  public:\n> +\tusing Formats = std::map<unsigned int, std::vector<SizeRange>>;\n> +\n>  \tenum Whence {\n>  \t\tActiveFormat,\n>  \t\tTryFormat,\n> @@ -51,7 +53,7 @@ public:\n>  \tint setSelection(unsigned int pad, unsigned int target,\n>  \t\t\t Rectangle *rect);\n>\n> -\tImageFormats formats(unsigned int pad);\n> +\tFormats formats(unsigned int pad);\n>\n>  \tint getFormat(unsigned int pad, V4L2SubdeviceFormat *format,\n>  \t\t      Whence whence = ActiveFormat);\n> diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp\n> index 6e93cc51155ba678..350f49accad99c7b 100644\n> --- a/src/libcamera/camera_sensor.cpp\n> +++ b/src/libcamera/camera_sensor.cpp\n> @@ -18,7 +18,6 @@\n>\n>  #include \"libcamera/internal/formats.h\"\n>  #include \"libcamera/internal/utils.h\"\n> -#include \"libcamera/internal/v4l2_subdevice.h\"\n>\n>  /**\n>   * \\file camera_sensor.h\n> @@ -245,15 +244,15 @@ int CameraSensor::init()\n>\n>  \t/* Enumerate, sort and cache media bus codes and sizes. */\n>  \tformats_ = subdev_->formats(pad_);\n> -\tif (formats_.isEmpty()) {\n> +\tif (formats_.empty()) {\n>  \t\tLOG(CameraSensor, Error) << \"No image format found\";\n>  \t\treturn -EINVAL;\n>  \t}\n>\n> -\tmbusCodes_ = formats_.formats();\n> +\tmbusCodes_ = utils::map_keys(formats_);\n>  \tstd::sort(mbusCodes_.begin(), mbusCodes_.end());\n>\n> -\tfor (const auto &format : formats_.data()) {\n> +\tfor (const auto &format : formats_) {\n>  \t\tconst std::vector<SizeRange> &ranges = format.second;\n>  \t\tstd::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes_),\n>  \t\t\t       [](const SizeRange &range) { return range.max; });\n> @@ -359,9 +358,11 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu\n>  \tuint32_t bestCode = 0;\n>\n>  \tfor (unsigned int code : mbusCodes) {\n> -\t\tconst std::vector<SizeRange> &ranges = formats_.sizes(code);\n> +\t\tconst auto formats = formats_.find(code);\n> +\t\tif (formats == formats_.end())\n> +\t\t\tcontinue;\n>\n> -\t\tfor (const SizeRange &range : ranges) {\n> +\t\tfor (const SizeRange &range : formats->second) {\n>  \t\t\tconst Size &sz = range.max;\n>\n>  \t\t\tif (sz.width < size.width || sz.height < size.height)\n> diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> index 32c6c7acc11a6a3f..85d00c246f5e5ee9 100644\n> --- a/src/libcamera/v4l2_subdevice.cpp\n> +++ b/src/libcamera/v4l2_subdevice.cpp\n> @@ -217,6 +217,11 @@ uint8_t V4L2SubdeviceFormat::bitsPerPixel() const\n>   * any device left open will be closed, and any resources released.\n>   */\n>\n> +/**\n> + * \\typedef V4L2Subdevice::Formats\n> + * \\brief A map of supported media bus formats to frame sizes\n> + */\n> +\n>  /**\n>   * \\enum V4L2Subdevice::Whence\n>   * \\brief Specify the type of format for getFormat() and setFormat() operations\n> @@ -340,9 +345,9 @@ int V4L2Subdevice::setSelection(unsigned int pad, unsigned int target,\n>   *\n>   * \\return A list of the supported device formats\n>   */\n> -ImageFormats V4L2Subdevice::formats(unsigned int pad)\n> +V4L2Subdevice::Formats V4L2Subdevice::formats(unsigned int pad)\n>  {\n> -\tImageFormats formats;\n> +\tFormats formats;\n>\n>  \tif (pad >= entity_->pads().size()) {\n>  \t\tLOG(V4L2, Error) << \"Invalid pad: \" << pad;\n> @@ -354,7 +359,8 @@ ImageFormats V4L2Subdevice::formats(unsigned int pad)\n>  \t\tif (sizes.empty())\n>  \t\t\treturn {};\n>\n> -\t\tif (formats.addFormat(code, sizes)) {\n> +\t\tconst auto inserted = formats.insert({ code, sizes });\n\nLooking at the c++ reference example you could write\n                const auto [it, ret] = formats.insert({ code, sizes });\n                if (!ret)\n\nAnway, using std::map::insert() is neat indeed!\n\nReviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n\nThanks\n  j\n\n> +\t\tif (!inserted.second) {\n>  \t\t\tLOG(V4L2, Error)\n>  \t\t\t\t<< \"Could not add sizes for media bus code \"\n>  \t\t\t\t<< code << \" on pad \" << pad;\n> diff --git a/test/v4l2_subdevice/list_formats.cpp b/test/v4l2_subdevice/list_formats.cpp\n> index a55af1100d9ab498..a6044c044036acd4 100644\n> --- a/test/v4l2_subdevice/list_formats.cpp\n> +++ b/test/v4l2_subdevice/list_formats.cpp\n> @@ -47,29 +47,29 @@ void ListFormatsTest::printFormats(unsigned int pad,\n>  int ListFormatsTest::run()\n>  {\n>  \t/* List all formats available on existing \"Scaler\" pads. */\n> -\tImageFormats formats;\n> +\tV4L2Subdevice::Formats formats;\n>\n>  \tformats = scaler_->formats(0);\n> -\tif (formats.isEmpty()) {\n> +\tif (formats.empty()) {\n>  \t\tcerr << \"Failed to list formats on pad 0 of subdevice \"\n>  \t\t     << scaler_->entity()->name() << endl;\n>  \t\treturn TestFail;\n>  \t}\n> -\tfor (unsigned int code : formats.formats())\n> -\t\tprintFormats(0, code, formats.sizes(code));\n> +\tfor (unsigned int code : utils::map_keys(formats))\n> +\t\tprintFormats(0, code, formats[code]);\n>\n>  \tformats = scaler_->formats(1);\n> -\tif (formats.isEmpty()) {\n> +\tif (formats.empty()) {\n>  \t\tcerr << \"Failed to list formats on pad 1 of subdevice \"\n>  \t\t     << scaler_->entity()->name() << endl;\n>  \t\treturn TestFail;\n>  \t}\n> -\tfor (unsigned int code : formats.formats())\n> -\t\tprintFormats(1, code, formats.sizes(code));\n> +\tfor (unsigned int code : utils::map_keys(formats))\n> +\t\tprintFormats(1, code, formats[code]);\n>\n>  \t/* List format on a non-existing pad, format vector shall be empty. */\n>  \tformats = scaler_->formats(2);\n> -\tif (!formats.isEmpty()) {\n> +\tif (!formats.empty()) {\n>  \t\tcerr << \"Listing formats on non-existing pad 2 of subdevice \"\n>  \t\t     << scaler_->entity()->name()\n>  \t\t     << \" should return an empty format list\" << endl;\n> --\n> 2.27.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":"<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 1EE60BDB1B\n\tfor <parsemail@patchwork.libcamera.org>;\n\tTue, 21 Jul 2020 15:16:48 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id A34BC608E0;\n\tTue, 21 Jul 2020 17:16:47 +0200 (CEST)","from relay6-d.mail.gandi.net (relay6-d.mail.gandi.net\n\t[217.70.183.198])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 975926053C\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tTue, 21 Jul 2020 17:16:45 +0200 (CEST)","from uno.localdomain (93-34-118-233.ip49.fastwebnet.it\n\t[93.34.118.233]) (Authenticated sender: jacopo@jmondi.org)\n\tby relay6-d.mail.gandi.net (Postfix) with ESMTPSA id D9795C0016;\n\tTue, 21 Jul 2020 15:16:44 +0000 (UTC)"],"X-Originating-IP":"93.34.118.233","Date":"Tue, 21 Jul 2020 17:20:22 +0200","From":"Jacopo Mondi <jacopo@jmondi.org>","To":"Niklas =?utf-8?q?S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>","Message-ID":"<20200721152022.7bxpphcdh57l4aer@uno.localdomain>","References":"<20200721135541.2931205-1-niklas.soderlund@ragnatech.se>\n\t<20200721135541.2931205-2-niklas.soderlund@ragnatech.se>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200721135541.2931205-2-niklas.soderlund@ragnatech.se>","Subject":"Re: [libcamera-devel] [PATCH v2 1/3] libcamera: v4l2_subdevice:\n\tReplace ImageFormats with a map","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}},{"id":11523,"web_url":"https://patchwork.libcamera.org/comment/11523/","msgid":"<20200723141939.GB5920@pendragon.ideasonboard.com>","date":"2020-07-23T14:19:39","subject":"Re: [libcamera-devel] [PATCH v2 1/3] libcamera: v4l2_subdevice:\n\tReplace ImageFormats with a map","submitter":{"id":2,"url":"https://patchwork.libcamera.org/api/people/2/","name":"Laurent Pinchart","email":"laurent.pinchart@ideasonboard.com"},"content":"Hi Jacopo,\n\nOn Tue, Jul 21, 2020 at 05:20:22PM +0200, Jacopo Mondi wrote:\n> On Tue, Jul 21, 2020 at 03:55:39PM +0200, Niklas Söderlund wrote:\n> > Replace the V4L2Subdevice usage of the ImageFormats class with a\n> > std::map and the utils::map_keys() helper.\n> >\n> > Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n> > Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>\n> > ---\n> > * Changes since RFC\n> > - Fix spelling in commit message.\n> > - Prevent double lookup in CameraSensor::getFormat().\n> > - Preserve error message in V4L2Subdevice::formats().\n> > ---\n> >  include/libcamera/internal/camera_sensor.h  |  6 ++----\n> >  include/libcamera/internal/v4l2_subdevice.h |  4 +++-\n> >  src/libcamera/camera_sensor.cpp             | 13 +++++++------\n> >  src/libcamera/v4l2_subdevice.cpp            | 12 +++++++++---\n> >  test/v4l2_subdevice/list_formats.cpp        | 16 ++++++++--------\n> >  5 files changed, 29 insertions(+), 22 deletions(-)\n> >\n> > diff --git a/include/libcamera/internal/camera_sensor.h b/include/libcamera/internal/camera_sensor.h\n> > index 7f07413f95602881..06c8292ca30129de 100644\n> > --- a/include/libcamera/internal/camera_sensor.h\n> > +++ b/include/libcamera/internal/camera_sensor.h\n> > @@ -16,13 +16,11 @@\n> >\n> >  #include \"libcamera/internal/formats.h\"\n> >  #include \"libcamera/internal/log.h\"\n> > +#include \"libcamera/internal/v4l2_subdevice.h\"\n> >\n> >  namespace libcamera {\n> >\n> >  class MediaEntity;\n> > -class V4L2Subdevice;\n> > -\n> > -struct V4L2SubdeviceFormat;\n> >\n> >  struct CameraSensorInfo {\n> >  \tstd::string model;\n> > @@ -75,7 +73,7 @@ private:\n> >\n> >  \tstd::string model_;\n> >\n> > -\tImageFormats formats_;\n> > +\tV4L2Subdevice::Formats formats_;\n> >  \tSize resolution_;\n> >  \tstd::vector<unsigned int> mbusCodes_;\n> >  \tstd::vector<Size> sizes_;\n> > diff --git a/include/libcamera/internal/v4l2_subdevice.h b/include/libcamera/internal/v4l2_subdevice.h\n> > index a3ecf123f640dd54..02ee3e914a8b1d92 100644\n> > --- a/include/libcamera/internal/v4l2_subdevice.h\n> > +++ b/include/libcamera/internal/v4l2_subdevice.h\n> > @@ -32,6 +32,8 @@ struct V4L2SubdeviceFormat {\n> >  class V4L2Subdevice : public V4L2Device\n> >  {\n> >  public:\n> > +\tusing Formats = std::map<unsigned int, std::vector<SizeRange>>;\n> > +\n> >  \tenum Whence {\n> >  \t\tActiveFormat,\n> >  \t\tTryFormat,\n> > @@ -51,7 +53,7 @@ public:\n> >  \tint setSelection(unsigned int pad, unsigned int target,\n> >  \t\t\t Rectangle *rect);\n> >\n> > -\tImageFormats formats(unsigned int pad);\n> > +\tFormats formats(unsigned int pad);\n> >\n> >  \tint getFormat(unsigned int pad, V4L2SubdeviceFormat *format,\n> >  \t\t      Whence whence = ActiveFormat);\n> > diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp\n> > index 6e93cc51155ba678..350f49accad99c7b 100644\n> > --- a/src/libcamera/camera_sensor.cpp\n> > +++ b/src/libcamera/camera_sensor.cpp\n> > @@ -18,7 +18,6 @@\n> >\n> >  #include \"libcamera/internal/formats.h\"\n> >  #include \"libcamera/internal/utils.h\"\n> > -#include \"libcamera/internal/v4l2_subdevice.h\"\n> >\n> >  /**\n> >   * \\file camera_sensor.h\n> > @@ -245,15 +244,15 @@ int CameraSensor::init()\n> >\n> >  \t/* Enumerate, sort and cache media bus codes and sizes. */\n> >  \tformats_ = subdev_->formats(pad_);\n> > -\tif (formats_.isEmpty()) {\n> > +\tif (formats_.empty()) {\n> >  \t\tLOG(CameraSensor, Error) << \"No image format found\";\n> >  \t\treturn -EINVAL;\n> >  \t}\n> >\n> > -\tmbusCodes_ = formats_.formats();\n> > +\tmbusCodes_ = utils::map_keys(formats_);\n> >  \tstd::sort(mbusCodes_.begin(), mbusCodes_.end());\n> >\n> > -\tfor (const auto &format : formats_.data()) {\n> > +\tfor (const auto &format : formats_) {\n> >  \t\tconst std::vector<SizeRange> &ranges = format.second;\n> >  \t\tstd::transform(ranges.begin(), ranges.end(), std::back_inserter(sizes_),\n> >  \t\t\t       [](const SizeRange &range) { return range.max; });\n> > @@ -359,9 +358,11 @@ V4L2SubdeviceFormat CameraSensor::getFormat(const std::vector<unsigned int> &mbu\n> >  \tuint32_t bestCode = 0;\n> >\n> >  \tfor (unsigned int code : mbusCodes) {\n> > -\t\tconst std::vector<SizeRange> &ranges = formats_.sizes(code);\n> > +\t\tconst auto formats = formats_.find(code);\n> > +\t\tif (formats == formats_.end())\n> > +\t\t\tcontinue;\n> >\n> > -\t\tfor (const SizeRange &range : ranges) {\n> > +\t\tfor (const SizeRange &range : formats->second) {\n> >  \t\t\tconst Size &sz = range.max;\n> >\n> >  \t\t\tif (sz.width < size.width || sz.height < size.height)\n> > diff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\n> > index 32c6c7acc11a6a3f..85d00c246f5e5ee9 100644\n> > --- a/src/libcamera/v4l2_subdevice.cpp\n> > +++ b/src/libcamera/v4l2_subdevice.cpp\n> > @@ -217,6 +217,11 @@ uint8_t V4L2SubdeviceFormat::bitsPerPixel() const\n> >   * any device left open will be closed, and any resources released.\n> >   */\n> >\n> > +/**\n> > + * \\typedef V4L2Subdevice::Formats\n> > + * \\brief A map of supported media bus formats to frame sizes\n> > + */\n> > +\n> >  /**\n> >   * \\enum V4L2Subdevice::Whence\n> >   * \\brief Specify the type of format for getFormat() and setFormat() operations\n> > @@ -340,9 +345,9 @@ int V4L2Subdevice::setSelection(unsigned int pad, unsigned int target,\n> >   *\n> >   * \\return A list of the supported device formats\n> >   */\n> > -ImageFormats V4L2Subdevice::formats(unsigned int pad)\n> > +V4L2Subdevice::Formats V4L2Subdevice::formats(unsigned int pad)\n> >  {\n> > -\tImageFormats formats;\n> > +\tFormats formats;\n> >\n> >  \tif (pad >= entity_->pads().size()) {\n> >  \t\tLOG(V4L2, Error) << \"Invalid pad: \" << pad;\n> > @@ -354,7 +359,8 @@ ImageFormats V4L2Subdevice::formats(unsigned int pad)\n> >  \t\tif (sizes.empty())\n> >  \t\t\treturn {};\n> >\n> > -\t\tif (formats.addFormat(code, sizes)) {\n> > +\t\tconst auto inserted = formats.insert({ code, sizes });\n> \n> Looking at the c++ reference example you could write\n>                 const auto [it, ret] = formats.insert({ code, sizes });\n>                 if (!ret)\n\nOnly in C++17 I'm afraid (which we may get soon).\n\n> Anway, using std::map::insert() is neat indeed!\n> \n> Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>\n> \n> > +\t\tif (!inserted.second) {\n> >  \t\t\tLOG(V4L2, Error)\n> >  \t\t\t\t<< \"Could not add sizes for media bus code \"\n> >  \t\t\t\t<< code << \" on pad \" << pad;\n> > diff --git a/test/v4l2_subdevice/list_formats.cpp b/test/v4l2_subdevice/list_formats.cpp\n> > index a55af1100d9ab498..a6044c044036acd4 100644\n> > --- a/test/v4l2_subdevice/list_formats.cpp\n> > +++ b/test/v4l2_subdevice/list_formats.cpp\n> > @@ -47,29 +47,29 @@ void ListFormatsTest::printFormats(unsigned int pad,\n> >  int ListFormatsTest::run()\n> >  {\n> >  \t/* List all formats available on existing \"Scaler\" pads. */\n> > -\tImageFormats formats;\n> > +\tV4L2Subdevice::Formats formats;\n> >\n> >  \tformats = scaler_->formats(0);\n> > -\tif (formats.isEmpty()) {\n> > +\tif (formats.empty()) {\n> >  \t\tcerr << \"Failed to list formats on pad 0 of subdevice \"\n> >  \t\t     << scaler_->entity()->name() << endl;\n> >  \t\treturn TestFail;\n> >  \t}\n> > -\tfor (unsigned int code : formats.formats())\n> > -\t\tprintFormats(0, code, formats.sizes(code));\n> > +\tfor (unsigned int code : utils::map_keys(formats))\n> > +\t\tprintFormats(0, code, formats[code]);\n> >\n> >  \tformats = scaler_->formats(1);\n> > -\tif (formats.isEmpty()) {\n> > +\tif (formats.empty()) {\n> >  \t\tcerr << \"Failed to list formats on pad 1 of subdevice \"\n> >  \t\t     << scaler_->entity()->name() << endl;\n> >  \t\treturn TestFail;\n> >  \t}\n> > -\tfor (unsigned int code : formats.formats())\n> > -\t\tprintFormats(1, code, formats.sizes(code));\n> > +\tfor (unsigned int code : utils::map_keys(formats))\n> > +\t\tprintFormats(1, code, formats[code]);\n> >\n> >  \t/* List format on a non-existing pad, format vector shall be empty. */\n> >  \tformats = scaler_->formats(2);\n> > -\tif (!formats.isEmpty()) {\n> > +\tif (!formats.empty()) {\n> >  \t\tcerr << \"Listing formats on non-existing pad 2 of subdevice \"\n> >  \t\t     << scaler_->entity()->name()\n> >  \t\t     << \" should return an empty format list\" << endl;","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 79C73BD878\n\tfor <parsemail@patchwork.libcamera.org>;\n\tThu, 23 Jul 2020 14:19:46 +0000 (UTC)","from lancelot.ideasonboard.com (localhost [IPv6:::1])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTP id 0759B61159;\n\tThu, 23 Jul 2020 16:19:46 +0200 (CEST)","from perceval.ideasonboard.com (perceval.ideasonboard.com\n\t[213.167.242.64])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id 67D6B60493\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tThu, 23 Jul 2020 16:19:45 +0200 (CEST)","from pendragon.ideasonboard.com (81-175-216-236.bb.dnainternet.fi\n\t[81.175.216.236])\n\tby perceval.ideasonboard.com (Postfix) with ESMTPSA id CAE07279;\n\tThu, 23 Jul 2020 16:19:44 +0200 (CEST)"],"Authentication-Results":"lancelot.ideasonboard.com;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=ideasonboard.com header.i=@ideasonboard.com\n\theader.b=\"ve3Lkbmj\"; dkim-atps=neutral","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=ideasonboard.com;\n\ts=mail; t=1595513985;\n\tbh=pVo7nk5P1bwCyklk4xoWxLAif6DP3u36sXZZcz1tywI=;\n\th=Date:From:To:Cc:Subject:References:In-Reply-To:From;\n\tb=ve3Lkbmj/tLMd6nM73QwlxVjr0PoMc3mvKntrTX/960/El7yd5KWpduPr1ryQQXpv\n\t3a8nm6rs1espmNybEcgO0HbS2zOdU3eD9wQBkgHlFH/EHcAfAREHtTDhWqd0DgPSxx\n\tVNG9EThJRGxHBhEn/Irf4PduH4Nq8SguxQVCuvSQ=","Date":"Thu, 23 Jul 2020 17:19:39 +0300","From":"Laurent Pinchart <laurent.pinchart@ideasonboard.com>","To":"Jacopo Mondi <jacopo@jmondi.org>","Message-ID":"<20200723141939.GB5920@pendragon.ideasonboard.com>","References":"<20200721135541.2931205-1-niklas.soderlund@ragnatech.se>\n\t<20200721135541.2931205-2-niklas.soderlund@ragnatech.se>\n\t<20200721152022.7bxpphcdh57l4aer@uno.localdomain>","MIME-Version":"1.0","Content-Disposition":"inline","In-Reply-To":"<20200721152022.7bxpphcdh57l4aer@uno.localdomain>","Subject":"Re: [libcamera-devel] [PATCH v2 1/3] libcamera: v4l2_subdevice:\n\tReplace ImageFormats with a map","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>","Cc":"libcamera-devel@lists.libcamera.org","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"base64","Errors-To":"libcamera-devel-bounces@lists.libcamera.org","Sender":"\"libcamera-devel\" <libcamera-devel-bounces@lists.libcamera.org>"}}]