ratecontrol.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:3k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. #include "ratecontrol.h"
  2. #include <math.h> /* fabs */
  3. #define ABS(X) (X < 0) ? (-X) : (X)
  4. typedef struct {
  5. int64_t size;
  6. int32_t count;
  7. } QuantInfo;
  8. typedef struct
  9. {
  10. int32_t rtn_quant;
  11. int64_t frames;
  12. int64_t total_size;
  13. double framerate;
  14. int32_t target_rate;
  15. int16_t max_quant;
  16. int16_t min_quant;
  17. int64_t last_change;
  18. int64_t quant_sum;
  19. double quant_error[32];
  20. double avg_framesize;
  21. double target_framesize;
  22. int32_t reaction_delay_factor;
  23. } RateControl;
  24. RateControl rate_control;
  25. int get_initial_quant(int bpp) {
  26. return 5;
  27. }
  28. void RateControlInit(uint32_t target_rate, uint32_t reaction_delay_factor, int framerate,
  29.      int max_quant, int min_quant)
  30. {
  31. int i;
  32. rate_control.frames = 0;
  33. rate_control.total_size = 0;
  34. rate_control.framerate = framerate / 1000.0;
  35. rate_control.target_rate = target_rate;
  36. rate_control.rtn_quant = get_initial_quant(0);
  37. rate_control.max_quant = max_quant;
  38. rate_control.min_quant = min_quant;
  39. for (i=0 ; i<32 ; ++i)
  40. {
  41. rate_control.quant_error[i] = 0.0;
  42. }
  43. rate_control.target_framesize = target_rate / rate_control.framerate;
  44. rate_control.avg_framesize = target_rate / rate_control.framerate;
  45. rate_control.reaction_delay_factor = reaction_delay_factor;
  46. }
  47. int RateControlGetQ(int keyframe)
  48. {
  49. return rate_control.rtn_quant;
  50. }
  51. void RateControlUpdate(int16_t quant, int frame_size, int keyframe)
  52. {
  53. int64_t deviation;
  54. double overflow, cur_target;
  55. int32_t rtn_quant;
  56. rate_control.frames++;
  57. rate_control.total_size += frame_size;
  58. deviation = (int64_t) ((double) rate_control.total_size - 
  59.        ((double) ((double) rate_control.target_rate / 8.0 /
  60.  (double) rate_control.framerate) * (double) rate_control.frames));
  61. DEBUGCBR((int32_t)(rate_control.frames - 1), rate_control.rtn_quant, (int32_t)deviation);
  62. rate_control.avg_framesize -= rate_control.avg_framesize / (double)rate_control.reaction_delay_factor;
  63. rate_control.avg_framesize += frame_size * rate_control.rtn_quant * 0.5 / (double)rate_control.reaction_delay_factor;
  64. if (rate_control.target_framesize > rate_control.avg_framesize)
  65. cur_target = rate_control.avg_framesize;
  66. else
  67. cur_target = rate_control.target_framesize;
  68. deviation /= -rate_control.reaction_delay_factor;
  69. overflow = (double)deviation * rate_control.avg_framesize / rate_control.target_framesize;
  70. if (overflow > cur_target)
  71. overflow = cur_target;
  72. else if (overflow < cur_target * -0.935)
  73. overflow = cur_target * -0.935;
  74. rtn_quant = (int32_t)(rate_control.avg_framesize * 2.0 / (cur_target + overflow));
  75. if (rtn_quant < 31)
  76. {
  77. rate_control.quant_error[rtn_quant] += rate_control.avg_framesize * 2.0 / (cur_target + overflow) - rtn_quant;
  78. if (rate_control.quant_error[rtn_quant] >= 1.0)
  79. {
  80. rate_control.quant_error[rtn_quant] -= 1.0;
  81. rtn_quant++;
  82. }
  83. }
  84. if (rtn_quant > rate_control.rtn_quant + 1)
  85. rtn_quant = rate_control.rtn_quant + 1;
  86. else if (rtn_quant < rate_control.rtn_quant - 1)
  87. rtn_quant = rate_control.rtn_quant - 1;
  88. if (rtn_quant > rate_control.max_quant)
  89. rtn_quant = rate_control.max_quant;
  90. else if (rtn_quant < rate_control.min_quant)
  91. rtn_quant = rate_control.min_quant;
  92. rate_control.rtn_quant = rtn_quant;
  93. }