diff options
author | Guennadi Liakhovetski <g.liakhovetski@gmx.de> | 2011-05-13 12:21:36 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2011-05-20 11:04:22 -0400 |
commit | 93f116d595e9aa7dca5f6507376d6995f217d420 (patch) | |
tree | 683617d71b12678ed976cc5c2eaa7a2e5bcb9d11 | |
parent | ee1b6f4bf3aa827b0daf65d7441e75212604b1c9 (diff) |
[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>
-rw-r--r-- | drivers/media/video/soc_mediabus.c | 93 | ||||
-rw-r--r-- | include/media/soc_mediabus.h | 14 |
2 files changed, 83 insertions, 24 deletions
diff --git a/drivers/media/video/soc_mediabus.c b/drivers/media/video/soc_mediabus.c index 13e86df78e56..1b0018a58804 100644 --- a/drivers/media/video/soc_mediabus.c +++ b/drivers/media/video/soc_mediabus.c | |||
@@ -15,128 +15,161 @@ | |||
15 | #include <media/v4l2-mediabus.h> | 15 | #include <media/v4l2-mediabus.h> |
16 | #include <media/soc_mediabus.h> | 16 | #include <media/soc_mediabus.h> |
17 | 17 | ||
18 | #define MBUS_IDX(f) (V4L2_MBUS_FMT_ ## f - V4L2_MBUS_FMT_FIXED - 1) | 18 | static const struct soc_mbus_lookup mbus_fmt[] = { |
19 | 19 | { | |
20 | static const struct soc_mbus_pixelfmt mbus_fmt[] = { | 20 | .code = V4L2_MBUS_FMT_YUYV8_2X8, |
21 | [MBUS_IDX(YUYV8_2X8)] = { | 21 | .fmt = { |
22 | .fourcc = V4L2_PIX_FMT_YUYV, | 22 | .fourcc = V4L2_PIX_FMT_YUYV, |
23 | .name = "YUYV", | 23 | .name = "YUYV", |
24 | .bits_per_sample = 8, | 24 | .bits_per_sample = 8, |
25 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 25 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
26 | .order = SOC_MBUS_ORDER_LE, | 26 | .order = SOC_MBUS_ORDER_LE, |
27 | }, | 27 | }, |
28 | [MBUS_IDX(YVYU8_2X8)] = { | 28 | }, { |
29 | .code = V4L2_MBUS_FMT_YVYU8_2X8, | ||
30 | .fmt = { | ||
29 | .fourcc = V4L2_PIX_FMT_YVYU, | 31 | .fourcc = V4L2_PIX_FMT_YVYU, |
30 | .name = "YVYU", | 32 | .name = "YVYU", |
31 | .bits_per_sample = 8, | 33 | .bits_per_sample = 8, |
32 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 34 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
33 | .order = SOC_MBUS_ORDER_LE, | 35 | .order = SOC_MBUS_ORDER_LE, |
34 | }, | 36 | }, |
35 | [MBUS_IDX(UYVY8_2X8)] = { | 37 | }, { |
38 | .code = V4L2_MBUS_FMT_UYVY8_2X8, | ||
39 | .fmt = { | ||
36 | .fourcc = V4L2_PIX_FMT_UYVY, | 40 | .fourcc = V4L2_PIX_FMT_UYVY, |
37 | .name = "UYVY", | 41 | .name = "UYVY", |
38 | .bits_per_sample = 8, | 42 | .bits_per_sample = 8, |
39 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 43 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
40 | .order = SOC_MBUS_ORDER_LE, | 44 | .order = SOC_MBUS_ORDER_LE, |
41 | }, | 45 | }, |
42 | [MBUS_IDX(VYUY8_2X8)] = { | 46 | }, { |
47 | .code = V4L2_MBUS_FMT_VYUY8_2X8, | ||
48 | .fmt = { | ||
43 | .fourcc = V4L2_PIX_FMT_VYUY, | 49 | .fourcc = V4L2_PIX_FMT_VYUY, |
44 | .name = "VYUY", | 50 | .name = "VYUY", |
45 | .bits_per_sample = 8, | 51 | .bits_per_sample = 8, |
46 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 52 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
47 | .order = SOC_MBUS_ORDER_LE, | 53 | .order = SOC_MBUS_ORDER_LE, |
48 | }, | 54 | }, |
49 | [MBUS_IDX(RGB555_2X8_PADHI_LE)] = { | 55 | }, { |
56 | .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_LE, | ||
57 | .fmt = { | ||
50 | .fourcc = V4L2_PIX_FMT_RGB555, | 58 | .fourcc = V4L2_PIX_FMT_RGB555, |
51 | .name = "RGB555", | 59 | .name = "RGB555", |
52 | .bits_per_sample = 8, | 60 | .bits_per_sample = 8, |
53 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 61 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
54 | .order = SOC_MBUS_ORDER_LE, | 62 | .order = SOC_MBUS_ORDER_LE, |
55 | }, | 63 | }, |
56 | [MBUS_IDX(RGB555_2X8_PADHI_BE)] = { | 64 | }, { |
65 | .code = V4L2_MBUS_FMT_RGB555_2X8_PADHI_BE, | ||
66 | .fmt = { | ||
57 | .fourcc = V4L2_PIX_FMT_RGB555X, | 67 | .fourcc = V4L2_PIX_FMT_RGB555X, |
58 | .name = "RGB555X", | 68 | .name = "RGB555X", |
59 | .bits_per_sample = 8, | 69 | .bits_per_sample = 8, |
60 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 70 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
61 | .order = SOC_MBUS_ORDER_LE, | 71 | .order = SOC_MBUS_ORDER_LE, |
62 | }, | 72 | }, |
63 | [MBUS_IDX(RGB565_2X8_LE)] = { | 73 | }, { |
74 | .code = V4L2_MBUS_FMT_RGB565_2X8_LE, | ||
75 | .fmt = { | ||
64 | .fourcc = V4L2_PIX_FMT_RGB565, | 76 | .fourcc = V4L2_PIX_FMT_RGB565, |
65 | .name = "RGB565", | 77 | .name = "RGB565", |
66 | .bits_per_sample = 8, | 78 | .bits_per_sample = 8, |
67 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 79 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
68 | .order = SOC_MBUS_ORDER_LE, | 80 | .order = SOC_MBUS_ORDER_LE, |
69 | }, | 81 | }, |
70 | [MBUS_IDX(RGB565_2X8_BE)] = { | 82 | }, { |
83 | .code = V4L2_MBUS_FMT_RGB565_2X8_BE, | ||
84 | .fmt = { | ||
71 | .fourcc = V4L2_PIX_FMT_RGB565X, | 85 | .fourcc = V4L2_PIX_FMT_RGB565X, |
72 | .name = "RGB565X", | 86 | .name = "RGB565X", |
73 | .bits_per_sample = 8, | 87 | .bits_per_sample = 8, |
74 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 88 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
75 | .order = SOC_MBUS_ORDER_LE, | 89 | .order = SOC_MBUS_ORDER_LE, |
76 | }, | 90 | }, |
77 | [MBUS_IDX(SBGGR8_1X8)] = { | 91 | }, { |
92 | .code = V4L2_MBUS_FMT_SBGGR8_1X8, | ||
93 | .fmt = { | ||
78 | .fourcc = V4L2_PIX_FMT_SBGGR8, | 94 | .fourcc = V4L2_PIX_FMT_SBGGR8, |
79 | .name = "Bayer 8 BGGR", | 95 | .name = "Bayer 8 BGGR", |
80 | .bits_per_sample = 8, | 96 | .bits_per_sample = 8, |
81 | .packing = SOC_MBUS_PACKING_NONE, | 97 | .packing = SOC_MBUS_PACKING_NONE, |
82 | .order = SOC_MBUS_ORDER_LE, | 98 | .order = SOC_MBUS_ORDER_LE, |
83 | }, | 99 | }, |
84 | [MBUS_IDX(SBGGR10_1X10)] = { | 100 | }, { |
101 | .code = V4L2_MBUS_FMT_SBGGR10_1X10, | ||
102 | .fmt = { | ||
85 | .fourcc = V4L2_PIX_FMT_SBGGR10, | 103 | .fourcc = V4L2_PIX_FMT_SBGGR10, |
86 | .name = "Bayer 10 BGGR", | 104 | .name = "Bayer 10 BGGR", |
87 | .bits_per_sample = 10, | 105 | .bits_per_sample = 10, |
88 | .packing = SOC_MBUS_PACKING_EXTEND16, | 106 | .packing = SOC_MBUS_PACKING_EXTEND16, |
89 | .order = SOC_MBUS_ORDER_LE, | 107 | .order = SOC_MBUS_ORDER_LE, |
90 | }, | 108 | }, |
91 | [MBUS_IDX(Y8_1X8)] = { | 109 | }, { |
110 | .code = V4L2_MBUS_FMT_Y8_1X8, | ||
111 | .fmt = { | ||
92 | .fourcc = V4L2_PIX_FMT_GREY, | 112 | .fourcc = V4L2_PIX_FMT_GREY, |
93 | .name = "Grey", | 113 | .name = "Grey", |
94 | .bits_per_sample = 8, | 114 | .bits_per_sample = 8, |
95 | .packing = SOC_MBUS_PACKING_NONE, | 115 | .packing = SOC_MBUS_PACKING_NONE, |
96 | .order = SOC_MBUS_ORDER_LE, | 116 | .order = SOC_MBUS_ORDER_LE, |
97 | }, | 117 | }, |
98 | [MBUS_IDX(Y10_1X10)] = { | 118 | }, { |
119 | .code = V4L2_MBUS_FMT_Y10_1X10, | ||
120 | .fmt = { | ||
99 | .fourcc = V4L2_PIX_FMT_Y10, | 121 | .fourcc = V4L2_PIX_FMT_Y10, |
100 | .name = "Grey 10bit", | 122 | .name = "Grey 10bit", |
101 | .bits_per_sample = 10, | 123 | .bits_per_sample = 10, |
102 | .packing = SOC_MBUS_PACKING_EXTEND16, | 124 | .packing = SOC_MBUS_PACKING_EXTEND16, |
103 | .order = SOC_MBUS_ORDER_LE, | 125 | .order = SOC_MBUS_ORDER_LE, |
104 | }, | 126 | }, |
105 | [MBUS_IDX(SBGGR10_2X8_PADHI_LE)] = { | 127 | }, { |
128 | .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_LE, | ||
129 | .fmt = { | ||
106 | .fourcc = V4L2_PIX_FMT_SBGGR10, | 130 | .fourcc = V4L2_PIX_FMT_SBGGR10, |
107 | .name = "Bayer 10 BGGR", | 131 | .name = "Bayer 10 BGGR", |
108 | .bits_per_sample = 8, | 132 | .bits_per_sample = 8, |
109 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 133 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
110 | .order = SOC_MBUS_ORDER_LE, | 134 | .order = SOC_MBUS_ORDER_LE, |
111 | }, | 135 | }, |
112 | [MBUS_IDX(SBGGR10_2X8_PADLO_LE)] = { | 136 | }, { |
137 | .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_LE, | ||
138 | .fmt = { | ||
113 | .fourcc = V4L2_PIX_FMT_SBGGR10, | 139 | .fourcc = V4L2_PIX_FMT_SBGGR10, |
114 | .name = "Bayer 10 BGGR", | 140 | .name = "Bayer 10 BGGR", |
115 | .bits_per_sample = 8, | 141 | .bits_per_sample = 8, |
116 | .packing = SOC_MBUS_PACKING_2X8_PADLO, | 142 | .packing = SOC_MBUS_PACKING_2X8_PADLO, |
117 | .order = SOC_MBUS_ORDER_LE, | 143 | .order = SOC_MBUS_ORDER_LE, |
118 | }, | 144 | }, |
119 | [MBUS_IDX(SBGGR10_2X8_PADHI_BE)] = { | 145 | }, { |
146 | .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADHI_BE, | ||
147 | .fmt = { | ||
120 | .fourcc = V4L2_PIX_FMT_SBGGR10, | 148 | .fourcc = V4L2_PIX_FMT_SBGGR10, |
121 | .name = "Bayer 10 BGGR", | 149 | .name = "Bayer 10 BGGR", |
122 | .bits_per_sample = 8, | 150 | .bits_per_sample = 8, |
123 | .packing = SOC_MBUS_PACKING_2X8_PADHI, | 151 | .packing = SOC_MBUS_PACKING_2X8_PADHI, |
124 | .order = SOC_MBUS_ORDER_BE, | 152 | .order = SOC_MBUS_ORDER_BE, |
125 | }, | 153 | }, |
126 | [MBUS_IDX(SBGGR10_2X8_PADLO_BE)] = { | 154 | }, { |
155 | .code = V4L2_MBUS_FMT_SBGGR10_2X8_PADLO_BE, | ||
156 | .fmt = { | ||
127 | .fourcc = V4L2_PIX_FMT_SBGGR10, | 157 | .fourcc = V4L2_PIX_FMT_SBGGR10, |
128 | .name = "Bayer 10 BGGR", | 158 | .name = "Bayer 10 BGGR", |
129 | .bits_per_sample = 8, | 159 | .bits_per_sample = 8, |
130 | .packing = SOC_MBUS_PACKING_2X8_PADLO, | 160 | .packing = SOC_MBUS_PACKING_2X8_PADLO, |
131 | .order = SOC_MBUS_ORDER_BE, | 161 | .order = SOC_MBUS_ORDER_BE, |
132 | }, | 162 | }, |
133 | [MBUS_IDX(JPEG_1X8)] = { | 163 | }, { |
164 | .code = V4L2_MBUS_FMT_JPEG_1X8, | ||
165 | .fmt = { | ||
134 | .fourcc = V4L2_PIX_FMT_JPEG, | 166 | .fourcc = V4L2_PIX_FMT_JPEG, |
135 | .name = "JPEG", | 167 | .name = "JPEG", |
136 | .bits_per_sample = 8, | 168 | .bits_per_sample = 8, |
137 | .packing = SOC_MBUS_PACKING_VARIABLE, | 169 | .packing = SOC_MBUS_PACKING_VARIABLE, |
138 | .order = SOC_MBUS_ORDER_LE, | 170 | .order = SOC_MBUS_ORDER_LE, |
139 | }, | 171 | }, |
172 | }, | ||
140 | }; | 173 | }; |
141 | 174 | ||
142 | int soc_mbus_samples_per_pixel(const struct soc_mbus_pixelfmt *mf) | 175 | 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) | |||
171 | } | 204 | } |
172 | EXPORT_SYMBOL(soc_mbus_bytes_per_line); | 205 | EXPORT_SYMBOL(soc_mbus_bytes_per_line); |
173 | 206 | ||
207 | const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc( | ||
208 | enum v4l2_mbus_pixelcode code, | ||
209 | const struct soc_mbus_lookup *lookup, | ||
210 | int n) | ||
211 | { | ||
212 | int i; | ||
213 | |||
214 | for (i = 0; i < n; i++) | ||
215 | if (lookup[i].code == code) | ||
216 | return &lookup[i].fmt; | ||
217 | |||
218 | return NULL; | ||
219 | } | ||
220 | EXPORT_SYMBOL(soc_mbus_find_fmtdesc); | ||
221 | |||
174 | const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( | 222 | const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( |
175 | enum v4l2_mbus_pixelcode code) | 223 | enum v4l2_mbus_pixelcode code) |
176 | { | 224 | { |
177 | if (code - V4L2_MBUS_FMT_FIXED > ARRAY_SIZE(mbus_fmt) || | 225 | return soc_mbus_find_fmtdesc(code, mbus_fmt, ARRAY_SIZE(mbus_fmt)); |
178 | code <= V4L2_MBUS_FMT_FIXED) | ||
179 | return NULL; | ||
180 | return mbus_fmt + code - V4L2_MBUS_FMT_FIXED - 1; | ||
181 | } | 226 | } |
182 | EXPORT_SYMBOL(soc_mbus_get_fmtdesc); | 227 | EXPORT_SYMBOL(soc_mbus_get_fmtdesc); |
183 | 228 | ||
diff --git a/include/media/soc_mediabus.h b/include/media/soc_mediabus.h index 3b5a70b97528..3eed98ed02f2 100644 --- a/include/media/soc_mediabus.h +++ b/include/media/soc_mediabus.h | |||
@@ -58,6 +58,20 @@ struct soc_mbus_pixelfmt { | |||
58 | u8 bits_per_sample; | 58 | u8 bits_per_sample; |
59 | }; | 59 | }; |
60 | 60 | ||
61 | /** | ||
62 | * struct soc_mbus_lookup - Lookup FOURCC IDs by mediabus codes for pass-through | ||
63 | * @code: mediabus pixel-code | ||
64 | * @fmt: pixel format description | ||
65 | */ | ||
66 | struct soc_mbus_lookup { | ||
67 | enum v4l2_mbus_pixelcode code; | ||
68 | struct soc_mbus_pixelfmt fmt; | ||
69 | }; | ||
70 | |||
71 | const struct soc_mbus_pixelfmt *soc_mbus_find_fmtdesc( | ||
72 | enum v4l2_mbus_pixelcode code, | ||
73 | const struct soc_mbus_lookup *lookup, | ||
74 | int n); | ||
61 | const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( | 75 | const struct soc_mbus_pixelfmt *soc_mbus_get_fmtdesc( |
62 | enum v4l2_mbus_pixelcode code); | 76 | enum v4l2_mbus_pixelcode code); |
63 | s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf); | 77 | s32 soc_mbus_bytes_per_line(u32 width, const struct soc_mbus_pixelfmt *mf); |