On 12/07/2018 03:30 PM, Mauro Carvalho Chehab wrote:
> Em Thu, 6 Sep 2018 11:02:28 +0200
> Hans Verkuil <[email protected]> escreveu:
>
>> Hi Philipp,
>>
>> It is much appreciated that this old RFC of mine is picked up again.
>> I always wanted to get this in, but I never had a driver where it would
>> make sense to do so.
>
> What's the status of this?
Changes were requested, and there was some discussion. I'm basically
waiting for an update.
I've delegated it to me.
Regards,
Hans
>
> Hans,
> As this is an old RFC from you, I'll delegate it to you at patchwork,
> for you to track it.
>
> Regards,
> Mauro
>
>>
>> On 09/05/2018 07:09 PM, Philipp Zabel wrote:
>>> For video capture it is the driver that reports the colorspace,
>>
>> add: "transfer function,"
>>
>>> Y'CbCr/HSV encoding and quantization range used by the video, and there
>>> is no way to request something different, even though many HDTV
>>> receivers have some sort of colorspace conversion capabilities.
>>>
>>> For output video this feature already exists since the application
>>> specifies this information for the video format it will send out, and
>>> the transmitter will enable any available CSC if a format conversion has
>>> to be performed in order to match the capabilities of the sink.
>>>
>>> For video capture we propose adding new pix_format flags:
>>> V4L2_PIX_FMT_FLAG_CSC_COLORSPACE, V4L2_PIX_FMT_FLAG_CSC_YCBCR_ENC,
>>> V4L2_PIX_FMT_FLAG_CSC_HSV_ENC, V4L2_PIX_FMT_FLAG_CSC_QUANTIZATION, and
>>> V4L2_PIX_FMT_FLAG_CSC_XFER_FUNC. These are set by the driver to indicate
>>> its conversion features. When set by the application, the driver will
>>> interpret the colorspace, ycbcr_enc/hsv_enc, quantization and xfer_func
>>> fields as the requested colorspace information and will attempt to do
>>> the conversion it supports.
>>>
>>> Drivers do not have to actually look at the flags: if the flags are not
>>> set, then the colorspace, ycbcr_enc and quantization fields are set to
>>> the default values by the core, i.e. just pass on the received format
>>> without conversion.
>>
>> Thinking about this some more, I don't think this is quite the right
>> approach.
>> Having userspace set these flags with S_FMT if they want to do explicit
>> conversions makes sense, and that part we can keep.
>>
>> But to signal the capabilities I think should be done via new flags for
>> VIDIOC_ENUM_FMT. Basically the same set of flags, but for the flags field
>> of struct v4l2_fmtdesc.
>>
>> One thing that's not clear to me is what happens if userspace sets one or
>> more flags and calls S_FMT for a driver that doesn't support this. Are the
>> flags zeroed in that case upon return? I don't think so, but I think that
>> is already true for the existing flag V4L2_PIX_FMT_FLAG_PREMUL_ALPHA.
>>
>> I wonder if V4L2_PIX_FMT_FLAG_PREMUL_ALPHA should also get an equivalent
>> flag for v4l2_fmtdesc.
>>
>> Then we can just document that v4l2_format flags are only valid if they
>> are also defined in v4l2_fmtdesc.
>>
>> Does anyone have better ideas for this?
>>
>> Regards,
>>
>> Hans
>>
>>>
>>> Signed-off-by: Hans Verkuil <Hans [email protected]>
>>> Signed-off-by: Philipp Zabel <[email protected]>
>>> ---
>>> Changes since v1 [1]
>>> - convert to rst
>>> - split V4L2_PIX_FMT_FLAG_REQUEST_CSC into four separate flags for
>>> colorspace, ycbcr_enc/hsv_enc, quantization, and xfer_func
>>> - let driver set flags to indicate supported features
>>>
>>> [1] https://patchwork.linuxtv.org/patch/28847/
>>> ---
>>> .../media/uapi/v4l/pixfmt-reserved.rst | 41 +++++++++++++++++++
>>> .../media/uapi/v4l/pixfmt-v4l2-mplane.rst | 16 ++------
>>> Documentation/media/uapi/v4l/pixfmt-v4l2.rst | 37 ++++++++++++++---
>>> drivers/media/v4l2-core/v4l2-ioctl.c | 12 ++++++
>>> include/uapi/linux/videodev2.h | 5 +++
>>> 5 files changed, 94 insertions(+), 17 deletions(-)
>>>
>>> diff --git a/Documentation/media/uapi/v4l/pixfmt-reserved.rst
>>> b/Documentation/media/uapi/v4l/pixfmt-reserved.rst
>>> index 38af1472a4b4..c1090027626c 100644
>>> --- a/Documentation/media/uapi/v4l/pixfmt-reserved.rst
>>> +++ b/Documentation/media/uapi/v4l/pixfmt-reserved.rst
>>> @@ -261,3 +261,44 @@ please make a proposal on the linux-media mailing list.
>>> by RGBA values (128, 192, 255, 128), the same pixel described with
>>> premultiplied colors would be described by RGBA values (64, 96,
>>> 128, 128)
>>> + * - ``V4L2_PIX_FMT_FLAG_CSC_COLORSPACE``
>>> + - 0x00000002
>>> + - Set by the driver to indicate colorspace conversion support. Set
>>> by the
>>> + application to request conversion to the specified colorspace. It is
>>> + only used for capture and is ignored for output streams. If set by the
>>> + application, then request the driver to do colorspace conversion from
>>> + the received colorspace to the requested colorspace by setting the
>>> + ``colorspace`` field of struct :c:type:`v4l2_pix_format`.
>>> + * - ``V4L2_PIX_FMT_FLAG_CSC_YCBCR_ENC``
>>> + - 0x00000004
>>> + - Set by the driver to indicate Y'CbCr encoding conversion support.
>>> Set
>>> + by the application to request conversion to the specified Y'CbCr
>>> + encoding. It is only used for capture and is ignored for output
>>> + streams. If set by the application, then request the driver to convert
>>> + from the received Y'CbCr encoding to the requested encoding by setting
>>> + the ``ycbcr_enc`` field of struct :c:type:`v4l2_pix_format`.
>>> + * - ``V4L2_PIX_FMT_FLAG_CSC_HSV_ENC``
>>> + - 0x00000004
>>> + - Set by the driver to indicate HSV encoding conversion support. Set
>>> + by the application to request conversion to the specified HSV encoding.
>>> + It is only used for capture and is ignored for output streams. If set
>>> + by the application, then request the driver to convert from the
>>> + received HSV encoding to the requested encoding by setting the
>>> + ``hsv_enc`` field of struct :c:type:`v4l2_pix_format`.
>>> + * - ``V4L2_PIX_FMT_FLAG_CSC_QUANTIZATION``
>>> + - 0x00000008
>>> + - Set by the driver to indicate quantization range conversion
>>> support.
>>> + Set by the application to request conversion to the specified
>>> + quantization range. It is only used for capture and is ignored for
>>> + output streams. If set by the application, then request the driver to
>>> + convert from the received quantization range to the requested
>>> + quantization by setting the ``quantization`` field of struct
>>> + :c:type:`v4l2_pix_format`.
>>> + * - ``V4L2_PIX_FMT_FLAG_CSC_XFER_FUNC``
>>> + - 0x00000010
>>> + - Set by the driver to indicate transfer function conversion support.
>>> + Set by the application to request conversion to the specified transfer
>>> + function. It is only used for capture and is ignored for output
>>> + streams. If set by the application, then request the driver to convert
>>> + from the received transfer function to the requested transfer function
>>> + by setting the ``xfer_func`` field of struct :c:type:`v4l2_pix_format`.
>>> diff --git a/Documentation/media/uapi/v4l/pixfmt-v4l2-mplane.rst
>>> b/Documentation/media/uapi/v4l/pixfmt-v4l2-mplane.rst
>>> index ef52f637d8e9..7ff07411db77 100644
>>> --- a/Documentation/media/uapi/v4l/pixfmt-v4l2-mplane.rst
>>> +++ b/Documentation/media/uapi/v4l/pixfmt-v4l2-mplane.rst
>>> @@ -81,30 +81,22 @@ describing all planes of that format.
>>> * - __u8
>>> - ``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`.
>>> + See struct :c:type:`v4l2_pix_format`.
>>> * - __u8
>>> - ``hsv_enc``
>>> - HSV encoding, from enum :c:type:`v4l2_hsv_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`.
>>> + See struct :c:type:`v4l2_pix_format`.
>>> * - }
>>> -
>>> -
>>> * - __u8
>>> - ``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`.
>>> + See struct :c:type:`v4l2_pix_format`.
>>> * - __u8
>>> - ``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`.
>>> + See struct :c:type:`v4l2_pix_format`.
>>> * - __u8
>>> - ``reserved[7]``
>>> - Reserved for future extensions. Should be zeroed by drivers and
>>> diff --git a/Documentation/media/uapi/v4l/pixfmt-v4l2.rst
>>> b/Documentation/media/uapi/v4l/pixfmt-v4l2.rst
>>> index 826f2305da01..932b6a546e61 100644
>>> --- a/Documentation/media/uapi/v4l/pixfmt-v4l2.rst
>>> +++ b/Documentation/media/uapi/v4l/pixfmt-v4l2.rst
>>> @@ -88,7 +88,12 @@ Single-planar format structure
>>> - Image colorspace, from enum :c:type:`v4l2_colorspace`.
>>> This information supplements the ``pixelformat`` and must be set
>>> by the driver for capture streams and by the application for
>>> - output streams, see :ref:`colorspaces`.
>>> + output streams, see :ref:`colorspaces`. If the application sets the
>>> + flag ``V4L2_PIX_FMT_FLAG_CSC_COLORSPACE`` then the application can set
>>> + this field for a capture stream to request a specific colorspace for
>>> + the captured image data. The driver will attempt to do colorspace
>>> + conversion to the specified colorspace or return the colorspace it will
>>> + use if it can't do the conversion.
>>> * - __u32
>>> - ``priv``
>>> - This field indicates whether the remaining fields of the
>>> @@ -126,13 +131,25 @@ Single-planar format structure
>>> - 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_PIX_FMT_FLAG_CSC_YCBCR_ENC`` then the application can set
>>> + this field for a capture stream to request a specific Y'CbCr encoding
>>> + for the captured image data. The driver will attempt to do the
>>> + conversion to the specified Y'CbCr encoding or return the encoding it
>>> + will use if it can't do the conversion. This field is ignored for
>>> + non-Y'CbCr pixelformats.
>>> * - __u32
>>> - ``hsv_enc``
>>> - HSV encoding, from enum :c:type:`v4l2_hsv_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_PIX_FMT_FLAG_CSC_HSV_ENC`` then the application can set this
>>> + field for a capture stream to request a specific HSV encoding for the
>>> + captured image data. The driver will attempt to do the conversion to
>>> + the specified HSV encoding or return the encoding it will use if it
>>> + can't do the conversion. This field is ignored for non-HSV
>>> + pixelformats.
>>> * - }
>>> -
>>> -
>>> @@ -141,10 +158,20 @@ Single-planar format structure
>>> - 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_PIX_FMT_FLAG_CSC_QUANTIZATION`` then the application can set
>>> + this field for a capture stream to request a specific quantization
>>> + range for the captured image data. The driver will attempt to do the
>>> + conversion to the specified quantization range or return the
>>> + quantization it will use if it can't do the conversion.
>>> * - __u32
>>> - ``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_PIX_FMT_FLAG_CSC_XFER_FUNC`` then the application can set
>>> + this field for a capture stream to request a specific transfer function
>>> + for the captured image data. The driver will attempt to do the
>>> + conversion to the specified transfer function or return the transfer
>>> + function it will use if it can't do the conversion.
>>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c
>>> b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> index 54afc9c7ee6e..39def068f13e 100644
>>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c
>>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c
>>> @@ -1019,6 +1019,18 @@ static void v4l_sanitize_format(struct v4l2_format
>>> *fmt)
>>> * isn't used by applications.
>>> */
>>>
>>> + if (fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE ||
>>> + fmt->type == V4L2_BUF_TYPE_VIDEO_CAPTURE_MPLANE) {
>>> + if (!(fmt->fmt.pix.flags & V4L2_PIX_FMT_FLAG_CSC_COLORSPACE))
>>> + fmt->fmt.pix.colorspace = V4L2_COLORSPACE_DEFAULT;
>>> + if (!(fmt->fmt.pix.flags & V4L2_PIX_FMT_FLAG_CSC_YCBCR_ENC))
>>> + fmt->fmt.pix.ycbcr_enc = V4L2_YCBCR_ENC_DEFAULT;
>>> + if (!(fmt->fmt.pix.flags & V4L2_PIX_FMT_FLAG_CSC_QUANTIZATION))
>>> + fmt->fmt.pix.quantization = V4L2_QUANTIZATION_DEFAULT;
>>> + if (!(fmt->fmt.pix.flags & V4L2_PIX_FMT_FLAG_CSC_XFER_FUNC))
>>> + fmt->fmt.pix.xfer_func = V4L2_XFER_FUNC_DEFAULT;
>>> + }
>>> +
>>> if (fmt->type != V4L2_BUF_TYPE_VIDEO_CAPTURE &&
>>> fmt->type != V4L2_BUF_TYPE_VIDEO_OUTPUT)
>>> return;
>>> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h
>>> index 622f0479d668..4cbc8f23b828 100644
>>> --- a/include/uapi/linux/videodev2.h
>>> +++ b/include/uapi/linux/videodev2.h
>>> @@ -709,6 +709,11 @@ struct v4l2_pix_format {
>>>
>>> /* Flags */
>>> #define V4L2_PIX_FMT_FLAG_PREMUL_ALPHA 0x00000001
>>> +#define V4L2_PIX_FMT_FLAG_CSC_COLORSPACE 0x00000002
>>> +#define V4L2_PIX_FMT_FLAG_CSC_YCBCR_ENC 0x00000004
>>> +#define V4L2_PIX_FMT_FLAG_CSC_HSV_ENC 0x00000004
>>> +#define V4L2_PIX_FMT_FLAG_CSC_QUANTIZATION 0x00000008
>>> +#define V4L2_PIX_FMT_FLAG_CSC_XFER_FUNC 0x00000010
>>>
>>> /*
>>> * F O R M A T E N U M E R A T I O N
>>>
>>
>
>
>
> Thanks,
> Mauro
>