public class Image {
@param tempData
@param width
@param height
@return
@throws NullPointerException
@throws IllegalArgumentException
public static int[] decodeYUV(byte[] tempData, int width, int height) throws NullPointerException, IllegalArgumentException {
int size = width * height;
if (tempData == null) {
throw new NullPointerException("buffer tempData is null");
}
if (tempData.length < size) {
throw new IllegalArgumentException("buffer tempData is illegal");
}
int[] out = new int[size];
int Y, Cr = 0, Cb = 0;
for (int i = 0; i < height; i++) {
int index = i * width;
int jDiv2 = i >> 1;
for (int i2 = 0; i2 < width; i2++) {
Y = tempData[index];
if (Y < 0) {
Y += 255;
}
if ((i2 & 0x1) != 1) {
int c0ff = size + jDiv2 * width + (i2 >> 1) * 2;
Cb = tempData[c0ff];
if (Cb < 0) {
Cb += 127;
} else {
Cb -= 128;
}
Cr = tempData[c0ff + 1];
if (Cr < 0) {
Cr += 127;
} else {
Cr -= 128;
}
}
int R = Y + Cr + (Cr >> 2) + (Cr >> 3) + (Cr >> 5);
if (R < 0) {
R = 0;
} else if (R > 255) {
R = 255;
}
int G = Y - (Cb >> 2) + (Cb >> 4) + (Cb >> 5) - (Cr >> 1) + (Cr >> 3) + (Cr >> 4) + (Cr >> 5);
if (G < 0) {
G = 0;
} else if (G > 255) {
G = 255;
}
int B = Y + Cb + (Cb >> 1) + (Cb >> 2) + (Cb >> 6);
if (B < 0) {
B = 0;
} else if (B > 255) {
B = 255;
}
out[index] = 0xff000000 + (B << 16) + (G << 8 ) + R;
index++;
}
}
return out;
}
}