⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hi_rtp.h

📁 sample on embedded linux
💻 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 + -