1 /* ------------------------------------------------------------------ 2 * Copyright (C) 1998-2009 PacketVideo 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13 * express or implied. 14 * See the License for the specific language governing permissions 15 * and limitations under the License. 16 * ------------------------------------------------------------------- 17 */ 18 #include "mp4def.h" 19 #include "mp4lib_int.h" 20 #include "rate_control.h" 21 #include "mp4enc_lib.h" 22 #include "bitstream_io.h" 23 #include "m4venc_oscl.h" 24 25 void targetBitCalculation(void *input); 26 void calculateQuantizer_Multipass(void *video); 27 void updateRateControl(rateControl *rc, VideoEncData *video); 28 void updateRC_PostProc(rateControl *rc, VideoEncData *video); 29 30 /*************************************************************************** 31 ************** RC APIs to core encoding modules ******************* 32 33 PV_STATUS RC_Initialize(void *video); 34 PV_STATUS RC_Cleanup(rateControl *rc[],Int numLayers); 35 PV_STATUS RC_VopQPSetting(VideoEncData *video,rateControl *rc[]); 36 PV_STATUS RC_VopUpdateStat(VideoEncData *video,rateControl *rc[]); 37 PV_STATUS RC_UpdateBuffer(VideoEncData *video, Int currLayer, Int num_skip); 38 Int RC_GetSkipNextFrame(VideoEncData *video,Int currLayer); 39 void RC_ResetSkipNextFrame(void *video,Int currLayer); 40 41 PV_STATUS RC_UpdateBXRCParams(void *input); Parameters update for target bitrate or framerate change 42 43 ****************************************************************************/ 44 45 46 /************************************************************************/ 47 /************ API part **************************************************/ 48 /* must be called before each sequence*/ 49 50 PV_STATUS RC_Initialize(void *input) 51 { 52 VideoEncData *video = (VideoEncData *) input; 53 VideoEncParams *encParams = video->encParams; 54 rateControl **rc = video->rc; 55 Int numLayers = encParams->nLayers; 56 Int *LayerBitRate = encParams->LayerBitRate; 57 float *LayerFrameRate = encParams->LayerFrameRate; 58 MultiPass **pMP = video->pMP; 59 60 Int n; 61 62 for (n = 0; n < numLayers; n++) 63 { 64 /* rate control */ 65 rc[n]->fine_frame_skip = encParams->FineFrameSkip_Enabled; 66 rc[n]->no_frame_skip = encParams->NoFrameSkip_Enabled; 67 rc[n]->no_pre_skip = encParams->NoPreSkip_Enabled; 68 rc[n]->skip_next_frame = 0; /* must be initialized */ 69 70 //rc[n]->TMN_TH = (Int)((float)LayerBitRate[n]/LayerFrameRate[n]); 71 rc[n]->Bs = video->encParams->BufferSize[n]; 72 rc[n]->TMN_W = 0; 73 rc[n]->VBV_fullness = (Int)(rc[n]->Bs * 0.5); /* rc[n]->Bs */ 74 rc[n]->encoded_frames = 0; 75 rc[n]->framerate = LayerFrameRate[n]; 76 if (n == 0) 77 { 78 rc[n]->TMN_TH = (Int)((float)LayerBitRate[n] / LayerFrameRate[n]); 79 rc[n]->bitrate = LayerBitRate[n]; 80 rc[n]->framerate = LayerFrameRate[n]; 81 82 // For h263 or short header mode, the bit variation is within (-2*Rmax*1001/3000, 2*Rmax*1001/3000) 83 if (video->encParams->H263_Enabled) 84 { 85 rc[n]->max_BitVariance_num = (Int)((rc[n]->Bs - video->encParams->maxFrameSize) / 2 / (rc[n]->bitrate / rc[n]->framerate / 10.0)) - 5; 86 if (rc[n]->max_BitVariance_num < 0) rc[n]->max_BitVariance_num += 5; 87 } 88 else // MPEG-4 normal modes 89 { 90 rc[n]->max_BitVariance_num = (Int)((float)(rc[n]->Bs - rc[n]->VBV_fullness) / ((float)LayerBitRate[n] / LayerFrameRate[n] / 10.0)) - 5; 91 if (rc[n]->max_BitVariance_num < 0) rc[n]->max_BitVariance_num += 5; 92 } 93 } 94 else 95 { 96 if (LayerFrameRate[n] - LayerFrameRate[n-1] > 0) /* 7/31/03 */ 97 { 98 rc[n]->TMN_TH = (Int)((float)(LayerBitRate[n] - LayerBitRate[n-1]) / (LayerFrameRate[n] - LayerFrameRate[n-1])); 99 rc[n]->max_BitVariance_num = (Int)((float)(rc[n]->Bs - rc[n]->VBV_fullness) * 10 / ((float)rc[n]->TMN_TH)) - 5; 100 if (rc[n]->max_BitVariance_num < 0) rc[n]->max_BitVariance_num += 5; 101 } 102 else /* 7/31/03 */ 103 { 104 rc[n]->TMN_TH = 1 << 30; 105 rc[n]->max_BitVariance_num = 0; 106 } 107 rc[n]->bitrate = LayerBitRate[n] - LayerBitRate[n-1]; 108 rc[n]->framerate = LayerFrameRate[n] - LayerFrameRate[n-1]; 109 } 110 111 // Set the initial buffer fullness 112 if (1) //!video->encParams->H263_Enabled) { // MPEG-4 113 { 114 /* According to the spec, the initial buffer fullness needs to be set to 1/3 */ 115 rc[n]->VBV_fullness = (Int)(rc[n]->Bs / 3.0 - rc[n]->Bs / 2.0); /* the buffer range is [-Bs/2, Bs/2] */ 116 pMP[n]->counter_BTsrc = (Int)((rc[n]->Bs / 2.0 - rc[n]->Bs / 3.0) / (rc[n]->bitrate / rc[n]->framerate / 10.0)); 117 rc[n]->TMN_W = (Int)(rc[n]->VBV_fullness + pMP[n]->counter_BTsrc * (rc[n]->bitrate / rc[n]->framerate / 10.0)); 118 119 rc[n]->low_bound = -rc[n]->Bs / 2; 120 rc[n]-> VBV_fullness_offset = 0; 121 } 122 else /* this part doesn't work in some cases, the low_bound is too high, Jan 4,2006 */ 123 { 124 rc[n]->VBV_fullness = rc[n]->Bs - (Int)(video->encParams->VBV_delay * rc[n]->bitrate); 125 if (rc[n]->VBV_fullness < 0) rc[n]->VBV_fullness = 0; 126 //rc[n]->VBV_fullness = (rc[n]->Bs-video->encParams->maxFrameSize)/2 + video->encParams->maxFrameSize; 127 128 rc[n]->VBV_fullness -= rc[n]->Bs / 2; /* the buffer range is [-Bs/2, Bs/2] */ 129 rc[n]->low_bound = -rc[n]->Bs / 2 + video->encParams->maxFrameSize; /* too high */ 130 rc[n]->VBV_fullness_offset = video->encParams->maxFrameSize / 2; /* don't understand the meaning of this */ 131 pMP[n]->counter_BTdst = pMP[n]->counter_BTsrc = 0; 132 133 } 134 135 /* Setting the bitrate and framerate */ 136 pMP[n]->bitrate = rc[n]->bitrate; 137 pMP[n]->framerate = rc[n]->framerate; 138 pMP[n]->target_bits_per_frame = pMP[n]->bitrate / pMP[n]->framerate; 139 140 } 141 142 return PV_SUCCESS; 143 } 144 145 146 /* ======================================================================== */ 147 /* Function : RC_Cleanup */ 148 /* Date : 12/20/2000 */ 149 /* Purpose : free Rate Control memory */ 150 /* In/out : */ 151 /* Return : */ 152 /* Modified : */ 153 /* ======================================================================== */ 154 155 156 PV_STATUS RC_Cleanup(rateControl *rc[], Int numLayers) 157 { 158 OSCL_UNUSED_ARG(rc); 159 OSCL_UNUSED_ARG(numLayers); 160 161 return PV_SUCCESS; 162 } 163 164 165 166 /* ======================================================================== */ 167 /* Function : RC_VopQPSetting */ 168 /* Date : 4/11/2001 */ 169 /* Purpose : Reset rate control before coding VOP, moved from vop.c */ 170 /* Compute QP for the whole VOP and initialize MB-based RC 171 reset QPMB[], currVop->quantizer, rc->Ec, video->header_bits */ 172 /* to In order to work RC_VopQPSetting has to do the followings 173 1. Set video->QPMB of all macroblocks. 174 2. Set currVop->quantizer 175 3. Reset video->header_bits to zero. 176 4. Initialize internal RC parameters for Vop cooding */ 177 /* In/out : */ 178 /* Return : PV_STATUS */ 179 /* Modified : */ 180 /* ======================================================================== */ 181 /* To be moved to rate_control.c and separate between BX_RC and ANNEX_L */ 182 183 PV_STATUS RC_VopQPSetting(VideoEncData *video, rateControl *prc[]) 184 { 185 Int currLayer = video->currLayer; 186 Vol *currVol = video->vol[currLayer]; 187 Vop *currVop = video->currVop; 188 #ifdef TEST_MBBASED_QP 189 int i; 190 #endif 191 192 rateControl *rc = video->rc[currLayer]; 193 MultiPass *pMP = video->pMP[currLayer]; 194 195 OSCL_UNUSED_ARG(prc); 196 197 if (video->encParams->RC_Type == CONSTANT_Q) 198 { 199 M4VENC_MEMSET(video->QPMB, currVop->quantizer, sizeof(UChar)*currVol->nTotalMB); 200 return PV_SUCCESS; 201 } 202 else 203 { 204 205 if (video->rc[currLayer]->encoded_frames == 0) /* rc[currLayer]->totalFrameNumber*/ 206 { 207 M4VENC_MEMSET(video->QPMB, currVop->quantizer, sizeof(UChar)*currVol->nTotalMB); 208 video->rc[currLayer]->Qc = video->encParams->InitQuantIvop[currLayer]; 209 } 210 else 211 { 212 calculateQuantizer_Multipass((void*) video); 213 currVop->quantizer = video->rc[currLayer]->Qc; 214 #ifdef TEST_MBBASED_QP 215 i = currVol->nTotalMB; /* testing changing QP at MB level */ 216 while (i) 217 { 218 i--; 219 video->QPMB[i] = (i & 1) ? currVop->quantizer - 1 : currVop->quantizer + 1; 220 } 221 #else 222 M4VENC_MEMSET(video->QPMB, currVop->quantizer, sizeof(UChar)*currVol->nTotalMB); 223 #endif 224 } 225 226 video->header_bits = 0; 227 } 228 229 /* update pMP->framePos */ 230 if (++pMP->framePos == pMP->frameRange) pMP->framePos = 0; 231 232 if (rc->T == 0) 233 { 234 pMP->counter_BTdst = (Int)(video->encParams->LayerFrameRate[video->currLayer] * 7.5 + 0.5); /* 0.75s time frame */ 235 pMP->counter_BTdst = PV_MIN(pMP->counter_BTdst, (Int)(rc->max_BitVariance_num / 2 * 0.40)); /* 0.75s time frame may go beyond VBV buffer if we set the buffer size smaller than 0.75s */ 236 pMP->counter_BTdst = PV_MAX(pMP->counter_BTdst, (Int)((rc->Bs / 2 - rc->VBV_fullness) * 0.30 / (rc->TMN_TH / 10.0) + 0.5)); /* At least 30% of VBV buffer size/2 */ 237 pMP->counter_BTdst = PV_MIN(pMP->counter_BTdst, 20); /* Limit the target to be smaller than 3C */ 238 239 pMP->target_bits = rc->T = rc->TMN_TH = (Int)(rc->TMN_TH * (1.0 + pMP->counter_BTdst * 0.1)); 240 pMP->diff_counter = pMP->counter_BTdst; 241 } 242 243 /* collect the necessary data: target bits, actual bits, mad and QP */ 244 pMP->target_bits = rc->T; 245 pMP->QP = currVop->quantizer; 246 247 pMP->mad = video->sumMAD / (float)currVol->nTotalMB; 248 if (pMP->mad < MAD_MIN) pMP->mad = MAD_MIN; /* MAD_MIN is defined as 1 in mp4def.h */ 249 250 pMP->bitrate = rc->bitrate; /* calculated in RCVopQPSetting */ 251 pMP->framerate = rc->framerate; 252 253 /* first pass encoding */ 254 pMP->nRe_Quantized = 0; 255 256 return PV_SUCCESS; 257 } 258 259 260 /* ======================================================================== */ 261 /* Function : SaveRDSamples() */ 262 /* Date : 08/29/2001 */ 263 /* History : */ 264 /* Purpose : Save QP, actual_bits, mad and R_D of the current iteration */ 265 /* In/out : */ 266 /* Return : */ 267 /* Modified : */ 268 /* */ 269 /* ======================================================================== */ 270 271 Void SaveRDSamples(MultiPass *pMP, Int counter_samples) 272 { 273 /* for pMP->pRDSamples */ 274 pMP->pRDSamples[pMP->framePos][counter_samples].QP = pMP->QP; 275 pMP->pRDSamples[pMP->framePos][counter_samples].actual_bits = pMP->actual_bits; 276 pMP->pRDSamples[pMP->framePos][counter_samples].mad = pMP->mad; 277 pMP->pRDSamples[pMP->framePos][counter_samples].R_D = (float)(pMP->actual_bits / (pMP->mad + 0.0001)); 278 279 return ; 280 } 281 /* ======================================================================== */ 282 /* Function : RC_VopUpdateStat */ 283 /* Date : 12/20/2000 */ 284 /* Purpose : Update statistics for rate control after encoding each VOP. */ 285 /* No need to change anything in VideoEncData structure. */ 286 /* In/out : */ 287 /* Return : */ 288 /* Modified : */ 289 /* ======================================================================== */ 290 291 PV_STATUS RC_VopUpdateStat(VideoEncData *video, rateControl *rc) 292 { 293 Int currLayer = video->currLayer; 294 Vol *currVol = video->vol[currLayer]; 295 MultiPass *pMP = video->pMP[currLayer]; 296 Int diff_BTCounter; 297 298 switch (video->encParams->RC_Type) 299 { 300 case CONSTANT_Q: 301 break; 302 303 case CBR_1: 304 case CBR_2: 305 case VBR_1: 306 case VBR_2: 307 case CBR_LOWDELAY: 308 309 pMP->actual_bits = currVol->stream->byteCount << 3; 310 311 SaveRDSamples(pMP, 0); 312 313 pMP->encoded_frames++; 314 315 /* for pMP->samplesPerFrame */ 316 pMP->samplesPerFrame[pMP->framePos] = 0; 317 318 pMP->sum_QP += pMP->QP; 319 320 321 /* update pMP->counter_BTsrc, pMP->counter_BTdst */ 322 /* re-allocate the target bit again and then stop encoding */ 323 diff_BTCounter = (Int)((float)(rc->TMN_TH - rc->TMN_W - pMP->actual_bits) / 324 (pMP->bitrate / (pMP->framerate + 0.0001) + 0.0001) / 0.1); 325 if (diff_BTCounter >= 0) 326 pMP->counter_BTsrc += diff_BTCounter; /* pMP->actual_bits is smaller */ 327 else 328 pMP->counter_BTdst -= diff_BTCounter; /* pMP->actual_bits is bigger */ 329 330 rc->TMN_TH -= (Int)((float)pMP->bitrate / (pMP->framerate + 0.0001) * (diff_BTCounter * 0.1)); 331 rc->T = pMP->target_bits = rc->TMN_TH - rc->TMN_W; 332 pMP->diff_counter -= diff_BTCounter; 333 334 rc->Rc = currVol->stream->byteCount << 3; /* Total Bits for current frame */ 335 rc->Hc = video->header_bits; /* Total Bits in Header and Motion Vector */ 336 337 /* BX_RC */ 338 updateRateControl(rc, video); 339 340 break; 341 342 default: /* for case CBR_1/2, VBR_1/2 */ 343 344 return PV_FAIL; 345 } 346 347 348 return PV_SUCCESS; 349 } 350 351 /* ======================================================================== */ 352 /* Function : RC_GetSkipNextFrame, RC_GetRemainingVops */ 353 /* Date : 2/20/2001 */ 354 /* Purpose : To access RC parameters from other parts of the code. */ 355 /* In/out : */ 356 /* Return : */ 357 /* Modified : */ 358 /* ======================================================================== */ 359 360 Int RC_GetSkipNextFrame(VideoEncData *video, Int currLayer) 361 { 362 return video->rc[currLayer]->skip_next_frame; 363 } 364 365 void RC_ResetSkipNextFrame(VideoEncData *video, Int currLayer) 366 { 367 368 video->rc[currLayer]->skip_next_frame = 0; 369 return ; 370 } 371 372 /* ======================================================================== */ 373 /* Function : RC_UpdateBuffer */ 374 /* Date : 2/20/2001 */ 375 /* Purpose : Update RC in case of there are frames skipped (camera freeze)*/ 376 /* from the application level in addition to what RC requested */ 377 /* In/out : Nr, B, Rr */ 378 /* Return : Void */ 379 /* Modified : */ 380 /* ======================================================================== */ 381 382 383 PV_STATUS RC_UpdateBuffer(VideoEncData *video, Int currLayer, Int num_skip) 384 { 385 rateControl *rc = video->rc[currLayer]; 386 MultiPass *pMP = video->pMP[currLayer]; 387 388 if (video == NULL || rc == NULL || pMP == NULL) 389 return PV_FAIL; 390 391 rc->VBV_fullness -= (Int)(rc->bitrate / rc->framerate * num_skip); //rc[currLayer]->Rp; 392 pMP->counter_BTsrc += 10 * num_skip; 393 394 /* Check buffer underflow */ 395 if (rc->VBV_fullness < rc->low_bound) 396 { 397 rc->VBV_fullness = rc->low_bound; // -rc->Bs/2; 398 rc->TMN_W = rc->VBV_fullness - rc->low_bound; 399 pMP->counter_BTsrc = pMP->counter_BTdst + (Int)((float)(rc->Bs / 2 - rc->low_bound) / 2.0 / (pMP->target_bits_per_frame / 10)); 400 } 401 402 return PV_SUCCESS; 403 } 404 405 406 /* ======================================================================== */ 407 /* Function : RC_UpdateBXRCParams */ 408 /* Date : 4/08/2002 */ 409 /* Purpose : Update RC parameters specifically for target bitrate or */ 410 /* framerate update during an encoding session */ 411 /* In/out : */ 412 /* Return : PV_TRUE if successed, PV_FALSE if failed. */ 413 /* Modified : */ 414 /* ======================================================================== */ 415 416 PV_STATUS RC_UpdateBXRCParams(void *input) 417 { 418 VideoEncData *video = (VideoEncData *) input; 419 VideoEncParams *encParams = video->encParams; 420 rateControl **rc = video->rc; 421 Int numLayers = encParams->nLayers; 422 Int *LayerBitRate = encParams->LayerBitRate; 423 float *LayerFrameRate = encParams->LayerFrameRate; 424 MultiPass **pMP = video->pMP; 425 426 Int n, VBV_fullness; 427 Int diff_counter; 428 429 extern Bool SetProfile_BufferSize(VideoEncData *video, float delay, Int bInitialized); 430 431 432 /* Reset video buffer size due to target bitrate change */ 433 SetProfile_BufferSize(video, video->encParams->VBV_delay, 0); /* output: video->encParams->BufferSize[] */ 434 435 for (n = 0; n < numLayers; n++) 436 { 437 /* Remaining stuff about frame dropping and underflow check in update RC */ 438 updateRC_PostProc(rc[n], video); 439 rc[n]->skip_next_frame = 0; /* must be initialized */ 440 441 /* New changes: bitrate and framerate, Bs, max_BitVariance_num, TMN_TH(optional), encoded_frames(optional) */ 442 rc[n]->Bs = video->encParams->BufferSize[n]; 443 VBV_fullness = (Int)(rc[n]->Bs * 0.5); 444 445 if (n == 0) 446 { 447 rc[n]->TMN_TH = (Int)((float)LayerBitRate[n] / LayerFrameRate[n]); 448 rc[n]->bitrate = pMP[n]->bitrate = LayerBitRate[n]; 449 rc[n]->framerate = pMP[n]->framerate = LayerFrameRate[n]; 450 451 // For h263 or short header mode, the bit variation is within (-2*Rmax*1001/3000, 2*Rmax*1001/3000) 452 if (video->encParams->H263_Enabled) 453 { 454 rc[n]->max_BitVariance_num = (Int)((rc[n]->Bs - video->encParams->maxFrameSize) / 2 / (rc[n]->bitrate / rc[n]->framerate / 10.0)) - 5; 455 //rc[n]->max_BitVariance_num = (Int)((float)(rc[n]->Bs - rc[n]->VBV_fullness)/((float)LayerBitRate[n]/LayerFrameRate[n]/10.0))-5; 456 } 457 else // MPEG-4 normal modes 458 { 459 rc[n]->max_BitVariance_num = (Int)((float)(rc[n]->Bs - VBV_fullness) * 10 / ((float)LayerBitRate[n] / LayerFrameRate[n])) - 5; 460 } 461 } 462 else 463 { 464 if (LayerFrameRate[n] - LayerFrameRate[n-1] > 0) /* 7/31/03 */ 465 { 466 rc[n]->TMN_TH = (Int)((float)(LayerBitRate[n] - LayerBitRate[n-1]) / (LayerFrameRate[n] - LayerFrameRate[n-1])); 467 rc[n]->max_BitVariance_num = (Int)((float)(rc[n]->Bs - VBV_fullness) * 10 / ((float)rc[n]->TMN_TH)) - 5; 468 if (rc[n]->max_BitVariance_num < 0) rc[n]->max_BitVariance_num += 5; 469 } 470 else /* 7/31/03 */ 471 { 472 rc[n]->TMN_TH = 1 << 30; 473 rc[n]->max_BitVariance_num = 0; 474 } 475 rc[n]->bitrate = pMP[n]->bitrate = LayerBitRate[n] - LayerBitRate[n-1]; 476 rc[n]->framerate = pMP[n]->framerate = LayerFrameRate[n] - LayerFrameRate[n-1]; 477 } 478 479 pMP[n]->target_bits_per_frame_prev = pMP[n]->target_bits_per_frame; 480 pMP[n]->target_bits_per_frame = pMP[n]->bitrate / (float)(pMP[n]->framerate + 0.0001); /* 7/31/03 */ 481 482 /* rc[n]->VBV_fullness and rc[n]->TMN_W should be kept same */ 483 /* update pMP[n]->counter_BTdst and pMP[n]->counter_BTsrc */ 484 diff_counter = (Int)((float)(rc[n]->VBV_fullness - rc[n]->TMN_W) / 485 (pMP[n]->target_bits_per_frame / 10 + 0.0001)); /* 7/31/03 */ 486 487 pMP[n]->counter_BTdst = pMP[n]->counter_BTsrc = 0; 488 if (diff_counter > 0) 489 pMP[n]->counter_BTdst = diff_counter; 490 491 else if (diff_counter < 0) 492 pMP[n]->counter_BTsrc = -diff_counter; 493 494 rc[n]->TMN_W = (Int)(rc[n]->VBV_fullness - /* re-calculate rc[n]->TMN_W in order for higher accuracy */ 495 (pMP[n]->target_bits_per_frame / 10) * (pMP[n]->counter_BTdst - pMP[n]->counter_BTsrc)); 496 497 /* Keep the current average mad */ 498 if (pMP[n]->aver_mad != 0) 499 { 500 pMP[n]->aver_mad_prev = pMP[n]->aver_mad; 501 pMP[n]->encoded_frames_prev = pMP[n]->encoded_frames; 502 } 503 504 pMP[n]->aver_mad = 0; 505 pMP[n]->overlapped_win_size = 4; 506 507 /* Misc */ 508 pMP[n]->sum_mad = pMP[n]->sum_QP = 0; 509 //pMP[n]->encoded_frames_prev = pMP[n]->encoded_frames; 510 pMP[n]->encoded_frames = pMP[n]->re_encoded_frames = pMP[n]->re_encoded_times = 0; 511 512 } /* end of: for(n=0; n<numLayers; n++) */ 513 514 return PV_SUCCESS; 515 516 } 517 518 519 /* ================================================================================ */ 520 /* Function : targetBitCalculation */ 521 /* Date : 10/01/2001 */ 522 /* Purpose : quadratic bit allocation model: T(n) = C*sqrt(mad(n)/aver_mad(n-1)) */ 523 /* */ 524 /* In/out : rc->T */ 525 /* Return : Void */ 526 /* Modified : */ 527 /* ================================================================================ */ 528 529 void targetBitCalculation(void *input) 530 { 531 VideoEncData *video = (VideoEncData *) input; 532 MultiPass *pMP = video->pMP[video->currLayer]; 533 Vol *currVol = video->vol[video->currLayer]; 534 rateControl *rc = video->rc[video->currLayer]; 535 536 float curr_mad;//, average_mad; 537 Int diff_counter_BTsrc, diff_counter_BTdst, prev_counter_diff, curr_counter_diff, bound; 538 /* BT = Bit Transfer, for pMP->counter_BTsrc, pMP->counter_BTdst */ 539 540 if (video == NULL || currVol == NULL || pMP == NULL || rc == NULL) 541 return; 542 543 /* some stuff about frame dropping remained here to be done because pMP cannot be inserted into updateRateControl()*/ 544 updateRC_PostProc(rc, video); 545 546 /* update pMP->counter_BTsrc and pMP->counter_BTdst to avoid interger overflow */ 547 if (pMP->counter_BTsrc > 1000 && pMP->counter_BTdst > 1000) 548 { 549 pMP->counter_BTsrc -= 1000; 550 pMP->counter_BTdst -= 1000; 551 } 552 553 /* ---------------------------------------------------------------------------------------------------*/ 554 /* target calculation */ 555 curr_mad = video->sumMAD / (float)currVol->nTotalMB; 556 if (curr_mad < MAD_MIN) curr_mad = MAD_MIN; /* MAD_MIN is defined as 1 in mp4def.h */ 557 diff_counter_BTsrc = diff_counter_BTdst = 0; 558 pMP->diff_counter = 0; 559 560 561 /*1.calculate average mad */ 562 pMP->sum_mad += curr_mad; 563 //average_mad = (pMP->encoded_frames < 1 ? curr_mad : pMP->sum_mad/(float)(pMP->encoded_frames+1)); /* this function is called from the scond encoded frame*/ 564 //pMP->aver_mad = average_mad; 565 if (pMP->encoded_frames >= 0) /* pMP->encoded_frames is set to -1 initially, so forget about the very first I frame */ 566 pMP->aver_mad = (pMP->aver_mad * pMP->encoded_frames + curr_mad) / (pMP->encoded_frames + 1); 567 568 if (pMP->overlapped_win_size > 0 && pMP->encoded_frames_prev >= 0) /* 7/31/03 */ 569 pMP->aver_mad_prev = (pMP->aver_mad_prev * pMP->encoded_frames_prev + curr_mad) / (pMP->encoded_frames_prev + 1); 570 571 /*2.average_mad, mad ==> diff_counter_BTsrc, diff_counter_BTdst */ 572 if (pMP->overlapped_win_size == 0) 573 { 574 /* original verison */ 575 if (curr_mad > pMP->aver_mad*1.1) 576 { 577 if (curr_mad / (pMP->aver_mad + 0.0001) > 2) 578 diff_counter_BTdst = (Int)(M4VENC_SQRT(curr_mad / (pMP->aver_mad + 0.0001)) * 10 + 0.4) - 10; 579 //diff_counter_BTdst = (Int)((sqrt(curr_mad/pMP->aver_mad)*2+curr_mad/pMP->aver_mad)/(3*0.1) + 0.4) - 10; 580 else 581 diff_counter_BTdst = (Int)(curr_mad / (pMP->aver_mad + 0.0001) * 10 + 0.4) - 10; 582 } 583 else /* curr_mad <= average_mad*1.1 */ 584 //diff_counter_BTsrc = 10 - (Int)((sqrt(curr_mad/pMP->aver_mad) + pow(curr_mad/pMP->aver_mad, 1.0/3.0))/(2.0*0.1) + 0.4); 585 diff_counter_BTsrc = 10 - (Int)(M4VENC_SQRT(curr_mad / (pMP->aver_mad + 0.0001)) * 10 + 0.5); 586 //diff_counter_BTsrc = 10 - (Int)(curr_mad/pMP->aver_mad/0.1 + 0.5) 587 588 /* actively fill in the possible gap */ 589 if (diff_counter_BTsrc == 0 && diff_counter_BTdst == 0 && 590 curr_mad <= pMP->aver_mad*1.1 && pMP->counter_BTsrc < pMP->counter_BTdst) 591 diff_counter_BTsrc = 1; 592 593 } 594 else if (pMP->overlapped_win_size > 0) 595 { 596 /* transition time: use previous average mad "pMP->aver_mad_prev" instead of the current average mad "pMP->aver_mad" */ 597 if (curr_mad > pMP->aver_mad_prev*1.1) 598 { 599 if (curr_mad / pMP->aver_mad_prev > 2) 600 diff_counter_BTdst = (Int)(M4VENC_SQRT(curr_mad / (pMP->aver_mad_prev + 0.0001)) * 10 + 0.4) - 10; 601 //diff_counter_BTdst = (Int)((M4VENC_SQRT(curr_mad/pMP->aver_mad_prev)*2+curr_mad/pMP->aver_mad_prev)/(3*0.1) + 0.4) - 10; 602 else 603 diff_counter_BTdst = (Int)(curr_mad / (pMP->aver_mad_prev + 0.0001) * 10 + 0.4) - 10; 604 } 605 else /* curr_mad <= average_mad*1.1 */ 606 //diff_counter_BTsrc = 10 - (Int)((sqrt(curr_mad/pMP->aver_mad_prev) + pow(curr_mad/pMP->aver_mad_prev, 1.0/3.0))/(2.0*0.1) + 0.4); 607 diff_counter_BTsrc = 10 - (Int)(M4VENC_SQRT(curr_mad / (pMP->aver_mad_prev + 0.0001)) * 10 + 0.5); 608 //diff_counter_BTsrc = 10 - (Int)(curr_mad/pMP->aver_mad_prev/0.1 + 0.5) 609 610 /* actively fill in the possible gap */ 611 if (diff_counter_BTsrc == 0 && diff_counter_BTdst == 0 && 612 curr_mad <= pMP->aver_mad_prev*1.1 && pMP->counter_BTsrc < pMP->counter_BTdst) 613 diff_counter_BTsrc = 1; 614 615 if (--pMP->overlapped_win_size <= 0) pMP->overlapped_win_size = 0; 616 } 617 618 619 /* if difference is too much, do clipping */ 620 /* First, set the upper bound for current bit allocation variance: 80% of available buffer */ 621 bound = (Int)((rc->Bs / 2 - rc->VBV_fullness) * 0.6 / (pMP->target_bits_per_frame / 10)); /* rc->Bs */ 622 diff_counter_BTsrc = PV_MIN(diff_counter_BTsrc, bound); 623 diff_counter_BTdst = PV_MIN(diff_counter_BTdst, bound); 624 625 /* Second, set another upper bound for current bit allocation: 4-5*bitrate/framerate */ 626 bound = 50; 627 // if(video->encParams->RC_Type == CBR_LOWDELAY) 628 // not necessary bound = 10; /* 1/17/02 -- For Low delay */ 629 630 diff_counter_BTsrc = PV_MIN(diff_counter_BTsrc, bound); 631 diff_counter_BTdst = PV_MIN(diff_counter_BTdst, bound); 632 633 634 /* Third, check the buffer */ 635 prev_counter_diff = pMP->counter_BTdst - pMP->counter_BTsrc; 636 curr_counter_diff = prev_counter_diff + (diff_counter_BTdst - diff_counter_BTsrc); 637 638 if (PV_ABS(prev_counter_diff) >= rc->max_BitVariance_num || PV_ABS(curr_counter_diff) >= rc->max_BitVariance_num) // PV_ABS(curr_counter_diff) >= PV_ABS(prev_counter_diff) ) 639 { //diff_counter_BTsrc = diff_counter_BTdst = 0; 640 641 if (curr_counter_diff > rc->max_BitVariance_num && diff_counter_BTdst) 642 { 643 diff_counter_BTdst = (rc->max_BitVariance_num - prev_counter_diff) + diff_counter_BTsrc; 644 if (diff_counter_BTdst < 0) diff_counter_BTdst = 0; 645 } 646 647 else if (curr_counter_diff < -rc->max_BitVariance_num && diff_counter_BTsrc) 648 { 649 diff_counter_BTsrc = diff_counter_BTdst - (-rc->max_BitVariance_num - prev_counter_diff); 650 if (diff_counter_BTsrc < 0) diff_counter_BTsrc = 0; 651 } 652 } 653 654 655 /*3.diff_counter_BTsrc, diff_counter_BTdst ==> TMN_TH */ 656 //rc->TMN_TH = (Int)((float)pMP->bitrate/pMP->framerate); 657 rc->TMN_TH = (Int)(pMP->target_bits_per_frame); 658 pMP->diff_counter = 0; 659 660 if (diff_counter_BTsrc) 661 { 662 rc->TMN_TH -= (Int)(pMP->target_bits_per_frame * diff_counter_BTsrc * 0.1); 663 pMP->diff_counter = -diff_counter_BTsrc; 664 } 665 else if (diff_counter_BTdst) 666 { 667 rc->TMN_TH += (Int)(pMP->target_bits_per_frame * diff_counter_BTdst * 0.1); 668 pMP->diff_counter = diff_counter_BTdst; 669 } 670 671 672 /*4.update pMP->counter_BTsrc, pMP->counter_BTdst */ 673 pMP->counter_BTsrc += diff_counter_BTsrc; 674 pMP->counter_BTdst += diff_counter_BTdst; 675 676 677 /*5.target bit calculation */ 678 rc->T = rc->TMN_TH - rc->TMN_W; 679 //rc->T = rc->TMN_TH - (Int)((float)rc->TMN_W/rc->frameRate); 680 681 if (video->encParams->H263_Enabled && rc->T > video->encParams->maxFrameSize) 682 { 683 rc->T = video->encParams->maxFrameSize; // added this 11/07/05 684 } 685 686 } 687 688 /* ================================================================================ */ 689 /* Function : calculateQuantizer_Multipass */ 690 /* Date : 10/01/2001 */ 691 /* Purpose : variable rate bit allocation + new QP determination scheme */ 692 /* */ 693 /* In/out : rc->T and rc->Qc */ 694 /* Return : Void */ 695 /* Modified : */ 696 /* ================================================================================ */ 697 698 /* Mad based variable bit allocation + QP calculation with a new quadratic method */ 699 void calculateQuantizer_Multipass(void *input) 700 { 701 VideoEncData *video = (VideoEncData *) input; 702 MultiPass *pMP = video->pMP[video->currLayer]; 703 Vol *currVol = video->vol[video->currLayer]; 704 rateControl *rc = video->rc[video->currLayer]; 705 706 Int prev_QP, prev_actual_bits, curr_target, i, j; 707 708 float curr_mad, prev_mad, curr_RD, prev_RD, average_mad, aver_QP; 709 710 711 if (video == NULL || currVol == NULL || pMP == NULL || rc == NULL) 712 return; 713 714 /* Mad based variable bit allocation */ 715 targetBitCalculation((void*) video); 716 717 if (rc->T <= 0 || video->sumMAD == 0) 718 { 719 if (rc->T < 0) rc->Qc = 31; 720 return; 721 } 722 723 /* ---------------------------------------------------------------------------------------------------*/ 724 /* current frame QP estimation */ 725 curr_target = rc->T; 726 curr_mad = video->sumMAD / (float)currVol->nTotalMB; 727 if (curr_mad < MAD_MIN) curr_mad = MAD_MIN; /* MAD_MIN is defined as 1 in mp4def.h */ 728 curr_RD = (float)curr_target / curr_mad; 729 730 /* Another version of search the optimal point */ 731 prev_actual_bits = pMP->pRDSamples[0][0].actual_bits; 732 prev_mad = pMP->pRDSamples[0][0].mad; 733 734 for (i = 0, j = 0; i < pMP->frameRange; i++) 735 { 736 if (pMP->pRDSamples[i][0].mad != 0 && prev_mad != 0 && 737 PV_ABS(prev_mad - curr_mad) > PV_ABS(pMP->pRDSamples[i][0].mad - curr_mad)) 738 { 739 prev_mad = pMP->pRDSamples[i][0].mad; 740 prev_actual_bits = pMP->pRDSamples[i][0].actual_bits; 741 j = i; 742 } 743 } 744 prev_QP = pMP->pRDSamples[j][0].QP; 745 for (i = 1; i < pMP->samplesPerFrame[j]; i++) 746 { 747 if (PV_ABS(prev_actual_bits - curr_target) > PV_ABS(pMP->pRDSamples[j][i].actual_bits - curr_target)) 748 { 749 prev_actual_bits = pMP->pRDSamples[j][i].actual_bits; 750 prev_QP = pMP->pRDSamples[j][i].QP; 751 } 752 } 753 754 // quadratic approximation 755 prev_RD = (float)prev_actual_bits / prev_mad; 756 //rc->Qc = (Int)(prev_QP * sqrt(prev_actual_bits/curr_target) + 0.4); 757 if (prev_QP == 1) // 11/14/05, added this to allow getting out of QP = 1 easily 758 { 759 rc->Qc = (Int)(prev_RD / curr_RD + 0.5); 760 } 761 else 762 { 763 rc->Qc = (Int)(prev_QP * M4VENC_SQRT(prev_RD / curr_RD) + 0.9); 764 765 if (prev_RD / curr_RD > 0.5 && prev_RD / curr_RD < 2.0) 766 rc->Qc = (Int)(prev_QP * (M4VENC_SQRT(prev_RD / curr_RD) + prev_RD / curr_RD) / 2.0 + 0.9); /* Quadratic and linear approximation */ 767 else 768 rc->Qc = (Int)(prev_QP * (M4VENC_SQRT(prev_RD / curr_RD) + M4VENC_POW(prev_RD / curr_RD, 1.0 / 3.0)) / 2.0 + 0.9); 769 } 770 //rc->Qc =(Int)(prev_QP * sqrt(prev_RD/curr_RD) + 0.4); 771 // 11/08/05 772 // lower bound on Qc should be a function of curr_mad 773 // When mad is already low, lower bound on Qc doesn't have to be small. 774 // Note, this doesn't work well for low complexity clip encoded at high bit rate 775 // it doesn't hit the target bit rate due to this QP lower bound. 776 /// if((curr_mad < 8) && (rc->Qc < 12)) rc->Qc = 12; 777 // else if((curr_mad < 128) && (rc->Qc < 3)) rc->Qc = 3; 778 779 if (rc->Qc < 1) rc->Qc = 1; 780 if (rc->Qc > 31) rc->Qc = 31; 781 782 783 /* active bit resource protection */ 784 aver_QP = (pMP->encoded_frames == 0 ? 0 : pMP->sum_QP / (float)pMP->encoded_frames); 785 average_mad = (pMP->encoded_frames == 0 ? 0 : pMP->sum_mad / (float)pMP->encoded_frames); /* this function is called from the scond encoded frame*/ 786 if (pMP->diff_counter == 0 && 787 ((float)rc->Qc <= aver_QP*1.1 || curr_mad <= average_mad*1.1) && 788 pMP->counter_BTsrc <= (pMP->counter_BTdst + (Int)(pMP->framerate*1.0 + 0.5))) 789 { 790 rc->TMN_TH -= (Int)(pMP->target_bits_per_frame / 10.0); 791 rc->T = rc->TMN_TH - rc->TMN_W; 792 pMP->counter_BTsrc++; 793 pMP->diff_counter--; 794 } 795 796 } 797 798 799 /* ======================================================================== */ 800 /* Function : updateRateControl */ 801 /* Date : 11/17/2000 */ 802 /* Purpose :Update the RD Modal (After Encoding the Current Frame) */ 803 /* In/out : */ 804 /* Return : */ 805 /* Modified : */ 806 /* ======================================================================== */ 807 808 void updateRateControl(rateControl *rc, VideoEncData *video) 809 { 810 Int frame_bits; 811 812 813 /* rate contro\l */ 814 frame_bits = (Int)(rc->bitrate / rc->framerate); 815 rc->TMN_W += (rc->Rc - rc->TMN_TH); 816 rc->VBV_fullness += (rc->Rc - frame_bits); //rc->Rp); 817 //if(rc->VBV_fullness < 0) rc->VBV_fullness = -1; 818 819 rc->encoded_frames++; 820 821 /* frame dropping */ 822 rc->skip_next_frame = 0; 823 824 if ((video->encParams->H263_Enabled && rc->Rc > video->encParams->maxFrameSize) || /* For H263/short header mode, drop the frame if the actual frame size exceeds the bound */ 825 (rc->VBV_fullness > rc->Bs / 2 && !rc->no_pre_skip)) /* skip the current frame */ /* rc->Bs */ 826 { 827 rc->TMN_W -= (rc->Rc - rc->TMN_TH); 828 rc->VBV_fullness -= rc->Rc; 829 rc->skip_next_frame = -1; 830 } 831 else if ((float)(rc->VBV_fullness - rc->VBV_fullness_offset) > (rc->Bs / 2 - rc->VBV_fullness_offset)*0.95 && 832 !rc->no_frame_skip) /* skip next frame */ 833 { 834 rc->VBV_fullness -= frame_bits; //rc->Rp; 835 rc->skip_next_frame = 1; 836 /* skip more than 1 frames */ 837 //while(rc->VBV_fullness > rc->Bs*0.475) 838 while ((rc->VBV_fullness - rc->VBV_fullness_offset) > (rc->Bs / 2 - rc->VBV_fullness_offset)*0.95) 839 { 840 rc->VBV_fullness -= frame_bits; //rc->Rp; 841 rc->skip_next_frame++; 842 } 843 /* END */ 844 } 845 846 } 847 848 /* ======================================================================== */ 849 /* Function : updateRC_PostProc */ 850 /* Date : 04/08/2002 */ 851 /* Purpose : Remaing RC update stuff for frame skip and buffer underflow */ 852 /* check */ 853 /* In/out : */ 854 /* Return : */ 855 /* Modified : */ 856 /* ======================================================================== */ 857 void updateRC_PostProc(rateControl *rc, VideoEncData *video) 858 { 859 MultiPass *pMP = video->pMP[video->currLayer]; 860 861 if (rc->skip_next_frame == 1 && !rc->no_frame_skip) /* skip next frame */ 862 { 863 pMP->counter_BTsrc += 10 * rc->skip_next_frame; 864 865 } 866 else if (rc->skip_next_frame == -1 && !rc->no_pre_skip) /* skip current frame */ 867 { 868 pMP->counter_BTdst -= pMP->diff_counter; 869 pMP->counter_BTsrc += 10; 870 871 pMP->sum_mad -= pMP->mad; 872 pMP->aver_mad = (pMP->aver_mad * pMP->encoded_frames - pMP->mad) / (float)(pMP->encoded_frames - 1 + 0.0001); 873 pMP->sum_QP -= pMP->QP; 874 pMP->encoded_frames --; 875 } 876 /* some stuff in update VBV_fullness remains here */ 877 //if(rc->VBV_fullness < -rc->Bs/2) /* rc->Bs */ 878 if (rc->VBV_fullness < rc->low_bound) 879 { 880 rc->VBV_fullness = rc->low_bound; // -rc->Bs/2; 881 rc->TMN_W = rc->VBV_fullness - rc->low_bound; 882 pMP->counter_BTsrc = pMP->counter_BTdst + (Int)((float)(rc->Bs / 2 - rc->low_bound) / 2.0 / (pMP->target_bits_per_frame / 10)); 883 } 884 } 885 886