int yLineStart = 0;
//uv数据的下标
int uvIndex = width * height;
//由于NV21的共用关系,每2行做一次转换
for (int i = 0; i < height; i += 2) {
for (int widthOffset = 0; widthOffset < width; widthOffset++) {
char v = nv21[uvIndex];
char u = nv21[uvIndex + 1];
char yEven = nv21[yLineStart + widthOffset];
char yOdd = nv21[yLineStart + width + widthOffset];
int r, g, b;
//偶数行YUV转RGB
r = alignIntToByte(yuvToR(yEven, u, v));
g = alignIntToByte(yuvToG(yEven, u, v));
b = alignIntToByte(yuvToB(yEven, u, v));
bgr24[evenLineBgrIndex++] = (char) b;
bgr24[evenLineBgrIndex++] = (char) g;
bgr24[evenLineBgrIndex++] = (char) r;
//奇数行YUV转RGB
r = alignIntToByte(yuvToR(yOdd, u, v));
g = alignIntToByte(yuvToG(yOdd, u, v));
b = alignIntToByte(yuvToB(yOdd, u, v));
bgr24[oddLineBgrIndex++] = (char) b;
bgr24[oddLineBgrIndex++] = (char) g;
bgr24[oddLineBgrIndex++] = (char) r;
//每两个y将uv下标增1
if ((widthOffset & 1) == 1) {
uvIndex += 2;
}
}
//由于在内层循环中已经做过width * 3次自增,所以外层循环中只需要增加一行
evenLineBgrIndex += bgrLineSize;
oddLineBgrIndex += bgrLineSize;
//y增2行
yLineStart += (width << 1);
}
}