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

Audio

开发平台:

Visual C++

  1. /*!
  2.  ***************************************************************************
  3.  * file rc_quadratic.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.  *     - Athanasios Leontaris <aleon@dolby.com>
  13.  *
  14.  * date
  15.  *   16 Jan. 2003
  16.  **************************************************************************
  17.  */
  18. #include <math.h>
  19. #include <limits.h>
  20. #include "global.h"
  21. #include "ratectl.h"
  22. static const float THETA = 1.3636F;
  23. static const float OMEGA = 0.9F;
  24. static const float MINVALUE = 4.0F;
  25. /*!
  26.  *************************************************************************************
  27.  * brief
  28.  *    Dynamically allocate memory needed for rate control
  29.  *
  30.  *************************************************************************************
  31.  */
  32. void rc_alloc_quadratic( rc_quadratic **prc )
  33. {
  34.   int rcBufSize = img->FrameSizeInMbs / params->basicunit;
  35.   rc_quadratic *lprc;
  36.   (*prc) = (rc_quadratic *) malloc ( sizeof( rc_quadratic ) );
  37.   if (NULL==(*prc))
  38.   {
  39.     no_mem_exit("init_global_buffers: (*prc)");
  40.   }
  41.   lprc = *prc;
  42.   lprc->PreviousFrameMAD = 1.0;
  43.   lprc->CurrentFrameMAD = 1.0;
  44.   lprc->Pprev_bits = 0;
  45.   lprc->Target = 0;
  46.   lprc->TargetField = 0;
  47.   lprc->LowerBound = 0;
  48.   lprc->UpperBound1 = INT_MAX;
  49.   lprc->UpperBound2 = INT_MAX;
  50.   lprc->Wp = 0.0;
  51.   lprc->Wb = 0.0;
  52.   lprc->AveWb = 0.0;
  53.   lprc->PAveFrameQP   = params->qp0;
  54.   lprc->m_Qc          = lprc->PAveFrameQP;
  55.   lprc->FieldQPBuffer = lprc->PAveFrameQP;
  56.   lprc->FrameQPBuffer = lprc->PAveFrameQP;
  57.   lprc->PAverageQp    = lprc->PAveFrameQP;
  58.   lprc->MyInitialQp   = lprc->PAveFrameQP;
  59.   lprc->AveWb         = 0.0;
  60.   lprc->BUPFMAD = (double*) calloc ((rcBufSize), sizeof (double));
  61.   if (NULL==lprc->BUPFMAD)
  62.   {
  63.     no_mem_exit("rc_alloc_quadratic: lprc->BUPFMAD");
  64.   }
  65.   lprc->BUCFMAD = (double*) calloc ((rcBufSize), sizeof (double));
  66.   if (NULL==lprc->BUCFMAD)
  67.   {
  68.     no_mem_exit("rc_alloc_quadratic: lprc->BUCFMAD");
  69.   }
  70.   lprc->FCBUCFMAD = (double*) calloc ((rcBufSize), sizeof (double));
  71.   if (NULL==lprc->FCBUCFMAD)
  72.   {
  73.     no_mem_exit("rc_alloc_quadratic: lprc->FCBUCFMAD");
  74.   }
  75.   lprc->FCBUPFMAD = (double*) calloc ((rcBufSize), sizeof (double));
  76.   if (NULL==lprc->FCBUPFMAD)
  77.   {
  78.     no_mem_exit("rc_alloc_quadratic: lprc->FCBUPFMAD");
  79.   }
  80. }
  81. /*!
  82.  *************************************************************************************
  83.  * brief
  84.  *    Copy JVT rate control objects
  85.  *
  86.  *************************************************************************************
  87.  */
  88. void rc_copy_quadratic( rc_quadratic *dst, rc_quadratic *src )
  89. {
  90.   int rcBufSize = img->FrameSizeInMbs / params->basicunit;
  91.   /* buffer original addresses for which memory has been allocated */
  92.   double   *tmpBUPFMAD = dst->BUPFMAD;
  93.   double   *tmpBUCFMAD = dst->BUCFMAD;
  94.   double *tmpFCBUPFMAD = dst->FCBUPFMAD;
  95.   double *tmpFCBUCFMAD = dst->FCBUCFMAD;
  96.   /* copy object */
  97.   memcpy( (void *)dst, (void *)src, sizeof(rc_quadratic) );
  98.   /* restore original addresses */
  99.   dst->BUPFMAD   = tmpBUPFMAD;
  100.   dst->BUCFMAD   = tmpBUCFMAD;
  101.   dst->FCBUPFMAD = tmpFCBUPFMAD;
  102.   dst->FCBUCFMAD = tmpFCBUCFMAD;
  103.   /* copy MADs */
  104.   memcpy( (void *)dst->BUPFMAD,   (void *)src->BUPFMAD,   (rcBufSize) * sizeof (double) );
  105.   memcpy( (void *)dst->BUCFMAD,   (void *)src->BUCFMAD,   (rcBufSize) * sizeof (double) );
  106.   memcpy( (void *)dst->FCBUPFMAD, (void *)src->FCBUPFMAD, (rcBufSize) * sizeof (double) );
  107.   memcpy( (void *)dst->FCBUCFMAD, (void *)src->FCBUCFMAD, (rcBufSize) * sizeof (double) );
  108. }
  109. /*!
  110.  *************************************************************************************
  111.  * brief
  112.  *    Free memory needed for rate control
  113.  *
  114.  *************************************************************************************
  115. */
  116. void rc_free_quadratic(rc_quadratic **prc)
  117. {
  118.   if (NULL!=(*prc)->BUPFMAD)
  119.   {
  120.     free ((*prc)->BUPFMAD);
  121.     (*prc)->BUPFMAD = NULL;
  122.   }
  123.   if (NULL!=(*prc)->BUCFMAD)
  124.   {
  125.     free ((*prc)->BUCFMAD);
  126.     (*prc)->BUCFMAD = NULL;
  127.   }
  128.   if (NULL!=(*prc)->FCBUCFMAD)
  129.   {
  130.     free ((*prc)->FCBUCFMAD);
  131.     (*prc)->FCBUCFMAD = NULL;
  132.   }
  133.   if (NULL!=(*prc)->FCBUPFMAD)
  134.   {
  135.     free ((*prc)->FCBUPFMAD);
  136.     (*prc)->FCBUPFMAD = NULL;
  137.   }
  138.   if (NULL!=(*prc))
  139.   {
  140.     free ((*prc));
  141.     (*prc) = NULL;
  142.   }
  143. }
  144. /*!
  145.  *************************************************************************************
  146.  * brief
  147.  *    Initialize rate control parameters
  148.  *
  149.  *************************************************************************************
  150. */
  151. void rc_init_seq(rc_quadratic *prc)
  152. {
  153.   double L1,L2,L3,bpp;
  154.   int qp, i;
  155.   switch ( params->RCUpdateMode )
  156.   {
  157.   case RC_MODE_0:
  158.     updateQP = updateQPRC0;
  159.     break;
  160.   case RC_MODE_1:
  161.     updateQP = updateQPRC1;
  162.     break;
  163.   case RC_MODE_2:
  164.     updateQP = updateQPRC2;
  165.     break;
  166.   case RC_MODE_3:
  167.     updateQP = updateQPRC3;
  168.     break;
  169.   default:
  170.     updateQP = updateQPRC0;
  171.     break;
  172.   }
  173.   // set function pointers
  174.   rc_update_pict_frame_ptr = rc_update_pict_frame;
  175.   rc_update_picture_ptr    = rc_update_picture;
  176.   rc_init_pict_ptr         = rc_init_pict;
  177.   prc->Xp=0;
  178.   prc->Xb=0;
  179.   prc->bit_rate = (float) params->bit_rate;
  180.   prc->frame_rate = (img->framerate *(float)(params->successive_Bframe + 1)) / (float) (params->jumpd + 1);
  181.   prc->PrevBitRate = prc->bit_rate;
  182.   /*compute the total number of MBs in a frame*/
  183.   if(params->basicunit > img->FrameSizeInMbs)
  184.     params->basicunit = img->FrameSizeInMbs;
  185.   if(params->basicunit < img->FrameSizeInMbs)
  186.     prc->TotalNumberofBasicUnit = img->FrameSizeInMbs/params->basicunit;
  187.   else
  188.     prc->TotalNumberofBasicUnit = 1;
  189.   /*initialize the parameters of fluid flow traffic model*/
  190.   generic_RC->CurrentBufferFullness = 0;
  191.   prc->GOPTargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
  192.   /*initialize the previous window size*/
  193.   prc->m_windowSize    = 0;
  194.   prc->MADm_windowSize = 0;
  195.   generic_RC->NumberofCodedBFrame = 0;
  196.   prc->NumberofCodedPFrame = 0;
  197.   generic_RC->NumberofGOP         = 0;
  198.   /*remaining # of bits in GOP */
  199.   generic_RC->RemainingBits = 0;
  200.   /*control parameter */
  201.   if(params->successive_Bframe>0)
  202.   {
  203.     prc->GAMMAP=0.25;
  204.     prc->BETAP=0.9;
  205.   }
  206.   else
  207.   {
  208.     prc->GAMMAP=0.5;
  209.     prc->BETAP=0.5;
  210.   }
  211.   /*quadratic rate-distortion model*/
  212.   prc->PPreHeader=0;
  213.   prc->Pm_X1 = prc->bit_rate * 1.0;
  214.   prc->Pm_X2 = 0.0;
  215.   /* linear prediction model for P picture*/
  216.   prc->PMADPictureC1 = 1.0;
  217.   prc->PMADPictureC2 = 0.0;
  218.   // Initialize values
  219.   for(i=0;i<21;i++)
  220.   {
  221.     prc->Pm_rgQp[i] = 0;
  222.     prc->Pm_rgRp[i] = 0.0;
  223.     prc->PPictureMAD[i] = 0.0;
  224.   }
  225.   //Define the largest variation of quantization parameters
  226.   prc->PMaxQpChange = params->RCMaxQPChange;
  227.   /*basic unit layer rate control*/
  228.   prc->PAveHeaderBits1 = 0;
  229.   prc->PAveHeaderBits3 = 0;
  230.   prc->DDquant = (prc->TotalNumberofBasicUnit>=9 ? 1 : 2);
  231.   prc->MBPerRow = img->PicWidthInMbs;
  232.   /*adaptive field/frame coding*/
  233.   generic_RC->FieldControl=0;  
  234.   if (params->SeinitialQP==0)
  235.   {
  236.     /*compute the initial QP*/
  237.     bpp = 1.0*prc->bit_rate /(prc->frame_rate*img->size);
  238.     if (img->width == 176)
  239.     {
  240.       L1 = 0.1;
  241.       L2 = 0.3;
  242.       L3 = 0.6;
  243.     }
  244.     else if (img->width == 352)
  245.     {
  246.       L1 = 0.2;
  247.       L2 = 0.6;
  248.       L3 = 1.2;
  249.     }
  250.     else
  251.     {
  252.       L1 = 0.6;
  253.       L2 = 1.4;
  254.       L3 = 2.4;
  255.     }
  256.     if (bpp<= L1)
  257.       qp = 35;
  258.     else if(bpp<=L2)
  259.       qp = 25;
  260.     else if(bpp<=L3)
  261.       qp = 20;
  262.     else
  263.       qp = 10;
  264.     params->SeinitialQP = qp;
  265.   }
  266. }
  267. /*!
  268.  *************************************************************************************
  269.  * brief
  270.  *    Initialize one GOP
  271.  *
  272.  *************************************************************************************
  273. */
  274. void rc_init_GOP(rc_quadratic *prc, int np, int nb)
  275. {
  276.   Boolean Overum=FALSE;
  277.   int OverBits, OverDuantQp;
  278.   int GOPDquant;
  279.   int64 AllocatedBits;
  280.   // bit allocation for RC_MODE_3
  281.   switch( params->RCUpdateMode )
  282.   {
  283.   case RC_MODE_3:
  284.     {
  285.       int sum = 0, tmp, level, levels = 0, num_frames[RC_MAX_TEMPORAL_LEVELS];
  286.       float numer, denom;
  287.       int gop = params->successive_Bframe + 1;
  288.       memset( num_frames, 0, RC_MAX_TEMPORAL_LEVELS * sizeof(int) );
  289.       // are there any B frames?
  290.       if ( params->successive_Bframe )
  291.       {
  292.         if ( params->HierarchicalCoding == 1 ) // two layers: even/odd
  293.         {
  294.           levels = 2;
  295.           num_frames[0] = params->successive_Bframe >> 1;
  296.           num_frames[1] = (params->successive_Bframe - num_frames[0]) >= 0 ? (params->successive_Bframe - num_frames[0]) : 0;
  297.         }
  298.         else if ( params->HierarchicalCoding == 2 ) // binary hierarchical structure
  299.         {
  300.           // check if gop is power of two
  301.           tmp = gop;
  302.           while ( tmp )
  303.           {
  304.             sum += tmp & 1;
  305.             tmp >>= 1;
  306.           }
  307.           assert( sum == 1 );
  308.           // determine number of levels
  309.           levels = 0;
  310.           tmp = gop;
  311.           while ( tmp > 1 )
  312.           {
  313.             tmp >>= 1; // divide by 2          
  314.             num_frames[levels] = 1 << levels;
  315.             levels++;          
  316.           }
  317.           assert( levels >= 1 && levels <= RC_MAX_TEMPORAL_LEVELS );        
  318.         }
  319.         else if ( params->HierarchicalCoding == 3 )
  320.         {
  321.           fprintf(stderr, "n RCUpdateMode=3 and HierarchicalCoding == 3 are currently not supported"); // This error message should be moved elsewhere and have proper memory deallocation
  322.           exit(1);
  323.         }
  324.         else // all frames of the same priority - level
  325.         {
  326.           levels = 1;
  327.           num_frames[0] = params->successive_Bframe;
  328.         }
  329.         generic_RC->temporal_levels = levels;      
  330.       }
  331.       else
  332.       {
  333.         for ( level = 0; level < RC_MAX_TEMPORAL_LEVELS; level++ )
  334.         {
  335.           params->RCBSliceBitRatio[level] = 0.0F;
  336.         }
  337.         generic_RC->temporal_levels = 0;
  338.       }
  339.       // calculate allocated bits for each type of frame
  340.       numer = (float)(( (!params->intra_period ? 1 : params->intra_period) * gop) * ((double)params->bit_rate / params->FrameRate));
  341.       denom = 0.0F;
  342.       for ( level = 0; level < levels; level++ )
  343.       {
  344.         denom += (float)(num_frames[level] * params->RCBSliceBitRatio[level]);
  345.         generic_RC->hierNb[level] = num_frames[level] * np;
  346.       }
  347.       denom += 1.0F;
  348.       if ( params->intra_period >= 1 )
  349.       {
  350.         denom *= (float)params->intra_period;
  351.         denom += (float)params->RCISliceBitRatio - 1.0F;
  352.       }
  353.       // set bit targets for each type of frame
  354.       generic_RC->RCPSliceBits = (int) floor( numer / denom + 0.5F );
  355.       generic_RC->RCISliceBits = (params->intra_period) ? (int)(params->RCISliceBitRatio * generic_RC->RCPSliceBits + 0.5) : 0;
  356.       for ( level = 0; level < levels; level++ )
  357.       {
  358.         generic_RC->RCBSliceBits[level] = (int)floor(params->RCBSliceBitRatio[level] * generic_RC->RCPSliceBits + 0.5);
  359.       }
  360.       generic_RC->NISlice = (params->intra_period) ? ((params->no_frames - 1) / params->intra_period) : 0;
  361.       generic_RC->NPSlice = params->no_frames - 1 - generic_RC->NISlice;
  362.     }
  363.     break;
  364.   default:
  365.     break;
  366.   }
  367.   /* check if the last GOP over uses its budget. If yes, the initial QP of the I frame in
  368.   the coming  GOP will be increased.*/
  369.   if(generic_RC->RemainingBits<0)
  370.     Overum=TRUE;
  371.   OverBits=-(int)(generic_RC->RemainingBits);
  372.   /*initialize the lower bound and the upper bound for the target bits of each frame, HRD consideration*/
  373.   prc->LowerBound  = (int)(generic_RC->RemainingBits + prc->bit_rate / prc->frame_rate);
  374.   prc->UpperBound1 = (int)(generic_RC->RemainingBits + (prc->bit_rate * 2.048));
  375.   /*compute the total number of bits for the current GOP*/
  376.   AllocatedBits = (int64) floor((1 + np + nb) * prc->bit_rate / prc->frame_rate + 0.5);
  377.   generic_RC->RemainingBits += AllocatedBits;
  378.   prc->Np = np;
  379.   prc->Nb = nb;
  380.   OverDuantQp=(int)(8 * OverBits/AllocatedBits+0.5);
  381.   prc->GOPOverdue=FALSE;
  382.   /*field coding*/
  383.   //generic_RC->NoGranularFieldRC = ( params->PicInterlace || !params->MbInterlace || params->basicunit != img->FrameSizeInMbs );
  384.   if ( !params->PicInterlace && params->MbInterlace && params->basicunit == img->FrameSizeInMbs )
  385.     generic_RC->NoGranularFieldRC = 0;
  386.   else
  387.     generic_RC->NoGranularFieldRC = 1;
  388.   /*Compute InitialQp for each GOP*/
  389.   prc->TotalPFrame=np;
  390.   generic_RC->NumberofGOP++;
  391.   if(generic_RC->NumberofGOP==1)
  392.   {
  393.     prc->MyInitialQp = params->SeinitialQP;
  394.     prc->CurrLastQP = prc->MyInitialQp - 1; //recent change -0;
  395.     prc->QPLastGOP   = prc->MyInitialQp;
  396.     prc->PAveFrameQP   = prc->MyInitialQp;
  397.     prc->m_Qc          = prc->PAveFrameQP;
  398.     prc->FieldQPBuffer = prc->PAveFrameQP;
  399.     prc->FrameQPBuffer = prc->PAveFrameQP;
  400.     prc->PAverageQp    = prc->PAveFrameQP;
  401.   }
  402.   else
  403.   {
  404.     /*adaptive field/frame coding*/
  405.     if( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace )
  406.     {
  407.       if (generic_RC->FieldFrame == 1)
  408.       {
  409.         prc->TotalQpforPPicture += prc->FrameQPBuffer;
  410.         prc->QPLastPFrame = prc->FrameQPBuffer;
  411.       }
  412.       else
  413.       {
  414.         prc->TotalQpforPPicture += prc->FieldQPBuffer;
  415.         prc->QPLastPFrame = prc->FieldQPBuffer;
  416.       }
  417.     }
  418.     /*compute the average QP of P frames in the previous GOP*/
  419.     prc->PAverageQp=(int)(1.0 * prc->TotalQpforPPicture / prc->NumberofPPicture+0.5);
  420.     GOPDquant=(int)((1.0*(np+nb+1)/15.0) + 0.5);
  421.     if(GOPDquant>2)
  422.       GOPDquant=2;
  423.     prc->PAverageQp -= GOPDquant;
  424.     if (prc->PAverageQp > (prc->QPLastPFrame - 2))
  425.       prc->PAverageQp--;
  426.     // QP is constrained by QP of previous QP
  427.     prc->PAverageQp = iClip3(prc->QPLastGOP - 2, prc->QPLastGOP + 2, prc->PAverageQp);
  428.     // Also clipped within range.
  429.     prc->PAverageQp = iClip3(img->RCMinQP,  img->RCMaxQP,  prc->PAverageQp);
  430.     prc->MyInitialQp = prc->PAverageQp;
  431.     prc->Pm_Qp       = prc->PAverageQp;
  432.     prc->PAveFrameQP = prc->PAverageQp;
  433.     prc->QPLastGOP   = prc->MyInitialQp;
  434.     prc->PrevLastQP = prc->CurrLastQP;
  435.     prc->CurrLastQP = prc->MyInitialQp - 1;
  436.   }
  437.   prc->TotalQpforPPicture=0;
  438.   prc->NumberofPPicture=0;
  439.   prc->NumberofBFrames=0;
  440. }
  441. /*!
  442.  *************************************************************************************
  443.  * brief
  444.  *    Initialize one picture
  445.  *
  446.  *************************************************************************************
  447. */
  448. void rc_init_pict(rc_quadratic *prc, int fieldpic,int topfield,int targetcomputation, float mult)
  449. {
  450.   int tmp_T;
  451.   /* compute the total number of basic units in a frame */
  452.   if(params->MbInterlace)
  453.     prc->TotalNumberofBasicUnit = img->FrameSizeInMbs / img->BasicUnit;
  454.   else
  455.     prc->TotalNumberofBasicUnit = img->FrameSizeInMbs / params->basicunit;
  456.   img->NumberofCodedMacroBlocks = 0;
  457.   /* Normally, the bandwidth for the VBR case is estimated by
  458.      a congestion control algorithm. A bandwidth curve can be predefined if we only want to
  459.      test the proposed algorithm */
  460.   if(params->channel_type==1)
  461.   {
  462.     if(prc->NumberofCodedPFrame==58)
  463.       prc->bit_rate *= 1.5;
  464.     else if(prc->NumberofCodedPFrame==59)
  465.       prc->PrevBitRate = prc->bit_rate;
  466.   }
  467.   /* predefine a target buffer level for each frame */
  468.   if((fieldpic||topfield) && targetcomputation)
  469.   {
  470.     if ( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number !=0)) )
  471.     {
  472.       /* Since the available bandwidth may vary at any time, the total number of
  473.       bits is updated picture by picture*/
  474.       if(prc->PrevBitRate!=prc->bit_rate)
  475.         generic_RC->RemainingBits +=(int) floor((prc->bit_rate-prc->PrevBitRate)*(prc->Np + prc->Nb)/prc->frame_rate+0.5);
  476.       /* predefine the  target buffer level for each picture.
  477.       frame layer rate control */
  478.       if(img->BasicUnit == img->FrameSizeInMbs)
  479.       {
  480.         if(prc->NumberofPPicture==1)
  481.         {
  482.           prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
  483.           prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel) / (prc->TotalPFrame-1);
  484.           prc->TargetBufferLevel -= prc->DeltaP;
  485.         }
  486.         else if(prc->NumberofPPicture>1)
  487.           prc->TargetBufferLevel -= prc->DeltaP;
  488.       }
  489.       /* basic unit layer rate control */
  490.       else
  491.       {
  492.         if(prc->NumberofCodedPFrame>0)
  493.         {
  494.           /* adaptive frame/field coding */
  495.           if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==1))
  496.             memcpy((void *)prc->FCBUPFMAD,(void *)prc->FCBUCFMAD, prc->TotalNumberofBasicUnit * sizeof(double));
  497.           else
  498.             memcpy((void *)prc->BUPFMAD,(void *)prc->BUCFMAD, prc->TotalNumberofBasicUnit * sizeof(double));
  499.         }
  500.         if(generic_RC->NumberofGOP==1)
  501.         {
  502.           if(prc->NumberofPPicture==1)
  503.           {
  504.             prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
  505.             prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel)/(prc->TotalPFrame - 1);
  506.             prc->TargetBufferLevel -= prc->DeltaP;
  507.           }
  508.           else if(prc->NumberofPPicture>1)
  509.             prc->TargetBufferLevel -= prc->DeltaP;
  510.         }
  511.         else if(generic_RC->NumberofGOP>1)
  512.         {
  513.           if(prc->NumberofPPicture==0)
  514.           {
  515.             prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
  516.             prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel) / prc->TotalPFrame;
  517.             prc->TargetBufferLevel -= prc->DeltaP;
  518.           }
  519.           else if(prc->NumberofPPicture>0)
  520.             prc->TargetBufferLevel -= prc->DeltaP;
  521.         }
  522.       }
  523.       if(prc->NumberofCodedPFrame==1)
  524.         prc->AveWp = prc->Wp;
  525.       if((prc->NumberofCodedPFrame<8)&&(prc->NumberofCodedPFrame>1))
  526.         prc->AveWp = (prc->AveWp + prc->Wp * (prc->NumberofCodedPFrame-1))/prc->NumberofCodedPFrame;
  527.       else if(prc->NumberofCodedPFrame>1)
  528.         prc->AveWp = (prc->Wp + 7 * prc->AveWp) / 8;
  529.       // compute the average complexity of B frames
  530.       if(params->successive_Bframe>0)
  531.       {
  532.         // compute the target buffer level
  533.         prc->TargetBufferLevel += (prc->AveWp * (params->successive_Bframe + 1)*prc->bit_rate
  534.           /(prc->frame_rate*(prc->AveWp+prc->AveWb*params->successive_Bframe))-prc->bit_rate/prc->frame_rate);
  535.       }
  536.     }
  537.     else if ( img->type == B_SLICE )
  538.     {
  539.       /* update the total number of bits if the bandwidth is changed*/
  540.       if(prc->PrevBitRate != prc->bit_rate)
  541.         generic_RC->RemainingBits +=(int) floor((prc->bit_rate-prc->PrevBitRate) * (prc->Np + prc->Nb) / prc->frame_rate+0.5);
  542.       if(generic_RC->NumberofCodedBFrame == 1)
  543.       {
  544.         if(prc->NumberofCodedPFrame == 1)
  545.         {
  546.           prc->AveWp = prc->Wp;
  547.         }
  548.         prc->AveWb = prc->Wb;
  549.       }
  550.       else if(generic_RC->NumberofCodedBFrame > 1)
  551.       {
  552.         //compute the average weight
  553.         if(generic_RC->NumberofCodedBFrame<8)
  554.           prc->AveWb = (prc->AveWb + prc->Wb*(generic_RC->NumberofCodedBFrame-1)) / generic_RC->NumberofCodedBFrame;
  555.         else
  556.           prc->AveWb = (prc->Wb + 7 * prc->AveWb) / 8;
  557.       }
  558.     }
  559.     /* Compute the target bit for each frame */
  560.     if( img->type == P_SLICE || ( (img->number != 0) && (params->RCUpdateMode == RC_MODE_1 || params->RCUpdateMode == RC_MODE_3 ) ) )
  561.     {
  562.       /* frame layer rate control */
  563.       if(img->BasicUnit == img->FrameSizeInMbs || (params->RCUpdateMode == RC_MODE_3) )
  564.       {
  565.         if(prc->NumberofCodedPFrame>0)
  566.         {
  567.           if (params->RCUpdateMode == RC_MODE_3)
  568.           {
  569.             int level_idx = (img->type == B_SLICE && params->HierarchicalCoding) ? (generic_RC->temporal_levels - 1 - gop_structure[img->b_frame_to_code-1].hierarchy_layer) : 0;
  570.             int bitrate = (img->type == B_SLICE) ? generic_RC->RCBSliceBits[ level_idx ]
  571.             : ( img->type == P_SLICE ? generic_RC->RCPSliceBits : generic_RC->RCISliceBits );
  572.             int level, denom = generic_RC->NISlice * generic_RC->RCISliceBits + generic_RC->NPSlice * generic_RC->RCPSliceBits;
  573.             if ( params->HierarchicalCoding )
  574.             {
  575.               for ( level = 0; level < generic_RC->temporal_levels; level++ )
  576.                 denom += generic_RC->hierNb[ level ] * generic_RC->RCBSliceBits[ level ];
  577.             }
  578.             else
  579.             {
  580.               denom += generic_RC->hierNb[0] * generic_RC->RCBSliceBits[0];
  581.             }
  582.             // target due to remaining bits
  583.             prc->Target = (int) floor( (float)(1.0 * bitrate * generic_RC->RemainingBits) / (float)denom + 0.5F );
  584.             // target given original taget rate and buffer considerations
  585.             tmp_T  = imax(0, (int) floor( (double)bitrate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5) );
  586.             // translate Target rate from B or I "domain" to P domain since the P RC model is going to be used to select the QP
  587.             // for hierarchical coding adjust the target QP to account for different temporal levels
  588.             switch( img->type )
  589.             {
  590.             case B_SLICE:
  591.               prc->Target = (int) floor( (float)prc->Target / params->RCBoverPRatio + 0.5F);
  592.               break;
  593.             case I_SLICE:
  594.               prc->Target = (int) floor( (float)prc->Target / (params->RCIoverPRatio * 4.0) + 0.5F); // 4x accounts for the fact that header bits reduce the percentage of texture
  595.               break;
  596.             case P_SLICE:
  597.             default:
  598.               break;
  599.             }
  600.           }
  601.           else
  602.           {
  603.             prc->Target = (int) floor( prc->Wp * generic_RC->RemainingBits / (prc->Np * prc->Wp + prc->Nb * prc->Wb) + 0.5);
  604.             tmp_T  = imax(0, (int) floor(prc->bit_rate / prc->frame_rate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5));
  605.             prc->Target = (int) floor(prc->BETAP * (prc->Target - tmp_T) + tmp_T + 0.5);
  606.           }
  607.         }
  608.       }
  609.       /* basic unit layer rate control */
  610.       else
  611.       {
  612.         if(((generic_RC->NumberofGOP == 1)&&(prc->NumberofCodedPFrame>0))
  613.           || (generic_RC->NumberofGOP > 1))
  614.         {
  615.           prc->Target = (int) (floor( prc->Wp * generic_RC->RemainingBits / (prc->Np * prc->Wp + prc->Nb * prc->Wb) + 0.5));
  616.           tmp_T  = imax(0, (int) (floor(prc->bit_rate / prc->frame_rate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5)));
  617.           prc->Target = (int) (floor(prc->BETAP * (prc->Target - tmp_T) + tmp_T + 0.5));
  618.         }
  619.       }
  620.       prc->Target = (int)(mult * prc->Target);
  621.       /* HRD consideration */
  622.       if ( params->RCUpdateMode != RC_MODE_3 || img->type == P_SLICE )
  623.         prc->Target = iClip3(prc->LowerBound, prc->UpperBound2, prc->Target);
  624.       if((topfield) || (fieldpic && ((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))))
  625.         prc->TargetField=prc->Target;
  626.     }
  627.   }
  628.   if(fieldpic || topfield)
  629.   {
  630.     /* frame layer rate control */
  631.     generic_RC->NumberofHeaderBits  = 0;
  632.     generic_RC->NumberofTextureBits = 0;
  633.     /* basic unit layer rate control */
  634.     if(img->BasicUnit < img->FrameSizeInMbs)
  635.     {
  636.       prc->TotalFrameQP = 0;
  637.       generic_RC->NumberofBasicUnitHeaderBits  = 0;
  638.       generic_RC->NumberofBasicUnitTextureBits = 0;
  639.       generic_RC->TotalMADBasicUnit = 0;
  640.       if(generic_RC->FieldControl==0)
  641.         prc->NumberofBasicUnit = prc->TotalNumberofBasicUnit;
  642.       else
  643.         prc->NumberofBasicUnit = prc->TotalNumberofBasicUnit >> 1;
  644.     }
  645.   }
  646.   if( ( img->type==P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) ) && img->BasicUnit < img->FrameSizeInMbs && generic_RC->FieldControl == 1 )
  647.   {
  648.     /* top field at basic unit layer rate control */
  649.     if(topfield)
  650.     {
  651.       prc->bits_topfield=0;
  652.       prc->Target=(int)(prc->TargetField*0.6);
  653.     }
  654.     /* bottom field at basic unit layer rate control */
  655.     else
  656.     {
  657.       prc->Target=prc->TargetField-prc->bits_topfield;
  658.       generic_RC->NumberofBasicUnitHeaderBits=0;
  659.       generic_RC->NumberofBasicUnitTextureBits=0;
  660.       generic_RC->TotalMADBasicUnit=0;
  661.       prc->NumberofBasicUnit=prc->TotalNumberofBasicUnit >> 1;
  662.     }
  663.   }
  664. }
  665. /*!
  666.  *************************************************************************************
  667.  * brief
  668.  *    update one picture after frame/field encoding
  669.  *
  670.  * param nbits
  671.  *    number of bits used for picture
  672.  *
  673.  *************************************************************************************
  674. */
  675. void rc_update_pict(rc_quadratic *prc, int nbits)
  676. {
  677.   int delta_bits = (nbits - (int)floor(prc->bit_rate / prc->frame_rate + 0.5F) );
  678.   // remaining # of bits in GOP
  679.   generic_RC->RemainingBits -= nbits; 
  680.   generic_RC->CurrentBufferFullness += delta_bits;
  681.   // update the lower bound and the upper bound for the target bits of each frame, HRD consideration
  682.   prc->LowerBound  -= (int) delta_bits;
  683.   prc->UpperBound1 -= (int) delta_bits;
  684.   prc->UpperBound2  = (int)(OMEGA * prc->UpperBound1);
  685.   // update the parameters of quadratic R-D model
  686.   if( img->type==P_SLICE || (params->RCUpdateMode == RC_MODE_1 && img->frm_number) )
  687.   {
  688.     updateRCModel(prc);
  689.     if ( params->RCUpdateMode == RC_MODE_3 )
  690.       prc->PreviousWholeFrameMAD = ComputeFrameMAD();
  691.   }
  692. }
  693. /*!
  694.  *************************************************************************************
  695.  * brief
  696.  *    update one picture after coding
  697.  *
  698.  * param bits
  699.  *    number of bits used for picture
  700.  *
  701.  *************************************************************************************
  702. */
  703. void rc_update_picture( int bits )
  704. {
  705.   rc_update_pict(quadratic_RC, bits);
  706. }
  707. int updateComplexity( rc_quadratic *prc, Boolean is_updated, int nbits )
  708. {
  709.   double Avem_Qc;
  710.   /* frame layer rate control */
  711.   if(img->BasicUnit == img->FrameSizeInMbs)
  712.     return ((int) floor(nbits * prc->m_Qc + 0.5));
  713.   /* basic unit layer rate control */
  714.   else
  715.   {
  716.     if( is_updated )
  717.     {
  718.       if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
  719.       {
  720.         Avem_Qc = (double)prc->TotalFrameQP / (double)prc->TotalNumberofBasicUnit;
  721.         return ((int)floor(nbits * Avem_Qc + 0.5));
  722.       }
  723.     }
  724.     else if( img->type == B_SLICE )
  725.       return ((int) floor(nbits * prc->m_Qc + 0.5));
  726.   }
  727.   return 0;
  728. }
  729. void updatePparams( rc_quadratic *prc, int complexity )
  730. {
  731.   prc->Xp = complexity;
  732.   prc->Np--;
  733.   prc->Wp = prc->Xp;
  734.   prc->Pm_Hp = generic_RC->NumberofHeaderBits;
  735.   prc->NumberofCodedPFrame++;
  736.   prc->NumberofPPicture++;
  737. }
  738. void updateBparams( rc_quadratic *prc, int complexity )
  739. {
  740.   prc->Xb = complexity;
  741.   prc->Nb--;
  742.   prc->Wb = prc->Xb / THETA;     
  743.   prc->NumberofBFrames++;
  744.   generic_RC->NumberofCodedBFrame++;
  745. }
  746. /*! 
  747.  *************************************************************************************
  748.  * brief
  749.  *    update after frame encoding
  750.  *
  751.  * param nbits
  752.  *    number of bits used for frame
  753.  *
  754.  *************************************************************************************
  755. */
  756. void rc_update_pict_frame(rc_quadratic *prc, int nbits)
  757. {
  758.   /* update the complexity weight of I, P, B frame */  
  759.   int complexity = 0;
  760.   switch( params->RCUpdateMode )
  761.   {
  762.   case RC_MODE_0:
  763.   case RC_MODE_2:
  764.   default:
  765.     complexity = updateComplexity( prc, (Boolean) (img->type == P_SLICE), nbits );
  766.     if ( img->type == P_SLICE )
  767.     {
  768.       if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
  769.         updatePparams( prc, complexity );
  770.       else
  771.         generic_RC->NoGranularFieldRC = 0;
  772.     }
  773.     else if ( img->type == B_SLICE )
  774.       updateBparams( prc, complexity );
  775.     break;
  776.   case RC_MODE_1:
  777.     complexity = updateComplexity( prc, (Boolean) (img->number != 0), nbits );
  778.     if ( img->number != 0 )
  779.     {
  780.       if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
  781.         updatePparams( prc, complexity );
  782.       else
  783.         generic_RC->NoGranularFieldRC = 0;
  784.     }
  785.     break;
  786.   case RC_MODE_3:
  787.     complexity = updateComplexity( prc, (Boolean) (img->type == P_SLICE), nbits );
  788.     if (img->type == I_SLICE && (img->number != 0))
  789.       generic_RC->NISlice--;
  790.     if ( img->type == P_SLICE )
  791.     {
  792.       if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
  793.       {
  794.         updatePparams( prc, complexity );
  795.         generic_RC->NPSlice--;
  796.       }
  797.       else
  798.         generic_RC->NoGranularFieldRC = 0;
  799.     }
  800.     else if ( img->type == B_SLICE )
  801.     {
  802.       updateBparams( prc, complexity );
  803.       generic_RC->hierNb[ params->HierarchicalCoding ? (generic_RC->temporal_levels - 1 - gop_structure[img->b_frame_to_code-1].hierarchy_layer) : 0 ]--;
  804.     }
  805.     break;
  806.   }   
  807. }
  808. /*!
  809.  *************************************************************************************
  810.  * brief
  811.  *    update the parameters of quadratic R-D model
  812.  *
  813.  *************************************************************************************
  814. */
  815. void updateRCModel (rc_quadratic *prc)
  816. {
  817.   int n_windowSize;
  818.   int i;
  819.   double std = 0.0, threshold;
  820.   int m_Nc = prc->NumberofCodedPFrame;
  821.   Boolean MADModelFlag = FALSE;
  822.   static Boolean m_rgRejected[RC_MODEL_HISTORY];
  823.   static double  error       [RC_MODEL_HISTORY];
  824.   if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
  825.   {
  826.     /*frame layer rate control*/
  827.     if(img->BasicUnit == img->FrameSizeInMbs)
  828.     {
  829.       prc->CurrentFrameMAD = ComputeFrameMAD();
  830.       m_Nc=prc->NumberofCodedPFrame;
  831.     }
  832.     /*basic unit layer rate control*/
  833.     else
  834.     {
  835.       /*compute the MAD of the current basic unit*/
  836.       prc->CurrentFrameMAD = (double) ((generic_RC->TotalMADBasicUnit >> 8)/img->BasicUnit);
  837.       generic_RC->TotalMADBasicUnit=0;
  838.       /* compute the average number of header bits*/
  839.       prc->CodedBasicUnit=prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit;
  840.       if(prc->CodedBasicUnit > 0)
  841.       {
  842.         prc->PAveHeaderBits1=(int)((double)(prc->PAveHeaderBits1*(prc->CodedBasicUnit-1)+
  843.           generic_RC->NumberofBasicUnitHeaderBits)/prc->CodedBasicUnit+0.5);
  844.         if(prc->PAveHeaderBits3 == 0)
  845.           prc->PAveHeaderBits2 = prc->PAveHeaderBits1;
  846.         else
  847.         {
  848.           prc->PAveHeaderBits2 = (int)((double)(prc->PAveHeaderBits1 * prc->CodedBasicUnit+
  849.             prc->PAveHeaderBits3 * prc->NumberofBasicUnit)/prc->TotalNumberofBasicUnit+0.5);
  850.         }
  851.       }
  852.       /*update the record of MADs for reference*/
  853.       if(((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) && (generic_RC->FieldControl == 1))
  854.         prc->FCBUCFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit]=prc->CurrentFrameMAD;
  855.       else
  856.         prc->BUCFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit]=prc->CurrentFrameMAD;
  857.       if(prc->NumberofBasicUnit != 0)
  858.         m_Nc = prc->NumberofCodedPFrame * prc->TotalNumberofBasicUnit + prc->CodedBasicUnit;
  859.       else
  860.         m_Nc = (prc->NumberofCodedPFrame-1) * prc->TotalNumberofBasicUnit + prc->CodedBasicUnit;
  861.     }
  862.     if(m_Nc > 1)
  863.       MADModelFlag=TRUE;
  864.     prc->PPreHeader = generic_RC->NumberofHeaderBits;
  865.     for (i = (RC_MODEL_HISTORY-2); i > 0; i--)
  866.     {// update the history
  867.       prc->Pm_rgQp[i] = prc->Pm_rgQp[i - 1];
  868.       prc->m_rgQp[i]  = prc->Pm_rgQp[i];
  869.       prc->Pm_rgRp[i] = prc->Pm_rgRp[i - 1];
  870.       prc->m_rgRp[i]  = prc->Pm_rgRp[i];
  871.     }
  872.     prc->Pm_rgQp[0] = QP2Qstep(prc->m_Qc); //*1.0/prc->CurrentFrameMAD;
  873.     /*frame layer rate control*/
  874.     if(img->BasicUnit == img->FrameSizeInMbs)
  875.       prc->Pm_rgRp[0] = generic_RC->NumberofTextureBits*1.0/prc->CurrentFrameMAD;
  876.     /*basic unit layer rate control*/
  877.     else
  878.       prc->Pm_rgRp[0] = generic_RC->NumberofBasicUnitTextureBits*1.0/prc->CurrentFrameMAD;
  879.     prc->m_rgQp[0] = prc->Pm_rgQp[0];
  880.     prc->m_rgRp[0] = prc->Pm_rgRp[0];
  881.     prc->m_X1 = prc->Pm_X1;
  882.     prc->m_X2 = prc->Pm_X2;
  883.     /*compute the size of window*/
  884.     n_windowSize = (prc->CurrentFrameMAD>prc->PreviousFrameMAD)
  885.       ? (int)(prc->PreviousFrameMAD/prc->CurrentFrameMAD * (RC_MODEL_HISTORY-1) )
  886.       : (int)(prc->CurrentFrameMAD/prc->PreviousFrameMAD *(RC_MODEL_HISTORY-1));
  887.     n_windowSize=iClip3(1, m_Nc, n_windowSize);
  888.     n_windowSize=imin(n_windowSize,prc->m_windowSize+1);
  889.     n_windowSize=imin(n_windowSize,(RC_MODEL_HISTORY-1));
  890.     /*update the previous window size*/
  891.     prc->m_windowSize=n_windowSize;
  892.     for (i = 0; i < (RC_MODEL_HISTORY-1); i++)
  893.     {
  894.       m_rgRejected[i] = FALSE;
  895.     }
  896.     // initial RD model estimator
  897.     RCModelEstimator (prc, n_windowSize, m_rgRejected);
  898.     n_windowSize = prc->m_windowSize;
  899.     // remove outlier
  900.     for (i = 0; i < (int) n_windowSize; i++)
  901.     {
  902.       error[i] = prc->m_X1 / prc->m_rgQp[i] + prc->m_X2 / (prc->m_rgQp[i] * prc->m_rgQp[i]) - prc->m_rgRp[i];
  903.       std += error[i] * error[i];
  904.     }
  905.     threshold = (n_windowSize == 2) ? 0 : sqrt (std / n_windowSize);
  906.     for (i = 0; i < (int) n_windowSize; i++)
  907.     {
  908.       if (fabs(error[i]) > threshold)
  909.         m_rgRejected[i] = TRUE;
  910.     }
  911.     // always include the last data point
  912.     m_rgRejected[0] = FALSE;
  913.     // second RD model estimator
  914.     RCModelEstimator (prc, n_windowSize, m_rgRejected);
  915.     if( MADModelFlag )
  916.       updateMADModel(prc);
  917.     else if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
  918.       prc->PPictureMAD[0] = prc->CurrentFrameMAD;
  919.   }
  920. }
  921. /*!
  922.  *************************************************************************************
  923.  * brief
  924.  *    Model Estimator
  925.  *
  926.  *************************************************************************************
  927. */
  928. void RCModelEstimator (rc_quadratic *prc, int n_windowSize, Boolean *m_rgRejected)
  929. {
  930.   int n_realSize = n_windowSize;
  931.   int i;
  932.   double oneSampleQ = 0;
  933.   double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
  934.   double MatrixValue;
  935.   Boolean estimateX2 = FALSE;
  936.   for (i = 0; i < n_windowSize; i++)
  937.   {// find the number of samples which are not rejected
  938.     if (m_rgRejected[i])
  939.       n_realSize--;
  940.   }
  941.   // default RD model estimation results
  942.   prc->m_X1 = prc->m_X2 = 0.0;
  943.   for (i = 0; i < n_windowSize; i++)
  944.   {
  945.     if (!m_rgRejected[i])
  946.       oneSampleQ = prc->m_rgQp[i];
  947.   }
  948.   for (i = 0; i < n_windowSize; i++)
  949.   {// if all non-rejected Q are the same, take 1st order model
  950.     if ((prc->m_rgQp[i] != oneSampleQ) && !m_rgRejected[i])
  951.       estimateX2 = TRUE;
  952.     if (!m_rgRejected[i])
  953.       prc->m_X1 += (prc->m_rgQp[i] * prc->m_rgRp[i]) / n_realSize;
  954.   }
  955.   // take 2nd order model to estimate X1 and X2
  956.   if ((n_realSize >= 1) && estimateX2)
  957.   {
  958.     for (i = 0; i < n_windowSize; i++)
  959.     {
  960.       if (!m_rgRejected[i])
  961.       {
  962.         a00  = a00 + 1.0;
  963.         a01 += 1.0 / prc->m_rgQp[i];
  964.         a10  = a01;
  965.         a11 += 1.0 / (prc->m_rgQp[i] * prc->m_rgQp[i]);
  966.         b0  += prc->m_rgQp[i] * prc->m_rgRp[i];
  967.         b1  += prc->m_rgRp[i];
  968.       }
  969.     }
  970.     // solve the equation of AX = B
  971.     MatrixValue=a00*a11-a01*a10;
  972.     if(fabs(MatrixValue) > 0.000001)
  973.     {
  974.       prc->m_X1 = (b0 * a11 - b1 * a01) / MatrixValue;
  975.       prc->m_X2 = (b1 * a00 - b0 * a10) / MatrixValue;
  976.     }
  977.     else
  978.     {
  979.       prc->m_X1 = b0 / a00;
  980.       prc->m_X2 = 0.0;
  981.     }
  982.   }
  983.   if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
  984.   {
  985.     prc->Pm_X1 = prc->m_X1;
  986.     prc->Pm_X2 = prc->m_X2;
  987.   }
  988. }
  989. /*!
  990.  *************************************************************************************
  991.  * brief
  992.  *    update the parameters of linear prediction model
  993.  *
  994.  *************************************************************************************
  995. */
  996. void updateMADModel (rc_quadratic *prc)
  997. {
  998.   int    n_windowSize;
  999.   int    i;
  1000.   double std = 0.0, threshold;
  1001.   int    m_Nc = prc->NumberofCodedPFrame;
  1002.   static Boolean PictureRejected[RC_MODEL_HISTORY];
  1003.   static double  error          [RC_MODEL_HISTORY];
  1004.   if(prc->NumberofCodedPFrame>0)
  1005.   {
  1006.     //assert (img->type!=P_SLICE);
  1007.     /*frame layer rate control*/
  1008.     if(img->BasicUnit == img->FrameSizeInMbs)
  1009.       m_Nc = prc->NumberofCodedPFrame;
  1010.     else // basic unit layer rate control
  1011.       m_Nc=prc->NumberofCodedPFrame*prc->TotalNumberofBasicUnit+prc->CodedBasicUnit;
  1012.     for (i = (RC_MODEL_HISTORY-2); i > 0; i--)
  1013.     {// update the history
  1014.       prc->PPictureMAD[i]  = prc->PPictureMAD[i - 1];
  1015.       prc->PictureMAD[i]   = prc->PPictureMAD[i];
  1016.       prc->ReferenceMAD[i] = prc->ReferenceMAD[i-1];
  1017.     }
  1018.     prc->PPictureMAD[0] = prc->CurrentFrameMAD;
  1019.     prc->PictureMAD[0]  = prc->PPictureMAD[0];
  1020.     if(img->BasicUnit == img->FrameSizeInMbs)
  1021.       prc->ReferenceMAD[0]=prc->PictureMAD[1];
  1022.     else
  1023.     {
  1024.       if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace)) &&(generic_RC->FieldControl==1))
  1025.         prc->ReferenceMAD[0]=prc->FCBUPFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit];
  1026.       else
  1027.         prc->ReferenceMAD[0]=prc->BUPFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit];
  1028.     }
  1029.     prc->MADPictureC1 = prc->PMADPictureC1;
  1030.     prc->MADPictureC2 = prc->PMADPictureC2;
  1031.     /*compute the size of window*/
  1032.     n_windowSize = (prc->CurrentFrameMAD > prc->PreviousFrameMAD)
  1033.       ? (int) ((float)(RC_MODEL_HISTORY-1) * prc->PreviousFrameMAD / prc->CurrentFrameMAD)
  1034.       : (int) ((float)(RC_MODEL_HISTORY-1) * prc->CurrentFrameMAD / prc->PreviousFrameMAD);
  1035.     n_windowSize = iClip3(1, (m_Nc-1), n_windowSize);
  1036.     n_windowSize=imin(n_windowSize, imin(20, prc->MADm_windowSize + 1));
  1037.     /*update the previous window size*/
  1038.     prc->MADm_windowSize=n_windowSize;
  1039.     for (i = 0; i < (RC_MODEL_HISTORY-1); i++)
  1040.     {
  1041.       PictureRejected[i] = FALSE;
  1042.     }
  1043.     //update the MAD for the previous frame
  1044.     if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
  1045.       prc->PreviousFrameMAD=prc->CurrentFrameMAD;
  1046.     // initial MAD model estimator
  1047.     MADModelEstimator (prc, n_windowSize, PictureRejected);
  1048.     // remove outlier
  1049.     for (i = 0; i < n_windowSize; i++)
  1050.     {
  1051.       error[i] = prc->MADPictureC1 * prc->ReferenceMAD[i] + prc->MADPictureC2 - prc->PictureMAD[i];
  1052.       std += (error[i] * error[i]);
  1053.     }
  1054.     threshold = (n_windowSize == 2) ? 0 : sqrt (std / n_windowSize);
  1055.     for (i = 0; i < n_windowSize; i++)
  1056.     {
  1057.       if (fabs(error[i]) > threshold)
  1058.         PictureRejected[i] = TRUE;
  1059.     }
  1060.     // always include the last data point
  1061.     PictureRejected[0] = FALSE;
  1062.     // second MAD model estimator
  1063.     MADModelEstimator (prc, n_windowSize, PictureRejected);
  1064.   }
  1065. }
  1066. /*!
  1067.  *************************************************************************************
  1068.  * brief
  1069.  *    MAD mode estimator
  1070.  *
  1071.  *************************************************************************************
  1072. */
  1073. void MADModelEstimator (rc_quadratic *prc, int n_windowSize, Boolean *PictureRejected)
  1074. {
  1075.   int    n_realSize = n_windowSize;
  1076.   int    i;
  1077.   double oneSampleQ = 0.0;
  1078.   double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
  1079.   double MatrixValue;
  1080.   Boolean estimateX2 = FALSE;
  1081.   for (i = 0; i < n_windowSize; i++)
  1082.   {// find the number of samples which are not rejected
  1083.     if (PictureRejected[i])
  1084.       n_realSize--;
  1085.   }
  1086.   // default MAD model estimation results
  1087.   prc->MADPictureC1 = prc->MADPictureC2 = 0.0;
  1088.   for (i = 0; i < n_windowSize; i++)
  1089.   {
  1090.     if (!PictureRejected[i])
  1091.       oneSampleQ = prc->PictureMAD[i];
  1092.   }
  1093.   for (i = 0; i < n_windowSize; i++)
  1094.   {// if all non-rejected MAD are the same, take 1st order model
  1095.     if ((prc->PictureMAD[i] != oneSampleQ) && !PictureRejected[i])
  1096.       estimateX2 = TRUE;
  1097.     if (!PictureRejected[i])
  1098.       prc->MADPictureC1 += prc->PictureMAD[i] / (prc->ReferenceMAD[i]*n_realSize);
  1099.   }
  1100.   // take 2nd order model to estimate X1 and X2
  1101.   if ((n_realSize >= 1) && estimateX2)
  1102.   {
  1103.     for (i = 0; i < n_windowSize; i++)
  1104.     {
  1105.       if (!PictureRejected[i])
  1106.       {
  1107.         a00  = a00 + 1.0;
  1108.         a01 += prc->ReferenceMAD[i];
  1109.         a10  = a01;
  1110.         a11 += prc->ReferenceMAD[i] * prc->ReferenceMAD[i];
  1111.         b0  += prc->PictureMAD[i];
  1112.         b1  += prc->PictureMAD[i]   * prc->ReferenceMAD[i];
  1113.       }
  1114.     }
  1115.     // solve the equation of AX = B
  1116.     MatrixValue = a00 * a11 - a01 * a10;
  1117.     if(fabs(MatrixValue) > 0.000001)
  1118.     {
  1119.       prc->MADPictureC2 = (b0 * a11 - b1 * a01) / MatrixValue;
  1120.       prc->MADPictureC1 = (b1 * a00 - b0 * a10) / MatrixValue;
  1121.     }
  1122.     else
  1123.     {
  1124.       prc->MADPictureC1 = b0/a01;
  1125.       prc->MADPictureC2 = 0.0;
  1126.     }
  1127.   }
  1128.   if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
  1129.   {
  1130.     prc->PMADPictureC1 = prc->MADPictureC1;
  1131.     prc->PMADPictureC2 = prc->MADPictureC2;
  1132.   }
  1133. }
  1134. /*!
  1135.  *************************************************************************************
  1136.  * brief
  1137.  *    compute a  quantization parameter for each frame (RC_MODE_0)
  1138.  *
  1139.  *************************************************************************************
  1140. */
  1141. int updateQPRC0(rc_quadratic *prc, int topfield)
  1142. {
  1143.   int m_Bits;
  1144.   int BFrameNumber;
  1145.   int StepSize;
  1146.   int SumofBasicUnit;
  1147.   int MaxQpChange, m_Qp, m_Hp;
  1148.   /* frame layer rate control */
  1149.   if( img->BasicUnit == img->FrameSizeInMbs )
  1150.   {
  1151.     /* fixed quantization parameter is used to coded I frame, the first P frame and the first B frame
  1152.     the quantization parameter is adjusted according the available channel bandwidth and
  1153.     the type of video */
  1154.     /*top field*/
  1155.     if((topfield) || (generic_RC->FieldControl==0))
  1156.     {
  1157.       if (img->type==I_SLICE)
  1158.       {
  1159.         prc->m_Qc = prc->MyInitialQp;
  1160.         return prc->m_Qc;
  1161.       }
  1162.       else if(img->type == B_SLICE)
  1163.       {
  1164.         if(params->successive_Bframe==1)
  1165.         {
  1166.           if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1167.             updateQPInterlace( prc );
  1168.           prc->m_Qc = imin(prc->PrevLastQP, prc->CurrLastQP) + 2;
  1169.           prc->m_Qc = imax(prc->m_Qc, imax(prc->PrevLastQP, prc->CurrLastQP));
  1170.           prc->m_Qc = imax(prc->m_Qc, prc->CurrLastQP + 1);
  1171.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1172.         }
  1173.         else
  1174.         {
  1175.           BFrameNumber = (prc->NumberofBFrames + 1) % params->successive_Bframe;
  1176.           if(BFrameNumber==0)
  1177.             BFrameNumber = params->successive_Bframe;
  1178.           /*adaptive field/frame coding*/
  1179.           if(BFrameNumber==1)
  1180.           {
  1181.             if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1182.               updateQPInterlace( prc );
  1183.           }
  1184.           if((prc->CurrLastQP-prc->PrevLastQP)<=(-2*params->successive_Bframe-3))
  1185.             StepSize=-3;
  1186.           else  if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe-2))
  1187.             StepSize=-2;
  1188.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe-1))
  1189.             StepSize=-1;
  1190.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe))
  1191.             StepSize=0;
  1192.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe+1))
  1193.             StepSize=1;
  1194.           else
  1195.             StepSize=2;
  1196.           prc->m_Qc  = prc->PrevLastQP + StepSize;
  1197.           prc->m_Qc += iClip3( -2 * (BFrameNumber - 1), 2*(BFrameNumber-1),
  1198.             (BFrameNumber-1)*(prc->CurrLastQP-prc->PrevLastQP)/(params->successive_Bframe-1));
  1199.           prc->m_Qc  = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1200.         }
  1201.         return prc->m_Qc;
  1202.       }
  1203.       else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
  1204.       {
  1205.         prc->m_Qc=prc->MyInitialQp;
  1206.         if(generic_RC->FieldControl==0)
  1207.           updateQPNonPicAFF( prc );
  1208.         return prc->m_Qc;
  1209.       }
  1210.       else
  1211.       {
  1212.         /*adaptive field/frame coding*/
  1213.         if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
  1214.           updateQPInterlaceBU( prc );
  1215.         prc->m_X1 = prc->Pm_X1;
  1216.         prc->m_X2 = prc->Pm_X2;
  1217.         prc->MADPictureC1 = prc->PMADPictureC1;
  1218.         prc->MADPictureC2 = prc->PMADPictureC2;
  1219.         prc->PreviousPictureMAD = prc->PPictureMAD[0];
  1220.         MaxQpChange = prc->PMaxQpChange;
  1221.         m_Qp = prc->Pm_Qp;
  1222.         m_Hp = prc->PPreHeader;
  1223.         /* predict the MAD of current picture*/
  1224.         prc->CurrentFrameMAD = prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
  1225.         /*compute the number of bits for the texture*/
  1226.         if(prc->Target < 0)
  1227.         {
  1228.           prc->m_Qc=m_Qp+MaxQpChange;
  1229.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1230.         }
  1231.         else
  1232.         {
  1233.           m_Bits = prc->Target-m_Hp;
  1234.           m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
  1235.           updateModelQPFrame( prc, m_Bits );
  1236.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // clipping
  1237.           prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc); // control variation
  1238.         }
  1239.         if( generic_RC->FieldControl == 0 )
  1240.           updateQPNonPicAFF( prc );
  1241.         return prc->m_Qc;
  1242.       }
  1243.     }
  1244.     /*bottom field*/
  1245.     else
  1246.     {
  1247.       if( img->type == P_SLICE && generic_RC->NoGranularFieldRC == 0 )
  1248.         updateBottomField( prc );
  1249.       return prc->m_Qc;
  1250.     }
  1251.   }
  1252.   /*basic unit layer rate control*/
  1253.   else
  1254.   {
  1255.     /*top field of I frame*/
  1256.     if (img->type == I_SLICE)
  1257.     {
  1258.       prc->m_Qc = prc->MyInitialQp;
  1259.       return prc->m_Qc;
  1260.     }
  1261.     else if( img->type == B_SLICE )
  1262.     {
  1263.       /*top field of B frame*/
  1264.       if((topfield)||(generic_RC->FieldControl==0))
  1265.       {
  1266.         if(params->successive_Bframe==1)
  1267.         {
  1268.           /*adaptive field/frame coding*/
  1269.           if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1270.             updateQPInterlace( prc );
  1271.           if(prc->PrevLastQP==prc->CurrLastQP)
  1272.             prc->m_Qc=prc->PrevLastQP+2;
  1273.           else
  1274.             prc->m_Qc=(prc->PrevLastQP+prc->CurrLastQP)/2+1;
  1275.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1276.         }
  1277.         else
  1278.         {
  1279.           BFrameNumber=(prc->NumberofBFrames+1)%params->successive_Bframe;
  1280.           if(BFrameNumber==0)
  1281.             BFrameNumber=params->successive_Bframe;
  1282.           /*adaptive field/frame coding*/
  1283.           if(BFrameNumber==1)
  1284.           {
  1285.             if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1286.               updateQPInterlace( prc );
  1287.           }
  1288.           if((prc->CurrLastQP-prc->PrevLastQP)<=(-2*params->successive_Bframe-3))
  1289.             StepSize=-3;
  1290.           else  if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe-2))
  1291.             StepSize=-2;
  1292.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe-1))
  1293.             StepSize=-1;
  1294.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe))
  1295.             StepSize=0;//0
  1296.           else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->successive_Bframe+1))
  1297.             StepSize=1;//1
  1298.           else
  1299.             StepSize=2;//2
  1300.           prc->m_Qc=prc->PrevLastQP+StepSize;
  1301.           prc->m_Qc +=
  1302.             iClip3( -2*(BFrameNumber-1), 2*(BFrameNumber-1), (BFrameNumber-1)*(prc->CurrLastQP-prc->PrevLastQP)/(params->successive_Bframe-1) );
  1303.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1304.         }
  1305.         return prc->m_Qc;
  1306.       }
  1307.       /*bottom field of B frame*/
  1308.       else
  1309.       {
  1310.         return prc->m_Qc;
  1311.       }
  1312.     }
  1313.     else if( img->type == P_SLICE )
  1314.     {
  1315.       if( (generic_RC->NumberofGOP == 1) && (prc->NumberofPPicture == 0) )
  1316.       {
  1317.         if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
  1318.           return updateFirstP( prc, topfield );
  1319.       }
  1320.       else
  1321.       {
  1322.         prc->m_X1=prc->Pm_X1;
  1323.         prc->m_X2=prc->Pm_X2;
  1324.         prc->MADPictureC1=prc->PMADPictureC1;
  1325.         prc->MADPictureC2=prc->PMADPictureC2;
  1326.         m_Qp=prc->Pm_Qp;
  1327.         if(generic_RC->FieldControl==0)
  1328.           SumofBasicUnit=prc->TotalNumberofBasicUnit;
  1329.         else
  1330.           SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
  1331.         /*the average QP of the previous frame is used to coded the first basic unit of the current frame or field*/
  1332.         if(prc->NumberofBasicUnit==SumofBasicUnit)
  1333.           return updateFirstBU( prc, topfield );
  1334.         else
  1335.         {
  1336.           /*compute the number of remaining bits*/
  1337.           prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
  1338.           generic_RC->NumberofBasicUnitHeaderBits  = 0;
  1339.           generic_RC->NumberofBasicUnitTextureBits = 0;
  1340.           if(prc->Target<0)
  1341.             return updateNegativeTarget( prc, topfield, m_Qp );
  1342.           else
  1343.           {
  1344.             /*predict the MAD of current picture*/
  1345.             predictCurrPicMAD( prc );
  1346.             /*compute the total number of bits for the current basic unit*/
  1347.             updateModelQPBU( prc, topfield, m_Qp );
  1348.             prc->TotalFrameQP +=prc->m_Qc;
  1349.             prc->Pm_Qp=prc->m_Qc;
  1350.             prc->NumberofBasicUnit--;
  1351.             if( prc->NumberofBasicUnit == 0 && img->type == P_SLICE )
  1352.               updateLastBU( prc, topfield );
  1353.             return prc->m_Qc;
  1354.           }
  1355.         }
  1356.       }
  1357.     }
  1358.   }
  1359.   return prc->m_Qc;
  1360. }
  1361. /*!
  1362.  *************************************************************************************
  1363.  * brief
  1364.  *    compute a  quantization parameter for each frame
  1365.  *
  1366.  *************************************************************************************
  1367. */
  1368. int updateQPRC1(rc_quadratic *prc, int topfield)
  1369. {
  1370.   int m_Bits;
  1371.   int SumofBasicUnit;
  1372.   int MaxQpChange, m_Qp, m_Hp;
  1373.   /* frame layer rate control */
  1374.   if( img->BasicUnit == img->FrameSizeInMbs )
  1375.   {
  1376.     /* fixed quantization parameter is used to coded I frame, the first P frame and the first B frame
  1377.     the quantization parameter is adjusted according the available channel bandwidth and
  1378.     the type of vide */
  1379.     /*top field*/
  1380.     if((topfield) || (generic_RC->FieldControl==0))
  1381.     {
  1382.       if (img->number == 0)
  1383.       {
  1384.         prc->m_Qc = prc->MyInitialQp;
  1385.         return prc->m_Qc;
  1386.       }
  1387.       else if( prc->NumberofPPicture == 0 && (img->number != 0))
  1388.       {
  1389.         prc->m_Qc=prc->MyInitialQp;
  1390.         if(generic_RC->FieldControl==0)
  1391.           updateQPNonPicAFF( prc );
  1392.         return prc->m_Qc;
  1393.       }
  1394.       else
  1395.       {
  1396.         /*adaptive field/frame coding*/
  1397.         if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
  1398.           updateQPInterlaceBU( prc );
  1399.         prc->m_X1 = prc->Pm_X1;
  1400.         prc->m_X2 = prc->Pm_X2;
  1401.         prc->MADPictureC1 = prc->PMADPictureC1;
  1402.         prc->MADPictureC2 = prc->PMADPictureC2;
  1403.         prc->PreviousPictureMAD = prc->PPictureMAD[0];
  1404.         MaxQpChange = prc->PMaxQpChange;
  1405.         m_Qp = prc->Pm_Qp;
  1406.         m_Hp = prc->PPreHeader;
  1407.         /* predict the MAD of current picture*/
  1408.         prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
  1409.         /*compute the number of bits for the texture*/
  1410.         if(prc->Target < 0)
  1411.         {
  1412.           prc->m_Qc=m_Qp+MaxQpChange;
  1413.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1414.         }
  1415.         else
  1416.         {
  1417.           m_Bits = prc->Target-m_Hp;
  1418.           m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
  1419.           updateModelQPFrame( prc, m_Bits );
  1420.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // clipping
  1421.           prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc); // control variation
  1422.         }
  1423.         if( generic_RC->FieldControl == 0 )
  1424.           updateQPNonPicAFF( prc );
  1425.         return prc->m_Qc;
  1426.       }
  1427.     }
  1428.     /*bottom field*/
  1429.     else
  1430.     {
  1431.       if( generic_RC->NoGranularFieldRC == 0 )
  1432.         updateBottomField( prc );
  1433.       return prc->m_Qc;
  1434.     }
  1435.   }
  1436.   /*basic unit layer rate control*/
  1437.   else
  1438.   {
  1439.     /*top field of I frame*/
  1440.     if (img->number == 0)
  1441.     {
  1442.       prc->m_Qc = prc->MyInitialQp;
  1443.       return prc->m_Qc;
  1444.     }
  1445.     else
  1446.     {
  1447.       if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
  1448.       {
  1449.         if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
  1450.           return updateFirstP( prc, topfield );
  1451.       }
  1452.       else
  1453.       {
  1454.         prc->m_X1=prc->Pm_X1;
  1455.         prc->m_X2=prc->Pm_X2;
  1456.         prc->MADPictureC1=prc->PMADPictureC1;
  1457.         prc->MADPictureC2=prc->PMADPictureC2;
  1458.         m_Qp=prc->Pm_Qp;
  1459.         if(generic_RC->FieldControl==0)
  1460.           SumofBasicUnit=prc->TotalNumberofBasicUnit;
  1461.         else
  1462.           SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
  1463.         /*the average QP of the previous frame is used to coded the first basic unit of the current frame or field*/
  1464.         if(prc->NumberofBasicUnit==SumofBasicUnit)
  1465.           return updateFirstBU( prc, topfield );
  1466.         else
  1467.         {
  1468.           /*compute the number of remaining bits*/
  1469.           prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
  1470.           generic_RC->NumberofBasicUnitHeaderBits  = 0;
  1471.           generic_RC->NumberofBasicUnitTextureBits = 0;
  1472.           if(prc->Target<0)
  1473.             return updateNegativeTarget( prc, topfield, m_Qp );
  1474.           else
  1475.           {
  1476.             /*predict the MAD of current picture*/
  1477.             predictCurrPicMAD( prc );
  1478.             /*compute the total number of bits for the current basic unit*/
  1479.             updateModelQPBU( prc, topfield, m_Qp );
  1480.             prc->TotalFrameQP +=prc->m_Qc;
  1481.             prc->Pm_Qp=prc->m_Qc;
  1482.             prc->NumberofBasicUnit--;
  1483.             if((prc->NumberofBasicUnit==0) && (img->number != 0))
  1484.               updateLastBU( prc, topfield );
  1485.             return prc->m_Qc;
  1486.           }
  1487.         }
  1488.       }
  1489.     }
  1490.   }
  1491.   return prc->m_Qc;
  1492. }
  1493. /*!
  1494.  *************************************************************************************
  1495.  * brief
  1496.  *    compute a  quantization parameter for each frame
  1497.  *
  1498.  *************************************************************************************
  1499. */
  1500. int updateQPRC2(rc_quadratic *prc, int topfield)
  1501. {
  1502.   int m_Bits;
  1503.   int SumofBasicUnit;
  1504.   int MaxQpChange, m_Qp, m_Hp;
  1505.   /* frame layer rate control */
  1506.   if( img->BasicUnit == img->FrameSizeInMbs )
  1507.   {
  1508.     /* fixed quantization parameter is used to coded I frame, the first P frame and the first B frame
  1509.     the quantization parameter is adjusted according the available channel bandwidth and
  1510.     the type of vide */
  1511.     /*top field*/
  1512.     if((topfield) || (generic_RC->FieldControl==0))
  1513.     {
  1514.       if (img->number == 0)
  1515.       {
  1516.         prc->m_Qc = prc->MyInitialQp;
  1517.         return prc->m_Qc;
  1518.       }
  1519.       else if (img->type==I_SLICE)
  1520.       {
  1521.         if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1522.           updateQPInterlace( prc );
  1523.         prc->m_Qc = prc->CurrLastQP; // Set QP to average qp of last P frame
  1524.         return prc->m_Qc;
  1525.       }
  1526.       else if(img->type == B_SLICE)
  1527.       {
  1528.         int prevQP = imax(prc->PrevLastQP, prc->CurrLastQP);
  1529.         // for more than one consecutive B frames the below call will overwrite the old anchor frame QP with the current value
  1530.         // it should be called once in the B-frame sequence....this should be modified for the BU < frame as well
  1531.         if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1532.           updateQPInterlace( prc );
  1533.         if (params->HierarchicalCoding)
  1534.         {
  1535.           if (img->b_frame_to_code == 0)
  1536.             prc->m_Qc = prevQP;
  1537.           else
  1538.             prc->m_Qc = prevQP + img->GopLevels - gop_structure[img->b_frame_to_code-1].hierarchy_layer;
  1539.         }
  1540.         else
  1541.           prc->m_Qc = prevQP + 2 - img->nal_reference_idc;
  1542.         prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1543.         return prc->m_Qc;
  1544.       }
  1545.       else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
  1546.       {
  1547.         prc->m_Qc=prc->MyInitialQp;
  1548.         if(generic_RC->FieldControl==0)
  1549.           updateQPNonPicAFF( prc );
  1550.         return prc->m_Qc;
  1551.       }
  1552.       else
  1553.       {
  1554.         /*adaptive field/frame coding*/
  1555.         if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
  1556.           updateQPInterlaceBU( prc );
  1557.         prc->m_X1 = prc->Pm_X1;
  1558.         prc->m_X2 = prc->Pm_X2;
  1559.         prc->MADPictureC1 = prc->PMADPictureC1;
  1560.         prc->MADPictureC2 = prc->PMADPictureC2;
  1561.         prc->PreviousPictureMAD = prc->PPictureMAD[0];
  1562.         MaxQpChange = prc->PMaxQpChange;
  1563.         m_Qp = prc->Pm_Qp;
  1564.         m_Hp = prc->PPreHeader;
  1565.         /* predict the MAD of current picture*/
  1566.         prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
  1567.         /*compute the number of bits for the texture*/
  1568.         if(prc->Target < 0)
  1569.         {
  1570.           prc->m_Qc=m_Qp+MaxQpChange;
  1571.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1572.         }
  1573.         else
  1574.         {
  1575.           m_Bits = prc->Target-m_Hp;
  1576.           m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
  1577.           updateModelQPFrame( prc, m_Bits );
  1578.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // clipping
  1579.           prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc); // control variation
  1580.         }
  1581.         if( generic_RC->FieldControl == 0 )
  1582.           updateQPNonPicAFF( prc );
  1583.         return prc->m_Qc;
  1584.       }
  1585.     }
  1586.     /*bottom field*/
  1587.     else
  1588.     {
  1589.       if( img->type==P_SLICE && generic_RC->NoGranularFieldRC == 0 )
  1590.         updateBottomField( prc );
  1591.       return prc->m_Qc;
  1592.     }
  1593.   }
  1594.   /*basic unit layer rate control*/
  1595.   else
  1596.   {
  1597.     /*top field of I frame*/
  1598.     if (img->number == 0)
  1599.     {
  1600.       prc->m_Qc = prc->MyInitialQp;
  1601.       return prc->m_Qc;
  1602.     }
  1603.     else if (img->type==I_SLICE)
  1604.     {
  1605.       /*adaptive field/frame coding*/
  1606.       if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1607.         updateQPInterlace( prc );
  1608.       prc->m_Qc = prc->PrevLastQP; // Set QP to average qp of last P frame
  1609.       prc->PrevLastQP = prc->CurrLastQP;
  1610.       prc->CurrLastQP = prc->PrevLastQP;
  1611.       prc->PAveFrameQP = prc->CurrLastQP;
  1612.       return prc->m_Qc;
  1613.     }
  1614.     else if(img->type == B_SLICE)
  1615.     {
  1616.       int prevQP = imax(prc->PrevLastQP, prc->CurrLastQP);
  1617.       if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1618.         updateQPInterlace( prc );
  1619.       if (params->HierarchicalCoding)
  1620.       {
  1621.         if (img->b_frame_to_code == 0)
  1622.           prc->m_Qc = prevQP;
  1623.         else
  1624.           prc->m_Qc = prevQP + img->GopLevels - gop_structure[img->b_frame_to_code-1].hierarchy_layer;
  1625.       }
  1626.       else
  1627.         prc->m_Qc = prevQP + 2 - img->nal_reference_idc;
  1628.       prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1629.       return prc->m_Qc;
  1630.     }
  1631.     else if( img->type == P_SLICE )
  1632.     {
  1633.       if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
  1634.       {
  1635.         if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
  1636.           return updateFirstP( prc, topfield );
  1637.       }
  1638.       else
  1639.       {
  1640.         prc->m_X1=prc->Pm_X1;
  1641.         prc->m_X2=prc->Pm_X2;
  1642.         prc->MADPictureC1=prc->PMADPictureC1;
  1643.         prc->MADPictureC2=prc->PMADPictureC2;
  1644.         m_Qp=prc->Pm_Qp;
  1645.         if(generic_RC->FieldControl==0)
  1646.           SumofBasicUnit=prc->TotalNumberofBasicUnit;
  1647.         else
  1648.           SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
  1649.         /*the average QP of the previous frame is used to coded the first basic unit of the current frame or field*/
  1650.         if(prc->NumberofBasicUnit==SumofBasicUnit)
  1651.           return updateFirstBU( prc, topfield );
  1652.         else
  1653.         {
  1654.           /*compute the number of remaining bits*/
  1655.           prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
  1656.           generic_RC->NumberofBasicUnitHeaderBits  = 0;
  1657.           generic_RC->NumberofBasicUnitTextureBits = 0;
  1658.           if(prc->Target<0)
  1659.             return updateNegativeTarget( prc, topfield, m_Qp );
  1660.           else
  1661.           {
  1662.             /*predict the MAD of current picture*/
  1663.             predictCurrPicMAD( prc );
  1664.             /*compute the total number of bits for the current basic unit*/
  1665.             updateModelQPBU( prc, topfield, m_Qp );
  1666.             prc->TotalFrameQP +=prc->m_Qc;
  1667.             prc->Pm_Qp=prc->m_Qc;
  1668.             prc->NumberofBasicUnit--;
  1669.             if((prc->NumberofBasicUnit==0) && img->type == P_SLICE )
  1670.               updateLastBU( prc, topfield );
  1671.             return prc->m_Qc;
  1672.           }
  1673.         }
  1674.       }
  1675.     }
  1676.   }
  1677.   return prc->m_Qc;
  1678. }
  1679. /*!
  1680.  *************************************************************************************
  1681.  * brief
  1682.  *    compute a  quantization parameter for each frame
  1683.  *
  1684.  *************************************************************************************
  1685. */
  1686. int updateQPRC3(rc_quadratic *prc, int topfield)
  1687. {
  1688.   int m_Bits;
  1689.   int SumofBasicUnit;
  1690.   int MaxQpChange, m_Qp, m_Hp;
  1691.   /* frame layer rate control */
  1692.   if( img->BasicUnit == img->FrameSizeInMbs || img->type != P_SLICE )
  1693.   {
  1694.     /* fixed quantization parameter is used to coded I frame, the first P frame and the first B frame
  1695.     the quantization parameter is adjusted according the available channel bandwidth and
  1696.     the type of video */
  1697.     /*top field*/
  1698.     if((topfield) || (generic_RC->FieldControl==0))
  1699.     {
  1700.       if (img->number == 0)
  1701.       {
  1702.         if((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace))
  1703.           updateQPInterlace( prc );
  1704.         prc->m_Qc = prc->MyInitialQp;
  1705.         return prc->m_Qc;
  1706.       }
  1707.       else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
  1708.       {
  1709.         prc->m_Qc=prc->MyInitialQp;
  1710.         if(generic_RC->FieldControl==0)
  1711.           updateQPNonPicAFF( prc );
  1712.         return prc->m_Qc;
  1713.       }
  1714.       else
  1715.       {
  1716.         if( ( (img->type == B_SLICE && img->b_frame_to_code == 1) || img->type == I_SLICE) && ((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) )
  1717.           updateQPInterlace( prc );
  1718.         /*adaptive field/frame coding*/
  1719.         if( img->type == P_SLICE && ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
  1720.           updateQPInterlaceBU( prc );
  1721.         prc->m_X1 = prc->Pm_X1;
  1722.         prc->m_X2 = prc->Pm_X2;
  1723.         prc->MADPictureC1 = prc->PMADPictureC1;
  1724.         prc->MADPictureC2 = prc->PMADPictureC2;
  1725.         prc->PreviousPictureMAD = prc->PPictureMAD[0];
  1726.         MaxQpChange = prc->PMaxQpChange;
  1727.         m_Qp = prc->Pm_Qp;
  1728.         m_Hp = prc->PPreHeader;
  1729.         if ( img->BasicUnit < img->FrameSizeInMbs && img->type != P_SLICE )
  1730.         {
  1731.           // when RC_MODE_3 is set and basic unit is smaller than a frame, note that:
  1732.           // the linear MAD model and the quadratic QP model operate on small units and not on a whole frame;
  1733.           // we therefore have to account for this
  1734.           prc->PreviousPictureMAD = prc->PreviousWholeFrameMAD;
  1735.         }
  1736.         if ( img->type == I_SLICE )
  1737.           m_Hp = 0; // it is usually a very small portion of the total I_SLICE bit budget
  1738.         /* predict the MAD of current picture*/
  1739.         prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
  1740.         /*compute the number of bits for the texture*/
  1741.         if(prc->Target < 0)
  1742.         {
  1743.           prc->m_Qc=m_Qp+MaxQpChange;
  1744.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // Clipping
  1745.         }
  1746.         else
  1747.         {
  1748.           if ( img->type != P_SLICE )
  1749.           {
  1750.             if ( img->BasicUnit < img->FrameSizeInMbs )
  1751.               m_Bits =(prc->Target-m_Hp)/prc->TotalNumberofBasicUnit;
  1752.             else
  1753.               m_Bits =prc->Target-m_Hp;
  1754.           }
  1755.           else {
  1756.             m_Bits = prc->Target-m_Hp;
  1757.             m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
  1758.           }          
  1759.           updateModelQPFrame( prc, m_Bits );
  1760.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // clipping
  1761.           if ( img->type == P_SLICE )
  1762.             prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc); // control variation
  1763.         }
  1764.         if( img->type == P_SLICE && generic_RC->FieldControl == 0 )
  1765.           updateQPNonPicAFF( prc );
  1766.         if ( img->type == B_SLICE )
  1767.         {
  1768.           // hierarchical adjustment
  1769.           int prevqp = ((prc->PrevLastQP+prc->CurrLastQP) >> 1) + 1;
  1770.           if ( params->HierarchicalCoding && img->b_frame_to_code)
  1771.             prc->m_Qc -= gop_structure[img->b_frame_to_code-1].hierarchy_layer;
  1772.           // check bounds
  1773.           prc->m_Qc = iClip3(prevqp - (params->HierarchicalCoding ? 0 : 5), prevqp + 5, prc->m_Qc); // control variation
  1774.           prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc); // clipping
  1775.         }
  1776.         return prc->m_Qc;
  1777.       }
  1778.     }
  1779.     /*bottom field*/
  1780.     else
  1781.     {
  1782.       if( img->type==P_SLICE && generic_RC->NoGranularFieldRC == 0 )
  1783.         updateBottomField( prc );
  1784.       return prc->m_Qc;
  1785.     }
  1786.   }
  1787.   /*basic unit layer rate control*/
  1788.   else
  1789.   {
  1790.     /*top field of I frame*/
  1791.     if (img->number == 0)
  1792.     {
  1793.       if((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace))
  1794.         updateQPInterlace( prc );
  1795.       prc->m_Qc = prc->MyInitialQp;
  1796.       return prc->m_Qc;
  1797.     }
  1798.     else if( img->type == P_SLICE )
  1799.     {
  1800.       if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
  1801.       {
  1802.         if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
  1803.           return updateFirstP( prc, topfield );
  1804.       }
  1805.       else
  1806.       {
  1807.         if( ( (img->type == B_SLICE && img->b_frame_to_code == 1) || img->type == I_SLICE) && ((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) )
  1808.           updateQPInterlace( prc );
  1809.         prc->m_X1=prc->Pm_X1;
  1810.         prc->m_X2=prc->Pm_X2;
  1811.         prc->MADPictureC1=prc->PMADPictureC1;
  1812.         prc->MADPictureC2=prc->PMADPictureC2;
  1813.         m_Qp=prc->Pm_Qp;
  1814.         if(generic_RC->FieldControl==0)
  1815.           SumofBasicUnit=prc->TotalNumberofBasicUnit;
  1816.         else
  1817.           SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
  1818.         /*the average QP of the previous frame is used to coded the first basic unit of the current frame or field*/
  1819.         if(prc->NumberofBasicUnit==SumofBasicUnit)
  1820.           return updateFirstBU( prc, topfield );
  1821.         else
  1822.         {
  1823.           /*compute the number of remaining bits*/
  1824.           prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
  1825.           generic_RC->NumberofBasicUnitHeaderBits  = 0;
  1826.           generic_RC->NumberofBasicUnitTextureBits = 0;
  1827.           if(prc->Target<0)
  1828.             return updateNegativeTarget( prc, topfield, m_Qp );
  1829.           else
  1830.           {
  1831.             /*predict the MAD of current picture*/
  1832.             predictCurrPicMAD( prc );
  1833.             /*compute the total number of bits for the current basic unit*/
  1834.             updateModelQPBU( prc, topfield, m_Qp );
  1835.             prc->TotalFrameQP +=prc->m_Qc;
  1836.             prc->Pm_Qp=prc->m_Qc;
  1837.             prc->NumberofBasicUnit--;
  1838.             if((prc->NumberofBasicUnit==0) && img->type == P_SLICE )
  1839.               updateLastBU( prc, topfield );
  1840.             return prc->m_Qc;
  1841.           }
  1842.         }
  1843.       }
  1844.     }
  1845.   }
  1846.   return prc->m_Qc;
  1847. }
  1848. /*!
  1849.  *************************************************************************************
  1850.  * brief
  1851.  *    Save previous QP values for interlaced coding
  1852.  *
  1853.  *************************************************************************************
  1854. */
  1855. void updateQPInterlace( rc_quadratic *prc )
  1856. {
  1857.   if(generic_RC->FieldControl==0)
  1858.   {
  1859.     /*previous choice is frame coding*/
  1860.     if(generic_RC->FieldFrame==1)
  1861.     {
  1862.       prc->PrevLastQP=prc->CurrLastQP;
  1863.       prc->CurrLastQP=prc->FrameQPBuffer;
  1864.     }
  1865.     /*previous choice is field coding*/
  1866.     else
  1867.     {
  1868.       prc->PrevLastQP=prc->CurrLastQP;
  1869.       prc->CurrLastQP=prc->FieldQPBuffer;
  1870.     }
  1871.   }
  1872. }
  1873. /*!
  1874.  *************************************************************************************
  1875.  * brief
  1876.  *    Save previous QP values for the case of non-PicAFF
  1877.  *
  1878.  *************************************************************************************
  1879. */
  1880. void updateQPNonPicAFF( rc_quadratic *prc )
  1881. {
  1882.   if(active_sps->frame_mbs_only_flag)
  1883.   {
  1884.     prc->TotalQpforPPicture +=prc->m_Qc;
  1885.     prc->PrevLastQP=prc->CurrLastQP;
  1886.     prc->CurrLastQP=prc->m_Qc;
  1887.     prc->Pm_Qp=prc->m_Qc;
  1888.   }
  1889.   /*adaptive field/frame coding*/
  1890.   else
  1891.     prc->FrameQPBuffer=prc->m_Qc;
  1892. }
  1893. /*!
  1894.  *************************************************************************************
  1895.  * brief
  1896.  *    Update QP values for bottom filed in field coding
  1897.  *************************************************************************************
  1898. */
  1899. void updateBottomField( rc_quadratic *prc )
  1900. {
  1901.   /*field coding*/
  1902.   if(params->PicInterlace==FIELD_CODING)
  1903.   {
  1904.     prc->TotalQpforPPicture +=prc->m_Qc;
  1905.     prc->PrevLastQP=prc->CurrLastQP+1;
  1906.     prc->CurrLastQP=prc->m_Qc;//+0 Recent change 13/1/2003
  1907.     prc->Pm_Qp=prc->m_Qc;
  1908.   }
  1909.   /*adaptive field/frame coding*/
  1910.   else
  1911.     prc->FieldQPBuffer=prc->m_Qc;
  1912. }
  1913. /*!
  1914.  *************************************************************************************
  1915.  * brief
  1916.  *    update QP variables for P frames
  1917.  *************************************************************************************
  1918. */
  1919. int updateFirstP( rc_quadratic *prc, int topfield )
  1920. {
  1921.   /*top field of the first P frame*/
  1922.   prc->m_Qc=prc->MyInitialQp;
  1923.   generic_RC->NumberofBasicUnitHeaderBits=0;
  1924.   generic_RC->NumberofBasicUnitTextureBits=0;
  1925.   prc->NumberofBasicUnit--;
  1926.   /*bottom field of the first P frame*/
  1927.   if((!topfield)&&(prc->NumberofBasicUnit==0))
  1928.   {
  1929.     /*frame coding or field coding*/
  1930.     if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
  1931.     {
  1932.       prc->TotalQpforPPicture +=prc->m_Qc;
  1933.       prc->PrevLastQP=prc->CurrLastQP;
  1934.       prc->CurrLastQP=prc->m_Qc;
  1935.       prc->PAveFrameQP=prc->m_Qc;
  1936.       prc->PAveHeaderBits3=prc->PAveHeaderBits2;
  1937.     }
  1938.     /*adaptive frame/field coding*/
  1939.     else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  1940.     {
  1941.       if(generic_RC->FieldControl==0)
  1942.       {
  1943.         prc->FrameQPBuffer=prc->m_Qc;
  1944.         prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
  1945.       }
  1946.       else
  1947.       {
  1948.         prc->FieldQPBuffer=prc->m_Qc;
  1949.         prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
  1950.       }
  1951.     }
  1952.   }
  1953.   prc->Pm_Qp=prc->m_Qc;
  1954.   prc->TotalFrameQP +=prc->m_Qc;
  1955.   return prc->m_Qc;
  1956. }
  1957. /*!
  1958.  *************************************************************************************
  1959.  * brief
  1960.  *    update QP when bit target is negative
  1961.  *************************************************************************************
  1962. */
  1963. int updateNegativeTarget( rc_quadratic *prc, int topfield, int m_Qp )
  1964. {
  1965.   int PAverageQP;
  1966.   if(prc->GOPOverdue==TRUE)
  1967.     prc->m_Qc=m_Qp+2;
  1968.   else
  1969.     prc->m_Qc=m_Qp+prc->DDquant;//2
  1970.   prc->m_Qc = imin(prc->m_Qc, img->RCMaxQP);  // clipping
  1971.   if(params->basicunit>=prc->MBPerRow)
  1972.     prc->m_Qc = imin(prc->m_Qc, prc->PAveFrameQP + 6);
  1973.   else
  1974.     prc->m_Qc = imin(prc->m_Qc, prc->PAveFrameQP + 3);
  1975.   prc->TotalFrameQP +=prc->m_Qc;
  1976.   prc->NumberofBasicUnit--;
  1977.   if(prc->NumberofBasicUnit==0)
  1978.   {
  1979.     if((!topfield)||(generic_RC->FieldControl==0))
  1980.     {
  1981.       /*frame coding or field coding*/
  1982.       if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
  1983.       {
  1984.         PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
  1985.         if (prc->NumberofPPicture == (params->intra_period - 2))
  1986.           prc->QPLastPFrame = PAverageQP;
  1987.         prc->TotalQpforPPicture +=PAverageQP;
  1988.         if(prc->GOPOverdue==TRUE)
  1989.         {
  1990.           prc->PrevLastQP=prc->CurrLastQP+1;
  1991.           prc->CurrLastQP=PAverageQP;
  1992.         }
  1993.         else
  1994.         {
  1995.           if((prc->NumberofPPicture==0)&&(generic_RC->NumberofGOP>1))
  1996.           {
  1997.             prc->PrevLastQP=prc->CurrLastQP;
  1998.             prc->CurrLastQP=PAverageQP;
  1999.           }
  2000.           else if(prc->NumberofPPicture>0)
  2001.           {
  2002.             prc->PrevLastQP=prc->CurrLastQP+1;
  2003.             prc->CurrLastQP=PAverageQP;
  2004.           }
  2005.         }
  2006.         prc->PAveFrameQP=PAverageQP;
  2007.         prc->PAveHeaderBits3=prc->PAveHeaderBits2;
  2008.       }
  2009.       /*adaptive field/frame coding*/
  2010.       else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  2011.       {
  2012.         if(generic_RC->FieldControl==0)
  2013.         {
  2014.           PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
  2015.           prc->FrameQPBuffer=PAverageQP;
  2016.           prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
  2017.         }
  2018.         else
  2019.         {
  2020.           PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
  2021.           prc->FieldQPBuffer=PAverageQP;
  2022.           prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
  2023.         }
  2024.       }
  2025.     }
  2026.   }
  2027.   if(prc->GOPOverdue==TRUE)
  2028.     prc->Pm_Qp=prc->PAveFrameQP;
  2029.   else
  2030.     prc->Pm_Qp=prc->m_Qc;
  2031.   return prc->m_Qc;
  2032. }
  2033. /*!
  2034.  *************************************************************************************
  2035.  * brief
  2036.  *    update QP for the first Basic Unit in the picture
  2037.  *************************************************************************************
  2038. */
  2039. int updateFirstBU( rc_quadratic *prc, int topfield )
  2040. {
  2041.   /*adaptive field/frame coding*/
  2042.   if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==0))
  2043.   {
  2044.     /*previous choice is frame coding*/
  2045.     if(generic_RC->FieldFrame==1)
  2046.     {
  2047.       if(prc->NumberofPPicture>0)
  2048.         prc->TotalQpforPPicture +=prc->FrameQPBuffer;
  2049.       prc->PAveFrameQP=prc->FrameQPBuffer;
  2050.       prc->PAveHeaderBits3=prc->FrameAveHeaderBits;
  2051.     }
  2052.     /*previous choice is field coding*/
  2053.     else
  2054.     {
  2055.       if(prc->NumberofPPicture>0)
  2056.         prc->TotalQpforPPicture +=prc->FieldQPBuffer;
  2057.       prc->PAveFrameQP=prc->FieldQPBuffer;
  2058.       prc->PAveHeaderBits3=prc->FieldAveHeaderBits;
  2059.     }
  2060.   }
  2061.   if(prc->Target<=0)
  2062.   {
  2063.     prc->m_Qc = prc->PAveFrameQP + 2;
  2064.     if(prc->m_Qc > img->RCMaxQP)
  2065.       prc->m_Qc = img->RCMaxQP;
  2066.     if(topfield||(generic_RC->FieldControl==0))
  2067.       prc->GOPOverdue=TRUE;
  2068.   }
  2069.   else
  2070.   {
  2071.     prc->m_Qc=prc->PAveFrameQP;
  2072.   }
  2073.   prc->TotalFrameQP +=prc->m_Qc;
  2074.   prc->NumberofBasicUnit--;
  2075.   prc->Pm_Qp = prc->PAveFrameQP;
  2076.   return prc->m_Qc;
  2077. }
  2078. /*!
  2079.  *************************************************************************************
  2080.  * brief
  2081.  *    update QP for the last Basic Unit in the picture
  2082.  *************************************************************************************
  2083. */
  2084. void updateLastBU( rc_quadratic *prc, int topfield )
  2085. {
  2086.   int PAverageQP;
  2087.   if((!topfield)||(generic_RC->FieldControl==0))
  2088.   {
  2089.     /*frame coding or field coding*/
  2090.     if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
  2091.     {
  2092.       PAverageQP=(int)((double)prc->TotalFrameQP/(double) prc->TotalNumberofBasicUnit+0.5);
  2093.       if (prc->NumberofPPicture == (params->intra_period - 2))
  2094.         prc->QPLastPFrame = PAverageQP;
  2095.       prc->TotalQpforPPicture +=PAverageQP;
  2096.       prc->PrevLastQP=prc->CurrLastQP;
  2097.       prc->CurrLastQP=PAverageQP;
  2098.       prc->PAveFrameQP=PAverageQP;
  2099.       prc->PAveHeaderBits3=prc->PAveHeaderBits2;
  2100.     }
  2101.     else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
  2102.     {
  2103.       if(generic_RC->FieldControl==0)
  2104.       {
  2105.         PAverageQP=(int)((double) prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
  2106.         prc->FrameQPBuffer=PAverageQP;
  2107.         prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
  2108.       }
  2109.       else
  2110.       {
  2111.         PAverageQP=(int)((double) prc->TotalFrameQP/(double) prc->TotalNumberofBasicUnit+0.5);
  2112.         prc->FieldQPBuffer=PAverageQP;
  2113.         prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
  2114.       }
  2115.     }
  2116.   }
  2117. }
  2118. /*!
  2119.  *************************************************************************************
  2120.  * brief
  2121.  *    update current picture MAD
  2122.  *************************************************************************************
  2123. */
  2124. void predictCurrPicMAD( rc_quadratic *prc )
  2125. {
  2126.   int i;
  2127.   if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==1))
  2128.   {
  2129.     prc->CurrentFrameMAD=prc->MADPictureC1*prc->FCBUPFMAD[prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit]+prc->MADPictureC2;
  2130.     prc->TotalBUMAD=0;
  2131.     for(i=prc->TotalNumberofBasicUnit-1; i>=(prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit);i--)
  2132.     {
  2133.       prc->CurrentBUMAD=prc->MADPictureC1*prc->FCBUPFMAD[i]+prc->MADPictureC2;
  2134.       prc->TotalBUMAD +=prc->CurrentBUMAD*prc->CurrentBUMAD;
  2135.     }
  2136.   }
  2137.   else
  2138.   {
  2139.     prc->CurrentFrameMAD=prc->MADPictureC1*prc->BUPFMAD[prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit]+prc->MADPictureC2;
  2140.     prc->TotalBUMAD=0;
  2141.     for(i=prc->TotalNumberofBasicUnit-1; i>=(prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit);i--)
  2142.     {
  2143.       prc->CurrentBUMAD=prc->MADPictureC1*prc->BUPFMAD[i]+prc->MADPictureC2;
  2144.       prc->TotalBUMAD +=prc->CurrentBUMAD*prc->CurrentBUMAD;
  2145.     }
  2146.   }
  2147. }
  2148. /*!
  2149.  *************************************************************************************
  2150.  * brief
  2151.  *    update QP using the quadratic model for basic unit coding
  2152.  *************************************************************************************
  2153. */
  2154. void updateModelQPBU( rc_quadratic *prc, int topfield, int m_Qp )
  2155. {
  2156.   double dtmp, m_Qstep;
  2157.   int m_Bits;
  2158.   /*compute the total number of bits for the current basic unit*/
  2159.   m_Bits =(int)(prc->Target * prc->CurrentFrameMAD * prc->CurrentFrameMAD / prc->TotalBUMAD);
  2160.   /*compute the number of texture bits*/
  2161.   m_Bits -=prc->PAveHeaderBits2;
  2162.   m_Bits=imax(m_Bits,(int)(prc->bit_rate/(MINVALUE*prc->frame_rate*prc->TotalNumberofBasicUnit)));
  2163.   dtmp = prc->CurrentFrameMAD * prc->CurrentFrameMAD * prc->m_X1 * prc->m_X1 
  2164.     + 4 * prc->m_X2 * prc->CurrentFrameMAD * m_Bits;
  2165.   if ((prc->m_X2 == 0.0) || (dtmp < 0) || ((sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD) <= 0.0))  // fall back 1st order mode
  2166.     m_Qstep = (float)(prc->m_X1 * prc->CurrentFrameMAD / (double) m_Bits);
  2167.   else // 2nd order mode
  2168.     m_Qstep = (float) ((2 * prc->m_X2 * prc->CurrentFrameMAD) / (sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD));
  2169.   prc->m_Qc = Qstep2QP(m_Qstep);
  2170.   prc->m_Qc = imin(m_Qp+prc->DDquant,  prc->m_Qc); // control variation
  2171.   if(params->basicunit>=prc->MBPerRow)
  2172.     prc->m_Qc = imin(prc->PAveFrameQP+6, prc->m_Qc);
  2173.   else
  2174.     prc->m_Qc = imin(prc->PAveFrameQP+3, prc->m_Qc);
  2175.   prc->m_Qc = iClip3(m_Qp-prc->DDquant, img->RCMaxQP, prc->m_Qc); // clipping
  2176.   if(params->basicunit>=prc->MBPerRow)
  2177.     prc->m_Qc = imax(prc->PAveFrameQP-6, prc->m_Qc);
  2178.   else
  2179.     prc->m_Qc = imax(prc->PAveFrameQP-3, prc->m_Qc);
  2180.   prc->m_Qc = imax(img->RCMinQP, prc->m_Qc);
  2181. }
  2182. /*!
  2183.  *************************************************************************************
  2184.  * brief
  2185.  *    update QP variables for interlaced pictures and basic unit coding
  2186.  *************************************************************************************
  2187. */
  2188. void updateQPInterlaceBU( rc_quadratic *prc )
  2189. {
  2190.   /*previous choice is frame coding*/
  2191.   if(generic_RC->FieldFrame==1)
  2192.   {
  2193.     prc->TotalQpforPPicture +=prc->FrameQPBuffer;
  2194.     prc->Pm_Qp=prc->FrameQPBuffer;
  2195.   }
  2196.   /*previous choice is field coding*/
  2197.   else
  2198.   {
  2199.     prc->TotalQpforPPicture +=prc->FieldQPBuffer;
  2200.     prc->Pm_Qp=prc->FieldQPBuffer;
  2201.   }
  2202. }
  2203. /*!
  2204.  *************************************************************************************
  2205.  * brief
  2206.  *    update QP with quadratic model
  2207.  *************************************************************************************
  2208. */
  2209. void updateModelQPFrame( rc_quadratic *prc, int m_Bits )
  2210. {
  2211.   double dtmp, m_Qstep;
  2212.   dtmp = prc->CurrentFrameMAD * prc->m_X1 * prc->CurrentFrameMAD * prc->m_X1
  2213.     + 4 * prc->m_X2 * prc->CurrentFrameMAD * m_Bits;
  2214.   if ((prc->m_X2 == 0.0) || (dtmp < 0) || ((sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD) <= 0.0)) // fall back 1st order mode
  2215.     m_Qstep = (float) (prc->m_X1 * prc->CurrentFrameMAD / (double) m_Bits);
  2216.   else // 2nd order mode
  2217.     m_Qstep = (float) ((2 * prc->m_X2 * prc->CurrentFrameMAD) / (sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD));
  2218.   prc->m_Qc = Qstep2QP(m_Qstep);
  2219. }
  2220. /*!
  2221.  *************************************************************************************
  2222.  * brief
  2223.  *    rate control at the MB level
  2224.  *************************************************************************************
  2225. */
  2226. int rc_handle_mb( int prev_mb, Macroblock *currMB, Slice *curr_slice )
  2227. {
  2228.   int  mb_qp = img->qp;
  2229.   Macroblock *prevMB = NULL;
  2230.   if (prev_mb > -1)
  2231.   {
  2232.     prevMB = &img->mb_data[prev_mb];
  2233.     if ( params->MbInterlace == ADAPTIVE_CODING && !img->bot_MB && currMB->mb_field )
  2234.       mb_qp = prevMB->qp;
  2235.   }
  2236.   // frame layer rate control
  2237.   if (params->basicunit != img->FrameSizeInMbs)
  2238.   {
  2239.     // each I or B frame has only one QP
  2240.     if ( ((img->type == I_SLICE || img->type == B_SLICE) && params->RCUpdateMode != RC_MODE_1 ) || !(img->number) )
  2241.     {
  2242.       return mb_qp;
  2243.     }
  2244.     else if ( img->type == P_SLICE || params->RCUpdateMode == RC_MODE_1 )
  2245.     {
  2246.       if (!img->write_macroblock) //write macroblock
  2247.       {
  2248.         if (prev_mb > -1) 
  2249.         {      
  2250.           if (!((params->MbInterlace) && img->bot_MB)) //top macroblock
  2251.           {
  2252.             if (prevMB->prev_cbp != 1)
  2253.             {
  2254.               mb_qp = prevMB->prev_qp;
  2255.             }
  2256.           }
  2257.         }
  2258.       }
  2259.       // compute the quantization parameter for each basic unit of P frame
  2260.       if (!img->write_macroblock)
  2261.       {
  2262.         if(!((params->MbInterlace) && img->bot_MB))
  2263.         {
  2264.           if(params->RCUpdateMode <= MAX_RC_MODE && (img->NumberofCodedMacroBlocks > 0) && (img->NumberofCodedMacroBlocks % img->BasicUnit == 0))
  2265.           {
  2266.             updateRCModel(quadratic_RC);
  2267.             // frame coding
  2268.             if(active_sps->frame_mbs_only_flag)
  2269.             {
  2270.               img->BasicUnitQP = updateQP(quadratic_RC, generic_RC->TopFieldFlag);
  2271.             }
  2272.             // picture adaptive field/frame coding
  2273.             else if(params->MbInterlace || ((params->PicInterlace!=FRAME_CODING) && (generic_RC->NoGranularFieldRC==0)))
  2274.             {
  2275.               img->BasicUnitQP = updateQP(quadratic_RC, generic_RC->TopFieldFlag);
  2276.             }
  2277.           }
  2278.           if(img->current_mb_nr==0)
  2279.             img->BasicUnitQP = mb_qp;
  2280.           mb_qp = img->BasicUnitQP;
  2281.           mb_qp = iClip3(-img->bitdepth_luma_qp_scale, 51, mb_qp);
  2282.         }
  2283.       }
  2284.     }
  2285.   }
  2286.   return mb_qp;
  2287. }
  2288. /*!
  2289.  *************************************************************************************
  2290.  * brief
  2291.  *    initialize rate control model for the top field
  2292.  *************************************************************************************
  2293. */
  2294. void rc_init_top_field ( void )
  2295. {
  2296.   img->BasicUnit = params->basicunit;
  2297.   generic_RC->TopFieldFlag = 1;
  2298.   rc_init_pict_ptr(quadratic_RC, 0, 1, (params->PicInterlace == FIELD_CODING), 1.0F); 
  2299.   img->qp = updateQP(quadratic_RC, 1);
  2300. }
  2301. /*!
  2302.  *************************************************************************************
  2303.  * brief
  2304.  *    initialize rate control model for the bottom field
  2305.  *************************************************************************************
  2306. */
  2307. void rc_init_bottom_field ( int TopFieldBits )
  2308. {
  2309.   quadratic_RC->bits_topfield = TopFieldBits;
  2310.   generic_RC->TopFieldFlag = 0;
  2311.   rc_init_pict_ptr(quadratic_RC, 0,0,0, 1.0F); 
  2312.   img->qp  = updateQP(quadratic_RC, 0); 
  2313. }
  2314. /*!
  2315.  *************************************************************************************
  2316.  * brief
  2317.  *    initialize rate control for RDPictureDecision
  2318.  *************************************************************************************
  2319. */
  2320. void rc_init_frame_rdpic( float rateRatio )
  2321. {
  2322.   switch (params->RCUpdateMode)
  2323.   {
  2324.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2325.     // re-store the initial RC model
  2326.     rc_copy_quadratic( quadratic_RC, quadratic_RC_init );
  2327.     rc_copy_generic( generic_RC, generic_RC_init );
  2328.     rc_init_pict_ptr(quadratic_RC, 1,0,1, rateRatio );
  2329.     img->qp  = updateQP(quadratic_RC, 0);
  2330.     break;
  2331.   default:
  2332.     break;
  2333.   }
  2334. }
  2335. /*!
  2336.  *************************************************************************************
  2337.  * brief
  2338.  *    allocate rate control memory
  2339.  *************************************************************************************
  2340. */
  2341. void rc_allocate_memory( void )
  2342. {
  2343.   switch (params->RCUpdateMode)
  2344.   {
  2345.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2346.     rc_alloc_generic( &generic_RC );
  2347.     rc_alloc_quadratic( &quadratic_RC );
  2348.     if ( params->RDPictureDecision || params->MbInterlace == ADAPTIVE_CODING )
  2349.     {
  2350.       rc_alloc_generic( &generic_RC_init );
  2351.       rc_alloc_quadratic( &quadratic_RC_init );
  2352.       rc_alloc_generic( &generic_RC_best );
  2353.       rc_alloc_quadratic( &quadratic_RC_best );
  2354.     }
  2355.     break;
  2356.   default:
  2357.     break;
  2358.   }
  2359. }
  2360. /*!
  2361.  *************************************************************************************
  2362.  * brief
  2363.  *    free rate control memory
  2364.  *************************************************************************************
  2365. */
  2366. void rc_free_memory( void )
  2367. {
  2368.   switch (params->RCUpdateMode)
  2369.   {
  2370.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2371.     rc_free_generic( &generic_RC );
  2372.     rc_free_quadratic( &quadratic_RC );
  2373.     if ( params->RDPictureDecision || params->MbInterlace == ADAPTIVE_CODING )
  2374.     {
  2375.       rc_free_generic( &generic_RC_init );
  2376.       rc_free_quadratic( &quadratic_RC_init );
  2377.       rc_free_generic( &generic_RC_best );
  2378.       rc_free_quadratic( &quadratic_RC_best );
  2379.     }
  2380.     break;
  2381.   default:
  2382.     break;
  2383.   }
  2384. }
  2385. /*!
  2386.  *************************************************************************************
  2387.  * brief
  2388.  *    update coding statistics after MB coding
  2389.  *************************************************************************************
  2390. */
  2391. void rc_update_mb_stats( Macroblock *currMB, int *bitCount )
  2392. {
  2393.   // Rate control
  2394.   img->NumberofMBHeaderBits = bitCount[BITS_MB_MODE] + bitCount[BITS_INTER_MB]
  2395.                             + bitCount[BITS_CBP_MB ] + bitCount[BITS_DELTA_QUANT_MB];
  2396.   img->NumberofMBTextureBits = bitCount[BITS_COEFF_Y_MB]+ bitCount[BITS_COEFF_UV_MB];
  2397.   switch (params->RCUpdateMode)
  2398.   {
  2399.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2400.     generic_RC->NumberofTextureBits += img->NumberofMBTextureBits;
  2401.     generic_RC->NumberofHeaderBits  += img->NumberofMBHeaderBits;
  2402.     // basic unit layer rate control
  2403.     if(img->BasicUnit < img->FrameSizeInMbs)
  2404.     {
  2405.       generic_RC->NumberofBasicUnitHeaderBits  += img->NumberofMBHeaderBits;
  2406.       generic_RC->NumberofBasicUnitTextureBits += img->NumberofMBTextureBits;
  2407.     }
  2408.     break;
  2409.   default:
  2410.     break;
  2411.   }
  2412. }
  2413. /*!
  2414.  *************************************************************************************
  2415.  * brief
  2416.  *    save state of rate control model
  2417.  *************************************************************************************
  2418. */
  2419. void rc_save_state( void )
  2420. {
  2421.   switch (params->RCUpdateMode)
  2422.   {
  2423.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2424.     rc_copy_quadratic( quadratic_RC_best, quadratic_RC );
  2425.     rc_copy_generic( generic_RC_best, generic_RC );
  2426.     break;
  2427.   default:
  2428.     break;
  2429.   }
  2430. }
  2431. /*!
  2432.  *************************************************************************************
  2433.  * brief
  2434.  *    restore state of rate control model
  2435.  *************************************************************************************
  2436. */
  2437. void rc_restore_state( void )
  2438. {
  2439.   switch (params->RCUpdateMode)
  2440.   {
  2441.   case RC_MODE_0:  case RC_MODE_1:  case RC_MODE_2:  case RC_MODE_3:
  2442.     rc_copy_quadratic( quadratic_RC, quadratic_RC_best );
  2443.     rc_copy_generic( generic_RC, generic_RC_best );
  2444.     break;
  2445.   default:
  2446.     break;
  2447.   }
  2448. }