00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <math.h>
00020 #include <limits.h>
00021
00022 #include "global.h"
00023 #include "ratectl.h"
00024
00025 int diffy[16][16];
00026
00027
00028
00029
00030
00031
00032
00033 void rc_store_mad(Macroblock *currMB)
00034 {
00035 generic_RC->MADofMB[img->current_mb_nr] = ComputeMBMAD();
00036
00037 if(params->basicunit < img->FrameSizeInMbs)
00038 {
00039 generic_RC->TotalMADBasicUnit += generic_RC->MADofMB[img->current_mb_nr];
00040 }
00041 }
00042
00043
00044
00045
00046
00047
00048
00049
00050 double QP2Qstep( int QP )
00051 {
00052 int i;
00053 double Qstep;
00054 static const double QP2QSTEP[6] = { 0.625, 0.6875, 0.8125, 0.875, 1.0, 1.125 };
00055
00056 Qstep = QP2QSTEP[QP % 6];
00057 for( i=0; i<(QP/6); i++)
00058 Qstep *= 2;
00059
00060 return Qstep;
00061 }
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071 int Qstep2QP( double Qstep )
00072 {
00073 int q_per = 0, q_rem = 0;
00074
00075
00076 if( Qstep < QP2Qstep(0))
00077 return 0;
00078 else if (Qstep > QP2Qstep(51) )
00079 return 51;
00080
00081 while( Qstep > QP2Qstep(5) )
00082 {
00083 Qstep /= 2.0;
00084 q_per += 1;
00085 }
00086
00087 if (Qstep <= 0.65625)
00088 {
00089 Qstep = 0.625;
00090 q_rem = 0;
00091 }
00092 else if (Qstep <= 0.75)
00093 {
00094 Qstep = 0.6875;
00095 q_rem = 1;
00096 }
00097 else if (Qstep <= 0.84375)
00098 {
00099 Qstep = 0.8125;
00100 q_rem = 2;
00101 }
00102 else if (Qstep <= 0.9375)
00103 {
00104 Qstep = 0.875;
00105 q_rem = 3;
00106 }
00107 else if (Qstep <= 1.0625)
00108 {
00109 Qstep = 1.0;
00110 q_rem = 4;
00111 }
00112 else
00113 {
00114 Qstep = 1.125;
00115 q_rem = 5;
00116 }
00117
00118 return (q_per * 6 + q_rem);
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 int ComputeMBMAD()
00132 {
00133 int k, l, sum = 0;
00134
00135 for (k = 0; k < 16; k++)
00136 for (l = 0; l < 16; l++)
00137 sum += iabs(diffy[k][l]);
00138
00139 return sum;
00140 }
00141
00142
00143
00144
00145
00146
00147
00148
00149 double ComputeFrameMAD()
00150 {
00151 int64 TotalMAD = 0;
00152 unsigned int i;
00153 for(i = 0; i < img->FrameSizeInMbs; i++)
00154 TotalMAD += generic_RC->MADofMB[i];
00155 return (double)TotalMAD / (256.0 * (double)img->FrameSizeInMbs);
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166 void rc_copy_generic( rc_generic *dst, rc_generic *src )
00167 {
00168
00169 int *tmpMADofMB = dst->MADofMB;
00170
00171
00172
00173
00174 memcpy( (void *)dst, (void *)src, sizeof(rc_generic) );
00175
00176
00177 dst->MADofMB = tmpMADofMB;
00178
00179
00180 memcpy( (void *)dst->MADofMB, (void *)src->MADofMB, img->FrameSizeInMbs * sizeof (int) );
00181 }
00182
00183
00184
00185
00186
00187
00188
00189
00190 void rc_alloc_generic( rc_generic **prc )
00191 {
00192 *prc = (rc_generic *) malloc ( sizeof( rc_generic ) );
00193 if (NULL == *prc)
00194 {
00195 no_mem_exit("init_global_buffers: rc_alloc_generic");
00196 }
00197 (*prc)->MADofMB = (int *) calloc (img->FrameSizeInMbs, sizeof (int));
00198 if (NULL == (*prc)->MADofMB)
00199 {
00200 no_mem_exit("init_global_buffers: (*prc)->MADofMB");
00201 }
00202 (*prc)->FieldFrame = 1;
00203 }
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213 void rc_free_generic(rc_generic **prc)
00214 {
00215 if (NULL!=(*prc)->MADofMB)
00216 {
00217 free ((*prc)->MADofMB);
00218 (*prc)->MADofMB = NULL;
00219 }
00220 if (NULL!=(*prc))
00221 {
00222 free ((*prc));
00223 (*prc) = NULL;
00224 }
00225 }
00226
00227
00228
00229
00230
00231
00232
00233
00234 void rc_init_gop_params(void)
00235 {
00236 int np, nb;
00237
00238 switch( params->RCUpdateMode )
00239 {
00240 case RC_MODE_1: case RC_MODE_3:
00241 if ( !(img->number) )
00242 {
00243
00244 np = params->no_frm_base - 1;
00245
00246 nb = np * params->NumberBFrames;
00247
00248 rc_init_GOP(quadratic_RC, np, nb);
00249 }
00250 break;
00251 case RC_MODE_0: case RC_MODE_2:
00252 if (params->idr_period == 0)
00253 {
00254 if ( !(img->number) )
00255 {
00256
00257 np = params->no_frm_base - 1;
00258
00259 nb = np * params->NumberBFrames;
00260 rc_init_GOP(quadratic_RC, np, nb);
00261 }
00262 }
00263 else if ( (!params->adaptive_idr_period && ( img->frm_number - img->lastIDRnumber ) % params->idr_period == 0)
00264 || (params->adaptive_idr_period == 1 && ( img->frm_number - imax(img->lastIntraNumber, img->lastIDRnumber) ) % params->idr_period == 0) )
00265 {
00266 int M = params->NumberBFrames + 1;
00267 int N = M * params->idr_period;
00268 int n = (img->number == 0) ? N - ( M - 1) : N;
00269
00270
00271 if ((img->number / params->idr_period) >= (params->no_frm_base / params->idr_period))
00272 {
00273 if (img->number != 0)
00274 n = (params->no_frm_base - img->number) * (params->NumberBFrames + 1);
00275 else
00276 n = params->no_frm_base + (params->no_frm_base - 1) * params->NumberBFrames;
00277 }
00278
00279
00280 np = (img->number == 0) ? 1 + ((n - 2) / M) : (n - 1) / M;
00281
00282 nb = n - np - 1;
00283 rc_init_GOP(quadratic_RC, np, nb);
00284 }
00285 break;
00286 default:
00287 break;
00288 }
00289 }
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299 void rc_init_frame(int FrameNumberInFile)
00300 {
00301 switch( params->RCUpdateMode )
00302 {
00303 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
00304
00305
00306 if( (params->MbInterlace) && (params->basicunit < img->FrameSizeInMbs) && (img->type == P_SLICE || (params->RCUpdateMode == RC_MODE_1 && img->number) ) )
00307 img->BasicUnit = params->basicunit << 1;
00308 else
00309 img->BasicUnit = params->basicunit;
00310
00311 if ( params->RDPictureDecision )
00312 {
00313 rc_copy_quadratic( quadratic_RC_init, quadratic_RC );
00314 rc_copy_generic( generic_RC_init, generic_RC );
00315 }
00316 rc_init_pict_ptr(quadratic_RC, 1,0,1, 1.0F);
00317
00318 if( active_sps->frame_mbs_only_flag)
00319 generic_RC->TopFieldFlag=0;
00320
00321 img->qp = updateQP(quadratic_RC, 0);
00322 break;
00323 default:
00324 break;
00325 }
00326 }
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 void rc_init_sequence(void)
00337 {
00338 switch( params->RCUpdateMode )
00339 {
00340 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
00341 rc_init_seq(quadratic_RC);
00342 break;
00343 default:
00344 break;
00345 }
00346 }
00347
00348 void rc_store_slice_header_bits( int len )
00349 {
00350 switch (params->RCUpdateMode)
00351 {
00352 case RC_MODE_0: case RC_MODE_1: case RC_MODE_2: case RC_MODE_3:
00353 generic_RC->NumberofHeaderBits +=len;
00354
00355
00356 if(img->BasicUnit < img->FrameSizeInMbs)
00357 generic_RC->NumberofBasicUnitHeaderBits +=len;
00358 break;
00359 default:
00360 break;
00361 }
00362 }
00363
00364
00365
00366
00367
00368
00369
00370
00371 void rc_store_diff(int cpix_x, int cpix_y, imgpel **prediction)
00372 {
00373 int i, j;
00374 int *iDst;
00375 imgpel *Src1, *Src2;
00376
00377 for(j = 0; j < MB_BLOCK_SIZE; j++)
00378 {
00379 iDst = diffy[j];
00380 Src1 = &pCurImg[cpix_y + j][cpix_x];
00381 Src2 = prediction[j];
00382 for (i = 0; i < MB_BLOCK_SIZE; i++)
00383 {
00384 iDst[i] = Src1[i] - Src2[i];
00385 }
00386 }
00387 }
00388