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

📄 synnewdata.c

📁 linux环境下用纯c写的RTP协议的通用开发库
💻 C
字号:
/*------------------------------------------------------------------------- * synnewdata.c - synnewdata *------------------------------------------------------------------------- */#include <syn.h>/*------------------------------------------------------------------------ * synnewdata - called on every new packet when buffering and on head * data (packets inserted at queue head). Determines if buffering is  * complete and signals any threads waiting on read for the stream. *------------------------------------------------------------------------ */intsynnewdata(struct synsession *pssn, ssrc_t ssrc){	struct synstream	*psstm;	mediatime_t             begin, end;#ifdef RTPLIB_SYNCHRONIZE	char		        cname[256];#endif /* RTPLIB_SYNCHRONIZE */	psstm = syngetstream(pssn, ssrc);	if (psstm == NULL)		return ERROR;	/*	 * Check that stream still exists at RTP layer.	 * I.e., we did not miss a timed out event.	 */	if (rtpctl(pssn->ssn_session, RTP_CTL_STREAM_EXISTS, NULL, 0, ssrc) < 0) {		synstreamoff(pssn, ssrc);		synreleasestream(pssn, psstm);		return ERROR;	}	if (psstm->sstm_buffering == TRUE) {		/*		 * Check the span. If it is greater than or 		 * equal to psstm->sstm_jitterthresh,		 * buffering is finished.		 */		if (synbufspan(pssn, psstm, &begin, &end) == ERROR) {			synreleasestream(pssn, psstm);			return ERROR;		}    		if (end - begin >= psstm->sstm_jitthresh) {			/* 			 * Once buffering is complete, we no			 * longer need event on each packet.			 */			eventqfilterssrc(&pssn->ssn_events, EVENT_RTP, psstm->sstm_ssrc, FALSE);			/*			 * Set relation between local clock and 			 * this stream's media clock.			 */ 			psstm->sstm_clky = begin;			clock_gettime(CLOCK_REALTIME, &psstm->sstm_clkx);			/*			 * Wake any threads waiting to read from this stream.			 */			if (pthread_mutex_lock(&psstm->sstm_readmutex) != 0) {				synreleasestream(pssn, psstm);				return ERROR;			}			psstm->sstm_buffering = FALSE;			pthread_cond_broadcast(&psstm->sstm_readcond);			pthread_mutex_unlock(&psstm->sstm_readmutex);#ifdef RTPLIB_SYNCHRONIZE			/*			 * Attempt to synchronize when buffering done.			 */			rtpctl(pssn->ssn_session, RTP_CTL_STREAM_GETCNAME, cname, 256, psstm->sstm_ssrc);			synsynchronize(pssn, cname);#endif /* RTPLIB_SYNCHRONIZE */		}	}	else {		if (pthread_mutex_lock(&psstm->sstm_readmutex) != 0) {			synreleasestream(pssn, psstm);			return ERROR;		}		pthread_cond_signal(&psstm->sstm_readcond);		pthread_mutex_unlock(&psstm->sstm_readmutex);	}	synreleasestream(pssn, psstm);	return OK;}

⌨️ 快捷键说明

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