On 12/07/2018 03:30 PM, Mauro Carvalho Chehab wrote: > Em Thu, 6 Sep 2018 11:02:28 +0200 > Hans Verkuil <hverkuil@xxxxxxxxx> 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 Verkuil@xxxxxxxxx> >>> Signed-off-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> >>> --- >>> 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 >