You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

53 lines
1.1KB

  1. // RFC3550 6.7 APP: Application-Defined RTCP Packet
  2. #include "rtp-internal.h"
  3. #include "rtp-util.h"
  4. void rtcp_app_unpack(struct rtp_context *ctx, const rtcp_header_t *header, const uint8_t* ptr, size_t bytes)
  5. {
  6. struct rtcp_msg_t msg;
  7. //struct rtp_member *member;
  8. if (bytes < 8) // RTCP header + SSRC + name
  9. {
  10. assert(0);
  11. return;
  12. }
  13. msg.ssrc = nbo_r32(ptr);
  14. msg.type = RTCP_APP;
  15. //member = rtp_member_fetch(ctx, msg.ssrc);
  16. //if(!member) return; // error
  17. msg.u.app.subtype = header->rc;
  18. memcpy(msg.u.app.name, ptr+4, 4);
  19. msg.u.app.data = (void*)(ptr + 8);
  20. msg.u.app.bytes = (int)bytes - 8;
  21. ctx->handler.on_rtcp(ctx->cbparam, &msg);
  22. }
  23. int rtcp_app_pack(struct rtp_context *ctx, uint8_t* ptr, int bytes, const char name[4], const void* app, int len)
  24. {
  25. rtcp_header_t header;
  26. if(bytes >= 12 + (len+3)/4*4)
  27. {
  28. header.v = 2;
  29. header.p = 0;
  30. header.pt = RTCP_APP;
  31. header.rc = 0;
  32. header.length = (uint16_t)(2+(len+3)/4);
  33. nbo_write_rtcp_header(ptr, &header);
  34. nbo_w32(ptr+4, ctx->self->ssrc);
  35. memcpy(ptr+8, name, 4);
  36. if(len > 0)
  37. memcpy(ptr+12, app, len);
  38. }
  39. return 12 + (len+3)/4*4;
  40. }