?? hust_rtp.h
字號(hào):
/*------------------------------------------------------------------------- * rtp.h - RTP_HEADER_LEN, RTP_DATA, RTP_INACTIVE, RTP_CNAMEPRESENT, * RTP_DATASEEN *------------------------------------------------------------------------- */#ifndef RTP_H#define RTP_H#include <ipOS.h>#include <ipHAL.h>#include <ipStack.h>#include <ipEthernet.h>#include "hust_rtplibcommon.h"#include "hust_bufpool.h"#include "hust_hash.h"/* RTP Constants */#define RTP_CURRVERS 2 /* current version number */#define RTP_HEADERMINLEN 16 /* min header length */#define RTP_MAXDROPOUT 3000 /* for rtpupdateseq() */#define RTP_MAXMISORDER 100 /* for rtpupdateseq() */#define RTP_MINSEQUENTIAL 2 /* for rtpupdateseq() */#define RTP_SEQMOD (1 << 16) /* for rtpupdateseq() */#define CLOCKRATE 90000#define MAXCC 16#define MPEG2TYPE 33#define RTP_DATASIZE 1316#define RTP_PACKETLEN 1332#define SSRCDESTROY 0#define CNAMEDESTROY 1/* RTP Macros */#define RTP_HEADER_LEN(prtp) (RTP_HEADERMINLEN + \ ((prtp)->rtp_cc * sizeof(ssrc_t)))#define RTP_DATA(prtp) ((char *)prtp + RTP_HEADER_LEN(prtp))/* Structure for RTP packet */struct rtp {#if __BYTE_ORDER == __LITTLE_ENDIAN || defined(_LITTLE_ENDIAN) u8_t rtp_cc:4; /* source count */ u8_t rtp_ext:1; /* extension flag */ u8_t rtp_pad:1; /* padding flag */ u8_t rtp_ver:2; /* version */ u8_t rtp_payload:7; /* payload type */ u8_t rtp_mark:1; /* marker flag */#elif __BYTE_ORDER == __BIG_ENDIAN || defined(_BIG_ENDIAN) u8_t rtp_ver:2; /* version */ u8_t rtp_pad:1; /* padding flag */ u8_t rtp_ext:1; /* extension flag */ u8_t rtp_cc:4; /* source count */ u8_t rtp_mark:1; /* marker flag */ u8_t rtp_payload:7; /* payload type */#endif seq_t rtp_seq; /* sequence number */ mediatime_t rtp_time; /* timestamp */ ssrc_t rtp_ssrc; /* synchronization source identifier *//// char* rtp_data; /* beginning of header extnsn or data */ u32_t rtp_data_addr;};/* Structure for linked list node for RTP packets */struct rtpln { u16_t rln_len; /* total length of packet */ u32_t rln_seq; /* extended sequence number */ struct rtpln *rln_next; /* older packer */ struct rtpln *rln_prev; /* newer packet */ struct rtp rln_rtp; /* RTP packet */};/* Structure for queue of struct rtplns */struct rtpqueue { struct rtpln *rq_head; /* oldest packet in queue */ struct rtpln *rq_tail; /* newest packet in queue */ u16_t rq_len; /* sum of packet sizes in queue */ ///pthread_mutex_t rq_mutex; /* mutex to lock queue */};/* Stream Constants */#define RTP_BYERECEIVED -1#define RTP_TIMEDOUT -2#define RTP_PAYLOADUNINITIALIZED -1#define RTP_INADDRUNINITIALIZED INADDR_ANY#define RTP_INFINITEINACTIVETHRESH -1#define RTP_DEFAULT_INACTIVETHRESH 5#define RTP_NTPINT 1#define RTP_NTPFRAC 0/* Stream macros */#define RTP_INACTIVE(v) (v == RTP_BYERECEIVED || v == RTP_TIMEDOUT)#define RTP_CNAMEPRESENT(pstm) (pstm->stm_cname[0] != 0)#define RTP_DATASEEN(pstm) (pstm->stm_packets > pstm->stm_recprior)/* State structure for stream */struct stream { ///pthread_mutex_t /// stm_mutex; /* mutex for locking stream structure */ ssrc_t stm_ssrc; /* synchronization source identifier */ bool stm_zombie; /* stream marked for removal when true */ u32_t stm_clkrt; /* participant's clockrate in Hz */ u8_t stm_payload; /* stream's payload type */ bool stm_enqueue; /* switch to turn on data enqueueing */ u32_t stm_ip; /* partipant's IP address */ ref_t stm_refcnt; /* reference count */ struct rtpqueue stm_queue; /* queue of RTP packets */ bool stm_mark; /* source marked for rblock generation */ s8_t stm_inactive; /* number of inactive cycles or status */ s8_t stm_inactthresh;/* number of inactive cycles to timeout */ s32_t stm_jitter; /* jitter measure */ u16_t stm_packets; /* cumulative packets received */ u8_t stm_probation; /* sequential pkts to validate stream */ seq_t stm_firstseq; /* first sequence number received */ seq_t stm_hiseq; /* greatest seq number recently received*/ u16_t stm_badseq; /* bad sequence number (RFC 1889) */ u8_t stm_roll; /* number of `roll-overs' */ u16_t stm_recprior; /* value saved from last RTCP cycle */ u16_t stm_expprior; /* value saved from last RTCP cycle */ mediatime_t stm_lastts; /* last timestamp for jitter */ u32_t stm_lastrec; /* time last packet received for jitter */ u32_t stm_lastntp[2]; /* NTP timestamp of last SR (low, high) */ /////要寫入rr包中的時(shí)間戳 u32_t stm_lastsr; /* my time last sender report received */ mediatime_t stm_lastsrts; /* RTP timestamp in last sender report */ struct stream *stm_cnamenext; /* next participant with same cname */ struct stream *stm_cnameprev; /* previous participant with same cname */ char *stm_cname; /* canonical name */ char *stm_name; /* participant's name */ char *stm_email; /* participant's email address */ char *stm_phone; /* participant's phone */ char *stm_loc; /* participant's location */ char *stm_tool; /* participant's tool name */ char *stm_note; /* participant's note */ char *stm_priv; /* private data *////add by xu u8_t stm_lostfra; /* fraction lost of RR */ u32_t stm_lostpac; /* cumulative number of packets lost of RR*/ u32_t stm_exthiseq; /* extended highest sequence number received*/ u32_t stm_delay; /* delay since last SR */ u32_t stm_sdpackets; u32_t stm_sdoctets;};struct cnamelist { struct stream *cn_stream;};/* Session constants */#define RTP_CNAMEHTSZ 27#define RTP_SSRCHTSZ 27#define RTP_DEFAULT_SESSIONBW 16000#define RTP_DEFAULT_SESSIONTTL 16#define RTP_MAXEVENTQUEUES 16/* Commands for rtpctl */#define RTP_CTL_ADDEVENTQUEUE 1#define RTP_CTL_REMEVENTQUEUE 2#define RTP_CTL_SETTTL 3#define RTP_CTL_SETBW 4#define RTP_CTL_SETCLEANUP 5#define RTP_CTL_RTCPCYCLETHREAD 6#define RTP_CTL_RTPRECVTHREAD 7#define RTP_CTL_RTCPRECVTHREAD 8#define RTP_CTL_STREAM_GETENQUEUE 9#define RTP_CTL_STREAM_GETCLKRT 10#define RTP_CTL_STREAM_SETCLKRT 11#define RTP_CTL_STREAM_GETPT 12#define RTP_CTL_STREAM_GETQLEN 15#define RTP_CTL_STREAM_GETINACTIVE 16#define RTP_CTL_STREAM_GETJITTER 17#define RTP_CTL_STREAM_GETPACKETCNT 18#define RTP_CTL_STREAM_GETROLLOVERS 19 #define RTP_CTL_STREAM_GETPROBATION 20#define RTP_CTL_STREAM_GETCNAME 21#define RTP_CTL_STREAM_GETNAME 22#define RTP_CTL_STREAM_GETEMAIL 23 #define RTP_CTL_STREAM_GETPHONE 24#define RTP_CTL_STREAM_GETTOOL 25#define RTP_CTL_STREAM_GETNOTE 26#define RTP_CTL_STREAM_GETPRIV 27#define RTP_CTL_STREAM_GETINACTTHR 28#define RTP_CTL_STREAM_SETINACTTHR 29#define RTP_CTL_STREAM_GETSRTS 30#define RTP_CTL_STREAM_GETSRNTP 31#define RTP_CTL_STREAM_LOCK 32#define RTP_CTL_STREAM_UNLOCK 33#define RTP_CTL_STREAM_NULL 34#define RTP_CTL_STREAM_EXISTS RTP_CTL_STREAM_NULLstruct session { ////struct in_addr sn_addr; /* session address */ u32_t sn_addr; u16_t sn_port; /* session port */ ///pthread_mutex_t sn_mutex; /* mutex to lock session structure */ ///pthread_cond_t sn_cond; /* session condition variable */ ///pthread_mutex_t sn_cnamemutex;/* mutex to lock cname threadings */ ///pthread_mutex_t /// sn_getstreammutex;/* mutex for rtpgetstream function */ u32_t sn_ssrc; /* my synchronization source identifier */ u32_t sn_bw; /* approx session bandwidth in bits/sec */ bool sn_autocleanup; /* action to take on stream expiration */ ///int sn_rtpfd; /* file descriptor for RTP */ ///int sn_rtcpfd; /* file descriptor for RTCP */ struct ht *sn_ssrcs; /* ssrc -> stream * hashtable */ struct ht *sn_cnames; /* cname -> stream * hashtable */ //////struct sockaddr_in ////// sn_rtcpto; /* destination for RTCP packets */ u32_t sn_rtcpto; u16_t sn_avgrtcp; /* RTCP len for interval computation */ struct eventqueue *sn_eventqs[RTP_MAXEVENTQUEUES]; /* event queues */ /////pthread_t sn_rtcpcyclethr;/* thread to perform RTCP cycle dutes */ ///int ///sn_rtcpcyclethrstat;/* state of RTCP cycle thread */ ////pthread_mutex_t ////// sn_rtcpcyclethrmutex;/* mutex for cycle thread state */ /////pthread_t sn_rtpthr; /* thread to process RTP packets */ ///int sn_rtpthrstat; /* RTP receive thread state */ /////pthread_mutex_t ///// sn_rtpthrmutex; /* mutex for RTP receive thread state */ /////pthread_t sn_rtcpthr; /* thread to process RTCP packets */ ///int sn_rtcpthrstat; /* RTCP receive thread state */ ///////pthread_mutex_t ////// sn_rtcpthrmutex; /* mutex for RTCP receive thread state */ ///struct bufpool sn_bpool; /* pool of buffers for RTP packets */ ssrc_t *sn_cyclesources; /* memory for rtcpcycle() to hold ssrcs */ char *sn_cyclebuf; /* memory for rtcpcycle() to make RR */ u32_t sn_rtppktcnt; u32_t sn_rtpoctcnt; };#endif/*********************************注:所有的線程變量和線程互斥變量都被注釋掉 所有的地址型結(jié)構(gòu),包括:struct sockaddr_in和struct in_addr都用u32_t類型(unsigned long int) 來代替*************************/struct session *rtpopen(u32_t, u16_t, u16_t, u8_t);int rtpclose(struct session *);int rtpstreamon(struct session *, ssrc_t, u32_t);int rtpstreamoff(struct session *, ssrc_t);int rtpctl(struct session *, int, char *, int, ssrc_t);int rtpsources(struct session *, ssrc_t *, u16_t);int rtpwritefifo(struct stream*);/* API queue functions */int rtpqlock(struct session *, ssrc_t ssrc);int rtpqunlock(struct session *, ssrc_t ssrc);struct rtpln *rtpqextracthead(struct session *, ssrc_t ssrc);int rtpqinsert(struct session *, ssrc_t, struct rtpln *);int rtpqclear(struct session *, ssrc_t);int rtpqinit(struct rtpqueue *);int rtpqdestroy(struct rtpqueue *);/* utility */int copypacket(struct rtpln *, char *, int);int copypacket2(struct rtpln *, char *, int *, char *, int *);/* Internal calls *////int rtpopensockets(struct session *, struct in_addr, int);///struct stream *rtpnewstream(struct session *, ssrc_t);struct stream *rtpnewstream();///int rtprecv(struct session *);int rtpupdate(struct session *, struct stream *, struct rtp *);void rtpinitseq(struct stream *, seq_t);int rtpupdateseq(struct session *, struct stream *, seq_t);void rtpdestroystream(struct stream *);int rtpremovestream(struct session *, struct stream *);struct stream *rtpgetstream(struct session *, ssrc_t);////struct stream *rtpgetstream();int rtpreleasestream(struct session *, struct stream *);ssrc_t rtpmkssrc(struct session *);///void rtphton(struct rtp *);///void rtpntoh(struct rtp *);int rtpstreamcleanup(struct session *, struct stream *);///void rtpinitseq(struct stream *, unsigned short);int rtpcheckcollision(struct session *, ssrc_t);///void rtprecvthreadfcn(struct session *);int rtppostevent(struct session *, u8_t, ssrc_t, void *, u16_t);/* queue internal */struct rtpln *rtpqextract(struct rtpqueue *, struct rtpln *);int _rtpqinsert(struct rtpqueue *, struct rtpln *, bool *);int _rtpqclear(struct rtpqueue *);
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -