HEVC学习(十四) —— SAO函数解析之二

这篇博客写得不错,觉得对我对大家刚开始学习时会有帮助,于是转载之。原文地址:http://blog.csdn.net/hevc_cjl/article/details/8288572


  1. /** rate distortion optimization of all SAO units
  2. * \param saoParam SAO parameters
  3. * \param lambda
  4. * \param lambdaChroma
  5. */
  6. #if SAO_ENCODING_CHOICE
  7. Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma, Int depth)
  8. #else
  9. Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma)
  10. #endif
  11. {
  12. Int idxY;
  13. Int idxX;
  14. Int frameHeightInCU = saoParam->numCuInHeight;
  15. Int frameWidthInCU = saoParam->numCuInWidth;
  16. Int j, k;
  17. Int addr = 0;
  18. Int addrUp = -1;
  19. Int addrLeft = -1;
  20. Int compIdx = 0;
  21. SaoLcuParam mergeSaoParam[3][2];
  22. Double compDistortion[3];
  23. saoParam->bSaoFlag[0] = true;
  24. saoParam->bSaoFlag[1] = true;
  25. saoParam->oneUnitFlag[0] = false;
  26. saoParam->oneUnitFlag[1] = false;
  27. saoParam->oneUnitFlag[2] = false;
  28. #if SAO_ENCODING_CHOICE
  29. #if SAO_ENCODING_CHOICE_CHROMA
  30. Int numNoSao[2];
  31. numNoSao[0] = 0;// Luma
  32. numNoSao[1] = 0;// Chroma
  33. if( depth > 0 && m_depthSaoRate[0][depth-1] > SAO_ENCODING_RATE )
  34. {
  35. saoParam->bSaoFlag[0] = false;
  36. }
  37. if( depth > 0 && m_depthSaoRate[1][depth-1] > SAO_ENCODING_RATE_CHROMA )
  38. {
  39. saoParam->bSaoFlag[1] = false;
  40. }
  41. #else
  42. Int numNoSao = 0;
  43. if( depth > 0 && m_depth0SaoRate > SAO_ENCODING_RATE )
  44. {
  45. saoParam->bSaoFlag[0] = false;
  46. saoParam->bSaoFlag[1] = false;
  47. }
  48. #endif
  49. #endif
  50. //!< 以LCU为单位对图像中的每个LCU进行遍历
  51. for (idxY = 0; idxY< frameHeightInCU; idxY++)
  52. {
  53. for (idxX = 0; idxX< frameWidthInCU; idxX++)
  54. {
  55. addr = idxX + frameWidthInCU*idxY; //!< 当前LCU地址
  56. addrUp = addr < frameWidthInCU ? -1:idxX + frameWidthInCU*(idxY-1); //!< 当前LCU上邻块地址
  57. addrLeft = idxX == 0 ? -1:idxX-1 + frameWidthInCU*idxY; //!< 当前LCU左邻块地址
  58. Int allowMergeLeft = 1;
  59. Int allowMergeUp = 1;
  60. UInt rate;
  61. Double bestCost, mergeCost;
  62. if (idxX!=0) //!< 非第1列
  63. {
  64. // check tile id and slice id //! 检查当前LCU与其左邻块是否属于同一个tile以及是否属于同一个slice,不同的话该邻块不可用
  65. if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-1) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-1)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
  66. {
  67. allowMergeLeft = 0; //!< 左邻块不可用
  68. }
  69. }
  70. else
  71. {
  72. allowMergeLeft = 0; //!< 第1列的左邻块均不可用
  73. }
  74. if (idxY!=0) //!< 非第1行
  75. {//! 检查当前LCU与其上邻块是否属于同一个tile以及是否属于同一个slice,不同的话该邻块不可用
  76. if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-m_iNumCuInWidth) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-m_iNumCuInWidth)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
  77. {
  78. allowMergeUp = 0; //!< 上邻块不可用
  79. }
  80. }
  81. else
  82. {
  83. allowMergeUp = 0; //!< 第1行的上邻块均不可用
  84. }
  85. compDistortion[0] = 0; //!< Y distortion
  86. compDistortion[1] = 0; //!< Cb distortion
  87. compDistortion[2] = 0; //!< Cr distortion
  88. m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
  89. if (allowMergeLeft)
  90. {
  91. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0); //!< 编码句法元素sao_merge_left_flag
  92. }
  93. if (allowMergeUp)
  94. {
  95. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0); //!< 编码句法元素sao_merge_up_flag
  96. }
  97. m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_TEMP_BEST] );
  98. // reset stats Y, Cb, Cr
  99. for ( compIdx=0;compIdx<3;compIdx++)
  100. {
  101. for ( j=0;j<MAX_NUM_SAO_TYPE;j++)
  102. {
  103. for ( k=0;k< MAX_NUM_SAO_CLASS;k++)
  104. {
  105. m_iOffset [compIdx][j][k] = 0;
  106. if( m_saoLcuBasedOptimization && m_saoLcuBoundary ){ //!< true && false
  107. m_iCount [compIdx][j][k] = m_count_PreDblk [addr][compIdx][j][k];
  108. m_iOffsetOrg[compIdx][j][k] = m_offsetOrg_PreDblk[addr][compIdx][j][k];
  109. }
  110. else
  111. {
  112. m_iCount [compIdx][j][k] = 0;
  113. m_iOffsetOrg[compIdx][j][k] = 0;
  114. }
  115. }
  116. }
  117. saoParam->saoLcuParam[compIdx][addr].typeIdx = -1;
  118. saoParam->saoLcuParam[compIdx][addr].mergeUpFlag = 0;
  119. saoParam->saoLcuParam[compIdx][addr].mergeLeftFlag = 0;
  120. saoParam->saoLcuParam[compIdx][addr].subTypeIdx = 0;
  121. #if SAO_ENCODING_CHOICE
  122. if( (compIdx ==0 && saoParam->bSaoFlag[0])|| (compIdx >0 && saoParam->bSaoFlag[1]) )
  123. #endif
  124. {//! 统计BO和EO各个模式下,对应classIdx下滤波前的重建像素值与原始像素值的差值的总和,以及对classIdx的计数
  125. calcSaoStatsCu(addr, compIdx, compIdx);
  126. }
  127. }
  128. //!< Y分量最佳滤波模式的选择
  129. saoComponentParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, 0, lambda, &mergeSaoParam[0][0], &compDistortion[0]);
  130. //!< CbCr分量最佳滤波模式的选择
  131. sao2ChromaParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, lambdaChroma, &mergeSaoParam[1][0], &mergeSaoParam[2][0], &compDistortion[0]);
  132. if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )
  133. {
  134. // Cost of new SAO_params
  135. m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
  136. m_pcRDGoOnSbacCoder->resetBits();
  137. if (allowMergeLeft)
  138. {
  139. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
  140. }
  141. if (allowMergeUp)
  142. {
  143. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
  144. }
  145. for ( compIdx=0;compIdx<3;compIdx++)
  146. {
  147. if( (compIdx ==0 && saoParam->bSaoFlag[0]) || (compIdx >0 && saoParam->bSaoFlag[1]))
  148. {
  149. m_pcEntropyCoder->encodeSaoOffset(&saoParam->saoLcuParam[compIdx][addr], compIdx);
  150. }
  151. }
  152. rate = m_pcEntropyCoder->getNumberOfWrittenBits();
  153. bestCost = compDistortion[0] + (Double)rate;
  154. m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
  155. // Cost of Merge
  156. for(Int mergeUp=0; mergeUp<2; ++mergeUp)
  157. {
  158. if ( (allowMergeLeft && (mergeUp==0)) || (allowMergeUp && (mergeUp==1)) )
  159. {
  160. m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
  161. m_pcRDGoOnSbacCoder->resetBits();
  162. if (allowMergeLeft)
  163. {
  164. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1-mergeUp);
  165. }
  166. if ( allowMergeUp && (mergeUp==1) )
  167. {
  168. m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1);
  169. }
  170. rate = m_pcEntropyCoder->getNumberOfWrittenBits();
  171. mergeCost = compDistortion[mergeUp+1] + (Double)rate;
  172. if (mergeCost < bestCost)
  173. {
  174. bestCost = mergeCost;
  175. m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
  176. for ( compIdx=0;compIdx<3;compIdx++)
  177. {
  178. mergeSaoParam[compIdx][mergeUp].mergeLeftFlag = 1-mergeUp;
  179. mergeSaoParam[compIdx][mergeUp].mergeUpFlag = mergeUp;
  180. if( (compIdx==0 && saoParam->bSaoFlag[0]) || (compIdx>0 && saoParam->bSaoFlag[1]))
  181. {
  182. copySaoUnit(&saoParam->saoLcuParam[compIdx][addr], &mergeSaoParam[compIdx][mergeUp] );
  183. }
  184. }
  185. }
  186. }
  187. }
  188. #if SAO_ENCODING_CHOICE
  189. #if SAO_ENCODING_CHOICE_CHROMA
  190. if( saoParam->saoLcuParam[0][addr].typeIdx == -1) //!< Y分量不存在SAO参数
  191. {
  192. numNoSao[0]++;
  193. }
  194. if( saoParam->saoLcuParam[1][addr].typeIdx == -1) //!< CbCr分量不存在SAO参数
  195. {
  196. numNoSao[1]+=2;
  197. }
  198. #else
  199. for ( compIdx=0;compIdx<3;compIdx++)
  200. {
  201. if( depth == 0 && saoParam->saoLcuParam[compIdx][addr].typeIdx == -1)
  202. {
  203. numNoSao++;
  204. }
  205. }
  206. #endif
  207. #endif
  208. m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
  209. m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
  210. } //!< if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )
  211. } //!< for (idxX = 0; idxX< frameWidthInCU; idxX++)
  212. } //!< for (idxY = 0; idxY< frameHeightInCU; idxY++)
  213. #if SAO_ENCODING_CHOICE
  214. #if SAO_ENCODING_CHOICE_CHROMA
  215. #if SAO_ENCODING_CHOICE_CHROMA_BF
  216. if( !saoParam->bSaoFlag[0])
  217. {
  218. m_depthSaoRate[0][depth] = 1.0;
  219. }
  220. else
  221. {
  222. m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);
  223. }
  224. if( !saoParam->bSaoFlag[1])
  225. {
  226. m_depthSaoRate[1][depth] = 1.0;
  227. }
  228. else
  229. {
  230. m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);
  231. }
  232. #else
  233. m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);
  234. m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);
  235. #endif
  236. #else
  237. if( depth == 0)
  238. {
  239. // update SAO Rate
  240. m_depth0SaoRate = numNoSao/((Double) frameHeightInCU*frameWidthInCU*3);
  241. }
  242. #endif
  243. #endif
  244. }
