示例#1
0
        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);
        }