[x265] refine initializeGeoms()

Steve Borho steve at borho.org
Tue Nov 11 22:33:04 CET 2014


On 11/11, Satoshi Nakagawa wrote:
> # HG changeset patch
> # User Satoshi Nakagawa <nakagawa424 at oki.com>
> # Date 1415701819 -32400
> #      Tue Nov 11 19:30:19 2014 +0900
> # Node ID 5638df706f0833bd211c73612ba0d4403c813d9e
> # Parent  32513a4c3bd435757347e729dc14b5a1c1c6ceef
> refine initializeGeoms()

queued for default, thanks

> diff -r 32513a4c3bd4 -r 5638df706f08 source/common/cudata.cpp
> --- a/source/common/cudata.cpp	Mon Nov 10 12:39:54 2014 +0900
> +++ b/source/common/cudata.cpp	Tue Nov 11 19:30:19 2014 +0900
> @@ -2078,7 +2078,7 @@
>  
>  #define CU_SET_FLAG(bitfield, flag, value) (bitfield) = ((bitfield) & (~(flag))) | ((~((value) - 1)) & (flag))
>  
> -void CUData::calcCTUGeoms(uint32_t picWidth, uint32_t picHeight, uint32_t maxCUSize, CUGeom cuDataArray[CUGeom::MAX_GEOMS]) const
> +void CUData::calcCTUGeoms(uint32_t ctuWidth, uint32_t ctuHeight, uint32_t maxCUSize, CUGeom cuDataArray[CUGeom::MAX_GEOMS])
>  {
>      // Initialize the coding blocks inside the CTB
>      for (uint32_t log2CUSize = g_log2Size[maxCUSize], rangeCUIdx = 0; log2CUSize >= MIN_LOG2_CU_SIZE; log2CUSize--)
> @@ -2093,10 +2093,10 @@
>                  uint32_t depthIdx = g_depthScanIdx[sbY][sbX];
>                  uint32_t cuIdx = rangeCUIdx + depthIdx;
>                  uint32_t childIdx = rangeCUIdx + sbWidth * sbWidth + (depthIdx << 2);
> -                uint32_t px = m_cuPelX + sbX * blockSize;
> -                uint32_t py = m_cuPelY + sbY * blockSize;
> -                int32_t presentFlag = px < picWidth && py < picHeight;
> -                int32_t splitMandatoryFlag = presentFlag && !lastLevelFlag && (px + blockSize > picWidth || py + blockSize > picHeight);
> +                uint32_t px = sbX * blockSize;
> +                uint32_t py = sbY * blockSize;
> +                int32_t presentFlag = px < ctuWidth && py < ctuHeight;
> +                int32_t splitMandatoryFlag = presentFlag && !lastLevelFlag && (px + blockSize > ctuWidth || py + blockSize > ctuHeight);

BTW: I've been thinking we should change the meaning of the flags or
simply add two more for TRY_SPLIT and TRY_CODE to simplify the logic
in the recursive compress* functions

>                  
>                  /* Offset of the luma CU in the X, Y direction in terms of pixels from the CTU origin */
>                  uint32_t xOffset = (sbX * blockSize) >> 3;
> diff -r 32513a4c3bd4 -r 5638df706f08 source/common/cudata.h
> --- a/source/common/cudata.h	Mon Nov 10 12:39:54 2014 +0900
> +++ b/source/common/cudata.h	Tue Nov 11 19:30:19 2014 +0900
> @@ -158,7 +158,7 @@
>      CUData();
>  
>      void     initialize(const CUDataMemPool& dataPool, uint32_t depth, int csp, int instance);
> -    void     calcCTUGeoms(uint32_t picWidth, uint32_t picHeight, uint32_t maxCUSize, CUGeom cuDataArray[CUGeom::MAX_GEOMS]) const;
> +    static void     calcCTUGeoms(uint32_t ctuWidth, uint32_t ctuHeight, uint32_t maxCUSize, CUGeom cuDataArray[CUGeom::MAX_GEOMS]);
>  
>      void     initCTU(const Frame& frame, uint32_t cuAddr, int qp);
>      void     initSubCU(const CUData& ctu, const CUGeom& cuGeom);
> diff -r 32513a4c3bd4 -r 5638df706f08 source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp	Mon Nov 10 12:39:54 2014 +0900
> +++ b/source/encoder/frameencoder.cpp	Tue Nov 11 19:30:19 2014 +0900
> @@ -138,11 +138,12 @@
>  }
>  
>  /* Generate a complete list of unique geom sets for the current picture dimensions */
> -bool FrameEncoder::initializeGeoms(const FrameData& encData)
> +bool FrameEncoder::initializeGeoms()
>  {
>      /* Geoms only vary between CTUs in the presence of picture edges */
> -    int heightRem = m_param->sourceHeight & (m_param->maxCUSize - 1);
> -    int widthRem = m_param->sourceWidth & (m_param->maxCUSize - 1);
> +    int maxCUSize = m_param->maxCUSize;
> +    int heightRem = m_param->sourceHeight & (maxCUSize - 1);
> +    int widthRem = m_param->sourceWidth & (maxCUSize - 1);
>      int allocGeoms = 1; // body
>      if (heightRem && widthRem)
>          allocGeoms = 4; // body, right, bottom, corner
> @@ -154,33 +155,45 @@
>      if (!m_cuGeoms || !m_ctuGeomMap)
>          return false;
>  
> -    CUGeom cuLocalData[CUGeom::MAX_GEOMS];
> -    memset(cuLocalData, 0, sizeof(cuLocalData)); // temporal fix for memcmp
> +    // body
> +    CUData::calcCTUGeoms(maxCUSize, maxCUSize, maxCUSize, m_cuGeoms);
> +    memset(m_ctuGeomMap, 0, sizeof(uint32_t) * m_numRows * m_numCols);
> +    if (allocGeoms == 1)
> +        return true;
>  
> -    int countGeoms = 0;
> -    for (uint32_t ctuAddr = 0; ctuAddr < m_numRows * m_numCols; ctuAddr++)
> +    int countGeoms = 1;
> +    if (widthRem)
>      {
> -        /* TODO: detach this logic from TComDataCU */
> -        encData.m_picCTU[ctuAddr].initCTU(*m_frame, ctuAddr, 0);
> -        encData.m_picCTU[ctuAddr].calcCTUGeoms(m_param->sourceWidth, m_param->sourceHeight, m_param->maxCUSize, cuLocalData);
> +        // right
> +        CUData::calcCTUGeoms(widthRem, maxCUSize, maxCUSize, m_cuGeoms + countGeoms * CUGeom::MAX_GEOMS);
> +        for (int i = 0; i < m_numRows; i++)
> +        {
> +            uint32_t ctuAddr = m_numCols * (i + 1) - 1;
> +            m_ctuGeomMap[ctuAddr] = countGeoms * CUGeom::MAX_GEOMS;
> +        }
> +        countGeoms++;
> +    }
> +    if (heightRem)
> +    {
> +        // bottom
> +        CUData::calcCTUGeoms(maxCUSize, heightRem, maxCUSize, m_cuGeoms + countGeoms * CUGeom::MAX_GEOMS);
> +        for (uint32_t i = 0; i < m_numCols; i++)
> +        {
> +            uint32_t ctuAddr = m_numCols * (m_numRows - 1) + i;
> +            m_ctuGeomMap[ctuAddr] = countGeoms * CUGeom::MAX_GEOMS;
> +        }
> +        countGeoms++;
>  
> -        m_ctuGeomMap[ctuAddr] = MAX_INT;
> -        for (int i = 0; i < countGeoms; i++)
> +        if (widthRem)
>          {
> -            if (!memcmp(cuLocalData, m_cuGeoms + i * CUGeom::MAX_GEOMS, sizeof(CUGeom) * CUGeom::MAX_GEOMS))
> -            {
> -                m_ctuGeomMap[ctuAddr] = i * CUGeom::MAX_GEOMS;
> -                break;
> -            }
> -        }
> +            // corner
> +            CUData::calcCTUGeoms(widthRem, heightRem, maxCUSize, m_cuGeoms + countGeoms * CUGeom::MAX_GEOMS);
>  
> -        if (m_ctuGeomMap[ctuAddr] == MAX_INT)
> -        {
> -            X265_CHECK(countGeoms < allocGeoms, "geometry match check failure\n");
> +            uint32_t ctuAddr = m_numCols * m_numRows - 1;
>              m_ctuGeomMap[ctuAddr] = countGeoms * CUGeom::MAX_GEOMS;
> -            memcpy(m_cuGeoms + countGeoms * CUGeom::MAX_GEOMS, cuLocalData, sizeof(CUGeom) * CUGeom::MAX_GEOMS);
>              countGeoms++;
>          }
> +        X265_CHECK(countGeoms == allocGeoms, "geometry match check failure\n");
>      }
>  
>      return true;
> @@ -193,7 +206,7 @@
>      curFrame->m_encData->m_slice->m_mref = m_mref;
>      if (!m_cuGeoms)
>      {
> -        if (!initializeGeoms(*curFrame->m_encData))
> +        if (!initializeGeoms())
>              return false;
>      }
>      m_enable.trigger();
> diff -r 32513a4c3bd4 -r 5638df706f08 source/encoder/frameencoder.h
> --- a/source/encoder/frameencoder.h	Mon Nov 10 12:39:54 2014 +0900
> +++ b/source/encoder/frameencoder.h	Tue Nov 11 19:30:19 2014 +0900
> @@ -185,7 +185,7 @@
>  
>  protected:
>  
> -    bool initializeGeoms(const FrameData& encData);
> +    bool initializeGeoms();
>  
>      /* analyze / compress frame, can be run in parallel within reference constraints */
>      void compressFrame();
> _______________________________________________
> 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