OLD | NEW |
---|---|
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <assert.h> | 5 #include <assert.h> |
6 #include <getopt.h> | 6 #include <getopt.h> |
7 #include <signal.h> | 7 #include <signal.h> |
8 #include <X11/Xlib.h> | 8 #include <X11/Xlib.h> |
9 | 9 |
10 #include <iostream> | 10 #include <iostream> |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
115 XFreeGC(xdisplay_, gc); | 115 XFreeGC(xdisplay_, gc); |
116 } | 116 } |
117 | 117 |
118 inline int32_t clip(int32_t value, int32_t min, int32_t max) { | 118 inline int32_t clip(int32_t value, int32_t min, int32_t max) { |
119 return (value > max ? max : value < min ? min : value); | 119 return (value > max ? max : value < min ? min : value); |
120 } | 120 } |
121 | 121 |
122 void ConvertYUVToRGB32(uint8_t* in, uint8_t* out, int32_t ifmt, | 122 void ConvertYUVToRGB32(uint8_t* in, uint8_t* out, int32_t ifmt, |
123 int32_t width, int32_t height, | 123 int32_t width, int32_t height, |
124 int32_t istride, int32_t ostride) { | 124 int32_t istride, int32_t ostride) { |
125 if (ifmt == v4l2_fourcc('Y', 'U', 'Y', 'V')) { | 125 if ((ifmt == v4l2_fourcc('Y', 'U', 'Y', 'V')) || |
126 (ifmt == v4l2_fourcc('Y', 'V', 'Y', 'U')) || | |
127 (ifmt == v4l2_fourcc('U', 'Y', 'V', 'Y')) || | |
128 (ifmt == v4l2_fourcc('V', 'Y', 'U', 'Y'))) { | |
126 for (int32_t i = 0; i < height; ++i) { | 129 for (int32_t i = 0; i < height; ++i) { |
127 for (int32_t j = 0; j < width * 2; j += 4) { | 130 for (int32_t j = 0; j < width * 2; j += 4) { |
128 int32_t y0 = in[j]; | 131 int32_t y0; |
129 int32_t y1 = in[j + 2]; | 132 int32_t y1; |
130 int32_t u = in[j + 1] - 128; | 133 int32_t u; |
131 int32_t v = in[j + 3] - 128; | 134 int32_t v; |
132 | 135 |
133 int32_t r = (298 * y0 + 409 * v + 128) >> 8; | 136 if (ifmt == v4l2_fourcc('Y', 'U', 'Y', 'V')) { |
134 int32_t g = (298 * y0 - 100 * u - 208 * v + 128) >> 8; | 137 y0 = in[j]; |
135 int32_t b = (298 * y0 + 516 * u + 128) >> 8; | 138 y1 = in[j + 2]; |
136 out[j * 2 + 0] = clip(b, 0, 255); | 139 u = in[j + 1] - 128; |
137 out[j * 2 + 1] = clip(g, 0, 255); | 140 v = in[j + 3] - 128; |
138 out[j * 2 + 2] = clip(r, 0, 255); | 141 } else if (ifmt == v4l2_fourcc('Y', 'V', 'Y', 'U')) { |
139 out[j * 2 + 3] = 255; | 142 y0 = in[j]; |
140 r = (298 * y1 + 409 * v + 128) >> 8; | 143 y1 = in[j + 2]; |
141 g = (298 * y1 - 100 * u - 208 * v + 128) >> 8; | 144 u = in[j + 3] - 128; |
142 b = (298 * y1 + 516 * u + 128) >> 8; | 145 v = in[j + 1] - 128; |
143 out[j * 2 + 4] = clip(b, 0, 255); | 146 } else if (ifmt == v4l2_fourcc('U', 'Y', 'V', 'Y')) { |
144 out[j * 2 + 5] = clip(g, 0, 255); | 147 y0 = in[j + 1]; |
145 out[j * 2 + 6] = clip(r, 0, 255); | 148 y1 = in[j + 3]; |
146 out[j * 2 + 7] = 255; | 149 u = in[j] - 128; |
150 v = in[j + 2] - 128; | |
151 } else if (ifmt == v4l2_fourcc('V', 'Y', 'U', 'Y')) { | |
152 y0 = in[j + 1]; | |
153 y1 = in[j + 3]; | |
154 u = in[j + 2] - 128; | |
155 v = in[j] - 128; | |
156 } else { | |
157 CHECK(0); | |
158 } | |
jiesun
2011/04/28 17:28:27
I actually prefer to do the branching outside the
| |
159 | |
160 int32_t r = (298 * y0 + 409 * v + 128) >> 8; | |
161 int32_t g = (298 * y0 - 100 * u - 208 * v + 128) >> 8; | |
162 int32_t b = (298 * y0 + 516 * u + 128) >> 8; | |
163 | |
164 out[j * 2 + 0] = clip(b, 0, 255); | |
165 out[j * 2 + 1] = clip(g, 0, 255); | |
166 out[j * 2 + 2] = clip(r, 0, 255); | |
167 out[j * 2 + 3] = 255; | |
168 | |
169 r = (298 * y1 + 409 * v + 128) >> 8; | |
170 g = (298 * y1 - 100 * u - 208 * v + 128) >> 8; | |
171 b = (298 * y1 + 516 * u + 128) >> 8; | |
172 | |
173 out[j * 2 + 4] = clip(b, 0, 255); | |
174 out[j * 2 + 5] = clip(g, 0, 255); | |
175 out[j * 2 + 6] = clip(r, 0, 255); | |
176 out[j * 2 + 7] = 255; | |
147 } | 177 } |
148 in += istride; | 178 in += istride; |
149 out += ostride; | 179 out += ostride; |
150 } | 180 } |
181 } else if (ifmt == v4l2_fourcc('Y', 'U', '1', '2')) { | |
jiesun
2011/04/28 17:32:31
|| ifmt == v4l2_fourcc('Y', 'V', '1', '2')
since i
| |
182 // Can't use pixels_per_line for this. While pixels per line is 12, | |
183 // the rest of this part of code is using line stride as the | |
184 // y-plane's line stride, which should just be the width of the image. | |
185 istride = width; | |
186 | |
187 uint8_t* y_plane = in; | |
188 uint8_t* u_plane = in + height * istride; | |
189 // assumption. stride for uv is half of the y stride. | |
190 uint8_t* v_plane = u_plane + height * istride / 4; | |
jiesun
2011/04/28 17:32:31
if (ifmt == v4l2_fourcc('Y', 'V', '1', '2')) swap
| |
191 for (int32_t i = 0; i < height; ++i) { | |
192 for (int32_t j = 0; j < width; ++j) { | |
193 int32_t y = y_plane[j]; | |
194 int32_t u = u_plane[j>>1]; | |
jiesun
2011/04/28 17:28:27
apparently that I had forgetten to -128 here and t
| |
195 int32_t v = v_plane[j>>1]; | |
jiesun
2011/04/28 17:28:27
please also add space around binary operator >>.
| |
196 | |
197 int32_t r = (298 * y + 409 * v + 128) >> 8; | |
198 int32_t g = (298 * y - 100 * u - 208 * v + 128) >> 8; | |
199 int32_t b = (298 * y + 516 * u + 128) >> 8; | |
200 | |
201 out[j * 4 + 0] = clip(b, 0, 255); | |
202 out[j * 4 + 1] = clip(g, 0, 255); | |
203 out[j * 4 + 2] = clip(r, 0, 255); | |
204 out[j * 4 + 3] = 255; | |
205 } | |
206 y_plane += istride; | |
207 if (i&1) { | |
208 u_plane += istride >> 1; | |
209 v_plane += istride >> 1; | |
210 } | |
211 out += ostride; | |
212 } | |
151 } else { | 213 } else { |
152 CHECK(0); | 214 CHECK(0); |
153 } | 215 } |
154 } | 216 } |
155 | 217 |
156 private: | 218 private: |
157 Display* xdisplay_; | 219 Display* xdisplay_; |
158 Window xwindow_; | 220 Window xwindow_; |
159 XImage* ximage_; | 221 XImage* ximage_; |
160 bool xrunning_; | 222 bool xrunning_; |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
308 retcode = 6; | 370 retcode = 6; |
309 | 371 |
310 device->CloseDevice(); | 372 device->CloseDevice(); |
311 | 373 |
312 if (device) | 374 if (device) |
313 delete device; | 375 delete device; |
314 | 376 |
315 return retcode; | 377 return retcode; |
316 } | 378 } |
317 | 379 |
OLD | NEW |