parseRtcp function
Parse a (possibly compound) RTCP datagram. Returns an empty list if the buffer is malformed.
Implementation
List<RtcpPacket> parseRtcp(Uint8List data) {
final out = <RtcpPacket>[];
var offset = 0;
while (offset + 4 <= data.length) {
final b0 = data[offset];
final pt = data[offset + 1];
if (((b0 >> 6) & 0x03) != rtcpVersion) return out;
final rc = b0 & 0x1F;
final words = (data[offset + 2] << 8) | data[offset + 3];
final lengthBytes = (words + 1) * 4;
if (offset + lengthBytes > data.length) return out;
switch (pt) {
case rtcpPtSr:
out.add(RtcpSr(SenderReport.parse(data, offset, rc)));
break;
case rtcpPtRr:
out.add(RtcpRr(ReceiverReport.parse(data, offset, rc)));
break;
case rtcpPtSdes:
// We don't need to parse SDES chunks for telemetry; record presence.
out.add(RtcpSdes(const SourceDescription(chunks: <SdesChunk>[])));
break;
case rtcpPtBye:
final sources = <int>[];
final bd = ByteData.sublistView(data);
for (var i = 0; i < rc; i++) {
sources.add(bd.getUint32(offset + 4 + i * 4));
}
out.add(RtcpBye(GoodBye(sources: sources)));
break;
default:
out.add(RtcpUnknown(pt));
}
offset += lengthBytes;
}
return out;
}