delay_base_bwe.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. #include "delay_base_bwe.h"
  2. #include "../cc/razor_log.h"
  3. #define k_trendline_smoothing_coeff 0.9
  4. #define k_trendline_threshold_gain 4.0
  5. #define k_trendline_window_size 20
  6. #define k_group_time 5
  7. #define k_max_failed_count 5
  8. #define k_min_bitrate 64000 /*8KB/S*/
  9. #define k_max_bitrate 12800000 /*1.6MB/S*/
  10. #define k_timestamp_ms 2000
  11. delay_base_bwe_t* delay_bwe_create()
  12. {
  13. delay_base_bwe_t* bwe = (delay_base_bwe_t*)calloc(1, sizeof(delay_base_bwe_t));
  14. bwe->last_seen_ms = -1;
  15. bwe->first_ts = (int64_t)GET_SYS_MS();
  16. bwe->trendline_window_size = k_trendline_window_size;
  17. bwe->trendline_smoothing_coeff = k_trendline_smoothing_coeff;
  18. bwe->trendline_threshold_gain = k_trendline_threshold_gain;
  19. bwe->rate_control = aimd_create((uint32_t)k_max_bitrate, (uint32_t)k_min_bitrate);
  20. bwe->detector = overuse_create();
  21. return bwe;
  22. }
  23. void delay_bwe_destroy(delay_base_bwe_t* bwe)
  24. {
  25. if (bwe == NULL)
  26. return;
  27. if (bwe->rate_control != NULL){
  28. aimd_destroy(bwe->rate_control);
  29. bwe->rate_control = NULL;
  30. }
  31. if (bwe->detector != NULL){
  32. overuse_destroy(bwe->detector);
  33. bwe->detector = NULL;
  34. }
  35. if (bwe->inter_arrival != NULL){
  36. destroy_inter_arrival(bwe->inter_arrival);
  37. bwe->inter_arrival = NULL;
  38. }
  39. if (bwe->trendline_estimator != NULL){
  40. trendline_destroy(bwe->trendline_estimator);
  41. bwe->trendline_estimator = NULL;
  42. }
  43. free((void *)bwe);
  44. }
  45. static inline void delay_bwe_reset(delay_base_bwe_t* bwe)
  46. {
  47. if (bwe->inter_arrival != NULL)
  48. destroy_inter_arrival(bwe->inter_arrival);
  49. bwe->inter_arrival = create_inter_arrival(0, (uint32_t)k_group_time);
  50. if (bwe->trendline_estimator != NULL)
  51. trendline_destroy(bwe->trendline_estimator);
  52. bwe->trendline_estimator = trendline_create(bwe->trendline_window_size, bwe->trendline_smoothing_coeff, bwe->trendline_threshold_gain);
  53. }
  54. static void delay_bwe_process(delay_base_bwe_t* bwe, packet_feedback_t* packet, int64_t now_ts)
  55. {
  56. uint32_t timestamp;
  57. uint32_t ts_delta = 0;
  58. int64_t t_delta = 0;
  59. int size_delta = 0;
  60. if (bwe->last_seen_ms == -1 || now_ts > bwe->last_seen_ms + k_timestamp_ms){
  61. delay_bwe_reset(bwe);
  62. }
  63. bwe->last_seen_ms = now_ts;
  64. timestamp = (uint32_t)(packet->send_ts - bwe->first_ts);
  65. if (inter_arrival_compute_deltas(bwe->inter_arrival, timestamp, packet->arrival_ts, now_ts, packet->payload_size,
  66. &ts_delta, &t_delta, &size_delta) == 0){
  67. /*进行斜率计算*/
  68. trendline_update(bwe->trendline_estimator, t_delta, ts_delta, packet->arrival_ts);
  69. /*进行过载检查*/
  70. overuse_detect(bwe->detector, trendline_slope(bwe->trendline_estimator), ts_delta, bwe->trendline_estimator->num_of_deltas, packet->arrival_ts);
  71. }
  72. }
  73. static inline bwe_result_t delay_bwe_long_feedback_delay(delay_base_bwe_t* bwe, int64_t arrival_ts)
  74. {
  75. bwe_result_t result;
  76. init_bwe_result_null(result);
  77. aimd_set_estimate(bwe->rate_control, bwe->rate_control->curr_rate * 1 / 2, arrival_ts);
  78. result.updated = 0;
  79. result.probe = -1;
  80. result.bitrate = bwe->rate_control->curr_rate;
  81. return result;
  82. }
  83. static int delay_bwe_upate(delay_base_bwe_t* bwe, int64_t now_ts, uint32_t acked_bitrate, int overusing, uint32_t* target_bitrate)
  84. {
  85. uint32_t prev_bitrate;
  86. rate_control_input_t input;
  87. input.state = overusing == 0 ? kBwOverusing : bwe->detector->state;
  88. input.noise_var = 0;
  89. input.incoming_bitrate = acked_bitrate;
  90. prev_bitrate = bwe->rate_control->curr_rate;
  91. *target_bitrate = aimd_update(bwe->rate_control, &input, now_ts);
  92. return (bwe->rate_control->inited == 0 && prev_bitrate != *target_bitrate) ? 0 : -1;
  93. }
  94. static bwe_result_t delay_bwe_maybe_update(delay_base_bwe_t* bwe, int overusing, uint32_t acked_bitrate, int recovered_from_overuse, int64_t now_ts)
  95. {
  96. bwe_result_t result;
  97. init_bwe_result_null(result);
  98. if (overusing == 0){ /*过载保护,进行带宽下降*/
  99. if (acked_bitrate > 0 && aimd_time_reduce_further(bwe->rate_control, now_ts, acked_bitrate) == 0){ /*带宽过载,进行aimd方式减小*/
  100. result.updated = delay_bwe_upate(bwe, now_ts, acked_bitrate, overusing, &result.bitrate);
  101. }
  102. else if (acked_bitrate == 0 && bwe->rate_control->inited == 0
  103. && aimd_time_reduce_further(bwe->rate_control, now_ts, bwe->rate_control->curr_rate * 3 / 4 - 1) == 0){ /*带宽过载且没统计到新的acked带宽,进行减半处理*/
  104. aimd_set_estimate(bwe->rate_control, bwe->rate_control->curr_rate * 3 / 4, now_ts);
  105. result.updated = 0;
  106. result.probe = -1;
  107. result.bitrate = bwe->rate_control->curr_rate;
  108. }
  109. }
  110. else{ /*未过载,进行aimd方式判断是否要加大码率*/
  111. result.updated = delay_bwe_upate(bwe, now_ts, acked_bitrate, overusing, &result.bitrate);
  112. result.recovered_from_overuse = recovered_from_overuse;
  113. }
  114. return result;
  115. }
  116. bwe_result_t delay_bwe_incoming(delay_base_bwe_t* bwe, packet_feedback_t packets[], int packets_num, uint32_t acked_bitrate, int64_t now_ts)
  117. {
  118. int i, overusing, delayed_feedback, recovered_from_overuse, prev_state;
  119. bwe_result_t result;
  120. init_bwe_result_null(result);
  121. if (packets_num <= 0)
  122. return result;
  123. overusing = -1;
  124. delayed_feedback = 0;
  125. recovered_from_overuse = -1;
  126. prev_state = bwe->detector->state;
  127. for (i = 0; i < packets_num; ++i){
  128. if (packets[i].send_ts < bwe->first_ts)
  129. continue;
  130. delayed_feedback = -1;
  131. /*通过发包和收包间隔差计算延迟斜率,通过斜率判断是否过载*/
  132. delay_bwe_process(bwe, &packets[i], now_ts);
  133. if (prev_state == kBwUnderusing && bwe->detector->state == kBwNormal)
  134. recovered_from_overuse = 0;
  135. prev_state = bwe->detector->state;
  136. }
  137. if (bwe->detector->state == kBwOverusing){
  138. overusing = 0;
  139. razor_debug("bwe state = kBwOverusing\n");
  140. }
  141. if (delayed_feedback == 0){ /*太多次网络feedback事件出现重复,强制的带宽减半并返回*/
  142. bwe->consecutive_delayed_feedbacks++;
  143. if (bwe->consecutive_delayed_feedbacks > k_max_failed_count)
  144. return delay_bwe_long_feedback_delay(bwe, packets[packets_num - 1].arrival_ts);
  145. }
  146. else{ /*进行aimd方式码率计算*/
  147. bwe->consecutive_delayed_feedbacks = 0;
  148. return delay_bwe_maybe_update(bwe, overusing, acked_bitrate, recovered_from_overuse, now_ts);
  149. }
  150. return result;
  151. }
  152. void delay_bwe_rtt_update(delay_base_bwe_t* bwe, uint32_t rtt)
  153. {
  154. aimd_set_rtt(bwe->rate_control, rtt);
  155. }
  156. int delay_bwe_last_estimate(delay_base_bwe_t* bwe, uint32_t* bitrate)
  157. {
  158. if (bwe->rate_control->inited == -1)
  159. return -1;
  160. *bitrate = bwe->rate_control->curr_rate;
  161. return 0;
  162. }
  163. void delay_bwe_set_start_bitrate(delay_base_bwe_t* bwe, uint32_t bitrate)
  164. {
  165. aimd_set_start_bitrate(bwe->rate_control, bitrate);
  166. }
  167. void delay_bwe_set_min_bitrate(delay_base_bwe_t* bwe, uint32_t min_bitrate)
  168. {
  169. aimd_set_min_bitrate(bwe->rate_control, min_bitrate);
  170. }
  171. void delay_bwe_set_max_bitrate(delay_base_bwe_t* bwe, uint32_t max_bitrate)
  172. {
  173. aimd_set_max_bitrate(bwe->rate_control, max_bitrate);
  174. }
  175. int64_t delay_bwe_expected_period(delay_base_bwe_t* bwe)
  176. {
  177. return aimd_get_expected_bandwidth_period(bwe->rate_control);
  178. }