[x265] [PATCH] Changes for loadCTUData

Ashok Kumar Mishra ashok at multicorewareinc.com
Mon Sep 29 13:24:01 CEST 2014


As of now we have not used offset value as per our plan. Later when we
need, can add offset value.

On Mon, Sep 29, 2014 at 4:46 PM, Santhoshini Sekar <
santhoshini at multicorewareinc.com> wrote:

> As of now offset can be removed from CU structure. We don't have any
> planned optimization with it. If needed we can
> add it later.
>
> On Mon, Sep 29, 2014 at 4:11 PM, Deepthi Nandakumar <
> deepthi at multicorewareinc.com> wrote:
>
>> Ashok/Santhoshini - pls review. Does removing offsets affect any planned
>> optimizations?
>>
>> On Sat, Sep 27, 2014 at 7:03 AM, <dtyx265 at gmail.com> wrote:
>>
>>> # HG changeset patch
>>> # User David T Yuen <dtyx265 at gmail.com>
>>> # Date 1411781537 25200
>>> # Node ID 85098db291ae133981419868685358227b8b1437
>>> # Parent  4b18a27b52ac69a16805c2b455d4f891cdd4a057
>>> Changes for loadCTUData
>>>
>>> Replaced getDepthScanIdx() with table g_depthScanIdx
>>> Moved Analysis::loadCTUData to TComDataCU::loadCTUData since it only
>>> works with TComDataCU fields
>>> Replaced CU.offsets[2] with local variables in loadCTUData since that is
>>> the only place it was set and used
>>> minor changes to reduce the number of local variables in loadCTUData
>>>
>>> diff -r 4b18a27b52ac -r 85098db291ae source/Lib/TLibCommon/TComDataCU.cpp
>>> --- a/source/Lib/TLibCommon/TComDataCU.cpp      Fri Sep 26 10:48:07 2014
>>> +0530
>>> +++ b/source/Lib/TLibCommon/TComDataCU.cpp      Fri Sep 26 18:32:17 2014
>>> -0700
>>> @@ -2407,4 +2407,43 @@
>>>          result.firstSignificanceMapContext = bIsLuma ? 21 : 12;
>>>  }
>>>
>>> +void TComDataCU::loadCTUData(uint32_t maxCUSize)
>>> +{
>>> +    // Initialize the coding blocks inside the CTB
>>> +    for (uint32_t log2CUSize = g_log2Size[maxCUSize], rangeCUIdx = 0;
>>> log2CUSize >= MIN_LOG2_CU_SIZE; log2CUSize--)
>>> +    {
>>> +        uint32_t blockSize  = 1 << log2CUSize;
>>> +        uint32_t sbWidth    = 1 << (g_log2Size[maxCUSize] - log2CUSize);
>>> +        int32_t last_level_flag = log2CUSize == MIN_LOG2_CU_SIZE;
>>> +        for (uint32_t sb_y = 0; sb_y < sbWidth; sb_y++)
>>> +        {
>>> +            for (uint32_t sb_x = 0; sb_x < sbWidth; sb_x++)
>>> +            {
>>> +                uint32_t depth_idx = g_depthScanIdx[sb_y][sb_x];
>>> +                uint32_t cuIdx = rangeCUIdx + depth_idx;
>>> +                uint32_t child_idx = rangeCUIdx + sbWidth * sbWidth +
>>> (depth_idx << 2);
>>> +                uint32_t px = m_cuPelX + sb_x * blockSize;
>>> +                uint32_t py = m_cuPelY + sb_y * blockSize;
>>> +                int32_t present_flag = px <
>>> m_pic->m_origPicYuv->m_picWidth && py < m_pic->m_origPicYuv->m_picHeight;
>>> +                int32_t split_mandatory_flag = present_flag &&
>>> !last_level_flag && (px + blockSize > m_pic->m_origPicYuv->m_picWidth || py
>>> + blockSize > m_pic->m_origPicYuv->m_picHeight);
>>> +
>>> +                /* Offset of the luma CU in the X, Y direction in terms
>>> of pixels from the CTU origin */
>>> +                uint32_t xOffset = (sb_x * blockSize) >> 3;
>>> +                uint32_t yOffset = (sb_y * blockSize) >> 3;
>>> +
>>> +                CU *cu = m_CULocalData + cuIdx;
>>> +                cu->log2CUSize = log2CUSize;
>>> +                cu->childIdx = child_idx;
>>> +                cu->encodeIdx = g_depthScanIdx[yOffset][xOffset];
>>> +                cu->flags = 0;
>>> +
>>> +                CU_SET_FLAG(cu->flags, CU::PRESENT, present_flag);
>>> +                CU_SET_FLAG(cu->flags, CU::SPLIT_MANDATORY | CU::SPLIT,
>>> split_mandatory_flag);
>>> +                CU_SET_FLAG(cu->flags, CU::LEAF, last_level_flag);
>>> +            }
>>> +        }
>>> +        rangeCUIdx += sbWidth * sbWidth;
>>> +    }
>>> +}
>>> +
>>>  //! \}
>>> diff -r 4b18a27b52ac -r 85098db291ae source/Lib/TLibCommon/TComDataCU.h
>>> --- a/source/Lib/TLibCommon/TComDataCU.h        Fri Sep 26 10:48:07 2014
>>> +0530
>>> +++ b/source/Lib/TLibCommon/TComDataCU.h        Fri Sep 26 18:32:17 2014
>>> -0700
>>> @@ -114,7 +114,6 @@
>>>      uint32_t log2CUSize; // Log of the CU size.
>>>      uint32_t childIdx;   // Index of the first child CU
>>>      uint32_t encodeIdx;  // Encoding index of this CU in terms of 8x8
>>> blocks.
>>> -    uint32_t offset[2];  // Offset of the luma CU in the X, Y direction
>>> in terms of pixels from the CTU origin
>>>      uint32_t flags;      // CU flags.
>>>  };
>>>
>>> @@ -274,6 +273,7 @@
>>>      void          initCU(Frame* pic, uint32_t cuAddr);
>>>      void          initEstData();
>>>      void          initSubCU(TComDataCU* cu, uint32_t partUnitIdx,
>>> uint32_t depth, int qp);
>>> +    void          loadCTUData(uint32_t maxCUSize);
>>>
>>>      void          copyToSubCU(TComDataCU* lcu, uint32_t partUnitIdx,
>>> uint32_t depth);
>>>      void          copyPartFrom(TComDataCU* cu, uint32_t partUnitIdx,
>>> uint32_t depth, bool isRDObasedAnalysis = true);
>>> diff -r 4b18a27b52ac -r 85098db291ae source/Lib/TLibCommon/TComRom.cpp
>>> --- a/source/Lib/TLibCommon/TComRom.cpp Fri Sep 26 10:48:07 2014 +0530
>>> +++ b/source/Lib/TLibCommon/TComRom.cpp Fri Sep 26 18:32:17 2014 -0700
>>> @@ -517,5 +517,18 @@
>>>      {256, 64, 16, 4}
>>>  };
>>>
>>> +/* g_depthScanIdx [y][x] */
>>> +const uint32_t g_depthScanIdx[8][8] =
>>> +{
>>> +    {   0,   1,   4,   5,  16,  17,  20,  21,  },
>>> +    {   2,   3,   6,   7,  18,  19,  22,  23,  },
>>> +    {   8,   9,  12,  13,  24,  25,  28,  29,  },
>>> +    {  10,  11,  14,  15,  26,  27,  30,  31,  },
>>> +    {  32,  33,  36,  37,  48,  49,  52,  53,  },
>>> +    {  34,  35,  38,  39,  50,  51,  54,  55,  },
>>> +    {  40,  41,  44,  45,  56,  57,  60,  61,  },
>>> +    {  42,  43,  46,  47,  58,  59,  62,  63,  }
>>> +};
>>> +
>>>  }
>>>  //! \}
>>> diff -r 4b18a27b52ac -r 85098db291ae source/Lib/TLibCommon/TComRom.h
>>> --- a/source/Lib/TLibCommon/TComRom.h   Fri Sep 26 10:48:07 2014 +0530
>>> +++ b/source/Lib/TLibCommon/TComRom.h   Fri Sep 26 18:32:17 2014 -0700
>>> @@ -159,6 +159,8 @@
>>>
>>>  extern const uint32_t g_depthInc[3][4];
>>>
>>> +extern const uint32_t g_depthScanIdx[8][8];
>>> +
>>>  }
>>>
>>>  #endif  //ifndef X265_TCOMROM_H
>>> diff -r 4b18a27b52ac -r 85098db291ae source/encoder/analysis.cpp
>>> --- a/source/encoder/analysis.cpp       Fri Sep 26 10:48:07 2014 +0530
>>> +++ b/source/encoder/analysis.cpp       Fri Sep 26 18:32:17 2014 -0700
>>> @@ -30,32 +30,6 @@
>>>
>>>  using namespace x265;
>>>
>>> -namespace {
>>> -// TO DO: Remove this function with a table.
>>> -int getDepthScanIdx(int x, int y, int size)
>>> -{
>>> -    if (size == 1)
>>> -        return 0;
>>> -
>>> -    int depth = 0;
>>> -    int h = size >> 1;
>>> -
>>> -    if (x >= h)
>>> -    {
>>> -        x -= h;
>>> -        depth += h * h;
>>> -    }
>>> -
>>> -    if (y >= h)
>>> -    {
>>> -        y -= h;
>>> -        depth += 2 * h * h;
>>> -    }
>>> -
>>> -    return depth + getDepthScanIdx(x, y, h);
>>> -}
>>> -}
>>> -
>>>  Analysis::Analysis()
>>>  {
>>>      m_bestPredYuv     = NULL;
>>> @@ -253,47 +227,6 @@
>>>      delete [] m_origYuv;
>>>  }
>>>
>>> -void Analysis::loadCTUData(TComDataCU* parentCU)
>>> -{
>>> -    uint8_t cuRange[2]= {MIN_LOG2_CU_SIZE,
>>> g_log2Size[m_param->maxCUSize]};
>>> -
>>> -    // Initialize the coding blocks inside the CTB
>>> -    for (int rangeIdx = cuRange[1], rangeCUIdx = 0; rangeIdx >=
>>> cuRange[0]; rangeIdx--)
>>> -    {
>>> -        uint32_t log2CUSize = rangeIdx;
>>> -        int32_t  blockSize  = 1 << log2CUSize;
>>> -        uint32_t b8Width    = 1 << (cuRange[1] - 3);
>>> -        uint32_t sbWidth    = 1 << (cuRange[1] - rangeIdx);
>>> -        int32_t last_level_flag = rangeIdx == cuRange[0];
>>> -        for (uint32_t sb_y = 0; sb_y < sbWidth; sb_y++)
>>> -        {
>>> -            for (uint32_t sb_x = 0; sb_x < sbWidth; sb_x++)
>>> -            {
>>> -                uint32_t depth_idx = getDepthScanIdx(sb_x, sb_y,
>>> sbWidth);
>>> -                uint32_t cuIdx = rangeCUIdx + depth_idx;
>>> -                uint32_t child_idx = rangeCUIdx + sbWidth * sbWidth +
>>> (depth_idx << 2);
>>> -                int32_t px = parentCU->getCUPelX() + sb_x * blockSize;
>>> -                int32_t py = parentCU->getCUPelY() + sb_y * blockSize;
>>> -                int32_t present_flag = px <
>>> parentCU->m_pic->m_origPicYuv->m_picWidth && py <
>>> parentCU->m_pic->m_origPicYuv->m_picHeight;
>>> -                int32_t split_mandatory_flag = present_flag &&
>>> !last_level_flag && (px + blockSize >
>>> parentCU->m_pic->m_origPicYuv->m_picWidth || py + blockSize >
>>> parentCU->m_pic->m_origPicYuv->m_picHeight);
>>> -
>>> -                CU *cu = parentCU->m_CULocalData + cuIdx;
>>> -                cu->log2CUSize = log2CUSize;
>>> -                cu->childIdx = child_idx;
>>> -                cu->offset[0] = sb_x * blockSize;
>>> -                cu->offset[1] = sb_y * blockSize;
>>> -                cu->encodeIdx = getDepthScanIdx(cu->offset[0] >> 3,
>>> cu->offset[1] >> 3, b8Width);
>>> -                cu->flags = 0;
>>> -
>>> -                CU_SET_FLAG(cu->flags, CU::PRESENT, present_flag);
>>> -                CU_SET_FLAG(cu->flags, CU::SPLIT_MANDATORY | CU::SPLIT,
>>> split_mandatory_flag);
>>> -                CU_SET_FLAG(cu->flags, CU::LEAF, last_level_flag);
>>> -            }
>>> -        }
>>> -        rangeCUIdx += sbWidth * sbWidth;
>>> -    }
>>> -}
>>> -
>>>  void Analysis::compressCU(TComDataCU* cu)
>>>  {
>>>      Frame* pic = cu->m_pic;
>>> diff -r 4b18a27b52ac -r 85098db291ae source/encoder/analysis.h
>>> --- a/source/encoder/analysis.h Fri Sep 26 10:48:07 2014 +0530
>>> +++ b/source/encoder/analysis.h Fri Sep 26 18:32:17 2014 -0700
>>> @@ -104,7 +104,6 @@
>>>      bool create(uint32_t totalDepth, uint32_t maxWidth);
>>>      void destroy();
>>>      void compressCU(TComDataCU* cu);
>>> -    void loadCTUData(TComDataCU* cu);
>>>
>>>  protected:
>>>
>>> diff -r 4b18a27b52ac -r 85098db291ae source/encoder/frameencoder.cpp
>>> --- a/source/encoder/frameencoder.cpp   Fri Sep 26 10:48:07 2014 +0530
>>> +++ b/source/encoder/frameencoder.cpp   Fri Sep 26 18:32:17 2014 -0700
>>> @@ -686,7 +686,7 @@
>>>              // load current best state from go-on entropy coder
>>>              curRow.rdEntropyCoders[0][CI_CURR_BEST].load(rowCoder);
>>>
>>> -        tld.analysis.loadCTUData(cu);
>>> +        cu->loadCTUData(m_param->maxCUSize);
>>>          tld.analysis.m_quant.setQPforQuant(cu);
>>>          tld.analysis.compressCU(cu); // Does all the CU analysis
>>>
>>> _______________________________________________
>>> x265-devel mailing list
>>> x265-devel at videolan.org
>>> https://mailman.videolan.org/listinfo/x265-devel
>>>
>>
>>
>> _______________________________________________
>> x265-devel mailing list
>> x265-devel at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>>
>
> _______________________________________________
> 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/20140929/ddc4b4be/attachment-0001.html>


More information about the x265-devel mailing list