encodeNv12Frame method
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,
);
}