@@ -168,36 +168,53 @@ void bgr888_to_xrgb8888(void * __restrict__ dst_, const void * __restrict__ src_
168
168
/* YUV stuff */
169
169
static int yuv_ry [32 ], yuv_gy [32 ], yuv_by [32 ];
170
170
static unsigned char yuv_u [32 * 2 ], yuv_v [32 * 2 ];
171
+ static struct uyvy { uint32_t y :8 ; uint32_t vyu :24 ; } yuv_uyvy [32768 ];
171
172
172
173
void bgr_to_uyvy_init (void )
173
174
{
174
- int i , v ;
175
-
176
- /* init yuv converter:
177
- y0 = (int)((0.299f * r0) + (0.587f * g0) + (0.114f * b0));
178
- y1 = (int)((0.299f * r1) + (0.587f * g1) + (0.114f * b1));
179
- u = (int)(8 * 0.565f * (b0 - y0)) + 128;
180
- v = (int)(8 * 0.713f * (r0 - y0)) + 128;
181
- */
182
- for (i = 0 ; i < 32 ; i ++ ) {
183
- yuv_ry [i ] = (int )(0.299f * i * 65536.0f + 0.5f );
184
- yuv_gy [i ] = (int )(0.587f * i * 65536.0f + 0.5f );
185
- yuv_by [i ] = (int )(0.114f * i * 65536.0f + 0.5f );
186
- }
187
- for (i = -32 ; i < 32 ; i ++ ) {
188
- v = (int )(8 * 0.565f * i ) + 128 ;
189
- if (v < 0 )
190
- v = 0 ;
191
- if (v > 255 )
192
- v = 255 ;
193
- yuv_u [i + 32 ] = v ;
194
- v = (int )(8 * 0.713f * i ) + 128 ;
195
- if (v < 0 )
196
- v = 0 ;
197
- if (v > 255 )
198
- v = 255 ;
199
- yuv_v [i + 32 ] = v ;
200
- }
175
+ unsigned char yuv_y [256 ];
176
+ int i , v ;
177
+
178
+ /* init yuv converter:
179
+ y0 = (int)((0.299f * r0) + (0.587f * g0) + (0.114f * b0));
180
+ y1 = (int)((0.299f * r1) + (0.587f * g1) + (0.114f * b1));
181
+ u = (int)(8 * 0.565f * (b0 - y0)) + 128;
182
+ v = (int)(8 * 0.713f * (r0 - y0)) + 128;
183
+ */
184
+ for (i = 0 ; i < 32 ; i ++ ) {
185
+ yuv_ry [i ] = (int )(0.299f * i * 65536.0f + 0.5f );
186
+ yuv_gy [i ] = (int )(0.587f * i * 65536.0f + 0.5f );
187
+ yuv_by [i ] = (int )(0.114f * i * 65536.0f + 0.5f );
188
+ }
189
+ for (i = -32 ; i < 32 ; i ++ ) {
190
+ v = (int )(8 * 0.565f * i ) + 128 ;
191
+ if (v < 0 )
192
+ v = 0 ;
193
+ if (v > 255 )
194
+ v = 255 ;
195
+ yuv_u [i + 32 ] = v ;
196
+ v = (int )(8 * 0.713f * i ) + 128 ;
197
+ if (v < 0 )
198
+ v = 0 ;
199
+ if (v > 255 )
200
+ v = 255 ;
201
+ yuv_v [i + 32 ] = v ;
202
+ }
203
+ // valid Y range seems to be 16..235
204
+ for (i = 0 ; i < 256 ; i ++ ) {
205
+ yuv_y [i ] = 16 + 219 * i / 32 ;
206
+ }
207
+ // everything combined into one large array for speed
208
+ for (i = 0 ; i < 32768 ; i ++ ) {
209
+ int r = (i >> 0 ) & 0x1f , g = (i >> 5 ) & 0x1f , b = (i >> 10 ) & 0x1f ;
210
+ int y = (yuv_ry [r ] + yuv_gy [g ] + yuv_by [b ]) >> 16 ;
211
+ yuv_uyvy [i ].y = yuv_y [y ];
212
+ #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
213
+ yuv_uyvy [i ].vyu = (yuv_v [b - y + 32 ] << 16 ) | (yuv_y [y ] << 8 ) | yuv_u [r - y + 32 ];
214
+ #else
215
+ yuv_uyvy [i ].vyu = (yuv_v [r - y + 32 ] << 16 ) | (yuv_y [y ] << 8 ) | yuv_u [b - y + 32 ];
216
+ #endif
217
+ }
201
218
}
202
219
203
220
void rgb565_to_uyvy (void * d , const void * s , int pixels )
@@ -229,54 +246,89 @@ void rgb565_to_uyvy(void *d, const void *s, int pixels)
229
246
}
230
247
}
231
248
232
- void bgr555_to_uyvy (void * d , const void * s , int pixels )
249
+ void bgr555_to_uyvy (void * d , const void * s , int pixels , int x2 )
233
250
{
234
- unsigned int * dst = d ;
235
- const unsigned short * src = s ;
236
- const unsigned char * yu = yuv_u + 32 ;
237
- const unsigned char * yv = yuv_v + 32 ;
238
- int r0 , g0 , b0 , r1 , g1 , b1 ;
239
- int y0 , y1 , u , v ;
240
-
241
- for (; pixels > 1 ; src += 2 , dst ++ , pixels -= 2 )
242
- {
243
- b0 = (src [0 ] >> 10 ) & 0x1f ;
244
- g0 = (src [0 ] >> 5 ) & 0x1f ;
245
- r0 = src [0 ] & 0x1f ;
246
- b1 = (src [1 ] >> 10 ) & 0x1f ;
247
- g1 = (src [1 ] >> 5 ) & 0x1f ;
248
- r1 = src [1 ] & 0x1f ;
249
- y0 = (yuv_ry [r0 ] + yuv_gy [g0 ] + yuv_by [b0 ]) >> 16 ;
250
- y1 = (yuv_ry [r1 ] + yuv_gy [g1 ] + yuv_by [b1 ]) >> 16 ;
251
- u = yu [b0 - y0 ];
252
- v = yv [r0 - y0 ];
253
- y0 = 16 + 219 * y0 / 31 ;
254
- y1 = 16 + 219 * y1 / 31 ;
255
-
256
- * dst = (y1 << 24 ) | (v << 16 ) | (y0 << 8 ) | u ;
257
- }
251
+ uint32_t * dst = d ;
252
+ const uint16_t * src = s ;
253
+ int i ;
254
+
255
+ if (x2 ) {
256
+ for (i = pixels ; i >= 4 ; src += 4 , dst += 4 , i -= 4 )
257
+ {
258
+ const struct uyvy * uyvy0 = yuv_uyvy + (src [0 ] & 0x7fff );
259
+ const struct uyvy * uyvy1 = yuv_uyvy + (src [1 ] & 0x7fff );
260
+ const struct uyvy * uyvy2 = yuv_uyvy + (src [2 ] & 0x7fff );
261
+ const struct uyvy * uyvy3 = yuv_uyvy + (src [3 ] & 0x7fff );
262
+ #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
263
+ dst [0 ] = uyvy0 -> y | (uyvy0 -> vyu << 8 );
264
+ dst [1 ] = uyvy1 -> y | (uyvy1 -> vyu << 8 );
265
+ dst [2 ] = uyvy2 -> y | (uyvy2 -> vyu << 8 );
266
+ dst [3 ] = uyvy3 -> y | (uyvy3 -> vyu << 8 );
267
+ #else
268
+ dst [0 ] = (uyvy0 -> y << 24 ) | uyvy0 -> vyu ;
269
+ dst [1 ] = (uyvy1 -> y << 24 ) | uyvy1 -> vyu ;
270
+ dst [2 ] = (uyvy2 -> y << 24 ) | uyvy2 -> vyu ;
271
+ dst [3 ] = (uyvy3 -> y << 24 ) | uyvy3 -> vyu ;
272
+ #endif
273
+ }
274
+ } else {
275
+ for (i = pixels ; i >= 4 ; src += 4 , dst += 2 , i -= 4 )
276
+ {
277
+ const struct uyvy * uyvy0 = yuv_uyvy + (src [0 ] & 0x7fff );
278
+ const struct uyvy * uyvy1 = yuv_uyvy + (src [1 ] & 0x7fff );
279
+ const struct uyvy * uyvy2 = yuv_uyvy + (src [2 ] & 0x7fff );
280
+ const struct uyvy * uyvy3 = yuv_uyvy + (src [3 ] & 0x7fff );
281
+ #if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
282
+ dst [0 ] = uyvy1 -> y | (uyvy0 -> vyu << 8 );
283
+ dst [1 ] = uyvy3 -> y | (uyvy2 -> vyu << 8 );
284
+ #else
285
+ dst [0 ] = (uyvy1 -> y << 24 ) | uyvy0 -> vyu ;
286
+ dst [1 ] = (uyvy3 -> y << 24 ) | uyvy2 -> vyu ;
287
+ #endif
288
+ }
289
+ }
258
290
}
259
291
260
- void bgr888_to_uyvy (void * d , const void * s , int pixels )
292
+ void bgr888_to_uyvy (void * d , const void * s , int pixels , int x2 )
261
293
{
262
- unsigned int * dst = d ;
263
- const unsigned char * src8 = s ;
264
- const unsigned char * yu = yuv_u + 32 ;
265
- const unsigned char * yv = yuv_v + 32 ;
266
- int r0 , g0 , b0 , r1 , g1 , b1 ;
267
- int y0 , y1 , u , v ;
268
-
269
- for (; pixels > 0 ; src8 += 3 * 2 , dst ++ , pixels -= 2 )
270
- {
271
- r0 = src8 [0 ], g0 = src8 [1 ], b0 = src8 [2 ];
272
- r1 = src8 [3 ], g1 = src8 [4 ], b1 = src8 [5 ];
273
- y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471 ) >> 16 ;
274
- y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471 ) >> 16 ;
275
- u = yu [(b0 - y0 ) / 8 ];
276
- v = yv [(r0 - y0 ) / 8 ];
277
- y0 = 16 + 219 * y0 / 255 ;
278
- y1 = 16 + 219 * y1 / 255 ;
279
-
280
- * dst = (y1 << 24 ) | (v << 16 ) | (y0 << 8 ) | u ;
281
- }
294
+ unsigned int * dst = d ;
295
+ const unsigned char * src8 = s ;
296
+ const unsigned char * yu = yuv_u + 32 ;
297
+ const unsigned char * yv = yuv_v + 32 ;
298
+ int r0 , g0 , b0 , r1 , g1 , b1 ;
299
+ int y0 , y1 , u0 , u1 , v0 , v1 ;
300
+
301
+ if (x2 ) {
302
+ for (; pixels >= 2 ; src8 += 3 * 2 , pixels -= 2 )
303
+ {
304
+ r0 = src8 [0 ], g0 = src8 [1 ], b0 = src8 [2 ];
305
+ r1 = src8 [3 ], g1 = src8 [4 ], b1 = src8 [5 ];
306
+ y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471 ) >> 16 ;
307
+ y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471 ) >> 16 ;
308
+ u0 = yu [(b0 - y0 ) / 8 ];
309
+ u1 = yu [(b1 - y1 ) / 8 ];
310
+ v0 = yv [(r0 - y0 ) / 8 ];
311
+ v1 = yv [(r1 - y1 ) / 8 ];
312
+ y0 = 16 + 219 * y0 / 255 ;
313
+ y1 = 16 + 219 * y1 / 255 ;
314
+
315
+ * dst ++ = (y0 << 24 ) | (v0 << 16 ) | (y0 << 8 ) | u0 ;
316
+ * dst ++ = (y1 << 24 ) | (v1 << 16 ) | (y1 << 8 ) | u1 ;
317
+ }
318
+ }
319
+ else {
320
+ for (; pixels >= 2 ; src8 += 3 * 2 , dst ++ , pixels -= 2 )
321
+ {
322
+ r0 = src8 [0 ], g0 = src8 [1 ], b0 = src8 [2 ];
323
+ r1 = src8 [3 ], g1 = src8 [4 ], b1 = src8 [5 ];
324
+ y0 = (r0 * 19595 + g0 * 38470 + b0 * 7471 ) >> 16 ;
325
+ y1 = (r1 * 19595 + g1 * 38470 + b1 * 7471 ) >> 16 ;
326
+ u0 = yu [(b0 - y0 ) / 8 ];
327
+ v0 = yv [(r0 - y0 ) / 8 ];
328
+ y0 = 16 + 219 * y0 / 255 ;
329
+ y1 = 16 + 219 * y1 / 255 ;
330
+
331
+ * dst = (y1 << 24 ) | (v0 << 16 ) | (y0 << 8 ) | u0 ;
332
+ }
333
+ }
282
334
}
0 commit comments