Confusión en la conversión de YUV NV21 a RGB

De acuerdo ahttp://developer.android.com/reference/android/graphics/ImageFormat.html#NV21, NV21 es el formato usado por defecto.

Existe una gran cantidad de códigos en la web relacionados con la conversión de YUV NV21 a RGB. Sin embargo, cuando paso por el código, dudo de la exactitud del código.

El primer componente V debería aparecer primero, seguido del primer componente U

De acuerdo ahttp://wiki.videolan.org/YUV#NV21, NV21 is like NV12, but with U and V order reversed: it starts with V. Sin embargo, cuando pasé por la implementación del código

http://pastebin.com/T0my7zSc - Asume que U es lo primero.https://stackoverflow.com/a/8394202/72437 - Asume que U también es lo primero.https://stackoverflow.com/a/10125048/72437 - Se dice que U también es lo primero.

R debe ser la posición más significativa Según implementación deint argb enColor.java, R supone estar en la posición más significativa. Sin embargo, pasé por la siguiente implementación de código

http://pastebin.com/T0my7zSc - Asume que R está en la posición menos significativa.https://stackoverflow.com/a/8394202/72437 - Asume que R está en la posición menos significativa.

Me preguntaba, ¿están cometiendo un error común o he pasado por alto algo?

Actualmente, mi implementación es la siguiente.

public static void YUV_NV21_TO_RGB(int[] argb, byte[] yuv, int width, int height) {
    final int frameSize = width * height;

    final int ii = 0;
    final int ij = 0;
    final int di = +1;
    final int dj = +1;

    int a = 0;
    for (int i = 0, ci = ii; i < height; ++i, ci += di) {
        for (int j = 0, cj = ij; j < width; ++j, cj += dj) {
            int y = (0xff & ((int) yuv[ci * width + cj]));
            int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0]));
            int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1]));
            y = y < 16 ? 16 : y;

            int r = (int) (1.164f * (y - 16) + 1.596f * (v - 128));
            int g = (int) (1.164f * (y - 16) - 0.813f * (v - 128) - 0.391f * (u - 128));
            int b = (int) (1.164f * (y - 16) + 2.018f * (u - 128));

            r = r < 0 ? 0 : (r > 255 ? 255 : r);
            g = g < 0 ? 0 : (g > 255 ? 255 : g);
            b = b < 0 ? 0 : (b > 255 ? 255 : b);

            argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b;
        }
    }
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta