rtp.c 1021 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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; // RTP header
  9. uchar marker; // Payload and marker
  10. uchar seq[2]; // Sequence number
  11. uchar ts[4]; // Time stamp
  12. uchar ssrc[4]; // Synchronization source identifier
  13. };
  14. enum{
  15. RTPLEN = 12, // Minimum size of an RTP header
  16. };
  17. static int
  18. p_seprint(Msg *m)
  19. {
  20. Hdr*h;
  21. ushort seq;
  22. ulong ssrc, ts;
  23. int cc, i;
  24. if(m->pe - m->ps < RTPLEN)
  25. return -1;
  26. h = (Hdr*)m->ps;
  27. cc = h->hdr & 0xf;
  28. if(m->pe - m->ps < RTPLEN + cc * 4)
  29. return -1;
  30. m->ps += RTPLEN;
  31. seq = NetS(h->seq);
  32. ts = NetL(h->ts);
  33. ssrc = NetL(h->ssrc);
  34. m->p = seprint(m->p, m->e, "version=%d x=%d cc=%d seq=%d ts=%ld ssrc=%ulx",
  35. (h->hdr >> 6) & 3, (h->hdr >> 4) & 1, cc, seq, ts, ssrc);
  36. for(i = 0; i < cc; i++){
  37. m->p = seprint(m->p, m->e, " csrc[%d]=%d",
  38. i, NetL(m->ps));
  39. m->ps += 4;
  40. }
  41. m->pr = nil;
  42. return 0;
  43. }
  44. Proto rtp = {
  45. "rtp",
  46. nil,
  47. nil,
  48. p_seprint,
  49. nil,
  50. nil,
  51. nil,
  52. defaultframer,
  53. };