Skip to content

Commit aa10804

Browse files
mingqian-0mchehab
authored andcommitted
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. Signed-off-by: Ming Qian <ming.qian@nxp.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab@kernel.org>
1 parent f57fa29 commit aa10804

File tree

4 files changed

+100
-0
lines changed

4 files changed

+100
-0
lines changed

Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,20 @@ All components are stored with the same number of bits per component.
123123
- Cb, Cr
124124
- Yes
125125
- 4x4 tiles
126+
* - V4L2_PIX_FMT_P012
127+
- 'P012'
128+
- 12
129+
- 4:2:0
130+
- Cb, Cr
131+
- Yes
132+
- Linear
133+
* - V4L2_PIX_FMT_P012M
134+
- 'PM12'
135+
- 12
136+
- 4:2:0
137+
- Cb, Cr
138+
- No
139+
- Linear
126140
* - V4L2_PIX_FMT_NV16
127141
- 'NV16'
128142
- 8
@@ -586,6 +600,86 @@ Data in the 10 high bits, zeros in the 6 low bits, arranged in little endian ord
586600
- Cb\ :sub:`11`
587601
- Cr\ :sub:`11`
588602

603+
.. _V4L2-PIX-FMT-P012:
604+
.. _V4L2-PIX-FMT-P012M:
605+
606+
P012 and P012M
607+
--------------
608+
609+
P012 is like NV12 with 12 bits per component, expanded to 16 bits.
610+
Data in the 12 high bits, zeros in the 4 low bits, arranged in little endian order.
611+
612+
.. flat-table:: Sample 4x4 P012 Image
613+
:header-rows: 0
614+
:stub-columns: 0
615+
616+
* - start + 0:
617+
- Y'\ :sub:`00`
618+
- Y'\ :sub:`01`
619+
- Y'\ :sub:`02`
620+
- Y'\ :sub:`03`
621+
* - start + 8:
622+
- Y'\ :sub:`10`
623+
- Y'\ :sub:`11`
624+
- Y'\ :sub:`12`
625+
- Y'\ :sub:`13`
626+
* - start + 16:
627+
- Y'\ :sub:`20`
628+
- Y'\ :sub:`21`
629+
- Y'\ :sub:`22`
630+
- Y'\ :sub:`23`
631+
* - start + 24:
632+
- Y'\ :sub:`30`
633+
- Y'\ :sub:`31`
634+
- Y'\ :sub:`32`
635+
- Y'\ :sub:`33`
636+
* - start + 32:
637+
- Cb\ :sub:`00`
638+
- Cr\ :sub:`00`
639+
- Cb\ :sub:`01`
640+
- Cr\ :sub:`01`
641+
* - start + 40:
642+
- Cb\ :sub:`10`
643+
- Cr\ :sub:`10`
644+
- Cb\ :sub:`11`
645+
- Cr\ :sub:`11`
646+
647+
.. flat-table:: Sample 4x4 P012M Image
648+
:header-rows: 0
649+
:stub-columns: 0
650+
651+
* - start0 + 0:
652+
- Y'\ :sub:`00`
653+
- Y'\ :sub:`01`
654+
- Y'\ :sub:`02`
655+
- Y'\ :sub:`03`
656+
* - start0 + 8:
657+
- Y'\ :sub:`10`
658+
- Y'\ :sub:`11`
659+
- Y'\ :sub:`12`
660+
- Y'\ :sub:`13`
661+
* - start0 + 16:
662+
- Y'\ :sub:`20`
663+
- Y'\ :sub:`21`
664+
- Y'\ :sub:`22`
665+
- Y'\ :sub:`23`
666+
* - start0 + 24:
667+
- Y'\ :sub:`30`
668+
- Y'\ :sub:`31`
669+
- Y'\ :sub:`32`
670+
- Y'\ :sub:`33`
671+
* -
672+
* - start1 + 0:
673+
- Cb\ :sub:`00`
674+
- Cr\ :sub:`00`
675+
- Cb\ :sub:`01`
676+
- Cr\ :sub:`01`
677+
* - start1 + 8:
678+
- Cb\ :sub:`10`
679+
- Cr\ :sub:`10`
680+
- Cb\ :sub:`11`
681+
- Cr\ :sub:`11`
682+
589683