/** rate distortion optimization of all SAO units
 * \param saoParam SAO parameters
 * \param lambda 
 * \param lambdaChroma
 */
#if SAO_ENCODING_CHOICE
Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma, Int depth)
#else
Void TEncSampleAdaptiveOffset::rdoSaoUnitAll(SAOParam *saoParam, Double lambda, Double lambdaChroma)
#endif
{

  Int idxY;
  Int idxX;
  Int frameHeightInCU = saoParam->numCuInHeight;
  Int frameWidthInCU  = saoParam->numCuInWidth;
  Int j, k;
  Int addr = 0;
  Int addrUp = -1;
  Int addrLeft = -1;
  Int compIdx = 0;
  SaoLcuParam mergeSaoParam[3][2];
  Double compDistortion[3];

  saoParam->bSaoFlag[0] = true;
  saoParam->bSaoFlag[1] = true;
  saoParam->oneUnitFlag[0] = false;
  saoParam->oneUnitFlag[1] = false;
  saoParam->oneUnitFlag[2] = false;

#if SAO_ENCODING_CHOICE
#if SAO_ENCODING_CHOICE_CHROMA
  Int numNoSao[2];
  numNoSao[0] = 0;// Luma 
  numNoSao[1] = 0;// Chroma 
  if( depth > 0 && m_depthSaoRate[0][depth-1] > SAO_ENCODING_RATE )
  {
    saoParam->bSaoFlag[0] = false;
  }
  if( depth > 0 && m_depthSaoRate[1][depth-1] > SAO_ENCODING_RATE_CHROMA )
  {
    saoParam->bSaoFlag[1] = false;
  }
#else
  Int numNoSao = 0;

  if( depth > 0 && m_depth0SaoRate > SAO_ENCODING_RATE )
  {
    saoParam->bSaoFlag[0] = false;
    saoParam->bSaoFlag[1] = false;
  }
#endif
#endif
  //!< 以LCU为单位对图像中的每个LCU进行遍历
  for (idxY = 0; idxY< frameHeightInCU; idxY++)
  {
    for (idxX = 0; idxX< frameWidthInCU; idxX++)
    {
      addr     = idxX  + frameWidthInCU*idxY; //!< 当前LCU地址
      addrUp   = addr < frameWidthInCU ? -1:idxX   + frameWidthInCU*(idxY-1); //!< 当前LCU上邻块地址
      addrLeft = idxX == 0               ? -1:idxX-1 + frameWidthInCU*idxY; //!< 当前LCU左邻块地址
      Int allowMergeLeft = 1;
      Int allowMergeUp   = 1;
      UInt rate;
      Double bestCost, mergeCost;
      if (idxX!=0) //!< 非第1列
      { 
        // check tile id and slice id //! 检查当前LCU与其左邻块是否属于同一个tile以及是否属于同一个slice,不同的话该邻块不可用
        if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-1) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-1)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
        {
          allowMergeLeft = 0; //!< 左邻块不可用
        }
      }
      else
      {
        allowMergeLeft = 0; //!< 第1列的左邻块均不可用
      }
      if (idxY!=0) //!< 非第1行
      {//! 检查当前LCU与其上邻块是否属于同一个tile以及是否属于同一个slice,不同的话该邻块不可用
        if ( (m_pcPic->getPicSym()->getTileIdxMap(addr-m_iNumCuInWidth) != m_pcPic->getPicSym()->getTileIdxMap(addr)) || (m_pcPic->getCU(addr-m_iNumCuInWidth)->getSlice()->getSliceIdx() != m_pcPic->getCU(addr)->getSlice()->getSliceIdx()))
        {
          allowMergeUp = 0; //!< 上邻块不可用
        }
      }
      else
      {
        allowMergeUp = 0; //!< 第1行的上邻块均不可用
      }

      compDistortion[0] = 0; //!< Y distortion
      compDistortion[1] = 0; //!< Cb distortion
      compDistortion[2] = 0; //!< Cr distortion
      m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
      if (allowMergeLeft)
      {
        m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0); //!< 编码句法元素sao_merge_left_flag
      }
      if (allowMergeUp)
      {
        m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0); //!< 编码句法元素sao_merge_up_flag
      }
      m_pcRDGoOnSbacCoder->store( m_pppcRDSbacCoder[0][CI_TEMP_BEST] );
      // reset stats Y, Cb, Cr
      for ( compIdx=0;compIdx<3;compIdx++)
      {
        for ( j=0;j<MAX_NUM_SAO_TYPE;j++)
        {
          for ( k=0;k< MAX_NUM_SAO_CLASS;k++)
          {
            m_iOffset   [compIdx][j][k] = 0;
            if( m_saoLcuBasedOptimization && m_saoLcuBoundary ){ //!< true && false
              m_iCount    [compIdx][j][k] = m_count_PreDblk    [addr][compIdx][j][k];
              m_iOffsetOrg[compIdx][j][k] = m_offsetOrg_PreDblk[addr][compIdx][j][k];
            }
            else
            {
              m_iCount    [compIdx][j][k] = 0;
              m_iOffsetOrg[compIdx][j][k] = 0;
            }
          }  
        }
        saoParam->saoLcuParam[compIdx][addr].typeIdx       =  -1;
        saoParam->saoLcuParam[compIdx][addr].mergeUpFlag   = 0;
        saoParam->saoLcuParam[compIdx][addr].mergeLeftFlag = 0;
        saoParam->saoLcuParam[compIdx][addr].subTypeIdx    = 0;
#if SAO_ENCODING_CHOICE
  if( (compIdx ==0 && saoParam->bSaoFlag[0])|| (compIdx >0 && saoParam->bSaoFlag[1]) )
#endif
        {//! 统计BO和EO各个模式下,对应classIdx下滤波前的重建像素值与原始像素值的差值的总和,以及对classIdx的计数
          calcSaoStatsCu(addr, compIdx,  compIdx);
		}
      }
	  //!< Y分量最佳滤波模式的选择
      saoComponentParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, 0,  lambda, &mergeSaoParam[0][0], &compDistortion[0]);
	  //!< CbCr分量最佳滤波模式的选择
      sao2ChromaParamDist(allowMergeLeft, allowMergeUp, saoParam, addr, addrUp, addrLeft, lambdaChroma, &mergeSaoParam[1][0], &mergeSaoParam[2][0], &compDistortion[0]);
     if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )
      {
        // Cost of new SAO_params
        m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
        m_pcRDGoOnSbacCoder->resetBits();
        if (allowMergeLeft)
        {
          m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0); 
        }
        if (allowMergeUp)
        {
          m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(0);
        }
        for ( compIdx=0;compIdx<3;compIdx++)
        {
        if( (compIdx ==0 && saoParam->bSaoFlag[0]) || (compIdx >0 && saoParam->bSaoFlag[1]))
          {
           m_pcEntropyCoder->encodeSaoOffset(&saoParam->saoLcuParam[compIdx][addr], compIdx);
          }
        }

        rate = m_pcEntropyCoder->getNumberOfWrittenBits();
        bestCost = compDistortion[0] + (Double)rate;
        m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);

        // Cost of Merge
        for(Int mergeUp=0; mergeUp<2; ++mergeUp)
        {
          if ( (allowMergeLeft && (mergeUp==0)) || (allowMergeUp && (mergeUp==1)) )
          {
            m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
            m_pcRDGoOnSbacCoder->resetBits();
            if (allowMergeLeft)
            {
              m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1-mergeUp); 
            }
            if ( allowMergeUp && (mergeUp==1) )
            {
              m_pcEntropyCoder->m_pcEntropyCoderIf->codeSaoMerge(1); 
            }

            rate = m_pcEntropyCoder->getNumberOfWrittenBits();
            mergeCost = compDistortion[mergeUp+1] + (Double)rate;
            if (mergeCost < bestCost)
            {
              bestCost = mergeCost;
              m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);              
              for ( compIdx=0;compIdx<3;compIdx++)
              {
                mergeSaoParam[compIdx][mergeUp].mergeLeftFlag = 1-mergeUp;
                mergeSaoParam[compIdx][mergeUp].mergeUpFlag = mergeUp;
                if( (compIdx==0 && saoParam->bSaoFlag[0]) || (compIdx>0 && saoParam->bSaoFlag[1]))
                {
                  copySaoUnit(&saoParam->saoLcuParam[compIdx][addr], &mergeSaoParam[compIdx][mergeUp] );             
                }
              }
            }
          }
        }
