Commit 62aacfa9 authored by Dafna Hirschfeld's avatar Dafna Hirschfeld Committed by Mauro Carvalho Chehab

media: v4l2: extend the CSC API to subdevice.

This patch extends the CSC API in video devices to be supported
also on sub-devices. The flag V4L2_MBUS_FRAMEFMT_SET_CSC set by
the application when calling VIDIOC_SUBDEV_S_FMT ioctl.
The flags:

V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE,
V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC,
V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC/V4L2_SUBDEV_MBUS_CODE_CSC_HSV_ENC
V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION

are set by the driver in the VIDIOC_SUBDEV_ENUM_MBUS_CODE ioctl.

New 'flags' fields were added to the structs
v4l2_subdev_mbus_code_enum, v4l2_mbus_framefmt which are borrowed
from the 'reserved' field

The patch also replaces the 'ycbcr_enc' field in
'struct v4l2_mbus_framefmt' with a union that includes 'hsv_enc'
Signed-off-by: default avatarDafna Hirschfeld <dafna.hirschfeld@collabora.com>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent 2f491463
...@@ -34,32 +34,107 @@ Media Bus Formats ...@@ -34,32 +34,107 @@ Media Bus Formats
:ref:`field-order` for details. :ref:`field-order` for details.
* - __u32 * - __u32
- ``colorspace`` - ``colorspace``
- Image colorspace, from enum - Image colorspace, from enum :c:type:`v4l2_colorspace`.
:c:type:`v4l2_colorspace`. See Must be set by the driver for subdevices. If the application sets the
:ref:`colorspaces` for details. flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set this
field on the source pad to request a specific colorspace for the media
bus data. If the driver cannot handle the requested conversion, it will
return another supported colorspace. The driver indicates that colorspace
conversion is supported by setting the flag
V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE in the corresponding struct
:c:type:`v4l2_subdev_mbus_code_enum` during enumeration.
See :ref:`v4l2-subdev-mbus-code-flags`.
* - union {
- (anonymous)
* - __u16 * - __u16
- ``ycbcr_enc`` - ``ycbcr_enc``
- Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`. - Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`.
This information supplements the ``colorspace`` and must be set by This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output the driver for subdevices, see :ref:`colorspaces`. If the application
streams, see :ref:`colorspaces`. sets the flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set
this field on a source pad to request a specific Y'CbCr encoding
for the media bus data. If the driver cannot handle the requested
conversion, it will return another supported encoding.
This field is ignored for HSV media bus formats. The driver indicates
that ycbcr_enc conversion is supported by setting the flag
V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC in the corresponding struct
:c:type:`v4l2_subdev_mbus_code_enum` during enumeration.
See :ref:`v4l2-subdev-mbus-code-flags`.
* - __u16
- ``hsv_enc``
- HSV encoding, from enum :c:type:`v4l2_hsv_encoding`.
This information supplements the ``colorspace`` and must be set by
the driver for subdevices, see :ref:`colorspaces`. If the application
sets the flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set
this field on a source pad to request a specific HSV encoding
for the media bus data. If the driver cannot handle the requested
conversion, it will return another supported encoding.
This field is ignored for Y'CbCr media bus formats. The driver indicates
that hsv_enc conversion is supported by setting the flag
V4L2_SUBDEV_MBUS_CODE_CSC_HSV_ENC in the corresponding struct
:c:type:`v4l2_subdev_mbus_code_enum` during enumeration.
See :ref:`v4l2-subdev-mbus-code-flags`
* - }
-
* - __u16 * - __u16
- ``quantization`` - ``quantization``
- Quantization range, from enum :c:type:`v4l2_quantization`. - Quantization range, from enum :c:type:`v4l2_quantization`.
This information supplements the ``colorspace`` and must be set by This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output the driver for subdevices, see :ref:`colorspaces`. If the application
streams, see :ref:`colorspaces`. sets the flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set
this field on a source pad to request a specific quantization
for the media bus data. If the driver cannot handle the requested
conversion, it will return another supported quantization.
The driver indicates that quantization conversion is supported by
setting the flag V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION in the
corresponding struct :c:type:`v4l2_subdev_mbus_code_enum`
during enumeration. See :ref:`v4l2-subdev-mbus-code-flags`.
* - __u16 * - __u16
- ``xfer_func`` - ``xfer_func``
- Transfer function, from enum :c:type:`v4l2_xfer_func`. - Transfer function, from enum :c:type:`v4l2_xfer_func`.
This information supplements the ``colorspace`` and must be set by This information supplements the ``colorspace`` and must be set by
the driver for capture streams and by the application for output the driver for subdevices, see :ref:`colorspaces`. If the application
streams, see :ref:`colorspaces`. sets the flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set
this field on a source pad to request a specific transfer
function for the media bus data. If the driver cannot handle the requested
conversion, it will return another supported transfer function.
The driver indicates that the transfer function conversion is supported by
setting the flag V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC in the
corresponding struct :c:type:`v4l2_subdev_mbus_code_enum`
during enumeration. See :ref:`v4l2-subdev-mbus-code-flags`.
* - __u16 * - __u16
- ``reserved``\ [11] - ``flags``
- flags See: :ref:v4l2-mbus-framefmt-flags
* - __u16
- ``reserved``\ [10]
- Reserved for future extensions. Applications and drivers must set - Reserved for future extensions. Applications and drivers must set
the array to zero. the array to zero.
.. _v4l2-mbus-framefmt-flags:
.. flat-table:: v4l2_mbus_framefmt Flags
:header-rows: 0
:stub-columns: 0
:widths: 3 1 4
* .. _`mbus-framefmt-set-csc`:
- ``V4L2_MBUS_FRAMEFMT_SET_CSC``
- 0x0001
- Set by the application. It is only used for source pads and is
ignored for sink pads. If set, then request the subdevice to do
colorspace conversion from the received colorspace to the requested
colorspace values. If the colorimetry field (``colorspace``, ``xfer_func``,
``ycbcr_enc``, ``hsv_enc`` or ``quantization``) is set to ``*_DEFAULT``,
then that colorimetry setting will remain unchanged from what was received.
So in order to change the quantization, only the ``quantization`` field shall
be set to non default value (``V4L2_QUANTIZATION_FULL_RANGE`` or
``V4L2_QUANTIZATION_LIM_RANGE``) and all other colorimetry fields shall
be set to ``*_DEFAULT``.
To check which conversions are supported by the hardware for the current
media bus frame format, see :ref:`v4l2-subdev-mbus-code-flags`.
.. _v4l2-mbus-pixelcode: .. _v4l2-mbus-pixelcode:
......
...@@ -72,11 +72,60 @@ information about the try formats. ...@@ -72,11 +72,60 @@ information about the try formats.
- Media bus format codes to be enumerated, from enum - Media bus format codes to be enumerated, from enum
:ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`. :ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`.
* - __u32 * - __u32
- ``reserved``\ [8] - ``flags``
- See :ref:`v4l2-subdev-mbus-code-flags`
* - __u32
- ``reserved``\ [7]
- Reserved for future extensions. Applications and drivers must set - Reserved for future extensions. Applications and drivers must set
the array to zero. the array to zero.
.. tabularcolumns:: |p{4.4cm}|p{4.4cm}|p{7.7cm}|
.. _v4l2-subdev-mbus-code-flags:
.. flat-table:: Subdev Media Bus Code Enumerate Flags
:header-rows: 0
:stub-columns: 0
:widths: 1 1 2
* - V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE
- 0x00000001
- The driver allows the application to try to change the default colorspace
encoding. The application can ask to configure the colorspace of the
subdevice when calling the :ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_FMT>`
ioctl with :ref:`V4L2_MBUS_FRAMEFMT_SET_CSC <mbus-framefmt-set-csc>` set.
See :ref:`v4l2-mbus-format` on how to do this.
* - V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC
- 0x00000002
- The driver allows the application to try to change the default transform function.
The application can ask to configure the transform function of
the subdevice when calling the :ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_FMT>`
ioctl with :ref:`V4L2_MBUS_FRAMEFMT_SET_CSC <mbus-framefmt-set-csc>` set.
See :ref:`v4l2-mbus-format` on how to do this.
* - V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC
- 0x00000004
- The driver allows the application to try to change the default Y'CbCr
encoding. The application can ask to configure the Y'CbCr encoding of the
subdevice when calling the :ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_FMT>`
ioctl with :ref:`V4L2_MBUS_FRAMEFMT_SET_CSC <mbus-framefmt-set-csc>` set.
See :ref:`v4l2-mbus-format` on how to do this.
* - V4L2_SUBDEV_MBUS_CODE_CSC_HSV_ENC
- 0x00000004
- The driver allows the application to try to change the default HSV
encoding. The application can ask to configure the HSV encoding of the
subdevice when calling the :ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_FMT>`
ioctl with :ref:`V4L2_MBUS_FRAMEFMT_SET_CSC <mbus-framefmt-set-csc>` set.
See :ref:`v4l2-mbus-format` on how to do this.
* - V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION
- 0x00000008
- The driver allows the application to try to change the default
quantization. The application can ask to configure the quantization of
the subdevice when calling the :ref:`VIDIOC_SUBDEV_S_FMT <VIDIOC_SUBDEV_G_FMT>`
ioctl with :ref:`V4L2_MBUS_FRAMEFMT_SET_CSC <mbus-framefmt-set-csc>` set.
See :ref:`v4l2-mbus-format` on how to do this.
Return Value Return Value
============ ============
......
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/videodev2.h> #include <linux/videodev2.h>
#define V4L2_MBUS_FRAMEFMT_SET_CSC 0x0001
/** /**
* struct v4l2_mbus_framefmt - frame format on the media bus * struct v4l2_mbus_framefmt - frame format on the media bus
* @width: image width * @width: image width
...@@ -24,8 +26,11 @@ ...@@ -24,8 +26,11 @@
* @field: used interlacing type (from enum v4l2_field) * @field: used interlacing type (from enum v4l2_field)
* @colorspace: colorspace of the data (from enum v4l2_colorspace) * @colorspace: colorspace of the data (from enum v4l2_colorspace)
* @ycbcr_enc: YCbCr encoding of the data (from enum v4l2_ycbcr_encoding) * @ycbcr_enc: YCbCr encoding of the data (from enum v4l2_ycbcr_encoding)
* @hsv_enc: HSV encoding of the data (from enum v4l2_hsv_encoding)
* @quantization: quantization of the data (from enum v4l2_quantization) * @quantization: quantization of the data (from enum v4l2_quantization)
* @xfer_func: transfer function of the data (from enum v4l2_xfer_func) * @xfer_func: transfer function of the data (from enum v4l2_xfer_func)
* @flags: flags (V4L2_MBUS_FRAMEFMT_*)
* @reserved: reserved bytes that can be later used
*/ */
struct v4l2_mbus_framefmt { struct v4l2_mbus_framefmt {
__u32 width; __u32 width;
...@@ -33,10 +38,16 @@ struct v4l2_mbus_framefmt { ...@@ -33,10 +38,16 @@ struct v4l2_mbus_framefmt {
__u32 code; __u32 code;
__u32 field; __u32 field;
__u32 colorspace; __u32 colorspace;
union {
/* enum v4l2_ycbcr_encoding */
__u16 ycbcr_enc; __u16 ycbcr_enc;
/* enum v4l2_hsv_encoding */
__u16 hsv_enc;
};
__u16 quantization; __u16 quantization;
__u16 xfer_func; __u16 xfer_func;
__u16 reserved[11]; __u16 flags;
__u16 reserved[10];
}; };
#ifndef __KERNEL__ #ifndef __KERNEL__
......
...@@ -65,19 +65,27 @@ struct v4l2_subdev_crop { ...@@ -65,19 +65,27 @@ struct v4l2_subdev_crop {
__u32 reserved[8]; __u32 reserved[8];
}; };
#define V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE 0x00000001
#define V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC 0x00000002
#define V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC 0x00000004
#define V4L2_SUBDEV_MBUS_CODE_CSC_HSV_ENC V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC
#define V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION 0x00000008
/** /**
* struct v4l2_subdev_mbus_code_enum - Media bus format enumeration * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration
* @pad: pad number, as reported by the media API * @pad: pad number, as reported by the media API
* @index: format index during enumeration * @index: format index during enumeration
* @code: format code (MEDIA_BUS_FMT_ definitions) * @code: format code (MEDIA_BUS_FMT_ definitions)
* @which: format type (from enum v4l2_subdev_format_whence) * @which: format type (from enum v4l2_subdev_format_whence)
* @flags: flags set by the driver, (V4L2_SUBDEV_MBUS_CODE_*)
*/ */
struct v4l2_subdev_mbus_code_enum { struct v4l2_subdev_mbus_code_enum {
__u32 pad; __u32 pad;
__u32 index; __u32 index;
__u32 code; __u32 code;
__u32 which; __u32 which;
__u32 reserved[8]; __u32 flags;
__u32 reserved[7];
}; };
/** /**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment