plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

rtp.c (1038B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <ip.h>
      4 #include "dat.h"
      5 #include "protos.h"
      6 
      7 typedef struct Hdr Hdr;
      8 struct Hdr {
      9 	uchar	hdr;		/* RTP header */
     10 	uchar	marker;	/* Payload and marker */
     11 	uchar	seq[2];	/* Sequence number */
     12 	uchar	ts[4];		/* Time stamp */
     13 	uchar	ssrc[4];	/* Synchronization source identifier */
     14 };
     15 
     16 enum{
     17 	RTPLEN = 12,		/* Minimum size of an RTP header */
     18 };
     19 
     20 static int
     21 p_seprint(Msg *m)
     22 {
     23 	Hdr*h;
     24 	ushort seq;
     25 	ulong ssrc, ts;
     26 	int cc, i;
     27 
     28 	if(m->pe - m->ps < RTPLEN)
     29 		return -1;
     30 
     31 	h = (Hdr*)m->ps;
     32 	cc = h->hdr & 0xf;
     33 	if(m->pe - m->ps < RTPLEN + cc * 4)
     34 		return -1;
     35 
     36 	m->ps += RTPLEN;
     37 
     38 	seq = NetS(h->seq);
     39 	ts = NetL(h->ts);
     40 	ssrc = NetL(h->ssrc);
     41 
     42 	m->p = seprint(m->p, m->e, "version=%d x=%d cc=%d seq=%d ts=%ld ssrc=%ulx",
     43 				(h->hdr >> 6) & 3, (h->hdr >> 4) & 1, cc, seq, ts, ssrc);
     44 	for(i = 0; i < cc; i++){
     45 		m->p = seprint(m->p, m->e, " csrc[%d]=%d",
     46 				i, NetL(m->ps));
     47 		m->ps += 4;
     48 	}
     49 	m->pr = nil;
     50 	return 0;
     51 }
     52 
     53 Proto rtp = {
     54 	"rtp",
     55 	nil,
     56 	nil,
     57 	p_seprint,
     58 	nil,
     59 	nil,
     60 	nil,
     61 	defaultframer
     62 };