media: imx-jpeg: Add support for 12 bit extended
cover media: imx-jpeg: Add support for 12 bit extended
the imx8 jpeg codec support ISO/IEC 10918-1 Standard Baseline and Extended Sequential DCT modes.
it can support 8-bit and 12-bit per color samples. Currently we only enable the 8-bit jpeg,
and we can enable the 12-bit extended jpeg
with the new defined 12 bit pixel format.
Ming Qian (10):
media: Add P012 and P012M video format
media: Add Y012 video format
media: Add Y212 video format
media: Add Y312 video format
media: Add B312 video format
media: Add B412 video format
media: imx-jpeg: Refine the function mxc_jpeg_find_format
media: imx-jpeg: Clear slot next desc ptr if config error
media: imx-jpeg: Decoder add support for 12bit jpeg
media: imx-jpeg: Encoder add support for 12bit jpeg
.../media/v4l/pixfmt-packed-yuv.rst | 70 ++++ .../userspace-api/media/v4l/pixfmt-rgb.rst | 44 +++ .../media/v4l/pixfmt-yuv-luma.rst | 11 + .../media/v4l/pixfmt-yuv-planar.rst | 94 +++++ .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c | 19 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 5 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 326 ++++++++++++++++-- drivers/media/v4l2-core/v4l2-common.c | 6 + drivers/media/v4l2-core/v4l2-ioctl.c | 7 + include/uapi/linux/videodev2.h | 9 + 10 files changed, 565 insertions(+), 26 deletions(-)
Signature · 1 line
2.38.1
PATCH 1/10 media: Add P012 and P012M video format
P012 is a YUV format with 12-bits per component with interleaved UV, like NV12, expanded to 16 bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
And P012M has two non contiguous planes.
--- .../media/v4l/pixfmt-yuv-planar.rst | 94 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 2 + drivers/media/v4l2-core/v4l2-ioctl.c | 2 + include/uapi/linux/videodev2.h | 2 + 4 files changed, 100 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +94 -0
@@ -123,6 +123,20 @@ All components are stored with the same number of bits per component. - Cb, Cr - Yes - 4x4 tiles + * - V4L2_PIX_FMT_P012 + - 'P012' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear + * - V4L2_PIX_FMT_P012M + - 'PM12' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear * - V4L2_PIX_FMT_NV16 - 'NV16' - 8
@@ -586,6 +600,86 @@ Data in the 10 high bits, zeros in the 6 low bits, arranged in little endian ord - Cb\ :sub:`11` - Cr\ :sub:`11` +.. _V4L2-PIX-FMT-P012: +.. _V4L2-PIX-FMT-P012M: + +P012 and P012M +-------------- + +P012 is like NV12 with 12 bits per component, expanded to 16 bits. +Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order. + +.. flat-table:: Sample 4x4 P012 Image + :header-rows: 0 + :stub-columns: 0 + + * - start + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - start + 32: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start + 40: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + +.. flat-table:: Sample 4x4 P012M Image + :header-rows: 0 + :stub-columns: 0 + + * - start0 + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start0 + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start0 + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start0 + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - + * - start1 + 0: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start1 + 8: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + Fully Planar YUV Formats ========================
drivers/media/v4l2-core/v4l2-common.c +2 -0
@@ -267,6 +267,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_NV24, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_NV42, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_P010, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_P012, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 }, { .format = V4L2_PIX_FMT_YUV410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 }, { .format = V4L2_PIX_FMT_YVU410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 },
@@ -292,6 +293,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_NV21M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 }, { .format = V4L2_PIX_FMT_NV16M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_NV61M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_P012M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 }, /* Bayer RGB formats */ { .format = V4L2_PIX_FMT_SBGGR8, .pixel_enc = V4L2_PIXEL_ENC_BAYER, .mem_planes = 1, .comp_planes = 1, .bpp = { 1, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 },
drivers/media/v4l2-core/v4l2-ioctl.c +2 -0
@@ -1348,6 +1348,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_NV24 : descr ="Y/UV 4:4:4" ;break ;case V4L2_PIX_FMT_NV42 : descr ="Y/VU 4:4:4" ;break ;case V4L2_PIX_FMT_P010 : descr ="10-bit Y/UV 4:2:0" ;break ; +case V4L2_PIX_FMT_P012 : descr ="12-bit Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV12_4L4 : descr ="Y/UV 4:2:0 (4x4 Linear)" ;break ;case V4L2_PIX_FMT_NV12_16L16 : descr ="Y/UV 4:2:0 (16x16 Linear)" ;break ;case V4L2_PIX_FMT_NV12_32L32 : descr ="Y/UV 4:2:0 (32x32 Linear)" ;break ;
@@ -1358,6 +1359,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_NV61M : descr ="Y/VU 4:2:2 (N-C)" ;break ;case V4L2_PIX_FMT_NV12MT : descr ="Y/UV 4:2:0 (64x32 MB, N-C)" ;break ;case V4L2_PIX_FMT_NV12MT_16X16 : descr ="Y/UV 4:2:0 (16x16 MB, N-C)" ;break ; +case V4L2_PIX_FMT_P012M : descr ="12-bit Y/UV 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YUV420M : descr ="Planar YUV 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YVU420M : descr ="Planar YVU 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YUV422M : descr ="Planar YUV 4:2:2 (N-C)" ;break ;
include/uapi/linux/videodev2.h +2 -0
@@ -626,12 +626,14 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')/* 24 Y/CbCr 4:4:4 */ #define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2')/* 24 Y/CrCb 4:4:4 */ #define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0')/* 24 Y/CbCr 4:2:0 10-bit per component */ +#define V4L2_PIX_FMT_P012 v4l2_fourcc('P', '0', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */ /* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2')/* 12 Y/CbCr 4:2:0 */ #define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1')/* 21 Y/CrCb 4:2:0 */ #define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6')/* 16 Y/CbCr 4:2:2 */ #define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1')/* 16 Y/CrCb 4:2:2 */ +#define V4L2_PIX_FMT_P012M v4l2_fourcc('P', 'M', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */ /* three planes - Y Cb, Cr */ #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9')/* 9 YUV 4:1:0 */
Signature · 1 line
2.38.1
Re: [PATCH 01/10] media: Add P012 and P012M video format
Quoted 172 lines · Ming Qian
P012 is a YUV format with 12-bits per component with interleaved UV, like NV12, expanded to 16 bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
And P012M has two non contiguous planes.Signed-off-by Ming Qian <[email protected]>--- .../media/v4l/pixfmt-yuv-planar.rst | 94 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 2 + drivers/media/v4l2-core/v4l2-ioctl.c | 2 + include/uapi/linux/videodev2.h | 2 + 4 files changed, 100 insertions(+)Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +94
-0@@ -123,6 +123,20 @@ All components are stored with the same number of bits per component. - Cb, Cr - Yes - 4x4 tiles + * - V4L2_PIX_FMT_P012 + - 'P012' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear + * - V4L2_PIX_FMT_P012M + - 'PM12' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear * - V4L2_PIX_FMT_NV16 - 'NV16' - 8@@ -586,6 +600,86 @@ Data in the 10 high bits, zeros in the 6 low bits, arranged in little endian ord - Cb\ :sub:`11` - Cr\ :sub:`11` +.. _V4L2-PIX-FMT-P012: +.. _V4L2-PIX-FMT-P012M: + +P012 and P012M +-------------- + +P012 is like NV12 with 12 bits per component, expanded to 16 bits. +Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order. + +.. flat-table:: Sample 4x4 P012 Image + :header-rows: 0 + :stub-columns: 0 + + * - start + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - start + 32: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start + 40: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + +.. flat-table:: Sample 4x4 P012M Image + :header-rows: 0 + :stub-columns: 0 + + * - start0 + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start0 + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start0 + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start0 + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - + * - start1 + 0: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start1 + 8: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + Fully Planar YUV Formats ========================drivers/media/v4l2-core/v4l2-common.c +2
-0@@ -267,6 +267,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_NV24, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_NV42, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_P010, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_P012, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 }, { .format = V4L2_PIX_FMT_YUV410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 }, { .format = V4L2_PIX_FMT_YVU410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 },@@ -292,6 +293,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_NV21M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 }, { .format = V4L2_PIX_FMT_NV16M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_NV61M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_P012M, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 }, /* Bayer RGB formats */ { .format = V4L2_PIX_FMT_SBGGR8, .pixel_enc = V4L2_PIXEL_ENC_BAYER, .mem_planes = 1, .comp_planes = 1, .bpp = { 1, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 },drivers/media/v4l2-core/v4l2-ioctl.c +2
-0@@ -1348,6 +1348,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_NV24 : descr ="Y/UV 4:4:4" ;break ;case V4L2_PIX_FMT_NV42 : descr ="Y/VU 4:4:4" ;break ;case V4L2_PIX_FMT_P010 : descr ="10-bit Y/UV 4:2:0" ;break ; +case V4L2_PIX_FMT_P012 : descr ="12-bit Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV12_4L4 : descr ="Y/UV 4:2:0 (4x4 Linear)" ;break ;case V4L2_PIX_FMT_NV12_16L16 : descr ="Y/UV 4:2:0 (16x16 Linear)" ;break ;case V4L2_PIX_FMT_NV12_32L32 : descr ="Y/UV 4:2:0 (32x32 Linear)" ;break ;@@ -1358,6 +1359,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_NV61M : descr ="Y/VU 4:2:2 (N-C)" ;break ;case V4L2_PIX_FMT_NV12MT : descr ="Y/UV 4:2:0 (64x32 MB, N-C)" ;break ;case V4L2_PIX_FMT_NV12MT_16X16 : descr ="Y/UV 4:2:0 (16x16 MB, N-C)" ;break ; +case V4L2_PIX_FMT_P012M : descr ="12-bit Y/UV 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YUV420M : descr ="Planar YUV 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YVU420M : descr ="Planar YVU 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YUV422M : descr ="Planar YUV 4:2:2 (N-C)" ;break ;include/uapi/linux/videodev2.h +0
-0@@ -626,12 +626,14 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')/* 24 Y/CbCr 4:4:4 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 636
Quoted 10 lines
include/uapi/linux/videodev2.h +2
-0#define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2')/* 24 Y/CrCb 4:4:4 */ #define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0')/* 24 Y/CbCr 4:2:0 10-bit per component */ +#define V4L2_PIX_FMT_P012 v4l2_fourcc('P', '0', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */ /* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2')/* 12 Y/CbCr 4:2:0 */ #define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1')/* 21 Y/CrCb 4:2:0 */ #define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6')/* 16 Y/CbCr 4:2:2 */ #define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1')/* 16 Y/CrCb 4:2:2 */ +#define V4L2_PIX_FMT_P012M v4l2_fourcc('P', 'M', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */
The name of the V4L2_PIX_FMT_ defines in this series are hard to decode.
In this case is it derived from V4L2_PIX_FMT_P010, which really should have been named differently, but it's too late now :-(
So I guess we'll stick with this naming, but it's not obvious what 'P012' means without referring to documentation.
Oh well.
Regards,
Hans
Quoted 3 lines
include/uapi/linux/videodev2.h +0
-0/* three planes - Y Cb, Cr */ #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9')/* 9 YUV 4:1:0 */
RE: [EXT] Re: [PATCH 01/10] media: Add P012 and P012M video format
Quoted 251 lines
From: Hans Verkuil <[email protected]>
Sent: 2023年1月27日 22:32
To: Ming Qian <[email protected]>; [email protected]; Mirela Rabulea (OSS) <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; X.H. Bao <[email protected]>; dl-linux-imx <linux- [email protected]>; [email protected]; [email protected]; [email protected]; [email protected]
Subject: [EXT] Re: [PATCH 01/10] media: Add P012 and P012M video formatCaution: EXT Email
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst All components are stored with the same number
Quoted 21 lines · Ming Qian
P012 is a YUV format with 12-bits per component with interleaved UV, like NV12, expanded to 16 bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
And P012M has two non contiguous planes.Signed-off-by Ming Qian <[email protected]>--- .../media/v4l/pixfmt-yuv-planar.rst | 94 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 2 + drivers/media/v4l2-core/v4l2-ioctl.c | 2 + include/uapi/linux/videodev2.h | 2 + 4 files changed, 100 insertions(+)diff --git
a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rstb/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rstindexf1d5bb7b806d..aa37c3de8808100644Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +0
-0@@ -123,6 +123,20 @@ All components are stored with the same numberof bits per component.
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst Data in the 10 high bits, zeros in the 6 low bits,
Quoted 21 lines
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +14
-0- Cb, Cr - Yes - 4x4 tiles + * - V4L2_PIX_FMT_P012 + - 'P012' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear + * - V4L2_PIX_FMT_P012M + - 'PM12' + - 12 + - 4:2:0 + - Cb, Cr + - Yes + - Linear * - V4L2_PIX_FMT_NV16 - 'NV16' - 8@@ -586,6 +600,86 @@ Data in the 10 high bits, zeros in the 6 low bits,arranged in little endian ord
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst Data in the 10 high bits, zeros in the 6 low bits, arranged in little endian ord
Quoted 11 lines
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +8
-0- Cb\ :sub:`11` - Cr\ :sub:`11` +.. _V4L2-PIX-FMT-P012: +.. _V4L2-PIX-FMT-P012M: + +P012 and P012M +-------------- + +P012 is like NV12 with 12 bits per component, expanded to 16 bits. +Data in the 12 high bits, zeros in the 4 low bits, arranged in little endianorder.
drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info
Quoted 81 lines
Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst +72
-0+ +.. flat-table:: Sample 4x4 P012 Image + :header-rows: 0 + :stub-columns: 0 + + * - start + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - start + 32: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start + 40: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + +.. flat-table:: Sample 4x4 P012M Image + :header-rows: 0 + :stub-columns: 0 + + * - start0 + 0: + - Y'\ :sub:`00` + - Y'\ :sub:`01` + - Y'\ :sub:`02` + - Y'\ :sub:`03` + * - start0 + 8: + - Y'\ :sub:`10` + - Y'\ :sub:`11` + - Y'\ :sub:`12` + - Y'\ :sub:`13` + * - start0 + 16: + - Y'\ :sub:`20` + - Y'\ :sub:`21` + - Y'\ :sub:`22` + - Y'\ :sub:`23` + * - start0 + 24: + - Y'\ :sub:`30` + - Y'\ :sub:`31` + - Y'\ :sub:`32` + - Y'\ :sub:`33` + * - + * - start1 + 0: + - Cb\ :sub:`00` + - Cr\ :sub:`00` + - Cb\ :sub:`01` + - Cr\ :sub:`01` + * - start1 + 8: + - Cb\ :sub:`10` + - Cr\ :sub:`10` + - Cb\ :sub:`11` + - Cr\ :sub:`11` + Fully Planar YUV Formats ========================drivers/media/v4l2-core/v4l2-common.c +0
-0@@ -267,6 +267,7 @@ const struct v4l2_format_info*v4l2_format_info(u32 format)
drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 267
Quoted 1 line
drivers/media/v4l2-core/v4l2-common.c +0
-0{ .format = V4L2_PIX_FMT_NV24, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 },drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 268
Quoted 1 line
drivers/media/v4l2-core/v4l2-common.c +0
-0{ .format = V4L2_PIX_FMT_NV42, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 1, .vdiv = 1 },drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 269
Quoted 1 line
drivers/media/v4l2-core/v4l2-common.c +0
-0{ .format = V4L2_PIX_FMT_P010, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 },drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 270
Quoted 1 line
drivers/media/v4l2-core/v4l2-common.c +1
-0+ { .format = V4L2_PIX_FMT_P012, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 },drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 271
Quoted 2 lines
drivers/media/v4l2-core/v4l2-common.c +0
-0{ .format = V4L2_PIX_FMT_YUV410, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 4 },drivers/media/v4l2-core/v4l2-common.c const struct v4l2_format_info · line 273
Quoted 2 lines
drivers/media/v4l2-core/v4l2-common.c +0
-0{ .format = V4L2_PIX_FMT_YVU410, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1,0 }, .hdiv = 4, .vdiv = 4 }, @@ -292,6 +293,7 @@ const struct
v4l2_format_info*v4l2_format_info(u32 format)Quoted 1 line
{ .format = V4L2_PIX_FMT_NV21M, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 },Quoted 1 line
{ .format = V4L2_PIX_FMT_NV16M, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 },Quoted 1 line
{ .format = V4L2_PIX_FMT_NV61M, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 },Quoted 1 line
+ { .format =
V4L2_PIX_FMT_P012M, .pixel_enc =
V4L2_PIXEL_ENC_YUV, .mem_planes = 2, .comp_planes = 2, .bpp = { 2, 4, 0, 0 }, .hdiv = 2, .vdiv = 2 },Quoted 3 lines
/* Bayer RGB formats */
{ .format =V4L2_PIX_FMT_SBGGR8, .pixel_enc =
V4L2_PIXEL_ENC_BAYER, .mem_planes = 1, .comp_planes = 1, .bpp = { 1, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 },drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc
Quoted 6 lines
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0@@ -1348,6 +1348,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc*fmt)
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
Quoted 5 lines
drivers/media/v4l2-core/v4l2-ioctl.c +1
-0case V4L2_PIX_FMT_NV24 : descr ="Y/UV 4:4:4" ;break ;case V4L2_PIX_FMT_NV42 : descr ="Y/VU 4:4:4" ;break ;case V4L2_PIX_FMT_P010 : descr ="10-bit Y/UV 4:2:0" ;break ; +case V4L2_PIX_FMT_P012 : descr ="12-bit Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV12_4L4 : descr ="Y/UV 4:2:0 (4x4 Linear)" ;break;
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc · line 1353
Quoted 1 line
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0case V4L2_PIX_FMT_NV12_16L16 : descr ="Y/UV 4:2:0 (16x16 Linear)" ;break;
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc · line 1354
Quoted 1 line
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0case V4L2_PIX_FMT_NV12_32L32 : descr ="Y/UV 4:2:0 (32x32 Linear)" ;break;
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc
Quoted 1 line
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0@@ -1358,6 +1359,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc*fmt)
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc · line 1360
Quoted 2 lines
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0case V4L2_PIX_FMT_NV61M : descr ="Y/VU 4:2:2 (N-C)" ;break ;case V4L2_PIX_FMT_NV12MT : descr ="Y/UV 4:2:0 (64x32 MB, N-C)" ;break;
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc · line 1364
Quoted 4 lines
drivers/media/v4l2-core/v4l2-ioctl.c +1
-0case V4L2_PIX_FMT_NV12MT_16X16: descr = "Y/UV 4:2:0 (16x16 MB, N-C)"; break; +case V4L2_PIX_FMT_P012M : descr ="12-bit Y/UV 4:2:0 (N-C)" ;break ;case V4L2_PIX_FMT_YUV420M : descr ="Planar YUV 4:2:0 (N-C)" ;break;
drivers/media/v4l2-core/v4l2-ioctl.c static void v4l_fill_fmtdesc(struct v4l2_fmtdesc · line 1365
Quoted 1 line
drivers/media/v4l2-core/v4l2-ioctl.c +0
-0case V4L2_PIX_FMT_YVU420M : descr ="Planar YVU 4:2:0 (N-C)" ;break;
Quoted 1 line
case V4L2_PIX_FMT_YUV422M: descr = "Planar YUV 4:2:2 (N-C)";break;
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 626
Quoted 7 lines
(quoted diff) +0
-0
b/include/uapi/linux/videodev2.hindex1befd181a4cc..5448aa3b7858100644include/uapi/linux/videodev2.h +0
-0@@ -626,12 +626,14 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')/* 24 Y/CbCr 4:4:4 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 627
Quoted 1 line
include/uapi/linux/videodev2.h +0
-0#define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2')/* 24 Y/CrCb 4:4:4 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 628
Quoted 1 line
include/uapi/linux/videodev2.h +0
-0#define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0')/* 24 Y/CbCr 4:2:0 10-bit per component */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 629
Quoted 1 line
include/uapi/linux/videodev2.h +1
-0+#define V4L2_PIX_FMT_P012 v4l2_fourcc('P', '0', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 631
Quoted 3 lines
include/uapi/linux/videodev2.h +0
-0/* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2')/* 12 Y/CbCr 4:2:0 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 632
Quoted 1 line
include/uapi/linux/videodev2.h +0
-0#define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1')/* 21 Y/CrCb 4:2:0 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 633
Quoted 1 line
include/uapi/linux/videodev2.h +0
-0#define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6')/* 16 Y/CbCr 4:2:2 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 634
Quoted 1 line
include/uapi/linux/videodev2.h +0
-0#define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1')/* 16 Y/CrCb 4:2:2 */
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 635
Quoted 1 line
include/uapi/linux/videodev2.h +1
-0+#define V4L2_PIX_FMT_P012M v4l2_fourcc('P', 'M', '1', '2')/* 24 Y/CbCr 4:2:0 12-bit per component */
The name of the
V4L2_PIX_FMT_defines in this series are hard to decode.In this case is it derived from
V4L2_PIX_FMT_P010, which really should have been named differently, but it's too late now :-(
Quoted 8 lines
So I guess we'll stick with this naming, but it's not obvious what 'P012' means without referring to documentation.
Oh well.
Regards,
Hans
Hi Hans,
I'll update the format name, as you know, the P012 is following the P010, as they are almost the same, and the Y212 comes from gstreamer (GST_VIDEO_FORMAT_Y212_LE), then I did some naming like that. I'll correct them in v2 patch.
Ming
Quoted 5 lines
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 637
Quoted 4 lines
include/uapi/linux/videodev2.h +0
-0/* three planes - Y Cb, Cr */ #define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9')/* 9 YUV 4:1:0 */
Re: [EXT] Re: [PATCH 01/10] media: Add P012 and P012M video format
Le lundi 30 janvier 2023 à 08:15 +0000, Ming Qian a écrit :
Quoted 49 lines
Quoted 49 lines
Quoted 8 lines
(quoted diff) +0
-0
b/include/uapi/linux/videodev2.hindex1befd181a4cc..5448aa3b7858100644include/uapi/linux/videodev2.h +0
-0@@ -626,12 +626,14 @@ struct v4l2_pix_format { #define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4') /* 24Y/CbCr
4:4:4 */
Quoted 2 lines
#define V4L2_PIX_FMT_NV42
v4l2_fourcc('N', 'V', '4', '2')/* 24 Y/CrCb4:4:4 */
Quoted 2 lines
#define V4L2_PIX_FMT_P010
v4l2_fourcc('P', '0', '1', '0')/* 24 Y/CbCr4:2:0 10-bit per component */
Quoted 2 lines
+#define V4L2_PIX_FMT_P012
v4l2_fourcc('P', '0', '1', '2')/* 24 Y/CbCr4:2:0 12-bit per component */
Quoted 4 lines
/* two non contiguous planes - one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12M
v4l2_fourcc('N', 'M', '1', '2')/* 12 Y/CbCr4:2:0 */
Quoted 2 lines
#define V4L2_PIX_FMT_NV21M
v4l2_fourcc('N', 'M', '2', '1')/* 21 Y/CrCb4:2:0 */
Quoted 2 lines
#define V4L2_PIX_FMT_NV16M
v4l2_fourcc('N', 'M', '1', '6')/* 16 Y/CbCr4:2:2 */
Quoted 2 lines
#define V4L2_PIX_FMT_NV61M
v4l2_fourcc('N', 'M', '6', '1')/* 16 Y/CrCb4:2:2 */
Quoted 2 lines
+#define V4L2_PIX_FMT_P012M
v4l2_fourcc('P', 'M', '1', '2')/* 24 Y/CbCr4:2:0 12-bit per component */
The name of the
V4L2_PIX_FMT_defines in this series are hard to decode.In this case is it derived from
V4L2_PIX_FMT_P010, which really should have been named differently, but it's too late now :-(So I guess we'll stick with this naming, but it's not obvious what 'P012' means
without referring to documentation.Oh well.
Regards,
Quoted 7 lines
Quoted 1 line
Hans
Hi Hans,
I'll update the format name, as you know, the P012 is following the P010, as they are almost the same, and the Y212 comes from gstreamer (GST_VIDEO_FORMAT_Y212_LE), then I did some naming like that. I'll correct them in v2 patch.
I agree these naming are not obvious. In GStreamer, appart from the _LE part, we've had this historical tendency to just stick with Microsoft names when they exist. Though Microsoft only define 10 and 16bits (P010/P016, Y210 and Y216). In this case, the 12 has is derived from it.
https://learn.microsoft.com/en-us/windows/win32/medfound/10-bit-and-16-bit-yuv-video-formats
While P010 is very commonly seen, I don't know if Y210/Y212/Y216 is a great idea. It is a 16bit component width version of YUYV, which as we know exist in all sort of swizzling. So the Microsoft name will be hard to extend to other component order. My argument of keeping it this way though is that it matches the other copy of pixel formats definition that exist in Linux, which is drm_fourcc.h.
Nicolas
RE: [EXT] Re: [PATCH 01/10] media: Add P012 and P012M video format
Quoted 87 lines
From: Nicolas Dufresne <[email protected]>
Sent: 2023年2月10日 23:08
To: Ming Qian <[email protected]>; Hans Verkuil <hverkuil- [email protected]>; [email protected]; Mirela Rabulea (OSS) <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; X.H. Bao <[email protected]>; dl-linux-imx <linux- [email protected]>; [email protected]; [email protected]; [email protected]; [email protected]
Subject: Re: [EXT] Re: [PATCH 01/10] media: Add P012 and P012M video formatCaution: EXT Email
Quoted 49 lines · Ming Qian
Quoted 49 lines
Quoted 8 lines
(quoted diff) +0
-0
b/include/uapi/linux/videodev2.hindex1befd181a4cc..5448aa3b7858100644include/uapi/linux/videodev2.h +0
-0@@ -626,12 +626,14 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4')/* 24 Y/CbCr
4:4:4 */
Quoted 2 lines
#define
V4L2_PIX_FMT_NV42v4l2_fourcc('N', 'V', '4', '2')/* 24
Y/CrCb4:4:4 */
Quoted 2 lines
#define
V4L2_PIX_FMT_P010v4l2_fourcc('P', '0', '1', '0')/* 24
Y/CbCr4:2:0 10-bit per component */
Quoted 2 lines
+#define
V4L2_PIX_FMT_P012v4l2_fourcc('P', '0', '1', '2')/* 24
Y/CbCr4:2:0 12-bit per component */
Quoted 4 lines
/* two non contiguous planes - one Y, one Cr + Cb interleaved */
#defineV4L2_PIX_FMT_NV12Mv4l2_fourcc('N', 'M', '1', '2')/* 12
Y/CbCr4:2:0 */
Quoted 2 lines
#define
V4L2_PIX_FMT_NV21Mv4l2_fourcc('N', 'M', '2', '1')/* 21
Y/CrCb4:2:0 */
Quoted 2 lines
#define
V4L2_PIX_FMT_NV16Mv4l2_fourcc('N', 'M', '1', '6')/* 16
Y/CbCr4:2:2 */
Quoted 2 lines
#define
V4L2_PIX_FMT_NV61Mv4l2_fourcc('N', 'M', '6', '1')/* 16
Y/CrCb4:2:2 */
Quoted 2 lines
+#define
V4L2_PIX_FMT_P012Mv4l2_fourcc('P', 'M', '1', '2')/* 24
Y/CbCr4:2:0 12-bit per component */
The name of the
V4L2_PIX_FMT_defines in this series are hard to decode.In this case is it derived from
V4L2_PIX_FMT_P010, which really should have been named differently, but it's too late now :-(So I guess we'll stick with this naming, but it's not obvious what 'P012' means
without referring to documentation.Oh well.
Regards,
Quoted 7 lines
Quoted 1 line
Hans
Hi Hans,
I'll update the format name, as you know, the P012 is following
the P010, as they are almost the same, and the Y212 comes from gstreamer (GST_VIDEO_FORMAT_Y212_LE), then I did some naming like that.
I'll correct them in v2 patch.I agree these naming are not obvious. In GStreamer, appart from the
_LEpart, we've had this historical tendency to just stick with Microsoft names when they exist. Though Microsoft only define 10 and 16bits (P010/P016, Y210 and Y216). In this case, the 12 has is derived from it.https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.
microsoft.com%2Fen-us%2Fwindows%2Fwin32%2Fmedfound%2F10-bit-and- 16-bit-yuv-video- formats&data=05%7C01%7Cming.qian%40nxp.com%7C4946d98325684a554d a408db0b78aa3a%7C686ea1d3bc2b4c6fa92cd99c5c301635%7C0%7C0%7C638 116385106384698%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiL CJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&sd ata=5Z6m1WVxmf6WYXRDZiUuKT9wjx7cOtt%2BRMHzlyT3n5E%3D&reserved= 0
Quoted 8 lines
While P010 is very commonly seen, I don't know if Y210/Y212/Y216 is a great idea. It is a 16bit component width version of YUYV, which as we know exist in all sort of swizzling. So the Microsoft name will be hard to extend to other component order. My argument of keeping it this way though is that it matches the other copy of pixel formats definition that exist in Linux, which is
drm_fourcc.h.Nicolas
Hi Nicolas,
Thanks for your comments, I agree with you that the name like Y212 is hard to understand,
I'll correct them to YUYV64_12, YUV48_12, BGR48_12 and ABGR64_12, but for P012, I prefer to keep it.
Ming
PATCH 2/10 media: Add Y012 video format
In reply to Ming QianY012 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.
--- .../userspace-api/media/v4l/pixfmt-yuv-luma.rst | 11 +++++++++++ drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 3 files changed, 13 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-yuv-luma.rst +11 -0
@@ -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``
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1303,6 +1303,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 ;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 ;
include/uapi/linux/videodev2.h +1 -0
@@ -583,6 +583,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 */
Signature · 1 line
2.38.1
PATCH 3/10 media: Add Y212 video format
In reply to Ming QianY212 is a YUV format with 12-bits per component like YUYV, expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
--- .../media/v4l/pixfmt-packed-yuv.rst | 42 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 45 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +42 -0
@@ -341,6 +341,48 @@ components horizontally by 2, storing 2 pixels in 4 bytes. \normalsize +The next lists the packed YUV 4:2:2 formats with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. storing 2 pixels in 8 bytes. + +.. raw:: latex + + \footnotesize + +.. tabularcolumns:: |p{3.4cm}|p{1.2cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}| + +.. flat-table:: Packed YUV 4:2:2 Formats (more than 8bpc) + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + - Byte 9-8 + - Byte 11-10 + - Byte 13-12 + - Byte 15-14 + * .. _V4L2-PIX-FMT-Y212: + + - ``V4L2_PIX_FMT_Y212`` + - 'Y212' + + - Y'\ :sub:`0` + - Cb\ :sub:`0` + - Y'\ :sub:`1` + - Cr\ :sub:`0` + - Y'\ :sub:`2` + - Cb\ :sub:`2` + - Y'\ :sub:`3` + - Cr\ :sub:`2` + +.. raw:: latex + + \normalsize + **Color Sample Location:** Chroma samples are :ref:`interstitially sited<yuv-chroma-centered>` horizontally.
drivers/media/v4l2-core/v4l2-common.c +1 -0
@@ -258,6 +258,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_YVYU, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_UYVY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_VYUY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_Y212, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, /* YUV planar formats */ { .format = V4L2_PIX_FMT_NV12, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 },
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1342,6 +1342,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_YUV420 : descr ="Planar YUV 4:2:0" ;break ;case V4L2_PIX_FMT_HI240 : descr ="8-bit Dithered RGB (BTTV)" ;break ;case V4L2_PIX_FMT_M420 : descr ="YUV 4:2:0 (M420)" ;break ; +case V4L2_PIX_FMT_Y212 : descr ="12-bit Depth YUYV 4:2:2" ;break ;case V4L2_PIX_FMT_NV12 : descr ="Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV21 : descr ="Y/VU 4:2:0" ;break ;case V4L2_PIX_FMT_NV16 : descr ="Y/UV 4:2:2" ;break ;
include/uapi/linux/videodev2.h +1 -0
@@ -618,6 +618,7 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_YUVA32 v4l2_fourcc('Y', 'U', 'V', 'A')/* 32 YUVA-8-8-8-8 */ #define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')/* 32 YUVX-8-8-8-8 */ #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')/* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */ +#define V4L2_PIX_FMT_Y212 v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */ /* two planes -- one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')/* 12 Y/CbCr 4:2:0 */
Signature · 1 line
2.38.1
Re: [PATCH 03/10] media: Add Y212 video format
Quoted 95 lines · Ming Qian
Y212 is a YUV format with 12-bits per component like YUYV, 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 <[email protected]>--- .../media/v4l/pixfmt-packed-yuv.rst | 42 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 45 insertions(+)Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +42
-0@@ -341,6 +341,48 @@ components horizontally by 2, storing 2 pixels in 4 bytes. \normalsize +The next lists the packed YUV 4:2:2 formats with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. storing 2 pixels in 8 bytes. + +.. raw:: latex + + \footnotesize + +.. tabularcolumns:: |p{3.4cm}|p{1.2cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}|p{0.8cm}| + +.. flat-table:: Packed YUV 4:2:2 Formats (more than 8bpc) + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + - Byte 9-8 + - Byte 11-10 + - Byte 13-12 + - Byte 15-14 + * .. _V4L2-PIX-FMT-Y212: + + - ``V4L2_PIX_FMT_Y212`` + - 'Y212' + + - Y'\ :sub:`0` + - Cb\ :sub:`0` + - Y'\ :sub:`1` + - Cr\ :sub:`0` + - Y'\ :sub:`2` + - Cb\ :sub:`2` + - Y'\ :sub:`3` + - Cr\ :sub:`2` + +.. raw:: latex + + \normalsize + **Color Sample Location:** Chroma samples are :ref:`interstitially sited<yuv-chroma-centered>` horizontally.drivers/media/v4l2-core/v4l2-common.c +1
-0@@ -258,6 +258,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_YVYU, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_UYVY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_VYUY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_Y212, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, /* YUV planar formats */ { .format = V4L2_PIX_FMT_NV12, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 },drivers/media/v4l2-core/v4l2-ioctl.c +1
-0@@ -1342,6 +1342,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_YUV420 : descr ="Planar YUV 4:2:0" ;break ;case V4L2_PIX_FMT_HI240 : descr ="8-bit Dithered RGB (BTTV)" ;break ;case V4L2_PIX_FMT_M420 : descr ="YUV 4:2:0 (M420)" ;break ; +case V4L2_PIX_FMT_Y212 : descr ="12-bit Depth YUYV 4:2:2" ;break ;case V4L2_PIX_FMT_NV12 : descr ="Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV21 : descr ="Y/VU 4:2:0" ;break ;case V4L2_PIX_FMT_NV16 : descr ="Y/UV 4:2:2" ;break ;include/uapi/linux/videodev2.h +0
-0
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 621
Quoted 4 lines
include/uapi/linux/videodev2.h +1
-0@@ -618,6 +618,7 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_YUVA32 v4l2_fourcc('Y', 'U', 'V', 'A')/* 32 YUVA-8-8-8-8 */ #define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')/* 32 YUVX-8-8-8-8 */ #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')/* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */ +#define V4L2_PIX_FMT_Y212 v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */
This definitely needs to be renamed to prevent repeating the 'P010' mistake.
It's a YUYV format, so perhaps: _YUYV_12?
You definitely need to have 'YUYV' in the name in order to deal with different YUV orders.
Regards,
Hans
Quoted 3 lines
include/uapi/linux/videodev2.h +0
-0/* two planes -- one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')/* 12 Y/CbCr 4:2:0 */
Re: [PATCH 03/10] media: Add Y212 video format
Hi Hans, Ming,
Le vendredi 27 janvier 2023 à 15:37 +0100, Hans Verkuil a écrit :
Quoted 7 lines · Ming Qian
Quoted 6 lines
Y212 is a YUV format with 12-bits per component like YUYV, expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
[...]
Quoted 8 lines
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 621
Quoted 5 lines
include/uapi/linux/videodev2.h +1
-0@@ -618,6 +618,7 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_YUVA32 v4l2_fourcc('Y', 'U', 'V', 'A')/* 32 YUVA-8-8-8-8 */ #define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')/* 32 YUVX-8-8-8-8 */ #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')/* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */ +#define V4L2_PIX_FMT_Y212 v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */ This definitely needs to be renamed to prevent repeating the 'P010' mistake.
Quoted 4 lines
It's a YUYV format, so perhaps:
_YUYV_12?You definitely need to have 'YUYV' in the name in order to deal with different YUV orders.
Hans, it seems you already accepted this exact same format from Tomi Valkeinen <[email protected]> / [PATCH v3 2/7] media:
Add Y210, Y212 and Y216 formats.
Tomi omitted to update v4l2-common.c file. Ming, do you mind keeping this part of your patch (adding Y210/Y216 support), this way we'd get that properly implemented.
Nicolas
p.s. We can alternatively change our mind as this is not final yet I think.
[...]
RE: [EXT] Re: [PATCH 03/10] media: Add Y212 video format
Hi Nicolas,
Quoted 48 lines
-----Original Message-----
From: Nicolas Dufresne <[email protected]>
Sent: 2023年2月22日 23:31
To: Hans Verkuil <[email protected]>; Ming Qian <[email protected]>; [email protected]; Mirela Rabulea (OSS) <[email protected]>
Cc: [email protected]; [email protected]; [email protected]; [email protected]; X.H. Bao <[email protected]>; dl-linux-imx <linux- [email protected]>; [email protected]; [email protected]; [email protected]; [email protected]
Subject: [EXT] Re: [PATCH 03/10] media: Add Y212 video formatCaution: EXT Email
Hi Hans, Ming,
Quoted 7 lines · Hans Verkuil
Quoted 6 lines · Ming Qian
Y212 is a YUV format with 12-bits per component like YUYV, expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.[...]
Quoted 3 lines
Quoted 3 lines
(quoted diff) +0
-0@@ -618,6 +618,7 @@ struct v4l2_pix_format { #define
V4L2_PIX_FMT_YUVA32v4l2_fourcc('Y', 'U', 'V', 'A')/* 32 YUVA-8-8-8-8 */ #defineV4L2_PIX_FMT_YUVX32v4l2_fourcc('Y', 'U', 'V','X') /* 32 YUVX-8-8-8-8 */
Quoted 1 line
Quoted 1 line
#define
V4L2_PIX_FMT_M420v4l2_fourcc('M', '4', '2', '0')/* 12 YUV4:2:0 2 lines y, 1 line uv interleaved */
Quoted 1 line
Quoted 1 line
+#define
V4L2_PIX_FMT_Y212v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */
Quoted 7 lines
This definitely needs to be renamed to prevent repeating the 'P010' mistake.
It's a YUYV format, so perhaps:
_YUYV_12?You definitely need to have 'YUYV' in the name in order to deal with different YUV orders.
Hans, it seems you already accepted this exact same format from Tomi Valkeinen <[email protected]> / [PATCH v3 2/7] media:
Add Y210, Y212 and Y216 formats.
Quoted 8 lines
Tomi omitted to update
v4l2-common.cfile. Ming, do you mind keeping this part of your patch (adding Y210/Y216 support), this way we'd get that properly implemented.Nicolas
p.s. We can alternatively change our mind as this is not final yet I think.
I saw this patch too, and I planed to make a v4 patch to apply the Y212 format directly. And I'm glad to keep the part that add the new defined format in v4l2-common.c
Ming
Quoted 1 line
[...]
PATCH 4/10 media: Add Y312 video format
In reply to Ming QianY312 is a YUV format with 12-bits per component like YUV24, expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
--- .../media/v4l/pixfmt-packed-yuv.rst | 28 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 31 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +28 -0
@@ -257,6 +257,34 @@ the second byte and Y'\ :sub:`7-0` in the third byte. - The padding bits contain undefined values that must be ignored by all applications and drivers. +The next lists the packed YUV 4:4:4 formats with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. storing 1 pixels in 6 bytes. + +.. flat-table:: Packed YUV 4:4:4 Image Formats (more than 8bpc) + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + - Byte 9-8 + - Byte 11-10 + + * .. _V4L2-PIX-FMT-Y312: + + - ``V4L2_PIX_FMT_Y312`` + - 'Y312' + + - Y'\ :sub:`0` + - Cb\ :sub:`0` + - Cr\ :sub:`0` + - Y'\ :sub:`1` + - Cb\ :sub:`1` + - Cr\ :sub:`1` 4:2:2 Subsampling =================
drivers/media/v4l2-core/v4l2-common.c +1 -0
@@ -259,6 +259,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_UYVY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_VYUY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_Y212, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_Y312, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV planar formats */ { .format = V4L2_PIX_FMT_NV12, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 },
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1343,6 +1343,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_HI240 : descr ="8-bit Dithered RGB (BTTV)" ;break ;case V4L2_PIX_FMT_M420 : descr ="YUV 4:2:0 (M420)" ;break ;case V4L2_PIX_FMT_Y212 : descr ="12-bit Depth YUYV 4:2:2" ;break ; +case V4L2_PIX_FMT_Y312 : descr ="12-bit Depth YUV 4:4:4" ;break ;case V4L2_PIX_FMT_NV12 : descr ="Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV21 : descr ="Y/VU 4:2:0" ;break ;case V4L2_PIX_FMT_NV16 : descr ="Y/UV 4:2:2" ;break ;
include/uapi/linux/videodev2.h +1 -0
@@ -619,6 +619,7 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')/* 32 YUVX-8-8-8-8 */ #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')/* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */ #define V4L2_PIX_FMT_Y212 v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */ +#define V4L2_PIX_FMT_Y312 v4l2_fourcc('Y', '3', '1', '2')/* 48 YUV 4:4:4 12-bit per component */ /* two planes -- one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')/* 12 Y/CbCr 4:2:0 */
Signature · 1 line
2.38.1
Re: [PATCH 04/10] media: Add Y312 video format
Quoted 81 lines · Ming Qian
Y312 is a YUV format with 12-bits per component like YUV24, 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 <[email protected]>--- .../media/v4l/pixfmt-packed-yuv.rst | 28 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 31 insertions(+)Documentation/userspace-api/media/v4l/pixfmt-packed-yuv.rst +28
-0@@ -257,6 +257,34 @@ the second byte and Y'\ :sub:`7-0` in the third byte. - The padding bits contain undefined values that must be ignored by all applications and drivers. +The next lists the packed YUV 4:4:4 formats with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. storing 1 pixels in 6 bytes. + +.. flat-table:: Packed YUV 4:4:4 Image Formats (more than 8bpc) + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + - Byte 9-8 + - Byte 11-10 + + * .. _V4L2-PIX-FMT-Y312: + + - ``V4L2_PIX_FMT_Y312`` + - 'Y312' + + - Y'\ :sub:`0` + - Cb\ :sub:`0` + - Cr\ :sub:`0` + - Y'\ :sub:`1` + - Cb\ :sub:`1` + - Cr\ :sub:`1` 4:2:2 Subsampling =================drivers/media/v4l2-core/v4l2-common.c +1
-0@@ -259,6 +259,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_UYVY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_VYUY, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, { .format = V4L2_PIX_FMT_Y212, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_Y312, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV planar formats */ { .format = V4L2_PIX_FMT_NV12, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 },drivers/media/v4l2-core/v4l2-ioctl.c +1
-0@@ -1343,6 +1343,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_HI240 : descr ="8-bit Dithered RGB (BTTV)" ;break ;case V4L2_PIX_FMT_M420 : descr ="YUV 4:2:0 (M420)" ;break ;case V4L2_PIX_FMT_Y212 : descr ="12-bit Depth YUYV 4:2:2" ;break ; +case V4L2_PIX_FMT_Y312 : descr ="12-bit Depth YUV 4:4:4" ;break ;case V4L2_PIX_FMT_NV12 : descr ="Y/UV 4:2:0" ;break ;case V4L2_PIX_FMT_NV21 : descr ="Y/VU 4:2:0" ;break ;case V4L2_PIX_FMT_NV16 : descr ="Y/UV 4:2:2" ;break ;include/uapi/linux/videodev2.h +0
-0
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 622
Quoted 4 lines
include/uapi/linux/videodev2.h +1
-0@@ -619,6 +619,7 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_YUVX32 v4l2_fourcc('Y', 'U', 'V', 'X')/* 32 YUVX-8-8-8-8 */ #define V4L2_PIX_FMT_M420 v4l2_fourcc('M', '4', '2', '0')/* 12 YUV 4:2:0 2 lines y, 1 line uv interleaved */ #define V4L2_PIX_FMT_Y212 v4l2_fourcc('Y', '2', '1', '2')/* 32 YUYV 12-bit per component */ +#define V4L2_PIX_FMT_Y312 v4l2_fourcc('Y', '3', '1', '2')/* 48 YUV 4:4:4 12-bit per component */
YUV24_12 would work, I think. Y312 suggests a greyscale format, so that's definitely wrong.
Regards,
Hans
Quoted 3 lines
include/uapi/linux/videodev2.h +0
-0/* two planes -- one Y, one Cr + Cb interleaved */ #define V4L2_PIX_FMT_NV12 v4l2_fourcc('N', 'V', '1', '2')/* 12 Y/CbCr 4:2:0 */
PATCH 5/10 media: Add B312 video format
In reply to Ming QianB312 is a reversed RGB format with 12 bits per component like BGR24, expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
--- .../userspace-api/media/v4l/pixfmt-rgb.rst | 35 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 3 ++ 4 files changed, 40 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +35 -0
@@ -763,6 +763,41 @@ nomenclature that instead use the order of components as seen in a 24- or \normalsize +More Than 8 Bits Per Component +============================== + +These formats store an RGB triplet in six or eighth bytes, with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. + +.. raw:: latex + + \small + +.. flat-table:: RGB Formats With More Than 8 Bits Per Component + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + * .. _V4L2-PIX-FMT-B312: + + - ``V4L2_PIX_FMT_B312`` + - 'B312' + + - B\ :sub:`15-4` + - G\ :sub:`15-4` + - R\ :sub:`15-4` + - + +.. raw:: latex + + \normalsize + Deprecated RGB Formats ======================
drivers/media/v4l2-core/v4l2-common.c +1 -0
@@ -252,6 +252,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_RGB565, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_RGB555, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_BGR666, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_B312, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV packed formats */ { .format = V4L2_PIX_FMT_YUYV, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 },
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1298,6 +1298,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_BGRX32 : descr ="32-bit XBGR 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBA32 : descr ="32-bit RGBA 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBX32 : descr ="32-bit RGBX 8-8-8-8" ;break ; +case V4L2_PIX_FMT_B312 : descr ="12-bit Depth BGR" ;break ;case V4L2_PIX_FMT_GREY : descr ="8-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y4 : descr ="4-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y6 : descr ="6-bit Greyscale" ;break ;
include/uapi/linux/videodev2.h +3 -0
@@ -577,6 +577,9 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_ARGB32 v4l2_fourcc('B', 'A', '2', '4')/* 32 ARGB-8-8-8-8 */ #define V4L2_PIX_FMT_XRGB32 v4l2_fourcc('B', 'X', '2', '4')/* 32 XRGB-8-8-8-8 */ +/* RGB formats (6 or 8 bytes per pixel) */ +#define V4L2_PIX_FMT_B312 v4l2_fourcc('B', '3', '1', '2')/* 48 BGR 12-bit per component */ +/* Grey formats */ #define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y')/* 8 Greyscale */ #define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ')/* 4 Greyscale */
Signature · 1 line
2.38.1
Re: [PATCH 05/10] media: Add B312 video format
Quoted 88 lines · Ming Qian
B312 is a reversed RGB format with 12 bits per component like BGR24, 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 <[email protected]>--- .../userspace-api/media/v4l/pixfmt-rgb.rst | 35 +++++++++++++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 3 ++ 4 files changed, 40 insertions(+)Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +35
-0@@ -763,6 +763,41 @@ nomenclature that instead use the order of components as seen in a 24- or \normalsize +More Than 8 Bits Per Component +============================== + +These formats store an RGB triplet in six or eighth bytes, with more than 8 bits per component. +expand the bits per component to 16 bits, data in the high bits, zeros in the low bits, +arranged in little endian order. + +.. raw:: latex + + \small + +.. flat-table:: RGB Formats With More Than 8 Bits Per Component + :header-rows: 1 + :stub-columns: 0 + + * - Identifier + - Code + - Byte 1-0 + - Byte 3-2 + - Byte 5-4 + - Byte 7-6 + * .. _V4L2-PIX-FMT-B312: + + - ``V4L2_PIX_FMT_B312`` + - 'B312' + + - B\ :sub:`15-4` + - G\ :sub:`15-4` + - R\ :sub:`15-4` + - + +.. raw:: latex + + \normalsize + Deprecated RGB Formats ======================drivers/media/v4l2-core/v4l2-common.c +1
-0@@ -252,6 +252,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_RGB565, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_RGB555, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_BGR666, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_B312, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV packed formats */ { .format = V4L2_PIX_FMT_YUYV, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 },drivers/media/v4l2-core/v4l2-ioctl.c +1
-0@@ -1298,6 +1298,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_BGRX32 : descr ="32-bit XBGR 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBA32 : descr ="32-bit RGBA 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBX32 : descr ="32-bit RGBX 8-8-8-8" ;break ; +case V4L2_PIX_FMT_B312 : descr ="12-bit Depth BGR" ;break ;case V4L2_PIX_FMT_GREY : descr ="8-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y4 : descr ="4-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y6 : descr ="6-bit Greyscale" ;break ;include/uapi/linux/videodev2.h +0
-0
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 581
Quoted 5 lines
include/uapi/linux/videodev2.h +2
-0@@ -577,6 +577,9 @@ struct v4l2_pix_format {#define V4L2_PIX_FMT_ARGB32 v4l2_fourcc('B', 'A', '2', '4')/* 32 ARGB-8-8-8-8 */ #define V4L2_PIX_FMT_XRGB32 v4l2_fourcc('B', 'X', '2', '4')/* 32 XRGB-8-8-8-8 */ +/* RGB formats (6 or 8 bytes per pixel) */ +#define V4L2_PIX_FMT_B312 v4l2_fourcc('B', '3', '1', '2')/* 48 BGR 12-bit per component */
BGR24_12
Regards,
Hans
Quoted 4 lines
include/uapi/linux/videodev2.h +1
-0+/* Grey formats */ #define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y')/* 8 Greyscale */ #define V4L2_PIX_FMT_Y4 v4l2_fourcc('Y', '0', '4', ' ')/* 4 Greyscale */
PATCH 6/10 media: Add B412 video format
In reply to Ming QianB412 is a reversed RGB format with alpha channel last, 12 bits per component like ABGR32,
expanded to 16bits.
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
--- Documentation/userspace-api/media/v4l/pixfmt-rgb.rst | 9 +++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 12 insertions(+)
Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +9 -0
@@ -793,6 +793,15 @@ arranged in little endian order. - G\ :sub:`15-4` - R\ :sub:`15-4` - + * .. _V4L2-PIX-FMT-B412: + + - ``V4L2_PIX_FMT_B412`` + - 'B412' + + - B\ :sub:`15-4` + - G\ :sub:`15-4` + - R\ :sub:`15-4` + - A\ :sub:`15-4` .. raw:: latex
drivers/media/v4l2-core/v4l2-common.c +1 -0
@@ -253,6 +253,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_RGB555, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_BGR666, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_B312, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_B412, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 8, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV packed formats */ { .format = V4L2_PIX_FMT_YUYV, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 },
drivers/media/v4l2-core/v4l2-ioctl.c +1 -0
@@ -1299,6 +1299,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_RGBA32 : descr ="32-bit RGBA 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBX32 : descr ="32-bit RGBX 8-8-8-8" ;break ;case V4L2_PIX_FMT_B312 : descr ="12-bit Depth BGR" ;break ; +case V4L2_PIX_FMT_B412 : descr ="12-bit Depth BGRA" ;break ;case V4L2_PIX_FMT_GREY : descr ="8-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y4 : descr ="4-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y6 : descr ="6-bit Greyscale" ;break ;
include/uapi/linux/videodev2.h +1 -0
@@ -579,6 +579,7 @@ struct v4l2_pix_format {/* RGB formats (6 or 8 bytes per pixel) */ #define V4L2_PIX_FMT_B312 v4l2_fourcc('B', '3', '1', '2')/* 48 BGR 12-bit per component */ +#define V4L2_PIX_FMT_B412 v4l2_fourcc('B', '4', '1', '2')/* 64 BGRA 12-bit per component */ /* Grey formats */ #define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y')/* 8 Greyscale */
Signature · 1 line
2.38.1
Re: [PATCH 06/10] media: Add B412 video format
Quoted 63 lines · Ming Qian
B412 is a reversed RGB format with alpha channel last, 12 bits per component like ABGR32,
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 <[email protected]>--- Documentation/userspace-api/media/v4l/pixfmt-rgb.rst | 9 +++++++++ drivers/media/v4l2-core/v4l2-common.c | 1 + drivers/media/v4l2-core/v4l2-ioctl.c | 1 + include/uapi/linux/videodev2.h | 1 + 4 files changed, 12 insertions(+)Documentation/userspace-api/media/v4l/pixfmt-rgb.rst +9
-0@@ -793,6 +793,15 @@ arranged in little endian order. - G\ :sub:`15-4` - R\ :sub:`15-4` - + * .. _V4L2-PIX-FMT-B412: + + - ``V4L2_PIX_FMT_B412`` + - 'B412' + + - B\ :sub:`15-4` + - G\ :sub:`15-4` + - R\ :sub:`15-4` + - A\ :sub:`15-4` .. raw:: latexdrivers/media/v4l2-core/v4l2-common.c +1
-0@@ -253,6 +253,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) { .format = V4L2_PIX_FMT_RGB555, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_BGR666, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 4, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, { .format = V4L2_PIX_FMT_B312, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 6, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, + { .format = V4L2_PIX_FMT_B412, .pixel_enc = V4L2_PIXEL_ENC_RGB, .mem_planes = 1, .comp_planes = 1, .bpp = { 8, 0, 0, 0 }, .hdiv = 1, .vdiv = 1 }, /* YUV packed formats */ { .format = V4L2_PIX_FMT_YUYV, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 1, .bpp = { 2, 0, 0, 0 }, .hdiv = 2, .vdiv = 1 },drivers/media/v4l2-core/v4l2-ioctl.c +1
-0@@ -1299,6 +1299,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)case V4L2_PIX_FMT_RGBA32 : descr ="32-bit RGBA 8-8-8-8" ;break ;case V4L2_PIX_FMT_RGBX32 : descr ="32-bit RGBX 8-8-8-8" ;break ;case V4L2_PIX_FMT_B312 : descr ="12-bit Depth BGR" ;break ; +case V4L2_PIX_FMT_B412 : descr ="12-bit Depth BGRA" ;break ;case V4L2_PIX_FMT_GREY : descr ="8-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y4 : descr ="4-bit Greyscale" ;break ;case V4L2_PIX_FMT_Y6 : descr ="6-bit Greyscale" ;break ;include/uapi/linux/videodev2.h +0
-0
include/uapi/linux/videodev2.h struct v4l2_pix_format { · line 582
Quoted 4 lines
include/uapi/linux/videodev2.h +1
-0@@ -579,6 +579,7 @@ struct v4l2_pix_format {/* RGB formats (6 or 8 bytes per pixel) */ #define V4L2_PIX_FMT_B312 v4l2_fourcc('B', '3', '1', '2')/* 48 BGR 12-bit per component */ +#define V4L2_PIX_FMT_B412 v4l2_fourcc('B', '4', '1', '2')/* 64 BGRA 12-bit per component */
This would be ABGR32_12, to correspond with the 8 bit ABGR32. Unfortunately, that define has a terrible mismatch with the actual component order (alpha comes last in memory, not first as the name suggests).
It would be nice to be able to fix this, but I think that would be even more confusing.
Regards,
Hans
Quoted 3 lines
include/uapi/linux/videodev2.h +0
-0/* Grey formats */ #define V4L2_PIX_FMT_GREY v4l2_fourcc('G', 'R', 'E', 'Y')/* 8 Greyscale */
PATCH 7/10 media: imx-jpeg: Refine the function mxc_jpeg_find_format
In reply to Ming Qianremove the unused parameter ctx
--- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +8 -9
@@ -420,8 +420,7 @@ static int enum_fmt(const struct mxc_jpeg_fmt *mxc_formats, int n,return 0 ; } -static const struct mxc_jpeg_fmt *mxc_jpeg_find_format (struct mxc_jpeg_ctx *ctx, -u32 pixelformat) +static const struct mxc_jpeg_fmt *mxc_jpeg_find_format (u32 pixelformat) {unsigned int k;
@@ -1562,7 +1561,7 @@ static int mxc_jpeg_parse(struct mxc_jpeg_ctx *ctx, struct vb2_buffer *vb)if (fourcc ==0 )return -EINVAL ; - jpeg_src_buf->fmt =mxc_jpeg_find_format (ctx, fourcc); + jpeg_src_buf->fmt =mxc_jpeg_find_format (fourcc); jpeg_src_buf->w = header.frame.width; jpeg_src_buf->h = header.frame.height; ctx->header_parsed = true;
@@ -1702,11 +1701,11 @@ static void mxc_jpeg_set_default_params(struct mxc_jpeg_ctx *ctx)int i;if (ctx->mxc_jpeg->mode ==MXC_JPEG_ENCODE ) { - out_q->fmt =mxc_jpeg_find_format (ctx,MXC_JPEG_DEFAULT_PFMT ); - cap_q->fmt =mxc_jpeg_find_format (ctx,V4L2_PIX_FMT_JPEG ); + out_q->fmt =mxc_jpeg_find_format (MXC_JPEG_DEFAULT_PFMT ); + cap_q->fmt =mxc_jpeg_find_format (V4L2_PIX_FMT_JPEG ); }else { - out_q->fmt =mxc_jpeg_find_format (ctx,V4L2_PIX_FMT_JPEG ); - cap_q->fmt =mxc_jpeg_find_format (ctx,MXC_JPEG_DEFAULT_PFMT ); + out_q->fmt =mxc_jpeg_find_format (V4L2_PIX_FMT_JPEG ); + cap_q->fmt =mxc_jpeg_find_format (MXC_JPEG_DEFAULT_PFMT ); }for (i =0 ; i <2 ; i++) {
@@ -1950,7 +1949,7 @@ static int mxc_jpeg_try_fmt(struct v4l2_format *f, pix_mp->height : MXC_JPEG_MAX_HEIGHT;int i; - fmt =mxc_jpeg_find_format (ctx, fourcc); + fmt =mxc_jpeg_find_format (fourcc);if (!fmt || fmt->flags !=mxc_jpeg_get_fmt_type (ctx, f->type)) { dev_warn(ctx->mxc_jpeg->dev, "Format not supported: %c%c%c%c, use the default.\n", (fourcc & 0xff),
@@ -1958,7 +1957,7 @@ static int mxc_jpeg_try_fmt(struct v4l2_format *f, (fourcc >>16 ) &0xff , (fourcc >> 24) & 0xff); fourcc =mxc_jpeg_get_default_fourcc (ctx, f->type); - fmt =mxc_jpeg_find_format (ctx, fourcc); + fmt =mxc_jpeg_find_format (fourcc);if (!fmt)return -EINVAL ; f->fmt.pix_mp.pixelformat = fourcc;
Signature · 1 line
2.38.1
PATCH 8/10 media: imx-jpeg: Clear slot next desc ptr if config error
In reply to Ming Qianclear slot next desc ptr if config error,
otherwise codec will report config error interrupt repeatedly, it may led to system hang.
--- drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c | 5 +++++ drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 1 + drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c | 1 + 3 files changed, 7 insertions(+)
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c +5 -0
@@ -178,3 +178,8 @@ void mxc_jpeg_set_desc(u32 desc, void __iomem *reg, int slot)writel (desc |MXC_NXT_DESCPT_EN , reg +MXC_SLOT_OFFSET (slot,SLOT_NXT_DESCPT_PTR )); } + +void mxc_jpeg_clr_desc (void __iomem *reg,int slot) +{ +writel (0 , reg +MXC_SLOT_OFFSET (slot,SLOT_NXT_DESCPT_PTR )); +}
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h +1 -0
@@ -137,6 +137,7 @@ void mxc_jpeg_set_bufsize(struct mxc_jpeg_desc *desc, u32 bufsize);void mxc_jpeg_set_res (struct mxc_jpeg_desc *desc,u16 w,u16 h);void mxc_jpeg_set_line_pitch (struct mxc_jpeg_desc *desc,u32 line_pitch);void mxc_jpeg_set_desc (u32 desc,void __iomem *reg,int slot); +void mxc_jpeg_clr_desc (void __iomem *reg,int slot);void mxc_jpeg_set_regs_from_desc (struct mxc_jpeg_desc *desc,void __iomem *reg);#endif
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +1 -0
@@ -692,6 +692,7 @@ static irqreturn_t mxc_jpeg_dec_irq(int irq, void *priv)u32 ret =readl (reg +CAST_STATUS12 );dev_err (dev,"Encoder/decoder error, status=0x%08x" , ret); +mxc_jpeg_clr_desc (reg, slot);mxc_jpeg_sw_reset (reg); buf_state =VB2_BUF_STATE_ERROR ; goto buffers_done;
Signature · 1 line
2.38.1
PATCH 9/10 media: imx-jpeg: Decoder add support for 12bit jpeg
In reply to Ming Qianenable decoding 12-bit extended jpeg
--- .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 136 +++++++++++++++++- 1 file changed, 134 insertions(+), 2 deletions(-)
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +134 -2
@@ -87,6 +87,20 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .precision = 8, .is_rgb = 1, }, + { + .name = "BGR 12bit", /*12-bit BGR packed format*/ + .fourcc = V4L2_PIX_FMT_B312, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, + .nc = 3, + .depth = 36, + .mem_planes = 1, + .comp_planes = 1, + .h_align = 3, + .v_align = 3, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + .is_rgb = 1, + }, { .name = "ABGR", /* ABGR packed format */ .fourcc = V4L2_PIX_FMT_ABGR32,
@@ -101,6 +115,20 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .precision = 8, .is_rgb = 1, }, + { + .name = "ABGR 12bit", /* 12-bit ABGR packed format */ + .fourcc = V4L2_PIX_FMT_B412, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, + .nc = 4, + .depth = 48, + .mem_planes = 1, + .comp_planes = 1, + .h_align = 3, + .v_align = 3, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + .is_rgb = 1, + }, { .name = "YUV420", /* 1st plane = Y, 2nd plane = UV */ .fourcc = V4L2_PIX_FMT_NV12M,
@@ -127,6 +155,32 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .flags = MXC_JPEG_FMT_TYPE_RAW, .precision = 8, }, + { + .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */ + .fourcc = V4L2_PIX_FMT_P012M, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, + .nc = 3, + .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */ + .mem_planes = 2, + .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ + .h_align = 4, + .v_align = 4, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + }, + { + .name = "YUV420 12bit", /* 1st plane = Y, 2nd plane = UV */ + .fourcc = V4L2_PIX_FMT_P012, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_420, + .nc = 3, + .depth = 18, /* 6 x 12 bits (4Y + UV) for 4 pixels */ + .mem_planes = 1, + .comp_planes = 2, /* 1 plane Y, 1 plane UV interleaved */ + .h_align = 4, + .v_align = 4, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + }, { .name = "YUV422", /* YUYV */ .fourcc = V4L2_PIX_FMT_YUYV,
@@ -140,6 +194,19 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .flags = MXC_JPEG_FMT_TYPE_RAW, .precision = 8, }, + { + .name = "YUV422 12bit", /* YUYV */ + .fourcc = V4L2_PIX_FMT_Y212, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_422, + .nc = 3, + .depth = 24, + .mem_planes = 1, + .comp_planes = 1, + .h_align = 4, + .v_align = 3, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + }, { .name = "YUV444", /* YUVYUV */ .fourcc = V4L2_PIX_FMT_YUV24,
@@ -153,6 +220,19 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .flags = MXC_JPEG_FMT_TYPE_RAW, .precision = 8, }, + { + .name = "YUV444 12bit", /* YUVYUV */ + .fourcc = V4L2_PIX_FMT_Y312, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_444, + .nc = 3, + .depth = 36, + .mem_planes = 1, + .comp_planes = 1, + .h_align = 3, + .v_align = 3, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + }, { .name = "Gray", /* Gray (Y8/Y12) or Single Comp */ .fourcc = V4L2_PIX_FMT_GREY,
@@ -166,6 +246,19 @@ static const struct mxc_jpeg_fmt mxc_formats[] = { .flags = MXC_JPEG_FMT_TYPE_RAW, .precision = 8, }, + { + .name = "Gray 12bit", /* Gray (Y8/Y12) or Single Comp */ + .fourcc = V4L2_PIX_FMT_Y012, + .subsampling = V4L2_JPEG_CHROMA_SUBSAMPLING_GRAY, + .nc = 1, + .depth = 12, + .mem_planes = 1, + .comp_planes = 1, + .h_align = 3, + .v_align = 3, + .flags = MXC_JPEG_FMT_TYPE_RAW, + .precision = 12, + }, };#define MXC_JPEG_NUM_FORMATS ARRAY_SIZE(mxc_formats)
@@ -437,17 +530,24 @@ static enum mxc_jpeg_image_format mxc_jpeg_fourcc_to_imgfmt(u32 fourcc) {switch (fourcc) {case V4L2_PIX_FMT_GREY : +case V4L2_PIX_FMT_Y012 :return MXC_JPEG_GRAY ;case V4L2_PIX_FMT_YUYV : +case V4L2_PIX_FMT_Y212 :return MXC_JPEG_YUV422 ;case V4L2_PIX_FMT_NV12 :case V4L2_PIX_FMT_NV12M : +case V4L2_PIX_FMT_P012 : +case V4L2_PIX_FMT_P012M :return MXC_JPEG_YUV420 ;case V4L2_PIX_FMT_YUV24 : +case V4L2_PIX_FMT_Y312 :return MXC_JPEG_YUV444 ;case V4L2_PIX_FMT_BGR24 : +case V4L2_PIX_FMT_B312 :return MXC_JPEG_BGR ;case V4L2_PIX_FMT_ABGR32 : +case V4L2_PIX_FMT_B412 :return MXC_JPEG_ABGR ;default :return MXC_JPEG_INVALID ;
@@ -483,6 +583,17 @@ static void mxc_jpeg_addrs(struct mxc_jpeg_desc *desc, offset; } +static bool mxc_jpeg_is_extended_sequential (const struct mxc_jpeg_fmt *fmt) +{ +if (!fmt || !(fmt->flags &MXC_JPEG_FMT_TYPE_RAW )) +return false; + +if (fmt->precision >8 ) +return true; + +return false; +} +static void notify_eos (struct mxc_jpeg_ctx *ctx) {const struct v4l2_event ev = {
@@ -767,24 +878,31 @@ static int mxc_jpeg_fixup_sof(struct mxc_jpeg_sof *sof,switch (fourcc) {case V4L2_PIX_FMT_NV12 :case V4L2_PIX_FMT_NV12M : +case V4L2_PIX_FMT_P012 : +case V4L2_PIX_FMT_P012M : sof->components_no =3 ; sof->comp[0 ].v =0x2 ; sof->comp[0 ].h =0x2 ;break ;case V4L2_PIX_FMT_YUYV : +case V4L2_PIX_FMT_Y212 : sof->components_no =3 ; sof->comp[0 ].v =0x1 ; sof->comp[0 ].h =0x2 ;break ;case V4L2_PIX_FMT_YUV24 : +case V4L2_PIX_FMT_Y312 :case V4L2_PIX_FMT_BGR24 : +case V4L2_PIX_FMT_B312 :default : sof->components_no =3 ;break ;case V4L2_PIX_FMT_ABGR32 : +case V4L2_PIX_FMT_B412 : sof->components_no =4 ;break ;case V4L2_PIX_FMT_GREY : +case V4L2_PIX_FMT_Y012 : sof->components_no =1 ;break ; }
@@ -804,20 +922,27 @@ static int mxc_jpeg_fixup_sos(struct mxc_jpeg_sos *sos,switch (fourcc) {case V4L2_PIX_FMT_NV12 :case V4L2_PIX_FMT_NV12M : +case V4L2_PIX_FMT_P012 : +case V4L2_PIX_FMT_P012M : sos->components_no =3 ;break ;case V4L2_PIX_FMT_YUYV : +case V4L2_PIX_FMT_Y212 : sos->components_no =3 ;break ;case V4L2_PIX_FMT_YUV24 : +case V4L2_PIX_FMT_Y312 :case V4L2_PIX_FMT_BGR24 : +case V4L2_PIX_FMT_B312 :default : sos->components_no =3 ;break ;case V4L2_PIX_FMT_ABGR32 : +case V4L2_PIX_FMT_B412 : sos->components_no =4 ;break ;case V4L2_PIX_FMT_GREY : +case V4L2_PIX_FMT_Y012 : sos->components_no =1 ;break ; }
@@ -847,12 +972,15 @@ static unsigned int mxc_jpeg_setup_cfg_stream(void *cfg_stream_vaddr,u8 *cfg = (u8 *)cfg_stream_vaddr;struct mxc_jpeg_sof *sof;struct mxc_jpeg_sos *sos; +const struct mxc_jpeg_fmt *fmt =mxc_jpeg_find_format (fourcc); + +if (!fmt) +return 0 ;memcpy (cfg + offset, jpeg_soi,ARRAY_SIZE (jpeg_soi)); offset +=ARRAY_SIZE (jpeg_soi); -if (fourcc ==V4L2_PIX_FMT_BGR24 || - fourcc ==V4L2_PIX_FMT_ABGR32 ) { +if (fmt->is_rgb) {memcpy (cfg + offset, jpeg_app14,sizeof (jpeg_app14)); offset +=sizeof (jpeg_app14); }else {
@@ -918,6 +1046,10 @@ static void mxc_jpeg_config_dec_desc(struct vb2_buffer *out_buf, desc->stm_ctrl &= ~STM_CTRL_IMAGE_FORMAT (0xF );/* clear image format */ desc->stm_ctrl |=STM_CTRL_IMAGE_FORMAT (img_fmt); desc->stm_ctrl |=STM_CTRL_BITBUF_PTR_CLR (1 ); +if (mxc_jpeg_is_extended_sequential (jpeg_src_buf->fmt)) + desc->stm_ctrl |=STM_CTRL_PIXEL_PRECISION ; +else + desc->stm_ctrl &= ~STM_CTRL_PIXEL_PRECISION ; desc->line_pitch = q_data_cap->bytesperline[0 ];mxc_jpeg_addrs (desc, dst_buf, src_buf,0 );mxc_jpeg_set_bufsize (desc,ALIGN (vb2_plane_size (src_buf,0 ),1024 ));
Signature · 1 line
2.38.1
PATCH 10/10 media: imx-jpeg: Encoder add support for 12bit jpeg
In reply to Ming Qianenable encoding 12-bit extended jpeg
--- .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c | 14 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 4 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 172 +++++++++++++++++- 3 files changed, 175 insertions(+), 15 deletions(-)
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c +10 -4
@@ -97,25 +97,31 @@ void mxc_jpeg_sw_reset(void __iomem *reg)writel (GLB_CTRL_SFT_RST , reg +GLB_CTRL ); } -void mxc_jpeg_enc_mode_conf (struct device *dev,void __iomem *reg) +void mxc_jpeg_enc_mode_conf (struct device *dev,void __iomem *reg,u8 extseq) {dev_dbg (dev,"CAST Encoder CONFIG...\n" );/* * "Config_Mode" enabled, "Config_Mode auto clear enabled", */ -writel (0xa0 , reg +CAST_MODE ); +if (extseq) +writel (0xb0 , reg +CAST_MODE ); +else +writel (0xa0 , reg +CAST_MODE );/* all markers and segments */ writel (0x3ff , reg +CAST_CFG_MODE ); } -void mxc_jpeg_enc_mode_go (struct device *dev,void __iomem *reg) +void mxc_jpeg_enc_mode_go (struct device *dev,void __iomem *reg,u8 extseq) {dev_dbg (dev,"CAST Encoder GO...\n" );/* * "GO" enabled, "GO bit auto clear" enabled */ -writel (0x140 , reg +CAST_MODE ); +if (extseq) +writel (0x150 , reg +CAST_MODE ); +else +writel (0x140 , reg +CAST_MODE ); }void mxc_jpeg_enc_set_quality (struct device *dev,void __iomem *reg,u8 quality)
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h +2 -2
@@ -117,8 +117,8 @@ void print_wrapper_info(struct device *dev, void __iomem *reg);void mxc_jpeg_sw_reset (void __iomem *reg);int mxc_jpeg_enable (void __iomem *reg);void wait_frmdone (struct device *dev,void __iomem *reg); -void mxc_jpeg_enc_mode_conf (struct device *dev,void __iomem *reg); -void mxc_jpeg_enc_mode_go (struct device *dev,void __iomem *reg); +void mxc_jpeg_enc_mode_conf (struct device *dev,void __iomem *reg,u8 extseq); +void mxc_jpeg_enc_mode_go (struct device *dev,void __iomem *reg,u8 extseq);void mxc_jpeg_enc_set_quality (struct device *dev,void __iomem *reg,u8 quality);void mxc_jpeg_dec_mode_go (struct device *dev,void __iomem *reg);int mxc_jpeg_get_slot (void __iomem *reg);
drivers/media/platform/nxp/imx-jpeg/mxc-jpeg.c +163 -9
235 lines not on this page · raw message
Signature · 1 line
2.38.1
Hi,
for the patches in the imx-jpeg driver, in the commit description, sentences should begin with capital letter.
Other than that, for the entire patch-set:
Regards,
Mirela
Quoted 32 lines · Ming Qian
the imx8 jpeg codec support ISO/IEC 10918-1 Standard Baseline and Extended Sequential DCT modes.
it can support 8-bit and 12-bit per color samples. Currently we only enable the 8-bit jpeg,
and we can enable the 12-bit extended jpeg
with the new defined 12 bit pixel format.Ming Qian (10):
media: Add P012 and P012M video format
media: Add Y012 video format
media: Add Y212 video format
media: Add Y312 video format
media: Add B312 video format
media: Add B412 video format
media: imx-jpeg: Refine the functionmxc_jpeg_find_format
media: imx-jpeg: Clear slot next desc ptr if config error
media: imx-jpeg: Decoder add support for 12bit jpeg
media: imx-jpeg: Encoder add support for 12bit jpeg.../media/v4l/pixfmt-packed-yuv.rst | 70 ++++ .../userspace-api/media/v4l/pixfmt-rgb.rst | 44 +++ .../media/v4l/pixfmt-yuv-luma.rst | 11 + .../media/v4l/pixfmt-yuv-planar.rst | 94 +++++ .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.c | 19 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg-hw.h | 5 +- .../media/platform/nxp/imx-jpeg/mxc-jpeg.c | 326 ++++++++++++++++-- drivers/media/v4l2-core/v4l2-common.c | 6 + drivers/media/v4l2-core/v4l2-ioctl.c | 7 + include/uapi/linux/videodev2.h | 9 + 10 files changed, 565 insertions(+), 26 deletions(-)