Patch Detail
Show a patch.
GET /api/patches/2912/?format=api
{ "id": 2912, "url": "https://patchwork.libcamera.org/api/patches/2912/?format=api", "web_url": "https://patchwork.libcamera.org/patch/2912/", "project": { "id": 1, "url": "https://patchwork.libcamera.org/api/projects/1/?format=api", "name": "libcamera", "link_name": "libcamera", "list_id": "libcamera_core", "list_email": "libcamera-devel@lists.libcamera.org", "web_url": "", "scm_url": "", "webscm_url": "" }, "msgid": "<20200228032913.497826-3-niklas.soderlund@ragnatech.se>", "date": "2020-02-28T03:29:09", "name": "[libcamera-devel,RFC,2/6] libcamera: formats: Turn ImageFormats into a template", "commit_ref": null, "pull_url": null, "state": "superseded", "archived": false, "hash": "a4e7be869cf26f0a1d3077504e83a298f542a8fe", "submitter": { "id": 5, "url": "https://patchwork.libcamera.org/api/people/5/?format=api", "name": "Niklas Söderlund", "email": "niklas.soderlund@ragnatech.se" }, "delegate": null, "mbox": "https://patchwork.libcamera.org/patch/2912/mbox/", "series": [ { "id": 694, "url": "https://patchwork.libcamera.org/api/series/694/?format=api", "web_url": "https://patchwork.libcamera.org/project/libcamera/list/?series=694", "date": "2020-02-28T03:29:07", "name": "libcamera: PixelFormat: Turn into a class", "version": 1, "mbox": "https://patchwork.libcamera.org/series/694/mbox/" } ], "comments": "https://patchwork.libcamera.org/api/patches/2912/comments/", "check": "pending", "checks": "https://patchwork.libcamera.org/api/patches/2912/checks/", "tags": {}, "headers": { "Return-Path": "<niklas.soderlund@ragnatech.se>", "Received": [ "from vsp-unauthed02.binero.net (vsp-unauthed02.binero.net\n\t[195.74.38.227])\n\tby lancelot.ideasonboard.com (Postfix) with ESMTPS id B87BE62734\n\tfor <libcamera-devel@lists.libcamera.org>;\n\tFri, 28 Feb 2020 04:29:37 +0100 (CET)", "from bismarck.berto.se (p4fca2392.dip0.t-ipconnect.de\n\t[79.202.35.146]) by bin-vsp-out-01.atm.binero.net (Halon) with ESMTPA\n\tid 8ac78155-59da-11ea-9f85-005056917a89;\n\tFri, 28 Feb 2020 04:29:36 +0100 (CET)" ], "X-Halon-ID": "8ac78155-59da-11ea-9f85-005056917a89", "Authorized-sender": "niklas@soderlund.pp.se", "From": "=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>", "To": "libcamera-devel@lists.libcamera.org", "Date": "Fri, 28 Feb 2020 04:29:09 +0100", "Message-Id": "<20200228032913.497826-3-niklas.soderlund@ragnatech.se>", "X-Mailer": "git-send-email 2.25.1", "In-Reply-To": "<20200228032913.497826-1-niklas.soderlund@ragnatech.se>", "References": "<20200228032913.497826-1-niklas.soderlund@ragnatech.se>", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "Subject": "[libcamera-devel] [RFC 2/6] libcamera: formats: Turn ImageFormats\n\tinto a template", "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, 28 Feb 2020 03:29:38 -0000" }, "content": "The ImageFormats class is used to carry both V4L2 pixelformats and mbus\ncodes as keys to lookup different supported sizes. The reason for this\nis that both V4L2 pixelformats and mbus codes are unsigned integers and\nthe keyword PixelFormat is currently defined as such.\n\nGoing forward PixelFormat will be reworked into a class so their is a\nneed to have ImageFormats instances with two different key types, turn\nit into an template and update all sites to use unsigned int where a\nmbus code is the key and PixelFormat otherwise.\n\nSigned-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>\n---\n src/libcamera/camera_sensor.cpp | 2 +-\n src/libcamera/formats.cpp | 19 +++++++++++++------\n src/libcamera/include/formats.h | 11 ++++++-----\n src/libcamera/include/v4l2_subdevice.h | 2 +-\n src/libcamera/include/v4l2_videodevice.h | 2 +-\n src/libcamera/pipeline/uvcvideo.cpp | 2 +-\n src/libcamera/pipeline/vimc.cpp | 2 +-\n src/libcamera/v4l2_subdevice.cpp | 4 ++--\n src/libcamera/v4l2_videodevice.cpp | 4 ++--\n test/v4l2_subdevice/list_formats.cpp | 2 +-\n 10 files changed, 29 insertions(+), 21 deletions(-)", "diff": "diff --git a/src/libcamera/camera_sensor.cpp b/src/libcamera/camera_sensor.cpp\nindex 2219a43074362834..23fdafb690117d91 100644\n--- a/src/libcamera/camera_sensor.cpp\n+++ b/src/libcamera/camera_sensor.cpp\n@@ -131,7 +131,7 @@ int CameraSensor::init()\n \tproperties_.set(properties::Rotation, propertyValue);\n \n \t/* Enumerate and cache media bus codes and sizes. */\n-\tconst ImageFormats formats = subdev_->formats(0);\n+\tconst ImageFormats<unsigned int> formats = subdev_->formats(0);\n \tif (formats.isEmpty()) {\n \t\tLOG(CameraSensor, Error) << \"No image format found\";\n \t\treturn -EINVAL;\ndiff --git a/src/libcamera/formats.cpp b/src/libcamera/formats.cpp\nindex 5f6552a4e06c5231..98817deee2b54c84 100644\n--- a/src/libcamera/formats.cpp\n+++ b/src/libcamera/formats.cpp\n@@ -39,7 +39,8 @@ namespace libcamera {\n * \\return 0 on success or a negative error code otherwise\n * \\retval -EEXIST The format is already described\n */\n-int ImageFormats::addFormat(unsigned int format, const std::vector<SizeRange> &sizes)\n+template<typename T>\n+int ImageFormats<T>::addFormat(T format, const std::vector<SizeRange> &sizes)\n {\n \tif (data_.find(format) != data_.end())\n \t\treturn -EEXIST;\n@@ -53,7 +54,8 @@ int ImageFormats::addFormat(unsigned int format, const std::vector<SizeRange> &s\n * \\brief Check if the list of devices supported formats is empty\n * \\return True if the list of supported formats is empty\n */\n-bool ImageFormats::isEmpty() const\n+template<typename T>\n+bool ImageFormats<T>::isEmpty() const\n {\n \treturn data_.empty();\n }\n@@ -62,9 +64,10 @@ bool ImageFormats::isEmpty() const\n * \\brief Retrieve a list of all supported image formats\n * \\return List of pixel formats or media bus codes\n */\n-std::vector<unsigned int> ImageFormats::formats() const\n+template<typename T>\n+std::vector<T> ImageFormats<T>::formats() const\n {\n-\tstd::vector<unsigned int> formats;\n+\tstd::vector<T> formats;\n \tformats.reserve(data_.size());\n \n \t/* \\todo: Should this be cached instead of computed each time? */\n@@ -84,7 +87,8 @@ std::vector<unsigned int> ImageFormats::formats() const\n * \\return The list of image sizes supported for \\a format, or an empty list if\n * the format is not supported\n */\n-const std::vector<SizeRange> &ImageFormats::sizes(unsigned int format) const\n+template<typename T>\n+const std::vector<SizeRange> &ImageFormats<T>::sizes(T format) const\n {\n \tstatic const std::vector<SizeRange> empty;\n \n@@ -99,9 +103,12 @@ const std::vector<SizeRange> &ImageFormats::sizes(unsigned int format) const\n * \\brief Retrieve the map that associates formats to image sizes\n * \\return The map that associates formats to image sizes\n */\n-const std::map<unsigned int, std::vector<SizeRange>> &ImageFormats::data() const\n+template<typename T>\n+const std::map<T, std::vector<SizeRange>> &ImageFormats<T>::data() const\n {\n \treturn data_;\n }\n \n+template class ImageFormats<unsigned int>;\n+\n } /* namespace libcamera */\ndiff --git a/src/libcamera/include/formats.h b/src/libcamera/include/formats.h\nindex f43bc8c004f690b4..566be9c09550a830 100644\n--- a/src/libcamera/include/formats.h\n+++ b/src/libcamera/include/formats.h\n@@ -15,18 +15,19 @@\n \n namespace libcamera {\n \n+template<typename T>\n class ImageFormats\n {\n public:\n-\tint addFormat(unsigned int format, const std::vector<SizeRange> &sizes);\n+\tint addFormat(T format, const std::vector<SizeRange> &sizes);\n \n \tbool isEmpty() const;\n-\tstd::vector<unsigned int> formats() const;\n-\tconst std::vector<SizeRange> &sizes(unsigned int format) const;\n-\tconst std::map<unsigned int, std::vector<SizeRange>> &data() const;\n+\tstd::vector<T> formats() const;\n+\tconst std::vector<SizeRange> &sizes(T format) const;\n+\tconst std::map<T, std::vector<SizeRange>> &data() const;\n \n private:\n-\tstd::map<unsigned int, std::vector<SizeRange>> data_;\n+\tstd::map<T, std::vector<SizeRange>> data_;\n };\n \n } /* namespace libcamera */\ndiff --git a/src/libcamera/include/v4l2_subdevice.h b/src/libcamera/include/v4l2_subdevice.h\nindex 9c077674f997dae6..53c73617efe4b860 100644\n--- a/src/libcamera/include/v4l2_subdevice.h\n+++ b/src/libcamera/include/v4l2_subdevice.h\n@@ -44,7 +44,7 @@ public:\n \tint setCrop(unsigned int pad, Rectangle *rect);\n \tint setCompose(unsigned int pad, Rectangle *rect);\n \n-\tImageFormats formats(unsigned int pad);\n+\tImageFormats<unsigned int> formats(unsigned int pad);\n \n \tint getFormat(unsigned int pad, V4L2SubdeviceFormat *format);\n \tint setFormat(unsigned int pad, V4L2SubdeviceFormat *format);\ndiff --git a/src/libcamera/include/v4l2_videodevice.h b/src/libcamera/include/v4l2_videodevice.h\nindex fcf072641420dacf..982df9d2f918e49c 100644\n--- a/src/libcamera/include/v4l2_videodevice.h\n+++ b/src/libcamera/include/v4l2_videodevice.h\n@@ -180,7 +180,7 @@ public:\n \n \tint getFormat(V4L2DeviceFormat *format);\n \tint setFormat(V4L2DeviceFormat *format);\n-\tImageFormats formats();\n+\tImageFormats<PixelFormat> formats();\n \n \tint setCrop(Rectangle *rect);\n \tint setCompose(Rectangle *rect);\ndiff --git a/src/libcamera/pipeline/uvcvideo.cpp b/src/libcamera/pipeline/uvcvideo.cpp\nindex cf419e8b25a87389..8efd188e75a3d135 100644\n--- a/src/libcamera/pipeline/uvcvideo.cpp\n+++ b/src/libcamera/pipeline/uvcvideo.cpp\n@@ -155,7 +155,7 @@ CameraConfiguration *PipelineHandlerUVC::generateConfiguration(Camera *camera,\n \tif (roles.empty())\n \t\treturn config;\n \n-\tImageFormats v4l2formats = data->video_->formats();\n+\tImageFormats<PixelFormat> v4l2formats = data->video_->formats();\n \tStreamFormats formats(v4l2formats.data());\n \tStreamConfiguration cfg(formats);\n \ndiff --git a/src/libcamera/pipeline/vimc.cpp b/src/libcamera/pipeline/vimc.cpp\nindex 93d89729e1faa29f..9fbe33c626e327d4 100644\n--- a/src/libcamera/pipeline/vimc.cpp\n+++ b/src/libcamera/pipeline/vimc.cpp\n@@ -175,7 +175,7 @@ CameraConfiguration *PipelineHandlerVimc::generateConfiguration(Camera *camera,\n \tif (roles.empty())\n \t\treturn config;\n \n-\tImageFormats formats;\n+\tImageFormats<PixelFormat> formats;\n \n \tfor (PixelFormat pixelformat : pixelformats) {\n \t\t/* The scaler hardcodes a x3 scale-up ratio. */\ndiff --git a/src/libcamera/v4l2_subdevice.cpp b/src/libcamera/v4l2_subdevice.cpp\nindex f2bcd7f73c5c75a1..bec14f80c960d854 100644\n--- a/src/libcamera/v4l2_subdevice.cpp\n+++ b/src/libcamera/v4l2_subdevice.cpp\n@@ -155,9 +155,9 @@ int V4L2Subdevice::setCompose(unsigned int pad, Rectangle *rect)\n *\n * \\return A list of the supported device formats\n */\n-ImageFormats V4L2Subdevice::formats(unsigned int pad)\n+ImageFormats<unsigned int> V4L2Subdevice::formats(unsigned int pad)\n {\n-\tImageFormats formats;\n+\tImageFormats<unsigned int> formats;\n \n \tif (pad >= entity_->pads().size()) {\n \t\tLOG(V4L2, Error) << \"Invalid pad: \" << pad;\ndiff --git a/src/libcamera/v4l2_videodevice.cpp b/src/libcamera/v4l2_videodevice.cpp\nindex 99470ce11421c77c..f84bd00570afa38c 100644\n--- a/src/libcamera/v4l2_videodevice.cpp\n+++ b/src/libcamera/v4l2_videodevice.cpp\n@@ -837,9 +837,9 @@ int V4L2VideoDevice::setFormatSingleplane(V4L2DeviceFormat *format)\n *\n * \\return A list of the supported video device formats\n */\n-ImageFormats V4L2VideoDevice::formats()\n+ImageFormats<PixelFormat> V4L2VideoDevice::formats()\n {\n-\tImageFormats formats;\n+\tImageFormats<PixelFormat> formats;\n \n \tfor (unsigned int pixelformat : enumPixelformats()) {\n \t\tstd::vector<SizeRange> sizes = enumSizes(pixelformat);\ndiff --git a/test/v4l2_subdevice/list_formats.cpp b/test/v4l2_subdevice/list_formats.cpp\nindex 067dc5ed30f4edd9..201a294c72a09b4d 100644\n--- a/test/v4l2_subdevice/list_formats.cpp\n+++ b/test/v4l2_subdevice/list_formats.cpp\n@@ -47,7 +47,7 @@ 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+\tImageFormats<unsigned int> formats;\n \n \tformats = scaler_->formats(0);\n \tif (formats.isEmpty()) {\n", "prefixes": [ "libcamera-devel", "RFC", "2/6" ] }