rtp.c 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. int cc, i;
  21. ushort seq;
  22. ulong ssrc, ts;
  23. Hdr*h;
  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", i, NetL(m->ps));
  38. m->ps += 4;
  39. }
  40. m->pr = nil;
  41. return 0;
  42. }
  43. Proto rtp = {
  44. "rtp",
  45. nil,
  46. nil,
  47. p_seprint,
  48. nil,
  49. nil,
  50. nil,
  51. defaultframer,
  52. };