using System; namespace TBF.BenchControl.Network.Camera { public class RtpPacket { public readonly int Version; public readonly bool P; public readonly bool X; public readonly int CC; public readonly bool Mark; public readonly int PayloadType; public readonly int SequenceNumber; public readonly int Timestamp; public readonly int SsrcId; public readonly Byte[] Payload; /// Data without RTP header public RtpPacket(Byte[] data) { if (data.Length < 12) throw new Exception("Packet too short"); Version = (data[0] >> 6) & 0x02; /// 1 RTP Version P = ((data[0] & 0x20) != 0); /// 2 RTP P X = ((data[0] & 0x10) != 0); /// 3 RTP X CC = (data[0] & 0x0F); /// 4 RTP CC Mark = ((data[1] & 0x80) != 0); /// 5 RTP M PayloadType = (data[1] & 0x7F); /// 6 RTP PT SequenceNumber = data[2] * 256 + data[3]; /// 7 RTP Seq# Timestamp = ((data[4] * 256 + data[5]) * 256 + data[6]) * 256 + data[7]; /// 8 RTP Timestamp SsrcId = ((data[8] * 256 + data[9]) * 256 + data[10]) * 256 + data[11]; /// 9 RTP SSRC Id int ExtensionHeaderSize = 0; if (X && data.Length >= 16 + 4*CC) { ExtensionHeaderSize = data[14 + 4*CC] * 256 + data[15 + 4*CC] + 4; } int payloadDataOffset = 12 + 4 * CC + ExtensionHeaderSize; int payloadDataCount = data.Length - 12 - 4 * CC - ExtensionHeaderSize; if (payloadDataCount < 0) throw new Exception("Invalid packet"); Payload = new byte[payloadDataCount]; Array.Copy(data, payloadDataOffset, Payload, 0, payloadDataCount); } } }