libcamera: v4l2_videodevice: Add getSelection() function

The V4L2VideoDevice class implements setSelection() but not
getSelection(). The latter is useful for instance to query crop bounds.
Implement the function.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Umang Jain <umang.jain@ideasonboard.com>
Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
This commit is contained in:
Laurent Pinchart 2024-09-25 20:56:52 +03:00
parent b2538c80b9
commit 4cb3380f4d
2 changed files with 33 additions and 0 deletions

View file

@ -208,6 +208,7 @@ public:
int setFormat(V4L2DeviceFormat *format);
Formats formats(uint32_t code = 0);
int getSelection(unsigned int target, Rectangle *rect);
int setSelection(unsigned int target, Rectangle *rect);
int allocateBuffers(unsigned int count,

View file

@ -1214,6 +1214,38 @@ std::vector<SizeRange> V4L2VideoDevice::enumSizes(V4L2PixelFormat pixelFormat)
return sizes;
}
/**
* \brief Get the selection rectangle for \a target
* \param[in] target The selection target defined by the V4L2_SEL_TGT_* flags
* \param[out] rect The selection rectangle to retrieve
*
* \todo Define a V4L2SelectionTarget enum for the selection target
*
* \return 0 on success or a negative error code otherwise
*/
int V4L2VideoDevice::getSelection(unsigned int target, Rectangle *rect)
{
struct v4l2_selection sel = {};
sel.type = bufferType_;
sel.target = target;
sel.flags = 0;
int ret = ioctl(VIDIOC_G_SELECTION, &sel);
if (ret < 0) {
LOG(V4L2, Error) << "Unable to get rectangle " << target
<< ": " << strerror(-ret);
return ret;
}
rect->x = sel.r.left;
rect->y = sel.r.top;
rect->width = sel.r.width;
rect->height = sel.r.height;
return 0;
}
/**
* \brief Set a selection rectangle \a rect for \a target
* \param[in] target The selection target defined by the V4L2_SEL_TGT_* flags