# HG changeset patch # User Aarthi Thirumalai # Date 1392898673 -19800 # Thu Feb 20 17:47:53 2014 +0530 # Node ID 9517ea331f3e87f41c687db11de02cb95ded8756 # Parent cbfb5bc44d6b8b74dc299a1c31bcfaa71dde2865 vbv: Add row predictors, rc states for vbv.
diff -r cbfb5bc44d6b -r 9517ea331f3e source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Thu Feb 20 17:03:38 2014 +0530 +++ b/source/encoder/encoder.cpp Thu Feb 20 17:47:53 2014 +0530 @@ -218,6 +218,7 @@ FrameEncoder *encoder = &m_frameEncoder[encIdx]; double bits; bits = encoder->m_rce.frameSizePlanned; + bits = X265_MAX(bits, m_rateControl->frameSizeEstimated); rc->bufferFill -= bits; rc->bufferFill = X265_MAX(rc->bufferFill, 0); rc->bufferFill += encoder->m_rce.bufferRate; diff -r cbfb5bc44d6b -r 9517ea331f3e source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cpp Thu Feb 20 17:03:38 2014 +0530 +++ b/source/encoder/ratecontrol.cpp Thu Feb 20 17:47:53 2014 +0530 @@ -243,11 +243,12 @@ lastNonBPictType = I_SLICE; isAbrReset = false; lastAbrResetPoc = -1; + frameSizeEstimated = 0; // vbv initialization cfg->param.rc.vbvBufferSize = Clip3(0, 2000000, cfg->param.rc.vbvBufferSize); cfg->param.rc.vbvMaxBitrate = Clip3(0, 2000000, cfg->param.rc.vbvMaxBitrate); cfg->param.rc.vbvBufferInit = Clip3(0.0, 2000000.0, cfg->param.rc.vbvBufferInit); - + vbvMinRate = 0; if (cfg->param.rc.vbvBufferSize) { if (cfg->param.rc.rateControlMode == X265_RC_CQP) @@ -317,6 +318,13 @@ pred[i].decay = 0.5; pred[i].offset = 0.0; } + for (int i = 0; i < 4; i++) + { + rowPreds[i].coeff = 0.25; + rowPreds[i].count = 1.0; + rowPreds[i].decay = 0.5; + rowPreds[i].offset = 0.0; + } predBfromP = pred[0]; bframes = cfg->param.bframes; @@ -374,10 +382,12 @@ rce->bLastMiniGopBFrame = pic->m_lowres.bLastMiniGopBFrame; rce->bufferRate = bufferRate; rce->poc = curSlice->getPOC(); - if (isVbv) + { + rowPred[0] = &rowPreds[sliceType]; + rowPred[1] = &rowPreds[3]; updateVbvPlan(enc); - + } if (isAbr) //ABR,CRF { currentSatd = l->getEstimatedPictureCost(pic); @@ -385,9 +395,10 @@ rce->lastSatd = currentSatd; double q = qScale2qp(rateEstimateQscale(pic, rce)); qp = Clip3(MIN_QP, MAX_MAX_QP, (int)(q + 0.5)); - rce->qpaRc = q; + rce->qpaRc = pic->m_avgQpRc = q; /* copy value of lastRceq into thread local rce struct *to be used in RateControlEnd() */ rce->qRceq = lastRceq; + rce->qpNoVbv = qpNoVbv; accumPQpUpdate(); } else //CQP @@ -397,9 +408,12 @@ else qp = qpConstant[sliceType]; } - if (sliceType != B_SLICE) + { lastNonBPictType = sliceType; + leadingNoBSatd = currentSatd; + } + rce->leadingNoBSatd = leadingNoBSatd; framesDone++; /* set the final QP to slice structure */ curSlice->setSliceQp(qp); @@ -461,10 +475,11 @@ q += pbOffset / 2; else q += pbOffset; - - rce->frameSizePlanned = predictSize(&predBfromP, qp2qScale(q), leadingNoBSatd); - - return qp2qScale(q); + qpNoVbv = q; + double qScale = qp2qScale(qpNoVbv); + rce->frameSizePlanned = predictSize(&predBfromP, qScale, (double)leadingNoBSatd); + frameSizeEstimated = rce->frameSizePlanned; + return qScale; } else { @@ -555,7 +570,7 @@ if (qCompress != 1 && framesDone == 0) q = qp2qScale(ABR_INIT_QP) / fabs(cfg->param.rc.ipFactor); } - + qpNoVbv = qScale2qp(q); double lmin1 = lmin[sliceType]; double lmax1 = lmax[sliceType]; q = Clip3(lmin1, lmax1, q); @@ -840,7 +855,7 @@ if (rce->bLastMiniGopBFrame) { if (rce->bframes != 0) - updatePredictor(&predBfromP, qp2qScale(rce->qpaRc), (double)rce->lastSatd, (double)bframeBits / rce->bframes); + updatePredictor(&predBfromP, qp2qScale(rce->qpaRc), (double)rce->leadingNoBSatd, (double)bframeBits / rce->bframes); bframeBits = 0; } } diff -r cbfb5bc44d6b -r 9517ea331f3e source/encoder/ratecontrol.h --- a/source/encoder/ratecontrol.h Thu Feb 20 17:03:38 2014 +0530 +++ b/source/encoder/ratecontrol.h Thu Feb 20 17:47:53 2014 +0530 @@ -53,7 +53,7 @@ int mvBits; int bframes; int poc; - + int64_t leadingNoBSatd; bool bLastMiniGopBFrame; double blurredComplexity; double qpaRc; @@ -61,8 +61,8 @@ double frameSizePlanned; double bufferRate; double movingAvgSum; + double qpNoVbv; }; - struct Predictor { double coeff; @@ -94,9 +94,10 @@ bool isVbv; Predictor pred[5]; Predictor predBfromP; + Predictor rowPreds[4]; + Predictor *rowPred[2]; int bframes; int bframeBits; - double leadingNoBSatd; bool isAbrReset; int lastAbrResetPoc; int64_t currentSatd; @@ -106,6 +107,7 @@ double ipOffset; double pbOffset; int lastNonBPictType; + int64_t leadingNoBSatd; double accumPQp; /* for determining I-frame quant */ double accumPNorm; double lastQScaleFor[3]; /* last qscale for a specific pict type, used for max_diff & ipb factor stuff */ @@ -118,8 +120,9 @@ double lastRceq; int framesDone; /* framesDone keeps track of # of frames passed through RateCotrol already */ double qCompress; + double qpNoVbv; /* QP for the current frame if 1-pass VBV was disabled. */ + double frameSizeEstimated; /* hold synched frameSize, updated from cu level vbv rc */ RateControl(TEncCfg * _cfg); - // to be called for each frame to process RateControl and set QP void rateControlStart(TComPic* pic, Lookahead *, RateControlEntry* rce, Encoder* enc); void calcAdaptiveQuantFrame(TComPic *pic); _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel