[libcamera-devel] [PATCH v2] libcamera: stream_option: use format name to set cam/qcam format
Kieran Bingham
kieran.bingham at ideasonboard.com
Fri Jul 24 16:35:33 CEST 2020
Hi Kaaira,
Reviving this thread,
On 22/06/2020 21:48, Niklas Söderlund wrote:
> Hi Kaaira and Kieran,
>
> On 2020-06-22 21:01:11 +0100, Kieran Bingham wrote:
>> Hi Kaaira,
>>
>> On 22/06/2020 15:42, Kaaira Gupta wrote:
>>> Replace hex input for pixelformats with their format names, for input in
>>> cam and qcam.
>>>
>>> Signed-off-by: Kaaira Gupta <kgupta at es.iitr.ac.in>
>>> ---
>>>
>>> Changes since v1:
>>> -use format names, according to formats namespace, instead of
>>> FourCC
>>>
>>> src/cam/stream_options.cpp | 52 +++++++++++++++++++++++++++++++++++---
>>> 1 file changed, 49 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/src/cam/stream_options.cpp b/src/cam/stream_options.cpp
>>> index bd12c8f..9fc428a 100644
>>> --- a/src/cam/stream_options.cpp
>>> +++ b/src/cam/stream_options.cpp
>>> @@ -6,6 +6,8 @@
>>> */
>>> #include "stream_options.h"
>>>
>>> +#include <libcamera/formats.h>
>>> +
>>> #include <iostream>
>>>
>>> using namespace libcamera;
>>> @@ -19,7 +21,7 @@ StreamKeyValueParser::StreamKeyValueParser()
>>> ArgumentRequired);
>>> addOption("height", OptionInteger, "Height in pixels",
>>> ArgumentRequired);
>>> - addOption("pixelformat", OptionInteger, "Pixel format",
>>> + addOption("pixelformat", OptionString, "Pixel format name",
>>> ArgumentRequired);
>>> }
>>>
>>> @@ -96,8 +98,52 @@ int StreamKeyValueParser::updateConfiguration(CameraConfiguration *config,
>>> }
>>>
>>> /* \todo Translate 4CC string to pixelformat with modifier. */
>>> - if (opts.isSet("pixelformat"))
>>> - cfg.pixelFormat = PixelFormat(opts["pixelformat"]);
>>> + if (opts.isSet("pixelformat")) {
>>> + std::map<std::string, PixelFormat> pixelFormatNames{
>>> + { "BGR888", formats::BGR888 },
>>> + { "RGB888", formats::RGB888 },
>>> + { "ABGR8888", formats::ABGR8888 },
>>> + { "ARGB8888", formats::ARGB8888 },
>>> + { "BGRA8888", formats::BGRA8888 },
>>> + { "RGBA8888", formats::RGBA8888 },
>>> + { "YUYV", formats::YUYV },
>>> + { "YVYU", formats::YVYU },
>>> + { "UYVY", formats::UYVY },
>>> + { "VYUY", formats::VYUY },
>>> + { "NV16", formats::NV16 },
>>> + { "NV61", formats::NV61 },
>>> + { "NV12", formats::NV12 },
>>> + { "NV21", formats::NV21 },
>>> + { "YUV420", formats::YUV420 },
>>> + { "YUV422", formats::YUV422 },
>>> + { "R8", formats::R8 },
>>> + { "SBGGR8", formats::SBGGR8 },
>>> + { "SGBRG8", formats::SGBRG8 },
>>> + { "SGRBG8", formats::SGRBG8 },
>>> + { "SRGGB8", formats::SRGGB8 },
>>> + { "SBGGR10", formats::SBGGR10 },
>>> + { "SGBRG10", formats::SGBRG10 },
>>> + { "SGRBG10", formats::SGRBG10 },
>>> + { "SRGGB10", formats::SRGGB10 },
>>> + { "SBGGR10_CSI2P", formats::SBGGR10_CSI2P },
>>> + { "SGBRG10_CSI2P", formats::SGBRG10_CSI2P },
>>> + { "SGRBG10_CSI2P", formats::SGRBG10_CSI2P },
>>> + { "SRGGB10_CSI2P", formats::SRGGB10_CSI2P },
>>> + { "SBGGR12", formats::SBGGR12 },
>>> + { "SGBRG12", formats::SGBRG12 },
>>> + { "SGRBG12", formats::SGRBG12 },
>>> + { "SRGGB12", formats::SRGGB12 },
>>> + { "SBGGR12_CSI2P", formats::SBGGR12_CSI2P },
>>> + { "SGBRG12_CSI2P", formats::SGBRG12_CSI2P },
>>> + { "SGRBG12_CSI2P", formats::SGRBG12_CSI2P },
>>> + { "SRGGB12_CSI2P", formats::SRGGB12_CSI2P },
>>> + { "MJPEG", formats::MJPEG },
>>> + };
>>> +
>>> + std::map<std::string, PixelFormat>::iterator it;
>>> + it = pixelFormatNames.find(opts["pixelformat"]);
>>> + cfg.pixelFormat = it->second;
>>
>> This doesn't deal with what would happen if the format can not be found.
>>
>> There needs to be an error check to make sure that if the given string
>> is not in the map, then an error is returned, and at least the iterator
>> should not be dereferenced.
>>
>>
>> At the moment, libcamera does not expose any of the internal format
>> information, so there's no way to handle the comparison without this
>> map, so this indeed looks like the only way it can be handled currently[0].
>>
>> I think just for readability, and clarity, I would move the map outside
>> of the scope of this function and somewhere to the top of the file as a
>> generic 'data table'.
>>
>> It would be nice if applications had more information on each of the
>> pixel-formats, to prevent having to duplicate all the information
>> everywhere, but I fear that the consensus would likely be that
>> information doesn't live in libcamera.
>
> I think we crossed that threshold when we introduced the format::
> namespace. As we already give a "libcamera name" to a DRM fourcc + a
> modifier I think there is little harm in exposing this name in string
> form to applications.
My qeustion was more about 'how much' should we expose to applications?
I.e. the content of include/libcamera/internal/formats.h
or...
>
>>
>>
>> [0]: But, we 'could' choose to expose a PixelFormat(std::string)
>> constructor, which could construct a PixelFormat by searching the
>> internal PixelFormatInfo tables... or return an <INVALID> if not found...
>>
>> Any thoughts on a string constructor for PixelFormat anyone?
Should we add a PixelFormat(std::string) which will search for a named
format, and return it if available.
I would prefer this option that having applications encode a table of
all supported strings/PixelFormats each time, but I also think there's
value in all of the information stored in PixelFormatInfo, but I don't
currently think we want to make that part of the public-api ... so a
string constructor is a the best solution I can currently see...
--
Kieran
>>
>>
>>
>>> + }
>>> }
>>>
>>> return 0;
--
Regards
--
Kieran
More information about the libcamera-devel
mailing list