590684
Fully Planar YUV Formats
591685
========================

drivers/media/v4l2-core/v4l2-common.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,7 @@ const struct v4l2_format_info *v4l2_format_info(u32 format)
267267
{ .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 },
268268
{ .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 },
269269
{ .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 },
270+
{ .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 },
270271

271272
{ .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 },
272273
{ .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)
292293
{ .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 },
293294
{ .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 },
294295
{ .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 },
296+
{ .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 },
295297

296298
/* Bayer RGB formats */
297299
{ .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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1348,6 +1348,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
13481348
case V4L2_PIX_FMT_NV24: descr = "Y/UV 4:4:4"; break;
13491349
case V4L2_PIX_FMT_NV42: descr = "Y/VU 4:4:4"; break;
13501350
case V4L2_PIX_FMT_P010: descr = "10-bit Y/UV 4:2:0"; break;
1351+
case V4L2_PIX_FMT_P012: descr = "12-bit Y/UV 4:2:0"; break;
13511352
case V4L2_PIX_FMT_NV12_4L4: descr = "Y/UV 4:2:0 (4x4 Linear)"; break;
13521353
case V4L2_PIX_FMT_NV12_16L16: descr = "Y/UV 4:2:0 (16x16 Linear)"; break;
13531354
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)
13581359
case V4L2_PIX_FMT_NV61M: descr = "Y/VU 4:2:2 (N-C)"; break;
13591360
case V4L2_PIX_FMT_NV12MT: descr = "Y/UV 4:2:0 (64x32 MB, N-C)"; break;
13601361
case V4L2_PIX_FMT_NV12MT_16X16: descr = "Y/UV 4:2:0 (16x16 MB, N-C)"; break;
1362+
case V4L2_PIX_FMT_P012M: descr = "12-bit Y/UV 4:2:0 (N-C)"; break;
13611363
case V4L2_PIX_FMT_YUV420M: descr = "Planar YUV 4:2:0 (N-C)"; break;
13621364
case V4L2_PIX_FMT_YVU420M: descr = "Planar YVU 4:2:0 (N-C)"; break;
13631365
case V4L2_PIX_FMT_YUV422M: descr = "Planar YUV 4:2:2 (N-C)"; break;

include/uapi/linux/videodev2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,12 +637,14 @@ struct v4l2_pix_format {
637637
#define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4') /* 24 Y/CbCr 4:4:4 */
638638
#define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2') /* 24 Y/CrCb 4:4:4 */
639639
#define V4L2_PIX_FMT_P010 v4l2_fourcc('P', '0', '1', '0') /* 24 Y/CbCr 4:2:0 10-bit per component */
640+
#define V4L2_PIX_FMT_P012 v4l2_fourcc('P', '0', '1', '2') /* 24 Y/CbCr 4:2:0 12-bit per component */
640641

641642
/* two non contiguous planes - one Y, one Cr + Cb interleaved */
642643
#define V4L2_PIX_FMT_NV12M v4l2_fourcc('N', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 */
643644
#define V4L2_PIX_FMT_NV21M v4l2_fourcc('N', 'M', '2', '1') /* 21 Y/CrCb 4:2:0 */
644645
#define V4L2_PIX_FMT_NV16M v4l2_fourcc('N', 'M', '1', '6') /* 16 Y/CbCr 4:2:2 */
645646
#define V4L2_PIX_FMT_NV61M v4l2_fourcc('N', 'M', '6', '1') /* 16 Y/CrCb 4:2:2 */
647+
#define V4L2_PIX_FMT_P012M v4l2_fourcc('P', 'M', '1', '2') /* 24 Y/CbCr 4:2:0 12-bit per component */
646648

647649
/* three planes - Y Cb, Cr */
648650
#define V4L2_PIX_FMT_YUV410 v4l2_fourcc('Y', 'U', 'V', '9') /* 9 YUV 4:1:0 */

0 commit comments

Comments
 (0)