www.pudn.com > RTP通用开发库(for Linux).rar > syn.h
/*------------------------------------------------------------------------- * syn.h - tseq, tsgt, tslt, tsmax, tsmin *------------------------------------------------------------------------- */ #ifndef SYN_H #define SYN_H #include#include #include #include #include /* Macros to compare timestamps */ #define SYN_TSWINDOW (1 << ((sizeof(mediatime_t) * 8) - 1)) #define tseq(x, y) (x == y) #define tsgt(x, y) (x > y ? (x - y < SYN_TSWINDOW ? TRUE : FALSE) : (y - x < SYN_TSWINDOW ? FALSE : TRUE)) #define tslt(x, y) (tsgt(y, x)) #define tsmax(x, y) (tsgt(x, y) ? x : y) #define tsmin(x, y) (tslt(x, y) ? x : y) /* Read constants */ #define SYN_CONTINUE 1 #define SYN_NODATA -2 #define SYN_BUFFERING -3 #define SYN_READ_FLUSH 0x1 /* Skip stale data */ #define SYN_READ_BLOCK 0x2 /* Constants for synsynchronize */ #define SYN_EXTERNALAHEAD -2 #define SYN_NOTADJUSTED 1 #define SYN_ADJUSTED 2 /* Commands for synctl */ #define SYN_CTL_GETRTPSESSION 1 #define SYN_CTL_ADDSYNCFD 2 #define SYN_CTL_REMSYNCFD 3 #define SYN_CTL_STREAM_SETREADFLAGS 4 #define SYN_CTL_STREAM_GETREADFLAGS 5 #define SYN_CTL_STREAM_ISBUFFERING 6 #define SYN_CTL_STREAM_GETCLKRT 7 #define SYN_CTL_STREAM_GETTYPE 8 #define SYN_CTL_STREAM_GETLASTREAD 9 #define SYN_CTL_STREAM_GETPARAM 10 #define SYN_CTL_STREAM_GETLEEWAY 11 /* microsec */ #define SYN_CTL_STREAM_SETLEEWAY 12 /* microsec */ #define SYN_CTL_STREAM_GETJITTHRESH 13 #define SYN_CTL_STREAM_SETJITTHRESH 14 #define SYN_CTL_STREAM_GETBUFSPAN 15 /* Constants for synsession */ #define SYN_SSRCHTSZ 11 #define SYN_DFLTEVENTBUFSZ 1024 #define SYN_DFLTEVENTBUFCNT 32 #define SYN_DEFAULT_LEEWAY 10000 /* microsec */ #define SYN_FDCNT 10 #define SYN_BADFD -1 struct synsession { pthread_mutex_t ssn_mutex; pthread_cond_t ssn_cond; struct ht *ssn_ssrcs; /* hashtable ssrc -> synstream **/ struct eventqueue ssn_events; /* event queue for internal use */ struct session *ssn_session; /* associated RTP layer session */ pthread_t ssn_eventthr; /* thread to run event loop */ int ssn_eventthrstat; pthread_mutex_t ssn_eventthrmutex; pthread_t ssn_recvthr; int ssn_recvthrstat; pthread_mutex_t ssn_recvthrmutex; pthread_mutex_t ssn_getstreammutex; int ssn_syncfds[SYN_FDCNT];/* FDs to other synch sessions */ }; /* Stream types */ #define SYN_STREAMTYPE_PACKET 0 #define SYN_STREAMTYPE_SAMPLE 1 #define SYN_STREAMTYPE_FRAME 2 /* structure to hold state for receive stream */ struct synstream { int sstm_type; /* type of stream (e.g. sample) */ ssrc_t sstm_ssrc; /* stream's synchronization src */ int sstm_readflags; /* stream's readflags */ bool sstm_buffering; /* stream is still buffering */ bool sstm_zombie; /* marked for removal if true */ int sstm_clkrt; /* stream's clock rate */ int sstm_refcnt; /* to prevent bad pointers */ pthread_cond_t sstm_readcond; /* cond var for blocking read */ pthread_mutex_t sstm_readmutex; /* mutex associated with above */ mediatime_t sstm_lastread; /* timestamp of last data read */ struct timespec sstm_clkx; /* local time stamp */ mediatime_t sstm_clky; /* equivelant media time stamp */ mediatime_t sstm_leeway; /* how early data can be retn'd */ struct timespec sstm_leewayts; /* leeway in timespec format */ mediatime_t sstm_jitthresh; /* jitter buffer (media ticks) */ void * sstm_parameters;/* type-dependant parameters */ }; /* structure for passing synsynchto args between processes */ struct synsyncargs { char sa_cname[256]; struct timespec sa_ntp; struct timespec sa_localtime; }; /* API Calls */ struct synsession *synopen(struct in_addr, int, int, int); int synclose(struct synsession *); int synstreamon(struct synsession *, ssrc_t, int, int, mediatime_t, void *); int synstreamoff(struct synsession *, ssrc_t); int synrebuffer(struct synsession *, ssrc_t); int synctl(struct synsession *, int, char *, ssrc_t); int synsources(struct synsession *, ssrc_t *, int); int synread(struct synsession *, ssrc_t, struct timespec *, mediatime_t *, char *, int, void *); /* Internal functions */ int synbufspan(struct synsession *, struct synstream *, mediatime_t *, mediatime_t *); struct synstream *syngetstream(struct synsession *, ssrc_t); int synreleasestream(struct synsession *, struct synstream *); void syneventloop(struct synsession *); int synprocessevent(struct synsession *, struct event *, int); void synstreamdestroy(struct synstream *); int synnewdata(struct synsession *, ssrc_t); int synreadnextpacket(struct synsession *, struct synstream *, struct rtpln **); int synreadwait(struct synsession *, struct synstream *, struct rtpln *, mediatime_t, struct timespec, mediatime_t, struct timespec *); /* synchronization functions */ void synsyncrecvthr(struct synsession *); int synsyncrecv(struct synsession *, int); int synsynchronize(struct synsession *, char *); int synsyncto(struct synsession *, struct cnamelist *, struct timespec *, struct timespec *); #endif