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
p_seprint(Msg * m)21 p_seprint(Msg *m)
22 {
23 int cc, i;
24 ushort seq;
25 ulong ssrc, ts;
26 Hdr*h;
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", i, NetL(m->ps));
46 m->ps += 4;
47 }
48 m->pr = nil;
49 return 0;
50 }
51
52 Proto rtp = {
53 "rtp",
54 nil,
55 nil,
56 p_seprint,
57 nil,
58 nil,
59 nil,
60 defaultframer,
61 };
62