decodePlan method

CameraFrameDecodePlan decodePlan()

Builds backend-neutral decode instructions for this frame.

Image backends should allocate their source buffer from CameraFrameDecodePlan.sourceLayout and use PackedImageLayout.copyTo instead of list-element reconstruction APIs.

Implementation

CameraFrameDecodePlan decodePlan() {
  switch (conversion) {
    case CameraFrameConversion.bgra2bgr:
    case CameraFrameConversion.rgba2bgr:
      return CameraFrameDecodePlan(
        sourceLayout: PackedImageLayout(
          rows: height,
          cols: strideCols,
          channels: 4,
          format: conversion == CameraFrameConversion.bgra2bgr
              ? PackedImageFormat.bgra8888
              : PackedImageFormat.rgba8888,
        ),
        visibleWidth: width,
        visibleHeight: height,
        hasStridePadding: strideCols != width,
        conversion: conversion,
        rotation: rotation,
        order: CameraFrameDecodeOrder.resizeRotateThenColorConvert,
      );

    case CameraFrameConversion.yuv2bgrNv12:
    case CameraFrameConversion.yuv2bgrNv21:
    case CameraFrameConversion.yuv2bgrI420:
      final format = switch (conversion) {
        CameraFrameConversion.yuv2bgrNv12 => PackedImageFormat.yuv420Nv12,
        CameraFrameConversion.yuv2bgrNv21 => PackedImageFormat.yuv420Nv21,
        CameraFrameConversion.yuv2bgrI420 => PackedImageFormat.yuv420I420,
        _ => PackedImageFormat.yuv420Nv12,
      };
      return CameraFrameDecodePlan(
        sourceLayout: PackedImageLayout(
          rows: height + height ~/ 2,
          cols: width,
          channels: 1,
          format: format,
        ),
        visibleWidth: width,
        visibleHeight: height,
        hasStridePadding: false,
        conversion: conversion,
        rotation: rotation,
        order: CameraFrameDecodeOrder.colorConvertThenResizeRotate,
      );
  }
}