[x265] [PATCH] vbv: fix race condition in processRowEncoder, store row qp directly in m_pic->m_rowDiagQp

Steve Borho steve at borho.org
Thu Mar 20 21:01:48 CET 2014


On Thu, Mar 20, 2014 at 4:53 AM,  <aarthi at multicorewareinc.com> wrote:
> # HG changeset patch
> # User Aarthi Thirumalai
> # Date 1395309217 -19800
> #      Thu Mar 20 15:23:37 2014 +0530
> # Node ID 137579db4ed278d807b6a8d39d669755c7cc1037
> # Parent  96d1d690d2ab75ffc58dbd252c2f245b55f05f80
> vbv: fix race condition in processRowEncoder, store row qp directly in m_pic->m_rowDiagQp.

queued for default; this needs to be back-ported, please make a patch
for the stable branch.

> diff -r 96d1d690d2ab -r 137579db4ed2 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Wed Mar 19 11:46:10 2014 -0500
> +++ b/source/encoder/frameencoder.cpp   Thu Mar 20 15:23:37 2014 +0530
> @@ -1021,7 +1021,6 @@
>      CTURow& codeRow = m_rows[m_cfg->param->bEnableWavefront ? row : 0];
>      const uint32_t numCols = m_pic->getPicSym()->getFrameWidthInCU();
>      const uint32_t lineStartCUAddr = row * numCols;
> -    double qpBase = m_pic->m_avgQpRc;
>      bool isVbv = m_cfg->param->rc.vbvBufferSize > 0 && m_cfg->param->rc.vbvMaxBitrate > 0;
>      for (uint32_t col = curRow.m_completed; col < numCols; col++)
>      {
> @@ -1033,17 +1032,25 @@
>          codeRow.m_entropyCoder.setEntropyCoder(&m_sbacCoder, m_pic->getSlice());
>          codeRow.m_entropyCoder.resetEntropy();
>          TEncSbac *bufSbac = (m_cfg->param->bEnableWavefront && col == 0 && row > 0) ? &m_rows[row - 1].m_bufferSbacCoder : NULL;
> +        if (isVbv)
> +        {
> +            if (!row)
> +                m_pic->m_rowDiagQp[row] = m_pic->m_avgQpRc;
>
> -        if ((uint32_t)row >= col && (row != 0) && isVbv)
> -            qpBase = m_pic->getCU(cuAddr - numCols + 1)->m_baseQp;
> +            if ((uint32_t)row >= col && (row != 0))
> +                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 = Clip3(-QP_BD_OFFSET, MAX_QP, qp);
>              cu->setQPSubParts(char(qp), 0, 0);
> -            cu->m_baseQp = qpBase;
>              if (m_cfg->param->rc.aqMode)
>                  m_pic->m_qpaAq[row] += qp;
>          }
> @@ -1056,14 +1063,14 @@
>              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 = Clip3((double)MIN_QP, (double)MAX_MAX_QP, qpBase);
> +                m_pic->m_rowDiagQp[row] = cu->m_baseQp;
> +                m_top->m_rateControl->rowDiagonalVbvRateControl(m_pic, row, &m_rce, m_pic->m_rowDiagQp[row]);
> +                m_pic->m_rowDiagQScale[row] = Clip3((double)MIN_QP, (double)MAX_QP, m_pic->m_rowDiagQScale[row]);
> +                m_pic->m_rowDiagQScale[row] =  x265_qp2qScale(m_pic->m_rowDiagQp[row]);
>              }
>          }
>          // Completed CU processing
> diff -r 96d1d690d2ab -r 137579db4ed2 source/encoder/ratecontrol.cpp
> --- a/source/encoder/ratecontrol.cpp    Wed Mar 19 11:46:10 2014 -0500
> +++ b/source/encoder/ratecontrol.cpp    Thu Mar 20 15:23:37 2014 +0530
> @@ -792,7 +792,7 @@
>                  }
>
>                  refRowSatdCost >>= X265_DEPTH - 8;
> -                refQScale = row == maxRows - 1 ? refPic->m_rowDiagQScale[row] : refPic->m_rowDiagQScale[row + 1];
> +                refQScale = refPic->m_rowDiagQScale[row];
>              }
>
>              if (picType == I_SLICE || qScale >= refQScale)
> @@ -828,9 +828,6 @@
>  int RateControl::rowDiagonalVbvRateControl(TComPic* pic, uint32_t row, RateControlEntry* rce, double& qpVbv)
>  {
>      double qScaleVbv = x265_qp2qScale(qpVbv);
> -
> -    pic->m_rowDiagQp[row] = qpVbv;
> -    pic->m_rowDiagQScale[row] = qScaleVbv;
>      uint64_t rowSatdCost = pic->m_rowDiagSatd[row];
>      double encodedBits = pic->m_rowEncodedBits[row];
>      if (row == 1)
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel



-- 
Steve Borho


More information about the x265-devel mailing list