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.

173 lines
5.0KB

  1. // RFC3550 6.4.1 SR: Sender Report RTCP Packet
  2. #include "rtp-internal.h"
  3. #include "rtp-util.h"
  4. void rtcp_sr_unpack(struct rtp_context *ctx, const rtcp_header_t *header, const uint8_t* ptr, size_t bytes)
  5. {
  6. uint32_t i;
  7. rtcp_sr_t *sr;
  8. rtcp_rb_t *rb;
  9. struct rtcp_msg_t msg;
  10. struct rtp_member *sender;
  11. assert(24 == sizeof(rtcp_sr_t));
  12. assert(24 == sizeof(rtcp_rb_t));
  13. if (bytes < 24/*sizeof(rtcp_sr_t)*/ + header->rc * 24/*sizeof(rtcp_rb_t)*/)
  14. {
  15. assert(0);
  16. return;
  17. }
  18. msg.ssrc = nbo_r32(ptr);
  19. msg.type = RTCP_RR;
  20. sender = rtp_sender_fetch(ctx, msg.ssrc);
  21. if(!sender) return; // error
  22. assert(sender != ctx->self);
  23. assert(sender->rtcp_sr.ssrc == msg.ssrc);
  24. //assert(sender->rtcp_rb.ssrc == msg.ssrc);
  25. sender->rtcp_clock = rtpclock();
  26. // update sender information
  27. sr = &sender->rtcp_sr;
  28. sr->ntpmsw = nbo_r32(ptr + 4);
  29. sr->ntplsw = nbo_r32(ptr + 8);
  30. sr->rtpts = nbo_r32(ptr + 12);
  31. sr->spc = nbo_r32(ptr + 16);
  32. sr->soc = nbo_r32(ptr + 20);
  33. ptr += 24;
  34. // report block
  35. for(i = 0; i < header->rc; i++, ptr+=24/*sizeof(rtcp_rb_t)*/)
  36. {
  37. msg.u.sr.ssrc = nbo_r32(ptr);
  38. //if(msg.u.rr.ssrc != ctx->self->ssrc)
  39. // continue; // ignore
  40. //rb = &sender->rtcp_rb;
  41. rb = &msg.u.sr;
  42. rb->fraction = ptr[4];
  43. rb->cumulative = (((uint32_t)ptr[5])<<16) | (((uint32_t)ptr[6])<<8)| ptr[7];
  44. rb->exthsn = nbo_r32(ptr+8);
  45. rb->jitter = nbo_r32(ptr+12);
  46. rb->lsr = nbo_r32(ptr+16);
  47. rb->dlsr = nbo_r32(ptr+20);
  48. ctx->handler.on_rtcp(ctx->cbparam, &msg);
  49. }
  50. }
  51. int rtcp_sr_pack(struct rtp_context *ctx, uint8_t* ptr, int bytes)
  52. {
  53. uint32_t i, timestamp;
  54. uint64_t ntp;
  55. rtcp_header_t header;
  56. assert(24 == sizeof(rtcp_sr_t));
  57. assert(24 == sizeof(rtcp_rb_t));
  58. assert(rtp_member_list_count(ctx->senders) < 32);
  59. header.v = 2;
  60. header.p = 0;
  61. header.pt = RTCP_SR;
  62. header.rc = MIN(31, rtp_member_list_count(ctx->senders));
  63. header.length = (24/*sizeof(rtcp_sr_t)*/ + header.rc*24/*sizeof(rtcp_rb_t)*/)/4; // see 6.4.1 SR: Sender Report RTCP Packet
  64. if((uint32_t)bytes < (header.length+1) * 4)
  65. return (header.length+1) * 4;
  66. nbo_write_rtcp_header(ptr, &header);
  67. // RFC3550 6.4.1 SR: Sender Report RTCP Packet (p32)
  68. // Note that in most cases this timestamp will not be equal to the RTP
  69. // timestamp in any adjacent data packet. Rather, it must be calculated from the corresponding
  70. // NTP timestamp using the relationship between the RTP timestamp counter and real time as
  71. // maintained by periodically checking the wallclock time at a sampling instant.
  72. ntp = rtpclock();
  73. if (0 == ctx->self->rtp_packets)
  74. ctx->self->rtp_clock = ntp;
  75. timestamp = (uint32_t)((ntp - ctx->self->rtp_clock) * ctx->frequence / 1000000) + ctx->self->rtp_timestamp;
  76. ntp = clock2ntp(ntp);
  77. nbo_w32(ptr+4, ctx->self->ssrc);
  78. nbo_w32(ptr+8, (uint32_t)(ntp >> 32));
  79. nbo_w32(ptr+12, (uint32_t)(ntp & 0xFFFFFFFF));
  80. nbo_w32(ptr+16, timestamp);
  81. nbo_w32(ptr+20, ctx->self->rtp_packets); // send packets
  82. nbo_w32(ptr+24, (uint32_t)ctx->self->rtp_bytes); // send bytes
  83. ptr += 28;
  84. // report block
  85. for(i = 0; i < header.rc; i++)
  86. {
  87. struct rtp_member *sender;
  88. sender = rtp_member_list_get(ctx->senders, i);
  89. if(0 == sender->rtp_packets || sender->ssrc == ctx->self->ssrc)
  90. continue; // don't receive any packet
  91. ptr += rtcp_report_block(sender, ptr, 24);
  92. }
  93. return (header.length+1) * 4;
  94. }
  95. int rtcp_report_block(struct rtp_member* sender, uint8_t* ptr, int bytes)
  96. {
  97. uint64_t delay;
  98. int lost_interval;
  99. int lost;
  100. uint32_t fraction;
  101. uint32_t expected, extseq;
  102. uint32_t expected_interval;
  103. uint32_t received_interval;
  104. uint32_t lsr, dlsr;
  105. if (bytes < 24)
  106. return 0;
  107. extseq = sender->rtp_seq_cycles + sender->rtp_seq; // 32-bits sequence number
  108. assert(extseq >= sender->rtp_seq_base);
  109. expected = extseq - sender->rtp_seq_base + 1;
  110. expected_interval = expected - sender->rtp_expected0;
  111. received_interval = sender->rtp_packets - sender->rtp_packets0;
  112. lost_interval = (int)(expected_interval - received_interval);
  113. if (lost_interval < 0 || 0 == expected_interval)
  114. fraction = 0;
  115. else
  116. fraction = (lost_interval << 8) / expected_interval;
  117. lost = expected - sender->rtp_packets;
  118. if (lost > 0x007FFFFF)
  119. {
  120. lost = 0x007FFFFF;
  121. }
  122. else if (lost < 0)
  123. {
  124. // 'Clamp' this loss number to a 24-bit signed value:
  125. // live555 RTCP.cpp RTCPInstance::enqueueReportBlock line:799
  126. lost = 0;
  127. }
  128. delay = rtpclock() - sender->rtcp_clock; // now - Last SR time
  129. lsr = ((sender->rtcp_sr.ntpmsw & 0xFFFF) << 16) | ((sender->rtcp_sr.ntplsw >> 16) & 0xFFFF);
  130. // in units of 1/65536 seconds
  131. // 65536/1000000 == 1024/15625
  132. dlsr = (uint32_t)(delay / 1000000.0f * 65536);
  133. nbo_w32(ptr, sender->ssrc);
  134. ptr[4] = (unsigned char)fraction;
  135. ptr[5] = (unsigned char)((lost >> 16) & 0xFF);
  136. ptr[6] = (unsigned char)((lost >> 8) & 0xFF);
  137. ptr[7] = (unsigned char)(lost & 0xFF);
  138. nbo_w32(ptr + 8, extseq);
  139. nbo_w32(ptr + 12, (uint32_t)sender->jitter);
  140. nbo_w32(ptr + 16, lsr);
  141. nbo_w32(ptr + 20, 0 == lsr ? 0 : dlsr);
  142. sender->rtp_expected0 = expected; // update source prior data
  143. sender->rtp_packets0 = sender->rtp_packets;
  144. return 24; /*sizeof(rtcp_rb_t)*/
  145. }