Lines Matching refs:ct

144 MS_S32 cvbr_ComputeFrameQStep(CVBRRateControl* ct, MS_S32 nFrameType);	// Return the target 'QStep'
145 MS_S32 cvbr_ComputeMbQP(CVBRRateControl* ct, MS_S32 mb_idx); // Return the target 'QP'
147 MS_S32 rcQP2Qstep(CVBRRateControl* ct, MS_S32 QP);
148 MS_S32 rcQstep2QP(CVBRRateControl* ct, MS_S32 QstepX32);
174 void cvbr_InitRateControl(CVBRRateControl* ct, CVBRRCInfo* pRCInfo) in cvbr_InitRateControl() argument
178 ct->m_nFrameCount = 0; in cvbr_InitRateControl()
184 ct->m_nCodecType = pRCInfo->nCodecType; in cvbr_InitRateControl()
185 ct->m_nWidth = pRCInfo->nWidth; in cvbr_InitRateControl()
186 ct->m_nHeight = pRCInfo->nHeight; in cvbr_InitRateControl()
210 ct->m_nTargetFrameRateNum = 30000; in cvbr_InitRateControl()
211 ct->m_nTargetFrameRateDeNum = 1001; in cvbr_InitRateControl()
214 ct->m_nTargetFrameRateNum = pRCInfo->int_fTargetFrameRate; in cvbr_InitRateControl()
215 ct->m_nTargetFrameRateDeNum = 1; in cvbr_InitRateControl()
218 ct->m_nTargetFrameRateInt = ct->m_nTargetFrameRateNum / ct->m_nTargetFrameRateDeNum; in cvbr_InitRateControl()
219 ct->m_nBitrate = pRCInfo->nBitrate; in cvbr_InitRateControl()
220 ct->m_nMaxBitrate = pRCInfo->nMaxBitrate; in cvbr_InitRateControl()
221 ct->m_nConstQP = pRCInfo->nConstQP; in cvbr_InitRateControl()
222 ct->m_nVPSize = pRCInfo->nVPSize; in cvbr_InitRateControl()
223 ct->m_nVPMbRow = pRCInfo->nVPMbRow; in cvbr_InitRateControl()
224 ct->m_bFixedFrameRate = pRCInfo->bFixedFrameRate; in cvbr_InitRateControl()
225 ct->m_nPCount = pRCInfo->nPCount; in cvbr_InitRateControl()
226 ct->m_nBCount = pRCInfo->nBCount; in cvbr_InitRateControl()
227 ct->m_rcGranularity = pRCInfo->rcGranularity; in cvbr_InitRateControl()
228 ct->m_rcMethod = pRCInfo->rcMethod; in cvbr_InitRateControl()
230 if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE) { in cvbr_InitRateControl()
231 if (ct->m_nBitrate==0) in cvbr_InitRateControl()
232 ct->m_nBitrate = (MS_S32)(ct->m_nMaxBitrate *6/10); in cvbr_InitRateControl()
233 if (ct->m_nMaxBitrate==0) in cvbr_InitRateControl()
234 ct->m_nMaxBitrate = (MS_S32)(ct->m_nBitrate * 14/10); in cvbr_InitRateControl()
235ct->m_nMaxOffset = (MS_S32)MFE_DIV_S64((MS_S64)(ct->m_nMaxBitrate - ct->m_nBitrate)*ct->m_nTargetF… in cvbr_InitRateControl()
238 if (ct->m_rcGranularity==FRAMELEVELRC) in cvbr_InitRateControl()
239 ct->m_nMaxOffset = (ct->m_nMaxOffset) >> 2; in cvbr_InitRateControl()
242 ct->m_nMaxBitrate = 0; // Don't care in cvbr_InitRateControl()
246ct->m_nAvgBitsPerFrame = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nBitrate*ct->m_nTargetFrameRateDeNum, c… in cvbr_InitRateControl()
249 if (ct->m_nPCount == -1) { in cvbr_InitRateControl()
256 i = 1+ct->m_nPCount*(1+ct->m_nBCount); in cvbr_InitRateControl()
257 … j = IFRAME_WEIGHT + PFRAME_WEIGHT*ct->m_nPCount + BFRAME_WEIGHT*(ct->m_nPCount*ct->m_nBCount); in cvbr_InitRateControl()
260ct->m_nBitsPerFrame[0] = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nBitrate*ct->m_nTargetFrameRateDeNum*IF… in cvbr_InitRateControl()
261ct->m_nBitsPerFrame[1] = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nBitrate*ct->m_nTargetFrameRateDeNum*PF… in cvbr_InitRateControl()
262ct->m_nBitsPerFrame[2] = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nBitrate*ct->m_nTargetFrameRateDeNum*BF… in cvbr_InitRateControl()
264 ct->m_nMbWidth = (ct->m_nWidth+15)>>4; in cvbr_InitRateControl()
268 if (ct->m_nCodecType==REG_ENC_MODE_MPG4 || ct->m_nCodecType==REG_ENC_MODE_H263) { in cvbr_InitRateControl()
269 ct->m_nMinQP = MSRC_MIN_QP_MPEG4; in cvbr_InitRateControl()
270 ct->m_nMaxQP = MSRC_MAX_QP_MPEG4; in cvbr_InitRateControl()
271 ct->m_nMinQStep = rcQP2Qstep(ct, MSRC_MIN_QP_MPEG4)-1; in cvbr_InitRateControl()
272 ct->m_nMaxQStep = rcQP2Qstep(ct, MSRC_MAX_QP_MPEG4); in cvbr_InitRateControl()
273 ct->m_nFrameSkipThrQP = FRAMESKIP_THR_QP_MPEG4; in cvbr_InitRateControl()
276 ct->m_nMinQP = MSRC_MIN_QP_H264; in cvbr_InitRateControl()
277 ct->m_nMaxQP = MSRC_MAX_QP_H264; in cvbr_InitRateControl()
278 ct->m_nMinQStep = rcQP2Qstep(ct, MSRC_MIN_QP_H264)-1; in cvbr_InitRateControl()
279 ct->m_nMaxQStep = rcQP2Qstep(ct, MSRC_MAX_QP_H264); in cvbr_InitRateControl()
280 ct->m_nFrameSkipThrQP = FRAMESKIP_THR_QP_H264; in cvbr_InitRateControl()
281 MS_ASSERT(ct->m_nCodecType==REG_ENC_MODE_H264); in cvbr_InitRateControl()
285 ct->m_nMinDeputyCount = (ct->m_nTargetFrameRateNum*CBR_DEPUTY_SECOND)/ct->m_nTargetFrameRateDeNum; in cvbr_InitRateControl()
286 ct->m_nTargetFullness = ct->m_nBitrate >> 1; in cvbr_InitRateControl()
287 ct->m_nBufFullness = ct->m_nTargetFullness; in cvbr_InitRateControl()
288 switch (ct->m_rcMethod) { in cvbr_InitRateControl()
290 ct->m_nDeputyCount = (ct->m_nTargetFrameRateNum*VBR_DEPUTY_SECOND)/ct->m_nTargetFrameRateDeNum; in cvbr_InitRateControl()
293ct->m_BitrateGauge = MfeDrvMemMalloc(ct->m_nTargetFrameRateInt * sizeof(MS_S32), (const MS_S8*)("m… in cvbr_InitRateControl()
294 if (ct->m_BitrateGauge) { in cvbr_InitRateControl()
295 memset(ct->m_BitrateGauge, 0, ct->m_nTargetFrameRateInt * sizeof(MS_S32)); in cvbr_InitRateControl()
297 ct->m_BitrateGauge[0] = ct->m_nBitsPerFrame[0]; in cvbr_InitRateControl()
298 for (i = 1; i < ct->m_nTargetFrameRateInt; i++) { in cvbr_InitRateControl()
299 ct->m_BitrateGauge[i] = ct->m_nBitsPerFrame[1]; in cvbr_InitRateControl()
300 for (j = 0; j < ct->m_nBCount; j++, i++) { in cvbr_InitRateControl()
301 if (i == ct->m_nTargetFrameRateInt) in cvbr_InitRateControl()
303 ct->m_BitrateGauge[i] = ct->m_nBitsPerFrame[2]; in cvbr_InitRateControl()
307 ct->m_nDeputyCount = (ct->m_nTargetFrameRateNum*CVBR_DEPUTY_SECOND)/ct->m_nTargetFrameRateDeNum; in cvbr_InitRateControl()
308 ct->m_nGaugeCount = ct->m_nTargetFrameRateInt; in cvbr_InitRateControl()
309 ct->m_nGaugeIndex = 0; in cvbr_InitRateControl()
310ct->m_nGaugeBitrate = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nBitrate*ct->m_nTargetFrameRateDeNum*ct->m… in cvbr_InitRateControl()
315ct->m_nDeputyCount = (MS_S32)MFE_DIV_S64((MS_S64)ct->m_nTargetFrameRateNum*CBR_DEPUTY_SECOND,ct->m… in cvbr_InitRateControl()
320 ct->m_nFrameCount = 0; in cvbr_InitRateControl()
321 ct->m_nTotalBits = 0; in cvbr_InitRateControl()
322 ct->m_nLastFrameAvgQStep[0] = ct->m_nLastFrameAvgQStep[1] = ct->m_nLastFrameBits = 0; in cvbr_InitRateControl()
323 ct->m_nLongTermQP64 = 0; in cvbr_InitRateControl()
325 ct->m_nTotalMB = (ct->m_nWidth>>4)*(ct->m_nHeight>>4); in cvbr_InitRateControl()
341 void cvbr_CloseRateControl(CVBRRateControl* ct) in cvbr_CloseRateControl() argument
343 if (ct->m_rcMethod == CONSTRAINED_VARIABLE_BITRATE) { in cvbr_CloseRateControl()
344 if (ct->m_BitrateGauge) { in cvbr_CloseRateControl()
345 MfeDrvMemFree((void**)&ct->m_BitrateGauge, (const MS_S8*)("m_BitrateGauge")); in cvbr_CloseRateControl()
346 ct->m_BitrateGauge = NULL; in cvbr_CloseRateControl()
352 MS_S32 cvbr_InitFrame(CVBRRateControl* ct, MS_S32 nFrameType, MS_S8 FieldType) in cvbr_InitFrame() argument
358 ct->m_bIsBotField = 0; in cvbr_InitFrame()
360 ct->m_bIsBotField = 1; // FieldType is 2 in cvbr_InitFrame()
362 ct->m_nFrameType = nFrameType; in cvbr_InitFrame()
363 ct->m_nLastVPBits = 0; in cvbr_InitFrame()
364 ct->m_nNewPacket = 0; in cvbr_InitFrame()
369 if (ct->m_nFrameCount>0) { in cvbr_InitFrame()
371 if (ct->m_nFrameCount>ct->m_nDeputyCount*MIN_DEPUTY_FACTOR) in cvbr_InitFrame()
372 nDeputyCount = ct->m_nDeputyCount; in cvbr_InitFrame()
373 else if (ct->m_nFrameCount<ct->m_nMinDeputyCount) in cvbr_InitFrame()
374 nDeputyCount = ct->m_nMinDeputyCount; in cvbr_InitFrame()
376 nDeputyCount = ct->m_nMinDeputyCount + in cvbr_InitFrame()
377 …(ct->m_nFrameCount-ct->m_nMinDeputyCount)*(ct->m_nDeputyCount-ct->m_nMinDeputyCount)/(ct->m_nDeput… in cvbr_InitFrame()
379 if (ct->m_rcMethod==CONST_BITRATE) { in cvbr_InitFrame()
380 …delta = (MS_S32)MFE_DIV_S64((MS_S64)(ct->m_nBufFullness-ct->m_nTargetFullness)*ct->m_nTargetFrameR… in cvbr_InitFrame()
387 else if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE) { in cvbr_InitFrame()
388 delta = (ct->m_nBufFullness-ct->m_nTargetFullness) / nDeputyCount; in cvbr_InitFrame()
389 if (delta<-ct->m_nMaxOffset) in cvbr_InitFrame()
390 delta = -ct->m_nMaxOffset; in cvbr_InitFrame()
392 else if (ct->m_rcMethod==VARIABLE_BITRATE) { in cvbr_InitFrame()
393 delta = (ct->m_nBufFullness-ct->m_nTargetFullness) / nDeputyCount; in cvbr_InitFrame()
394 if (delta>0 && ((ct->m_nLastFrameAvgQStep[0]<<6)>ct->m_nLongTermQP64)) in cvbr_InitFrame()
398 if (ct->m_nPCount==0) { in cvbr_InitFrame()
399 ct->m_nTargetBits = ct->m_nBitsPerFrame[0] - delta; in cvbr_InitFrame()
404 ct->m_nTargetBits = ct->m_nBitsPerFrame[0] - delta; in cvbr_InitFrame()
407 ct->m_nTargetBits = ct->m_nBitsPerFrame[1] - delta; in cvbr_InitFrame()
410 ct->m_nTargetBits = ct->m_nBitsPerFrame[2] - delta; in cvbr_InitFrame()
414 if (ct->m_nTargetBits<=(ct->m_nAvgBitsPerFrame>>3)) in cvbr_InitFrame()
415 ct->m_nTargetBits = (ct->m_nAvgBitsPerFrame>>3); // Target bitcount must>0 for ComputeFrameQP() in cvbr_InitFrame()
418 ct->m_nTargetBits = ct->m_nBitsPerFrame[0]; // Must be I-frame in cvbr_InitFrame()
423 ct->m_nFrameQStep = cvbr_ComputeFrameQStep(ct, nFrameType); in cvbr_InitFrame()
425 ct->m_nLastFrameAvgQStep[0] = ct->m_nLastFrameAvgQStep[1] = 0; in cvbr_InitFrame()
426 ct->m_nLastFrameBits = 0; in cvbr_InitFrame()
429 ct->m_nTargetMbBits = ct->m_nTargetBits / ct->m_nTotalMB; in cvbr_InitFrame()
434 ct->m_nFrameQStep = ct->m_nLastFrameAvgQStep[0] / ((ct->m_nTotalMB>>1)-1); in cvbr_InitFrame()
436 nTargetBits = ct->m_nTargetBits - ct->m_nLastFrameBits; in cvbr_InitFrame()
437 if (nTargetBits<ct->m_nTargetBits>>3) in cvbr_InitFrame()
438 nTargetBits = ct->m_nTargetBits>>3; in cvbr_InitFrame()
439 ct->m_nTargetMbBits = nTargetBits / (ct->m_nTotalMB>>1); in cvbr_InitFrame()
444 ct->m_nMBN = 0; in cvbr_InitFrame()
445 if (ct->m_nTargetMbBits<1) in cvbr_InitFrame()
446 ct->m_nTargetMbBits = 1; in cvbr_InitFrame()
449 nRtnQP = rcQstep2QP(ct, ct->m_nFrameQStep); in cvbr_InitFrame()
459 MS_S32 cvbr_UpdateFrame(CVBRRateControl* ct, MS_S32 totalUsedBits, MS_S8 bDummyFrame, MS_S8 FieldTy… in cvbr_UpdateFrame() argument
464 ct->m_nTotalBits += totalUsedBits; in cvbr_UpdateFrame()
465 ct->m_nLastFrameBits += totalUsedBits; in cvbr_UpdateFrame()
466 if(ct->m_nBufFullness < MAX_BUF_FULL) in cvbr_UpdateFrame()
467 ct->m_nBufFullness += totalUsedBits; in cvbr_UpdateFrame()
469 ct->m_nFrameCount++; in cvbr_UpdateFrame()
470 ct->m_nLastTargetBits = ct->m_nTargetBits; in cvbr_UpdateFrame()
473ct->m_nLastFrameAvgQStep[0] = (ct->m_nLastFrameAvgQStep[0]+ct->m_nLastFrameAvgQStep[1]) / (FieldTy… in cvbr_UpdateFrame()
475 if (ct->m_rcMethod==VARIABLE_BITRATE) in cvbr_UpdateFrame()
476ct->m_nLongTermQP64 += ((ct->m_nLastFrameAvgQStep[0]<<6)-ct->m_nLongTermQP64) / ct->m_nFrameCount; in cvbr_UpdateFrame()
477 else if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE) { in cvbr_UpdateFrame()
478 if (ct->m_nFrameCount==1) in cvbr_UpdateFrame()
479 ct->m_nLongTermQP64 = ct->m_nLastFrameAvgQStep[0]<<6; in cvbr_UpdateFrame()
481ct->m_nLongTermQP64 = (ct->m_nLongTermQP64*(ct->m_nDeputyCount-1) + (ct->m_nLastFrameAvgQStep[0]<<… in cvbr_UpdateFrame()
485 ct->m_nLastFrameAvgQStep[0] = ct->m_nFrameQStep; in cvbr_UpdateFrame()
488 if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE) { in cvbr_UpdateFrame()
489 ct->m_nGaugeBitrate -= ct->m_BitrateGauge[ct->m_nGaugeIndex]; in cvbr_UpdateFrame()
490 ct->m_nGaugeBitrate += totalUsedBits; in cvbr_UpdateFrame()
491 ct->m_BitrateGauge[ct->m_nGaugeIndex] = totalUsedBits; in cvbr_UpdateFrame()
492 ct->m_nGaugeIndex++; in cvbr_UpdateFrame()
493 if (ct->m_nGaugeIndex==ct->m_nGaugeCount) in cvbr_UpdateFrame()
494 ct->m_nGaugeIndex = 0; in cvbr_UpdateFrame()
498 ct->m_nBufFullness -= ct->m_nAvgBitsPerFrame; in cvbr_UpdateFrame()
503 if (FieldType!=1 && !ct->m_bFixedFrameRate && !bDummyFrame) in cvbr_UpdateFrame()
505 if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE || ct->m_rcMethod==VARIABLE_BITRATE) { in cvbr_UpdateFrame()
506 if ( ct->m_nLongTermQP64>(rcQP2Qstep(ct, ct->m_nFrameSkipThrQP)<<6) in cvbr_UpdateFrame()
507 && ct->m_nLastFrameBits >= (ct->m_nLastTargetBits<<1) ) { in cvbr_UpdateFrame()
509 … frameskip = (MS_S32)((ct->m_nLastFrameBits - ct->m_nLastTargetBits) / ct->m_nAvgBitsPerFrame - 1); in cvbr_UpdateFrame()
512 else if (frameskip>ct->m_nMaxFrozenFrame) in cvbr_UpdateFrame()
513 frameskip = ct->m_nMaxFrozenFrame; in cvbr_UpdateFrame()
516 else if (ct->m_rcMethod==CONST_BITRATE) { in cvbr_UpdateFrame()
517 if (ct->m_nLastFrameAvgQStep[0]>rcQP2Qstep(ct, ct->m_nFrameSkipThrQP)) { in cvbr_UpdateFrame()
519 MS_S32 nBufFullness = ct->m_nBufFullness; in cvbr_UpdateFrame()
520 while (nBufFullness > ct->m_nTargetFullness) { in cvbr_UpdateFrame()
521 nBufFullness = (MS_S32)(nBufFullness - ct->m_nAvgBitsPerFrame); in cvbr_UpdateFrame()
556 MS_S32 cvbr_ComputeFrameQStep(CVBRRateControl* ct, MS_S32 nFrameType) in cvbr_ComputeFrameQStep() argument
564 MS_S32 bitrate = ct->m_nBitrate; in cvbr_ComputeFrameQStep()
565 MS_S32 targetFPS_DeNum = ct->m_nTargetFrameRateDeNum; in cvbr_ComputeFrameQStep()
566 MS_S32 targetFPS_Num = ct->m_nTargetFrameRateNum; in cvbr_ComputeFrameQStep()
567 MS_S32 TotalMB = ct->m_nTotalMB; in cvbr_ComputeFrameQStep()
568 MS_S32 frame_count = ct->m_nFrameCount; in cvbr_ComputeFrameQStep()
571 if (ct->m_nFrameCount==0) { in cvbr_ComputeFrameQStep()
573 if (ct->m_rcMethod==CONST_QUALITY) { in cvbr_ComputeFrameQStep()
574 newQP = ct->m_nConstQP; in cvbr_ComputeFrameQStep()
575 newQPStep = rcQP2Qstep(ct, newQP); // So that frame qp will be exactly ct->m_nConstQP in cvbr_ComputeFrameQStep()
588 ct->m_nMaxFrozenFrame = newQP>>1; in cvbr_ComputeFrameQStep()
589 if (ct->m_nMaxFrozenFrame>15) in cvbr_ComputeFrameQStep()
590 ct->m_nMaxFrozenFrame=15; in cvbr_ComputeFrameQStep()
594 if (ct->m_rcMethod==CONST_QUALITY) in cvbr_ComputeFrameQStep()
595 return rcQP2Qstep(ct, ct->m_nConstQP); in cvbr_ComputeFrameQStep()
597 if (ct->m_rcMethod==CONST_BITRATE) { in cvbr_ComputeFrameQStep()
601 buf_rest += (SMOOTH_PERIOD*ct->m_nBitrate) - ct->m_nTotalBits; in cvbr_ComputeFrameQStep()
603 newQPStep = ct->m_nLastFrameAvgQStep[0]; in cvbr_ComputeFrameQStep()
604 frames_left = (SMOOTH_PERIOD * ct->m_nTargetFrameRateNum) / ct->m_nTargetFrameRateDeNum; in cvbr_ComputeFrameQStep()
609 dQP = ct->m_nLastFrameAvgQStep[0]>>3; in cvbr_ComputeFrameQStep()
610 if (ct->m_nLastFrameBits > (buf_rest_pic*9)>>3) { in cvbr_ComputeFrameQStep()
611 newQPStep = ct->m_nLastFrameAvgQStep[0]+dQP; in cvbr_ComputeFrameQStep()
613 else if (ct->m_nLastFrameBits < (buf_rest_pic*7)>>3) { in cvbr_ComputeFrameQStep()
614 newQPStep = ct->m_nLastFrameAvgQStep[0]-dQP; in cvbr_ComputeFrameQStep()
619 else if (ct->m_rcMethod==CONSTRAINED_VARIABLE_BITRATE) { in cvbr_ComputeFrameQStep()
621 nAdjust = ct->m_nLongTermQP64>>2; in cvbr_ComputeFrameQStep()
622 nLowBound = (ct->m_nLongTermQP64 - nAdjust) >> 6; in cvbr_ComputeFrameQStep()
623 nHighBound = (ct->m_nLongTermQP64 + nAdjust) >> 6; in cvbr_ComputeFrameQStep()
624 if (ct->m_nPCount>0 && nFrameType==I_VOP) { in cvbr_ComputeFrameQStep()
625 newQPStep = ct->m_nLastFrameAvgQStep[0]; in cvbr_ComputeFrameQStep()
626 if (ct->m_nGaugeBitrate<ct->m_nBitrate) in cvbr_ComputeFrameQStep()
633 …tmp= MFE_DIV_S64((MS_S64)ct->m_nLongTermQP64 * MFE_DIV_S64(ct->m_nTotalBits,ct->m_nFrameCount), ct in cvbr_ComputeFrameQStep()
637 MFE_DIV_S64((MS_S64)ct->m_nLongTermQP64 * MFE_DIV_S64(ct->m_nTotalBits,ct->m_nFrameCount), in cvbr_ComputeFrameQStep()
638 ct->m_nTargetBits) >>6) ; in cvbr_ComputeFrameQStep()
640 if (ct->m_nLastFrameBits>ct->m_nLastTargetBits) { in cvbr_ComputeFrameQStep()
641 … nAdjust = ((ct->m_nLastFrameBits-ct->m_nLastTargetBits)/ct->m_nMaxOffset) + (1<<QS_SHIFT_FACTOR); in cvbr_ComputeFrameQStep()
643 … if ((ct->m_nLastFrameAvgQStep[0]<<6) > ct->m_nLongTermQP64) { // Danger! Make it more aggressive in cvbr_ComputeFrameQStep()
644 nHighBound = ct->m_nLastFrameAvgQStep[0]+nAdjust; in cvbr_ComputeFrameQStep()
645 newQPStep = ct->m_nLastFrameAvgQStep[0]+nAdjust; in cvbr_ComputeFrameQStep()
652 else if (ct->m_nGaugeBitrate>ct->m_nBitrate) { in cvbr_ComputeFrameQStep()
653 if (newQPStep < ct->m_nLastFrameAvgQStep[0]) in cvbr_ComputeFrameQStep()
654 newQPStep = ct->m_nLastFrameAvgQStep[0]; in cvbr_ComputeFrameQStep()
655 if ((newQPStep<<6) < ct->m_nLongTermQP64) in cvbr_ComputeFrameQStep()
656 newQPStep = ct->m_nLongTermQP64>>6; in cvbr_ComputeFrameQStep()
659 if ((newQPStep<<6) >= ct->m_nLongTermQP64) in cvbr_ComputeFrameQStep()
660 newQPStep = (ct->m_nLongTermQP64>>6)-1; in cvbr_ComputeFrameQStep()
661 if (ct->m_nTargetFullness>ct->m_nBufFullness) { in cvbr_ComputeFrameQStep()
662 nAdjust = (ct->m_nTargetFullness-ct->m_nBufFullness) / (MS_S32)ct->m_nBitrate; in cvbr_ComputeFrameQStep()
670 else if (ct->m_rcMethod==VARIABLE_BITRATE) { in cvbr_ComputeFrameQStep()
672 if (ct->m_nPCount>0 && nFrameType==I_VOP) { in cvbr_ComputeFrameQStep()
673 newQPStep = ct->m_nLastFrameAvgQStep[0]; in cvbr_ComputeFrameQStep()
674 if ((ct->m_nLastFrameAvgQStep[0]<<6) > ct->m_nLongTermQP64) in cvbr_ComputeFrameQStep()
680 if (ct->m_nFrameCount>=ct->m_nTargetFrameRateInt || ct->m_nPCount==0) { in cvbr_ComputeFrameQStep()
682 (MS_S64)ct->m_nLongTermQP64 * MFE_DIV_S64(ct->m_nTotalBits,ct->m_nFrameCount), in cvbr_ComputeFrameQStep()
683 ct->m_nAvgBitsPerFrame) ; in cvbr_ComputeFrameQStep()
688 (MS_S64)ct->m_nLongTermQP64 * MFE_DIV_S64(ct->m_nTotalBits,ct->m_nFrameCount), in cvbr_ComputeFrameQStep()
689 ct->m_nAvgBitsPerFrame) >>6) ; in cvbr_ComputeFrameQStep()
694 nAdjLTQ = ct->m_nLongTermQP64>>6; // Wait for stabilization in cvbr_ComputeFrameQStep()
696 MS_ASSERT(ct->m_nTargetBits>0); in cvbr_ComputeFrameQStep()
697 newQPStep = (nAdjLTQ * ct->m_nAvgBitsPerFrame) / ct->m_nTargetBits; in cvbr_ComputeFrameQStep()
702 if (ct->m_nLastFrameBits>ct->m_nLastTargetBits) { in cvbr_ComputeFrameQStep()
703 nAdjust = (MS_S32)(ct->m_nLastFrameBits/ct->m_nLastTargetBits); in cvbr_ComputeFrameQStep()
708 if (ct->m_nAvgBitsPerFrame>ct->m_nTargetBits) { in cvbr_ComputeFrameQStep()
729 MS_S32 rcQP2Qstep(CVBRRateControl* ct, MS_S32 QP) in rcQP2Qstep() argument
731 if (ct->m_nCodecType==REG_ENC_MODE_H264) in rcQP2Qstep()
751 MS_S32 rcQstep2QP(CVBRRateControl* ct, MS_S32 QstepX32) in rcQstep2QP() argument
753 if (ct->m_nCodecType==REG_ENC_MODE_H264) in rcQstep2QP()
758 if( QstepX32 <= ct->m_nMinQStep) in rcQstep2QP()
759 return ct->m_nMinQP; in rcQstep2QP()
760 else if (QstepX32 > ct->m_nMaxQStep) in rcQstep2QP()
761 return ct->m_nMaxQP; in rcQstep2QP()
763 while( QstepX32 > rcQP2Qstep(ct, 5) ) in rcQstep2QP()
802 else if (ct->m_nCodecType==REG_ENC_MODE_MPG4 || ct->m_nCodecType==REG_ENC_MODE_H263) in rcQstep2QP()
804 if( QstepX32 <= ct->m_nMinQStep) in rcQstep2QP()
805 return ct->m_nMinQP; in rcQstep2QP()
806 else if (QstepX32 > ct->m_nMaxQStep) in rcQstep2QP()
807 return ct->m_nMaxQP; in rcQstep2QP()
819 MS_S32 cvbr_InitMB(CVBRRateControl* ct, MS_S32 nVar, const MS_S32 nPrevQP, const MS_S32 nBits, MS_S… in cvbr_InitMB() argument
846 if (ct->m_nMBN==0) { // Initialization in cvbr_InitMB()
847 ct->m_nSumAct = 0; in cvbr_InitMB()
848 ct->m_nTargetUsedBits = 0; in cvbr_InitMB()
851 if (ct->m_nMBN>0) in cvbr_InitMB()
854 ct->m_nPrevTopQP[(ct->m_nMBN-1)%ct->m_nMbWidth] = nPrevQP; in cvbr_InitMB()
855 ct->m_nLastFrameAvgQStep[ct->m_bIsBotField] += rcQP2Qstep(ct, nPrevQP); in cvbr_InitMB()
858 if (ct->m_nMBN<3) in cvbr_InitMB()
859 ct->m_nUsedBits[ct->m_nMBN-1] = nBits; in cvbr_InitMB()
861 ct->m_nUsedBits[0] = ct->m_nUsedBits[1]; in cvbr_InitMB()
862 ct->m_nUsedBits[1] = nBits; in cvbr_InitMB()
866 if (ct->m_nMBN>1) // HW pipeline: See below nNBits (or fNBits) calculation in cvbr_InitMB()
867 ct->m_nTargetUsedBits += ct->m_nTargetMbBits; in cvbr_InitMB()
871 ct->m_nSumAct += nVariance; in cvbr_InitMB()
874 ct->m_nNewPacket = 0; // Default in cvbr_InitMB()
875 if (ct->m_nMBN<2) { in cvbr_InitMB()
876 RtnQP = rcQstep2QP(ct, ct->m_nFrameQStep); in cvbr_InitMB()
880 …if (ct->m_nCodecType==REG_ENC_MODE_MPG4 && (!IsIntra) && ((ct->m_nFrameType==P_VOP&&IsP4MV)||(ct->… in cvbr_InitMB()
885 nNBits = (ct->m_nUsedBits[0]<<SCALE_BITS) / ct->m_nTargetUsedBits; in cvbr_InitMB()
889 nAvgAct = ct->m_nSumAct / (ct->m_nMBN+1); in cvbr_InitMB()
892 if (ct->m_nFrameType==I_VOP) in cvbr_InitMB()
893 QStep = (MS_S32)(((MS_S64)ct->m_nFrameQStep * nActj) >> SCALE_ACT); in cvbr_InitMB()
895 QStep = (MS_S32)(((MS_S64)ct->m_nFrameQStep * nActj * nNBits) >> (SCALE_ACT+SCALE_BITS)); in cvbr_InitMB()
897 fNBits = (MS_FLOAT)ct->m_nUsedBits[0] / ct->m_nTargetUsedBits; in cvbr_InitMB()
898 fAvgAct = (MS_FLOAT)ct->m_nSumAct / (ct->m_nMBN+1); in cvbr_InitMB()
901 if (ct->m_nFrameType==I_VOP) in cvbr_InitMB()
902 QStep = (MS_S32)(ct->m_nFrameQStep * fActj); in cvbr_InitMB()
904 QStep = (MS_S32)(ct->m_nFrameQStep * fActj * fNBits); in cvbr_InitMB()
911 RtnQP = rcQstep2QP(ct, QStep); in cvbr_InitMB()
913 if (ct->m_nMBN >= ct->m_nMbWidth) { in cvbr_InitMB()
914 if (RtnQP > ct->m_nPrevTopQP[ct->m_nMBN%ct->m_nMbWidth] + TOP_QP_DIFF_LIMIT) { in cvbr_InitMB()
915 RtnQP = ct->m_nPrevTopQP[ct->m_nMBN%ct->m_nMbWidth] + SPEC_QP_DIFF_LIMIT; in cvbr_InitMB()
918 else if (RtnQP < ct->m_nPrevTopQP[ct->m_nMBN%ct->m_nMbWidth] - TOP_QP_DIFF_LIMIT) { in cvbr_InitMB()
919 RtnQP = ct->m_nPrevTopQP[ct->m_nMBN%ct->m_nMbWidth] - SPEC_QP_DIFF_LIMIT; in cvbr_InitMB()
932 RtnQP = MSRC_MAX(ct->m_nMinQP, RtnQP); in cvbr_InitMB()
933 RtnQP = MSRC_MIN(ct->m_nMaxQP, RtnQP); in cvbr_InitMB()
937 if (ct->m_nCodecType==REG_ENC_MODE_MPG4 && ct->m_nFrameType==B_VOP /*&& RtnQP!=nPrevQP*/) { in cvbr_InitMB()
951 if (ct->m_nVPSize) { in cvbr_InitMB()
952 if (ct->m_nUsedBits[0]-ct->m_nLastVPBits>=ct->m_nVPSize) { in cvbr_InitMB()
953 if (ct->m_nVPMbRow) { in cvbr_InitMB()
954 nMBX = ct->m_nMBN%ct->m_nMbWidth; in cvbr_InitMB()
955 nMBY = ct->m_nMBN/ct->m_nMbWidth; in cvbr_InitMB()
956 if (nMBX==0 && nMBY>0 && (nMBY%ct->m_nVPMbRow)==0) { in cvbr_InitMB()
957 ct->m_nNewPacket = 1; in cvbr_InitMB()
958 ct->m_nLastVPBits = ct->m_nUsedBits[0]; in cvbr_InitMB()
962 ct->m_nNewPacket = 1; in cvbr_InitMB()
963 ct->m_nLastVPBits = ct->m_nUsedBits[0]; in cvbr_InitMB()
967 else if (ct->m_nVPMbRow) { in cvbr_InitMB()
968 nMBX = ct->m_nMBN%ct->m_nMbWidth; in cvbr_InitMB()
969 nMBY = ct->m_nMBN/ct->m_nMbWidth; in cvbr_InitMB()
970 if (nMBX==0 && nMBY>0 && (nMBY%ct->m_nVPMbRow)==0) { in cvbr_InitMB()
971 ct->m_nNewPacket = 1; in cvbr_InitMB()
972 ct->m_nLastVPBits = ct->m_nUsedBits[0]; in cvbr_InitMB()
977 if (ct->m_rcGranularity==FRAMELEVELRC) { in cvbr_InitMB()
978 RtnQP = rcQstep2QP(ct, ct->m_nFrameQStep); in cvbr_InitMB()
981 ct->m_nMBN++; in cvbr_InitMB()
982 if (ct->m_rcMethod==CONST_QUALITY) in cvbr_InitMB()
983 return ct->m_nConstQP; in cvbr_InitMB()
984 MS_ASSERT(RtnQP<=ct->m_nMaxQP && RtnQP>=ct->m_nMinQP); in cvbr_InitMB()
990 MS_S32 cvbr_InitMB(CVBRRateControl* ct, MS_S32 nVar, const MS_S32 nPrevQP, const MS_S32 nBits, MS_S… in cvbr_InitMB() argument
992 if (ct->m_nMBN>0) in cvbr_InitMB()
993 ct->m_nLastFrameAvgQStep[ct->m_bIsBotField] += rcQP2Qstep(nPrevQP); in cvbr_InitMB()
994 if (ct->m_rcMethod==CONST_QUALITY) in cvbr_InitMB()
995 return ct->m_nConstQP; in cvbr_InitMB()
996 return rcQstep2QP(ct->m_nFrameQStep); in cvbr_InitMB()