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;
}