parseRtp function

RtpPacket? parseRtp(
  1. Uint8List data
)

Parses an inbound RTP datagram. Returns null if the buffer is too short or the version isn't 2. Skips past CSRC list and any header extension.

Implementation

RtpPacket? parseRtp(Uint8List data) {
  if (data.length < rtpHeaderSize) return null;
  final b0 = data[0];
  final b1 = data[1];
  if (((b0 >> 6) & 0x03) != rtpVersion) return null;

  final cc = b0 & 0x0F;
  final hasExt = (b0 & 0x10) != 0;
  final marker = ((b1 >> 7) & 1) == 1;
  final payloadType = b1 & 0x7F;

  final seq = (data[2] << 8) | data[3];
  final ts = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
  final ssrc = (data[8] << 24) | (data[9] << 16) | (data[10] << 8) | data[11];

  var headerLen = rtpHeaderSize + cc * 4;
  if (hasExt) {
    if (data.length < headerLen + 4) return null;
    final words = (data[headerLen + 2] << 8) | data[headerLen + 3];
    headerLen += 4 + words * 4;
  }
  if (data.length < headerLen) return null;
  final payload = Uint8List.sublistView(data, headerLen);

  return RtpPacket(
    payloadType: payloadType,
    sequenceNumber: seq,
    timestamp: ts,
    ssrc: ssrc,
    payload: payload,
    marker: marker,
  );
}