00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <math.h>
00021 #include <limits.h>
00022
00023 #include "global.h"
00024 #include "ratectl.h"
00025
00026
00027 static const float THETA = 1.3636F;
00028 static const float OMEGA = 0.9F;
00029 static const float MINVALUE = 4.0F;
00030
00031
00032
00033
00034
00035
00036
00037 void rc_alloc_quadratic( rc_quadratic **prc )
00038 {
00039 int rcBufSize = img->FrameSizeInMbs / params->basicunit;
00040 rc_quadratic *lprc;
00041
00042 (*prc) = (rc_quadratic *) malloc ( sizeof( rc_quadratic ) );
00043 if (NULL==(*prc))
00044 {
00045 no_mem_exit("init_global_buffers: (*prc)");
00046 }
00047 lprc = *prc;
00048
00049 lprc->PreviousFrameMAD = 1.0;
00050 lprc->CurrentFrameMAD = 1.0;
00051 lprc->Pprev_bits = 0;
00052 lprc->Target = 0;
00053 lprc->TargetField = 0;
00054 lprc->LowerBound = 0;
00055 lprc->UpperBound1 = INT_MAX;
00056 lprc->UpperBound2 = INT_MAX;
00057 lprc->Wp = 0.0;
00058 lprc->Wb = 0.0;
00059 lprc->AveWb = 0.0;
00060 lprc->PAveFrameQP = params->qp[0][I_SLICE];
00061 lprc->m_Qc = lprc->PAveFrameQP;
00062 lprc->FieldQPBuffer = lprc->PAveFrameQP;
00063 lprc->FrameQPBuffer = lprc->PAveFrameQP;
00064 lprc->PAverageQp = lprc->PAveFrameQP;
00065 lprc->MyInitialQp = lprc->PAveFrameQP;
00066 lprc->AveWb = 0.0;
00067
00068 lprc->BUPFMAD = (double*) calloc ((rcBufSize), sizeof (double));
00069 if (NULL==lprc->BUPFMAD)
00070 {
00071 no_mem_exit("rc_alloc_quadratic: lprc->BUPFMAD");
00072 }
00073
00074 lprc->BUCFMAD = (double*) calloc ((rcBufSize), sizeof (double));
00075 if (NULL==lprc->BUCFMAD)
00076 {
00077 no_mem_exit("rc_alloc_quadratic: lprc->BUCFMAD");
00078 }
00079
00080 lprc->FCBUCFMAD = (double*) calloc ((rcBufSize), sizeof (double));
00081 if (NULL==lprc->FCBUCFMAD)
00082 {
00083 no_mem_exit("rc_alloc_quadratic: lprc->FCBUCFMAD");
00084 }
00085
00086 lprc->FCBUPFMAD = (double*) calloc ((rcBufSize), sizeof (double));
00087 if (NULL==lprc->FCBUPFMAD)
00088 {
00089 no_mem_exit("rc_alloc_quadratic: lprc->FCBUPFMAD");
00090 }
00091 }
00092
00093
00094
00095
00096
00097
00098
00099
00100 void rc_copy_quadratic( rc_quadratic *dst, rc_quadratic *src )
00101 {
00102 int rcBufSize = img->FrameSizeInMbs / params->basicunit;
00103
00104 double *tmpBUPFMAD = dst->BUPFMAD;
00105 double *tmpBUCFMAD = dst->BUCFMAD;
00106 double *tmpFCBUPFMAD = dst->FCBUPFMAD;
00107 double *tmpFCBUCFMAD = dst->FCBUCFMAD;
00108
00109
00110 memcpy( (void *)dst, (void *)src, sizeof(rc_quadratic) );
00111
00112
00113 dst->BUPFMAD = tmpBUPFMAD;
00114 dst->BUCFMAD = tmpBUCFMAD;
00115 dst->FCBUPFMAD = tmpFCBUPFMAD;
00116 dst->FCBUCFMAD = tmpFCBUCFMAD;
00117
00118
00119 memcpy( (void *)dst->BUPFMAD, (void *)src->BUPFMAD, (rcBufSize) * sizeof (double) );
00120 memcpy( (void *)dst->BUCFMAD, (void *)src->BUCFMAD, (rcBufSize) * sizeof (double) );
00121 memcpy( (void *)dst->FCBUPFMAD, (void *)src->FCBUPFMAD, (rcBufSize) * sizeof (double) );
00122 memcpy( (void *)dst->FCBUCFMAD, (void *)src->FCBUCFMAD, (rcBufSize) * sizeof (double) );
00123 }
00124
00125
00126
00127
00128
00129
00130
00131
00132 void rc_free_quadratic(rc_quadratic **prc)
00133 {
00134 if (NULL!=(*prc)->BUPFMAD)
00135 {
00136 free ((*prc)->BUPFMAD);
00137 (*prc)->BUPFMAD = NULL;
00138 }
00139 if (NULL!=(*prc)->BUCFMAD)
00140 {
00141 free ((*prc)->BUCFMAD);
00142 (*prc)->BUCFMAD = NULL;
00143 }
00144 if (NULL!=(*prc)->FCBUCFMAD)
00145 {
00146 free ((*prc)->FCBUCFMAD);
00147 (*prc)->FCBUCFMAD = NULL;
00148 }
00149 if (NULL!=(*prc)->FCBUPFMAD)
00150 {
00151 free ((*prc)->FCBUPFMAD);
00152 (*prc)->FCBUPFMAD = NULL;
00153 }
00154 if (NULL!=(*prc))
00155 {
00156 free ((*prc));
00157 (*prc) = NULL;
00158 }
00159 }
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169 void rc_init_seq(rc_quadratic *prc)
00170 {
00171 double L1,L2,L3,bpp;
00172 int qp, i;
00173
00174 switch ( params->RCUpdateMode )
00175 {
00176 case RC_MODE_0:
00177 updateQP = updateQPRC0;
00178 break;
00179 case RC_MODE_1:
00180 updateQP = updateQPRC1;
00181 break;
00182 case RC_MODE_2:
00183 updateQP = updateQPRC2;
00184 break;
00185 case RC_MODE_3:
00186 updateQP = updateQPRC3;
00187 break;
00188 default:
00189 updateQP = updateQPRC0;
00190 break;
00191 }
00192
00193 rc_update_pict_frame_ptr = rc_update_pict_frame;
00194 rc_update_picture_ptr = rc_update_picture;
00195 rc_init_pict_ptr = rc_init_pict;
00196
00197 prc->Xp=0;
00198 prc->Xb=0;
00199
00200 prc->bit_rate = (float) params->bit_rate;
00201 prc->frame_rate = img->framerate;
00202 prc->PrevBitRate = prc->bit_rate;
00203
00204
00205 if(params->basicunit > img->FrameSizeInMbs)
00206 params->basicunit = img->FrameSizeInMbs;
00207 if(params->basicunit < img->FrameSizeInMbs)
00208 prc->TotalNumberofBasicUnit = img->FrameSizeInMbs/params->basicunit;
00209 else
00210 prc->TotalNumberofBasicUnit = 1;
00211
00212
00213 generic_RC->CurrentBufferFullness = 0;
00214 prc->GOPTargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
00215
00216
00217 prc->m_windowSize = 0;
00218 prc->MADm_windowSize = 0;
00219 generic_RC->NumberofCodedBFrame = 0;
00220 prc->NumberofCodedPFrame = 0;
00221 generic_RC->NumberofGOP = 0;
00222
00223 generic_RC->RemainingBits = 0;
00224
00225 if(params->NumberBFrames>0)
00226 {
00227 prc->GAMMAP=0.25;
00228 prc->BETAP=0.9;
00229 }
00230 else
00231 {
00232 prc->GAMMAP=0.5;
00233 prc->BETAP=0.5;
00234 }
00235
00236
00237 prc->PPreHeader=0;
00238
00239 prc->Pm_X1 = prc->bit_rate * 1.0;
00240 prc->Pm_X2 = 0.0;
00241
00242 prc->PMADPictureC1 = 1.0;
00243 prc->PMADPictureC2 = 0.0;
00244
00245
00246 for(i=0;i<21;i++)
00247 {
00248 prc->Pm_rgQp[i] = 0;
00249 prc->Pm_rgRp[i] = 0.0;
00250 prc->PPictureMAD[i] = 0.0;
00251 }
00252
00253
00254 prc->PMaxQpChange = params->RCMaxQPChange;
00255
00256
00257 prc->PAveHeaderBits1 = 0;
00258 prc->PAveHeaderBits3 = 0;
00259 prc->DDquant = (prc->TotalNumberofBasicUnit>=9 ? 1 : 2);
00260
00261 prc->MBPerRow = img->PicWidthInMbs;
00262
00263
00264 generic_RC->FieldControl=0;
00265
00266 if (params->SeinitialQP==0)
00267 {
00268
00269 bpp = 1.0*prc->bit_rate /(prc->frame_rate*img->size);
00270
00271 if (img->width == 176)
00272 {
00273 L1 = 0.1;
00274 L2 = 0.3;
00275 L3 = 0.6;
00276 }
00277 else if (img->width == 352)
00278 {
00279 L1 = 0.2;
00280 L2 = 0.6;
00281 L3 = 1.2;
00282 }
00283 else
00284 {
00285 L1 = 0.6;
00286 L2 = 1.4;
00287 L3 = 2.4;
00288 }
00289 if (bpp<= L1)
00290 qp = 35;
00291 else if(bpp<=L2)
00292 qp = 25;
00293 else if(bpp<=L3)
00294 qp = 20;
00295 else
00296 qp = 10;
00297 params->SeinitialQP = qp;
00298 }
00299 }
00300
00301
00302
00303
00304
00305
00306
00307
00308 void rc_init_GOP(rc_quadratic *prc, int np, int nb)
00309 {
00310 Boolean Overum=FALSE;
00311 int OverBits, OverDuantQp;
00312 int GOPDquant;
00313 int64 AllocatedBits;
00314
00315
00316 switch( params->RCUpdateMode )
00317 {
00318 case RC_MODE_3:
00319 {
00320 int sum = 0, tmp, level, levels = 0, num_frames[RC_MAX_TEMPORAL_LEVELS];
00321 float numer, denom;
00322 int gop = params->NumberBFrames + 1;
00323 memset( num_frames, 0, RC_MAX_TEMPORAL_LEVELS * sizeof(int) );
00324
00325 if ( params->NumberBFrames )
00326 {
00327 if ( params->HierarchicalCoding == 1 )
00328 {
00329 levels = 2;
00330 num_frames[0] = params->NumberBFrames >> 1;
00331 num_frames[1] = (params->NumberBFrames - num_frames[0]) >= 0 ? (params->NumberBFrames - num_frames[0]) : 0;
00332 }
00333 else if ( params->HierarchicalCoding == 2 )
00334 {
00335
00336 tmp = gop;
00337 while ( tmp )
00338 {
00339 sum += tmp & 1;
00340 tmp >>= 1;
00341 }
00342 assert( sum == 1 );
00343
00344
00345 levels = 0;
00346 tmp = gop;
00347 while ( tmp > 1 )
00348 {
00349 tmp >>= 1;
00350 num_frames[levels] = 1 << levels;
00351 levels++;
00352 }
00353 assert( levels >= 1 && levels <= RC_MAX_TEMPORAL_LEVELS );
00354 }
00355 else if ( params->HierarchicalCoding == 3 )
00356 {
00357 fprintf(stderr, "\n RCUpdateMode=3 and HierarchicalCoding == 3 are currently not supported");
00358 exit(1);
00359 }
00360 else
00361 {
00362 levels = 1;
00363 num_frames[0] = params->NumberBFrames;
00364 }
00365 generic_RC->temporal_levels = levels;
00366 }
00367 else
00368 {
00369 for ( level = 0; level < RC_MAX_TEMPORAL_LEVELS; level++ )
00370 {
00371 params->RCBSliceBitRatio[level] = 0.0F;
00372 }
00373 generic_RC->temporal_levels = 0;
00374 }
00375
00376 numer = (float)(( (!params->intra_period ? 1 : params->intra_period) * gop) * ((double)params->bit_rate / params->source.frame_rate));
00377 denom = 0.0F;
00378
00379 for ( level = 0; level < levels; level++ )
00380 {
00381 denom += (float)(num_frames[level] * params->RCBSliceBitRatio[level]);
00382 generic_RC->hierNb[level] = num_frames[level] * np;
00383 }
00384 denom += 1.0F;
00385 if ( params->intra_period >= 1 )
00386 {
00387 denom *= (float)params->intra_period;
00388 denom += (float)params->RCISliceBitRatio - 1.0F;
00389 }
00390
00391
00392 generic_RC->RCPSliceBits = (int) floor( numer / denom + 0.5F );
00393 generic_RC->RCISliceBits = (params->intra_period) ? (int)(params->RCISliceBitRatio * generic_RC->RCPSliceBits + 0.5) : 0;
00394
00395 for ( level = 0; level < levels; level++ )
00396 {
00397 generic_RC->RCBSliceBits[level] = (int)floor(params->RCBSliceBitRatio[level] * generic_RC->RCPSliceBits + 0.5);
00398 }
00399
00400 generic_RC->NISlice = (params->intra_period) ? ((params->no_frm_base - 1) / params->intra_period) : 0;
00401 generic_RC->NPSlice = params->no_frm_base - 1 - generic_RC->NISlice;
00402 }
00403 break;
00404 default:
00405 break;
00406 }
00407
00408
00409
00410
00411 if(generic_RC->RemainingBits<0)
00412 Overum=TRUE;
00413 OverBits=-(int)(generic_RC->RemainingBits);
00414
00415
00416 prc->LowerBound = (int)(generic_RC->RemainingBits + prc->bit_rate / prc->frame_rate);
00417 prc->UpperBound1 = (int)(generic_RC->RemainingBits + (prc->bit_rate * 2.048));
00418
00419
00420 AllocatedBits = (int64) floor((1 + np + nb) * prc->bit_rate / prc->frame_rate + 0.5);
00421 generic_RC->RemainingBits += AllocatedBits;
00422 prc->Np = np;
00423 prc->Nb = nb;
00424
00425 OverDuantQp=(int)(8 * OverBits/AllocatedBits+0.5);
00426 prc->GOPOverdue=FALSE;
00427
00428
00429
00430 if ( !params->PicInterlace && params->MbInterlace && params->basicunit == img->FrameSizeInMbs )
00431 generic_RC->NoGranularFieldRC = 0;
00432 else
00433 generic_RC->NoGranularFieldRC = 1;
00434
00435
00436 prc->TotalPFrame=np;
00437 generic_RC->NumberofGOP++;
00438 if(generic_RC->NumberofGOP==1)
00439 {
00440 prc->MyInitialQp = params->SeinitialQP;
00441 prc->CurrLastQP = prc->MyInitialQp - 1;
00442 prc->QPLastGOP = prc->MyInitialQp;
00443
00444 prc->PAveFrameQP = prc->MyInitialQp;
00445 prc->m_Qc = prc->PAveFrameQP;
00446 prc->FieldQPBuffer = prc->PAveFrameQP;
00447 prc->FrameQPBuffer = prc->PAveFrameQP;
00448 prc->PAverageQp = prc->PAveFrameQP;
00449 }
00450 else
00451 {
00452
00453 if( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace )
00454 {
00455 if (generic_RC->FieldFrame == 1)
00456 {
00457 prc->TotalQpforPPicture += prc->FrameQPBuffer;
00458 prc->QPLastPFrame = prc->FrameQPBuffer;
00459 }
00460 else
00461 {
00462 prc->TotalQpforPPicture += prc->FieldQPBuffer;
00463 prc->QPLastPFrame = prc->FieldQPBuffer;
00464 }
00465 }
00466
00467 prc->PAverageQp=(int)(1.0 * prc->TotalQpforPPicture / prc->NumberofPPicture+0.5);
00468
00469 GOPDquant=(int)((1.0*(np+nb+1)/15.0) + 0.5);
00470 if(GOPDquant>2)
00471 GOPDquant=2;
00472
00473 prc->PAverageQp -= GOPDquant;
00474
00475 if (prc->PAverageQp > (prc->QPLastPFrame - 2))
00476 prc->PAverageQp--;
00477
00478
00479 prc->PAverageQp = iClip3(prc->QPLastGOP - 2, prc->QPLastGOP + 2, prc->PAverageQp);
00480
00481 prc->PAverageQp = iClip3(img->RCMinQP, img->RCMaxQP, prc->PAverageQp);
00482
00483 prc->MyInitialQp = prc->PAverageQp;
00484 prc->Pm_Qp = prc->PAverageQp;
00485 prc->PAveFrameQP = prc->PAverageQp;
00486 prc->QPLastGOP = prc->MyInitialQp;
00487 prc->PrevLastQP = prc->CurrLastQP;
00488 prc->CurrLastQP = prc->MyInitialQp - 1;
00489 }
00490
00491 prc->TotalQpforPPicture=0;
00492 prc->NumberofPPicture=0;
00493 prc->NumberofBFrames=0;
00494 }
00495
00496
00497
00498
00499
00500
00501
00502
00503
00504 void rc_init_pict(rc_quadratic *prc, int fieldpic,int topfield,int targetcomputation, float mult)
00505 {
00506 int tmp_T;
00507
00508
00509 if(params->MbInterlace)
00510 prc->TotalNumberofBasicUnit = img->FrameSizeInMbs / img->BasicUnit;
00511 else
00512 prc->TotalNumberofBasicUnit = img->FrameSizeInMbs / params->basicunit;
00513
00514 img->NumberofCodedMacroBlocks = 0;
00515
00516
00517
00518
00519 if(params->channel_type==1)
00520 {
00521 if(prc->NumberofCodedPFrame==58)
00522 prc->bit_rate *= 1.5;
00523 else if(prc->NumberofCodedPFrame==59)
00524 prc->PrevBitRate = prc->bit_rate;
00525 }
00526
00527
00528 if((fieldpic||topfield) && targetcomputation)
00529 {
00530 if ( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number !=0)) )
00531 {
00532
00533
00534 if(prc->PrevBitRate!=prc->bit_rate)
00535 generic_RC->RemainingBits +=(int) floor((prc->bit_rate-prc->PrevBitRate)*(prc->Np + prc->Nb)/prc->frame_rate+0.5);
00536
00537
00538
00539 if(img->BasicUnit == img->FrameSizeInMbs)
00540 {
00541 if(prc->NumberofPPicture==1)
00542 {
00543 prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
00544 prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel) / (prc->TotalPFrame-1);
00545 prc->TargetBufferLevel -= prc->DeltaP;
00546 }
00547 else if(prc->NumberofPPicture>1)
00548 prc->TargetBufferLevel -= prc->DeltaP;
00549 }
00550
00551 else
00552 {
00553 if(prc->NumberofCodedPFrame>0)
00554 {
00555
00556 if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==1))
00557 memcpy((void *)prc->FCBUPFMAD,(void *)prc->FCBUCFMAD, prc->TotalNumberofBasicUnit * sizeof(double));
00558 else
00559 memcpy((void *)prc->BUPFMAD,(void *)prc->BUCFMAD, prc->TotalNumberofBasicUnit * sizeof(double));
00560 }
00561
00562 if(generic_RC->NumberofGOP==1)
00563 {
00564 if(prc->NumberofPPicture==1)
00565 {
00566 prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
00567 prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel)/(prc->TotalPFrame - 1);
00568 prc->TargetBufferLevel -= prc->DeltaP;
00569 }
00570 else if(prc->NumberofPPicture>1)
00571 prc->TargetBufferLevel -= prc->DeltaP;
00572 }
00573 else if(generic_RC->NumberofGOP>1)
00574 {
00575 if(prc->NumberofPPicture==0)
00576 {
00577 prc->TargetBufferLevel = (double) generic_RC->CurrentBufferFullness;
00578 prc->DeltaP = (generic_RC->CurrentBufferFullness - prc->GOPTargetBufferLevel) / prc->TotalPFrame;
00579 prc->TargetBufferLevel -= prc->DeltaP;
00580 }
00581 else if(prc->NumberofPPicture>0)
00582 prc->TargetBufferLevel -= prc->DeltaP;
00583 }
00584 }
00585
00586 if(prc->NumberofCodedPFrame==1)
00587 prc->AveWp = prc->Wp;
00588
00589 if((prc->NumberofCodedPFrame<8)&&(prc->NumberofCodedPFrame>1))
00590 prc->AveWp = (prc->AveWp + prc->Wp * (prc->NumberofCodedPFrame-1))/prc->NumberofCodedPFrame;
00591 else if(prc->NumberofCodedPFrame>1)
00592 prc->AveWp = (prc->Wp + 7 * prc->AveWp) / 8;
00593
00594
00595 if(params->NumberBFrames>0)
00596 {
00597
00598 prc->TargetBufferLevel += (prc->AveWp * (params->NumberBFrames + 1)*prc->bit_rate\
00599 /(prc->frame_rate*(prc->AveWp+prc->AveWb*params->NumberBFrames))-prc->bit_rate/prc->frame_rate);
00600 }
00601 }
00602 else if ( img->type == B_SLICE )
00603 {
00604
00605 if(prc->PrevBitRate != prc->bit_rate)
00606 generic_RC->RemainingBits +=(int) floor((prc->bit_rate-prc->PrevBitRate) * (prc->Np + prc->Nb) / prc->frame_rate+0.5);
00607 if(generic_RC->NumberofCodedBFrame == 1)
00608 {
00609 if(prc->NumberofCodedPFrame == 1)
00610 {
00611 prc->AveWp = prc->Wp;
00612 }
00613 prc->AveWb = prc->Wb;
00614 }
00615 else if(generic_RC->NumberofCodedBFrame > 1)
00616 {
00617
00618 if(generic_RC->NumberofCodedBFrame<8)
00619 prc->AveWb = (prc->AveWb + prc->Wb*(generic_RC->NumberofCodedBFrame-1)) / generic_RC->NumberofCodedBFrame;
00620 else
00621 prc->AveWb = (prc->Wb + 7 * prc->AveWb) / 8;
00622 }
00623 }
00624
00625 if( img->type == P_SLICE || ( (img->number != 0) && (params->RCUpdateMode == RC_MODE_1 || params->RCUpdateMode == RC_MODE_3 ) ) )
00626 {
00627
00628 if(img->BasicUnit == img->FrameSizeInMbs || (params->RCUpdateMode == RC_MODE_3) )
00629 {
00630 if(prc->NumberofCodedPFrame>0)
00631 {
00632 if (params->RCUpdateMode == RC_MODE_3)
00633 {
00634 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;
00635 int bitrate = (img->type == B_SLICE) ? generic_RC->RCBSliceBits[ level_idx ]
00636 : ( img->type == P_SLICE ? generic_RC->RCPSliceBits : generic_RC->RCISliceBits );
00637 int level, denom = generic_RC->NISlice * generic_RC->RCISliceBits + generic_RC->NPSlice * generic_RC->RCPSliceBits;
00638 if ( params->HierarchicalCoding )
00639 {
00640 for ( level = 0; level < generic_RC->temporal_levels; level++ )
00641 denom += generic_RC->hierNb[ level ] * generic_RC->RCBSliceBits[ level ];
00642 }
00643 else
00644 {
00645 denom += generic_RC->hierNb[0] * generic_RC->RCBSliceBits[0];
00646 }
00647
00648 prc->Target = (int) floor( (float)(1.0 * bitrate * generic_RC->RemainingBits) / (float)denom + 0.5F );
00649
00650 tmp_T = imax(0, (int) floor( (double)bitrate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5) );
00651
00652
00653 switch( img->type )
00654 {
00655 case B_SLICE:
00656 prc->Target = (int) floor( (float)prc->Target / params->RCBoverPRatio + 0.5F);
00657 break;
00658 case I_SLICE:
00659 prc->Target = (int) floor( (float)prc->Target / (params->RCIoverPRatio * 4.0) + 0.5F);
00660 break;
00661 case P_SLICE:
00662 default:
00663 break;
00664 }
00665 }
00666 else
00667 {
00668 prc->Target = (int) floor( prc->Wp * generic_RC->RemainingBits / (prc->Np * prc->Wp + prc->Nb * prc->Wb) + 0.5);
00669 tmp_T = imax(0, (int) floor(prc->bit_rate / prc->frame_rate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5));
00670 prc->Target = (int) floor(prc->BETAP * (prc->Target - tmp_T) + tmp_T + 0.5);
00671 }
00672 }
00673 }
00674
00675 else
00676 {
00677 if(((generic_RC->NumberofGOP == 1)&&(prc->NumberofCodedPFrame>0))
00678 || (generic_RC->NumberofGOP > 1))
00679 {
00680 prc->Target = (int) (floor( prc->Wp * generic_RC->RemainingBits / (prc->Np * prc->Wp + prc->Nb * prc->Wb) + 0.5));
00681 tmp_T = imax(0, (int) (floor(prc->bit_rate / prc->frame_rate - prc->GAMMAP * (generic_RC->CurrentBufferFullness-prc->TargetBufferLevel) + 0.5)));
00682 prc->Target = (int) (floor(prc->BETAP * (prc->Target - tmp_T) + tmp_T + 0.5));
00683 }
00684 }
00685 prc->Target = (int)(mult * prc->Target);
00686
00687
00688 if ( params->RCUpdateMode != RC_MODE_3 || img->type == P_SLICE )
00689 prc->Target = iClip3(prc->LowerBound, prc->UpperBound2, prc->Target);
00690 if((topfield) || (fieldpic && ((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))))
00691 prc->TargetField=prc->Target;
00692 }
00693 }
00694
00695 if(fieldpic || topfield)
00696 {
00697
00698 generic_RC->NumberofHeaderBits = 0;
00699 generic_RC->NumberofTextureBits = 0;
00700
00701
00702 if(img->BasicUnit < img->FrameSizeInMbs)
00703 {
00704 prc->TotalFrameQP = 0;
00705 generic_RC->NumberofBasicUnitHeaderBits = 0;
00706 generic_RC->NumberofBasicUnitTextureBits = 0;
00707 generic_RC->TotalMADBasicUnit = 0;
00708 if(generic_RC->FieldControl==0)
00709 prc->NumberofBasicUnit = prc->TotalNumberofBasicUnit;
00710 else
00711 prc->NumberofBasicUnit = prc->TotalNumberofBasicUnit >> 1;
00712 }
00713 }
00714
00715 if( ( img->type==P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) ) && img->BasicUnit < img->FrameSizeInMbs && generic_RC->FieldControl == 1 )
00716 {
00717
00718 if(topfield)
00719 {
00720 prc->bits_topfield=0;
00721 prc->Target=(int)(prc->TargetField*0.6);
00722 }
00723
00724 else
00725 {
00726 prc->Target=prc->TargetField-prc->bits_topfield;
00727 generic_RC->NumberofBasicUnitHeaderBits=0;
00728 generic_RC->NumberofBasicUnitTextureBits=0;
00729 generic_RC->TotalMADBasicUnit=0;
00730 prc->NumberofBasicUnit=prc->TotalNumberofBasicUnit >> 1;
00731 }
00732 }
00733 }
00734
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745 void rc_update_pict(rc_quadratic *prc, int nbits)
00746 {
00747 int delta_bits = (nbits - (int)floor(prc->bit_rate / prc->frame_rate + 0.5F) );
00748
00749 generic_RC->RemainingBits -= nbits;
00750 generic_RC->CurrentBufferFullness += delta_bits;
00751
00752
00753 prc->LowerBound -= (int) delta_bits;
00754 prc->UpperBound1 -= (int) delta_bits;
00755 prc->UpperBound2 = (int)(OMEGA * prc->UpperBound1);
00756
00757
00758 if( img->type==P_SLICE || (params->RCUpdateMode == RC_MODE_1 && img->frm_number) )
00759 {
00760 updateRCModel(prc);
00761 if ( params->RCUpdateMode == RC_MODE_3 )
00762 prc->PreviousWholeFrameMAD = ComputeFrameMAD();
00763 }
00764 }
00765
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00776
00777 void rc_update_picture( int bits )
00778 {
00779 rc_update_pict(quadratic_RC, bits);
00780 }
00781
00782 int updateComplexity( rc_quadratic *prc, Boolean is_updated, int nbits )
00783 {
00784 double Avem_Qc;
00785
00786
00787 if(img->BasicUnit == img->FrameSizeInMbs)
00788 return ((int) floor(nbits * prc->m_Qc + 0.5));
00789
00790 else
00791 {
00792 if( is_updated )
00793 {
00794 if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
00795 {
00796 Avem_Qc = (double)prc->TotalFrameQP / (double)prc->TotalNumberofBasicUnit;
00797 return ((int)floor(nbits * Avem_Qc + 0.5));
00798 }
00799 }
00800 else if( img->type == B_SLICE )
00801 return ((int) floor(nbits * prc->m_Qc + 0.5));
00802 }
00803 return 0;
00804 }
00805
00806 void updatePparams( rc_quadratic *prc, int complexity )
00807 {
00808 prc->Xp = complexity;
00809 prc->Np--;
00810 prc->Wp = prc->Xp;
00811 prc->Pm_Hp = generic_RC->NumberofHeaderBits;
00812 prc->NumberofCodedPFrame++;
00813 prc->NumberofPPicture++;
00814 }
00815
00816 void updateBparams( rc_quadratic *prc, int complexity )
00817 {
00818 prc->Xb = complexity;
00819 prc->Nb--;
00820 prc->Wb = prc->Xb / THETA;
00821 prc->NumberofBFrames++;
00822 generic_RC->NumberofCodedBFrame++;
00823 }
00824
00825
00826
00827
00828
00829
00830
00831
00832
00833
00834
00835 void rc_update_pict_frame(rc_quadratic *prc, int nbits)
00836 {
00837
00838 int complexity = 0;
00839
00840 switch( params->RCUpdateMode )
00841 {
00842 case RC_MODE_0:
00843 case RC_MODE_2:
00844 default:
00845 complexity = updateComplexity( prc, (Boolean) (img->type == P_SLICE), nbits );
00846 if ( img->type == P_SLICE )
00847 {
00848 if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
00849 updatePparams( prc, complexity );
00850 else
00851 generic_RC->NoGranularFieldRC = 0;
00852 }
00853 else if ( img->type == B_SLICE )
00854 updateBparams( prc, complexity );
00855 break;
00856 case RC_MODE_1:
00857 complexity = updateComplexity( prc, (Boolean) (img->number != 0), nbits );
00858 if ( img->number != 0 )
00859 {
00860 if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
00861 updatePparams( prc, complexity );
00862 else
00863 generic_RC->NoGranularFieldRC = 0;
00864 }
00865 break;
00866 case RC_MODE_3:
00867 complexity = updateComplexity( prc, (Boolean) (img->type == P_SLICE), nbits );
00868 if (img->type == I_SLICE && (img->number != 0))
00869 generic_RC->NISlice--;
00870
00871 if ( img->type == P_SLICE )
00872 {
00873 if( generic_RC->NoGranularFieldRC == 0 || generic_RC->FieldControl == 0 )
00874 {
00875 updatePparams( prc, complexity );
00876 generic_RC->NPSlice--;
00877 }
00878 else
00879 generic_RC->NoGranularFieldRC = 0;
00880 }
00881 else if ( img->type == B_SLICE )
00882 {
00883 updateBparams( prc, complexity );
00884 generic_RC->hierNb[ params->HierarchicalCoding ? (generic_RC->temporal_levels - 1 - gop_structure[img->b_frame_to_code-1].hierarchy_layer) : 0 ]--;
00885 }
00886 break;
00887 }
00888 }
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898 void updateRCModel (rc_quadratic *prc)
00899 {
00900 int n_windowSize;
00901 int i;
00902 double std = 0.0, threshold;
00903 int m_Nc = prc->NumberofCodedPFrame;
00904 Boolean MADModelFlag = FALSE;
00905 static Boolean m_rgRejected[RC_MODEL_HISTORY];
00906 static double error [RC_MODEL_HISTORY];
00907
00908 if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
00909 {
00910
00911 if(img->BasicUnit == img->FrameSizeInMbs)
00912 {
00913 prc->CurrentFrameMAD = ComputeFrameMAD();
00914 m_Nc=prc->NumberofCodedPFrame;
00915 }
00916
00917 else
00918 {
00919
00920 prc->CurrentFrameMAD = (double) ((generic_RC->TotalMADBasicUnit >> 8)/img->BasicUnit);
00921 generic_RC->TotalMADBasicUnit=0;
00922
00923
00924 prc->CodedBasicUnit=prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit;
00925 if(prc->CodedBasicUnit > 0)
00926 {
00927 prc->PAveHeaderBits1=(int)((double)(prc->PAveHeaderBits1*(prc->CodedBasicUnit-1)+
00928 generic_RC->NumberofBasicUnitHeaderBits)/prc->CodedBasicUnit+0.5);
00929 if(prc->PAveHeaderBits3 == 0)
00930 prc->PAveHeaderBits2 = prc->PAveHeaderBits1;
00931 else
00932 {
00933 prc->PAveHeaderBits2 = (int)((double)(prc->PAveHeaderBits1 * prc->CodedBasicUnit+
00934 prc->PAveHeaderBits3 * prc->NumberofBasicUnit)/prc->TotalNumberofBasicUnit+0.5);
00935 }
00936 }
00937
00938 if ((prc->NumberofBasicUnit >= prc->TotalNumberofBasicUnit) || (prc->NumberofBasicUnit<0))
00939 {
00940 fprintf(stderr, "Write into invalid memory in updateRCModel at frame %d, prc->NumberofBasicUnit %d\n",
00941 img->framepoc, prc->NumberofBasicUnit);
00942 }
00943
00944
00945 if(((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) && (generic_RC->FieldControl == 1))
00946 prc->FCBUCFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit]=prc->CurrentFrameMAD;
00947 else
00948 prc->BUCFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit]=prc->CurrentFrameMAD;
00949
00950 if(prc->NumberofBasicUnit != 0)
00951 m_Nc = prc->NumberofCodedPFrame * prc->TotalNumberofBasicUnit + prc->CodedBasicUnit;
00952 else
00953 m_Nc = (prc->NumberofCodedPFrame-1) * prc->TotalNumberofBasicUnit + prc->CodedBasicUnit;
00954 }
00955
00956 if(m_Nc > 1)
00957 MADModelFlag=TRUE;
00958
00959 prc->PPreHeader = generic_RC->NumberofHeaderBits;
00960 for (i = (RC_MODEL_HISTORY-2); i > 0; i--)
00961 {
00962 prc->Pm_rgQp[i] = prc->Pm_rgQp[i - 1];
00963 prc->m_rgQp[i] = prc->Pm_rgQp[i];
00964 prc->Pm_rgRp[i] = prc->Pm_rgRp[i - 1];
00965 prc->m_rgRp[i] = prc->Pm_rgRp[i];
00966 }
00967 prc->Pm_rgQp[0] = QP2Qstep(prc->m_Qc);
00968
00969 if(img->BasicUnit == img->FrameSizeInMbs)
00970 prc->Pm_rgRp[0] = generic_RC->NumberofTextureBits*1.0/prc->CurrentFrameMAD;
00971
00972 else
00973 prc->Pm_rgRp[0] = generic_RC->NumberofBasicUnitTextureBits*1.0/prc->CurrentFrameMAD;
00974
00975 prc->m_rgQp[0] = prc->Pm_rgQp[0];
00976 prc->m_rgRp[0] = prc->Pm_rgRp[0];
00977 prc->m_X1 = prc->Pm_X1;
00978 prc->m_X2 = prc->Pm_X2;
00979
00980
00981 n_windowSize = (prc->CurrentFrameMAD>prc->PreviousFrameMAD)
00982 ? (int)(prc->PreviousFrameMAD/prc->CurrentFrameMAD * (RC_MODEL_HISTORY-1) )
00983 : (int)(prc->CurrentFrameMAD/prc->PreviousFrameMAD *(RC_MODEL_HISTORY-1));
00984 n_windowSize=iClip3(1, m_Nc, n_windowSize);
00985 n_windowSize=imin(n_windowSize,prc->m_windowSize+1);
00986 n_windowSize=imin(n_windowSize,(RC_MODEL_HISTORY-1));
00987
00988
00989 prc->m_windowSize=n_windowSize;
00990
00991 for (i = 0; i < (RC_MODEL_HISTORY-1); i++)
00992 {
00993 m_rgRejected[i] = FALSE;
00994 }
00995
00996
00997 RCModelEstimator (prc, n_windowSize, m_rgRejected);
00998
00999 n_windowSize = prc->m_windowSize;
01000
01001
01002 for (i = 0; i < (int) n_windowSize; i++)
01003 {
01004 error[i] = prc->m_X1 / prc->m_rgQp[i] + prc->m_X2 / (prc->m_rgQp[i] * prc->m_rgQp[i]) - prc->m_rgRp[i];
01005 std += error[i] * error[i];
01006 }
01007 threshold = (n_windowSize == 2) ? 0 : sqrt (std / n_windowSize);
01008 for (i = 0; i < (int) n_windowSize; i++)
01009 {
01010 if (fabs(error[i]) > threshold)
01011 m_rgRejected[i] = TRUE;
01012 }
01013
01014 m_rgRejected[0] = FALSE;
01015
01016
01017 RCModelEstimator (prc, n_windowSize, m_rgRejected);
01018
01019 if( MADModelFlag )
01020 updateMADModel(prc);
01021 else if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
01022 prc->PPictureMAD[0] = prc->CurrentFrameMAD;
01023 }
01024 }
01025
01026
01027
01028
01029
01030
01031
01032
01033 void RCModelEstimator (rc_quadratic *prc, int n_windowSize, Boolean *m_rgRejected)
01034 {
01035 int n_realSize = n_windowSize;
01036 int i;
01037 double oneSampleQ = 0;
01038 double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
01039 double MatrixValue;
01040 Boolean estimateX2 = FALSE;
01041
01042 for (i = 0; i < n_windowSize; i++)
01043 {
01044 if (m_rgRejected[i])
01045 n_realSize--;
01046 }
01047
01048
01049 prc->m_X1 = prc->m_X2 = 0.0;
01050
01051 for (i = 0; i < n_windowSize; i++)
01052 {
01053 if (!m_rgRejected[i])
01054 oneSampleQ = prc->m_rgQp[i];
01055 }
01056 for (i = 0; i < n_windowSize; i++)
01057 {
01058 if ((prc->m_rgQp[i] != oneSampleQ) && !m_rgRejected[i])
01059 estimateX2 = TRUE;
01060 if (!m_rgRejected[i])
01061 prc->m_X1 += (prc->m_rgQp[i] * prc->m_rgRp[i]) / n_realSize;
01062 }
01063
01064
01065 if ((n_realSize >= 1) && estimateX2)
01066 {
01067 for (i = 0; i < n_windowSize; i++)
01068 {
01069 if (!m_rgRejected[i])
01070 {
01071 a00 = a00 + 1.0;
01072 a01 += 1.0 / prc->m_rgQp[i];
01073 a10 = a01;
01074 a11 += 1.0 / (prc->m_rgQp[i] * prc->m_rgQp[i]);
01075 b0 += prc->m_rgQp[i] * prc->m_rgRp[i];
01076 b1 += prc->m_rgRp[i];
01077 }
01078 }
01079
01080 MatrixValue=a00*a11-a01*a10;
01081 if(fabs(MatrixValue) > 0.000001)
01082 {
01083 prc->m_X1 = (b0 * a11 - b1 * a01) / MatrixValue;
01084 prc->m_X2 = (b1 * a00 - b0 * a10) / MatrixValue;
01085 }
01086 else
01087 {
01088 prc->m_X1 = b0 / a00;
01089 prc->m_X2 = 0.0;
01090 }
01091 }
01092 if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
01093 {
01094 prc->Pm_X1 = prc->m_X1;
01095 prc->Pm_X2 = prc->m_X2;
01096 }
01097 }
01098
01099
01100
01101
01102
01103
01104
01105
01106 void updateMADModel (rc_quadratic *prc)
01107 {
01108 int n_windowSize;
01109 int i;
01110 double std = 0.0, threshold;
01111 int m_Nc = prc->NumberofCodedPFrame;
01112 static Boolean PictureRejected[RC_MODEL_HISTORY];
01113 static double error [RC_MODEL_HISTORY];
01114
01115 if(prc->NumberofCodedPFrame>0)
01116 {
01117
01118
01119 if(img->BasicUnit == img->FrameSizeInMbs)
01120 m_Nc = prc->NumberofCodedPFrame;
01121 else
01122 m_Nc=prc->NumberofCodedPFrame*prc->TotalNumberofBasicUnit+prc->CodedBasicUnit;
01123
01124 for (i = (RC_MODEL_HISTORY-2); i > 0; i--)
01125 {
01126 prc->PPictureMAD[i] = prc->PPictureMAD[i - 1];
01127 prc->PictureMAD[i] = prc->PPictureMAD[i];
01128 prc->ReferenceMAD[i] = prc->ReferenceMAD[i-1];
01129 }
01130 prc->PPictureMAD[0] = prc->CurrentFrameMAD;
01131 prc->PictureMAD[0] = prc->PPictureMAD[0];
01132
01133 if(img->BasicUnit == img->FrameSizeInMbs)
01134 prc->ReferenceMAD[0]=prc->PictureMAD[1];
01135 else
01136 {
01137 if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace)) &&(generic_RC->FieldControl==1))
01138 prc->ReferenceMAD[0]=prc->FCBUPFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit];
01139 else
01140 prc->ReferenceMAD[0]=prc->BUPFMAD[prc->TotalNumberofBasicUnit-1-prc->NumberofBasicUnit];
01141 }
01142 prc->MADPictureC1 = prc->PMADPictureC1;
01143 prc->MADPictureC2 = prc->PMADPictureC2;
01144
01145
01146 n_windowSize = (prc->CurrentFrameMAD > prc->PreviousFrameMAD)
01147 ? (int) ((float)(RC_MODEL_HISTORY-1) * prc->PreviousFrameMAD / prc->CurrentFrameMAD)
01148 : (int) ((float)(RC_MODEL_HISTORY-1) * prc->CurrentFrameMAD / prc->PreviousFrameMAD);
01149 n_windowSize = iClip3(1, (m_Nc-1), n_windowSize);
01150 n_windowSize=imin(n_windowSize, imin(20, prc->MADm_windowSize + 1));
01151
01152
01153 prc->MADm_windowSize=n_windowSize;
01154
01155 for (i = 0; i < (RC_MODEL_HISTORY-1); i++)
01156 {
01157 PictureRejected[i] = FALSE;
01158 }
01159
01160
01161 if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
01162 prc->PreviousFrameMAD=prc->CurrentFrameMAD;
01163
01164
01165 MADModelEstimator (prc, n_windowSize, PictureRejected);
01166
01167
01168 for (i = 0; i < n_windowSize; i++)
01169 {
01170 error[i] = prc->MADPictureC1 * prc->ReferenceMAD[i] + prc->MADPictureC2 - prc->PictureMAD[i];
01171 std += (error[i] * error[i]);
01172 }
01173
01174 threshold = (n_windowSize == 2) ? 0 : sqrt (std / n_windowSize);
01175 for (i = 0; i < n_windowSize; i++)
01176 {
01177 if (fabs(error[i]) > threshold)
01178 PictureRejected[i] = TRUE;
01179 }
01180
01181 PictureRejected[0] = FALSE;
01182
01183
01184 MADModelEstimator (prc, n_windowSize, PictureRejected);
01185 }
01186 }
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196 void MADModelEstimator (rc_quadratic *prc, int n_windowSize, Boolean *PictureRejected)
01197 {
01198 int n_realSize = n_windowSize;
01199 int i;
01200 double oneSampleQ = 0.0;
01201 double a00 = 0.0, a01 = 0.0, a10 = 0.0, a11 = 0.0, b0 = 0.0, b1 = 0.0;
01202 double MatrixValue;
01203 Boolean estimateX2 = FALSE;
01204
01205 for (i = 0; i < n_windowSize; i++)
01206 {
01207 if (PictureRejected[i])
01208 n_realSize--;
01209 }
01210
01211
01212 prc->MADPictureC1 = prc->MADPictureC2 = 0.0;
01213
01214 for (i = 0; i < n_windowSize; i++)
01215 {
01216 if (!PictureRejected[i])
01217 oneSampleQ = prc->PictureMAD[i];
01218 }
01219
01220 for (i = 0; i < n_windowSize; i++)
01221 {
01222 if ((prc->PictureMAD[i] != oneSampleQ) && !PictureRejected[i])
01223 estimateX2 = TRUE;
01224 if (!PictureRejected[i])
01225 prc->MADPictureC1 += prc->PictureMAD[i] / (prc->ReferenceMAD[i]*n_realSize);
01226 }
01227
01228
01229 if ((n_realSize >= 1) && estimateX2)
01230 {
01231 for (i = 0; i < n_windowSize; i++)
01232 {
01233 if (!PictureRejected[i])
01234 {
01235 a00 = a00 + 1.0;
01236 a01 += prc->ReferenceMAD[i];
01237 a10 = a01;
01238 a11 += prc->ReferenceMAD[i] * prc->ReferenceMAD[i];
01239 b0 += prc->PictureMAD[i];
01240 b1 += prc->PictureMAD[i] * prc->ReferenceMAD[i];
01241 }
01242 }
01243
01244 MatrixValue = a00 * a11 - a01 * a10;
01245 if(fabs(MatrixValue) > 0.000001)
01246 {
01247 prc->MADPictureC2 = (b0 * a11 - b1 * a01) / MatrixValue;
01248 prc->MADPictureC1 = (b1 * a00 - b0 * a10) / MatrixValue;
01249 }
01250 else
01251 {
01252 prc->MADPictureC1 = b0/a01;
01253 prc->MADPictureC2 = 0.0;
01254 }
01255 }
01256 if( img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && (img->number != 0)) )
01257 {
01258 prc->PMADPictureC1 = prc->MADPictureC1;
01259 prc->PMADPictureC2 = prc->MADPictureC2;
01260 }
01261 }
01262
01263
01264
01265
01266
01267
01268
01269
01270 int updateQPRC0(rc_quadratic *prc, int topfield)
01271 {
01272 int m_Bits;
01273 int BFrameNumber;
01274 int StepSize;
01275 int SumofBasicUnit;
01276 int MaxQpChange, m_Qp, m_Hp;
01277
01278
01279 if( img->BasicUnit == img->FrameSizeInMbs )
01280 {
01281
01282
01283
01284
01285 if((topfield) || (generic_RC->FieldControl==0))
01286 {
01287 if (img->type==I_SLICE)
01288 {
01289 prc->m_Qc = prc->MyInitialQp;
01290 return prc->m_Qc;
01291 }
01292 else if(img->type == B_SLICE)
01293 {
01294 if(params->NumberBFrames==1)
01295 {
01296 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01297 updateQPInterlace( prc );
01298
01299 prc->m_Qc = imin(prc->PrevLastQP, prc->CurrLastQP) + 2;
01300 prc->m_Qc = imax(prc->m_Qc, imax(prc->PrevLastQP, prc->CurrLastQP));
01301 prc->m_Qc = imax(prc->m_Qc, prc->CurrLastQP + 1);
01302 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01303 }
01304 else
01305 {
01306 BFrameNumber = (prc->NumberofBFrames + 1) % params->NumberBFrames;
01307 if(BFrameNumber==0)
01308 BFrameNumber = params->NumberBFrames;
01309
01310
01311 if(BFrameNumber==1)
01312 {
01313 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01314 updateQPInterlace( prc );
01315 }
01316
01317 if((prc->CurrLastQP-prc->PrevLastQP)<=(-2*params->NumberBFrames-3))
01318 StepSize=-3;
01319 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames-2))
01320 StepSize=-2;
01321 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames-1))
01322 StepSize=-1;
01323 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames))
01324 StepSize=0;
01325 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames+1))
01326 StepSize=1;
01327 else
01328 StepSize=2;
01329
01330 prc->m_Qc = prc->PrevLastQP + StepSize;
01331 prc->m_Qc += iClip3( -2 * (BFrameNumber - 1), 2*(BFrameNumber-1),
01332 (BFrameNumber-1)*(prc->CurrLastQP-prc->PrevLastQP)/(params->NumberBFrames-1));
01333 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01334 }
01335 return prc->m_Qc;
01336 }
01337 else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
01338 {
01339 prc->m_Qc=prc->MyInitialQp;
01340
01341 if(generic_RC->FieldControl==0)
01342 updateQPNonPicAFF( prc );
01343 return prc->m_Qc;
01344 }
01345 else
01346 {
01347
01348 if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
01349 updateQPInterlaceBU( prc );
01350
01351 prc->m_X1 = prc->Pm_X1;
01352 prc->m_X2 = prc->Pm_X2;
01353 prc->MADPictureC1 = prc->PMADPictureC1;
01354 prc->MADPictureC2 = prc->PMADPictureC2;
01355 prc->PreviousPictureMAD = prc->PPictureMAD[0];
01356
01357 MaxQpChange = prc->PMaxQpChange;
01358 m_Qp = prc->Pm_Qp;
01359 m_Hp = prc->PPreHeader;
01360
01361
01362 prc->CurrentFrameMAD = prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
01363
01364
01365 if(prc->Target < 0)
01366 {
01367 prc->m_Qc=m_Qp+MaxQpChange;
01368 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01369 }
01370 else
01371 {
01372 m_Bits = prc->Target-m_Hp;
01373 m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
01374
01375 updateModelQPFrame( prc, m_Bits );
01376
01377 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01378 prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc);
01379 }
01380
01381 if( generic_RC->FieldControl == 0 )
01382 updateQPNonPicAFF( prc );
01383
01384 return prc->m_Qc;
01385 }
01386 }
01387
01388 else
01389 {
01390 if( img->type == P_SLICE && generic_RC->NoGranularFieldRC == 0 )
01391 updateBottomField( prc );
01392 return prc->m_Qc;
01393 }
01394 }
01395
01396 else
01397 {
01398
01399 if (img->type == I_SLICE)
01400 {
01401 prc->m_Qc = prc->MyInitialQp;
01402 return prc->m_Qc;
01403 }
01404 else if( img->type == B_SLICE )
01405 {
01406
01407 if((topfield)||(generic_RC->FieldControl==0))
01408 {
01409 if(params->NumberBFrames==1)
01410 {
01411
01412 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01413 updateQPInterlace( prc );
01414
01415 if(prc->PrevLastQP==prc->CurrLastQP)
01416 prc->m_Qc=prc->PrevLastQP+2;
01417 else
01418 prc->m_Qc=(prc->PrevLastQP+prc->CurrLastQP)/2+1;
01419 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01420 }
01421 else
01422 {
01423 BFrameNumber=(prc->NumberofBFrames+1)%params->NumberBFrames;
01424 if(BFrameNumber==0)
01425 BFrameNumber=params->NumberBFrames;
01426
01427
01428 if(BFrameNumber==1)
01429 {
01430 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01431 updateQPInterlace( prc );
01432 }
01433
01434 if((prc->CurrLastQP-prc->PrevLastQP)<=(-2*params->NumberBFrames-3))
01435 StepSize=-3;
01436 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames-2))
01437 StepSize=-2;
01438 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames-1))
01439 StepSize=-1;
01440 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames))
01441 StepSize=0;
01442 else if((prc->CurrLastQP-prc->PrevLastQP)==(-2*params->NumberBFrames+1))
01443 StepSize=1;
01444 else
01445 StepSize=2;
01446 prc->m_Qc=prc->PrevLastQP+StepSize;
01447 prc->m_Qc +=
01448 iClip3( -2*(BFrameNumber-1), 2*(BFrameNumber-1), (BFrameNumber-1)*(prc->CurrLastQP-prc->PrevLastQP)/(params->NumberBFrames-1) );
01449 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01450 }
01451 return prc->m_Qc;
01452 }
01453
01454 else
01455 {
01456 return prc->m_Qc;
01457 }
01458 }
01459 else if( img->type == P_SLICE )
01460 {
01461 if( (generic_RC->NumberofGOP == 1) && (prc->NumberofPPicture == 0) )
01462 {
01463 if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
01464 return updateFirstP( prc, topfield );
01465 }
01466 else
01467 {
01468 prc->m_X1=prc->Pm_X1;
01469 prc->m_X2=prc->Pm_X2;
01470 prc->MADPictureC1=prc->PMADPictureC1;
01471 prc->MADPictureC2=prc->PMADPictureC2;
01472
01473 m_Qp=prc->Pm_Qp;
01474
01475 if(generic_RC->FieldControl==0)
01476 SumofBasicUnit=prc->TotalNumberofBasicUnit;
01477 else
01478 SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
01479
01480
01481 if(prc->NumberofBasicUnit==SumofBasicUnit)
01482 return updateFirstBU( prc, topfield );
01483 else
01484 {
01485
01486 prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
01487 generic_RC->NumberofBasicUnitHeaderBits = 0;
01488 generic_RC->NumberofBasicUnitTextureBits = 0;
01489 if(prc->Target<0)
01490 return updateNegativeTarget( prc, topfield, m_Qp );
01491 else
01492 {
01493
01494 predictCurrPicMAD( prc );
01495
01496
01497 updateModelQPBU( prc, topfield, m_Qp );
01498
01499 prc->TotalFrameQP +=prc->m_Qc;
01500 prc->Pm_Qp=prc->m_Qc;
01501 prc->NumberofBasicUnit--;
01502 if( prc->NumberofBasicUnit == 0 && img->type == P_SLICE )
01503 updateLastBU( prc, topfield );
01504
01505 return prc->m_Qc;
01506 }
01507 }
01508 }
01509 }
01510 }
01511 return prc->m_Qc;
01512 }
01513
01514
01515
01516
01517
01518
01519
01520
01521 int updateQPRC1(rc_quadratic *prc, int topfield)
01522 {
01523 int m_Bits;
01524 int SumofBasicUnit;
01525 int MaxQpChange, m_Qp, m_Hp;
01526
01527
01528 if( img->BasicUnit == img->FrameSizeInMbs )
01529 {
01530
01531
01532
01533
01534 if((topfield) || (generic_RC->FieldControl==0))
01535 {
01536 if (img->number == 0)
01537 {
01538 prc->m_Qc = prc->MyInitialQp;
01539 return prc->m_Qc;
01540 }
01541 else if( prc->NumberofPPicture == 0 && (img->number != 0))
01542 {
01543 prc->m_Qc=prc->MyInitialQp;
01544
01545 if(generic_RC->FieldControl==0)
01546 updateQPNonPicAFF( prc );
01547 return prc->m_Qc;
01548 }
01549 else
01550 {
01551
01552 if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
01553 updateQPInterlaceBU( prc );
01554
01555 prc->m_X1 = prc->Pm_X1;
01556 prc->m_X2 = prc->Pm_X2;
01557 prc->MADPictureC1 = prc->PMADPictureC1;
01558 prc->MADPictureC2 = prc->PMADPictureC2;
01559 prc->PreviousPictureMAD = prc->PPictureMAD[0];
01560
01561 MaxQpChange = prc->PMaxQpChange;
01562 m_Qp = prc->Pm_Qp;
01563 m_Hp = prc->PPreHeader;
01564
01565
01566 prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
01567
01568
01569 if(prc->Target < 0)
01570 {
01571 prc->m_Qc=m_Qp+MaxQpChange;
01572 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01573 }
01574 else
01575 {
01576 m_Bits = prc->Target-m_Hp;
01577 m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
01578
01579 updateModelQPFrame( prc, m_Bits );
01580
01581 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01582 prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc);
01583 }
01584
01585 if( generic_RC->FieldControl == 0 )
01586 updateQPNonPicAFF( prc );
01587
01588 return prc->m_Qc;
01589 }
01590 }
01591
01592 else
01593 {
01594 if( generic_RC->NoGranularFieldRC == 0 )
01595 updateBottomField( prc );
01596 return prc->m_Qc;
01597 }
01598 }
01599
01600 else
01601 {
01602
01603 if (img->number == 0)
01604 {
01605 prc->m_Qc = prc->MyInitialQp;
01606 return prc->m_Qc;
01607 }
01608 else
01609 {
01610 if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
01611 {
01612 if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
01613 return updateFirstP( prc, topfield );
01614 }
01615 else
01616 {
01617 prc->m_X1=prc->Pm_X1;
01618 prc->m_X2=prc->Pm_X2;
01619 prc->MADPictureC1=prc->PMADPictureC1;
01620 prc->MADPictureC2=prc->PMADPictureC2;
01621
01622 m_Qp=prc->Pm_Qp;
01623
01624 if(generic_RC->FieldControl==0)
01625 SumofBasicUnit=prc->TotalNumberofBasicUnit;
01626 else
01627 SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
01628
01629
01630 if(prc->NumberofBasicUnit==SumofBasicUnit)
01631 return updateFirstBU( prc, topfield );
01632 else
01633 {
01634
01635 prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
01636 generic_RC->NumberofBasicUnitHeaderBits = 0;
01637 generic_RC->NumberofBasicUnitTextureBits = 0;
01638 if(prc->Target<0)
01639 return updateNegativeTarget( prc, topfield, m_Qp );
01640 else
01641 {
01642
01643 predictCurrPicMAD( prc );
01644
01645
01646 updateModelQPBU( prc, topfield, m_Qp );
01647
01648 prc->TotalFrameQP +=prc->m_Qc;
01649 prc->Pm_Qp=prc->m_Qc;
01650 prc->NumberofBasicUnit--;
01651 if((prc->NumberofBasicUnit==0) && (img->number != 0))
01652 updateLastBU( prc, topfield );
01653
01654 return prc->m_Qc;
01655 }
01656 }
01657 }
01658 }
01659 }
01660 return prc->m_Qc;
01661 }
01662
01663
01664
01665
01666
01667
01668
01669
01670 int updateQPRC2(rc_quadratic *prc, int topfield)
01671 {
01672 int m_Bits;
01673 int SumofBasicUnit;
01674 int MaxQpChange, m_Qp, m_Hp;
01675
01676
01677 if( img->BasicUnit == img->FrameSizeInMbs )
01678 {
01679
01680
01681
01682
01683 if((topfield) || (generic_RC->FieldControl==0))
01684 {
01685 if (img->number == 0)
01686 {
01687 prc->m_Qc = prc->MyInitialQp;
01688 return prc->m_Qc;
01689 }
01690 else if (img->type==I_SLICE)
01691 {
01692 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01693 updateQPInterlace( prc );
01694
01695 prc->m_Qc = prc->CurrLastQP;
01696 return prc->m_Qc;
01697 }
01698 else if(img->type == B_SLICE)
01699 {
01700 int prevQP = imax(prc->PrevLastQP, prc->CurrLastQP);
01701
01702
01703 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01704 updateQPInterlace( prc );
01705
01706 if (params->HierarchicalCoding)
01707 {
01708 if (img->b_frame_to_code == 0)
01709 prc->m_Qc = prevQP;
01710 else
01711 prc->m_Qc = prevQP + img->GopLevels - gop_structure[img->b_frame_to_code-1].hierarchy_layer;
01712 }
01713 else
01714 prc->m_Qc = prevQP + 2 - img->nal_reference_idc;
01715 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01716
01717 return prc->m_Qc;
01718 }
01719 else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
01720 {
01721 prc->m_Qc=prc->MyInitialQp;
01722
01723 if(generic_RC->FieldControl==0)
01724 updateQPNonPicAFF( prc );
01725 return prc->m_Qc;
01726 }
01727 else
01728 {
01729
01730 if( ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
01731 updateQPInterlaceBU( prc );
01732
01733 prc->m_X1 = prc->Pm_X1;
01734 prc->m_X2 = prc->Pm_X2;
01735 prc->MADPictureC1 = prc->PMADPictureC1;
01736 prc->MADPictureC2 = prc->PMADPictureC2;
01737 prc->PreviousPictureMAD = prc->PPictureMAD[0];
01738
01739 MaxQpChange = prc->PMaxQpChange;
01740 m_Qp = prc->Pm_Qp;
01741 m_Hp = prc->PPreHeader;
01742
01743
01744 prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
01745
01746
01747 if(prc->Target < 0)
01748 {
01749 prc->m_Qc=m_Qp+MaxQpChange;
01750 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01751 }
01752 else
01753 {
01754 m_Bits = prc->Target-m_Hp;
01755 m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
01756
01757 updateModelQPFrame( prc, m_Bits );
01758
01759 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01760 prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc);
01761 }
01762
01763 if( generic_RC->FieldControl == 0 )
01764 updateQPNonPicAFF( prc );
01765
01766 return prc->m_Qc;
01767 }
01768 }
01769
01770 else
01771 {
01772 if( img->type==P_SLICE && generic_RC->NoGranularFieldRC == 0 )
01773 updateBottomField( prc );
01774 return prc->m_Qc;
01775 }
01776 }
01777
01778 else
01779 {
01780
01781 if (img->number == 0)
01782 {
01783 prc->m_Qc = prc->MyInitialQp;
01784 return prc->m_Qc;
01785 }
01786 else if (img->type==I_SLICE)
01787 {
01788
01789 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01790 updateQPInterlace( prc );
01791
01792 prc->m_Qc = prc->PrevLastQP;
01793 prc->PrevLastQP = prc->CurrLastQP;
01794 prc->CurrLastQP = prc->PrevLastQP;
01795 prc->PAveFrameQP = prc->CurrLastQP;
01796
01797 return prc->m_Qc;
01798 }
01799 else if(img->type == B_SLICE)
01800 {
01801 int prevQP = imax(prc->PrevLastQP, prc->CurrLastQP);
01802 if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
01803 updateQPInterlace( prc );
01804
01805 if (params->HierarchicalCoding)
01806 {
01807
01808 if (img->b_frame_to_code == 0)
01809 prc->m_Qc = prevQP;
01810 else
01811 prc->m_Qc = prevQP + img->GopLevels - gop_structure[img->b_frame_to_code-1].hierarchy_layer;
01812 }
01813 else
01814 prc->m_Qc = prevQP + 2 - img->nal_reference_idc;
01815 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01816
01817 return prc->m_Qc;
01818
01819 }
01820 else if( img->type == P_SLICE )
01821 {
01822 if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
01823 {
01824 if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
01825 return updateFirstP( prc, topfield );
01826 }
01827 else
01828 {
01829 prc->m_X1=prc->Pm_X1;
01830 prc->m_X2=prc->Pm_X2;
01831 prc->MADPictureC1=prc->PMADPictureC1;
01832 prc->MADPictureC2=prc->PMADPictureC2;
01833
01834 m_Qp=prc->Pm_Qp;
01835
01836 if(generic_RC->FieldControl==0)
01837 SumofBasicUnit=prc->TotalNumberofBasicUnit;
01838 else
01839 SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
01840
01841
01842 if(prc->NumberofBasicUnit==SumofBasicUnit)
01843 return updateFirstBU( prc, topfield );
01844 else
01845 {
01846
01847 prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
01848 generic_RC->NumberofBasicUnitHeaderBits = 0;
01849 generic_RC->NumberofBasicUnitTextureBits = 0;
01850 if(prc->Target<0)
01851 return updateNegativeTarget( prc, topfield, m_Qp );
01852 else
01853 {
01854
01855 predictCurrPicMAD( prc );
01856
01857
01858 updateModelQPBU( prc, topfield, m_Qp );
01859
01860 prc->TotalFrameQP +=prc->m_Qc;
01861 prc->Pm_Qp=prc->m_Qc;
01862 prc->NumberofBasicUnit--;
01863 if((prc->NumberofBasicUnit==0) && img->type == P_SLICE )
01864 updateLastBU( prc, topfield );
01865
01866 return prc->m_Qc;
01867 }
01868 }
01869 }
01870 }
01871 }
01872 return prc->m_Qc;
01873 }
01874
01875
01876
01877
01878
01879
01880
01881
01882 int updateQPRC3(rc_quadratic *prc, int topfield)
01883 {
01884 int m_Bits;
01885 int SumofBasicUnit;
01886 int MaxQpChange, m_Qp, m_Hp;
01887
01888
01889 if( img->BasicUnit == img->FrameSizeInMbs || img->type != P_SLICE )
01890 {
01891
01892
01893
01894
01895 if((topfield) || (generic_RC->FieldControl==0))
01896 {
01897 if (img->number == 0)
01898 {
01899 if((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace))
01900 updateQPInterlace( prc );
01901 prc->m_Qc = prc->MyInitialQp;
01902 return prc->m_Qc;
01903 }
01904 else if( img->type == P_SLICE && prc->NumberofPPicture == 0 )
01905 {
01906 prc->m_Qc=prc->MyInitialQp;
01907
01908 if(generic_RC->FieldControl==0)
01909 updateQPNonPicAFF( prc );
01910 return prc->m_Qc;
01911 }
01912 else
01913 {
01914 if( ( (img->type == B_SLICE && img->b_frame_to_code == 1) || img->type == I_SLICE) && ((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) )
01915 updateQPInterlace( prc );
01916
01917 if( img->type == P_SLICE && ( params->PicInterlace == ADAPTIVE_CODING || params->MbInterlace ) && generic_RC->FieldControl == 0 )
01918 updateQPInterlaceBU( prc );
01919
01920 prc->m_X1 = prc->Pm_X1;
01921 prc->m_X2 = prc->Pm_X2;
01922 prc->MADPictureC1 = prc->PMADPictureC1;
01923 prc->MADPictureC2 = prc->PMADPictureC2;
01924 prc->PreviousPictureMAD = prc->PPictureMAD[0];
01925
01926 MaxQpChange = prc->PMaxQpChange;
01927 m_Qp = prc->Pm_Qp;
01928 m_Hp = prc->PPreHeader;
01929
01930 if ( img->BasicUnit < img->FrameSizeInMbs && img->type != P_SLICE )
01931 {
01932
01933
01934
01935 prc->PreviousPictureMAD = prc->PreviousWholeFrameMAD;
01936 }
01937 if ( img->type == I_SLICE )
01938 m_Hp = 0;
01939
01940
01941 prc->CurrentFrameMAD=prc->MADPictureC1*prc->PreviousPictureMAD + prc->MADPictureC2;
01942
01943
01944 if(prc->Target < 0)
01945 {
01946 prc->m_Qc=m_Qp+MaxQpChange;
01947 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01948 }
01949 else
01950 {
01951 if ( img->type != P_SLICE )
01952 {
01953 if ( img->BasicUnit < img->FrameSizeInMbs )
01954 m_Bits =(prc->Target-m_Hp)/prc->TotalNumberofBasicUnit;
01955 else
01956 m_Bits =prc->Target-m_Hp;
01957 }
01958 else {
01959 m_Bits = prc->Target-m_Hp;
01960 m_Bits = imax(m_Bits, (int)(prc->bit_rate/(MINVALUE*prc->frame_rate)));
01961 }
01962 updateModelQPFrame( prc, m_Bits );
01963
01964 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01965 if ( img->type == P_SLICE )
01966 prc->m_Qc = iClip3(m_Qp-MaxQpChange, m_Qp+MaxQpChange, prc->m_Qc);
01967 }
01968
01969 if( img->type == P_SLICE && generic_RC->FieldControl == 0 )
01970 updateQPNonPicAFF( prc );
01971
01972 if ( img->type == B_SLICE )
01973 {
01974
01975 int prevqp = ((prc->PrevLastQP+prc->CurrLastQP) >> 1) + 1;
01976 if ( params->HierarchicalCoding && img->b_frame_to_code)
01977 prc->m_Qc -= gop_structure[img->b_frame_to_code-1].hierarchy_layer;
01978
01979 prc->m_Qc = iClip3(prevqp - (params->HierarchicalCoding ? 0 : 5), prevqp + 5, prc->m_Qc);
01980 prc->m_Qc = iClip3(img->RCMinQP, img->RCMaxQP, prc->m_Qc);
01981 }
01982 return prc->m_Qc;
01983 }
01984 }
01985
01986 else
01987 {
01988 if( img->type==P_SLICE && generic_RC->NoGranularFieldRC == 0 )
01989 updateBottomField( prc );
01990 return prc->m_Qc;
01991 }
01992 }
01993
01994 else
01995 {
01996
01997 if (img->number == 0)
01998 {
01999 if((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace))
02000 updateQPInterlace( prc );
02001 prc->m_Qc = prc->MyInitialQp;
02002 return prc->m_Qc;
02003 }
02004 else if( img->type == P_SLICE )
02005 {
02006 if((generic_RC->NumberofGOP==1)&&(prc->NumberofPPicture==0))
02007 {
02008 if((generic_RC->FieldControl==0)||((generic_RC->FieldControl==1) && (generic_RC->NoGranularFieldRC==0)))
02009 return updateFirstP( prc, topfield );
02010 }
02011 else
02012 {
02013 if( ( (img->type == B_SLICE && img->b_frame_to_code == 1) || img->type == I_SLICE) && ((params->PicInterlace == ADAPTIVE_CODING) || (params->MbInterlace)) )
02014 updateQPInterlace( prc );
02015 prc->m_X1=prc->Pm_X1;
02016 prc->m_X2=prc->Pm_X2;
02017 prc->MADPictureC1=prc->PMADPictureC1;
02018 prc->MADPictureC2=prc->PMADPictureC2;
02019
02020 m_Qp=prc->Pm_Qp;
02021
02022 if(generic_RC->FieldControl==0)
02023 SumofBasicUnit=prc->TotalNumberofBasicUnit;
02024 else
02025 SumofBasicUnit=prc->TotalNumberofBasicUnit>>1;
02026
02027
02028 if(prc->NumberofBasicUnit==SumofBasicUnit)
02029 return updateFirstBU( prc, topfield );
02030 else
02031 {
02032
02033 prc->Target -= (generic_RC->NumberofBasicUnitHeaderBits + generic_RC->NumberofBasicUnitTextureBits);
02034 generic_RC->NumberofBasicUnitHeaderBits = 0;
02035 generic_RC->NumberofBasicUnitTextureBits = 0;
02036 if(prc->Target<0)
02037 return updateNegativeTarget( prc, topfield, m_Qp );
02038 else
02039 {
02040
02041 predictCurrPicMAD( prc );
02042
02043
02044 updateModelQPBU( prc, topfield, m_Qp );
02045
02046 prc->TotalFrameQP +=prc->m_Qc;
02047 prc->Pm_Qp=prc->m_Qc;
02048 prc->NumberofBasicUnit--;
02049 if((prc->NumberofBasicUnit==0) && img->type == P_SLICE )
02050 updateLastBU( prc, topfield );
02051
02052 return prc->m_Qc;
02053 }
02054 }
02055 }
02056 }
02057 }
02058 return prc->m_Qc;
02059 }
02060
02061
02062
02063
02064
02065
02066
02067
02068 void updateQPInterlace( rc_quadratic *prc )
02069 {
02070 if(generic_RC->FieldControl==0)
02071 {
02072
02073 if(generic_RC->FieldFrame==1)
02074 {
02075 prc->PrevLastQP=prc->CurrLastQP;
02076 prc->CurrLastQP=prc->FrameQPBuffer;
02077 }
02078
02079 else
02080 {
02081 prc->PrevLastQP=prc->CurrLastQP;
02082 prc->CurrLastQP=prc->FieldQPBuffer;
02083 }
02084 }
02085 }
02086
02087
02088
02089
02090
02091
02092
02093
02094 void updateQPNonPicAFF( rc_quadratic *prc )
02095 {
02096 if(active_sps->frame_mbs_only_flag)
02097 {
02098 prc->TotalQpforPPicture +=prc->m_Qc;
02099 prc->PrevLastQP=prc->CurrLastQP;
02100 prc->CurrLastQP=prc->m_Qc;
02101 prc->Pm_Qp=prc->m_Qc;
02102 }
02103
02104 else
02105 prc->FrameQPBuffer=prc->m_Qc;
02106 }
02107
02108
02109
02110
02111
02112
02113
02114 void updateBottomField( rc_quadratic *prc )
02115 {
02116
02117 if(params->PicInterlace==FIELD_CODING)
02118 {
02119 prc->TotalQpforPPicture +=prc->m_Qc;
02120 prc->PrevLastQP=prc->CurrLastQP+1;
02121 prc->CurrLastQP=prc->m_Qc;
02122 prc->Pm_Qp=prc->m_Qc;
02123 }
02124
02125 else
02126 prc->FieldQPBuffer=prc->m_Qc;
02127 }
02128
02129
02130
02131
02132
02133
02134
02135 int updateFirstP( rc_quadratic *prc, int topfield )
02136 {
02137
02138 prc->m_Qc=prc->MyInitialQp;
02139 generic_RC->NumberofBasicUnitHeaderBits=0;
02140 generic_RC->NumberofBasicUnitTextureBits=0;
02141 prc->NumberofBasicUnit--;
02142
02143 if((!topfield)&&(prc->NumberofBasicUnit==0))
02144 {
02145
02146 if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
02147 {
02148 prc->TotalQpforPPicture +=prc->m_Qc;
02149 prc->PrevLastQP=prc->CurrLastQP;
02150 prc->CurrLastQP=prc->m_Qc;
02151 prc->PAveFrameQP=prc->m_Qc;
02152 prc->PAveHeaderBits3=prc->PAveHeaderBits2;
02153 }
02154
02155 else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
02156 {
02157 if(generic_RC->FieldControl==0)
02158 {
02159 prc->FrameQPBuffer=prc->m_Qc;
02160 prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
02161 }
02162 else
02163 {
02164 prc->FieldQPBuffer=prc->m_Qc;
02165 prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
02166 }
02167 }
02168 }
02169 prc->Pm_Qp=prc->m_Qc;
02170 prc->TotalFrameQP +=prc->m_Qc;
02171 return prc->m_Qc;
02172 }
02173
02174
02175
02176
02177
02178
02179
02180 int updateNegativeTarget( rc_quadratic *prc, int topfield, int m_Qp )
02181 {
02182 int PAverageQP;
02183
02184 if(prc->GOPOverdue==TRUE)
02185 prc->m_Qc=m_Qp+2;
02186 else
02187 prc->m_Qc=m_Qp+prc->DDquant;
02188
02189 prc->m_Qc = imin(prc->m_Qc, img->RCMaxQP);
02190 if(params->basicunit>=prc->MBPerRow)
02191 prc->m_Qc = imin(prc->m_Qc, prc->PAveFrameQP + 6);
02192 else
02193 prc->m_Qc = imin(prc->m_Qc, prc->PAveFrameQP + 3);
02194
02195 prc->TotalFrameQP +=prc->m_Qc;
02196 prc->NumberofBasicUnit--;
02197 if(prc->NumberofBasicUnit==0)
02198 {
02199 if((!topfield)||(generic_RC->FieldControl==0))
02200 {
02201
02202 if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
02203 {
02204 PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
02205 if (prc->NumberofPPicture == (params->intra_period - 2))
02206 prc->QPLastPFrame = PAverageQP;
02207
02208 prc->TotalQpforPPicture +=PAverageQP;
02209 if(prc->GOPOverdue==TRUE)
02210 {
02211 prc->PrevLastQP=prc->CurrLastQP+1;
02212 prc->CurrLastQP=PAverageQP;
02213 }
02214 else
02215 {
02216 if((prc->NumberofPPicture==0)&&(generic_RC->NumberofGOP>1))
02217 {
02218 prc->PrevLastQP=prc->CurrLastQP;
02219 prc->CurrLastQP=PAverageQP;
02220 }
02221 else if(prc->NumberofPPicture>0)
02222 {
02223 prc->PrevLastQP=prc->CurrLastQP+1;
02224 prc->CurrLastQP=PAverageQP;
02225 }
02226 }
02227 prc->PAveFrameQP=PAverageQP;
02228 prc->PAveHeaderBits3=prc->PAveHeaderBits2;
02229 }
02230
02231 else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
02232 {
02233 if(generic_RC->FieldControl==0)
02234 {
02235 PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
02236 prc->FrameQPBuffer=PAverageQP;
02237 prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
02238 }
02239 else
02240 {
02241 PAverageQP=(int)((double)prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
02242 prc->FieldQPBuffer=PAverageQP;
02243 prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
02244 }
02245 }
02246 }
02247 }
02248 if(prc->GOPOverdue==TRUE)
02249 prc->Pm_Qp=prc->PAveFrameQP;
02250 else
02251 prc->Pm_Qp=prc->m_Qc;
02252
02253 return prc->m_Qc;
02254 }
02255
02256
02257
02258
02259
02260
02261
02262 int updateFirstBU( rc_quadratic *prc, int topfield )
02263 {
02264
02265 if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==0))
02266 {
02267
02268 if(generic_RC->FieldFrame==1)
02269 {
02270 if(prc->NumberofPPicture>0)
02271 prc->TotalQpforPPicture +=prc->FrameQPBuffer;
02272 prc->PAveFrameQP=prc->FrameQPBuffer;
02273 prc->PAveHeaderBits3=prc->FrameAveHeaderBits;
02274 }
02275
02276 else
02277 {
02278 if(prc->NumberofPPicture>0)
02279 prc->TotalQpforPPicture +=prc->FieldQPBuffer;
02280 prc->PAveFrameQP=prc->FieldQPBuffer;
02281 prc->PAveHeaderBits3=prc->FieldAveHeaderBits;
02282 }
02283 }
02284
02285 if(prc->Target<=0)
02286 {
02287 prc->m_Qc = prc->PAveFrameQP + 2;
02288 if(prc->m_Qc > img->RCMaxQP)
02289 prc->m_Qc = img->RCMaxQP;
02290
02291 if(topfield||(generic_RC->FieldControl==0))
02292 prc->GOPOverdue=TRUE;
02293 }
02294 else
02295 {
02296 prc->m_Qc=prc->PAveFrameQP;
02297 }
02298 prc->TotalFrameQP +=prc->m_Qc;
02299 prc->NumberofBasicUnit--;
02300 prc->Pm_Qp = prc->PAveFrameQP;
02301
02302 return prc->m_Qc;
02303 }
02304
02305
02306
02307
02308
02309
02310
02311 void updateLastBU( rc_quadratic *prc, int topfield )
02312 {
02313 int PAverageQP;
02314
02315 if((!topfield)||(generic_RC->FieldControl==0))
02316 {
02317
02318 if((active_sps->frame_mbs_only_flag)||(params->PicInterlace==FIELD_CODING))
02319 {
02320 PAverageQP=(int)((double)prc->TotalFrameQP/(double) prc->TotalNumberofBasicUnit+0.5);
02321 if (prc->NumberofPPicture == (params->intra_period - 2))
02322 prc->QPLastPFrame = PAverageQP;
02323
02324 prc->TotalQpforPPicture +=PAverageQP;
02325 prc->PrevLastQP=prc->CurrLastQP;
02326 prc->CurrLastQP=PAverageQP;
02327 prc->PAveFrameQP=PAverageQP;
02328 prc->PAveHeaderBits3=prc->PAveHeaderBits2;
02329 }
02330 else if((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))
02331 {
02332 if(generic_RC->FieldControl==0)
02333 {
02334 PAverageQP=(int)((double) prc->TotalFrameQP/(double)prc->TotalNumberofBasicUnit+0.5);
02335 prc->FrameQPBuffer=PAverageQP;
02336 prc->FrameAveHeaderBits=prc->PAveHeaderBits2;
02337 }
02338 else
02339 {
02340 PAverageQP=(int)((double) prc->TotalFrameQP/(double) prc->TotalNumberofBasicUnit+0.5);
02341 prc->FieldQPBuffer=PAverageQP;
02342 prc->FieldAveHeaderBits=prc->PAveHeaderBits2;
02343 }
02344 }
02345 }
02346 }
02347
02348
02349
02350
02351
02352
02353
02354 void predictCurrPicMAD( rc_quadratic *prc )
02355 {
02356 int i;
02357 if(((params->PicInterlace==ADAPTIVE_CODING)||(params->MbInterlace))&&(generic_RC->FieldControl==1))
02358 {
02359 prc->CurrentFrameMAD=prc->MADPictureC1*prc->FCBUPFMAD[prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit]+prc->MADPictureC2;
02360 prc->TotalBUMAD=0;
02361 for(i=prc->TotalNumberofBasicUnit-1; i>=(prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit);i--)
02362 {
02363 prc->CurrentBUMAD=prc->MADPictureC1*prc->FCBUPFMAD[i]+prc->MADPictureC2;
02364 prc->TotalBUMAD +=prc->CurrentBUMAD*prc->CurrentBUMAD;
02365 }
02366 }
02367 else
02368 {
02369 prc->CurrentFrameMAD=prc->MADPictureC1*prc->BUPFMAD[prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit]+prc->MADPictureC2;
02370 prc->TotalBUMAD=0;
02371 for(i=prc->TotalNumberofBasicUnit-1; i>=(prc->TotalNumberofBasicUnit-prc->NumberofBasicUnit);i--)
02372 {
02373 prc->CurrentBUMAD=prc->MADPictureC1*prc->BUPFMAD[i]+prc->MADPictureC2;
02374 prc->TotalBUMAD +=prc->CurrentBUMAD*prc->CurrentBUMAD;
02375 }
02376 }
02377 }
02378
02379
02380
02381
02382
02383
02384
02385 void updateModelQPBU( rc_quadratic *prc, int topfield, int m_Qp )
02386 {
02387 double dtmp, m_Qstep;
02388 int m_Bits;
02389
02390 m_Bits =(int)(prc->Target * prc->CurrentFrameMAD * prc->CurrentFrameMAD / prc->TotalBUMAD);
02391
02392 m_Bits -=prc->PAveHeaderBits2;
02393
02394 m_Bits=imax(m_Bits,(int)(prc->bit_rate/(MINVALUE*prc->frame_rate*prc->TotalNumberofBasicUnit)));
02395
02396 dtmp = prc->CurrentFrameMAD * prc->CurrentFrameMAD * prc->m_X1 * prc->m_X1 \
02397 + 4 * prc->m_X2 * prc->CurrentFrameMAD * m_Bits;
02398 if ((prc->m_X2 == 0.0) || (dtmp < 0) || ((sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD) <= 0.0))
02399 m_Qstep = (float)(prc->m_X1 * prc->CurrentFrameMAD / (double) m_Bits);
02400 else
02401 m_Qstep = (float) ((2 * prc->m_X2 * prc->CurrentFrameMAD) / (sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD));
02402
02403 prc->m_Qc = Qstep2QP(m_Qstep);
02404 prc->m_Qc = imin(m_Qp+prc->DDquant, prc->m_Qc);
02405
02406 if(params->basicunit>=prc->MBPerRow)
02407 prc->m_Qc = imin(prc->PAveFrameQP+6, prc->m_Qc);
02408 else
02409 prc->m_Qc = imin(prc->PAveFrameQP+3, prc->m_Qc);
02410
02411 prc->m_Qc = iClip3(m_Qp-prc->DDquant, img->RCMaxQP, prc->m_Qc);
02412 if(params->basicunit>=prc->MBPerRow)
02413 prc->m_Qc = imax(prc->PAveFrameQP-6, prc->m_Qc);
02414 else
02415 prc->m_Qc = imax(prc->PAveFrameQP-3, prc->m_Qc);
02416
02417 prc->m_Qc = imax(img->RCMinQP, prc->m_Qc);
02418 }
02419
02420
02421
02422
02423
02424
02425
02426 void updateQPInterlaceBU( rc_quadratic *prc )
02427 {
02428
02429 if(generic_RC->FieldFrame==1)
02430 {
02431 prc->TotalQpforPPicture +=prc->FrameQPBuffer;
02432 prc->Pm_Qp=prc->FrameQPBuffer;
02433 }
02434
02435 else
02436 {
02437 prc->TotalQpforPPicture +=prc->FieldQPBuffer;
02438 prc->Pm_Qp=prc->FieldQPBuffer;
02439 }
02440 }
02441
02442
02443
02444
02445
02446
02447
02448 void updateModelQPFrame( rc_quadratic *prc, int m_Bits )
02449 {
02450 double dtmp, m_Qstep;
02451
02452 dtmp = prc->CurrentFrameMAD * prc->m_X1 * prc->CurrentFrameMAD * prc->m_X1
02453 + 4 * prc->m_X2 * prc->CurrentFrameMAD * m_Bits;
02454 if ((prc->m_X2 == 0.0) || (dtmp < 0) || ((sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD) <= 0.0))
02455 m_Qstep = (float) (prc->m_X1 * prc->CurrentFrameMAD / (double) m_Bits);
02456 else
02457 m_Qstep = (float) ((2 * prc->m_X2 * prc->CurrentFrameMAD) / (sqrt (dtmp) - prc->m_X1 * prc->CurrentFrameMAD));
02458
02459 prc->m_Qc = Qstep2QP(m_Qstep);
02460 }
02461
02462
02463
02464
02465
02466
02467
02468 int rc_handle_mb( int prev_mb, Macroblock *currMB, Slice *currSlice )
02469 {
02470 int mb_qp = img->qp;
02471 Macroblock *prevMB = currMB->PrevMB;
02472
02473 if (prev_mb > -1)
02474 {
02475 if ( params->MbInterlace == ADAPTIVE_CODING && !img->bot_MB && currMB->mb_field )
02476 mb_qp = prevMB->qp;
02477 }
02478
02479
02480 if (params->basicunit != img->FrameSizeInMbs)
02481 {
02482
02483 if ( ((img->type == I_SLICE || img->type == B_SLICE) && params->RCUpdateMode != RC_MODE_1 ) || !(img->number) )
02484 {
02485 return mb_qp;
02486 }
02487 else if ( img->type == P_SLICE || params->RCUpdateMode == RC_MODE_1 )
02488 {
02489 if (!img->write_macroblock)
02490 {
02491 if (prev_mb > -1)
02492 {
02493 if (!((params->MbInterlace) && img->bot_MB))
02494 {
02495 if (prevMB->prev_cbp != 1)
02496 {
02497 mb_qp = prevMB->prev_qp;
02498 }
02499 }
02500 }
02501 }
02502
02503
02504
02505 if (!img->write_macroblock)
02506 {
02507 if(!((params->MbInterlace) && img->bot_MB))
02508 {
02509 if(params->RCUpdateMode <= MAX_RC_MODE && (img->NumberofCodedMacroBlocks > 0) && (img->NumberofCodedMacroBlocks % img->BasicUnit == 0))
02510 {
02511 updateRCModel(quadratic_RC);
02512
02513 if(active_sps->frame_mbs_only_flag)
02514 {
02515 img->BasicUnitQP = updateQP(quadratic_RC, generic_RC->TopFieldFlag);
02516
02517 }
02518
02519 else if(params->MbInterlace || ((params->PicInterlace!=FRAME_CODING) && (generic_RC->NoGranularFieldRC==0)))
02520 {
02521 img->BasicUnitQP = updateQP(quadratic_RC, generic_RC->TopFieldFlag);
02522 }
02523 }
02524
02525 if(img->current_mb_nr==0)
02526 img->BasicUnitQP = mb_qp;
02527
02528
02529 mb_qp = img->BasicUnitQP;
02530 mb_qp = iClip3(-img->bitdepth_luma_qp_scale, 51, mb_qp);
02531 }
02532 }
02533 }
02534 }
02535 return mb_qp;
02536 }
02537
02538
02539
02540
02541
02542
02543
02544 void rc_init_top_field ( void )
02545 {
02546 img->BasicUnit = params->basicunit;
02547 generic_RC->TopFieldFlag = 1;
02548 rc_init_pict_ptr(quadratic_RC, 0, 1, (params->PicInterlace == FIELD_CODING), 1.0F);
02549 img->qp = updateQP(quadratic_RC, 1);
02550 }
02551
02552
02553
02554
02555
02556
02557
02558 void rc_init_bottom_field ( int TopFieldBits )
02559 {
02560 quadratic_RC->bits_topfield = TopFieldBits;
02561 generic_RC->TopFieldFlag = 0;
02562 rc_init_pict_ptr(quadratic_RC, 0,0,0, 1.0F);
02563 img->qp = updateQP(quadratic_RC, 0);
02564 }
02565
02566
02567
02568
02569
02570
02571
02572 void rc_init_frame_rdpic( float rateRatio )
02573 {
02574 switch (params->RCUpdateMode)
02575 {
02576 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02577
02578 rc_copy_quadratic( quadratic_RC, quadratic_RC_init );
02579 rc_copy_generic( generic_RC, generic_RC_init );
02580 rc_init_pict_ptr(quadratic_RC, 1,0,1, rateRatio );
02581 img->qp = updateQP(quadratic_RC, 0);
02582 break;
02583 default:
02584 break;
02585 }
02586 }
02587
02588
02589
02590
02591
02592
02593
02594 void rc_allocate_memory( void )
02595 {
02596 switch (params->RCUpdateMode)
02597 {
02598 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02599 rc_alloc_generic( &generic_RC );
02600 rc_alloc_quadratic( &quadratic_RC );
02601 if ( params->RDPictureDecision || params->MbInterlace == ADAPTIVE_CODING )
02602 {
02603 rc_alloc_generic( &generic_RC_init );
02604 rc_alloc_quadratic( &quadratic_RC_init );
02605 rc_alloc_generic( &generic_RC_best );
02606 rc_alloc_quadratic( &quadratic_RC_best );
02607 }
02608 break;
02609 default:
02610 break;
02611 }
02612 }
02613
02614
02615
02616
02617
02618
02619
02620 void rc_free_memory( void )
02621 {
02622 switch (params->RCUpdateMode)
02623 {
02624 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02625 rc_free_generic( &generic_RC );
02626 rc_free_quadratic( &quadratic_RC );
02627
02628 if ( params->RDPictureDecision || params->MbInterlace == ADAPTIVE_CODING )
02629 {
02630 rc_free_generic( &generic_RC_init );
02631 rc_free_quadratic( &quadratic_RC_init );
02632 rc_free_generic( &generic_RC_best );
02633 rc_free_quadratic( &quadratic_RC_best );
02634 }
02635 break;
02636 default:
02637 break;
02638 }
02639 }
02640
02641
02642
02643
02644
02645
02646
02647 void rc_update_mb_stats( Macroblock *currMB, int *bitCount )
02648 {
02649
02650 img->NumberofMBHeaderBits = bitCount[BITS_MB_MODE] + bitCount[BITS_INTER_MB]
02651 + bitCount[BITS_CBP_MB ] + bitCount[BITS_DELTA_QUANT_MB];
02652 img->NumberofMBTextureBits = bitCount[BITS_COEFF_Y_MB]+ bitCount[BITS_COEFF_UV_MB];
02653
02654 switch (params->RCUpdateMode)
02655 {
02656 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02657 generic_RC->NumberofTextureBits += img->NumberofMBTextureBits;
02658 generic_RC->NumberofHeaderBits += img->NumberofMBHeaderBits;
02659
02660 if(img->BasicUnit < img->FrameSizeInMbs)
02661 {
02662 generic_RC->NumberofBasicUnitHeaderBits += img->NumberofMBHeaderBits;
02663 generic_RC->NumberofBasicUnitTextureBits += img->NumberofMBTextureBits;
02664 }
02665 break;
02666 default:
02667 break;
02668 }
02669 }
02670
02671
02672
02673
02674
02675
02676
02677 void rc_save_state( void )
02678 {
02679 switch (params->RCUpdateMode)
02680 {
02681 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02682 rc_copy_quadratic( quadratic_RC_best, quadratic_RC );
02683 rc_copy_generic( generic_RC_best, generic_RC );
02684 break;
02685 default:
02686 break;
02687 }
02688 }
02689
02690
02691
02692
02693
02694
02695
02696 void rc_restore_state( void )
02697 {
02698 switch (params->RCUpdateMode)
02699 {
02700 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
02701 rc_copy_quadratic( quadratic_RC, quadratic_RC_best );
02702 rc_copy_generic( generic_RC, generic_RC_best );
02703 break;
02704 default:
02705 break;
02706 }
02707 }