rate_ctl.c
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:3k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. #include "stdio.h"
  2. extern FILE *ftrace;
  3. extern int max_quantizer, min_quantizer;
  4. typedef struct _rc_param_ {
  5. double quant;
  6. int rc_period;
  7. double target_rate;
  8. double average_rate;
  9. double reaction_rate;
  10. double average_delta;
  11. double reaction_delta;
  12. double reaction_ratio;
  13. } RC_Param;
  14. static RC_Param rc_param;
  15. void RateCtlInit(double quant, double target_rate, 
  16. long rc_period, long rc_reaction_period, long rc_reaction_ratio)
  17. {
  18. #ifdef _RC_
  19. fprintf(ftrace, "Initializing Rate Control module:n");
  20. fprintf(ftrace, "Initial quantizer is %f.n", quant);
  21. fprintf(ftrace, "Target rate is %f bits per frame.n", target_rate);
  22. fprintf(ftrace, "RC averaging period is %d.n", rc_period);
  23. fprintf(ftrace, "RC reaction period is %d.n", rc_reaction_period);
  24. fprintf(ftrace, "RC reaction ratio is %d.n", rc_reaction_ratio);
  25. #endif
  26. rc_param.quant = quant;
  27. rc_param.rc_period = rc_period;
  28. rc_param.target_rate = target_rate;
  29. rc_param.reaction_ratio = rc_reaction_ratio;
  30. rc_param.average_delta = 1. / rc_period;
  31. rc_param.reaction_delta = 1. / rc_reaction_period;
  32. rc_param.average_rate = target_rate;
  33. rc_param.reaction_rate = target_rate;
  34. return;
  35. }
  36. int RateCtlGetQ(double MAD)
  37. {
  38. double quant;
  39. quant = rc_param.quant;
  40. return (int)(quant + 0.5);
  41. }
  42. void RateCtlUpdate(int current_frame)
  43. {
  44. double rate, delta, decay;
  45. double target, current_target;
  46. double median_quant;
  47. #ifdef _RC_
  48. fprintf(ftrace, "Quantizer is currently %f.n", rc_param.quant);
  49. fprintf(ftrace, "Current frame is %d bits long.n", current_frame);
  50. #endif
  51. rate = rc_param.average_rate;
  52. delta = rc_param.average_delta;
  53. decay = 1 - delta;
  54. rate = rate * decay + current_frame * delta;
  55. rc_param.average_rate = rate;
  56. target = rc_param.target_rate;
  57. if (rate > target) {
  58. current_target = target - (rate - target);
  59. if (current_target < target * 0.75) current_target = target * 0.75;
  60. } else {
  61. current_target = target;
  62. }
  63. #ifdef _RC_
  64. fprintf(ftrace, "Target rate is %f.n", target);
  65. fprintf(ftrace, "Average rate is %f.n", rate);
  66. fprintf(ftrace, "Target rate for current frame is %f.n", current_target);
  67. #endif
  68. rate = rc_param.reaction_rate;
  69. delta = rc_param.reaction_delta;
  70. decay = 1 - delta;
  71. rate = rate * decay + current_frame * delta;
  72. rc_param.reaction_rate = rate;
  73. median_quant = min_quantizer + (max_quantizer - min_quantizer) / 2;
  74. if (rate < current_target) rc_param.quant *= 
  75. (1 - rc_param.reaction_delta * ((current_target - rate) / current_target / 0.20) );
  76. if (rc_param.quant < min_quantizer) rc_param.quant = min_quantizer;
  77. if (rate > current_target) {
  78. if (rc_param.quant > median_quant) 
  79. rc_param.quant *= (1 + rc_param.reaction_delta / rc_param.reaction_ratio);
  80. else if (rate > current_target * 1.20) rc_param.quant *=
  81. (1 + rc_param.reaction_delta);
  82. else rc_param.quant *= 
  83. (1 + rc_param.reaction_delta * ((rate - current_target) / current_target / 0.20) );
  84. }
  85. if (rc_param.quant > max_quantizer) rc_param.quant = max_quantizer;
  86. #ifdef _RC_
  87. fprintf(ftrace, "Reaction rate is %f.n", rate);
  88. fprintf(ftrace, "Quantizer is updated to %f.n", rc_param.quant);
  89. #endif
  90. return;
  91. }