📄 hi_rtp.h
字号:
#ifndef __HI_RTP_H__#define __HI_RTP_H__#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <unistd.h>#include <stdlib.h>#include <stdio.h>#include <errno.h>#include <string.h>#include <pthread.h>#include <netinet/in.h>#include <arpa/inet.h>#include "hi_type.h"#define IN#define OUT#define IO#define RPT_MAX_PACKET_BUFF 4096#define HI_SockLen_T socklen_t#define HI_Pthread_T pthread_t#define HI_SSIZE_T ssize_t#define VO_CHN0 0typedef unsigned short HI_PORT;typedef int RTP_SOCKET;/*RTP Payload type define*/typedef enum hiRTP_PT_E{ RTP_PT_ULAW = 0, /* mu-law */ RTP_PT_GSM = 3, /* GSM */ RTP_PT_G723 = 4, /* G.723 */ RTP_PT_ALAW = 8, /* a-law */ RTP_PT_G722 = 9, /* G.722 */ RTP_PT_S16BE_STEREO = 10, /* linear 16, 44.1khz, 2 channel */ RTP_PT_S16BE_MONO = 11, /* linear 16, 44.1khz, 1 channel */ RTP_PT_MPEGAUDIO = 14, /* mpeg audio */ RTP_PT_JPEG = 26, /* jpeg */ RTP_PT_H261 = 31, /* h.261 */ RTP_PT_MPEGVIDEO = 32, /* mpeg video */ RTP_PT_MPEG2TS = 33, /* mpeg2 TS stream */ RTP_PT_H263 = 34, /* old H263 encapsulation */ //RTP_PT_PRIVATE = 96, RTP_PT_H264 = 96, /* hisilicon define as h.264 */ RTP_PT_G726 = 97, /* hisilicon define as G.726 */ RTP_PT_ADPCM = 98, /* hisilicon define as ADPCM */ RTP_PT_AAC = 99, /* hisilicon define as AAC */ RTP_PT_INVALID = 127}RTP_PT_E;typedef struct hiRTP_STATS_S{ HI_U64 sent_packet; /* number of packets send */ HI_U64 sent_byte; /* bytes sent */ HI_U64 sent_error; /* error times when send */ HI_U64 recv_packet; /* number of packets received */ HI_U64 recv_byte; /* bytes of payload received */ HI_U64 unavaillable; /* packets not availlable when they were queried */ HI_U64 bad; /* packets that did not appear to be RTP */ HI_U64 discarded; /* incoming packets discarded because the queue exceeds its max size */ HI_U64 timeout_cnt;} RTP_STATS_S;struct hiRTP_RECV_S;typedef int (*RTP_ON_RECV_CB)(struct hiRTP_RECV_S * , unsigned char *, unsigned int, int *); typedef enum hiRTP_RUNSTATE_E{ RTP_RUNSTATE_STOP = 0, RTP_RUNSTATE_RUNNING = 1}RTP_RUNSTATE_E;#define RTP_DATA_MAX_LENGTH 2048typedef struct hiRTP_RECV_S{ HI_Pthread_T thd; /* thread to recv cmd */ HI_PORT listen_port; RTP_SOCKET sock; /*send/recv socket*/ RTP_PT_E pt; /*payload type*/ HI_U16 last_sn; /*last recv sn*/ HI_U32 last_ts; /*last recv sn*/ RTP_STATS_S stats; /*stats*/ RTP_ON_RECV_CB rtp_on_recv; volatile RTP_RUNSTATE_E runState; HI_U8 buff[RTP_DATA_MAX_LENGTH]; int *ext_args;}RTP_RECV_S;/* total 12Bytes */typedef struct hiRTP_HDR_S{#if (BYTE_ORDER == LITTLE_ENDIAN) /* byte 0 */ HI_U16 cc :4; /* CSRC count */ HI_U16 x :1; /* header extension flag */ HI_U16 p :1; /* padding flag */ HI_U16 version :2; /* protocol version */ /* byte 1 */ HI_U16 pt :7; /* payload type */ HI_U16 marker :1; /* marker bit */#elif (BYTE_ORDER == BIG_ENDIAN) /* byte 0 */ HI_U16 version :2; /* protocol version */ HI_U16 p :1; /* padding flag */ HI_U16 x :1; /* header extension flag */ HI_U16 cc :4; /* CSRC count */ /*byte 1*/ HI_U16 marker :1; /* marker bit */ HI_U16 pt :7; /* payload type *//#else #error YOU MUST DEFINE BYTE_ORDER == LITTLE_ENDIAN OR BIG_ENDIAN ! #endif /* bytes 2, 3 */ HI_U16 seqno :16; /* sequence number */ /* bytes 4-7 */ HI_U32 ts; /* timestamp in ms */ /* bytes 8-11 */ HI_U32 ssrc; /* synchronization source */} RTP_HDR_S;typedef enum hiRTP_TARGETHOST_STATE{ RTP_TARGETHOST_STATE_INIT = 0, RTP_TARGETHOST_STATE_REQ_IFrame = 1, RTP_TARGETHOST_STATE_REQ_PARA = 2, RTP_TARGETHOST_STATE_Sending = 3, RTP_TARGETHOST_STATE_BUTT}RTP_TARGETHOST_STATE_E;typedef char HI_IP_ADDR[64];typedef int HI_SOCKET;typedef struct hiRTP_TARGETHOST{ //struct list_head ptr; HI_IP_ADDR remote_ip; HI_PORT remote_port; /*only use for sender*/ struct sockaddr_in remote_addr; HI_SOCKET sock; HI_BOOL bActive; /*是否激活,如果false, 不发送*/ RTP_TARGETHOST_STATE_E hostState; }RTP_TARGETHOST_S;/*定义了一个Sender 最多处理的发送数目*/#define RTP_MAX_SENDER 8typedef struct hiRTP_SENDER_S{ RTP_TARGETHOST_S targethosts[RTP_MAX_SENDER]; RTP_PT_E pt; /*payload type*/ HI_U32 ssrc; HI_U16 last_sn; /*last recv sn*/ HI_U16 resv; HI_U32 last_ts; /*last recv sn*/ RTP_STATS_S stats; /*stats*/ HI_BOOL bActive; /*是否激活,如果false, 不发送*/ RTP_SOCKET sock; /*send/recv socket*/ HI_PORT rtpport; /*本地udp port*/ HI_PORT rtcpport; /*本地udp port*/ HI_U8 buff[RPT_MAX_PACKET_BUFF]; HI_U32 buffLen; }RTP_SENDER_S;#define RTP_HDR_SET_VERSION(pHDR, val) ((pHDR)->version = val)#define RTP_HDR_SET_P(pHDR, val) ((pHDR)->p = val)#define RTP_HDR_SET_X(pHDR, val) ((pHDR)->x = val) #define RTP_HDR_SET_CC(pHDR, val) ((pHDR)->cc = val)#define RTP_HDR_SET_M(pHDR, val) ((pHDR)->marker = val)#define RTP_HDR_SET_PT(pHDR, val) ((pHDR)->pt = val)#define RTP_HDR_SET_SEQNO(pHDR, _sn) ((pHDR)->seqno = (_sn))#define RTP_HDR_SET_TS(pHDR, _ts) ((pHDR)->ts = (_ts))#define RTP_HDR_SET_SSRC(pHDR, _ssrc) ((pHDR)->ssrc = _ssrc)#define RTP_HDR_LEN sizeof(RTP_HDR_S)#define RTP_DATA_MAX_LENGTH 2048#define RTP_VERSION 2/*创建socket*/HI_S32 HI_Socket( HI_S32 af, HI_S32 type,HI_S32 protocol );/*在非连接上接收数据*/HI_SSIZE_T HI_Recvfrom( HI_S32 s, HI_CHAR *buf, HI_S32 len, HI_S32 flags, struct sockaddr *pfrom, HI_S32 *pfromlen );HI_S32 HI_SetSockOpt(HI_S32 s, HI_S32 level, HI_S32 optname, const HI_VOID *optval, HI_SockLen_T optlen);/*关闭socket*/HI_S32 HI_CloseSocket(HI_S32 ulSocket);/*将地址绑定到一个socket*/ HI_S32 HI_Bind( HI_S32 s, const struct sockaddr *paddr, HI_S32 addrlen );/* 创建一个*/HI_S32 HI_RTP_Recv_Create(IO RTP_RECV_S ** ppRtpStream, IN HI_S32 _listen_port, IN RTP_ON_RECV_CB _on_recv_fh, int *ext_args );/* 开启接收服务 */ HI_S32 HI_RTP_Recv_Start(IN RTP_RECV_S * pRtpStream);HI_S32 HI_RTP_Recv_Stop(IO RTP_RECV_S * pRtpStream);HI_S32 HI_RTP_Recv_Destroy(IO RTP_RECV_S *pRtpStream);HI_PORT HI_SOCKET_Udp_GetPort(HI_SOCKET fd);HI_SOCKET HI_SOCKET_Udp_Open(HI_PORT port);#define RTP_DEFAULT_SSRC 41030HI_S32 HI_RTP_Sender_Create(RTP_SENDER_S ** ppRtpStream, RTP_PT_E pt);RTP_TARGETHOST_S* HI_RTP_Sender_Find(IN RTP_SENDER_S* pRtpStream, IN HI_CHAR* ip, IN HI_PORT port);RTP_TARGETHOST_S* HI_RTP_Sender_FindAvail(IN RTP_SENDER_S* pRtpStream);HI_S32 HI_RTP_Sender_Add(IN RTP_SENDER_S* pRtpStream, IN HI_CHAR* ip, IN HI_PORT port);/*带有同步头*/HI_S32 HI_RTP_Packet(IN RTP_SENDER_S * pRtpStream , HI_S32 ts_inc, HI_U32 marker, HI_CHAR *pPayload, HI_S32 len);HI_S32 HI_RTP_Send(IN RTP_SENDER_S * pRtpStream);#ifdef __cplusplus#if __cplusplus}#endif#endif /* __cplusplus */#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -