[x265] [PATCH] Modify TComSampleAdaptiveOffset structure to support multiple color space formats

ashok at multicorewareinc.com ashok at multicorewareinc.com
Fri Dec 20 14:59:13 CET 2013


# HG changeset patch
# User ashok at multicorewareinc.com
# Date 1387547940 -19800
#      Fri Dec 20 19:29:00 2013 +0530
# Node ID d3b5560deafced44b0dae5520fe4b936f14d1cd3
# Parent  f861042903dedcd7e9a49247ef0f08a150e53500
Modify TComSampleAdaptiveOffset structure to support multiple color space formats

diff -r f861042903de -r d3b5560deafc source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp
--- a/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp	Fri Dec 20 19:27:15 2013 +0530
+++ b/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp	Fri Dec 20 19:29:00 2013 +0530
@@ -150,8 +150,11 @@
 /** create SampleAdaptiveOffset memory.
  * \param
  */
-void TComSampleAdaptiveOffset::create(uint32_t sourceWidth, uint32_t sourceHeight, uint32_t maxCUWidth, uint32_t maxCUHeight)
+void TComSampleAdaptiveOffset::create(uint32_t sourceWidth, uint32_t sourceHeight, uint32_t maxCUWidth, uint32_t maxCUHeight, int csp)
 {
+    m_hChromaShift = CHROMA_H_SHIFT(csp);
+    m_vChromaShift = CHROMA_V_SHIFT(csp);
+
     m_picWidth  = sourceWidth;
     m_picHeight = sourceHeight;
 
@@ -554,12 +557,14 @@
     int32_t *offsetBo = NULL;
     int32_t *tmp_swap;
 
-    picWidthTmp  = m_picWidth  >> isChroma;
-    picHeightTmp = m_picHeight >> isChroma;
-    lcuWidth     = lcuWidth    >> isChroma;
-    lcuHeight    = lcuHeight   >> isChroma;
-    lpelx        = lpelx      >> isChroma;
-    tpely        = tpely      >> isChroma;
+    picWidthTmp  = (isChroma == 0) ? m_picWidth  : m_picWidth  >> m_hChromaShift;
+    picHeightTmp = (isChroma == 0) ? m_picHeight : m_picHeight >> m_vChromaShift;
+    lcuWidth     = (isChroma == 0) ? lcuWidth    : lcuWidth    >> m_hChromaShift;
+    lcuHeight    = (isChroma == 0) ? lcuHeight   : lcuHeight   >> m_vChromaShift;
+    lpelx        = (isChroma == 0) ? lpelx       : lpelx       >> m_hChromaShift;
+    tpely        = (isChroma == 0) ? tpely       : tpely       >> m_vChromaShift;
+
+
     rpelx        = lpelx + lcuWidth;
     bpely        = tpely + lcuHeight;
     rpelx        = rpelx > picWidthTmp  ? picWidthTmp  : rpelx;
@@ -589,8 +594,8 @@
 
 //   if (iSaoType!=SAO_BO_0 || iSaoType!=SAO_BO_1)
     {
-        cuHeightTmp = (m_maxCUHeight >> isChroma);
-        shift = (m_maxCUWidth >> isChroma) - 1;
+        cuHeightTmp  = (isChroma == 0) ? m_maxCUHeight  : (m_maxCUHeight  >> m_vChromaShift);
+        shift = (isChroma == 0) ? (m_maxCUWidth- 1) : ((m_maxCUWidth >> m_hChromaShift) - 1);
         for (int i = 0; i < cuHeightTmp + 1; i++)
         {
             m_tmpL2[i] = rec[shift];
@@ -827,12 +832,12 @@
     else if (yCbCr == 1)
     {
         rec        = m_pic->getPicYuvRec()->getCbAddr();
-        picWidthTmp = m_picWidth >> 1;
+        picWidthTmp = m_picWidth >> m_hChromaShift;
     }
     else
     {
         rec        = m_pic->getPicYuvRec()->getCrAddr();
-        picWidthTmp = m_picWidth >> 1;
+        picWidthTmp = m_picWidth >> m_hChromaShift;
     }
 
     memcpy(m_tmpU1[yCbCr], rec, sizeof(Pel) * picWidthTmp);
@@ -872,17 +877,17 @@
         {
             rec  = m_pic->getPicYuvRec()->getCbAddr(addr);
             stride = m_pic->getCStride();
-            picWidthTmp = m_picWidth >> 1;
+            picWidthTmp = m_picWidth >> m_hChromaShift;
         }
         else
         {
             rec  = m_pic->getPicYuvRec()->getCrAddr(addr);
             stride = m_pic->getCStride();
-            picWidthTmp = m_picWidth >> 1;
+            picWidthTmp = m_picWidth >> m_hChromaShift;
         }
 
-        //     pRec += stride*(m_uiMaxCUHeight-1);
-        for (i = 0; i < (m_maxCUHeight >> sChroma) + 1; i++)
+        uint32_t cuHeightTmp  = (sChroma == 0) ? m_maxCUHeight  : (m_maxCUHeight  >> m_vChromaShift);
+        for (i = 0; i < cuHeightTmp + 1; i++)
         {
             m_tmpL1[i] = rec[0];
             rec += stride;
@@ -964,8 +969,9 @@
                         rec  = m_pic->getPicYuvRec()->getCrAddr(addr);
                         stride = m_pic->getCStride();
                     }
-                    int widthShift = m_maxCUWidth >> sChroma;
-                    for (i = 0; i < (m_maxCUHeight >> sChroma) + 1; i++)
+
+                    int widthShift = (sChroma == 0) ? m_maxCUWidth : (m_maxCUWidth >> m_hChromaShift);
+                    for (i = 0; i < cuHeightTmp + 1; i++)
                     {
                         m_tmpL1[i] = rec[widthShift - 1];
                         rec += stride;
@@ -998,12 +1004,12 @@
     else if (yCbCr == 1)
     {
         rec        = m_pic->getPicYuvRec()->getCbAddr();
-        picWidthTmp = m_picWidth >> 1;
+        picWidthTmp = m_picWidth >> m_hChromaShift;
     }
     else
     {
         rec        = m_pic->getPicYuvRec()->getCrAddr();
-        picWidthTmp = m_picWidth >> 1;
+        picWidthTmp = m_picWidth >> m_hChromaShift;
     }
 
     if (idxY == 0)
@@ -1041,17 +1047,17 @@
         {
             rec  = m_pic->getPicYuvRec()->getCbAddr(addr);
             stride = m_pic->getCStride();
-            picWidthTmp = m_picWidth >> 1;
+            picWidthTmp = m_picWidth >> m_hChromaShift;
         }
         else
         {
             rec  = m_pic->getPicYuvRec()->getCrAddr(addr);
             stride = m_pic->getCStride();
-            picWidthTmp = m_picWidth >> 1;
+            picWidthTmp = m_picWidth >> m_hChromaShift;
         }
 
-        //     pRec += stride*(m_uiMaxCUHeight-1);
-        for (i = 0; i < (m_maxCUHeight >> sChroma) + 1; i++)
+        uint32_t maxCUHeight  = (sChroma == 0) ? m_maxCUHeight : (m_maxCUHeight >> m_vChromaShift);
+        for (i = 0; i < maxCUHeight + 1; i++)
         {
             m_tmpL1[i] = rec[0];
             rec += stride;
@@ -1126,8 +1132,9 @@
                         rec  = m_pic->getPicYuvRec()->getCrAddr(addr);
                         stride = m_pic->getCStride();
                     }
-                    int widthShift = m_maxCUWidth >> sChroma;
-                    for (i = 0; i < (m_maxCUHeight >> sChroma) + 1; i++)
+
+                    int widthShift = (sChroma == 0) ? m_maxCUWidth : (m_maxCUWidth >> m_hChromaShift);
+                    for (i = 0; i < maxCUHeight + 1; i++)
                     {
                         m_tmpL1[i] = rec[widthShift - 1];
                         rec += stride;
diff -r f861042903de -r d3b5560deafc source/Lib/TLibCommon/TComSampleAdaptiveOffset.h
--- a/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h	Fri Dec 20 19:27:15 2013 +0530
+++ b/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h	Fri Dec 20 19:29:00 2013 +0530
@@ -157,6 +157,9 @@
     int  m_numCuInHeight;
     int  m_numTotalParts;
 
+    int m_hChromaShift;
+    int m_vChromaShift;
+
     uint32_t m_saoBitIncreaseY;
     uint32_t m_saoBitIncreaseC; //for chroma
     uint32_t m_qp;
@@ -185,7 +188,7 @@
     TComSampleAdaptiveOffset();
     virtual ~TComSampleAdaptiveOffset();
 
-    void create(uint32_t sourceWidth, uint32_t sourceHeight, uint32_t maxCUWidth, uint32_t maxCUHeight);
+    void create(uint32_t sourceWidth, uint32_t sourceHeight, uint32_t maxCUWidth, uint32_t maxCUHeight, int csp);
     void destroy();
 
     int  convertLevelRowCol2Idx(int level, int row, int col) const;


More information about the x265-devel mailing list