sender_congestion_controller.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "sender_congestion_controller.h"
  2. #include "razor_log.h"
  3. #define k_max_queue_ms 250
  4. #define k_min_bitrate_bps 10000
  5. #define k_max_feedback_size 1472
  6. static void sender_cc_on_change_bitrate(void* handler, uint32_t bitrate, uint8_t fraction_loss, uint32_t rtt)
  7. {
  8. sender_cc_t* cc = (sender_cc_t*)handler;
  9. razor_info("sender change bitrate, bitrate = %ubps\n", bitrate);
  10. pace_set_estimate_bitrate(cc->pacer, bitrate);
  11. /*触发一个通信层通知*/
  12. if (cc->trigger != NULL && cc->trigger_cb != NULL)
  13. cc->trigger_cb(cc->trigger, bitrate, fraction_loss, rtt);
  14. }
  15. sender_cc_t* sender_cc_create(void* trigger, bitrate_changed_func bitrate_cb, void* handler, pace_send_func send_cb, int queue_ms)
  16. {
  17. sender_cc_t* cc;
  18. razor_info("start create cc's sender! \n");
  19. cc = (sender_cc_t*)calloc(1, sizeof(sender_cc_t));
  20. cc->was_in_alr = -1;
  21. cc->accepted_queue_ms = SU_MIN(queue_ms, k_max_queue_ms);
  22. cc->rtt = 200;
  23. cc->trigger = trigger;
  24. cc->trigger_cb = bitrate_cb;
  25. cc->ack = ack_estimator_create();
  26. cc->bwe = delay_bwe_create();
  27. cc->pacer = pace_create(handler, send_cb, cc->accepted_queue_ms);
  28. cc_feedback_adapter_init(&cc->adapter);
  29. delay_bwe_set_min_bitrate(cc->bwe, k_min_bitrate_bps);
  30. pace_set_bitrate_limits(cc->pacer, k_min_bitrate_bps);
  31. bin_stream_init(&cc->strm);
  32. cc->bitrate_controller = bitrate_controller_create(cc, sender_cc_on_change_bitrate);
  33. razor_info("end create cc's sender! \n");
  34. return cc;
  35. }
  36. void sender_cc_destroy(sender_cc_t* cc)
  37. {
  38. if (cc == NULL)
  39. return;
  40. razor_info("start destroy cc's sender\n");
  41. if (cc->ack != NULL){
  42. ack_estimator_destroy(cc->ack);
  43. cc->ack = NULL;
  44. }
  45. if (cc->bitrate_controller != NULL){
  46. bitrate_controller_destroy(cc->bitrate_controller);
  47. cc->bitrate_controller = NULL;
  48. }
  49. if (cc->bwe != NULL){
  50. delay_bwe_destroy(cc->bwe);
  51. cc->bwe = NULL;
  52. }
  53. if (cc->pacer != NULL){
  54. pace_destroy(cc->pacer);
  55. cc->pacer = NULL;
  56. }
  57. cc_feedback_adapter_destroy(&cc->adapter);
  58. bin_stream_destroy(&cc->strm);
  59. free((void *)cc);
  60. razor_info("end destroy cc's sender \n");
  61. }
  62. void sender_cc_heartbeat(sender_cc_t* cc)
  63. {
  64. int64_t now_ts = GET_SYS_MS();
  65. /*进行pace发送*/
  66. pace_try_transmit(cc->pacer, now_ts);
  67. /*进行带宽调节*/
  68. bitrate_controller_heartbeat(cc->bitrate_controller, now_ts, ack_estimator_bitrate_bps(cc->ack));
  69. }
  70. int sender_cc_add_pace_packet(sender_cc_t* cc, uint32_t packet_id, int retrans, size_t size)
  71. {
  72. razor_debug("start sender_cc_add_pace_packet packet_id: %u retrans: %d size: %d\n", packet_id, retrans, size);
  73. return pace_insert_packet(cc->pacer, packet_id, retrans, size, GET_SYS_MS());
  74. }
  75. void sender_on_send_packet(sender_cc_t* cc, uint16_t seq, size_t size)
  76. {
  77. razor_debug("start sender_on_send_packet seq: %u size: %d\n", seq, size);
  78. cc_feedback_add_packet(&cc->adapter, seq, size);
  79. /*todo:进行RTT周期内是否发送码率溢出,可以不实现*/
  80. }
  81. void sender_on_feedback(sender_cc_t* cc, uint8_t* feedback, int feedback_size)
  82. {
  83. int cur_alr;
  84. bwe_result_t bwe_result;
  85. int64_t now_ts;
  86. feedback_msg_t msg;
  87. if (feedback_size > k_max_feedback_size)
  88. return;
  89. bin_stream_resize(&cc->strm, feedback_size);
  90. bin_stream_rewind(&cc->strm, 1);
  91. memcpy(cc->strm.data, feedback, feedback_size);
  92. cc->strm.used = feedback_size;
  93. /*解码得到反馈序列*/
  94. feedback_msg_decode(&cc->strm, &msg);
  95. now_ts = (int64_t)GET_SYS_MS();
  96. razor_debug("start sender_on_feedback now_ts: %I64d \n", now_ts);
  97. /*处理proxy estimate的信息*/
  98. if ((msg.flag & proxy_ts_msg) == proxy_ts_msg){
  99. if (cc_feedback_on_feedback(&cc->adapter, &msg) <= 0)
  100. return;
  101. cur_alr = pace_get_limited_start_time(cc->pacer) > 0 ? 0 : -1;
  102. if (cc->was_in_alr == 0 && cur_alr != 0){
  103. ack_estimator_set_alrended(cc->ack, now_ts);
  104. }
  105. cc->was_in_alr = cur_alr;
  106. /*进行远端接收码率评估*/
  107. ack_estimator_incoming(cc->ack, cc->adapter.packets, cc->adapter.num);
  108. /*根据延迟状态进行发送端拥塞控制判断,并评估最新的发送码率*/
  109. init_bwe_result_null(bwe_result);
  110. bwe_result = delay_bwe_incoming(cc->bwe, cc->adapter.packets, cc->adapter.num, ack_estimator_bitrate_bps(cc->ack), now_ts);
  111. /*进行码率调节*/
  112. if (bwe_result.updated == 0)
  113. bitrate_controller_on_basedelay_result(cc->bitrate_controller, bwe_result.updated, bwe_result.probe, bwe_result.bitrate, cc->bwe->detector->state);
  114. }
  115. /*处理remb*/
  116. if ((msg.flag & remb_msg) == remb_msg){
  117. razor_debug("sender_on_feedback, recv remb = %ubps\n", msg.remb);
  118. bitrate_controller_on_remb(cc->bitrate_controller, msg.remb);
  119. }
  120. /*处理loss info*/
  121. if ((msg.flag & loss_info_msg) == loss_info_msg){
  122. razor_debug("sender_on_feedback, receive loss info, fraction_loss = %u, packets_num = %u\n", msg.fraction_loss, msg.packet_num);
  123. bitrate_controller_on_report(cc->bitrate_controller, cc->rtt, now_ts, msg.fraction_loss, msg.packet_num, ack_estimator_bitrate_bps(cc->ack));
  124. }
  125. }
  126. void sender_cc_update_rtt(sender_cc_t* cc, int32_t rtt)
  127. {
  128. razor_debug("start sender_cc_update_rtt, rtt = %dms\n", rtt);
  129. cc->rtt = rtt;
  130. delay_bwe_rtt_update(cc->bwe, rtt);
  131. razor_debug("end sender_cc_update_rtt. \n");
  132. }
  133. void sender_cc_set_bitrates(sender_cc_t* cc, uint32_t min_bitrate, uint32_t start_bitrate, uint32_t max_bitrate)
  134. {
  135. razor_info("start sender_cc_set_bitrates, min = %ubps, max = %ubps, start = %ubps\n", min_bitrate, max_bitrate, start_bitrate);
  136. start_bitrate = (uint32_t)(SU_MIN(SU_MAX(start_bitrate, min_bitrate), max_bitrate));
  137. delay_bwe_set_min_bitrate(cc->bwe, min_bitrate);
  138. delay_bwe_set_max_bitrate(cc->bwe, max_bitrate);
  139. delay_bwe_set_start_bitrate(cc->bwe, start_bitrate);
  140. bitrate_controller_set_bitrates(cc->bitrate_controller, start_bitrate, min_bitrate, max_bitrate);
  141. /*pace是用BYTE计算*/
  142. pace_set_bitrate_limits(cc->pacer, min_bitrate);
  143. pace_set_estimate_bitrate(cc->pacer, start_bitrate);
  144. razor_info("end sender_cc_set_bitrates, min = %ubps, max = %ubps, start = %ubps\n", min_bitrate, max_bitrate, start_bitrate);
  145. }
  146. int64_t sender_cc_get_pacer_queue_ms(sender_cc_t* cc)
  147. {
  148. return pace_queue_ms(cc->pacer);
  149. }
  150. int64_t sender_cc_get_first_packet_ts(sender_cc_t* cc)
  151. {
  152. return cc->pacer->first_sent_ts;
  153. }