Skip to content

Commit

Permalink
WIP: media: v4l2-common: add NV15 and NV20 pixel formats
Browse files Browse the repository at this point in the history
NOTE: packed 10-bit 4:2:0/4:2:2 semi-planar Y/CbCr format

Signed-off-by: Jonas Karlman <[email protected]>
  • Loading branch information
Kwiboo committed Jun 7, 2020
1 parent 7329aee commit 015a4d4
Show file tree
Hide file tree
Showing 6 changed files with 210 additions and 0 deletions.
101 changes: 101 additions & 0 deletions Documentation/userspace-api/media/v4l/pixfmt-nv15.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
.. Permission is granted to copy, distribute and/or modify this
.. document under the terms of the GNU Free Documentation License,
.. Version 1.1 or any later version published by the Free Software
.. Foundation, with no Invariant Sections, no Front-Cover Texts
.. and no Back-Cover Texts. A copy of the license is included at
.. Documentation/userspace-api/media/fdl-appendix.rst.
..
.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
.. _V4L2-PIX-FMT-NV15:

**************************
V4L2_PIX_FMT_NV15 ('NV15')
**************************

Format with ½ horizontal and vertical chroma resolution, also known as
YUV 4:2:0. One luminance and one chrominance plane with alternating
chroma samples similar to ``V4L2_PIX_FMT_NV12`` but with 10-bit samples
that are grouped into four and packed into five bytes.

The '15' suffix refers to the optimum effective bits per pixel which is
achieved when the total number of luminance samples is a multiple of 8.


Description
===========

This is a packed 10-bit two-plane version of the YUV 4:2:0 format. The
three components are separated into two sub-images or planes. The Y plane
is first. The Y plane has five bytes per each group of four pixels. A
combined CbCr plane immediately follows the Y plane in memory. The CbCr
plane is the same width, in bytes, as the Y plane (and of the image), but
is half as tall in pixels. Each CbCr pair belongs to four pixels. For
example, Cb\ :sub:`00`/Cr\ :sub:`00` belongs to Y'\ :sub:`00`,
Y'\ :sub:`01`, Y'\ :sub:`10`, Y'\ :sub:`11`.

If the Y plane has pad bytes after each row, then the CbCr plane has as
many pad bytes after its rows.

**Byte Order.**
Little endian. Each cell is one byte. Pixels cross the byte boundary.


.. flat-table::
:header-rows: 0
:stub-columns: 0

* - start + 0:
- Y'\ :sub:`00[7:0]`
- Y'\ :sub:`01[5:0]`\ Y'\ :sub:`00[9:8]`
- Y'\ :sub:`02[3:0]`\ Y'\ :sub:`01[9:6]`
- Y'\ :sub:`03[1:0]`\ Y'\ :sub:`02[9:4]`
- Y'\ :sub:`03[9:2]`
* - start + 5:
- Y'\ :sub:`10[7:0]`
- Y'\ :sub:`11[5:0]`\ Y'\ :sub:`10[9:8]`
- Y'\ :sub:`12[3:0]`\ Y'\ :sub:`11[9:6]`
- Y'\ :sub:`13[1:0]`\ Y'\ :sub:`12[9:4]`
- Y'\ :sub:`13[9:2]`
* - start + 10:
- Cb'\ :sub:`00[7:0]`
- Cr'\ :sub:`00[5:0]`\ Cb'\ :sub:`00[9:8]`
- Cb'\ :sub:`01[3:0]`\ Cr'\ :sub:`00[9:6]`
- Cr'\ :sub:`01[1:0]`\ Cb'\ :sub:`01[9:4]`
- Cr'\ :sub:`01[9:2]`


**Color Sample Location:**

.. flat-table::
:header-rows: 0
:stub-columns: 0

* -
- 0
-
- 1
- 2
-
- 3
* - 0
- Y
-
- Y
- Y
-
- Y
* -
-
- C
-
-
- C
-
* - 1
- Y
-
- Y
- Y
-
- Y
99 changes: 99 additions & 0 deletions Documentation/userspace-api/media/v4l/pixfmt-nv20.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
.. Permission is granted to copy, distribute and/or modify this
.. document under the terms of the GNU Free Documentation License,
.. Version 1.1 or any later version published by the Free Software
.. Foundation, with no Invariant Sections, no Front-Cover Texts
.. and no Back-Cover Texts. A copy of the license is included at
.. Documentation/userspace-api/media/fdl-appendix.rst.
..
.. TODO: replace it to GFDL-1.1-or-later WITH no-invariant-sections
.. _V4L2-PIX-FMT-NV20:

**************************
V4L2_PIX_FMT_NV20 ('NV20')
**************************

Format with ½ horizontal chroma resolution, also known as YUV 4:2:2.
One luminance and one chrominance plane with alternating chroma samples
similar to ``V4L2_PIX_FMT_NV16`` but with 10-bit samples
that are grouped into four and packed into five bytes.

The '20' suffix refers to the optimum effective bits per pixel which is
achieved when the total number of luminance samples is a multiple of 4.


Description
===========

