| #include <u.h> |
| #include <libc.h> |
| #include <ip.h> |
| #include "dat.h" |
| #include "protos.h" |
| |
| typedef struct Hdr Hdr; |
| struct Hdr { |
| uchar hdr; /* RTP header */ |
| uchar marker; /* Payload and marker */ |
| uchar seq[2]; /* Sequence number */ |
| uchar ts[4]; /* Time stamp */ |
| uchar ssrc[4]; /* Synchronization source identifier */ |
| }; |
| |
| enum{ |
| RTPLEN = 12, /* Minimum size of an RTP header */ |
| }; |
| |
| static int |
| p_seprint(Msg *m) |
| { |
| Hdr*h; |
| ushort seq; |
| ulong ssrc, ts; |
| int cc, i; |
| |
| if(m->pe - m->ps < RTPLEN) |
| return -1; |
| |
| h = (Hdr*)m->ps; |
| cc = h->hdr & 0xf; |
| if(m->pe - m->ps < RTPLEN + cc * 4) |
| return -1; |
| |
| m->ps += RTPLEN; |
| |
| seq = NetS(h->seq); |
| ts = NetL(h->ts); |
| ssrc = NetL(h->ssrc); |
| |
| m->p = seprint(m->p, m->e, "version=%d x=%d cc=%d seq=%d ts=%ld ssrc=%ulx", |
| (h->hdr >> 6) & 3, (h->hdr >> 4) & 1, cc, seq, ts, ssrc); |
| for(i = 0; i < cc; i++){ |
| m->p = seprint(m->p, m->e, " csrc[%d]=%d", |
| i, NetL(m->ps)); |
| m->ps += 4; |
| } |
| m->pr = nil; |
| return 0; |
| } |
| |
| Proto rtp = { |
| "rtp", |
| nil, |
| nil, |
| p_seprint, |
| nil, |
| nil, |
| nil, |
| defaultframer |
| }; |