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