You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

207 lines
11 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
namespace nRTP
{
public static class RTP
{
//RTPMsgHeader
private static Byte _VerPXCC = 2;
private static Byte _Ver = 2; // версия протокола (текущая версия 2)
private static Byte _P = 0; // = 0 (не используется заполнение в конце пакета)
private static Byte _X = 0; // = 0 (не используются дополнительные заголовки)
private static Byte _CC = 0; // = 0 (CSRC - идентификаторы не используются);
private static Byte _MPT;
private static Byte _M; // маркерный бит.
private static Byte _PT = 99; // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
private static UInt32 _Seqcounter = 0;
private static UInt16 _SeqCounter_Hi;
private static UInt16 _SeqCounter_Low;
public static Byte MH_VerPXCC
{
get => _VerPXCC;
set
{
_VerPXCC = value;
_Ver = (Byte)(value & 0x03);
_P = (Byte)((value >> 2) & 0x01);
_X = (Byte)((value >> 3) & 0x01);
_CC = (Byte)((value >> 4) & 0x0F);
}
}
public static Byte MH_MPT
{
get
{
return (Byte)((_PT << 1) | _M);
}
set
{
_MPT = value;
_M = (Byte)(value & 0x01);
_PT = (Byte)((value >> 1) & 0x7F);
}
}
public static Byte MH_M // маркерный бит.
{
get => _M;
set
{
_M = value;
}
}
public static Byte MH_PT // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
{
get => _PT;
set
{
_PT = value;
}
}
public static UInt16 MH_SeqCounter_Low // Номер последовательности (младшие 16 бит)
{
get => _SeqCounter_Low;
set
{
_SeqCounter_Low = value;
}
}
public static UInt32 MH_Timestamp; // Метка времени (90 кГц отсчеты), одинакова для всех пакетов кадра
public static UInt32 MH_SSRC; // 12345678 (идентификатор источника информации)
public static UInt16 MH_SeqCounter_Hi // Номер последовательности (старшие 16 бит)
{
get => _SeqCounter_Hi;
set
{
_SeqCounter_Hi = value;
}
}
public static UInt16 MH_DataLen; // Количество байт данных строки, включенной в пакет
public static UInt16 MH_RowNumber; // Номер строки
public static UInt16 MH_Offset; // Смещение первого пиксела в строке (= 0)
//RTPVideoSupplementalData
public static UInt16 SD_Width; // Ширина (пиксели)
public static UInt16 SD_Height; // Высота (пиксели)
public static float SD_AzUpr; // (град)
public static float SD_ElUpr; // (град)
public static Int16 SD_Course; // Курс БЛА (0,01 град)
public static Int16 SD_Roll; // Крен БЛА (0,01 град)
public static Int16 SD_Pitch; // Тангаж БЛА (0,01 град)
public static Int16 SD_FrameId;
//RTPVideoSupplementalDataExtra
public static UInt32 DE_TLV_X; // Линия визирования цели в растроввых координатах
public static UInt32 DE_TLV_Y; //
public static UInt32 DE_TLV_dX; // поправки для линии визирования цели в растроввых координатах
public static UInt32 DE_TLV_dY; //
public static UInt32 SeqCounter
{
get
{
return (UInt32)((_SeqCounter_Hi << 16) | _SeqCounter_Low);
}
set
{
_SeqCounter_Low = (UInt16)value;
_SeqCounter_Hi = (UInt16)((value >> 16) & 0xFFFF);
}
}
public static Byte[] DataH0 = new Byte[56];
public static Byte[] DataH1 = new Byte[20];
public static void MakeDataH0()
{
Array.Copy(BitConverter.GetBytes(RTP.MH_VerPXCC), 0, DataH0, 0, 1);
Array.Copy(BitConverter.GetBytes(RTP.MH_MPT), 0, DataH0, 1, 1);
Array.Copy(BitConverter.GetBytes(RTP.MH_SeqCounter_Low), 0, DataH0, 2, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_Timestamp), 0, DataH0, 4, 4);
Array.Copy(BitConverter.GetBytes(RTP.MH_SSRC), 0, DataH0, 8, 4);
Array.Copy(BitConverter.GetBytes(RTP.MH_SeqCounter_Hi), 0, DataH0, 12, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_DataLen), 0, DataH0, 14, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_RowNumber), 0, DataH0, 16, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_Offset), 0, DataH0, 18, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_Width), 0, DataH0, 20, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_Height), 0, DataH0, 22, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_AzUpr), 0, DataH0, 24, 4);
Array.Copy(BitConverter.GetBytes(RTP.SD_ElUpr), 0, DataH0, 28, 4);
Array.Copy(BitConverter.GetBytes(RTP.SD_Course), 0, DataH0, 32, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_Roll), 0, DataH0, 34, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_Pitch), 0, DataH0, 36, 2);
Array.Copy(BitConverter.GetBytes(RTP.SD_FrameId), 0, DataH0, 38, 2);
Array.Copy(BitConverter.GetBytes(RTP.DE_TLV_X), 0, DataH0, 40, 4);
Array.Copy(BitConverter.GetBytes(RTP.DE_TLV_Y), 0, DataH0, 44, 4);
Array.Copy(BitConverter.GetBytes(RTP.DE_TLV_dX), 0, DataH0, 48, 4);
Array.Copy(BitConverter.GetBytes(RTP.DE_TLV_dY), 0, DataH0, 52, 4);
}
public static void MakeDataH1()
{
Array.Copy(BitConverter.GetBytes(RTP.MH_VerPXCC), 0, DataH1, 0, 1);
Array.Copy(BitConverter.GetBytes(RTP.MH_MPT), 0, DataH1, 1, 1);
Array.Copy(BitConverter.GetBytes(RTP.MH_SeqCounter_Low), 0, DataH1, 2, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_Timestamp), 0, DataH1, 4, 4);
Array.Copy(BitConverter.GetBytes(RTP.MH_SSRC), 0, DataH1, 8, 4);
Array.Copy(BitConverter.GetBytes(RTP.MH_SeqCounter_Hi), 0, DataH1, 12, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_DataLen), 0, DataH1, 14, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_RowNumber), 0, DataH1, 16, 2);
Array.Copy(BitConverter.GetBytes(RTP.MH_Offset), 0, DataH1, 18, 2);
}
/*
struct RTPMsgHeader
{
uint8_t Ver : 2; // версия протокола (текущая версия 2)
uint8_t P : 1; // = 0 (не используется заполнение в конце пакета)
uint8_t X : 1; // = 0 (не используются дополнительные заголовки)
uint8_t CC : 4; // = 0 (CSRC - идентификаторы не используются);
uint8_t M : 1; // маркерный бит. Установка этого бита в 1 свидетельствует о том, что данный UDP – пакет содержит последнюю строку кадра, для всех остальных пакетов задается 0
uint8_t PT : 7; // поле идентифицирует формат трафика RTP и определяет его интерпретацию. Задается 99
uint16_t SeqCounter_Low; // Номер последовательности (младшие 16 бит)
uint32_t Timestamp; // Метка времени (90 кГц отсчеты), одинакова для всех пакетов кадра
uint32_t SSRC; // 12345678 (идентификатор источника информации)
uint16_t SeqCounter_Hi; // Номер последовательности (старшие 16 бит)
uint16_t DataLen; // Количество байт данных строки, включенной в пакет
uint16_t RowNumber; // Номер строки
uint16_t Offset; // Смещение первого пиксела в строке (= 0)
uint32_t get_seqcounter() { return ((SeqCounter_Hi << 16) | SeqCounter_Low); }
};
//------------------------------------------------------------------------------------------------------------
struct RTPVideoSupplementalData
{
uint16_t Width; // Ширина (пиксели)
uint16_t Height; // Высота (пиксели)
float AzUpr; // (град)
float ElUpr; // (град)
int16_t Course; // Курс БЛА (0,01 град)
int16_t Roll; // Крен БЛА (0,01 град)
int16_t Pitch; // Тангаж БЛА (0,01 град)
int16_t FrameId;
RTPVideoSupplementalData()
{
::memset(this, 0, sizeof(RTPVideoSupplementalData));
}
};
//------------------------------------------------------------------------------------------------------------
// Дополнительные данные нулевой строки выходящие за рамки ПИВ
struct RTPVideoSupplementalDataExtra
{
uint32_t TLV_X; // Линия визирования цели в растроввых координатах
uint32_t TLV_Y; //
uint32_t TLV_dX; // поправки для линии визирования цели в растроввых координатах
uint32_t TLV_dY; //
};
*/
}
}