media: imx: utils: Introduce PIXFMT_SEL_IPU
Add a PIXFMT_SEL_IPU selection flag, to select only the IPU-internal pixel formats, and move the single-entry IPU-internal pixel format arrays into pixel_formats[]. imx_media_find_ipu_format() and imx_media_enum_ipu_format() can now simply call find_format() and enum_format(). The RGB32 format is both an IPU-internal format, and an in-memory format via idmac channels that is supported by the IPUv3 driver, so it appears twice in pixel_formats[], one with ipufmt=false for the in-memory format, and again with ipufmt=true for the IPU-internal format. Signed-off-by: Steve Longerbeam <slongerbeam@gmail.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl> Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
This commit is contained in:
parent
a7d5003cab
commit
f0f71ae440
@ -53,6 +53,12 @@ static const struct imx_media_pixfmt pixel_formats[] = {
|
|||||||
.cs = IPUV3_COLORSPACE_YUV,
|
.cs = IPUV3_COLORSPACE_YUV,
|
||||||
.bpp = 16,
|
.bpp = 16,
|
||||||
.planar = true,
|
.planar = true,
|
||||||
|
}, {
|
||||||
|
.fourcc = V4L2_PIX_FMT_YUV32,
|
||||||
|
.codes = {MEDIA_BUS_FMT_AYUV8_1X32},
|
||||||
|
.cs = IPUV3_COLORSPACE_YUV,
|
||||||
|
.bpp = 32,
|
||||||
|
.ipufmt = true,
|
||||||
},
|
},
|
||||||
/*** RGB formats start here ***/
|
/*** RGB formats start here ***/
|
||||||
{
|
{
|
||||||
@ -73,6 +79,11 @@ static const struct imx_media_pixfmt pixel_formats[] = {
|
|||||||
.fourcc = V4L2_PIX_FMT_BGR24,
|
.fourcc = V4L2_PIX_FMT_BGR24,
|
||||||
.cs = IPUV3_COLORSPACE_RGB,
|
.cs = IPUV3_COLORSPACE_RGB,
|
||||||
.bpp = 24,
|
.bpp = 24,
|
||||||
|
}, {
|
||||||
|
.fourcc = V4L2_PIX_FMT_XRGB32,
|
||||||
|
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
|
||||||
|
.cs = IPUV3_COLORSPACE_RGB,
|
||||||
|
.bpp = 32,
|
||||||
}, {
|
}, {
|
||||||
.fourcc = V4L2_PIX_FMT_XRGB32,
|
.fourcc = V4L2_PIX_FMT_XRGB32,
|
||||||
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
|
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
|
||||||
@ -186,42 +197,24 @@ static const struct imx_media_pixfmt pixel_formats[] = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct imx_media_pixfmt ipu_yuv_formats[] = {
|
|
||||||
{
|
|
||||||
.fourcc = V4L2_PIX_FMT_YUV32,
|
|
||||||
.codes = {MEDIA_BUS_FMT_AYUV8_1X32},
|
|
||||||
.cs = IPUV3_COLORSPACE_YUV,
|
|
||||||
.bpp = 32,
|
|
||||||
.ipufmt = true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM_IPU_YUV_FORMATS ARRAY_SIZE(ipu_yuv_formats)
|
|
||||||
|
|
||||||
static const struct imx_media_pixfmt ipu_rgb_formats[] = {
|
|
||||||
{
|
|
||||||
.fourcc = V4L2_PIX_FMT_XRGB32,
|
|
||||||
.codes = {MEDIA_BUS_FMT_ARGB8888_1X32},
|
|
||||||
.cs = IPUV3_COLORSPACE_RGB,
|
|
||||||
.bpp = 32,
|
|
||||||
.ipufmt = true,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
#define NUM_IPU_RGB_FORMATS ARRAY_SIZE(ipu_rgb_formats)
|
|
||||||
|
|
||||||
static const struct imx_media_pixfmt *find_format(u32 fourcc,
|
static const struct imx_media_pixfmt *find_format(u32 fourcc,
|
||||||
u32 code,
|
u32 code,
|
||||||
enum imx_pixfmt_sel fmt_sel,
|
enum imx_pixfmt_sel fmt_sel,
|
||||||
bool allow_non_mbus)
|
bool allow_non_mbus)
|
||||||
{
|
{
|
||||||
|
bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
fmt_sel &= ~PIXFMT_SEL_IPU;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
|
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
|
||||||
const struct imx_media_pixfmt *fmt = &pixel_formats[i];
|
const struct imx_media_pixfmt *fmt = &pixel_formats[i];
|
||||||
enum imx_pixfmt_sel sel;
|
enum imx_pixfmt_sel sel;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
|
if (sel_ipu != fmt->ipufmt)
|
||||||
|
continue;
|
||||||
|
|
||||||
sel = fmt->bayer ? PIXFMT_SEL_BAYER :
|
sel = fmt->bayer ? PIXFMT_SEL_BAYER :
|
||||||
((fmt->cs == IPUV3_COLORSPACE_YUV) ?
|
((fmt->cs == IPUV3_COLORSPACE_YUV) ?
|
||||||
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
|
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
|
||||||
@ -249,13 +242,19 @@ static int enum_format(u32 *fourcc, u32 *code, u32 index,
|
|||||||
enum imx_pixfmt_sel fmt_sel,
|
enum imx_pixfmt_sel fmt_sel,
|
||||||
bool allow_non_mbus)
|
bool allow_non_mbus)
|
||||||
{
|
{
|
||||||
|
bool sel_ipu = fmt_sel & PIXFMT_SEL_IPU;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
|
fmt_sel &= ~PIXFMT_SEL_IPU;
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
|
for (i = 0; i < ARRAY_SIZE(pixel_formats); i++) {
|
||||||
const struct imx_media_pixfmt *fmt = &pixel_formats[i];
|
const struct imx_media_pixfmt *fmt = &pixel_formats[i];
|
||||||
enum imx_pixfmt_sel sel;
|
enum imx_pixfmt_sel sel;
|
||||||
unsigned int j;
|
unsigned int j;
|
||||||
|
|
||||||
|
if (sel_ipu != fmt->ipufmt)
|
||||||
|
continue;
|
||||||
|
|
||||||
sel = fmt->bayer ? PIXFMT_SEL_BAYER :
|
sel = fmt->bayer ? PIXFMT_SEL_BAYER :
|
||||||
((fmt->cs == IPUV3_COLORSPACE_YUV) ?
|
((fmt->cs == IPUV3_COLORSPACE_YUV) ?
|
||||||
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
|
PIXFMT_SEL_YUV : PIXFMT_SEL_RGB);
|
||||||
@ -317,79 +316,14 @@ EXPORT_SYMBOL_GPL(imx_media_enum_mbus_format);
|
|||||||
const struct imx_media_pixfmt *
|
const struct imx_media_pixfmt *
|
||||||
imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel)
|
imx_media_find_ipu_format(u32 code, enum imx_pixfmt_sel fmt_sel)
|
||||||
{
|
{
|
||||||
const struct imx_media_pixfmt *array, *fmt, *ret = NULL;
|
return find_format(0, code, fmt_sel | PIXFMT_SEL_IPU, false);
|
||||||
u32 array_size;
|
|
||||||
int i, j;
|
|
||||||
|
|
||||||
fmt_sel &= ~PIXFMT_SEL_BAYER;
|
|
||||||
|
|
||||||
switch (fmt_sel) {
|
|
||||||
case PIXFMT_SEL_YUV:
|
|
||||||
array_size = NUM_IPU_YUV_FORMATS;
|
|
||||||
array = ipu_yuv_formats;
|
|
||||||
break;
|
|
||||||
case PIXFMT_SEL_RGB:
|
|
||||||
array_size = NUM_IPU_RGB_FORMATS;
|
|
||||||
array = ipu_rgb_formats;
|
|
||||||
break;
|
|
||||||
case PIXFMT_SEL_YUV_RGB:
|
|
||||||
array_size = NUM_IPU_YUV_FORMATS + NUM_IPU_RGB_FORMATS;
|
|
||||||
array = ipu_yuv_formats;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < array_size; i++) {
|
|
||||||
if (fmt_sel == PIXFMT_SEL_YUV_RGB && i >= NUM_IPU_YUV_FORMATS)
|
|
||||||
fmt = &ipu_rgb_formats[i - NUM_IPU_YUV_FORMATS];
|
|
||||||
else
|
|
||||||
fmt = &array[i];
|
|
||||||
|
|
||||||
for (j = 0; code && fmt->codes[j]; j++) {
|
|
||||||
if (code == fmt->codes[j]) {
|
|
||||||
ret = fmt;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(imx_media_find_ipu_format);
|
EXPORT_SYMBOL_GPL(imx_media_find_ipu_format);
|
||||||
|
|
||||||
int imx_media_enum_ipu_format(u32 *code, u32 index,
|
int imx_media_enum_ipu_format(u32 *code, u32 index,
|
||||||
enum imx_pixfmt_sel fmt_sel)
|
enum imx_pixfmt_sel fmt_sel)
|
||||||
{
|
{
|
||||||
fmt_sel &= ~PIXFMT_SEL_BAYER;
|
return enum_format(NULL, code, index, fmt_sel | PIXFMT_SEL_IPU, false);
|
||||||
|
|
||||||
switch (fmt_sel) {
|
|
||||||
case PIXFMT_SEL_YUV:
|
|
||||||
if (index >= NUM_IPU_YUV_FORMATS)
|
|
||||||
return -EINVAL;
|
|
||||||
*code = ipu_yuv_formats[index].codes[0];
|
|
||||||
break;
|
|
||||||
case PIXFMT_SEL_RGB:
|
|
||||||
if (index >= NUM_IPU_RGB_FORMATS)
|
|
||||||
return -EINVAL;
|
|
||||||
*code = ipu_rgb_formats[index].codes[0];
|
|
||||||
break;
|
|
||||||
case PIXFMT_SEL_YUV_RGB:
|
|
||||||
if (index >= NUM_IPU_YUV_FORMATS + NUM_IPU_RGB_FORMATS)
|
|
||||||
return -EINVAL;
|
|
||||||
if (index >= NUM_IPU_YUV_FORMATS) {
|
|
||||||
index -= NUM_IPU_YUV_FORMATS;
|
|
||||||
*code = ipu_rgb_formats[index].codes[0];
|
|
||||||
} else {
|
|
||||||
*code = ipu_yuv_formats[index].codes[0];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(imx_media_enum_ipu_format);
|
EXPORT_SYMBOL_GPL(imx_media_enum_ipu_format);
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ enum imx_pixfmt_sel {
|
|||||||
PIXFMT_SEL_YUV = BIT(0), /* select YUV formats */
|
PIXFMT_SEL_YUV = BIT(0), /* select YUV formats */
|
||||||
PIXFMT_SEL_RGB = BIT(1), /* select RGB formats */
|
PIXFMT_SEL_RGB = BIT(1), /* select RGB formats */
|
||||||
PIXFMT_SEL_BAYER = BIT(2), /* select BAYER formats */
|
PIXFMT_SEL_BAYER = BIT(2), /* select BAYER formats */
|
||||||
|
PIXFMT_SEL_IPU = BIT(3), /* select IPU-internal formats */
|
||||||
PIXFMT_SEL_YUV_RGB = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB,
|
PIXFMT_SEL_YUV_RGB = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB,
|
||||||
PIXFMT_SEL_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER,
|
PIXFMT_SEL_ANY = PIXFMT_SEL_YUV | PIXFMT_SEL_RGB | PIXFMT_SEL_BAYER,
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user