📄 rtcp.c
字号:
#include <u.h>#include <libc.h>#include <ip.h>#include "dat.h"#include "protos.h"typedef struct Hdr Hdr;struct Hdr { uchar hdr; // RTCP header uchar pt; // Packet type uchar len[2]; // Report length uchar ssrc[4]; // Synchronization source identifier uchar ntp[8]; // NTP time stamp uchar rtp[4]; // RTP time stamp uchar pktc[4]; // Sender's packet count uchar octc[4]; // Sender's octect count};typedef struct Report Report;struct Report { uchar ssrc[4]; // SSRC identifier uchar lost[4]; // Fraction + cumu lost uchar seqhi[4]; // Highest seq number received uchar jitter[4]; // Interarrival jitter uchar lsr[4]; // Last SR uchar dlsr[4]; // Delay since last SR};enum{ RTCPLEN = 28, // Minimum size of an RTCP header REPORTLEN = 24,};static intp_seprint(Msg *m){ Hdr*h; Report*r; int rc, i, frac; float dlsr; if(m->pe - m->ps < RTCPLEN) return -1; h = (Hdr*)m->ps; if(m->pe - m->ps < (NetS(h->len) + 1) * 4) return -1; rc = h->hdr & 0x1f; m->ps += RTCPLEN; m->p = seprint(m->p, m->e, "version=%d rc=%d tp=%d ssrc=%8ux ntp=%d.%.10ud rtp=%d pktc=%d octc=%d hlen=%d", (h->hdr >> 6) & 3, rc, h->pt, NetL(h->ssrc), NetL(h->ntp), (uint)NetL(&h->ntp[4]), NetL(h->rtp), NetL(h->pktc), NetL(h->octc), (NetS(h->len) + 1) * 4); for(i = 0; i < rc; i++){ r = (Report*)m->ps; m->ps += REPORTLEN; frac = (int)(((float)r->lost[0] * 100.) / 256.); r->lost[0] = 0; dlsr = (float)NetL(r->dlsr) / 65536.; m->p = seprint(m->p, m->e, "\n\trr(csrc=%8ux frac=%3d%% cumu=%10d seqhi=%10ud jitter=%10d lsr=%8ux dlsr=%f)", NetL(r->ssrc), frac, NetL(r->lost), NetL(r->seqhi), NetL(r->jitter), NetL(r->lsr), dlsr); } m->pr = nil; return 0;}Proto rtcp = { "rtcp", nil, nil, p_seprint, nil, nil, nil, defaultframer,};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -