parseRtcp function

List<RtcpPacket> parseRtcp(
  1. Uint8List data
)

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;
}