#if SAO_ENCODING_CHOICE
#if SAO_ENCODING_CHOICE_CHROMA
if( saoParam->saoLcuParam[0][addr].typeIdx == -1) //!< Y分量不存在SAO参数
{
  numNoSao[0]++;
}
if( saoParam->saoLcuParam[1][addr].typeIdx == -1) //!< CbCr分量不存在SAO参数
{
  numNoSao[1]+=2;
}
#else
        for ( compIdx=0;compIdx<3;compIdx++)
        {
          if( depth == 0 && saoParam->saoLcuParam[compIdx][addr].typeIdx == -1)
          {
            numNoSao++;
          }
        }
#endif
#endif
        m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[0][CI_TEMP_BEST]);
        m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[0][CI_CURR_BEST]);
      } //!< if( saoParam->bSaoFlag[0] || saoParam->bSaoFlag[1] )       
    } //!< for (idxX = 0; idxX< frameWidthInCU; idxX++)     
  } //!< for (idxY = 0; idxY< frameHeightInCU; idxY++)   
#if SAO_ENCODING_CHOICE
#if SAO_ENCODING_CHOICE_CHROMA
#if SAO_ENCODING_CHOICE_CHROMA_BF
  if( !saoParam->bSaoFlag[0]) 
  {
    m_depthSaoRate[0][depth] = 1.0;
  }
  else
  {
    m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);
  }
  if( !saoParam->bSaoFlag[1]) 
  {
    m_depthSaoRate[1][depth] = 1.0;
  }
  else 
  {
    m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);
  }
#else
m_depthSaoRate[0][depth] = numNoSao[0]/((Double) frameHeightInCU*frameWidthInCU);
m_depthSaoRate[1][depth] = numNoSao[1]/((Double) frameHeightInCU*frameWidthInCU*2);
#endif
#else
  if( depth == 0)
  {
    // update SAO Rate
    m_depth0SaoRate = numNoSao/((Double) frameHeightInCU*frameWidthInCU*3);
  }
#endif
#endif

}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值