ratectl.c
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:11k
源码类别:

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file ratectl.c
  4.  *
  5.  * brief
  6.  *    Rate Control algorithm
  7.  *
  8.  * author
  9.  *    Main contributors (see contributors.h for copyright, address and affiliation details)
  10.  *     - Siwei Ma <swma@jdl.ac.cn>
  11.  *     - Zhengguo LI<ezgli@lit.a-star.edu.sg>
  12.  *
  13.  * date
  14.  *   16 Jan. 2003
  15.  **************************************************************************
  16.  */
  17. #include <math.h>
  18. #include <limits.h>
  19. #include "global.h"
  20. #include "ratectl.h"
  21. /*!
  22.  *************************************************************************************
  23.  * brief
  24.  *    Update Rate Control Parameters
  25.  *************************************************************************************
  26.  */
  27. void rc_store_mad(Macroblock *currMB)
  28. {
  29.   generic_RC->MADofMB[img->current_mb_nr] = ComputeMBMAD();
  30.   if(params->basicunit < img->FrameSizeInMbs)
  31.   {
  32.     generic_RC->TotalMADBasicUnit += generic_RC->MADofMB[img->current_mb_nr];
  33.   }  
  34. }
  35. /*!
  36.  *************************************************************************************
  37.  * brief
  38.  *    Update QP Parameters (in case of SKIP MBs or MBAFF)
  39.  *************************************************************************************
  40.  */
  41. void update_qp_cbp(Macroblock *currMB, short best_mode)
  42. {
  43.   // delta_qp is present only for non-skipped macroblocks
  44.   if ((currMB->cbp!=0 || best_mode == I16MB) && (best_mode != IPCM))
  45.     currMB->prev_cbp = 1;
  46.   else
  47.   {
  48.     currMB->prev_cbp = 0;
  49.     currMB->delta_qp = 0;
  50.     currMB->qp       = currMB->prev_qp;
  51.     img->qp          = currMB->qp;
  52.     update_qp(img, currMB);    
  53.   }
  54.   if (params->MbInterlace)
  55.   {
  56.     // update rdopt buffered qps...
  57.     rdopt->qp        = currMB->qp;
  58.     rdopt->delta_qp  = currMB->delta_qp;
  59.     rdopt->prev_cbp  = currMB->prev_cbp;
  60.   }  
  61. }
  62. /*!
  63.  *************************************************************************************
  64.  * brief
  65.  *    map QP to Qstep
  66.  *
  67.  *************************************************************************************
  68. */
  69. double QP2Qstep( int QP )
  70. {
  71.   int i;
  72.   double Qstep;
  73.   static const double QP2QSTEP[6] = { 0.625, 0.6875, 0.8125, 0.875, 1.0, 1.125 };
  74.   Qstep = QP2QSTEP[QP % 6];
  75.   for( i=0; i<(QP/6); i++)
  76.     Qstep *= 2;
  77.   return Qstep;
  78. }
  79. /*!
  80.  *************************************************************************************
  81.  * brief
  82.  *    map Qstep to QP
  83.  *
  84.  *************************************************************************************
  85. */
  86. int Qstep2QP( double Qstep )
  87. {
  88.   int q_per = 0, q_rem = 0;
  89.   //  assert( Qstep >= QP2Qstep(0) && Qstep <= QP2Qstep(51) );
  90.   if( Qstep < QP2Qstep(0))
  91.     return 0;
  92.   else if (Qstep > QP2Qstep(51) )
  93.     return 51;
  94.   while( Qstep > QP2Qstep(5) )
  95.   {
  96.     Qstep /= 2.0;
  97.     q_per += 1;
  98.   }
  99.   if (Qstep <= 0.65625)
  100.   {
  101.     Qstep = 0.625;
  102.     q_rem = 0;
  103.   }
  104.   else if (Qstep <= 0.75)
  105.   {
  106.     Qstep = 0.6875;
  107.     q_rem = 1;
  108.   }
  109.   else if (Qstep <= 0.84375)
  110.   {
  111.     Qstep = 0.8125;
  112.     q_rem = 2;
  113.   }
  114.   else if (Qstep <= 0.9375)
  115.   {
  116.     Qstep = 0.875;
  117.     q_rem = 3;
  118.   }
  119.   else if (Qstep <= 1.0625)
  120.   {
  121.     Qstep = 1.0;
  122.     q_rem = 4;
  123.   }
  124.   else
  125.   {
  126.     Qstep = 1.125;
  127.     q_rem = 5;
  128.   }
  129.   return (q_per * 6 + q_rem);
  130. }
  131. /*!
  132.  ************************************************************************************
  133.  * brief
  134.  *    calculate MAD for the current macroblock
  135.  *
  136.  * return
  137.  *    calculated MAD
  138.  *
  139.  *************************************************************************************
  140. */
  141. int ComputeMBMAD()
  142. {
  143.   int k, l, sum = 0;
  144.   for (k = 0; k < 16; k++)
  145.     for (l = 0; l < 16; l++)
  146.       sum += iabs(diffy[k][l]);
  147.   return sum;
  148. }
  149. /*!
  150.  *************************************************************************************
  151.  * brief
  152.  *    Compute Frame MAD
  153.  *
  154.  *************************************************************************************
  155. */
  156. double ComputeFrameMAD()
  157. {
  158.   int64 TotalMAD = 0;
  159.   unsigned int i;
  160.   for(i = 0; i < img->FrameSizeInMbs; i++)
  161.     TotalMAD += generic_RC->MADofMB[i];
  162.   return (double)TotalMAD / (256.0 * (double)img->FrameSizeInMbs);
  163. }
  164. /*!
  165.  *************************************************************************************
  166.  * brief
  167.  *    Copy JVT rate control objects
  168.  *
  169.  *************************************************************************************
  170. */
  171. void rc_copy_generic( rc_generic *dst, rc_generic *src )
  172. {
  173.   /* buffer original addresses for which memory has been allocated */
  174.   int *tmpMADofMB = dst->MADofMB;
  175.   /* copy object */
  176.   // This could be written as: *dst = *src;
  177.   memcpy( (void *)dst, (void *)src, sizeof(rc_generic) );
  178.   /* restore original addresses */
  179.   dst->MADofMB = tmpMADofMB;
  180.   /* copy MADs */
  181.   memcpy( (void *)dst->MADofMB, (void *)src->MADofMB, img->FrameSizeInMbs * sizeof (int) );
  182. }
  183. /*!
  184.  *************************************************************************************
  185.  * brief
  186.  *    Dynamically allocate memory needed for generic rate control
  187.  *
  188.  *************************************************************************************
  189.  */
  190. void rc_alloc_generic( rc_generic **prc )
  191. {
  192.   *prc = (rc_generic *) malloc ( sizeof( rc_generic ) );
  193.   if (NULL == *prc)
  194.   {
  195.     no_mem_exit("init_global_buffers: rc_alloc_generic");
  196.   }
  197.   (*prc)->MADofMB = (int *) calloc (img->FrameSizeInMbs, sizeof (int));
  198.   if (NULL == (*prc)->MADofMB)
  199.   {
  200.     no_mem_exit("init_global_buffers: (*prc)->MADofMB");
  201.   }
  202.   (*prc)->FieldFrame = 1;
  203. }
  204. /*!
  205.  *************************************************************************************
  206.  * brief
  207.  *    Free memory needed for generic rate control
  208.  *
  209.  *************************************************************************************
  210.  */
  211. void rc_free_generic(rc_generic **prc)
  212. {
  213.   if (NULL!=(*prc)->MADofMB)
  214.   {
  215.     free ((*prc)->MADofMB);
  216.     (*prc)->MADofMB = NULL;
  217.   }
  218.   if (NULL!=(*prc))
  219.   {
  220.     free ((*prc));
  221.     (*prc) = NULL;
  222.   }
  223. }
  224. /*!
  225.  *************************************************************************************
  226.  * brief
  227.  *    Initialize GOP Level Rate Control parameters
  228.  *
  229.  *************************************************************************************
  230.  */
  231. void rc_init_gop_params(void)
  232. {
  233.   int np, nb; 
  234.   switch( params->RCUpdateMode )
  235.   {
  236.   case RC_MODE_1: case RC_MODE_3: 
  237.     if ( !(img->number) )
  238.     {
  239.       /* number of P frames */
  240.       np = params->no_frames - 1;
  241.       /* number of B frames */
  242.       nb = np * params->successive_Bframe;
  243.       rc_init_GOP(quadratic_RC, np, nb);
  244.     }
  245.     break;
  246.   case RC_MODE_0: case RC_MODE_2:
  247.     if (params->idr_period == 0)
  248.     {
  249.       if ( !(img->number) )
  250.       {
  251.         /* number of P frames */
  252.         np = params->no_frames - 1;
  253.         /* number of B frames */
  254.         nb = np * params->successive_Bframe;
  255.         rc_init_GOP(quadratic_RC, np, nb);
  256.       }
  257.     }
  258.     else if ( (!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
  259.       || (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0) )  
  260.     {
  261.       int M = params->successive_Bframe + 1;
  262.       int N = M * params->idr_period;      
  263.       int n = (img->number == 0) ? N - ( M - 1) : N;
  264.       /* last GOP may contain less frames */
  265.       if ((img->number / params->idr_period) >= (params->no_frames / params->idr_period))
  266.       {
  267.         if (img->number != 0)
  268.           n = (params->no_frames - img->number) * (params->successive_Bframe + 1);
  269.         else
  270.           n = params->no_frames  + (params->no_frames - 1) * params->successive_Bframe;
  271.       }
  272.       /* number of P frames */
  273.       np = (img->number == 0) ? 1 + ((n - 2) / M) : (n - 1) / M; 
  274.       /* number of B frames */
  275.       nb = n - np - 1;
  276.       rc_init_GOP(quadratic_RC, np, nb);
  277.     }
  278.     break;
  279.   default:
  280.     break;
  281.   }
  282. }
  283. /*!
  284.  *************************************************************************************
  285.  * brief
  286.  *    Initialize Frame Level Rate Control parameters
  287.  *
  288.  *************************************************************************************
  289.  */
  290. void rc_init_frame(int FrameNumberInFile)
  291. {
  292.   switch( params->RCUpdateMode )
  293.   {
  294.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  295.   // update the number of MBs in the basic unit for MBAFF coding
  296.   if( (params->MbInterlace) && (params->basicunit < img->FrameSizeInMbs) && (img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && img->number) ) )
  297.     img->BasicUnit = params->basicunit << 1;
  298.   else
  299.     img->BasicUnit = params->basicunit;
  300.     if ( params->RDPictureDecision )
  301.     {    
  302.       rc_copy_quadratic( quadratic_RC_init, quadratic_RC ); // store rate allocation quadratic...    
  303.       rc_copy_generic( generic_RC_init, generic_RC ); // ...and generic model
  304.     }
  305.     rc_init_pict_ptr(quadratic_RC, 1,0,1, 1.0F);
  306.     if( active_sps->frame_mbs_only_flag)
  307.       generic_RC->TopFieldFlag=0;
  308.     img->qp = updateQP(quadratic_RC, 0);
  309.     break;
  310.   default:
  311.     break;
  312.   }
  313. }
  314. /*!
  315.  *************************************************************************************
  316.  * brief
  317.  *    Initialize Sequence Level Rate Control parameters
  318.  *
  319.  *************************************************************************************
  320.  */
  321. void rc_init_sequence(void)
  322. {
  323.   switch( params->RCUpdateMode )
  324.   {
  325.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  326.     rc_init_seq(quadratic_RC);
  327.     break;
  328.   default:
  329.     break;
  330.   }
  331. }
  332. void rc_store_slice_header_bits( int len )
  333. {
  334.   switch (params->RCUpdateMode)
  335.   {
  336.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  337.     generic_RC->NumberofHeaderBits +=len;
  338.     // basic unit layer rate control
  339.     if(img->BasicUnit < img->FrameSizeInMbs)
  340.       generic_RC->NumberofBasicUnitHeaderBits +=len;
  341.     break;
  342.   default:
  343.     break;
  344.   }
  345. }
  346. void update_qp_cbp_tmp(Macroblock *currMB, int cbp, int best_mode)
  347. {
  348.   if (((cbp!=0 || best_mode==I16MB) && (best_mode!=IPCM) ))
  349.     currMB->prev_cbp = 1;
  350.   else if ((cbp==0) || (best_mode==IPCM))
  351.   {
  352.     currMB->prev_cbp  = 0;
  353.     currMB->delta_qp  = 0;
  354.     currMB->qp        = currMB->prev_qp;
  355.     img->qp           = currMB->qp;
  356.     update_qp(img, currMB);        
  357.   }
  358. }
  359. /*!
  360. *************************************************************************************
  361. * brief
  362. *    Update Rate Control Difference
  363. *************************************************************************************
  364. */
  365. void rc_store_diff(int cpix_x, int cpix_y, imgpel prediction[16][16])
  366. {
  367.   int i, j;
  368.   int *iDst;
  369.   imgpel *Src1, *Src2;
  370.   for(j = 0; j < MB_BLOCK_SIZE; j++)
  371.   {
  372.     iDst = diffy[j];
  373.     Src1 = &pCurImg[cpix_y + j][cpix_x];
  374.     Src2 = prediction[j];
  375.     for (i = 0; i < MB_BLOCK_SIZE; i++)
  376.     {
  377.       iDst[i] = Src1[i] - Src2[i];
  378.     }
  379.   }
  380. }