https://bugs.winehq.org/show_bug.cgi?id=25807
--- Comment #11 from Ludio ljerabek@cox.net --- If it's not fixed yet it may be worth trying something similar to the code below.
This is from Wikipedia YUV to RGB conversion:
public static int[] YUV_2_RGB888(byte [] data, int width, int height) { int size = width*height; int offset = size; int[] pixels = new int[size]; int u, v, y1, y2, y3, y4;
// i along Y and the final pixels // k along pixels U and V for(int i=0, k=0; i < size; i+=2, k+=2) { y1 = data[i ]&0xff; y2 = data[i+1]&0xff; y3 = data[width+i ]&0xff; y4 = data[width+i+1]&0xff;
v = data[offset+k ]&0xff; u = data[offset+k+1]&0xff; v = v-128; u = u-128;
pixels[i ] = convertYUVtoRGB(y1, u, v); pixels[i+1] = convertYUVtoRGB(y2, u, v); pixels[width+i ] = convertYUVtoRGB(y3, u, v); pixels[width+i+1] = convertYUVtoRGB(y4, u, v);
if ((i+2)%width==0) i += width; }
return pixels; }
private static int convertYUVtoRGB(int y, int u, int v) { int r = y + (int)(1.772f*v); int g = y - (int)(0.344f*v + 0.714f*u); int b = y + (int)(1.402f*u); r = r>255? 255 : r<0 ? 0 : r; g = g>255? 255 : g<0 ? 0 : g; b = b>255? 255 : b<0 ? 0 : b; return 0xff000000 | (r<<16) | (g<<8) | b; }