rtp.c 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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 void
  18. p_compile(Filter *f)
  19. {
  20. sysfatal("unknown rtp field: %s", f->s);
  21. }
  22. static int
  23. p_filter(Filter *, Msg *)
  24. {
  25. return 0;
  26. }
  27. static int
  28. p_seprint(Msg *m)
  29. {
  30. Hdr*h;
  31. ushort seq;
  32. ulong ssrc, ts;
  33. int cc, i;
  34. if(m->pe - m->ps < RTPLEN)
  35. return -1;
  36. h = (Hdr*)m->ps;
  37. cc = h->hdr & 0xf;
  38. if(m->pe - m->ps < RTPLEN + cc * 4)
  39. return -1;
  40. m->ps += RTPLEN;
  41. seq = NetS(h->seq);
  42. ts = NetL(h->ts);
  43. ssrc = NetL(h->ssrc);
  44. m->p = seprint(m->p, m->e, "version=%d x=%d cc=%d seq=%d ts=%ld ssrc=%ulx",
  45. (h->hdr >> 6) & 3, (h->hdr >> 4) & 1, cc, seq, ts, ssrc);
  46. for(i = 0; i < cc; i++){
  47. m->p = seprint(m->p, m->e, " csrc[%d]=%d",
  48. i, NetL(m->ps));
  49. m->ps += 4;
  50. }
  51. m->pr = nil;
  52. return 0;
  53. }
  54. Proto rtp = {
  55. "rtp",
  56. p_compile,
  57. p_filter,
  58. p_seprint,
  59. nil,
  60. nil,
  61. defaultframer,
  62. };