Message ID | 20200703171019.19270-5-dafna.hirschfeld@collabora.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | v4l2: add support for colorspace conversion API (CSC) for video capture and subdevices | expand |
On 03/07/2020 19:10, Dafna Hirschfeld wrote: > 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_YCBCR_ENC, > V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC, Reorder. > > 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 > > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > --- > .../media/v4l/subdev-formats.rst | 78 +++++++++++++++++-- > .../v4l/vidioc-subdev-enum-mbus-code.rst | 44 ++++++++++- > include/uapi/linux/v4l2-mediabus.h | 9 ++- > include/uapi/linux/v4l2-subdev.h | 8 +- > 4 files changed, 129 insertions(+), 10 deletions(-) > > diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst > index 9a4d61b0d76f..7362ee0b1e96 100644 > --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst > +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst > @@ -41,32 +41,96 @@ Media Bus Formats > :ref:`field-order` for details. > * - __u32 > - ``colorspace`` > - - Image colorspace, from enum > - :c:type:`v4l2_colorspace`. See > - :ref:`colorspaces` for details. > + - Image colorspace, from enum :c:type:`v4l2_colorspace`. > + Must be set by the driver for capture streams and by the application > + for output streams, see :ref:`colorspaces`. If the application sets the > + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > + this field for a capture stream to request a specific colorspace > + for the media bus data. If the driver cannot handle 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:`colorspaces`. > * - __u16 > - ``ycbcr_enc`` > - Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`. > This information supplements the ``colorspace`` and must be set by > the driver for capture streams and by the application for output > - streams, see :ref:`colorspaces`. > + streams, see :ref:`colorspaces`. If the application sets the > + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > + this field for a capture stream to request a specific Y'CbCr encoding > + for the media bus data. If the driver cannot handle 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 > - ``quantization`` > - Quantization range, from enum :c:type:`v4l2_quantization`. > This information supplements the ``colorspace`` and must be set by > the driver for capture streams and by the application for output > - streams, see :ref:`colorspaces`. > + streams, see :ref:`colorspaces`. If the application sets the > + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > + this field for a capture stream to request a specific quantization > + encoding for the media bus data. If the driver cannot handle requested > + conversion, it will return another supported encoding. > + 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 > - ``xfer_func`` > - Transfer function, from enum :c:type:`v4l2_xfer_func`. > This information supplements the ``colorspace`` and must be set by > the driver for capture streams and by the application for output > - streams, see :ref:`colorspaces`. > + streams, see :ref:`colorspaces`. If the application sets the > + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > + this field for a capture stream 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 > + - ``reserved2`` > + - Reserved for future extensions. > + * - __u32 > + - ``flags`` > + - flags See: :ref:v4l2-mbus-framefmt-flags > * - __u16 > - - ``reserved``\ [11] > + - ``reserved``\ [8] > - Reserved for future extensions. Applications and drivers must set > 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`` > + - 0x00000001 > + - Set by the application. It is only used for capture and is > + ignored for output streams. If set, then request the subdevice to do > + colorspace conversion from the received colorspace to the requested > + colorspace values. If colorimetry field (``colorspace``, ``ycbcr_enc``, If -> If the > + ``quantization`` or ``xfer_func``) is set to 0, then that colorimetry Reorder. > + setting will remain unchanged from what was received. So to change the > + quantization, only the ``quantization`` field shall be set to non-zero values > + (``V4L2_QUANTIZATION_FULL_RANGE`` or ``V4L2_QUANTIZATION_LIM_RANGE``) > + and all other colorimetry fields shall be set to 0. > + > + 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: > diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst > index 35b8607203a4..8ed355a285e9 100644 > --- a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst > +++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst > @@ -79,11 +79,53 @@ information about the try formats. > - Media bus format codes to be enumerated, from enum > :ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`. > * - __u32 > - - ``reserved``\ [8] > + - ``flags`` > + - See :ref:`v4l2-subdev-mbus-code-flags` > + * - __u32 > + - ``reserved``\ [7] > - Reserved for future extensions. Applications and drivers must set > 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_YCBCR_ENC > + - 0x00000002 > + - The driver allows the application to try to change the default Y'CbCr > + encoding. The application can ask to configure the ycbcr_enc 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 > + - 0x00000004 > + - 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. > + * - V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC > + - 0x00000008 > + - 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. Reorder and renumber the V4L2_SUBDEV_MBUS_CODE_CSC_ values. > + > Return Value > ============ > > diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/linux/v4l2-mediabus.h > index 123a231001a8..3b7d692b4015 100644 > --- a/include/uapi/linux/v4l2-mediabus.h > +++ b/include/uapi/linux/v4l2-mediabus.h > @@ -16,6 +16,8 @@ > #include <linux/types.h> > #include <linux/videodev2.h> > > +#define V4L2_MBUS_FRAMEFMT_SET_CSC 0x00000001 > + > /** > * struct v4l2_mbus_framefmt - frame format on the media bus > * @width: image width > @@ -26,6 +28,9 @@ > * @ycbcr_enc: YCbCr encoding of the data (from enum v4l2_ycbcr_encoding) > * @quantization: quantization of the data (from enum v4l2_quantization) > * @xfer_func: transfer function of the data (from enum v4l2_xfer_func) > + * @reserved2: two reserved bytes that can be later used > + * @flags: flags (V4L2_MBUS_FRAMEFMT_*) > + * @reserved: reserved bytes that can be later used > */ > struct v4l2_mbus_framefmt { > __u32 width; > @@ -36,7 +41,9 @@ struct v4l2_mbus_framefmt { > __u16 ycbcr_enc; > __u16 quantization; > __u16 xfer_func; > - __u16 reserved[11]; > + __u16 reserved2; > + __u32 flags; > + __u16 reserved[8]; > }; > > #ifndef __KERNEL__ > diff --git a/include/uapi/linux/v4l2-subdev.h b/include/uapi/linux/v4l2-subdev.h > index 5d2a1dab7911..c20aa9a89864 100644 > --- a/include/uapi/linux/v4l2-subdev.h > +++ b/include/uapi/linux/v4l2-subdev.h > @@ -65,19 +65,25 @@ struct v4l2_subdev_crop { > __u32 reserved[8]; > }; > > +#define V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE 0x00000001 > +#define V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC 0x00000002 > +#define V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION 0x00000004 > +#define V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC 0x00000008 Reorder and renumber. Regards, Hans > /** > * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration > * @pad: pad number, as reported by the media API > * @index: format index during enumeration > * @code: format code (MEDIA_BUS_FMT_ definitions) > * @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 { > __u32 pad; > __u32 index; > __u32 code; > __u32 which; > - __u32 reserved[8]; > + __u32 flags; > + __u32 reserved[7]; > }; > > /** >
Hi Dafna, On Fri, Jul 03, 2020 at 07:10:16PM +0200, Dafna Hirschfeld wrote: > 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_YCBCR_ENC, > V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC, > > 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 > > Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > --- > .../media/v4l/subdev-formats.rst | 78 +++++++++++++++++-- > .../v4l/vidioc-subdev-enum-mbus-code.rst | 44 ++++++++++- > include/uapi/linux/v4l2-mediabus.h | 9 ++- > include/uapi/linux/v4l2-subdev.h | 8 +- > 4 files changed, 129 insertions(+), 10 deletions(-) > Thank you for the patch. Please see my comments inline. > diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst > index 9a4d61b0d76f..7362ee0b1e96 100644 > --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst > +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst > @@ -41,32 +41,96 @@ Media Bus Formats > :ref:`field-order` for details. > * - __u32 > - ``colorspace`` > - - Image colorspace, from enum > - :c:type:`v4l2_colorspace`. See > - :ref:`colorspaces` for details. > + - Image colorspace, from enum :c:type:`v4l2_colorspace`. > + Must be set by the driver for capture streams and by the application > + for output streams, see :ref:`colorspaces`. If the application sets the > + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > + this field for a capture stream to request a specific colorspace What is a "capture stream" in terms of the subdev API? Should this perhaps refer to "source pads" instead? [snip] > +.. _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`` > + - 0x00000001 > + - Set by the application. It is only used for capture and is > + ignored for output streams. If set, then request the subdevice to do Ditto. > + colorspace conversion from the received colorspace to the requested > + colorspace values. If colorimetry field (``colorspace``, ``ycbcr_enc``, nit: a colorimetry field > + ``quantization`` or ``xfer_func``) is set to 0, then that colorimetry Is it okay to explicitly mention 0 here, rather than the defined "_DEFAULT" values? Best regards, Tomasz
Am 22.07.20 um 14:53 schrieb Tomasz Figa: > Hi Dafna, > > On Fri, Jul 03, 2020 at 07:10:16PM +0200, Dafna Hirschfeld wrote: >> 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_YCBCR_ENC, >> V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC, >> >> 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 >> >> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> >> --- >> .../media/v4l/subdev-formats.rst | 78 +++++++++++++++++-- >> .../v4l/vidioc-subdev-enum-mbus-code.rst | 44 ++++++++++- >> include/uapi/linux/v4l2-mediabus.h | 9 ++- >> include/uapi/linux/v4l2-subdev.h | 8 +- >> 4 files changed, 129 insertions(+), 10 deletions(-) >> > > Thank you for the patch. Please see my comments inline. > >> diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst >> index 9a4d61b0d76f..7362ee0b1e96 100644 >> --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst >> +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst >> @@ -41,32 +41,96 @@ Media Bus Formats >> :ref:`field-order` for details. >> * - __u32 >> - ``colorspace`` >> - - Image colorspace, from enum >> - :c:type:`v4l2_colorspace`. See >> - :ref:`colorspaces` for details. >> + - Image colorspace, from enum :c:type:`v4l2_colorspace`. >> + Must be set by the driver for capture streams and by the application >> + for output streams, see :ref:`colorspaces`. If the application sets the >> + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set >> + this field for a capture stream to request a specific colorspace > > What is a "capture stream" in terms of the subdev API? Should this > perhaps refer to "source pads" instead? Hi, yes, I should change it to 'source pad'. I see that for the other colorimetry fields, the docs for v4l2_mbus_framefmt already writes "This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams," I guess this should also change, Thanks, Dafna > > [snip] >> +.. _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`` >> + - 0x00000001 >> + - Set by the application. It is only used for capture and is >> + ignored for output streams. If set, then request the subdevice to do > > Ditto. > >> + colorspace conversion from the received colorspace to the requested >> + colorspace values. If colorimetry field (``colorspace``, ``ycbcr_enc``, > > nit: a colorimetry field > >> + ``quantization`` or ``xfer_func``) is set to 0, then that colorimetry > > Is it okay to explicitly mention 0 here, rather than the defined > "_DEFAULT" values? > > Best regards, > Tomasz >
On Mon, Aug 17, 2020 at 12:24 PM Dafna Hirschfeld <dafna.hirschfeld@collabora.com> wrote: > > > > Am 22.07.20 um 14:53 schrieb Tomasz Figa: > > Hi Dafna, > > > > On Fri, Jul 03, 2020 at 07:10:16PM +0200, Dafna Hirschfeld wrote: > >> 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_YCBCR_ENC, > >> V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC, > >> > >> 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 > >> > >> Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> > >> --- > >> .../media/v4l/subdev-formats.rst | 78 +++++++++++++++++-- > >> .../v4l/vidioc-subdev-enum-mbus-code.rst | 44 ++++++++++- > >> include/uapi/linux/v4l2-mediabus.h | 9 ++- > >> include/uapi/linux/v4l2-subdev.h | 8 +- > >> 4 files changed, 129 insertions(+), 10 deletions(-) > >> > > > > Thank you for the patch. Please see my comments inline. > > > >> diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst > >> index 9a4d61b0d76f..7362ee0b1e96 100644 > >> --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst > >> +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst > >> @@ -41,32 +41,96 @@ Media Bus Formats > >> :ref:`field-order` for details. > >> * - __u32 > >> - ``colorspace`` > >> - - Image colorspace, from enum > >> - :c:type:`v4l2_colorspace`. See > >> - :ref:`colorspaces` for details. > >> + - Image colorspace, from enum :c:type:`v4l2_colorspace`. > >> + Must be set by the driver for capture streams and by the application > >> + for output streams, see :ref:`colorspaces`. If the application sets the > >> + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set > >> + this field for a capture stream to request a specific colorspace > > > > What is a "capture stream" in terms of the subdev API? Should this > > perhaps refer to "source pads" instead? > > Hi, yes, I should change it to 'source pad'. I see that for the other colorimetry fields, > the docs for v4l2_mbus_framefmt already writes > "This information supplements the colorspace and must be set by the driver for capture streams and by the application for output streams," > I guess this should also change, Right. Best regards, Tomasz
diff --git a/Documentation/userspace-api/media/v4l/subdev-formats.rst b/Documentation/userspace-api/media/v4l/subdev-formats.rst index 9a4d61b0d76f..7362ee0b1e96 100644 --- a/Documentation/userspace-api/media/v4l/subdev-formats.rst +++ b/Documentation/userspace-api/media/v4l/subdev-formats.rst @@ -41,32 +41,96 @@ Media Bus Formats :ref:`field-order` for details. * - __u32 - ``colorspace`` - - Image colorspace, from enum - :c:type:`v4l2_colorspace`. See - :ref:`colorspaces` for details. + - Image colorspace, from enum :c:type:`v4l2_colorspace`. + Must be set by the driver for capture streams and by the application + for output streams, see :ref:`colorspaces`. If the application sets the + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set + this field for a capture stream to request a specific colorspace + for the media bus data. If the driver cannot handle 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:`colorspaces`. * - __u16 - ``ycbcr_enc`` - Y'CbCr encoding, from enum :c:type:`v4l2_ycbcr_encoding`. This information supplements the ``colorspace`` and must be set by the driver for capture streams and by the application for output - streams, see :ref:`colorspaces`. + streams, see :ref:`colorspaces`. If the application sets the + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set + this field for a capture stream to request a specific Y'CbCr encoding + for the media bus data. If the driver cannot handle 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 - ``quantization`` - Quantization range, from enum :c:type:`v4l2_quantization`. This information supplements the ``colorspace`` and must be set by the driver for capture streams and by the application for output - streams, see :ref:`colorspaces`. + streams, see :ref:`colorspaces`. If the application sets the + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set + this field for a capture stream to request a specific quantization + encoding for the media bus data. If the driver cannot handle requested + conversion, it will return another supported encoding. + 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 - ``xfer_func`` - Transfer function, from enum :c:type:`v4l2_xfer_func`. This information supplements the ``colorspace`` and must be set by the driver for capture streams and by the application for output - streams, see :ref:`colorspaces`. + streams, see :ref:`colorspaces`. If the application sets the + flag ``V4L2_MBUS_FRAMEFMT_SET_CSC`` then the application can set + this field for a capture stream 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 + - ``reserved2`` + - Reserved for future extensions. + * - __u32 + - ``flags`` + - flags See: :ref:v4l2-mbus-framefmt-flags * - __u16 - - ``reserved``\ [11] + - ``reserved``\ [8] - Reserved for future extensions. Applications and drivers must set 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`` + - 0x00000001 + - Set by the application. It is only used for capture and is + ignored for output streams. If set, then request the subdevice to do + colorspace conversion from the received colorspace to the requested + colorspace values. If colorimetry field (``colorspace``, ``ycbcr_enc``, + ``quantization`` or ``xfer_func``) is set to 0, then that colorimetry + setting will remain unchanged from what was received. So to change the + quantization, only the ``quantization`` field shall be set to non-zero values + (``V4L2_QUANTIZATION_FULL_RANGE`` or ``V4L2_QUANTIZATION_LIM_RANGE``) + and all other colorimetry fields shall be set to 0. + + 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: diff --git a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst index 35b8607203a4..8ed355a285e9 100644 --- a/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst +++ b/Documentation/userspace-api/media/v4l/vidioc-subdev-enum-mbus-code.rst @@ -79,11 +79,53 @@ information about the try formats. - Media bus format codes to be enumerated, from enum :ref:`v4l2_subdev_format_whence <v4l2-subdev-format-whence>`. * - __u32 - - ``reserved``\ [8] + - ``flags`` + - See :ref:`v4l2-subdev-mbus-code-flags` + * - __u32 + - ``reserved``\ [7] - Reserved for future extensions. Applications and drivers must set 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_YCBCR_ENC + - 0x00000002 + - The driver allows the application to try to change the default Y'CbCr + encoding. The application can ask to configure the ycbcr_enc 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 + - 0x00000004 + - 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. + * - V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC + - 0x00000008 + - 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. + Return Value ============ diff --git a/include/uapi/linux/v4l2-mediabus.h b/include/uapi/linux/v4l2-mediabus.h index 123a231001a8..3b7d692b4015 100644 --- a/include/uapi/linux/v4l2-mediabus.h +++ b/include/uapi/linux/v4l2-mediabus.h @@ -16,6 +16,8 @@ #include <linux/types.h> #include <linux/videodev2.h> +#define V4L2_MBUS_FRAMEFMT_SET_CSC 0x00000001 + /** * struct v4l2_mbus_framefmt - frame format on the media bus * @width: image width @@ -26,6 +28,9 @@ * @ycbcr_enc: YCbCr encoding of the data (from enum v4l2_ycbcr_encoding) * @quantization: quantization of the data (from enum v4l2_quantization) * @xfer_func: transfer function of the data (from enum v4l2_xfer_func) + * @reserved2: two reserved bytes that can be later used + * @flags: flags (V4L2_MBUS_FRAMEFMT_*) + * @reserved: reserved bytes that can be later used */ struct v4l2_mbus_framefmt { __u32 width; @@ -36,7 +41,9 @@ struct v4l2_mbus_framefmt { __u16 ycbcr_enc; __u16 quantization; __u16 xfer_func; - __u16 reserved[11]; + __u16 reserved2; + __u32 flags; + __u16 reserved[8]; }; #ifndef __KERNEL__ diff --git a/include/uapi/linux/v4l2-subdev.h b/include/uapi/linux/v4l2-subdev.h index 5d2a1dab7911..c20aa9a89864 100644 --- a/include/uapi/linux/v4l2-subdev.h +++ b/include/uapi/linux/v4l2-subdev.h @@ -65,19 +65,25 @@ struct v4l2_subdev_crop { __u32 reserved[8]; }; +#define V4L2_SUBDEV_MBUS_CODE_CSC_COLORSPACE 0x00000001 +#define V4L2_SUBDEV_MBUS_CODE_CSC_YCBCR_ENC 0x00000002 +#define V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION 0x00000004 +#define V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC 0x00000008 /** * struct v4l2_subdev_mbus_code_enum - Media bus format enumeration * @pad: pad number, as reported by the media API * @index: format index during enumeration * @code: format code (MEDIA_BUS_FMT_ definitions) * @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 { __u32 pad; __u32 index; __u32 code; __u32 which; - __u32 reserved[8]; + __u32 flags; + __u32 reserved[7]; }; /**
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_YCBCR_ENC, V4L2_SUBDEV_MBUS_CODE_CSC_QUANTIZATION V4L2_SUBDEV_MBUS_CODE_CSC_XFER_FUNC, 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 Signed-off-by: Dafna Hirschfeld <dafna.hirschfeld@collabora.com> --- .../media/v4l/subdev-formats.rst | 78 +++++++++++++++++-- .../v4l/vidioc-subdev-enum-mbus-code.rst | 44 ++++++++++- include/uapi/linux/v4l2-mediabus.h | 9 ++- include/uapi/linux/v4l2-subdev.h | 8 +- 4 files changed, 129 insertions(+), 10 deletions(-)