www.pudn.com > RTP通用开发库(for Linux).rar > framereadnonfragmented.c
/* framereadnonfragmented.c - framereadnonfragmented */ #include#include #include #include #include #include #include #include #include #define DEBUG(x) x #include /*------------------------------------------------------------------------ * framereadnonfragmented - copy psstm->stm_channels frames into buf * This function finishes the job of frameread in the case that the frame * is not fragmented. See frameread() for details on the first 8 * parameters. The functions are seperated for readability and * managability. *------------------------------------------------------------------------ */ int framereadnonfragmented(struct synsession *pssn, struct synstream *psstm, struct timespec *time, mediatime_t *tsout, char *buf, int buflen, char *extraheaderbuf, int *extraheaderbuflen, struct rtpln *pln, char *pframe, mediatime_t ts, mediatime_t frameduration, int bytesleft) { struct timespec tmptime; struct frameparam *pparam; struct rtp *prtp; int chan, bytestocopy, bytescopied, dataoffset, framelen; bool block; pparam = (struct frameparam *) psstm->sstm_parameters; block = (psstm->sstm_readflags & SYN_READ_BLOCK) != 0; prtp = &pln->rln_rtp; psstm->sstm_lastread = ts + frameduration; /* * Copy each channel's frame; by RFC1890 all channels must be present. */ for (chan = 0, bytescopied = 0; chan < pparam->fp_channels; chan++) { framelen = pparam->fp_framelength(pframe, bytesleft); if (framelen == ERROR) { bytesleft = 0; break; } framelen = min(framelen, bytesleft); bytestocopy = min(framelen, buflen); bcopy(pframe, buf, bytestocopy); buf += bytestocopy; buflen -= bytestocopy; bytesleft -= framelen; pframe += framelen; bytescopied += bytestocopy; if (bytesleft == 0 || buflen == 0) break; } if (extraheaderbuf != NULL) { *extraheaderbuflen = min(dataoffset, *extraheaderbuflen); bcopy(RTP_DATA(prtp), extraheaderbuf, *extraheaderbuflen); } if (bytesleft == 0) bufpoolfreebuf(pln); else rtpqinsert(pssn->ssn_session, psstm->sstm_ssrc, pln); tmptime = timeunflatten(ts - psstm->sstm_clky, psstm->sstm_clkrt); tmptime = timeadd(tmptime, psstm->sstm_clkx); *time = tmptime; *tsout = ts; return bytescopied; }