[Bug 25807] Cant convert from WINED3DFMT_YV12 to WINED3DFMT_B8G8R8X8_UNORM

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Oct 12 12:16:23 CDT 2014


https://bugs.winehq.org/show_bug.cgi?id=25807

--- Comment #11 from Ludio <ljerabek at 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;
}

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list