AtemPacket.fromBytes constructor

AtemPacket.fromBytes(
  1. Uint8List bytes
)

Creates an AtemPacket from raw bytes.

Implementation

factory AtemPacket.fromBytes(Uint8List bytes) {
  if (bytes.length < headerSize) {
    throw ArgumentError('Packet too short for header');
  }

  final header = ByteData.view(bytes.buffer, bytes.offsetInBytes, headerSize);

  // First 2 bytes: length (11 bits) + flags (5 bits)
  final firstWord = header.getUint16(0, Endian.big);
  final length = firstWord & 0x07FF;
  final flags = (firstWord >> 11) & 0x1F;

  if (length != bytes.length) {
    throw FormatException(
        'Incomplete or corrupt packet: header says $length but data length is ${bytes.length}');
  }

  final session = header.getUint16(2, Endian.big);
  final acknowledgementNumber = header.getUint16(4, Endian.big);
  final remoteSequenceNumber = header.getUint16(6, Endian.big);
  final sequenceNumber = header.getUint16(8, Endian.big);

  final data =
      bytes.length > headerSize ? bytes.sublist(headerSize) : Uint8List(0);

  return AtemPacket(
    flags: flags,
    length: length,
    session: session,
    sequenceNumber: sequenceNumber,
    acknowledgementNumber: acknowledgementNumber,
    remoteSequenceNumber: remoteSequenceNumber,
    data: data,
  );
}