trtcp.c - plan9port - [fork] Plan 9 from user space | |
git clone git://src.adamsgaard.dk/plan9port | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
trtcp.c (1859B) | |
--- | |
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; /* RTCP header */ | |
10 uchar pt; /* Packet type */ | |
11 uchar len[2]; /* Report length */ | |
12 uchar ssrc[4]; /* Synchronization source i… | |
13 uchar ntp[8]; /* NTP time stamp */ | |
14 uchar rtp[4]; /* RTP time stamp */ | |
15 uchar pktc[4]; /* Sender's packet count */ | |
16 uchar octc[4]; /* Sender's octect count */ | |
17 }; | |
18 | |
19 typedef struct Report Report; | |
20 struct Report { | |
21 uchar ssrc[4]; /* SSRC identifier */ | |
22 uchar lost[4]; /* Fraction + cumu lost */ | |
23 uchar seqhi[4]; /* Highest seq number rece… | |
24 uchar jitter[4]; /* Interarrival jitter */ | |
25 uchar lsr[4]; /* Last SR */ | |
26 uchar dlsr[4]; /* Delay since last SR */ | |
27 }; | |
28 | |
29 enum{ | |
30 RTCPLEN = 28, /* Minimum size of an RTCP header */ | |
31 REPORTLEN = 24 | |
32 }; | |
33 | |
34 static int | |
35 p_seprint(Msg *m) | |
36 { | |
37 Hdr*h; | |
38 Report*r; | |
39 int rc, i, frac; | |
40 float dlsr; | |
41 | |
42 if(m->pe - m->ps < RTCPLEN) | |
43 return -1; | |
44 | |
45 h = (Hdr*)m->ps; | |
46 if(m->pe - m->ps < (NetS(h->len) + 1) * 4) | |
47 return -1; | |
48 | |
49 rc = h->hdr & 0x1f; | |
50 m->ps += RTCPLEN; | |
51 m->p = seprint(m->p, m->e, "version=%d rc=%d tp=%d ssrc=%8ux ntp… | |
52 (h->hdr >> 6) & 3, rc, h->pt, NetL(h->ss… | |
53 NetL(h->ntp), (uint)NetL(&h->ntp[4]), Ne… | |
54 NetL(h->pktc), NetL(h->octc), | |
55 (NetS(h->len) + 1) * 4); | |
56 | |
57 for(i = 0; i < rc; i++){ | |
58 r = (Report*)m->ps; | |
59 m->ps += REPORTLEN; | |
60 | |
61 frac = (int)(((float)r->lost[0] * 100.) / 256.); | |
62 r->lost[0] = 0; | |
63 dlsr = (float)NetL(r->dlsr) / 65536.; | |
64 | |
65 m->p = seprint(m->p, m->e, "\n\trr(csrc=%8ux frac=%3d%% … | |
66 NetL(r->ssrc), frac, NetL(r->lost), NetL… | |
67 NetL(r->jitter), NetL(r->lsr), | |
68 dlsr); | |
69 } | |
70 m->pr = nil; | |
71 return 0; | |
72 } | |
73 | |
74 Proto rtcp = { | |
75 "rtcp", | |
76 nil, | |
77 nil, | |
78 p_seprint, | |
79 nil, | |
80 nil, | |
81 nil, | |
82 defaultframer | |
83 }; |