📄 synnewdata.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 + -