Hi Ezequiel, The same comments as for the previous patch apply here as well. I also think it will be good if v4l-utils is updated to use the new define rather than V4L2_PIX_FMT_HM12. A patch changing that would be useful. Regards, Hans On 27/07/2021 16:57, Ezequiel Garcia wrote: > The V4L2_PIX_FMT_HM12 format is actually a simple NV12 tiled format, > with 16x16 linear tiles. Rename the format and move its documentation > together with the other tiled NV12 formats. > > Keep V4L2_PIX_FMT_HM12 for application compatibility. > > Signed-off-by: Ezequiel Garcia <ezequiel@xxxxxxxxxxxxx> > --- > Documentation/admin-guide/media/ivtv.rst | 2 +- > .../userspace-api/media/drivers/cx2341x-uapi.rst | 8 +++----- > .../userspace-api/media/v4l/pixfmt-reserved.rst | 8 -------- > .../userspace-api/media/v4l/pixfmt-yuv-planar.rst | 6 ++++++ > drivers/media/pci/cx18/cx18-ioctl.c | 4 ++-- > drivers/media/pci/cx18/cx18-streams.c | 8 ++++---- > drivers/media/pci/ivtv/ivtv-ioctl.c | 8 ++++---- > drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c | 10 +++++----- > drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h | 2 +- > drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c | 2 +- > drivers/media/v4l2-core/v4l2-ioctl.c | 2 +- > include/uapi/linux/videodev2.h | 3 ++- > 12 files changed, 30 insertions(+), 33 deletions(-) > > diff --git a/Documentation/admin-guide/media/ivtv.rst b/Documentation/admin-guide/media/ivtv.rst > index 7b8775d20214..101f16d0263e 100644 > --- a/Documentation/admin-guide/media/ivtv.rst > +++ b/Documentation/admin-guide/media/ivtv.rst > @@ -159,7 +159,7 @@ whatever). Otherwise the device numbers can get confusing. The ivtv > Read-only > > The raw YUV video output from the current video input. The YUV format > - is non-standard (V4L2_PIX_FMT_HM12). > + is a 16x16 linear tiled NV12 format (V4L2_PIX_FMT_NV12_16L16) > > Note that the YUV and PCM streams are not synchronized, so they are of > limited use. > diff --git a/Documentation/userspace-api/media/drivers/cx2341x-uapi.rst b/Documentation/userspace-api/media/drivers/cx2341x-uapi.rst > index 8a7977af79d5..debde65fb8cd 100644 > --- a/Documentation/userspace-api/media/drivers/cx2341x-uapi.rst > +++ b/Documentation/userspace-api/media/drivers/cx2341x-uapi.rst > @@ -7,9 +7,7 @@ Non-compressed file format > -------------------------- > > The cx23416 can produce (and the cx23415 can also read) raw YUV output. The > -format of a YUV frame is specific to this chip and is called HM12. 'HM' stands > -for 'Hauppauge Macroblock', which is a misnomer as 'Conexant Macroblock' would > -be more accurate. > +format of a YUV frame is 16x16 linear tiled NV12 (V4L2_PIX_FMT_NV12_16L16). > > The format is YUV 4:2:0 which uses 1 Y byte per pixel and 1 U and V byte per > four pixels. > @@ -34,8 +32,8 @@ second line of 8 UV pairs of the top-left block, etc. After transmitting > this block the first line of the block on the right to the first block is > transmitted, etc. > > -The code below is given as an example on how to convert HM12 to separate > -Y, U and V planes. This code assumes frames of 720x576 (PAL) pixels. > +The code below is given as an example on how to convert V4L2_PIX_FMT_NV12_16L16 > +to separate Y, U and V planes. This code assumes frames of 720x576 (PAL) pixels. > > The width of a frame is always 720 pixels, regardless of the actual specified > width. > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst > index e762f911737a..adcad9454175 100644 > --- a/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst > +++ b/Documentation/userspace-api/media/v4l/pixfmt-reserved.rst > @@ -48,14 +48,6 @@ please make a proposal on the linux-media mailing list. > - ``V4L2_PIX_FMT_HI240`` > - 'HI24' > - 8 bit RGB format used by the BTTV driver. > - * .. _V4L2-PIX-FMT-HM12: > - > - - ``V4L2_PIX_FMT_HM12`` > - - 'HM12' > - - YUV 4:2:0 format used by the IVTV driver. > - > - The format is documented in the kernel sources in the file > - ``Documentation/userspace-api/media/drivers/cx2341x-uapi.rst`` > * .. _V4L2-PIX-FMT-CPIA1: > > - ``V4L2_PIX_FMT_CPIA1`` > diff --git a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst > index edeaf7628b28..884828f2272c 100644 > --- a/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst > +++ b/Documentation/userspace-api/media/v4l/pixfmt-yuv-planar.rst > @@ -254,6 +254,7 @@ of the luma plane. > > .. _V4L2-PIX-FMT-NV12MT: > .. _V4L2-PIX-FMT-NV12MT-16X16: > +.. _V4L2-PIX-FMT-NV12-16L16: > .. _V4L2-PIX-FMT-NV12-32L32: > > Tiled NV12 > @@ -278,6 +279,11 @@ If the vertical resolution is an odd number of macroblocks, the last row of > macroblocks is stored in linear order. The layouts of the luma and chroma > planes are identical. > > +``V4L2_PIX_FMT_NV12_16L16`` stores pixel in 16x16 tiles, and stores > +tiles linearly in memory. The line stride and image height must be > +aligned to a multiple of 16. The layouts of the luma and chroma planes are > +identical. > + > ``V4L2_PIX_FMT_NV12_32L32`` stores pixel in 32x32 tiles, and stores > tiles linearly in memory. The line stride and image height must be > aligned to a multiple of 32. The layouts of the luma and chroma planes are > diff --git a/drivers/media/pci/cx18/cx18-ioctl.c b/drivers/media/pci/cx18/cx18-ioctl.c > index 4864def20676..ce3f0141f94e 100644 > --- a/drivers/media/pci/cx18/cx18-ioctl.c > +++ b/drivers/media/pci/cx18/cx18-ioctl.c > @@ -276,7 +276,7 @@ static int cx18_s_fmt_vid_cap(struct file *file, void *fh, > s->pixelformat = fmt->fmt.pix.pixelformat; > /* HM12 YUV size is (Y=(h*720) + UV=(h*(720/2))) > UYUV YUV size is (Y=(h*720) + UV=(h*(720))) */ > - if (s->pixelformat == V4L2_PIX_FMT_HM12) { > + if (s->pixelformat == V4L2_PIX_FMT_NV12_16L16) { > s->vb_bytes_per_frame = h * 720 * 3 / 2; > s->vb_bytes_per_line = 720; /* First plane */ > } else { > @@ -470,7 +470,7 @@ static int cx18_enum_fmt_vid_cap(struct file *file, void *fh, > .index = 0, > .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, > .description = "HM12 (YUV 4:1:1)", > - .pixelformat = V4L2_PIX_FMT_HM12, > + .pixelformat = V4L2_PIX_FMT_NV12_16L16, > }, > { > .index = 1, > diff --git a/drivers/media/pci/cx18/cx18-streams.c b/drivers/media/pci/cx18/cx18-streams.c > index c41bae118415..16d37ab48906 100644 > --- a/drivers/media/pci/cx18/cx18-streams.c > +++ b/drivers/media/pci/cx18/cx18-streams.c > @@ -133,7 +133,7 @@ static int cx18_prepare_buffer(struct videobuf_queue *q, > > /* HM12 YUV size is (Y=(h*720) + UV=(h*(720/2))) > UYUV YUV size is (Y=(h*720) + UV=(h*(720))) */ > - if (s->pixelformat == V4L2_PIX_FMT_HM12) > + if (s->pixelformat == V4L2_PIX_FMT_NV12_16L16) > s->vb_bytes_per_frame = height * 720 * 3 / 2; > else > s->vb_bytes_per_frame = height * 720 * 2; > @@ -155,7 +155,7 @@ static int cx18_prepare_buffer(struct videobuf_queue *q, > > /* HM12 YUV size is (Y=(h*720) + UV=(h*(720/2))) > UYUV YUV size is (Y=(h*720) + UV=(h*(720))) */ > - if (s->pixelformat == V4L2_PIX_FMT_HM12) > + if (s->pixelformat == V4L2_PIX_FMT_NV12_16L16) > s->vb_bytes_per_frame = height * 720 * 3 / 2; > else > s->vb_bytes_per_frame = height * 720 * 2; > @@ -287,7 +287,7 @@ static void cx18_stream_init(struct cx18 *cx, int type) > s, &cx->serialize_lock); > > /* Assume the previous pixel default */ > - s->pixelformat = V4L2_PIX_FMT_HM12; > + s->pixelformat = V4L2_PIX_FMT_NV12_16L16; > s->vb_bytes_per_frame = cx->cxhdl.height * 720 * 3 / 2; > s->vb_bytes_per_line = 720; > } > @@ -733,7 +733,7 @@ static void cx18_stream_configure_mdls(struct cx18_stream *s) > * Set the MDL size to the exact size needed for one frame. > * Use enough buffers per MDL to cover the MDL size > */ > - if (s->pixelformat == V4L2_PIX_FMT_HM12) > + if (s->pixelformat == V4L2_PIX_FMT_NV12_16L16) > s->mdl_size = 720 * s->cx->cxhdl.height * 3 / 2; > else > s->mdl_size = 720 * s->cx->cxhdl.height * 2; > diff --git a/drivers/media/pci/ivtv/ivtv-ioctl.c b/drivers/media/pci/ivtv/ivtv-ioctl.c > index da19b2e95e6c..0cdf6b3210c2 100644 > --- a/drivers/media/pci/ivtv/ivtv-ioctl.c > +++ b/drivers/media/pci/ivtv/ivtv-ioctl.c > @@ -339,7 +339,7 @@ static int ivtv_g_fmt_vid_cap(struct file *file, void *fh, struct v4l2_format *f > pixfmt->colorspace = V4L2_COLORSPACE_SMPTE170M; > pixfmt->field = V4L2_FIELD_INTERLACED; > if (id->type == IVTV_ENC_STREAM_TYPE_YUV) { > - pixfmt->pixelformat = V4L2_PIX_FMT_HM12; > + pixfmt->pixelformat = V4L2_PIX_FMT_NV12_16L16; > /* YUV size is (Y=(h*720) + UV=(h*(720/2))) */ > pixfmt->sizeimage = pixfmt->height * 720 * 3 / 2; > pixfmt->bytesperline = 720; > @@ -417,7 +417,7 @@ static int ivtv_g_fmt_vid_out(struct file *file, void *fh, struct v4l2_format *f > pixfmt->field = V4L2_FIELD_ANY; > break; > } > - pixfmt->pixelformat = V4L2_PIX_FMT_HM12; > + pixfmt->pixelformat = V4L2_PIX_FMT_NV12_16L16; > pixfmt->bytesperline = 720; > pixfmt->width = itv->yuv_info.v4l2_src_w; > pixfmt->height = itv->yuv_info.v4l2_src_h; > @@ -917,7 +917,7 @@ static int ivtv_enum_fmt_vid_cap(struct file *file, void *fh, struct v4l2_fmtdes > static const struct v4l2_fmtdesc hm12 = { > .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, > .description = "HM12 (YUV 4:2:0)", > - .pixelformat = V4L2_PIX_FMT_HM12, > + .pixelformat = V4L2_PIX_FMT_NV12_16L16, > }; > static const struct v4l2_fmtdesc mpeg = { > .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, > @@ -944,7 +944,7 @@ static int ivtv_enum_fmt_vid_out(struct file *file, void *fh, struct v4l2_fmtdes > static const struct v4l2_fmtdesc hm12 = { > .type = V4L2_BUF_TYPE_VIDEO_OUTPUT, > .description = "HM12 (YUV 4:2:0)", > - .pixelformat = V4L2_PIX_FMT_HM12, > + .pixelformat = V4L2_PIX_FMT_NV12_16L16, > }; > static const struct v4l2_fmtdesc mpeg = { > .type = V4L2_BUF_TYPE_VIDEO_OUTPUT, > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c > index 27935f1e9555..68698fc51921 100644 > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.c > @@ -61,7 +61,7 @@ bool sun6i_csi_is_format_supported(struct sun6i_csi *csi, > || sdev->csi.v4l2_ep.bus_type == V4L2_MBUS_BT656) > && sdev->csi.v4l2_ep.bus.parallel.bus_width == 16) { > switch (pixformat) { > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > case V4L2_PIX_FMT_NV12: > case V4L2_PIX_FMT_NV21: > case V4L2_PIX_FMT_NV16: > @@ -124,7 +124,7 @@ bool sun6i_csi_is_format_supported(struct sun6i_csi *csi, > case V4L2_PIX_FMT_VYUY: > return (mbus_code == MEDIA_BUS_FMT_VYUY8_2X8); > > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > case V4L2_PIX_FMT_NV12: > case V4L2_PIX_FMT_NV21: > case V4L2_PIX_FMT_NV16: > @@ -269,7 +269,7 @@ static enum csi_output_fmt get_csi_output_format(struct sun6i_csi_dev *sdev, > case V4L2_PIX_FMT_VYUY: > return buf_interlaced ? CSI_FRAME_RAW_8 : CSI_FIELD_RAW_8; > > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > return buf_interlaced ? CSI_FRAME_MB_YUV420 : > CSI_FIELD_MB_YUV420; > case V4L2_PIX_FMT_NV12: > @@ -311,7 +311,7 @@ static enum csi_input_seq get_csi_input_seq(struct sun6i_csi_dev *sdev, > return 0; > > switch (pixformat) { > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > case V4L2_PIX_FMT_NV12: > case V4L2_PIX_FMT_NV16: > case V4L2_PIX_FMT_YUV420: > @@ -526,7 +526,7 @@ static void sun6i_csi_set_window(struct sun6i_csi_dev *sdev) > > planar_offset[0] = 0; > switch (config->pixelformat) { > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > case V4L2_PIX_FMT_NV12: > case V4L2_PIX_FMT_NV21: > case V4L2_PIX_FMT_NV16: > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h > index c626821aaedb..3a38d107ae3f 100644 > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_csi.h > @@ -105,7 +105,7 @@ static inline int sun6i_csi_get_bpp(unsigned int pixformat) > case V4L2_PIX_FMT_SGBRG12: > case V4L2_PIX_FMT_SGRBG12: > case V4L2_PIX_FMT_SRGGB12: > - case V4L2_PIX_FMT_HM12: > + case V4L2_PIX_FMT_NV12_16L16: > case V4L2_PIX_FMT_NV12: > case V4L2_PIX_FMT_NV21: > case V4L2_PIX_FMT_YUV420: > diff --git a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > index 07b2161392d2..33459892c1a9 100644 > --- a/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > +++ b/drivers/media/platform/sunxi/sun6i-csi/sun6i_video.c > @@ -48,7 +48,7 @@ static const u32 supported_pixformats[] = { > V4L2_PIX_FMT_YVYU, > V4L2_PIX_FMT_UYVY, > V4L2_PIX_FMT_VYUY, > - V4L2_PIX_FMT_HM12, > + V4L2_PIX_FMT_NV12_16L16, > V4L2_PIX_FMT_NV12, > V4L2_PIX_FMT_NV21, > V4L2_PIX_FMT_YUV420, > diff --git a/drivers/media/v4l2-core/v4l2-ioctl.c b/drivers/media/v4l2-core/v4l2-ioctl.c > index 0aaeb79d7a22..9a4195dcd2aa 100644 > --- a/drivers/media/v4l2-core/v4l2-ioctl.c > +++ b/drivers/media/v4l2-core/v4l2-ioctl.c > @@ -1274,7 +1274,6 @@ static void v4l_fill_fmtdesc(struct v4l2_fmtdesc *fmt) > case V4L2_PIX_FMT_YUV410: descr = "Planar YUV 4:1:0"; break; > 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_HM12: descr = "YUV 4:2:0 (16x16 Macroblocks)"; break; > case V4L2_PIX_FMT_M420: descr = "YUV 4:2:0 (M420)"; break; > case V4L2_PIX_FMT_NV12: descr = "Y/CbCr 4:2:0"; break; > case V4L2_PIX_FMT_NV21: descr = "Y/CrCb 4:2:0"; break; > @@ -1282,6 +1281,7 @@ 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_NV12_16L16: descr = "Y/CbCr 4:2:0 (16x16 linear tiles)"; break; > case V4L2_PIX_FMT_NV12_32L32: descr = "Y/CbCr 4:2:0 (32x32 linear tiles)"; 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; > diff --git a/include/uapi/linux/videodev2.h b/include/uapi/linux/videodev2.h > index 97cfcc861865..60abed3243f3 100644 > --- a/include/uapi/linux/videodev2.h > +++ b/include/uapi/linux/videodev2.h > @@ -601,7 +601,6 @@ struct v4l2_pix_format { > #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 */ > #define V4L2_PIX_FMT_NV42 v4l2_fourcc('N', 'V', '4', '2') /* 24 Y/CrCb 4:4:4 */ > -#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H', 'M', '1', '2') /* 8 YUV 4:2:0 16x16 macroblocks */ > > /* 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 */ > @@ -628,6 +627,7 @@ struct v4l2_pix_format { > #define V4L2_PIX_FMT_YVU444M v4l2_fourcc('Y', 'M', '4', '2') /* 24 YVU444 planar */ > > /* Tiled YUV formats */ > +#define V4L2_PIX_FMT_NV12_16L16 v4l2_fourcc('H', 'M', '1', '2') /* 12 Y/CbCr 4:2:0 16x16 tiles */ > #define V4L2_PIX_FMT_NV12_32L32 v4l2_fourcc('S', 'T', '1', '2') /* 12 Y/CbCr 4:2:0 32x32 tiles */ > > /* Bayer formats - see http://www.siliconimaging.com/RGB%20Bayer.htm */ > @@ -2619,6 +2619,7 @@ struct v4l2_create_buffers { > > /* Deprecated definitions kept for backwards compatibility */ > #ifdef __KERNEL__ > +#define V4L2_PIX_FMT_HM12 v4l2_fourcc('H', 'M', '1', '2') /* 8 YUV 4:2:0 16x16 macroblocks */ > #define V4L2_PIX_FMT_SUNXI_TILED_NV12 v4l2_fourcc('S', 'T', '1', '2') /* Sunxi Tiled NV12 Format */ > #endif > >