[media] V4L: soc-camera: avoid huge arrays, caused by changed format codes

Recently mediabus pixel format codes have become a part of the user-
space API, at which time their values also have been changed from
contiguous numbers, running from 0 to sparse numbers with values
around 0x1000, 0x2000, 0x3000... This made them unsuitable for the
use as array indices. This patch switches soc-camera internal format
look-ups to not depend on values of those macros.

Signed-off-by: Guennadi Liakhovetski <g.liakhovetski@gmx.de>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Guennadi Liakhovetski 2011-05-13 13:21:36 -03:00 committed by Mauro Carvalho Chehab
parent ee1b6f4bf3
commit 93f116d595
2 changed files with 83 additions and 24 deletions

View File

@ -15,128 +15,161 @@
#include <media/v4l2-mediabus.h> #include <media/v4l2-mediabus.h>
#include <media/soc_mediabus.h> #include <media/soc_mediabus.h>
#define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1) static const struct soc_mbus_lookup mbus_fmt[] = {
{
static const struct soc_mbus_pixelfmt mbus_fmt[] = { .code = V4L2_MBUS_FMT_YUYV8_2X8,
[MBUS_IDX(YUYV8_2X8)] = { .fmt = {
.fourcc = V4L2_PIX_FMT_YUYV, .fourcc = V4L2_PIX_FMT_YUYV,
.name = "YUYV", .name = "YUYV",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(YVYU8_2X8)] = { }, {
.code = V4L2_MBUS_FMT_YVYU8_2X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_YVYU, .fourcc = V4L2_PIX_FMT_YVYU,
.name = "YVYU", .name = "YVYU",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(UYVY8_2X8)] = { }, {
.code = V4L2_MBUS_FMT_UYVY8_2X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_UYVY, .fourcc = V4L2_PIX_FMT_UYVY,
.name = "UYVY", .name = "UYVY",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(VYUY8_2X8)] = { }, {
.code = V4L2_MBUS_FMT_VYUY8_2X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_VYUY, .fourcc = V4L2_PIX_FMT_VYUY,
.name = "VYUY", .name = "VYUY",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(RGB555_2X8_PADHI_LE)] = { }, {
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE,
.fmt = {
.fourcc = V4L2_PIX_FMT_RGB555, .fourcc = V4L2_PIX_FMT_RGB555,
.name = "RGB555", .name = "RGB555",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(RGB555_2X8_PADHI_BE)] = { }, {
.code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE,
.fmt = {
.fourcc = V4L2_PIX_FMT_RGB555X, .fourcc = V4L2_PIX_FMT_RGB555X,
.name = "RGB555X", .name = "RGB555X",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(RGB565_2X8_LE)] = { }, {
.code = V4L2_MBUS_FMT_RGB565_2X8_LE,
.fmt = {
.fourcc = V4L2_PIX_FMT_RGB565, .fourcc = V4L2_PIX_FMT_RGB565,
.name = "RGB565", .name = "RGB565",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(RGB565_2X8_BE)] = { }, {
.code = V4L2_MBUS_FMT_RGB565_2X8_BE,
.fmt = {
.fourcc = V4L2_PIX_FMT_RGB565X, .fourcc = V4L2_PIX_FMT_RGB565X,
.name = "RGB565X", .name = "RGB565X",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(SBGGR8_1X8)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR8_1X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR8, .fourcc = V4L2_PIX_FMT_SBGGR8,
.name = "Bayer 8 BGGR", .name = "Bayer 8 BGGR",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_NONE, .packing = SOC_MBUS_PACKING_NONE,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(SBGGR10_1X10)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR10_1X10,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR10, .fourcc = V4L2_PIX_FMT_SBGGR10,
.name = "Bayer 10 BGGR", .name = "Bayer 10 BGGR",
.bits_per_sample = 10, .bits_per_sample = 10,
.packing = SOC_MBUS_PACKING_EXTEND16, .packing = SOC_MBUS_PACKING_EXTEND16,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(Y8_1X8)] = { }, {
.code = V4L2_MBUS_FMT_Y8_1X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_GREY, .fourcc = V4L2_PIX_FMT_GREY,
.name = "Grey", .name = "Grey",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_NONE, .packing = SOC_MBUS_PACKING_NONE,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(Y10_1X10)] = { }, {
.code = V4L2_MBUS_FMT_Y10_1X10,
.fmt = {
.fourcc = V4L2_PIX_FMT_Y10, .fourcc = V4L2_PIX_FMT_Y10,
.name = "Grey 10bit", .name = "Grey 10bit",
.bits_per_sample = 10, .bits_per_sample = 10,
.packing = SOC_MBUS_PACKING_EXTEND16, .packing = SOC_MBUS_PACKING_EXTEND16,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR10, .fourcc = V4L2_PIX_FMT_SBGGR10,
.name = "Bayer 10 BGGR", .name = "Bayer 10 BGGR",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR10, .fourcc = V4L2_PIX_FMT_SBGGR10,
.name = "Bayer 10 BGGR", .name = "Bayer 10 BGGR",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADLO, .packing = SOC_MBUS_PACKING_2X8_PADLO,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
[MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR10, .fourcc = V4L2_PIX_FMT_SBGGR10,
.name = "Bayer 10 BGGR", .name = "Bayer 10 BGGR",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADHI, .packing = SOC_MBUS_PACKING_2X8_PADHI,
.order = SOC_MBUS_ORDER_BE, .order = SOC_MBUS_ORDER_BE,
}, },
[MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = { }, {
.code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE,
.fmt = {
.fourcc = V4L2_PIX_FMT_SBGGR10, .fourcc = V4L2_PIX_FMT_SBGGR10,
.name = "Bayer 10 BGGR", .name = "Bayer 10 BGGR",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_2X8_PADLO, .packing = SOC_MBUS_PACKING_2X8_PADLO,
.order = SOC_MBUS_ORDER_BE, .order = SOC_MBUS_ORDER_BE,
}, },
[MBUS_IDX(JPEG_1X8)] = { }, {
.code = V4L2_MBUS_FMT_JPEG_1X8,
.fmt = {
.fourcc = V4L2_PIX_FMT_JPEG, .fourcc = V4L2_PIX_FMT_JPEG,
.name = "JPEG", .name = "JPEG",
.bits_per_sample = 8, .bits_per_sample = 8,
.packing = SOC_MBUS_PACKING_VARIABLE, .packing = SOC_MBUS_PACKING_VARIABLE,
.order = SOC_MBUS_ORDER_LE, .order = SOC_MBUS_ORDER_LE,
}, },
},
}; };
int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf) int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf)
@ -171,13 +204,25 @@ s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf)
} }
EXPORT_SYMBOL(soc_mbus_bytes_per_line); EXPORT_SYMBOL(soc_mbus_bytes_per_line);
const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
enum v4l2_mbus_pixelcode code,
const struct soc_mbus_lookup *lookup,
int n)
{
int i;
for (i = 0; i < n; i++)
if (lookup[i].code == code)
return &lookup[i].fmt;
return NULL;
}
EXPORT_SYMBOL(soc_mbus_find_fmtdesc);
const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
enum v4l2_mbus_pixelcode code) enum v4l2_mbus_pixelcode code)
{ {
if (code - V4L2_MBUS_FMT_FIXED > ARRAY_SIZE(mbus_fmt) || return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt));
code <= V4L2_MBUS_FMT_FIXED)
return NULL;
return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1;
} }
EXPORT_SYMBOL(soc_mbus_get_fmtdesc); EXPORT_SYMBOL(soc_mbus_get_fmtdesc);

View File

@ -58,6 +58,20 @@ struct soc_mbus_pixelfmt {
u8 bits_per_sample; u8 bits_per_sample;
}; };
/**
* struct soc_mbus_lookup - Lookup FOURCC IDs by mediabus codes for pass-through
* @code: mediabus pixel-code
* @fmt: pixel format description
*/
struct soc_mbus_lookup {
enum v4l2_mbus_pixelcode code;
struct soc_mbus_pixelfmt fmt;
};
const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc(
enum v4l2_mbus_pixelcode code,
const struct soc_mbus_lookup *lookup,
int n);
const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc(
enum v4l2_mbus_pixelcode code); enum v4l2_mbus_pixelcode code);
s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf); s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf);