[x265] [PATCH] vbv: enable row resets during vbv when mid-frame qp adjustemets are too high/low
Aarthi Priya Thirumalai
aarthi at multicorewareinc.com
Tue Mar 11 06:07:36 CET 2014
On Tue, Mar 11, 2014 at 2:51 AM, chen <chenm003 at 163.com> wrote:
>
> >+ //block current row if previous row is getting reencoded or prev row reference cus are not completed.
> >+ ScopedLock self(curRow.m_lock);
>
> >+ if (row > 0 && (m_rows[row - 1].m_isReencode || m_rows[row].m_completed < numCols - 2 && m_rows[row - 1].m_completed < m_rows[row].m_completed + 2))
> >+ {
> >+ m_rows[row].m_active = false;
> >+ m_rows[row].m_busy = false;
> >+ m_totalTime = m_totalTime + (x265_mdate() - startTime);
> >+ return;
> >+ }
> Seems you use bottomRows to deactive row thread, but most thread will
> continue to work.
> May we reset col to 0 for all rows below re-encode row.
>
other Row threads will not be activated because, we block the scheduler in
FindJobs() to early out till the flag m_bAllRowsStop is again set false.
so until the current row restart again with col 0, the below rows still
wait. If we set col to 0 here, for current active row, the for loop
continue with col++ only.
>
> > for (uint32_t col = curRow.m_completed; col < numCols; col++)
> > {
> >+ //reset current row data if reencoded is turned on this row
> >+ if (m_rows[row].m_isReencode == true )
> >+ {
> >+ col = 0;
> >+ m_bAllRowsStop = false;
> >+ m_rows[row].m_isReencode = false;
> >+ }
> > const uint32_t cuAddr = lineStartCUAddr + col;
> > TComDataCU* cu = m_pic->getCU(cuAddr);
> > cu->initCU(m_pic, cuAddr);
> >@@ -1069,16 +1089,26 @@
> > codeRow.m_entropyCoder.resetEntropy();
>
> > TEncSbac *bufSbac = (m_cfg->param->bEnableWavefront && col == 0 && row > 0) ? &m_rows[row - 1].m_bufferSbacCoder : NULL;
> >
> >- if ((uint32_t)row >= col && (row != 0) && isVbv)
> >- qpBase = m_pic->getCU(cuAddr - numCols + 1)->m_baseQp;
> >+ if(isVbv)
> >+ {
> >+ if ((uint32_t)row == 0)
> >+ m_pic->m_rowDiagQp[row] = m_pic->m_avgQpRc;
> >+
>
> >+ if ((uint32_t)row >= col && (row != 0) && m_vbvResetTriggerRow != row)
>
> >+ cu->m_baseQp = m_pic->getCU(cuAddr - numCols + 1)->m_baseQp;
> >+ else
> >+ cu->m_baseQp = m_pic->m_rowDiagQp[row];
> >+ }
> >+ else
> >+ cu->m_baseQp = m_pic->m_avgQpRc;
> >
> > if (m_cfg->param->rc.aqMode || isVbv)
> > {
> >- int qp = calcQpForCu(m_pic, cuAddr, qpBase);
> >+ int qp = calcQpForCu(m_pic, cuAddr, cu->m_baseQp);
> > setLambda(qp, row);
> > qp = X265_MIN(qp, MAX_QP);
> > cu->setQP(0, char(qp));
> >- cu->m_baseQp = qpBase;
> >+
> > if (m_cfg->param->rc.aqMode)
> > m_pic->m_qpaAq[row] += qp;
> > }
> >@@ -1087,22 +1117,46 @@
> > {
> > // Update encoded bits, satdCost, baseQP for each CU
> > m_pic->m_rowDiagSatd[row] += m_pic->m_cuCostsForVbv[cuAddr];
>
> >+ m_pic->m_rowDiagIntraSatd[row] += m_pic->m_intraCuCostsForVbv[cuAddr];
> > m_pic->m_rowEncodedBits[row] += cu->m_totalBits;
> > m_pic->m_numEncodedCusPerRow[row] = cuAddr;
> > m_pic->m_qpaRc[row] += cu->m_baseQp;
> >
> >- if ((uint32_t)row == col)
> >- m_pic->m_rowDiagQp[row] = qpBase;
> >-
>
> > // If current block is at row diagonal checkpoint, call vbv ratecontrol.
> > if ((uint32_t)row == col && row != 0)
> > {
>
> >- m_top->m_rateControl->rowDiagonalVbvRateControl(m_pic, row, &m_rce, qpBase);
> >+ qpBase = cu->m_baseQp;
>
> >+ int reEncode = m_top->m_rateControl->rowDiagonalVbvRateControl(m_pic, row, &m_rce, qpBase);
>
> > qpBase = Clip3((double)MIN_QP, (double)MAX_MAX_QP, qpBase);
> >+ m_pic->m_rowDiagQp[row] = qpBase;
> >+ m_pic->m_rowDiagQScale[row] = x265_qp2qScale(qpBase);
> >+ if (reEncode < 0)
> >+ {
> >+ m_bAllRowsStop = true;
> >+ m_rows[row].m_completed = 0;
> >+ m_rows[row].m_isReencode = true;
> >+ m_vbvResetTriggerRow = row;
>
> >+ for (int bottomRows = m_numRows - 1; bottomRows >= row ; bottomRows--)
> >+ {
> >+ if (bottomRows!=row)
> >+ {
> >+ //wait for each row to be idle
>
> >+ while(m_rows[bottomRows].m_active && m_rows[bottomRows].m_busy)
> >+ GIVE_UP_TIME();
> >+ }
> >+ m_rows[bottomRows].m_isReencode = true;
> >+ m_rows[bottomRows].m_completed = 0;
> >+ m_pic->m_qpaAq[bottomRows] = 0;
> >+ m_pic->m_rowEncodedBits[bottomRows] = 0;
> >+ m_pic->m_qpaRc[bottomRows] = 0;
> >+ m_pic->m_numEncodedCusPerRow[bottomRows] = 0;
> >+ }
> >+ }
> > }
> > }
> > // Completed CU processing
> >- m_rows[row].m_completed++;
> >+ if (!m_rows[row].m_isReencode)
> >+ m_rows[row].m_completed++;
> > if (m_rows[row].m_completed >= 2 && row < m_numRows - 1)
> > {
> > ScopedLock below(m_rows[row + 1].m_lock);
> >@@ -1171,6 +1225,7 @@
>
> > if (m_cfg->param->rc.vbvBufferSize > 0 && m_cfg->param->rc.vbvMaxBitrate > 0)
> > {
>
> > m_pic->m_cuCostsForVbv[cuAddr] += m_pic->m_lowres.lowresCostForRc[idx];
>
> >+ m_pic->m_intraCuCostsForVbv[cuAddr] += m_pic->m_lowres.intraCost[idx];
> > }
> > cnt++;
> > }
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140311/52645d9b/attachment.html>
More information about the x265-devel
mailing list