parseRtp function
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,
);
}