Messages in this thread | | | Date | Fri, 17 Feb 2023 10:40:53 +0800 | Subject | Re: [PATCH v2 01/12] media: v4l2: Add NV15 pixel format | From | Hsia-Jun Li <> |
| |
On 2/17/23 01:00, Nicolas Dufresne wrote: > CAUTION: Email originated externally, do not click links or open attachments unless you recognize the sender and know the content is safe. > > > Le jeudi 16 février 2023 à 16:57 +0800, Hsia-Jun Li a écrit : >> >> On 1/12/23 20:56, Sebastian Fricke wrote: >>> CAUTION: Email originated externally, do not click links or open attachments unless you recognize the sender and know the content is safe. >>> >>> >>> From: Jonas Karlman <jonas@kwiboo.se> >>> >>> Add the NV15 pixel format used by the Rockchip Video Decoder for 10-bit buffers. >>> >> I think this pixel format in the Rockchip platform supports multiple >> planes buffers. It is all right not to add more variant until the ext >> pixel format and buffer APIs are merged. >> >> I just want to mention the need of this. > > Can you extend, I don't see that support in rkvdec driver (nor in mpp). > > /* config output base address */ > dst_addr = vb2_dma_contig_plane_dma_addr(&dst_buf->vb2_buf, 0); > writel_relaxed(dst_addr, rkvdec->regs + RKVDEC_REG_DECOUT_BASE); > > reg = RKVDEC_Y_VIRSTRIDE(y_virstride / 16); > writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_Y_VIRSTRIDE); > > reg = RKVDEC_YUV_VIRSTRIDE(yuv_virstride / 16); > writel_relaxed(reg, rkvdec->regs + RKVDEC_REG_YUV_VIRSTRIDE); > > That looks like a base address and 2 strides only. For NV15M (multiple I think the rockchip drm does VOP_WIN_SET(vop, win, uv_vir, DIV_ROUND_UP(fb->pitches[1], 4)); VOP_WIN_SET(vop, win, uv_mst, dma_addr);
vop2_win_write(win, VOP2_WIN_UV_VIR, DIV_ROUND_UP(fb->pitches[1], 4)); vop2_win_write(win, VOP2_WIN_UV_MST, uv_mst);
> allocation) you'd need 2 addresses. It could be that RGA or newer chip have that > support, but as you know, we add formats only when actually using them. From the public info, it is not just rockchip but also NXP and xilinx support this 10bits format. I am not sure whether they would support that.
Besides, I think the rockchip decoder needs some spare space between its Y plane and UV plane. It would be hard to present such thing with the single plane format unless you want to get the wrong start address of the chroma plane. > > regards, > Nicolas > >>> NV15 is a packed 10-bit 4:2:0 Y/CbCr format similar to P010 and P210 but has no >>> padding between components. Instead, luminance and chrominance samples are grouped >>> into 4s so that each group is packed into an integer number of bytes: >>> >>> YYYY = UVUV = 4 * 10 bits = 40 bits = 5 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 for NV15. >>> >>> Signed-off-by: Jonas Karlman <jonas@kwiboo.se> >>> Signed-off-by: Sebastian Fricke <sebastian.fricke@collabora.com> >>> --- >>> .../userspace-api/media/v4l/pixfmt-yuv-planar.rst | 75 ++++++++++++++++++++++ >>> drivers/media/v4l2-core/v4l2-common.c | 2 + >>> drivers/media/v4l2-core/v4l2-ioctl.c | 1 + >>> include/uapi/linux/videodev2.h | 1 + >>> 4 files changed, 79 insertions(+) >>> >>> diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst >>> index f1d5bb7b806d..7d8d228f8063 100644 >>> --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst >>> +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst >>> @@ -79,6 +79,13 @@ All components are stored with the same number of bits per component. >>> - Cr, Cb >>> - Yes >>> - Linear >>> + * - V4L2_PIX_FMT_NV15 >>> + - 'NV15' >>> + - 15 >>> + - 4:2:0 >>> + - Cb, Cr >>> + - Yes >>> + - Linear >>> * - V4L2_PIX_FMT_NV12M >>> - 'NM12' >>> - 8 >>> @@ -183,6 +190,7 @@ horizontally. >>> >>> .. _V4L2-PIX-FMT-NV12: >>> .. _V4L2-PIX-FMT-NV21: >>> +.. _V4L2-PIX-FMT-NV15: >>> .. _V4L2-PIX-FMT-NV12M: >>> .. _V4L2-PIX-FMT-NV21M: >>> .. _V4L2-PIX-FMT-P010: >>> @@ -586,6 +594,73 @@ 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_NV15: >>> + >>> +NV15 >>> +---- >>> + >>> +Similar to P010, a semi-planar 10-bit Y/CbCr format, but all components are >>> +packed without any padding between each other. As a side-effect, each group of >>> +4 components are stored over 5 bytes (YYYY or UVUV = 4 * 10 bits = 40 bits = 5 >>> +bytes). >>> + >>> +.. flat-table:: Sample 4x4 NV15 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:`04` >>> + - Y'\ :sub:`10` >>> + - Y'\ :sub:`11` >>> + - Y'\ :sub:`12` >>> + * - start + 16: >>> + - Y'\ :sub:`13` >>> + - Y'\ :sub:`14` >>> + - Y'\ :sub:`20` >>> + - Y'\ :sub:`21` >>> + * - start + 24: >>> + - Y'\ :sub:`22` >>> + - Y'\ :sub:`23` >>> + - Y'\ :sub:`24` >>> + - Y'\ :sub:`30` >>> + * - start + 32: >>> + - Y'\ :sub:`31` >>> + - Y'\ :sub:`32` >>> + - Y'\ :sub:`33` >>> + - Y'\ :sub:`34` >>> + >>> + * - start + 0: >>> + - Cb\ :sub:`00` >>> + - Cr\ :sub:`00` >>> + - Cb\ :sub:`01` >>> + - Cr\ :sub:`01` >>> + * - start + 8: >>> + - Cb\ :sub:`02` >>> + - Cr\ :sub:`02` >>> + - Cb\ :sub:`03` >>> + - Cr\ :sub:`03` >>> + * - start + 16: >>> + - Cb\ :sub:`04` >>> + - Cr\ :sub:`04` >>> + - Cb\ :sub:`10` >>> + - Cr\ :sub:`10` >>> + * - start + 24: >>> + - Cb\ :sub:`11` >>> + - Cr\ :sub:`11` >>> + - Cb\ :sub:`12` >>> + - Cr\ :sub:`12` >>> + * - start + 32: >>> + - Cb\ :sub:`13` >>> + - Cr\ :sub:`13` >>> + - Cb\ :sub:`14` >>> + - Cr\ :sub:`14` >>> + >>> +.. raw:: latex >>> >>> Fully Planar YUV Formats >>> ======================== >>> diff --git a/drivers/media/v4l2-core/v4l2-common.c b/drivers/media/v4l2-core/v4l2-common.c >>> index 40f56e044640..be23e319fb3a 100644 >>> --- a/drivers/media/v4l2-core/v4l2-common.c >>> +++ b/drivers/media/v4l2-core/v4l2-common.c >>> @@ -262,6 +262,8 @@ const struct v4l2_format_info *v4l2_format_info(u32 format) >>> /* 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 }, >>> { .format = V4L2_PIX_FMT_NV21, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 2 }, >>> + { .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_NV16, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, >>> { .format = V4L2_PIX_FMT_NV61, .pixel_enc = V4L2_PIXEL_ENC_YUV, .mem_planes = 1, .comp_planes = 2, .bpp = { 1, 2, 0, 0 }, .hdiv = 2, .vdiv = 1 }, >>> { .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 }, >>> diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c >>> index 8e0a0ff62a70..1c80ad78ef00 100644 >>> --- a/drivers/media/v4l2-core/v4l2-ioctl.c >>> +++ b/drivers/media/v4l2-core/v4l2-ioctl.c >>> @@ -1343,6 +1343,7 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) >>> case V4L2_PIX_FMT_M420: descr = "YUV 4:2:0 (M420)"; 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_NV15: descr = "10-bit Y/UV 4:2:0 (Packed)"; break; >>> case V4L2_PIX_FMT_NV16: descr = "Y/UV 4:2:2"; break; >>> case V4L2_PIX_FMT_NV61: descr = "Y/VU 4:2:2"; break; >>> case V4L2_PIX_FMT_NV24: descr = "Y/UV 4:4:4"; break; >>> diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h >>> index 1befd181a4cc..e9731286dc77 100644 >>> --- a/include/uapi/linux/videodev2.h >>> +++ b/include/uapi/linux/videodev2.h >>> @@ -621,6 +621,7 @@ struct v4l2_pix_format { >>> /* 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 */ >>> #define V4L2_PIX_FMT_NV21 v4l2_fourcc('N', 'V', '2', '1') /* 12 Y/CrCb 4:2:0 */ >>> +#define V4L2_PIX_FMT_NV15 v4l2_fourcc('N', 'V', '1', '5') /* 15 Y/CbCr 4:2:0 10-bit packed */ >>> #define V4L2_PIX_FMT_NV16 v4l2_fourcc('N', 'V', '1', '6') /* 16 Y/CbCr 4:2:2 */ >>> #define V4L2_PIX_FMT_NV61 v4l2_fourcc('N', 'V', '6', '1') /* 16 Y/CrCb 4:2:2 */ >>> #define V4L2_PIX_FMT_NV24 v4l2_fourcc('N', 'V', '2', '4') /* 24 Y/CbCr 4:4:4 */ >>> >>> -- >>> 2.25.1 >> >
-- Hsia-Jun(Randy) Li
| |