tbf/TestBenchFramework/BenchControl/Network/Camera/CLP1611/RtpPacket.cs

48 lines
1.6 KiB
C#

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