encodeNv12Frame method

EncodedVp8Frame encodeNv12Frame(
  1. Uint8List yPlane,
  2. Uint8List uvInterleaved, {
  3. bool? forceKey,
  4. int? qiOverride,
})

Convenience wrapper around encodeFrame for NV12 input (Y plane followed by an interleaved UV plane: U0 V0 U1 V1 ...). yPlane must be width*height bytes; uvInterleaved must be 2*(width/2)*(height/2) == width*(height/2) bytes. Internally de-interleaves UV into two planar Uint8Lists before calling encodeFrame with the canonical strides. Throws ArgumentError on a wrong-sized buffer.

Implementation

EncodedVp8Frame encodeNv12Frame(Uint8List yPlane, Uint8List uvInterleaved,
    {bool? forceKey, int? qiOverride}) {
  final ySize = width * height;
  final uvHalfW = width >> 1;
  final uvHalfH = height >> 1;
  final uvPlaneSize = uvHalfW * uvHalfH;
  final uvInterleavedSize = 2 * uvPlaneSize;
  if (yPlane.length != ySize) {
    throw ArgumentError(
        'encodeNv12Frame: yPlane expected $ySize bytes (got ${yPlane.length})');
  }
  if (uvInterleaved.length != uvInterleavedSize) {
    throw ArgumentError(
        'encodeNv12Frame: uvInterleaved expected $uvInterleavedSize bytes '
        '(got ${uvInterleaved.length})');
  }
  final u = Uint8List(uvPlaneSize);
  final v = Uint8List(uvPlaneSize);
  for (var i = 0; i < uvPlaneSize; i++) {
    u[i] = uvInterleaved[2 * i];
    v[i] = uvInterleaved[2 * i + 1];
  }
  return encodeFrame(
    srcY: yPlane,
    srcU: u,
    srcV: v,
    srcYStride: width,
    srcUvStride: uvHalfW,
    forceKey: forceKey,
    qiOverride: qiOverride,
  );
}