[x265] [PATCH] ABR tuning for MV-HEVC

Karam Singh karam.singh at multicorewareinc.com
Fri Aug 16 07:13:32 UTC 2024


Pushed to master branch.
*__________________________*
*Karam Singh*
*Ph.D. IIT Guwahati*
Senior Software (Video Coding) Engineer
Mobile: +91 8011279030
Block 9A, 6th floor, DLF Cyber City
Manapakkam, Chennai 600 089


On Thu, Aug 15, 2024 at 10:15 AM Gopi Satykrishna Akisetty <
gopi.satykrishna at multicorewareinc.com> wrote:

> From d3127dca7b3028e158ca73edaec803ee92facb94 Mon Sep 17 00:00:00 2001
> From: gopi satykrishna akisetty <gopi.satykrishna at multicorewareinc.com>
> Date: Thu, 8 Aug 2024 22:06:12 +0530
> Subject: [PATCH] ABR tuning for MV-HEVC
>
> ---
>  source/common/param.cpp         |  3 ++-
>  source/encoder/frameencoder.cpp | 48 ++++++++++++++++++++++++++++++---
>  2 files changed, 47 insertions(+), 4 deletions(-)
>
> diff --git a/source/common/param.cpp b/source/common/param.cpp
> index 5288bf453..aad31b515 100755
> --- a/source/common/param.cpp
> +++ b/source/common/param.cpp
> @@ -1965,7 +1965,8 @@ int x265_check_params(x265_param* param)
>  #if ENABLE_MULTIVIEW
>      CHECK((param->numViews > 2), "Multi-View Encoding currently support
> only 2 views");
>      CHECK((param->numViews > 1) && (param->internalBitDepth != 8),
> "BitDepthConstraint must be 8 for Multiview main profile");
> -    CHECK((param->numViews > 1 && param->rc.rateControlMode !=
> X265_RC_CQP), "Multiview encode supported only with CQP mode");
> +    CHECK((param->numViews > 1) && (param->rc.rateControlMode !=
> X265_RC_CQP && param->rc.rateControlMode !=  X265_RC_ABR),
> +        "Multiview encode supported only with CQP and ABR modes");
>  #endif
>  #if ENABLE_SCC_EXT
>      CHECK(!!param->bEnableSCC&& param->rdLevel != 6, "Enabling scc
> extension in x265 requires rdlevel of 6 ");
> diff --git a/source/encoder/frameencoder.cpp
> b/source/encoder/frameencoder.cpp
> index 7d02d0d96..0faa16713 100644
> --- a/source/encoder/frameencoder.cpp
> +++ b/source/encoder/frameencoder.cpp
> @@ -613,7 +613,49 @@ void FrameEncoder::compressFrame(int layer)
>      int qp = (layer == 0) ?
> m_top->m_rateControl->rateControlStart(m_frame[layer], &m_rce, m_top) :
> (int)m_rce.newQp;
>
>      m_rce.newQp = qp;
> +
> +    if (!!layer && m_top->m_lookahead->m_bAdaptiveQuant)
> +    {
> +        int ncu;
> +        if (m_param->rc.qgSize == 8)
> +            ncu = m_top->m_rateControl->m_ncu * 4;
> +        else
> +            ncu = m_top->m_rateControl->m_ncu;
> +        for (int i = 0; i < ncu; i++)
> +        {
> +            m_frame[layer]->m_lowres.qpCuTreeOffset[i] =
> m_frame[0]->m_lowres.qpCuTreeOffset[i];
> +            m_frame[layer]->m_lowres.qpAqOffset[i] =
> m_frame[0]->m_lowres.qpAqOffset[i];
> +        }
>
> +        m_frame[layer]->m_encData->m_avgQpAq =
> m_frame[0]->m_encData->m_avgQpAq;
> +        m_frame[layer]->m_encData->m_avgQpRc =
> m_frame[0]->m_encData->m_avgQpRc;
> +        if (!!m_param->rc.hevcAq)
> +        {
> +            for (uint32_t d = 0; d < 4; d++)
> +            {
> +                int ctuSizeIdx = 6 - g_log2Size[m_param->maxCUSize];
> +                int aqDepth = g_log2Size[m_param->maxCUSize] -
> g_log2Size[m_param->rc.qgSize];
> +                if (!aqLayerDepth[ctuSizeIdx][aqDepth][d])
> +                    continue;
> +                PicQPAdaptationLayer* pcAQLayer0 =
> &m_frame[0]->m_lowres.pAQLayer[d];
> +                PicQPAdaptationLayer* pcAQLayer1 =
> &m_frame[layer]->m_lowres.pAQLayer[d];
> +                const uint32_t aqPartWidth =
> m_frame[0]->m_lowres.pAQLayer[d].aqPartWidth;
> +                const uint32_t aqPartHeight =
> m_frame[0]->m_lowres.pAQLayer[d].aqPartHeight;
> +                double* pcQP0 = pcAQLayer0->dQpOffset;
> +                double* pcCuTree0 = pcAQLayer0->dCuTreeOffset;
> +                double* pcQP1 = pcAQLayer1->dQpOffset;
> +                double* pcCuTree1 = pcAQLayer1->dCuTreeOffset;
> +                for (uint32_t y = 0; y <
> m_frame[0]->m_fencPic->m_picHeight; y += aqPartHeight)
> +                {
> +                    for (uint32_t x = 0; x <
> m_frame[0]->m_fencPic->m_picWidth; x += aqPartWidth, pcQP0++, pcCuTree0++,
> pcQP1++, pcCuTree1++)
> +                    {
> +                        *pcQP1 = *pcQP0;
> +                        *pcCuTree1 = *pcCuTree0;
> +                    }
> +                }
> +            }
> +        }
> +    }
>      if (m_param->bEnableTemporalFilter)
>      {
>          m_frameEncTF->m_QP = qp;
> @@ -1551,7 +1593,7 @@ void FrameEncoder::processRowEncoder(int intRow,
> ThreadLocalData& tld, int layer
>          const uint32_t bLastCuInSlice = (bLastRowInSlice & (col ==
> numCols - 1)) ? 1 : 0;
>          ctu->initCTU(*m_frame[layer], cuAddr, slice->m_sliceQp,
> bFirstRowInSlice, bLastRowInSlice, bLastCuInSlice);
>
> -        if (bIsVbv)
> +        if (!layer && bIsVbv)
>          {
>              if (col == 0 && !m_param->bEnableWavefront)
>              {
> @@ -1719,7 +1761,7 @@ void FrameEncoder::processRowEncoder(int intRow,
> ThreadLocalData& tld, int layer
>          curEncData.m_cuStat[cuAddr].totalBits = best.totalBits;
>          x265_emms();
>
> -        if (bIsVbv)
> +        if (!layer && bIsVbv)
>          {
>              // Update encoded bits, satdCost, baseQP for each CU if tune
> grain is disabled
>              FrameData::RCStatCU& cuStat = curEncData.m_cuStat[cuAddr];
> @@ -1904,7 +1946,7 @@ void FrameEncoder::processRowEncoder(int intRow,
> ThreadLocalData& tld, int layer
>       * after half the frame is encoded, but after this initial period we
> update
>       * after refLagRows (the number of rows reference frames must have
> completed
>       * before referencees may begin encoding) */
> -    if (m_param->rc.rateControlMode == X265_RC_ABR || bIsVbv)
> +    if ((!layer) && (m_param->rc.rateControlMode == X265_RC_ABR ||
> bIsVbv))
>      {
>          uint32_t rowCount = 0;
>          uint32_t maxRows = m_sliceBaseRow[sliceId + 1] -
> m_sliceBaseRow[sliceId];
> --
> 2.34.1
>
> _______________________________________________
> 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/20240816/96833a86/attachment.htm>


More information about the x265-devel mailing list