public static IEnumerable <RtcpPacket> Parse(ArraySegment <byte> byteSegment) { Debug.Assert(byteSegment.Array != null, "byteSegment.Array != null"); int offset = byteSegment.Offset; int totalLength = byteSegment.Count; while (totalLength > 0) { int value = byteSegment.Array[offset++]; int version = value >> 6; int padding = (value >> 5) & 1; int sourceCount = value & 0x1F; int payloadType = byteSegment.Array[offset++]; int dwordLength = BigEndianConverter.ReadUInt16(byteSegment.Array, offset); offset += 2; int payloadLength = dwordLength * 4; if (payloadLength > totalLength - 4) { throw new ArgumentException( "Invalid RTCP packet size. It seems that data segment contains bad data", nameof(byteSegment)); } RtcpPacket packet; if (payloadType == 200) { packet = new RtcpSenderReportPacket(); } else if (payloadType == 203) { packet = new RtcpByePacket(); } else { offset += payloadLength; totalLength -= 4 + payloadLength; continue; } packet.ProtocolVersion = version; packet.PaddingFlag = padding != 0; packet.SourceCount = sourceCount; packet.PayloadType = payloadType; packet.DwordLength = dwordLength; packet.Length = (dwordLength + 1) * 4; var segment = new ArraySegment <byte>(byteSegment.Array, offset, payloadLength); packet.FillFromByteSegment(segment); yield return(packet); offset += payloadLength; totalLength -= 4 + payloadLength; } }
public IEnumerable <RtcpPacket> GetReportByePackets() { RtcpReceiverReportPacket receiverReport = CreateReceiverReport(); yield return(receiverReport); RtcpByePacket byeReport = new RtcpByePacket(_senderSyncSourceId); yield return(byeReport); }