processNv21 method

FaceDetectionResult processNv21(
  1. FaceMeshNv21Image image, {
  2. NormalizedRect? roi,
  3. int rotationDegrees = 0,
  4. bool mirrorHorizontal = false,
  5. double? roiScaleX,
  6. double? roiScaleY,
  7. double? roiShiftX,
  8. double? roiShiftY,
})

Processes an NV21 frame and returns normalized face detections.

Implementation

FaceDetectionResult processNv21(
  FaceMeshNv21Image image, {
  NormalizedRect? roi,
  int rotationDegrees = 0,
  bool mirrorHorizontal = false,
  double? roiScaleX,
  double? roiScaleY,
  double? roiShiftX,
  double? roiShiftY,
}) {
  _ensureNotClosed();
  _validateRotation(rotationDegrees);
  final double resolvedRoiScaleX = roiScaleX ?? _defaultRoiScaleX;
  final double resolvedRoiScaleY = roiScaleY ?? _defaultRoiScaleY;
  final double resolvedRoiShiftX = roiShiftX ?? _defaultRoiShiftX;
  final double resolvedRoiShiftY = roiShiftY ?? _defaultRoiShiftY;
  final _NativeNv21Image nativeImage = _toNativeNv21Image(image);
  final ffi.Pointer<MpNormalizedRect> roiPtr = roi != null
      ? _toNativeRect(roi)
      : ffi.nullptr;
  final ffi.Pointer<MpRoiTransformOptions> roiTransformPtr =
      _toNativeRoiTransform(
        resolvedRoiScaleX,
        resolvedRoiScaleY,
        resolvedRoiShiftX,
        resolvedRoiShiftY,
      );
  FaceDetectionResult? processed;
  try {
    final ffi.Pointer<MpFaceDetectorResult> resultPtr = faceBindings
        .mp_face_detector_process_nv21(
          _context,
          nativeImage.image,
          roiPtr == ffi.nullptr ? ffi.nullptr : roiPtr,
          rotationDegrees,
          mirrorHorizontal ? 1 : 0,
          roiTransformPtr,
        );
    if (resultPtr == ffi.nullptr) {
      throw MediapipeFaceMeshException(
        _readCString(faceBindings.mp_face_detector_last_error(_context)) ??
            'Native face detector error.',
      );
    }
    processed = _copyResult(resultPtr.ref);
    faceBindings.mp_face_detector_release_result(resultPtr);
  } finally {
    pkg_ffi.calloc.free(nativeImage.yPlane);
    pkg_ffi.calloc.free(nativeImage.vuPlane);
    pkg_ffi.calloc.free(nativeImage.image);
    if (roiPtr != ffi.nullptr) pkg_ffi.calloc.free(roiPtr);
    if (roiTransformPtr != ffi.nullptr) pkg_ffi.calloc.free(roiTransformPtr);
  }
  return processed;
}