receiver_congestion_controller.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "receiver_congestion_controller.h"
  2. #include "razor_log.h"
  3. receiver_cc_t* receiver_cc_create(int min_bitrate, int max_bitrate, int packet_header_size, void* handler, send_feedback_func cb)
  4. {
  5. receiver_cc_t* cc;
  6. razor_info("start create cc's receiver \n");
  7. cc = (receiver_cc_t *)calloc(1, sizeof(receiver_cc_t));
  8. cc->min_bitrate = min_bitrate;
  9. cc->max_bitrate = max_bitrate;
  10. cc->proxy = estimator_proxy_create((size_t)packet_header_size, 0);
  11. cc->rbe = rbe_create();
  12. cc->handler = handler;
  13. cc->send_cb = cb;
  14. rbe_set_min_bitrate(cc->rbe, min_bitrate);
  15. rbe_set_max_bitrate(cc->rbe, max_bitrate);
  16. loss_statistics_init(&cc->loss_stat);
  17. razor_info("end create cc's receiver\n");
  18. return cc;
  19. }
  20. void receiver_cc_destroy(receiver_cc_t* cc)
  21. {
  22. if (cc == NULL)
  23. return;
  24. razor_info("start destroy cc's receiver\n");
  25. if (cc->rbe != NULL){
  26. rbe_destroy(cc->rbe);
  27. cc->rbe = NULL;
  28. }
  29. if (cc->proxy != NULL){
  30. estimator_proxy_destroy(cc->proxy);
  31. cc->proxy = NULL;
  32. }
  33. loss_statistics_destroy(&cc->loss_stat);
  34. free((void *)cc);
  35. razor_info("end destroy cc's receiver\n");
  36. }
  37. void receiver_cc_heartbeat(receiver_cc_t* cc)
  38. {
  39. int64_t now_ts;
  40. bin_stream_t strm;
  41. feedback_msg_t msg;
  42. bin_stream_init(&strm);
  43. msg.flag = 0;
  44. now_ts = (int64_t)GET_SYS_MS();
  45. /*对remb评估对象做心跳,如果remb做了码率更新,进行汇报给发送端*/
  46. if (rbe_heartbeat(cc->rbe, now_ts, &msg.remb) == 0)
  47. msg.flag |= remb_msg;
  48. /*判断丢包消息*/
  49. if (loss_statistics_calculate(&cc->loss_stat, now_ts, &msg.fraction_loss, &msg.packet_num) == 0)
  50. msg.flag |= loss_info_msg;
  51. /*判断proxy estimator是否可以发送报告*/
  52. if (estimator_proxy_heartbeat(cc->proxy, now_ts, &msg) == 0)
  53. msg.flag |= proxy_ts_msg;
  54. if (msg.flag != 0){
  55. feedback_msg_encode(&strm, &msg);
  56. cc->send_cb(cc->handler, strm.data, strm.used);
  57. }
  58. bin_stream_destroy(&strm);
  59. }
  60. void receiver_cc_on_received(receiver_cc_t* cc, uint16_t seq, uint32_t timestamp, size_t size, int remb)
  61. {
  62. int64_t now_ts = GET_SYS_MS();
  63. razor_debug("start receiver_cc_on_received seq: %u timestamp: %u size: %d remb: %d\n",
  64. seq, timestamp, size, remb);
  65. if (remb == 0)
  66. rbe_incoming_packet(cc->rbe, timestamp, now_ts, size, now_ts);
  67. else
  68. estimator_proxy_incoming(cc->proxy, now_ts, 0, seq);
  69. /*进行丢包统计*/
  70. loss_statistics_incoming(&cc->loss_stat, seq);
  71. razor_debug("end receiver_cc_on_received. \n");
  72. }
  73. void receiver_cc_update_rtt(receiver_cc_t* cc, int32_t rtt)
  74. {
  75. rbe_update_rtt(cc->rbe, rtt);
  76. razor_info("receiver_cc_update_rtt, rtt = %dms\n", rtt);
  77. }
  78. void receiver_cc_set_min_bitrate(receiver_cc_t* cc, int min_bitrate)
  79. {
  80. cc->min_bitrate = min_bitrate;
  81. rbe_set_min_bitrate(cc->rbe, min_bitrate);
  82. razor_info("receiver set min bitrate, bitrate = %ubps\n", min_bitrate);
  83. }
  84. void receiver_cc_set_max_bitrate(receiver_cc_t* cc, int max_bitrate)
  85. {
  86. cc->max_bitrate = max_bitrate;
  87. rbe_set_max_bitrate(cc->rbe, max_bitrate);
  88. razor_info("receiver set max bitrate, bitrate = %ubps\n", max_bitrate);
  89. }