rate_stat.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #include "../estimator/rate_stat.h"
  2. void rate_stat_init(rate_stat_t* rate, int wnd_size, float scale)
  3. {
  4. rate->wnd_size = wnd_size;
  5. rate->scale = scale;
  6. rate->buckets = (rate_bucket_t *)calloc(wnd_size, sizeof(rate_bucket_t));
  7. rate->accumulated_count = 0;
  8. rate->sample_num = 0;
  9. rate->oldest_index = 0;
  10. rate->oldest_ts = -1;
  11. }
  12. void rate_stat_destroy(rate_stat_t* rate)
  13. {
  14. if (rate == NULL)
  15. return;
  16. if (rate->buckets != NULL){
  17. free(rate->buckets);
  18. rate->buckets = NULL;
  19. }
  20. }
  21. void rate_stat_reset(rate_stat_t* rate)
  22. {
  23. int i;
  24. rate->accumulated_count = 0;
  25. rate->sample_num = 0;
  26. rate->oldest_index = 0;
  27. rate->oldest_ts = -1;
  28. for (i = 0; i < rate->wnd_size; ++i){
  29. rate->buckets[i].sum = 0;
  30. rate->buckets[i].sample = 0;
  31. }
  32. }
  33. /*删除过期的统计数据*/
  34. static void rate_stat_erase(rate_stat_t* rate, int64_t now_ts)
  35. {
  36. int64_t new_oldest_ts;
  37. rate_bucket_t* bucket;
  38. if (rate->oldest_ts == -1)
  39. return;
  40. new_oldest_ts = now_ts - rate->wnd_size + 1;
  41. if (new_oldest_ts <= rate->oldest_ts)
  42. return;
  43. while (rate->sample_num > 0 && rate->oldest_ts < new_oldest_ts){
  44. bucket = &rate->buckets[rate->oldest_index];
  45. rate->sample_num -= bucket->sample;
  46. rate->accumulated_count -= bucket->sum;
  47. bucket->sum = 0;
  48. bucket->sample = 0;
  49. if (++rate->oldest_index >= rate->wnd_size)
  50. rate->oldest_index = 0;
  51. ++rate->oldest_ts;
  52. }
  53. rate->oldest_ts = new_oldest_ts;
  54. }
  55. void rate_stat_update(rate_stat_t* rate, size_t count, int64_t now_ts)
  56. {
  57. int ts_offset, index;
  58. if (rate->oldest_ts > now_ts)
  59. return;
  60. rate_stat_erase(rate, now_ts);
  61. if (rate->oldest_ts == -1){
  62. rate->oldest_ts = now_ts;
  63. }
  64. ts_offset = (int)(now_ts - rate->oldest_ts);
  65. index = (rate->oldest_index + ts_offset) % rate->wnd_size;
  66. rate->buckets[index].sum += count;
  67. rate->buckets[index].sample++;
  68. rate->sample_num++;
  69. rate->accumulated_count += count;
  70. }
  71. /*获取统计到的码率*/
  72. int rate_stat_rate(rate_stat_t* rate, int64_t now_ts)
  73. {
  74. int ret, active_wnd_size;
  75. rate_stat_erase(rate, now_ts);
  76. active_wnd_size = (int)(now_ts - rate->oldest_ts + 1);
  77. if (rate->sample_num == 0 || active_wnd_size <= 1 || (active_wnd_size < rate->wnd_size))
  78. return -1;
  79. ret = (int)(rate->accumulated_count * rate->scale / active_wnd_size + 0.5);
  80. return ret;
  81. }