48 lines
1.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|