On 9/12/19 6:01 PM, Philipp Zabel wrote:
> Merge yuv_formats and rgb_formats into a single array. Always loop over
> all entries, skipping those that are incompatible with the requested
> enumeration. This simplifies the code, lets us get rid of the manual
> counting of array entries, and stops accidentally ignoring some non-mbus
> RGB formats.
>
> Before:
>
> $ v4l2-ctl -d /dev/video14 --list-formats-out
> ioctl: VIDIOC_ENUM_FMT
> Type: Video Output
>
> [0]: 'UYVY' (UYVY 4:2:2)
> [1]: 'YUYV' (YUYV 4:2:2)
> [2]: 'YU12' (Planar YUV 4:2:0)
> [3]: 'YV12' (Planar YVU 4:2:0)
> [4]: '422P' (Planar YUV 4:2:2)
> [5]: 'NV12' (Y/CbCr 4:2:0)
> [6]: 'NV16' (Y/CbCr 4:2:2)
> [7]: 'RGBP' (16-bit RGB 5-6-5)
> [8]: 'RGB3' (24-bit RGB 8-8-8)
> [9]: 'BX24' (32-bit XRGB 8-8-8-8)
>
> After:
>
> $ v4l2-ctl -d /dev/video14 --list-formats-out
> ioctl: VIDIOC_ENUM_FMT
> Type: Video Output
>
> [0]: 'UYVY' (UYVY 4:2:2)
> [1]: 'YUYV' (YUYV 4:2:2)
> [2]: 'YU12' (Planar YUV 4:2:0)
> [3]: 'YV12' (Planar YVU 4:2:0)
> [4]: '422P' (Planar YUV 4:2:2)
> [5]: 'NV12' (Y/CbCr 4:2:0)
> [6]: 'NV16' (Y/CbCr 4:2:2)
> [7]: 'RGBP' (16-bit RGB 5-6-5)
> [8]: 'RGB3' (24-bit RGB 8-8-8)
> [9]: 'BGR3' (24-bit BGR 8-8-8)
> [10]: 'BX24' (32-bit XRGB 8-8-8-8)
> [11]: 'XR24' (32-bit BGRX 8-8-8-8)
> [12]: 'RX24' (32-bit XBGR 8-8-8-8)
> [13]: 'XB24' (32-bit RGBX 8-8-8-8)
>
> Signed-off-by: Philipp Zabel <[email protected]>
> ---
> drivers/staging/media/imx/imx-media-utils.c | 170 ++++++--------------
> 1 file changed, 45 insertions(+), 125 deletions(-)
>
> diff --git a/drivers/staging/media/imx/imx-media-utils.c
> b/drivers/staging/media/imx/imx-media-utils.c
> index 0788a1874557..d61a8f4533dc 100644
> --- a/drivers/staging/media/imx/imx-media-utils.c
> +++ b/drivers/staging/media/imx/imx-media-utils.c
> @@ -9,12 +9,9 @@
>
> /*
> * List of supported pixel formats for the subdevs.
> - *
> - * In all of these tables, the non-mbus formats (with no
> - * mbus codes) must all fall at the end of the table.
> */
> -
> -static const struct imx_media_pixfmt yuv_formats[] = {
> +static const struct imx_media_pixfmt pixel_formats[] = {
> + /*** YUV formats start here ***/
> {
> .fourcc = V4L2_PIX_FMT_UYVY,
> .codes = {
> @@ -31,12 +28,7 @@ static const struct imx_media_pixfmt yuv_formats[] = {
> },
> .cs = IPUV3_COLORSPACE_YUV,
> .bpp = 16,
> - },
> - /***
> - * non-mbus YUV formats start here. NOTE! when adding non-mbus
> - * formats, NUM_NON_MBUS_YUV_FORMATS must be updated below.
> - ***/
> - {
> + }, {
> .fourcc = V4L2_PIX_FMT_YUV420,
> .cs = IPUV3_COLORSPACE_YUV,
> .bpp = 12,
> @@ -62,13 +54,7 @@ static const struct imx_media_pixfmt yuv_formats[] = {
> .bpp = 16,
> .planar = true,
> },
> -};
> -
> -#define NUM_NON_MBUS_YUV_FORMATS 5
> -#define NUM_YUV_FORMATS ARRAY_SIZE(yuv_formats)
> -#define NUM_MBUS_YUV_FORMATS (NUM_YUV_FORMATS - NUM_NON_MBUS_YUV_FORMATS)
> -
> -static const struct imx_media_pixfmt rgb_formats[] = {
> + /*** RGB formats start here ***/
> {
> .fourcc = V4L2_PIX_FMT_RGB565,
> .codes = {MEDIA_BUS_FMT_RGB565_2X8_LE},
> @@ -83,12 +69,28 @@ static const struct imx_media_pixfmt rgb_formats[] = {
> },
> .cs = IPUV3_COLORSPACE_RGB,
> .bpp = 24,
> + }, {
> + .fourcc = V4L2_PIX_FMT_BGR24,
> + .cs = IPUV3_COLORSPACE_RGB,
> + .bpp = 24,
> }, {
> .fourcc = V4L2_PIX_FMT_XRGB32,
> .codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
> .cs = IPUV3_COLORSPACE_RGB,
> .bpp = 32,
> .ipufmt = true,
> + }, {
> + .fourcc = V4L2_PIX_FMT_XBGR32,
> + .cs = IPUV3_COLORSPACE_RGB,
> + .bpp = 32,
> + }, {
> + .fourcc = V4L2_PIX_FMT_BGRX32,
> + .cs = IPUV3_COLORSPACE_RGB,
> + .bpp = 32,
> + }, {
> + .fourcc = V4L2_PIX_FMT_RGBX32,
> + .cs = IPUV3_COLORSPACE_RGB,
> + .bpp = 32,
> },
> /*** raw bayer and grayscale formats start here ***/
> {
> @@ -175,33 +177,8 @@ static const struct imx_media_pixfmt rgb_formats[] = {
> .bpp = 16,
> .bayer = true,
> },
> - /***
> - * non-mbus RGB formats start here. NOTE! when adding non-mbus
> - * formats, NUM_NON_MBUS_RGB_FORMATS must be updated below.
> - ***/
> - {
> - .fourcc = V4L2_PIX_FMT_BGR24,
> - .cs = IPUV3_COLORSPACE_RGB,
> - .bpp = 24,
> - }, {
> - .fourcc = V4L2_PIX_FMT_XBGR32,
> - .cs = IPUV3_COLORSPACE_RGB,
> - .bpp = 32,
> - }, {
> - .fourcc = V4L2_PIX_FMT_BGRX32,
> - .cs = IPUV3_COLORSPACE_RGB,
> - .bpp = 32,
> - }, {
> - .fourcc = V4L2_PIX_FMT_RGBX32,
> - .cs = IPUV3_COLORSPACE_RGB,
> - .bpp = 32,
> - },
> };
>
> -#define NUM_NON_MBUS_RGB_FORMATS 2
> -#define NUM_RGB_FORMATS ARRAY_SIZE(rgb_formats)
> -#define NUM_MBUS_RGB_FORMATS (NUM_RGB_FORMATS - NUM_NON_MBUS_RGB_FORMATS)
> -
> static const struct imx_media_pixfmt ipu_yuv_formats[] = {
> {
> .fourcc = V4L2_PIX_FMT_YUV32,
> @@ -240,20 +217,20 @@ static void init_mbus_colorimetry(struct
> v4l2_mbus_framefmt *mbus,
> }
>
> static const
> -struct imx_media_pixfmt *__find_format(u32 fourcc,
> - u32 code,
> - bool allow_non_mbus,
> - bool allow_bayer,
> - const struct imx_media_pixfmt *array,
> - u32 array_size)
> +struct imx_media_pixfmt *find_format(u32 fourcc,
> + u32 code,
> + enum codespace_sel cs_sel,
> + bool allow_non_mbus,
> + bool allow_bayer)
> {
> const struct imx_media_pixfmt *fmt;
> int i, j;
>
> - for (i = 0; i < array_size; i++) {
> - fmt = &array[i];
> + for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
> + fmt = &pixel_formats[i];
>
> - if ((!allow_non_mbus && !fmt->codes[0]) ||
> + if ((cs_sel != CS_SEL_ANY && fmt->cs != cs_sel) ||
I'm getting this compiler warnings:
drivers/staging/media/imx/imx-media-utils.c: In function ‘find_format’:
drivers/staging/media/imx/imx-media-utils.c:232:40: warning: comparison between
‘const enum ipu_color_space’ and ‘enum codespace_sel’
[-Wenum-compare]
232 | if ((cs_sel != CS_SEL_ANY && fmt->cs != cs_sel) ||
| ^~
> + (!allow_non_mbus && !fmt->codes[0]) ||
> (!allow_bayer && fmt->bayer))
> continue;
>
> @@ -263,7 +240,7 @@ struct imx_media_pixfmt *__find_format(u32 fourcc,
> if (!code)
> continue;
>
> - for (j = 0; fmt->codes[j]; j++) {
> + for (j = 0; j < ARRAY_SIZE(fmt->codes) && fmt->codes[j]; j++) {
> if (code == fmt->codes[j])
> return fmt;
> }
> @@ -271,86 +248,29 @@ struct imx_media_pixfmt *__find_format(u32 fourcc,
> return NULL;
> }
>
> -static const struct imx_media_pixfmt *find_format(u32 fourcc,
> - u32 code,
> - enum codespace_sel cs_sel,
> - bool allow_non_mbus,
> - bool allow_bayer)
> -{
> - const struct imx_media_pixfmt *ret;
> -
> - switch (cs_sel) {
> - case CS_SEL_YUV:
> - return __find_format(fourcc, code, allow_non_mbus, allow_bayer,
> - yuv_formats, NUM_YUV_FORMATS);
> - case CS_SEL_RGB:
> - return __find_format(fourcc, code, allow_non_mbus, allow_bayer,
> - rgb_formats, NUM_RGB_FORMATS);
> - case CS_SEL_ANY:
> - ret = __find_format(fourcc, code, allow_non_mbus, allow_bayer,
> - yuv_formats, NUM_YUV_FORMATS);
> - if (ret)
> - return ret;
> - return __find_format(fourcc, code, allow_non_mbus, allow_bayer,
> - rgb_formats, NUM_RGB_FORMATS);
> - default:
> - return NULL;
> - }
> -}
> -
> static int enum_format(u32 *fourcc, u32 *code, u32 index,
> enum codespace_sel cs_sel,
> bool allow_non_mbus,
> bool allow_bayer)
> {
> const struct imx_media_pixfmt *fmt;
> - u32 mbus_yuv_sz = NUM_MBUS_YUV_FORMATS;
> - u32 mbus_rgb_sz = NUM_MBUS_RGB_FORMATS;
> - u32 yuv_sz = NUM_YUV_FORMATS;
> - u32 rgb_sz = NUM_RGB_FORMATS;
> + unsigned int i, j = 0;
>
> - switch (cs_sel) {
> - case CS_SEL_YUV:
> - if (index >= yuv_sz ||
> - (!allow_non_mbus && index >= mbus_yuv_sz))
> - return -EINVAL;
> - fmt = &yuv_formats[index];
> - break;
> - case CS_SEL_RGB:
> - if (index >= rgb_sz ||
> - (!allow_non_mbus && index >= mbus_rgb_sz))
> - return -EINVAL;
> - fmt = &rgb_formats[index];
> - if (!allow_bayer && fmt->bayer)
> - return -EINVAL;
> - break;
> - case CS_SEL_ANY:
> - if (!allow_non_mbus) {
> - if (index >= mbus_yuv_sz) {
> - index -= mbus_yuv_sz;
> - if (index >= mbus_rgb_sz)
> - return -EINVAL;
> - fmt = &rgb_formats[index];
> - if (!allow_bayer && fmt->bayer)
> - return -EINVAL;
> - } else {
> - fmt = &yuv_formats[index];
> - }
> - } else {
> - if (index >= yuv_sz + rgb_sz)
> - return -EINVAL;
> - if (index >= yuv_sz) {
> - fmt = &rgb_formats[index - yuv_sz];
> - if (!allow_bayer && fmt->bayer)
> - return -EINVAL;
> - } else {
> - fmt = &yuv_formats[index];
> - }
> - }
> - break;
> - default:
> - return -EINVAL;
> + for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
> + fmt = &pixel_formats[i];
> +
> + if ((cs_sel != CS_SEL_ANY && fmt->cs != cs_sel) ||
Same warning here.
I'm dropping this patch, I'll only merge the first patch.
Regards,
Hans
> + (!allow_non_mbus && !fmt->codes[0]) ||
> + (!allow_bayer && fmt->bayer))
> + continue;
> +
> + if (index == j)
> + break;
> +
> + j++;
> }
> + if (i == ARRAY_SIZE(pixel_formats))
> + return -EINVAL;
>
> if (fourcc)
> *fourcc = fmt->fourcc;
>