Ignore:
Timestamp:
10 Nov 2012, 19:05:41 (12 years ago)
Author:
rwth
Message:
  • added RWTH_B0036 (SDC+DLT)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-4.1-dev2-RWTH/source/Lib/TLibEncoder/TEncSearch.cpp

    r158 r177  
    4242#include <math.h>
    4343
     44#if RWTH_SDC_DLT_B0036
     45#define GetDepthValue2Idx(val)     (pcCU->getSlice()->getSPS()->depthValue2idx(val))
     46#define GetIdx2DepthValue(val)     (pcCU->getSlice()->getSPS()->idx2DepthValue(val))
     47#endif
     48
    4449//! \ingroup TLibEncoder
    4550//! \{
     
    195200  const Int iNumAMVPCands = AMVP_MAX_NUM_CANDS + 1;
    196201  for( Int iNum = 0; iNum < iNumAMVPCands+1; iNum++)
    197   {
    198202    for( Int iIdx = 0; iIdx < iNumAMVPCands; iIdx++)
    199203#else
    200204  for( Int iNum = 0; iNum < AMVP_MAX_NUM_CANDS+1; iNum++)
    201   {
    202205    for( Int iIdx = 0; iIdx < AMVP_MAX_NUM_CANDS; iIdx++)
    203206#endif
     
    208211        m_auiMVPIdxCost[iIdx][iNum] = MAX_INT;
    209212    }
    210   }
    211213 
    212214  initTempBuff();
     
    15991601}
    16001602
     1603#if RWTH_SDC_DLT_B0036
     1604Void TEncSearch::xIntraCodingSDC( TComDataCU* pcCU, UInt uiAbsPartIdx, TComYuv* pcOrgYuv, TComYuv* pcPredYuv, Dist& ruiDist, Double& dRDCost, Bool bResidual )
     1605{
     1606  UInt    uiLumaPredMode    = pcCU     ->getLumaIntraDir( uiAbsPartIdx );
     1607  UInt    uiWidth           = pcCU     ->getWidth   ( 0 );
     1608  UInt    uiHeight          = pcCU     ->getHeight  ( 0 );
     1609  UInt    uiStride          = pcOrgYuv ->getStride  ();
     1610  Pel*    piOrg             = pcOrgYuv ->getLumaAddr( uiAbsPartIdx );
     1611  Pel*    piPred            = pcPredYuv->getLumaAddr( uiAbsPartIdx );
     1612  Pel*    piReco            = pcPredYuv->getLumaAddr( uiAbsPartIdx );
     1613 
     1614  UInt    uiZOrder          = pcCU->getZorderIdxInCU() + uiAbsPartIdx;
     1615  Pel*    piRecIPred        = pcCU->getPic()->getPicYuvRec()->getLumaAddr( pcCU->getAddr(), uiZOrder );
     1616  UInt    uiRecIPredStride  = pcCU->getPic()->getPicYuvRec()->getStride  ();
     1617 
     1618  AOF( uiWidth == uiHeight );
     1619  AOF( uiAbsPartIdx == 0 );
     1620  AOF( pcCU->getSDCAvailable(uiAbsPartIdx) );
     1621  AOF( pcCU->getSDCFlag(uiAbsPartIdx) );
     1622 
     1623  //===== init availability pattern =====
     1624  Bool  bAboveAvail = false;
     1625  Bool  bLeftAvail  = false;
     1626  pcCU->getPattern()->initPattern   ( pcCU, 0, uiAbsPartIdx );
     1627  pcCU->getPattern()->initAdiPattern( pcCU, uiAbsPartIdx, 0, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail );
     1628 
     1629  //===== get prediction signal =====
     1630#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     1631  if( uiLumaPredMode >= NUM_INTRA_MODE )
     1632  {
     1633    predIntraLumaDMM( pcCU, uiAbsPartIdx, uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail, true );
     1634  }
     1635  else
     1636  {
     1637#endif
     1638    predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, pcCU, bAboveAvail, bLeftAvail );
     1639#if HHI_DMM_WEDGE_INTRA || HHI_DMM_PRED_TEX
     1640  }
     1641#endif
     1642 
     1643  // number of segments depends on prediction mode
     1644  UInt uiNumSegments = 1; 
     1645  Bool* pbMask = NULL;
     1646  UInt uiMaskStride = 0;
     1647 
     1648  //if( uiLumaPredMode == DMM_WEDGE_FULL_IDX || uiLumaPredMode == DMM_WEDGE_PREDDIR_IDX )
     1649  if( 0 )
     1650  {
     1651    Int uiTabIdx = (uiLumaPredMode == DMM_WEDGE_FULL_IDX)?pcCU->getWedgeFullTabIdx(uiAbsPartIdx):pcCU->getWedgePredDirTabIdx(uiAbsPartIdx);
     1652   
     1653    WedgeList* pacWedgeList = &g_aacWedgeLists[(g_aucConvertToBit[uiWidth])];
     1654    TComWedgelet* pcWedgelet = &(pacWedgeList->at( uiTabIdx ));
     1655   
     1656    uiNumSegments = 2;
     1657    pbMask = pcWedgelet->getPattern();
     1658    uiMaskStride = pcWedgelet->getStride();
     1659  }
     1660 
     1661  // get DC prediction for each segment
     1662  Pel apDCPredValues[2];
     1663  xAnalyzeSegmentsSDC(piPred, uiStride, uiWidth, apDCPredValues, uiNumSegments, pbMask, uiMaskStride );
     1664 
     1665  // get original DC for each segment
     1666  Pel apDCOrigValues[2];
     1667  xAnalyzeSegmentsSDC(piOrg, uiStride, uiWidth, apDCOrigValues, uiNumSegments, pbMask, uiMaskStride );
     1668 
     1669  for( UInt uiSegment = 0; uiSegment < uiNumSegments; uiSegment++ )
     1670  {
     1671    // remap reconstructed value to valid depth values
     1672    Pel pDCRec = bResidual?apDCOrigValues[uiSegment]:apDCPredValues[uiSegment];
     1673   
     1674    // get residual (idx)
     1675    Pel pResidualIdx = GetDepthValue2Idx( pDCRec ) - GetDepthValue2Idx( apDCPredValues[uiSegment] );
     1676   
     1677    // save SDC DC offset
     1678    pcCU->setSDCSegmentDCOffset(pResidualIdx, uiSegment, uiAbsPartIdx);
     1679  }
     1680 
     1681  // reconstruct residual based on mask + DC residuals
     1682  Pel apDCResiValues[2];
     1683  Pel apDCRecoValues[2];
     1684  for( UInt uiSegment = 0; uiSegment < uiNumSegments; uiSegment++ )
     1685  {
     1686    Pel   pPredIdx    = GetDepthValue2Idx( apDCPredValues[uiSegment] );
     1687    Pel   pResiIdx    = pcCU->getSDCSegmentDCOffset(uiSegment, uiAbsPartIdx);
     1688    Pel   pRecoValue  = GetIdx2DepthValue( pPredIdx + pResiIdx );
     1689   
     1690    apDCRecoValues[uiSegment]  = pRecoValue;
     1691    apDCResiValues[uiSegment]  = pRecoValue - apDCPredValues[uiSegment];
     1692  }
     1693 
     1694  //===== reconstruction =====
     1695  Bool* pMask     = pbMask;
     1696  Pel* pPred      = piPred;
     1697  Pel* pReco      = piReco;
     1698  Pel* pRecIPred  = piRecIPred;
     1699 
     1700  for( UInt uiY = 0; uiY < uiHeight; uiY++ )
     1701  {
     1702    for( UInt uiX = 0; uiX < uiWidth; uiX++ )
     1703    {
     1704      UChar ucSegment = pMask?(UChar)pMask[uiX]:0;
     1705      assert( ucSegment < uiNumSegments );
     1706     
     1707      Pel pPredVal= apDCPredValues[ucSegment];
     1708      Pel pResiDC = apDCResiValues[ucSegment];
     1709     
     1710      pReco    [ uiX ] = Clip( pPredVal + pResiDC );
     1711      pRecIPred[ uiX ] = pReco[ uiX ];
     1712    }
     1713    pPred     += uiStride;
     1714    pReco     += uiStride;
     1715    pRecIPred += uiRecIPredStride;
     1716    pMask     += uiMaskStride;
     1717  }
     1718 
     1719  // clear UV
     1720  UInt  uiStrideC     = pcPredYuv->getCStride();
     1721  Pel   *pRecCb       = pcPredYuv->getCbAddr();
     1722  Pel   *pRecCr       = pcPredYuv->getCrAddr();
     1723 
     1724  for (Int y=0; y<uiHeight/2; y++)
     1725  {
     1726    for (Int x=0; x<uiWidth/2; x++)
     1727    {
     1728      pRecCb[x] = (Pel)(128<<g_uiBitIncrement);
     1729      pRecCr[x] = (Pel)(128<<g_uiBitIncrement);
     1730    }
     1731   
     1732    pRecCb += uiStrideC;
     1733    pRecCr += uiStrideC;
     1734  }
     1735 
     1736  //===== determine distortion =====
     1737#if HHI_VSO
     1738  if ( m_pcRdCost->getUseVSO() )
     1739  {
     1740    ruiDist = m_pcRdCost->getDistVS  ( pcCU, uiAbsPartIdx, piReco, uiStride, piOrg, uiStride, uiWidth, uiHeight, false, 0 );
     1741  }
     1742  else
     1743#endif
     1744  {
     1745    ruiDist = m_pcRdCost->getDistPart( piReco, uiStride, piOrg, uiStride, uiWidth, uiHeight );
     1746  }
     1747 
     1748  //----- determine rate and r-d cost -----
     1749  m_pcEntropyCoder->resetBits();
     1750
     1751  // encode reduced intra header
     1752  m_pcEntropyCoder->encodeSkipFlag( pcCU, 0, true );
     1753  m_pcEntropyCoder->encodePredMode( pcCU, 0, true );
     1754 
     1755  // encode pred direction + residual data
     1756  m_pcEntropyCoder->encodePredInfo( pcCU, 0, true );
     1757 
     1758  UInt   uiBits = m_pcEntropyCoder->getNumberOfWrittenBits();
     1759 
     1760#if HHI_VSO
     1761  if ( m_pcRdCost->getUseLambdaScaleVSO())
     1762  {
     1763    dRDCost = m_pcRdCost->calcRdCostVSO( uiBits, ruiDist );
     1764  }
     1765  else
     1766#endif
     1767  {
     1768    dRDCost = m_pcRdCost->calcRdCost( uiBits, ruiDist );
     1769  }
     1770}
     1771#endif
    16011772
    16021773Void
     
    21072278    UInt    uiBestPUDistC = 0;
    21082279    Double  dBestPUCost   = MAX_DOUBLE;
     2280#if RWTH_SDC_DLT_B0036
     2281    Bool    bBestUseSDC   = false;
     2282    Pel     apBestDCOffsets[2] = {0,0};
     2283#endif
    21092284    for( UInt uiMode = 0; uiMode < numModesForFullRD; uiMode++ )
    21102285    {
     
    21272302        continue;
    21282303      }
     2304#endif
     2305     
     2306#if RWTH_SDC_DLT_B0036
     2307      UInt uiUseSDC = ( m_pcEncCfg->getUseSDC() && pcCU->getPartitionSize(uiPartOffset) == SIZE_2Nx2N )?1:0;
     2308     
     2309      for( UInt uiSDC=0; uiSDC<=uiUseSDC; uiSDC++ )
     2310      {
     2311        for( UInt uiRes = 0; uiRes<=uiUseSDC; uiRes++ )
     2312        {
    21292313#endif
    21302314
     
    21502334      }
    21512335#endif
    2152 
     2336#if RWTH_SDC_DLT_B0036
     2337          // last check: if not available for current intra prediction mode, don't try
     2338          if( uiSDC == 1 && !pcCU->getSDCAvailable(uiPartOffset) )
     2339            continue;
     2340         
     2341          pcCU->setSDCFlagSubParts( uiSDC == 1, uiPartOffset, 0, uiDepth + uiInitTrDepth );
     2342         
     2343          if(uiSDC == 1)
     2344          {
     2345            pcCU->setTrIdxSubParts(0, uiPartOffset, uiDepth + uiInitTrDepth);
     2346            pcCU->setCbfSubParts(1, 1, 1, uiPartOffset, uiDepth + uiInitTrDepth);
     2347           
     2348            // start encoding with SDC
     2349            xIntraCodingSDC(pcCU, uiPartOffset, pcOrgYuv, pcPredYuv, uiPUDistY, dPUCost, (uiRes==1));
     2350          }
     2351          else
     2352          {
     2353#endif
    21532354#if HHI_RQT_INTRA_SPEEDUP
    21542355#if LG_ZEROINTRADEPTHRESI_M26039
     
    21592360#else
    21602361      xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, dPUCost );
     2362#endif
     2363#if RWTH_SDC_DLT_B0036
     2364          }
    21612365#endif
    21622366     
     
    21722376        uiBestPUDistC = uiPUDistC;
    21732377        dBestPUCost   = dPUCost;
     2378       
     2379#if RWTH_SDC_DLT_B0036
     2380        if( uiSDC == 1 )
     2381        {
     2382          bBestUseSDC = true;
     2383         
     2384          // copy reconstruction
     2385          pcPredYuv->copyPartToPartYuv(pcRecoYuv, uiPartOffset, uiWidth, uiHeight);
     2386         
     2387          // copy DC values
     2388          apBestDCOffsets[0] = pcCU->getSDCSegmentDCOffset(0, uiPartOffset);
     2389          apBestDCOffsets[1] = pcCU->getSDCSegmentDCOffset(1, uiPartOffset);
     2390        }
     2391        else
     2392        {
     2393          bBestUseSDC = false;
     2394#endif
     2395       
     2396        xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
     2397       
     2398        UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
     2399        ::memcpy( m_puhQTTempTrIdx,  pcCU->getTransformIdx()       + uiPartOffset, uiQPartNum * sizeof( UChar ) );
     2400        ::memcpy( m_puhQTTempCbf[0], pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
     2401        ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
     2402        ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
     2403#if RWTH_SDC_DLT_B0036
     2404        }
     2405#endif
     2406      }
     2407#if HHI_RQT_INTRA_SPEEDUP_MOD
     2408      else if( dPUCost < dSecondBestPUCost )
     2409      {
     2410        uiSecondBestMode  = uiOrgMode;
     2411        dSecondBestPUCost = dPUCost;
     2412      }
     2413#endif
     2414#if LG_ZEROINTRADEPTHRESI_M26039
     2415    }
     2416#endif
     2417#if RWTH_SDC_DLT_B0036
     2418      } // SDC residual loop
     2419    } // SDC loop
     2420#endif
     2421    } // Mode loop
     2422   
     2423#if HHI_RQT_INTRA_SPEEDUP
     2424#if HHI_RQT_INTRA_SPEEDUP_MOD
     2425    for( UInt ui =0; ui < 2; ++ui )
     2426#endif
     2427    {
     2428#if HHI_RQT_INTRA_SPEEDUP_MOD
     2429      UInt uiOrgMode   = ui ? uiSecondBestMode  : uiBestPUMode;
     2430      if( uiOrgMode == MAX_UINT )
     2431      {
     2432        break;
     2433      }
     2434#else
     2435      UInt uiOrgMode = uiBestPUMode;
     2436#endif
     2437     
     2438      pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth );
     2439     
     2440      // set context models
     2441      if( m_bUseSBACRD )
     2442      {
     2443        m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
     2444      }
     2445     
     2446      // determine residual for partition
     2447      Dist   uiPUDistY = 0;
     2448      Dist   uiPUDistC = 0;
     2449      Double dPUCost   = 0.0;
     2450
     2451#if HHI_VSO
     2452      // reset Model
     2453      if( m_pcRdCost->getUseRenModel() )
     2454      {
     2455        m_pcRdCost->setRenModelData( pcCU, uiPartOffset, piOrg, uiStride, uiWidth, uiHeight );
     2456      }
     2457#endif
     2458
     2459      xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, false, dPUCost );
     2460     
     2461      // check r-d cost
     2462      if( dPUCost < dBestPUCost )
     2463      {
     2464        uiBestPUMode  = uiOrgMode;
     2465        uiBestPUDistY = uiPUDistY;
     2466        uiBestPUDistC = uiPUDistC;
     2467        dBestPUCost   = dPUCost;
     2468#if RWTH_SDC_DLT_B0036
     2469        bBestUseSDC   = false;
     2470#endif
    21742471       
    21752472        xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
     
    21822479       
    21832480      }
    2184 #if HHI_RQT_INTRA_SPEEDUP_MOD
    2185       else if( dPUCost < dSecondBestPUCost )
    2186       {
    2187         uiSecondBestMode  = uiOrgMode;
    2188         dSecondBestPUCost = dPUCost;
    2189       }
    2190 #endif
    2191 #if LG_ZEROINTRADEPTHRESI_M26039
    2192     }
    2193 #endif
    2194     } // Mode loop
    2195    
    2196 #if HHI_RQT_INTRA_SPEEDUP
    2197 #if HHI_RQT_INTRA_SPEEDUP_MOD
    2198     for( UInt ui =0; ui < 2; ++ui )
    2199 #endif
    2200     {
    2201 #if HHI_RQT_INTRA_SPEEDUP_MOD
    2202       UInt uiOrgMode   = ui ? uiSecondBestMode  : uiBestPUMode;
    2203       if( uiOrgMode == MAX_UINT )
    2204       {
    2205         break;
    2206       }
    2207 #else
    2208       UInt uiOrgMode = uiBestPUMode;
    2209 #endif
    2210      
    2211       pcCU->setLumaIntraDirSubParts ( uiOrgMode, uiPartOffset, uiDepth + uiInitTrDepth );
    2212      
    2213       // set context models
    2214       if( m_bUseSBACRD )
    2215       {
    2216         m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
    2217       }
    2218      
    2219       // determine residual for partition
    2220       Dist   uiPUDistY = 0;
    2221       Dist   uiPUDistC = 0;
    2222       Double dPUCost   = 0.0;
    2223 
    2224 #if HHI_VSO
    2225       // reset Model
    2226       if( m_pcRdCost->getUseRenModel() )
    2227       {
    2228         m_pcRdCost->setRenModelData( pcCU, uiPartOffset, piOrg, uiStride, uiWidth, uiHeight );
    2229       }
    2230 #endif
    2231 
    2232       xRecurIntraCodingQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcOrgYuv, pcPredYuv, pcResiYuv, uiPUDistY, uiPUDistC, false, dPUCost );
    2233      
    2234       // check r-d cost
    2235       if( dPUCost < dBestPUCost )
    2236       {
    2237         uiBestPUMode  = uiOrgMode;
    2238         uiBestPUDistY = uiPUDistY;
    2239         uiBestPUDistC = uiPUDistC;
    2240         dBestPUCost   = dPUCost;
    2241        
    2242         xSetIntraResultQT( pcCU, uiInitTrDepth, uiPartOffset, bLumaOnly, pcRecoYuv );
    2243        
    2244         UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> ( ( pcCU->getDepth(0) + uiInitTrDepth ) << 1 );
    2245         ::memcpy( m_puhQTTempTrIdx,  pcCU->getTransformIdx()       + uiPartOffset, uiQPartNum * sizeof( UChar ) );
    2246         ::memcpy( m_puhQTTempCbf[0], pcCU->getCbf( TEXT_LUMA     ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
    2247         ::memcpy( m_puhQTTempCbf[1], pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
    2248         ::memcpy( m_puhQTTempCbf[2], pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, uiQPartNum * sizeof( UChar ) );
    2249        
    2250       }
    22512481    } // Mode loop
    22522482#endif
     
    22552485    uiOverallDistY += uiBestPUDistY;
    22562486    uiOverallDistC += uiBestPUDistC;
     2487   
     2488#if RWTH_SDC_DLT_B0036
     2489    if( bBestUseSDC )
     2490    {
     2491      pcCU->setTrIdxSubParts(0, uiPartOffset, uiDepth + uiInitTrDepth);
     2492      pcCU->setCbfSubParts(1, 1, 1, uiPartOffset, uiDepth + uiInitTrDepth);
     2493     
     2494      //=== copy best DC segment values back to CU ====
     2495      pcCU->setSDCSegmentDCOffset(apBestDCOffsets[0], 0, uiPartOffset);
     2496      pcCU->setSDCSegmentDCOffset(apBestDCOffsets[1], 1, uiPartOffset);
     2497    }
     2498    else
     2499    {
     2500#endif
    22572501   
    22582502    //--- update transform index and cbf ---
     
    22622506    ::memcpy( pcCU->getCbf( TEXT_CHROMA_U ) + uiPartOffset, m_puhQTTempCbf[1], uiQPartNum * sizeof( UChar ) );
    22632507    ::memcpy( pcCU->getCbf( TEXT_CHROMA_V ) + uiPartOffset, m_puhQTTempCbf[2], uiQPartNum * sizeof( UChar ) );
     2508#if RWTH_SDC_DLT_B0036
     2509    }
     2510#endif
    22642511   
    22652512    //--- set reconstruction for next intra prediction blocks ---
     
    23322579    //=== update PU data ====
    23332580    pcCU->setLumaIntraDirSubParts     ( uiBestPUMode, uiPartOffset, uiDepth + uiInitTrDepth );
     2581#if RWTH_SDC_DLT_B0036
     2582    pcCU->setSDCFlagSubParts          ( bBestUseSDC, uiPartOffset, 0, uiDepth + uiInitTrDepth );
     2583#endif
    23342584    pcCU->copyToPic                   ( uiDepth, uiPU, uiInitTrDepth );
    23352585  } // PU loop
     
    78178067#endif
    78188068#endif
     8069 
     8070#if RWTH_SDC_DLT_B0036
     8071Void TEncSearch::xAnalyzeSegmentsSDC( Pel* pOrig, UInt uiStride, UInt uiSize, Pel* rpSegMeans, UInt uiNumSegments, Bool* pMask, UInt uiMaskStride )
     8072{
     8073  Int iSumDepth[uiNumSegments];
     8074  memset(iSumDepth, 0, sizeof(Int)*uiNumSegments);
     8075  Int iSumPix[uiNumSegments];
     8076  memset(iSumPix, 0, sizeof(Int)*uiNumSegments);
     8077 
     8078  for (Int y=0; y<uiSize; y++)
     8079  {
     8080    for (Int x=0; x<uiSize; x++)
     8081    {
     8082      UChar ucSegment = pMask?(UChar)pMask[x]:0;
     8083      assert( ucSegment < uiNumSegments );
     8084     
     8085      iSumDepth[ucSegment] += pOrig[x];
     8086      iSumPix[ucSegment]   += 1;
     8087    }
     8088   
     8089    pOrig  += uiStride;
     8090    pMask  += uiMaskStride;
     8091  }
     8092 
     8093  // compute mean for each segment
     8094  for( UChar ucSeg = 0; ucSeg < uiNumSegments; ucSeg++ )
     8095  {
     8096    if( iSumPix[ucSeg] > 0 )
     8097      rpSegMeans[ucSeg] = iSumDepth[ucSeg] / iSumPix[ucSeg];
     8098    else
     8099      rpSegMeans[ucSeg] = 0;  // this happens for zero-segments
     8100  }
     8101}
     8102#endif
    78198103
    78208104//! \}
Note: See TracChangeset for help on using the changeset viewer.