Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

před 10 měsíci
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. #include "rtp-param.h"
  2. #include "rtp-internal.h"
  3. #include "rtp-packet.h"
  4. enum {
  5. RTP_SENDER = 1, /// send RTP packet
  6. RTP_RECEIVER = 2, /// receive RTP packet
  7. };
  8. double rtcp_interval(int members, int senders, double rtcp_bw, int we_sent, double avg_rtcp_size, int initial);
  9. void* rtp_create(struct rtp_event_t *handler, void* param, uint32_t ssrc, uint32_t timestamp, int frequence, int bandwidth, int sender)
  10. {
  11. struct rtp_context *ctx;
  12. ctx = (struct rtp_context *)calloc(1, sizeof(*ctx));
  13. if(!ctx) return NULL;
  14. ctx->self = rtp_member_create(ssrc);
  15. ctx->members = rtp_member_list_create();
  16. ctx->senders = rtp_member_list_create();
  17. if(!ctx->self || !ctx->members || !ctx->senders)
  18. {
  19. rtp_destroy(ctx);
  20. return NULL;
  21. }
  22. ctx->self->rtp_clock = rtpclock();
  23. ctx->self->rtp_timestamp = timestamp;
  24. rtp_member_list_add(ctx->members, ctx->self);
  25. memcpy(&ctx->handler, handler, sizeof(ctx->handler));
  26. ctx->cbparam = param;
  27. ctx->rtcp_bw = (int)(bandwidth * RTCP_BANDWIDTH_FRACTION);
  28. ctx->avg_rtcp_size = 0;
  29. ctx->frequence = frequence;
  30. ctx->role = sender ? RTP_SENDER : RTP_RECEIVER;
  31. ctx->init = 1;
  32. return ctx;
  33. }
  34. int rtp_destroy(void* rtp)
  35. {
  36. struct rtp_context *ctx = (struct rtp_context *)rtp;
  37. if(ctx->members)
  38. rtp_member_list_destroy(ctx->members);
  39. if(ctx->senders)
  40. rtp_member_list_destroy(ctx->senders);
  41. if(ctx->self)
  42. rtp_member_release(ctx->self);
  43. free(ctx);
  44. return 0;
  45. }
  46. int rtp_onsend(void* rtp, const void* data, int bytes)
  47. {
  48. // time64_t ntp;
  49. struct rtp_packet_t pkt;
  50. struct rtp_context *ctx = (struct rtp_context *)rtp;
  51. assert(RTP_SENDER == ctx->role);
  52. ctx->role = RTP_SENDER;
  53. // don't need add self to sender list
  54. // rtp_member_list_add(ctx->senders, ctx->self);
  55. if(0 != rtp_packet_deserialize(&pkt, data, bytes))
  56. return -1; // packet error
  57. //ctx->self->rtp_clock = rtpclock();
  58. //ctx->self->rtp_timestamp = pkt.rtp.timestamp; // RTP timestamp
  59. ctx->self->rtp_bytes += pkt.payloadlen;
  60. ctx->self->rtp_packets += 1;
  61. return 0;
  62. }
  63. int rtp_onreceived(void* rtp, const void* data, int bytes)
  64. {
  65. struct rtp_context *ctx = (struct rtp_context *)rtp;
  66. return rtcp_input_rtp(ctx, data, bytes);
  67. }
  68. int rtp_onreceived_rtcp(void* rtp, const void* rtcp, int bytes)
  69. {
  70. struct rtp_context *ctx = (struct rtp_context *)rtp;
  71. return rtcp_input_rtcp(ctx, rtcp, bytes);
  72. }
  73. int rtp_rtcp_report(void* rtp, void* data, int bytes)
  74. {
  75. int n;
  76. struct rtp_context *ctx = (struct rtp_context *)rtp;
  77. #pragma message("update we_sent flag")
  78. // don't send packet in 2T
  79. //ctx->role = RTP_RECEIVER
  80. if(RTP_SENDER == ctx->role)
  81. {
  82. // send RTP in 2T
  83. n = rtcp_sr_pack(ctx, (uint8_t*)data, bytes);
  84. }
  85. else
  86. {
  87. assert(RTP_RECEIVER == ctx->role);
  88. n = rtcp_rr_pack(ctx, (uint8_t*)data, bytes);
  89. }
  90. // compound RTCP Packet
  91. if(n < bytes)
  92. {
  93. n += rtcp_sdes_pack(ctx, (uint8_t*)data+n, bytes-n);
  94. }
  95. ctx->init = 0;
  96. return n;
  97. }
  98. int rtp_rtcp_bye(void* rtp, void* data, int bytes)
  99. {
  100. struct rtp_context *ctx = (struct rtp_context *)rtp;
  101. return rtcp_bye_pack(ctx, (uint8_t*)data, bytes);
  102. }
  103. int rtp_rtcp_app(void* rtp, void* data, int bytes, const char name[4], const void* app, int len)
  104. {
  105. struct rtp_context* ctx = (struct rtp_context*)rtp;
  106. return rtcp_app_pack(ctx, (uint8_t*)data, bytes, name, app, len);
  107. }
  108. int rtp_rtcp_rtpfb(void* rtp, void* data, int bytes, enum rtcp_rtpfb_type_t id, const rtcp_rtpfb_t* rtpfb)
  109. {
  110. struct rtp_context* ctx = (struct rtp_context*)rtp;
  111. return rtcp_rtpfb_pack(ctx, (uint8_t*)data, bytes, id, rtpfb);
  112. }
  113. int rtp_rtcp_psfb(void* rtp, void* data, int bytes, enum rtcp_psfb_type_t id, const rtcp_psfb_t* psfb)
  114. {
  115. struct rtp_context* ctx = (struct rtp_context*)rtp;
  116. return rtcp_psfb_pack(ctx, (uint8_t*)data, bytes, id, psfb);
  117. }
  118. int rtp_rtcp_xr(void* rtp, void* data, int bytes, enum rtcp_xr_type_t id, const rtcp_xr_t* xr)
  119. {
  120. struct rtp_context* ctx = (struct rtp_context*)rtp;
  121. return rtcp_xr_pack(ctx, (uint8_t*)data, bytes, id, xr);
  122. }
  123. int rtp_rtcp_interval(void* rtp)
  124. {
  125. double interval;
  126. struct rtp_context *ctx = (struct rtp_context *)rtp;
  127. interval = rtcp_interval(rtp_member_list_count(ctx->members),
  128. rtp_member_list_count(ctx->senders) + ((RTP_SENDER==ctx->role) ? 1 : 0),
  129. ctx->rtcp_bw,
  130. (ctx->self->rtp_clock + 2*RTCP_REPORT_INTERVAL*1000 > rtpclock()) ? 1 : 0,
  131. ctx->avg_rtcp_size,
  132. ctx->init);
  133. return (int)(interval * 1000);
  134. }
  135. const char* rtp_get_cname(void* rtp, uint32_t ssrc)
  136. {
  137. struct rtp_member *member;
  138. struct rtp_context *ctx = (struct rtp_context *)rtp;
  139. member = rtp_member_list_find(ctx->members, ssrc);
  140. return member ? (char*)member->sdes[RTCP_SDES_CNAME].data : NULL;
  141. }
  142. const char* rtp_get_name(void* rtp, uint32_t ssrc)
  143. {
  144. struct rtp_member *member;
  145. struct rtp_context *ctx = (struct rtp_context *)rtp;
  146. member = rtp_member_list_find(ctx->members, ssrc);
  147. return member ? (char*)member->sdes[RTCP_SDES_NAME].data : NULL;
  148. }
  149. int rtp_set_info(void* rtp, const char* cname, const char* name)
  150. {
  151. struct rtp_context *ctx = (struct rtp_context *)rtp;
  152. rtp_member_setvalue(ctx->self, RTCP_SDES_CNAME, (const uint8_t*)cname, (int)strlen(cname));
  153. rtp_member_setvalue(ctx->self, RTCP_SDES_NAME, (const uint8_t*)name, (int)strlen(name));
  154. return 0;
  155. }