toNV21 method

Uint8List toNV21(
  1. int width,
  2. int height
)

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;
}