[v2,1/2] media: videodev2: Add V4L2_FMT_FLAG_ALL_FORMATS flag
Commit Message
Add new flag to allow enumerate all pixels formats when
calling VIDIOC_ENUM_FMT ioctl.
When this flag is set drivers must ignore the configuration
and return the hardware supported pixel formats for the specified queue.
This will permit to discover which pixels formats are supported
without setting codec-specific information so userland can more easily
knows if the driver suit well to what it needs.
The main target are stateless decoders so update the documentation
about how use this flag.
Signed-off-by: Benjamin Gaignard <benjamin.gaignard@collabora.com>
---
changes in version 2:
- Clarify documentation.
- Only keep V4L2_FMT_FLAG_ALL_FORMATS flag in ioctl.
.../userspace-api/media/v4l/dev-stateless-decoder.rst | 4 ++++
Documentation/userspace-api/media/v4l/vidioc-enum-fmt.rst | 5 +++++
Documentation/userspace-api/media/videodev2.h.rst.exceptions | 1 +
drivers/media/v4l2-core/v4l2-ioctl.c | 3 +++
include/uapi/linux/videodev2.h | 1 +
5 files changed, 14 insertions(+)
@@ -58,6 +58,10 @@ Querying capabilities
default values for these controls being used, and a returned set of formats
that may not be usable for the media the client is trying to decode.
+ * If ``V4L2_FMT_FLAG_ALL_FORMATS`` flag is set the driver must enumerate
+ all the supported formats without taking care of codec-dependent controls
+ set on ``OUTPUT`` queue.
+
3. The client may use :c:func:`VIDIOC_ENUM_FRAMESIZES` to detect supported
resolutions for a given format, passing desired pixel format in
:c:type:`v4l2_frmsizeenum`'s ``pixel_format``.
@@ -227,6 +227,11 @@ the ``mbus_code`` field is handled differently:
The application can ask to configure the quantization of the capture
device when calling the :ref:`VIDIOC_S_FMT <VIDIOC_G_FMT>` ioctl with
:ref:`V4L2_PIX_FMT_FLAG_SET_CSC <v4l2-pix-fmt-flag-set-csc>` set.
+ * - ``V4L2_FMT_FLAG_ALL_FORMATS``
+ - 0x0200
+ - Set by userland application to enumerate all possible pixels formats
+ without taking care of any configuration done on OUTPUT or CAPTURE
+ queues.
Return Value
============
@@ -215,6 +215,7 @@ replace define V4L2_FMT_FLAG_CSC_XFER_FUNC fmtdesc-flags
replace define V4L2_FMT_FLAG_CSC_YCBCR_ENC fmtdesc-flags
replace define V4L2_FMT_FLAG_CSC_HSV_ENC fmtdesc-flags
replace define V4L2_FMT_FLAG_CSC_QUANTIZATION fmtdesc-flags
+replace define V4L2_FMT_FLAG_ALL_FORMATS fmtdesc-flags
# V4L2 timecode types
replace define V4L2_TC_TYPE_24FPS timecode-type
@@ -1535,6 +1535,7 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
int ret = check_fmt(file, p->type);
u32 mbus_code;
u32 cap_mask;
+ u32 flags;
if (ret)
return ret;
@@ -1544,8 +1545,10 @@ static int v4l_enum_fmt(const struct v4l2_ioctl_ops *ops,
p->mbus_code = 0;
mbus_code = p->mbus_code;
+ flags = p->flags & V4L2_FMT_FLAG_ALL_FORMATS;
memset_after(p, 0, type);
p->mbus_code = mbus_code;
+ p->flags = flags;
switch (p->type) {
case V4L2_BUF_TYPE_VIDEO_CAPTURE:
@@ -869,6 +869,7 @@ struct v4l2_fmtdesc {
#define V4L2_FMT_FLAG_CSC_YCBCR_ENC 0x0080
#define V4L2_FMT_FLAG_CSC_HSV_ENC V4L2_FMT_FLAG_CSC_YCBCR_ENC
#define V4L2_FMT_FLAG_CSC_QUANTIZATION 0x0100
+#define V4L2_FMT_FLAG_ALL_FORMATS 0x0200
/* Frame Size and frame rate enumeration */
/*