fromData static method

RecordTimeLineFile? fromData(
  1. RecordTimeLineData timeLineData
)

Implementation

static RecordTimeLineFile? fromData(RecordTimeLineData timeLineData) {
  var bytes = timeLineData.bytes!;
  int byteOffset = 0;
  int type = bytes.getUint8(byteOffset);
  byteOffset += 1;
  if ((type & 0x03) != 0x00) {
    timeLineData.offset = byteOffset;
    return null;
  }

  RecordTimeLineFile lineFile = RecordTimeLineFile();
  lineFile.record_alarm = (type & 0xFC) >> 2;
  var timestamp = bytes!.getUint32(byteOffset, Endian.little);
  byteOffset += 4;
  timeLineData.offset = byteOffset;
  var dateTime =
      DateTime.fromMillisecondsSinceEpoch(timestamp * 1000, isUtc: true);
  lineFile.record_time = timestamp;
  lineFile.record_name =
      '${dateTimeString(dateTime)}_${_eventName(lineFile.record_alarm!)}.mp4';
  lineFile.frame_len = bytes.getUint16(byteOffset, Endian.little);
  byteOffset += 2;
  timeLineData.offset = byteOffset;
  lineFile.frame_interval = bytes.getUint8(byteOffset);
  byteOffset += 1;
  timeLineData.offset = byteOffset;
  for (int i = 0; i < lineFile.frame_len!; i++) {
    type = bytes.getInt8(byteOffset);
    byteOffset += 1;
    timeLineData.offset = byteOffset;
    if ((type & 0x03) != 0x01) continue;
    RecordTimeLineFrame lineFrame = RecordTimeLineFrame();
    timestamp = bytes.getUint32(byteOffset, Endian.little);
    byteOffset += 4;
    timeLineData.offset = byteOffset;
    lineFrame.timestamp =
        DateTime.fromMillisecondsSinceEpoch(timestamp * 1000, isUtc: true);
    if (lineFile.record_start == null)
      lineFile.record_start = lineFrame.timestamp;
    lineFrame.frame_no = bytes.getUint16(byteOffset, Endian.little);
    byteOffset += 2;
    timeLineData.offset = byteOffset;
    lineFrame.frame_gop = bytes.getUint8(byteOffset);
    if (lineFrame.frame_gop == 45) lineFile.frame_interval = 3;
    byteOffset += 1;
    timeLineData.offset = byteOffset;
    lineFile.frames.add(lineFrame);
  }
  type = bytes.getInt8(byteOffset);
  byteOffset += 1;
  timeLineData.offset = byteOffset;
  if ((type & 0x03) != 0x02) {
    timeLineData.offset = byteOffset;
    return null;
  }
  timestamp = bytes.getUint32(byteOffset, Endian.little);
  byteOffset += 4;
  timeLineData.offset = byteOffset;
  lineFile.record_end =
      DateTime.fromMillisecondsSinceEpoch(timestamp * 1000, isUtc: true);
  lineFile.record_duration =
      lineFile.record_end?.difference(lineFile.record_start!).inSeconds ?? 0;
  lineFile.frame_len = bytes.getUint16(byteOffset, Endian.little);
  byteOffset += 2;
  timeLineData.offset = byteOffset;
  bytes.getUint8(byteOffset);
  byteOffset += 1;
  timeLineData.offset = byteOffset;
  return lineFile;
}