rtcp.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <ip.h>
  4. #include "dat.h"
  5. #include "protos.h"
  6. typedef struct Hdr Hdr;
  7. struct Hdr {
  8. uchar hdr; // RTCP header
  9. uchar pt; // Packet type
  10. uchar len[2]; // Report length
  11. uchar ssrc[4]; // Synchronization source identifier
  12. uchar ntp[8]; // NTP time stamp
  13. uchar rtp[4]; // RTP time stamp
  14. uchar pktc[4]; // Sender's packet count
  15. uchar octc[4]; // Sender's octect count
  16. };
  17. typedef struct Report Report;
  18. struct Report {
  19. uchar ssrc[4]; // SSRC identifier
  20. uchar lost[4]; // Fraction + cumu lost
  21. uchar seqhi[4]; // Highest seq number received
  22. uchar jitter[4]; // Interarrival jitter
  23. uchar lsr[4]; // Last SR
  24. uchar dlsr[4]; // Delay since last SR
  25. };
  26. enum{
  27. RTCPLEN = 28, // Minimum size of an RTCP header
  28. REPORTLEN = 24,
  29. };
  30. static int
  31. p_seprint(Msg *m)
  32. {
  33. Hdr*h;
  34. Report*r;
  35. int rc, i, frac;
  36. float dlsr;
  37. if(m->pe - m->ps < RTCPLEN)
  38. return -1;
  39. h = (Hdr*)m->ps;
  40. if(m->pe - m->ps < (NetS(h->len) + 1) * 4)
  41. return -1;
  42. rc = h->hdr & 0x1f;
  43. m->ps += RTCPLEN;
  44. 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",
  45. (h->hdr >> 6) & 3, rc, h->pt, NetL(h->ssrc),
  46. NetL(h->ntp), (uint)NetL(&h->ntp[4]), NetL(h->rtp),
  47. NetL(h->pktc), NetL(h->octc),
  48. (NetS(h->len) + 1) * 4);
  49. for(i = 0; i < rc; i++){
  50. r = (Report*)m->ps;
  51. m->ps += REPORTLEN;
  52. frac = (int)(((float)r->lost[0] * 100.) / 256.);
  53. r->lost[0] = 0;
  54. dlsr = (float)NetL(r->dlsr) / 65536.;
  55. m->p = seprint(m->p, m->e, "\n\trr(csrc=%8ux frac=%3d%% cumu=%10d seqhi=%10ud jitter=%10d lsr=%8ux dlsr=%f)",
  56. NetL(r->ssrc), frac, NetL(r->lost), NetL(r->seqhi),
  57. NetL(r->jitter), NetL(r->lsr),
  58. dlsr);
  59. }
  60. m->pr = nil;
  61. return 0;
  62. }
  63. Proto rtcp = {
  64. "rtcp",
  65. nil,
  66. nil,
  67. p_seprint,
  68. nil,
  69. nil,
  70. nil,
  71. defaultframer,
  72. };