readHeaders static method

List<JpegSegment> readHeaders(
  1. Uint8List jpegBytes
)

Reads segments prior to the entropy-coded data i.e. until the SOS (Start of Scan) segment

Implementation

static List<JpegSegment> readHeaders(Uint8List jpegBytes) {
  List<JpegSegment> segments = [];

  var jpeg = ByteData.sublistView(jpegBytes);
  int offset = 0;

  while (true) {
    if (jpeg.getUint8(offset) != 0xFF) {
      throw new Exception("Missing 0xFF at offset $offset");
    }
    int type = jpeg.getUint8(offset + 1);
    int segmentLength = 2; // for 0xFF + marker type

    bool noLengthBytes =
        // https://stackoverflow.com/a/4614629
        // https://dev.exiv2.org/projects/exiv2/wiki/The_Metadata_in_JPEG_files
        (type == 0x00 || type == 0x01 || (type >= 0xD0 && type <= 0xD8));

    if (!noLengthBytes) {
      segmentLength += jpeg.getUint16(offset + 2, Endian.big);
    }

    var segment = JpegSegment(ByteData.sublistView(
      jpeg,
      offset,
      offset + segmentLength,
    ));
    // print("read $segment");
    segments.add(segment);

    if (segment.isStartOfScan) {
      break;
    }
    offset += segmentLength;
  }

  return segments;
}