On 14/03/2023 11:08, Ming Qian wrote: > Y012 is a luma-only formats with 12-bits per pixel, > expanded to 16bits. > Data in the 12 high bits, zeros in the 4 low bits, > arranged in little endian order. > > Signed-off-by: Ming Qian <ming.qian@xxxxxxx> > --- > .../userspace-api/media/v4l/pixfmt-yuv-luma.rst | 15 +++++++++++++++ > drivers/media/v4l2-core/v4l2-ioctl.c | 1 + > include/uapi/linux/videodev2.h | 1 + > 3 files changed, 17 insertions(+) > > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst > index 62078a01de76..7888151f2cd4 100644 > --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst > +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst > @@ -103,6 +103,17 @@ are often referred to as greyscale formats. > - ... > - ... > > + * .. _V4L2-PIX-FMT-Y012: > + > + - ``V4L2_PIX_FMT_Y012`` > + - 'Y012' > + > + - Y'\ :sub:`0`\ [3:0] `0000` > + - Y'\ :sub:`0`\ [11:4] > + - ... > + - ... > + - ... > + > * .. _V4L2-PIX-FMT-Y14: > > - ``V4L2_PIX_FMT_Y14`` > @@ -146,3 +157,7 @@ are often referred to as greyscale formats. > than 16 bits. For example, 10 bits per pixel uses values in the range 0 to > 1023. For the IPU3_Y10 format 25 pixels are packed into 32 bytes, which > leaves the 6 most significant bits of the last byte padded with 0. > + > + For Y012 and Y12 formats, Y012 place its data in the 12 high bits, with place -> places > + padding zeros in the 4 low bits, in contrast to Y12 format, which have to Y12 -> to the Y12 have -> has > + its padding located in the most significant bits of the 16 bit word. > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c > index 6489b67babfa..2cb485643562 100644 > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > @@ -1307,6 +1307,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) > case V4L2_PIX_FMT_Y6: descr = "6-bit Greyscale"; break; > case V4L2_PIX_FMT_Y10: descr = "10-bit Greyscale"; break; > case V4L2_PIX_FMT_Y12: descr = "12-bit Greyscale"; break; > + case V4L2_PIX_FMT_Y012: descr = "12-bit Greyscale"; break; I don't really like having two identical pixelformat names, but I can't think of a good way to describe the difference. Perhaps "12-bit Greyscale (bits 15-4)"? Regards, Hans > case V4L2_PIX_FMT_Y14: descr = "14-bit Greyscale"; break; > case V4L2_PIX_FMT_Y16: descr = "16-bit Greyscale"; break; > case V4L2_PIX_FMT_Y16_BE: descr = "16-bit Greyscale BE"; break; > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index f83a9d1210fb..db06d4c4f008 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -586,6 +586,7 @@ struct v4l2_pix_format { > #define V4L2_PIX_FMT_Y6 v4l2_fourcc('Y', '0', '6', ' ') /* 6 Greyscale */ > #define V4L2_PIX_FMT_Y10 v4l2_fourcc('Y', '1', '0', ' ') /* 10 Greyscale */ > #define V4L2_PIX_FMT_Y12 v4l2_fourcc('Y', '1', '2', ' ') /* 12 Greyscale */ > +#define V4L2_PIX_FMT_Y012 v4l2_fourcc('Y', '0', '1', '2') /* 12 Greyscale */ > #define V4L2_PIX_FMT_Y14 v4l2_fourcc('Y', '1', '4', ' ') /* 14 Greyscale */ > #define V4L2_PIX_FMT_Y16 v4l2_fourcc('Y', '1', '6', ' ') /* 16 Greyscale */ > #define V4L2_PIX_FMT_Y16_BE v4l2_fourcc_be('Y', '1', '6', ' ') /* 16 Greyscale BE */