libcamera: v4l2_subdevice: Replace FormatEnum with ImageFormats

Replace all usage of FormatEnum with ImageFormats and completely
remove FormatEnum which is no longer needed.

Signed-off-by: Niklas Söderlund <niklas.soderlund@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
This commit is contained in:
Niklas Söderlund 2019-05-25 02:20:55 +02:00
parent be78ffbe9a
commit ce02ea29cd
6 changed files with 28 additions and 42 deletions

View file

@ -90,27 +90,25 @@ int CameraSensor::init()
return ret; return ret;
/* Enumerate and cache media bus codes and sizes. */ /* Enumerate and cache media bus codes and sizes. */
const FormatEnum formats = subdev_->formats(0); const ImageFormats formats = subdev_->formats(0);
if (formats.empty()) { if (formats.isEmpty()) {
LOG(CameraSensor, Error) << "No image format found"; LOG(CameraSensor, Error) << "No image format found";
return -EINVAL; return -EINVAL;
} }
std::transform(formats.begin(), formats.end(), mbusCodes_ = formats.formats();
std::back_inserter(mbusCodes_),
[](decltype(*formats.begin()) f) { return f.first; });
/* /*
* Extract the supported sizes from the first format as we only support * Extract the supported sizes from the first format as we only support
* sensors that offer the same frame sizes for all media bus codes. * sensors that offer the same frame sizes for all media bus codes.
* Verify this assumption and reject the sensor if it isn't true. * Verify this assumption and reject the sensor if it isn't true.
*/ */
const std::vector<SizeRange> &sizes = formats.begin()->second; const std::vector<SizeRange> &sizes = formats.sizes(mbusCodes_[0]);
std::transform(sizes.begin(), sizes.end(), std::back_inserter(sizes_), std::transform(sizes.begin(), sizes.end(), std::back_inserter(sizes_),
[](const SizeRange &range) { return range.max; }); [](const SizeRange &range) { return range.max; });
for (auto it = ++formats.begin(); it != formats.end(); ++it) { for (unsigned int code : mbusCodes_) {
if (it->second != sizes) { if (formats.sizes(code) != sizes) {
LOG(CameraSensor, Error) LOG(CameraSensor, Error)
<< "Frame sizes differ between media bus codes"; << "Frame sizes differ between media bus codes";
return -EINVAL; return -EINVAL;

View file

@ -14,16 +14,6 @@
namespace libcamera { namespace libcamera {
/**
* \typedef FormatEnum
* \brief Type definition for the map of image formats and sizes
*
* Type definition used to enumerate the supported pixel formats and image
* frame sizes. The type associates in a map a pixel format (for memory
* formats) or a media bus code (for bus formats), to a vector of image
* resolutions represented by SizeRange items.
*/
/** /**
* \class ImageFormats * \class ImageFormats
* \brief Describe V4L2Device and V4L2SubDevice image formats * \brief Describe V4L2Device and V4L2SubDevice image formats

View file

@ -15,8 +15,6 @@
namespace libcamera { namespace libcamera {
typedef std::map<unsigned int, std::vector<SizeRange>> FormatEnum;
class ImageFormats class ImageFormats
{ {
public: public:

View file

@ -45,7 +45,7 @@ public:
int setCrop(unsigned int pad, Rectangle *rect); int setCrop(unsigned int pad, Rectangle *rect);
int setCompose(unsigned int pad, Rectangle *rect); int setCompose(unsigned int pad, Rectangle *rect);
FormatEnum formats(unsigned int pad); ImageFormats formats(unsigned int pad);
int getFormat(unsigned int pad, V4L2SubdeviceFormat *format); int getFormat(unsigned int pad, V4L2SubdeviceFormat *format);
int setFormat(unsigned int pad, V4L2SubdeviceFormat *format); int setFormat(unsigned int pad, V4L2SubdeviceFormat *format);

View file

@ -187,22 +187,17 @@ int V4L2Subdevice::setCompose(unsigned int pad, Rectangle *rect)
} }
/** /**
* \brief List the sub-device image resolutions and formats on \a pad * \brief Enumerate all media bus codes and frame sizes on a \a pad
* \param[in] pad The 0-indexed pad number to enumerate formats on * \param[in] pad The 0-indexed pad number to enumerate formats on
* *
* Retrieve a list of image formats and sizes on the \a pad of a video * Enumerate all media bus codes and frame sizes supported by the subdevice on
* subdevice. Subdevices can report either a list of discrete sizes they * a \a pad.
* support or a list of intervals expressed as a [min-max] sizes range.
* *
* Each image size list is associated with a media bus pixel code for which * \return A list of the supported device formats
* the reported resolutions are supported.
*
* \return A map of image formats associated with a list of image sizes, or
* an empty map on error or if the pad does not exist
*/ */
FormatEnum V4L2Subdevice::formats(unsigned int pad) ImageFormats V4L2Subdevice::formats(unsigned int pad)
{ {
FormatEnum formatMap = {}; ImageFormats formats;
if (pad >= entity_->pads().size()) { if (pad >= entity_->pads().size()) {
LOG(V4L2Subdev, Error) << "Invalid pad: " << pad; LOG(V4L2Subdev, Error) << "Invalid pad: " << pad;
@ -214,10 +209,15 @@ FormatEnum V4L2Subdevice::formats(unsigned int pad)
if (sizes.empty()) if (sizes.empty())
return {}; return {};
formatMap[code] = sizes; if (formats.addFormat(code, sizes)) {
LOG(V4L2Subdev, Error)
<< "Could not add sizes for media bus code "
<< code << " on pad " << pad;
return {};
}
} }
return formatMap; return formats;
} }
/** /**

View file

@ -47,29 +47,29 @@ void ListFormatsTest::printFormats(unsigned int pad,
int ListFormatsTest::run() int ListFormatsTest::run()
{ {
/* List all formats available on existing "Scaler" pads. */ /* List all formats available on existing "Scaler" pads. */
std::map<unsigned int, std::vector<SizeRange>> formats; ImageFormats formats;
formats = scaler_->formats(0); formats = scaler_->formats(0);
if (formats.empty()) { if (formats.isEmpty()) {
cerr << "Failed to list formats on pad 0 of subdevice " cerr << "Failed to list formats on pad 0 of subdevice "
<< scaler_->entity()->name() << endl; << scaler_->entity()->name() << endl;
return TestFail; return TestFail;
} }
for (auto it = formats.begin(); it != formats.end(); ++it) for (unsigned int code : formats.formats())
printFormats(0, it->first, it->second); printFormats(0, code, formats.sizes(code));
formats = scaler_->formats(1); formats = scaler_->formats(1);
if (formats.empty()) { if (formats.isEmpty()) {
cerr << "Failed to list formats on pad 1 of subdevice " cerr << "Failed to list formats on pad 1 of subdevice "
<< scaler_->entity()->name() << endl; << scaler_->entity()->name() << endl;
return TestFail; return TestFail;
} }
for (auto it = formats.begin(); it != formats.end(); ++it) for (unsigned int code : formats.formats())
printFormats(1, it->first, it->second); printFormats(1, code, formats.sizes(code));
/* List format on a non-existing pad, format vector shall be empty. */ /* List format on a non-existing pad, format vector shall be empty. */
formats = scaler_->formats(2); formats = scaler_->formats(2);
if (!formats.empty()) { if (!formats.isEmpty()) {
cerr << "Listing formats on non-existing pad 2 of subdevice " cerr << "Listing formats on non-existing pad 2 of subdevice "
<< scaler_->entity()->name() << scaler_->entity()->name()
<< " should return an empty format list" << endl; << " should return an empty format list" << endl;