This is a packed 10-bit two-plane version of the YUV 4:2:2 format. The
three components are separated into two sub-images or planes. The Y plane
is first. The Y plane has five bytes per each group of four pixels. A
combined CbCr plane immediately follows the Y plane in memory. The CbCr
plane is the same width and height, in bytes, as the Y plane (and of the
image). Each CbCr pair belongs to two pixels. For example,
Cb\ :sub:`00`/Cr\ :sub:`00` belongs to Y'\ :sub:`00`, Y'\ :sub:`01`.

If the Y plane has pad bytes after each row, then the CbCr plane has as
many pad bytes after its rows.

**Byte Order.**
Little endian. Each cell is one byte. Pixels cross the byte boundary.


.. flat-table::
:header-rows: 0
:stub-columns: 0

* - start + 0:
- Y'\ :sub:`00[7:0]`
- Y'\ :sub:`01[5:0]`\ Y'\ :sub:`00[9:8]`
- Y'\ :sub:`02[3:0]`\ Y'\ :sub:`01[9:6]`
- Y'\ :sub:`03[1:0]`\ Y'\ :sub:`02[9:4]`
- Y'\ :sub:`03[9:2]`
* - start + 5:
- Y'\ :sub:`10[7:0]`
- Y'\ :sub:`11[5:0]`\ Y'\ :sub:`10[9:8]`
- Y'\ :sub:`12[3:0]`\ Y'\ :sub:`11[9:6]`
- Y'\ :sub:`13[1:0]`\ Y'\ :sub:`12[9:4]`
- Y'\ :sub:`13[9:2]`
* - start + 10:
- Cb'\ :sub:`00[7:0]`
- Cr'\ :sub:`00[5:0]`\ Cb'\ :sub:`00[9:8]`
- Cb'\ :sub:`01[3:0]`\ Cr'\ :sub:`00[9:6]`
- Cr'\ :sub:`01[1:0]`\ Cb'\ :sub:`01[9:4]`
- Cr'\ :sub:`01[9:2]`
* - start + 15:
- Cb'\ :sub:`10[7:0]`
- Cr'\ :sub:`10[5:0]`\ Cb'\ :sub:`10[9:8]`
- Cb'\ :sub:`11[3:0]`\ Cr'\ :sub:`10[9:6]`
- Cr'\ :sub:`11[1:0]`\ Cb'\ :sub:`11[9:4]`
- Cr'\ :sub:`11[9:2]`


**Color Sample Location:**

.. flat-table::
:header-rows: 0
:stub-columns: 0

* -
- 0
-
- 1
- 2
-
- 3
* - 0
- Y
- C
- Y
- Y
- C
- Y
* - 1
- Y
- C
- Y
- Y
- C
- Y
2 changes: 2 additions & 0 deletions Documentation/userspace-api/media/v4l/yuv-formats.rst
Original file line number Diff line number Diff line change
Expand Up @@ -61,4 +61,6 @@ to brightness information.
pixfmt-nv16
pixfmt-nv16m
pixfmt-nv24
pixfmt-nv15
pixfmt-nv20
pixfmt-m420
3 changes: 3 additions & 0 deletions drivers/media/v4l2-core/v4l2-common.c
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,9 @@ 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_NV15, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 5, 0, 0 }, .hdiv = 2, .vdiv = 2, .block_w = { 4, 2, 0, 0 }, .block_h = { 1, 1, 0, 0 } },
{ .format = V4L2_PIX_FMT_NV20, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 5, 5, 0, 0 }, .hdiv = 2, .vdiv = 1, .block_w = { 4, 2, 0, 0 }, .block_h = { 1, 1, 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 },
{ .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 },
{ .format = V4L2_PIX_FMT_YUV411P, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 3, .bpp = { 1, 1, 1, 0 }, .hdiv = 4, .vdiv = 1 },
Expand Down
2 changes: 2 additions & 0 deletions drivers/media/v4l2-core/v4l2-ioctl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1315,6 +1315,8 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt)
case V4L2_PIX_FMT_NV61: descr = "Y/CrCb 4:2:2"; break;
case V4L2_PIX_FMT_NV24: descr = "Y/CbCr 4:4:4"; break;
case V4L2_PIX_FMT_NV42: descr = "Y/CrCb 4:4:4"; break;
case V4L2_PIX_FMT_NV15: descr = "10-bit Y/CbCr 4:2:0 (Packed)"; break;
case V4L2_PIX_FMT_NV20: descr = "10-bit Y/CbCr 4:2:2 (Packed)"; break;
case V4L2_PIX_FMT_NV12M: descr = "Y/CbCr 4:2:0 (N-C)"; break;
case V4L2_PIX_FMT_NV21M: descr = "Y/CrCb 4:2:0 (N-C)"; break;
case V4L2_PIX_FMT_NV16M: descr = "Y/CbCr 4:2:2 (N-C)"; break;
Expand Down
3 changes: 3 additions & 0 deletions include/uapi/linux/videodev2.h
Original file line number Diff line number Diff line change
Expand Up @@ -608,6 +608,9 @@ 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_NV15 v4l2_fourcc('N', 'V', '1', '5') /* 15 Y/CbCr 4:2:0 10-bit packed */
#define V4L2_PIX_FMT_NV20 v4l2_fourcc('N', 'V', '2', '0') /* 20 Y/CbCr 4:2:2 10-bit packed */

/* 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 */
Expand Down

0 comments on commit 015a4d4

Please sign in to comment.