toNV21 method
Convert RGBA to NV21 format for Android ML Kit.
NV21 format: Y plane followed by interleaved VU plane
Implementation
Uint8List toNV21(int width, int height) {
final ySize = width * height;
final uvSize = ySize ~/ 2;
final nv21 = Uint8List(ySize + uvSize);
for (int i = 0; i < ySize; i++) {
final r = this[i * 4];
final g = this[i * 4 + 1];
final b = this[i * 4 + 2];
// Convert RGB to Y
nv21[i] = ((66 * r + 129 * g + 25 * b + 128) >> 8) + 16;
}
// Convert to UV (simplified - every 2x2 block)
for (int j = 0; j < height ~/ 2; j++) {
for (int i = 0; i < width ~/ 2; i++) {
final index = j * 2 * width + i * 2;
final r = this[index * 4];
final g = this[index * 4 + 1];
final b = this[index * 4 + 2];
final uvIndex = ySize + j * width + i * 2;
// V
nv21[uvIndex] = ((112 * r - 94 * g - 18 * b + 128) >> 8) + 128;
// U
nv21[uvIndex + 1] = ((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128;
}
}
return nv21;
}