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

📄 packread.c

📁 linux环境下用纯c写的RTP协议的通用开发库
💻 C
字号:
/*------------------------------------------------------------------------- * packread.c - packread *------------------------------------------------------------------------- */#include <packet.h>#include <rtp.h>#include <syn.h>#include <util.h>#include <strings.h>#include <stdlib.h>#include <unistd.h>#include <errno.h>/*------------------------------------------------------------------------ * packread - read an entire packet from a stream, including RTP header * Notes:     Packread returns the next packet. If flush is true *		it returns the first packet whose timestamp is <= now, *		otherwise, the first packet whose timestamp is <=  *		max(now, lastread). *            On success packread returns the number of bytes copied. *------------------------------------------------------------------------ */intpackread(struct synsession *pssn, struct synstream *psstm, struct timespec *time, mediatime_t *ts, char *buf, int buflen){	struct timespec	now, time2;	struct rtp		*prtp, *prtp2;	struct rtpln		*pln, *pln2;	mediatime_t		mnow;	int			bytescopied, rv;	bool			block, flush;	block = (psstm->sstm_readflags & SYN_READ_BLOCK) != 0;	flush = (psstm->sstm_readflags & SYN_READ_FLUSH) != 0;	memset(time, 0, sizeof(struct timespec));	*ts = 0;  	while(TRUE) {    		/*		 * Get next packet.		 */		if ((rv = synreadnextpacket(pssn, psstm, &pln)) < 0)			return rv;    		prtp = &pln->rln_rtp;		clock_gettime(CLOCK_REALTIME, &now);		mnow = timeflatten(timesub(now, psstm->sstm_clkx), psstm->sstm_clkrt) + psstm->sstm_clky;		/*		 * Prevent reordering. Do not return a packet 		 * that is older than the last one we read.		 */		if (tslt(prtp->rtp_time, psstm->sstm_lastread)) {			bufpoolfreebuf(pln);			continue;		}    		/*		 * Check next packet's header to see if this packet's too old.		 */		if (flush == TRUE) {			pln2 = rtpqextracthead(pssn->ssn_session, psstm->sstm_ssrc);			prtp2 = &pln2->rln_rtp;			if (!tsgt(prtp2->rtp_time, mnow)) {				bufpoolfreebuf(pln);				rtpqinsert(pssn->ssn_session, psstm->sstm_ssrc, pln2);				continue;			}			rtpqinsert(pssn->ssn_session, psstm->sstm_ssrc, pln2);		}		prtp = &pln->rln_rtp;		/*		 * Check if the packet is too new.		 */		if ((rv = synreadwait(pssn, psstm, pln, prtp->rtp_time, now, mnow, time)) < 0)			return rv;		else if (rv == SYN_CONTINUE)			continue;		psstm->sstm_lastread = prtp->rtp_time;		bytescopied = copypacket(pln, buf, buflen);		time2 = timeunflatten(prtp->rtp_time - psstm->sstm_clky, psstm->sstm_clkrt);		time2 = timeadd(time2, psstm->sstm_clkx);		*time = time2;		*ts = prtp->rtp_time;		bufpoolfreebuf(pln);		return bytescopied;	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -