ratecontrol.c
上传用户:sunbaby
上传日期:2013-05-31
资源大小:242k
文件大小:17k
源码类别:

mpeg/mp3

开发平台:

Visual C++

  1. /*****************************************************************************
  2. *
  3. *  T264 AVC CODEC
  4. *
  5. *  Copyright(C) 2004-2005 llcc <lcgate1@yahoo.com.cn>
  6. *               2004-2005 visionany <visionany@yahoo.com.cn>
  7. *
  8. *  This program is free software ; you can redistribute it and/or modify
  9. *  it under the terms of the GNU General Public License as published by
  10. *  the Free Software Foundation ; either version 2 of the License, or
  11. *  (at your option) any later version.
  12. *
  13. *  This program is distributed in the hope that it will be useful,
  14. *  but WITHOUT ANY WARRANTY ; without even the implied warranty of
  15. *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. *  GNU General Public License for more details.
  17. *
  18. *  You should have received a copy of the GNU General Public License
  19. *  along with this program ; if not, write to the Free Software
  20. *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  21. *
  22. ****************************************************************************/
  23. #include "stdio.h"
  24. #include "stdlib.h"
  25. #include "T264.h"
  26. #include "ratecontrol.h"
  27. #include "math.h"
  28. #ifndef CHIP_DM642
  29. #include "memory.h"
  30. #endif
  31. typedef struct
  32. {
  33.     // frame numbers per gop
  34.     int32_t gop;
  35.     int32_t np;
  36.     int32_t nb;
  37.     int32_t qp_sum;
  38.     // the number in current gop, based on 0
  39.     int32_t p_no;
  40.     int32_t b_no;
  41.     // prev qp1, qp2
  42.     int32_t qp_p1;
  43.     int32_t qp_p2;
  44.     double deltap;
  45.     // fluid Flow Traffic Model
  46.     int32_t bc;
  47.     // linear Model
  48.     double a1;
  49.     double a2;
  50.     // model
  51.     double x1;
  52.     double x2;
  53.     double qp[20];
  54.     double rp[20];
  55.     double mad[20];
  56.     int32_t window_p;
  57.     int32_t mad_window_p;
  58.     // remaining bits in gop
  59.     int32_t gop_bits;
  60.     double tbl;
  61.     double gamma;
  62.     double beta;
  63.     double theta;
  64.     double wp;
  65.     double wb;
  66.     double AWp;
  67.     double AWb;
  68.     int32_t ideal_bits;
  69.     double mad_p;
  70. } T264_rc_t;
  71. void rc_init_seq(T264_t* t, T264_rc_t* rc);
  72. void rc_init_gop(T264_t* t, T264_rc_t* rc);
  73. void rc_init_pic(T264_t* t, T264_rc_t* rc);
  74. void rc_update_pic(T264_t* t, T264_rc_t* rc);
  75. // frame level
  76. void rc_update_qp(T264_t* t, T264_rc_t* rc);
  77. // quadratic model
  78. void rc_update_quad_model(T264_t* t, T264_rc_t* rc);
  79. void 
  80. rc_init_seq(T264_t* t, T264_rc_t* rc)
  81. {
  82.     double bpp, L1, L2, L3;
  83.     rc->gop = T264_MIN(t->param.idrframe, t->param.iframe);
  84.     rc->np = rc->gop / (1 + t->param.b_num) - 1;
  85.     rc->nb = rc->gop - rc->np - 1;
  86.     rc->bc = 0;
  87.     rc->a1 = 1.0;
  88.     rc->a2 = 0.0;
  89.     rc->x1 = t->param.bitrate;
  90.     if (rc->nb > 0)
  91.     {
  92.         rc->gamma = 0.25;
  93.         rc->beta = 0.9;
  94.         rc->theta = 1.3636;
  95.     }
  96.     else
  97.     {
  98.         rc->gamma = 0.5;
  99.         rc->beta = 0.75;
  100.     }
  101.     if (t->param.qp == 0)
  102.     {
  103.         bpp = ((double)t->param.bitrate) / (t->param.framerate * t->param.width * t->param.height);
  104.         if (t->param.width == 176)
  105.         {
  106.             L1 = 0.1;
  107.             L2 = 0.3;
  108.             L3 = 0.6;
  109.         }
  110.         else if (t->param.width == 352)
  111.         {
  112.             L1 = 0.2;
  113.             L2 = 0.6;
  114.             L3 = 1.2;
  115.         }
  116.         else
  117.         {
  118.             L1 = 0.6;
  119.             L2 = 1.4;
  120.             L3 = 2.4;
  121.         }
  122.         // first gop first i, p
  123.         if (bpp <= L1)
  124.         {
  125.             t->qp_y = 30;
  126.         }
  127.         else if (bpp <= L2)
  128.         {
  129.             t->qp_y = 25;
  130.         }
  131.         else if (bpp <= L3)
  132.         {
  133.             t->qp_y = 20;
  134.         }
  135.         else
  136.         {
  137.             t->qp_y = 10;
  138.         }
  139.     }
  140. }
  141. void 
  142. rc_init_gop(T264_t* t, T264_rc_t* rc)
  143. {
  144.     rc->gop_bits = (int32_t)(rc->gop * t->param.bitrate / (t->param.framerate) - rc->bc);
  145.     if (t->frame_id != 0)
  146.     {
  147.         // JVTH0014 say to do so
  148.         // t->qp_y = rc->qp_sum / rc->np + 8 * rc->bc / rc->gop_bits - T264_MIN(2, rc->gop / 15);
  149.         // JM does this way
  150.         t->qp_y = rc->qp_sum / rc->np - T264_MIN(2, rc->gop / 15);
  151.         if (rc->gop != 1)
  152.         {
  153.             if (t->qp_y > rc->qp_p2 - 2)
  154.                 t->qp_y --;
  155.             t->qp_y = clip3(t->qp_y, rc->qp_p2 - 2, rc->qp_p2 + 2);
  156.         }
  157.         t->qp_y = clip3(t->qp_y, t->param.min_qp, t->param.max_qp);
  158.     }
  159.     rc->qp_sum = 0;
  160.     rc->p_no = 0;
  161.     rc->b_no = 0;
  162.     rc->qp_p2 = t->qp_y;
  163. }
  164. void 
  165. rc_init_pic(T264_t* t, T264_rc_t* rc)
  166. {
  167.     int32_t f1, f2, f;
  168.     if (t->slice_type == SLICE_P)
  169.     {
  170.         if (rc->p_no > 0)
  171.         {
  172.             // Step 1.1 Determination of target buffer occupancy
  173.             if (rc->p_no == 1)
  174.             {
  175.                 rc->deltap = ((double)rc->bc) / (double)(rc->np - 1);
  176.                 rc->tbl = rc->bc;
  177.                 rc->AWp = rc->wp;
  178.                 rc->AWb = rc->wb;
  179.             }
  180.             else if (rc->p_no < 8)
  181.             {
  182.                 rc->AWp = rc->wp * (rc->p_no - 1) / (rc->p_no) + rc->AWp/ (rc->p_no);
  183.             }
  184.             else
  185.             {
  186.                 rc->AWp = rc->wp / 8 + 7 * rc->AWp / 8;
  187.             }
  188.             
  189.             rc->tbl -= rc->deltap;
  190.             if (t->param.b_num > 0)
  191.             {
  192.                 rc->tbl += rc->AWp * (t->param.b_num + 1) * t->param.bitrate / (t->param.framerate * (rc->AWp + rc->AWb * t->param.b_num))
  193.                     - t->param.bitrate / t->param.framerate;
  194.             }
  195.             // Step 1.2 Microscopic control (target bit rate computation).
  196.             f1 = (int32_t)(t->param.bitrate / t->param.framerate + rc->gamma * (rc->tbl - rc->bc));
  197.             f1 = T264_MAX(0, f1);
  198.             f2 = (int32_t)(rc->wp * rc->gop_bits / (rc->wp * (rc->np - rc->p_no) + rc->wb * (rc->nb - rc->b_no)));
  199.             //f2 = rc->gop_bits / (rc->np - rc->p_no);
  200.             f = (int32_t)(rc->beta * f1 + (1 - rc->beta) * f2);
  201.             rc->ideal_bits = (int32_t)(f * (1 - t->param.b_num * 0.05));
  202.             // HRD consideration ??
  203.         }
  204.     }
  205.     else if (t->slice_type == SLICE_B)
  206.     {
  207.         if (rc->b_no > 0)
  208.         {
  209.             if (rc->b_no == 1)
  210.             {
  211.                 rc->AWb = rc->wb;
  212.             }
  213.             else if (rc->b_no < 8)
  214.             {
  215.                 rc->AWb = rc->wb * (rc->b_no - 1) / rc->b_no + rc->AWb/ rc->b_no;
  216.             }
  217.             else
  218.             {
  219.                 rc->AWb = rc->wb / 8 + 7 * rc->AWb / 8;
  220.             }
  221.         }
  222.     }
  223.     rc_update_qp(t, rc);
  224. }
  225. static void 
  226. rc_update_pic(T264_t* t, T264_rc_t* rc)
  227. {
  228.     int32_t X;
  229.     rc_update_quad_model(t, rc);
  230.     rc->gop_bits -= t->frame_bits;
  231.     rc->bc += (int32_t)(t->frame_bits - t->param.bitrate / t->param.framerate);
  232.     X = (int32_t)t->qp_y * t->frame_bits;
  233.     
  234.     if (t->slice_type == SLICE_P)
  235.     {
  236.         rc->qp_sum += t->qp_y;
  237.         rc->p_no ++;
  238.         rc->wp = X;
  239.         // compute mad
  240.     }
  241.     else if (t->slice_type == SLICE_B)
  242.     {
  243.         rc->b_no ++;
  244.         rc->wb = X / rc->theta;
  245.     }
  246. }
  247. double
  248. qp2qstep( int32_t qp)
  249. {
  250.     int32_t i; 
  251.     double qstep;
  252.     static const double QP2QSTEP[6] = 
  253.     {0.625, 0.6875, 0.8125, 0.875, 1.0, 1.125};
  254.     qstep = QP2QSTEP[qp % 6];
  255.     for(i = 0; i< (qp/6) ; i ++)
  256.         qstep *= 2;
  257.     return qstep;
  258. }
  259. int32_t
  260. qstep2qp(double qstep)
  261. {
  262.     int32_t q_per = 0, q_rem = 0;
  263.     if( qstep < qp2qstep(0))
  264.         return 0;
  265.     else if (qstep > qp2qstep(51))
  266.         return 51;
  267.     while( qstep > qp2qstep(5))
  268.     {
  269.         qstep /= 2;
  270.         q_per += 1;
  271.     }
  272.     if (qstep <= (0.625+0.6875)/2) 
  273.     {
  274.         qstep = 0.625;
  275.         q_rem = 0;
  276.     }
  277.     else if (qstep <= (0.6875+0.8125)/2)
  278.     {
  279.         qstep = 0.6875;
  280.         q_rem = 1;
  281.     }
  282.     else if (qstep <= (0.8125+0.875)/2)
  283.     {
  284.         qstep = 0.8125;
  285.         q_rem = 2;
  286.     }
  287.     else if (qstep <= (0.875+1.0)/2)
  288.     {
  289.         qstep = 0.875;
  290.         q_rem = 3;
  291.     }
  292.     else if (qstep <= (1.0+1.125)/2)
  293.     {
  294.         qstep = 1.0;  
  295.         q_rem = 4;
  296.     }
  297.     else 
  298.     {
  299.         qstep = 1.125;
  300.         q_rem = 5;
  301.     }
  302.     return (q_per * 6 + q_rem);
  303. }
  304. void 
  305. rc_update_qp(T264_t* t, T264_rc_t* rc)
  306. {
  307.     if (t->slice_type == SLICE_P)
  308.     {
  309.         if (rc->p_no != 0)
  310.         {
  311.             if (rc->ideal_bits < 0)
  312.             {
  313.                 t->qp_y += 2;
  314.                 t->qp_y = T264_MIN(t->qp_y, t->param.max_qp);
  315.             }
  316.             else
  317.             {
  318.                 double tmp1, tmp2;
  319.                 double step;
  320.                 int32_t bits = rc->ideal_bits - t->header_bits;
  321.                 double mad = rc->a1 * rc->mad_p + rc->a2;
  322.                 int32_t qp;
  323.                 bits = T264_MAX(bits, (int32_t)(t->param.bitrate / t->param.framerate / 4));
  324.                 tmp1 = mad * mad * rc->x1 * rc->x1 + 4 * rc->x2 * mad * bits;
  325.                 tmp2 = sqrt(tmp1) - rc->x1 * mad;
  326.                 if (rc->x2 < 0.000001 || tmp1 < 0.000001 ||  tmp2 <= 0.000001)
  327.                     step = rc->x1 * mad / bits;
  328.                 else
  329.                     step = rc->x2 * mad * 2 / tmp2;
  330.                 qp = qstep2qp(step);
  331.                 qp = T264_MIN(rc->qp_p2 + 2, qp);
  332.                 qp = T264_MIN(t->param.max_qp, qp);
  333.                 qp = T264_MAX(rc->qp_p2 - 2, qp);
  334.                 t->qp_y = T264_MAX(t->param.min_qp, qp);
  335.             }
  336.         }
  337.         rc->qp_p1 = rc->qp_p2;
  338.         rc->qp_p2 = t->qp_y;
  339.     }
  340.     else if (t->slice_type == SLICE_B)
  341.     {
  342.         if (t->param.b_num == 1)
  343.         {
  344.             if (rc->qp_p1 == rc->qp_p2)
  345.                 t->qp_y += 2;
  346.             else
  347.                 t->qp_y = (rc->qp_p1 + rc->qp_p2) / 2 + 1;
  348.             
  349.             t->qp_y = clip3(t->qp_y, t->param.min_qp, t->param.max_qp);
  350.         }
  351.         else
  352.         {
  353.             int32_t step_size;
  354.             if (rc->qp_p2 - rc->qp_p1 <= -2 * t->param.b_num - 3)
  355.                 step_size = -3;
  356.             else if (rc->qp_p2 - rc->qp_p1 == -2 * t->param.b_num - 2)
  357.                 step_size = -2;
  358.             else if (rc->qp_p2 - rc->qp_p1 == -2 * t->param.b_num - 1)
  359.                 step_size = -1;
  360.             else if (rc->qp_p2 - rc->qp_p1 == -2 * t->param.b_num - 0)
  361.                 step_size = 0;
  362.             else if (rc->qp_p2 - rc->qp_p1 == -2 * t->param.b_num + 1)
  363.                 step_size = 1;
  364.             else
  365.                 step_size = 2;
  366.             t->qp_y = rc->qp_p1 + step_size;
  367.             //t->qp_y += T264_MIN(2 * rc->b_no, 
  368.             //    T264_MAX(-2 * rc->b_no, rc->b_no * (rc->qp_p2 - rc->qp_p1) / (t->param.b_num - 1)));
  369.             t->qp_y = clip3(t->qp_y, t->param.min_qp, t->param.max_qp);
  370.         }
  371.     }
  372. }
  373. static void __inline
  374. remove_outlier(T264_t* t, int8_t valid[20], T264_rc_t* rc)
  375. {
  376.     double error[20];
  377.     int32_t i;
  378.     double std = 0.0;
  379.     double threshold;
  380.     for(i = 0 ; i < rc->window_p ; i ++)
  381.     {
  382.         error[i] = rc->x1 / rc->qp[i] + rc->x2 / (rc->qp[i] * rc->rp[i]) - rc->qp[i];
  383.         std += error[i] * error[i];
  384.     }
  385.     threshold = rc->window_p == 2 ? 0 : sqrt(std / rc->window_p);
  386.     for(i = 1 ; i < rc->window_p ; i ++)
  387.     {
  388.         if (error[i] > threshold)
  389.             valid[i] = FALSE;
  390.     }
  391. }
  392. static void __inline
  393. remove_mad_outlier(T264_t* t, int8_t valid[20], T264_rc_t* rc)
  394. {
  395.     double error[20];
  396.     int32_t i;
  397.     double std = 0.0;
  398.     double threshold;
  399.     for(i = 0 ; i < rc->mad_window_p ; i ++)
  400.     {
  401.         error[i] = rc->a1 * rc->mad[i + 1] + rc->a2 - rc->mad[i];
  402.         std += error[i] * error[i];
  403.     }
  404.     threshold = rc->mad_window_p == 2 ? 0 : sqrt(std / rc->mad_window_p);
  405.     for(i = 1 ; i < rc->mad_window_p ; i ++)
  406.     {
  407.         if (error[i] > threshold)
  408.             valid[i] = FALSE;
  409.     }
  410. }
  411. void
  412. mad_model_estimator(T264_t* t, int8_t valid[20], int32_t window, T264_rc_t* rc)
  413. {
  414.     int32_t real_window = 0, i;
  415.     int8_t estimate_x2 = FALSE;
  416.     double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
  417.     double mad;
  418.     double matrix_value;
  419.     for(i = 0 ; i < window ; i ++)
  420.     {
  421.         if (valid[i])
  422.         {
  423.             real_window ++;
  424.             mad = rc->mad[i];
  425.         }
  426.     }
  427.     rc->a1 = rc->a2 = 0.0;
  428.     for(i = 0 ; i < window ; i ++)
  429.     {
  430.         if (valid[i])
  431.         {
  432.             rc->a1 += rc->mad[i] / (rc->mad[i + 1] * real_window);
  433.             if (ABS(mad - rc->mad[i]) < 0.00001)
  434.                 estimate_x2 = TRUE;
  435.         }
  436.     }
  437.     if (real_window >= 1 && estimate_x2)
  438.     {
  439.         for(i = 0 ; i < window ; i ++)
  440.         {
  441.             if (valid[i])
  442.             {
  443.                 a00 += 1.0;
  444.                 a01 += rc->mad[i + 1];
  445.                 a10 = a01;
  446.                 a11 += rc->mad[i + 1] * rc->mad[i + 1];
  447.                 b0 += rc->mad[i];
  448.                 b1 += rc->mad[i] * rc->mad[i + 1];
  449.             }
  450.         }
  451.         matrix_value = a00 * a11 - a01 * a10;
  452.         if (ABS(matrix_value) > 0.000001)
  453.         {
  454.             rc->a2 = (b0 * a11 - b1 * a01) / matrix_value;
  455.             rc->a1 = (b1 * a00 - b0 * a10) / matrix_value;
  456.         }
  457.         else
  458.         {
  459.             rc->a1 = b0 / a01;
  460.             rc->a2 = 0.0;
  461.         }
  462.     }
  463. }
  464. void
  465. rc_update_mad_model(T264_t* t, T264_rc_t* rc)
  466. {
  467.     int32_t i;
  468.     int32_t window;
  469.     double mad;
  470.     int8_t valid[20];
  471.     if (t->slice_type == SLICE_P)
  472.     {
  473.         mad = ((double)t->sad_all) / ((double)(t->width * t->height));
  474.         // update x1, x2
  475.         for (i = 19 ; i > 0 ; i --)
  476.         {
  477.             rc->mad[i] = rc->mad[i - 1];
  478.         }
  479.         rc->mad[0] = mad;
  480.         window = (int32_t)(mad > rc->mad_p ? rc->mad_p / mad * 20 : mad / rc->mad_p * 20);
  481.         window = clip3(1, rc->p_no + 1, window);
  482.         window = T264_MIN(window, rc->mad_window_p + 1);
  483.         window = T264_MIN(window, 20);
  484.         rc->mad_window_p = window;
  485.         memset(valid, TRUE, sizeof(valid));
  486.         mad_model_estimator(t, valid, window, rc);
  487.         remove_mad_outlier(t, valid, rc);
  488.         mad_model_estimator(t, valid, window, rc);
  489.     }
  490. }
  491. void
  492. quad_model_estimator(T264_t* t, int8_t valid[20], int32_t window, T264_rc_t* rc)
  493. {
  494.     int32_t real_window = 0, i;
  495.     int8_t estimate_x2 = FALSE;
  496.     double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
  497.     double qp;
  498.     double matrix_value;
  499.     for(i = 0 ; i < window ; i ++)
  500.     {
  501.         if (valid[i])
  502.         {
  503.             real_window ++;
  504.             qp = rc->qp[i];
  505.         }
  506.     }
  507.     rc->x1 = rc->x2 = 0.0;
  508.     for(i = 0 ; i < window ; i ++)
  509.     {
  510.         if (valid[i])
  511.         {
  512.             rc->x1 += rc->qp[i] * rc->rp[i] / real_window;
  513.             if (qp != rc->qp[i])
  514.                 estimate_x2 = TRUE;
  515.         }
  516.     }
  517.     if (real_window >= 1 && estimate_x2)
  518.     {
  519.         for(i = 0 ; i < window ; i ++)
  520.         {
  521.             if (valid[i])
  522.             {
  523.                 a00 += 1.0;
  524.                 a01 += 1.0 / rc->qp[i];
  525.                 a10 = a01;
  526.                 a11 += 1.0 / (rc->qp[i] * rc->rp[i]);
  527.                 b0 += rc->qp[i] * rc->rp[i];
  528.                 b1 += rc->rp[i];
  529.             }
  530.         }
  531.         matrix_value = a00 * a11 - a01 * a10;
  532.         if (ABS(matrix_value) > 0.000001)
  533.         {
  534.             rc->x1 = (b0 * a11 - b1 * a01) / matrix_value;
  535.             rc->x2 = (b1 * a00 - b0 * a10) / matrix_value;
  536.         }
  537.         else
  538.         {
  539.             rc->x1 = b0 / a00;
  540.             rc->x2 = 0.0;
  541.         }
  542.     }
  543. }
  544. static void 
  545. rc_update_quad_model(T264_t* t, T264_rc_t* rc)
  546. {
  547.     int32_t i;
  548.     int32_t window;
  549.     double mad;
  550.     int8_t valid[20];
  551.     if (t->slice_type == SLICE_P)
  552.     {
  553.         mad = ((double)t->sad_all) / ((double)(t->width * t->height));
  554.         // update x1, x2
  555.         for (i = 19 ; i > 0 ; i --)
  556.         {
  557.             rc->qp[i] = rc->qp[i - 1];
  558.             rc->rp[i] = rc->rp[i - 1];
  559.         }
  560.         rc->qp[0] = t->qp_y;
  561.         rc->rp[0] = ((double)(t->frame_bits - t->header_bits)) / mad;
  562.         window = (int32_t)(mad > rc->mad_p ? rc->mad_p / mad * 20 : mad / rc->mad_p * 20);
  563.         window = clip3(1, rc->p_no + 1, window);
  564.         window = T264_MIN(window, rc->window_p + 1);
  565.         window = T264_MIN(window, 20);
  566.         rc->window_p = window;
  567.         if (window > 0)
  568.         {
  569.             memset(valid, TRUE, sizeof(valid));
  570.             quad_model_estimator(t, valid, window, rc);
  571.             remove_outlier(t, valid, rc);
  572.             quad_model_estimator(t, valid, window, rc);
  573.         }
  574.         if (rc->p_no > 0)
  575.         {
  576.             // update a1, a2
  577.             rc_update_mad_model(t, rc);
  578.         }
  579.         else
  580.         {
  581.             rc->mad[0] = mad;
  582.         }
  583.         rc->mad_p = mad;
  584.     }
  585. }
  586. static void
  587. rc_proc(T264_t* t, void* data, int32_t state)
  588. {
  589.     T264_rc_t* rc = data;
  590.     switch (state) 
  591.     {
  592.     case STATE_BEFOREPIC:
  593.         rc_init_pic(t, rc);
  594.         break;
  595.     case STATE_AFTERPIC:
  596.         rc_update_pic(t, rc);
  597.         break;
  598.     case STATE_BEFOREGOP:
  599.         rc_init_gop(t, rc);
  600.         break;
  601.     case STATE_BEFORESEQ:
  602.         rc_init_seq(t, rc);
  603.         break;
  604.     default:
  605.         break;
  606.     }
  607. }
  608. void
  609. rc_create(T264_t* t, T264_plugin_t* plugin)
  610. {
  611.     T264_rc_t* handle = malloc(sizeof(T264_rc_t));
  612.     memset(handle, 0, sizeof(T264_rc_t));
  613.     plugin->handle = handle;
  614.     plugin->proc = rc_proc;
  615.     plugin->close = rc_destroy;
  616.     plugin->ret = 0;
  617. }
  618. void
  619. rc_destroy(T264_t* t, T264_plugin_t* plugin)
  620. {
  621.     free(plugin->handle);
  622. }