Экстракт последовательности RTP - PullRequest
2 голосов
/ 16 июля 2009

Пакет RTP состоит из 12-байтового заголовка RTP и последующая полезная нагрузка RTP 3-й и 4-й байты заголовка содержат Старший байт и наименее значимый байт порядковый номер пакета RTP Seq Num = (MSB << 8) + LSB </p>

char pszPacket [12];

...

long lSeq = ???? - Как получить порядковый номер из пакета?

Ответы [ 3 ]

4 голосов
/ 16 июля 2009
unsigned short seq = (packet[2] << 8) | packet[3];
2 голосов
/ 16 июля 2009

Конечно, это просто "long lSeq = (unsigned char) (pszPacket [2] << 8) | (unsigned char) pszPacket [3];"? </p>

0 голосов
/ 18 февраля 2019

Если вам нужна правильная реализация для этого:

typedef struct _RTPHeader
{
  //first byte
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  unsigned int         CC:4;        /* CC field */
  unsigned int         X:1;         /* X field */
  unsigned int         P:1;         /* padding flag */
  unsigned int         version:2;
#elif G_BYTE_ORDER == G_BIG_ENDIAN
  unsigned int         version:2;
  unsigned int         P:1;         /* padding flag */
  unsigned int         X:1;         /* X field */
  unsigned int         CC:4;        /* CC field*/
#else
#error "G_BYTE_ORDER should be big or little endian."
#endif
  //second byte
#if G_BYTE_ORDER == G_LITTLE_ENDIAN
  unsigned int         PT:7;     /* PT field */
  unsigned int         M:1;       /* M field */
#elif G_BYTE_ORDER == G_BIG_ENDIAN
  unsigned int         M:1;         /* M field */
  unsigned int         PT:7;       /* PT field */
#else
#error "G_BYTE_ORDER should be big or little endian."
#endif
  guint16              seq_num;      /* length of the recovery */
  guint32              TS;                   /* Timestamp */
  guint32              ssrc;
} RTPHeader; //12 bytes

А что вы можете сделать:

char pszPacket[12];
RTPHeader* myRTPPacket = (RTPHeader*) pszPacket;
printf("Sequence number is: %hu", myRTPPacket->seq_num;
...