Ignore:
Timestamp:
3 Feb 2014, 11:35:43 (10 years ago)
Author:
rwth
Message:
  • first version of DBBP (requires some cleanup)
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-9.3-dev1-RWTH/source/Lib/TLibCommon/TComPrediction.cpp

    r809 r816  
    601601#endif
    602602
     603#if H_3D_DBBP
     604PartSize TComPrediction::getPartitionSizeFromDepth(Pel* pDepthPels, UInt uiDepthStride, UInt uiSize)
     605{
     606  // find virtual partitioning for this CU based on depth block
     607  // segmentation of texture block --> mask IDs
     608  Pel*  pDepthBlockStart      = pDepthPels;
     609 
     610  // first compute average of depth block for thresholding
     611  Int iSumDepth = 0;
     612  Int iSubSample = 4;
     613  for (Int y=0; y<uiSize; y+=iSubSample)
     614  {
     615    for (Int x=0; x<uiSize; x+=iSubSample)
     616    {
     617      Int depthPel = pDepthPels[x];
     618     
     619      iSumDepth += depthPel;
     620    }
     621   
     622    // next row
     623    pDepthPels += uiDepthStride*iSubSample;
     624  }
     625 
     626  Int iSizeInBits = g_aucConvertToBit[uiSize] - g_aucConvertToBit[iSubSample];  // respect sub-sampling factor
     627  Int iMean = iSumDepth >> iSizeInBits*2;       // iMean /= (uiWidth*uiHeight);
     628  AOF( iMean == iSumDepth/((uiSize/iSubSample)*(uiSize/iSubSample) ) );
     629  AOF( iMean >= 0 && iMean < 256);
     630 
     631  // start again for segmentation
     632  pDepthPels = pDepthBlockStart;
     633 
     634  // start mapping process
     635  Bool bAMPAvail = uiSize > 8;
     636  Int matchedPartSum[6][2] = {{0,0},{0,0},{0,0},{0,0},{0,0},{0,0}}; // counter for each part size and boolean option
     637  PartSize virtualPartSizes[6] = { SIZE_Nx2N, SIZE_2NxN, SIZE_2NxnU, SIZE_2NxnD, SIZE_nLx2N, SIZE_nRx2N };
     638 
     639  UInt uiHalfSize = uiSize>>1;
     640  UInt uiQuarterSize = uiSize>>2;
     641 
     642  for (Int y=0; y<uiSize; y+=iSubSample)
     643  {
     644    for (Int x=0; x<uiSize; x+=iSubSample)
     645    {
     646      Int depthPel = pDepthPels[x];
     647     
     648      // decide which segment this pixel belongs to
     649      Int ucSegment = (Int)(depthPel>iMean);
     650      AOF( ucSegment == 0 || ucSegment == 1 );
     651     
     652      // Matched Filter to find optimal (conventional) partitioning
     653     
     654      // SIZE_Nx2N
     655      if(x<uiHalfSize)  // left
     656        matchedPartSum[0][ucSegment]++;
     657      else  // right
     658        matchedPartSum[0][1-ucSegment]++;
     659     
     660      // SIZE_2NxN
     661      if(y<uiHalfSize)  // top
     662        matchedPartSum[1][ucSegment]++;
     663      else  // bottom
     664        matchedPartSum[1][1-ucSegment]++;
     665     
     666      if( bAMPAvail )
     667      {
     668        // SIZE_2NxnU
     669        if(y<uiQuarterSize)  // top (1/4)
     670          matchedPartSum[2][ucSegment]++;
     671        else  // bottom (3/4)
     672          matchedPartSum[2][1-ucSegment]++;
     673       
     674        // SIZE_2NxnD
     675        if(y<(uiQuarterSize*3))  // top (3/4)
     676          matchedPartSum[3][ucSegment]++;
     677        else  // bottom (1/4)
     678          matchedPartSum[3][1-ucSegment]++;
     679       
     680        // SIZE_nLx2N
     681        if(x<uiQuarterSize)  // left (1/4)
     682          matchedPartSum[4][ucSegment]++;
     683        else  // right (3/4)
     684          matchedPartSum[4][1-ucSegment]++;
     685       
     686        // SIZE_nRx2N
     687        if(x<(uiQuarterSize*3))  // left (3/4)
     688          matchedPartSum[5][ucSegment]++;
     689        else  // right (1/4)
     690          matchedPartSum[5][1-ucSegment]++;
     691      }
     692    }
     693   
     694    // next row
     695    pDepthPels += uiDepthStride*iSubSample;
     696  }
     697 
     698  PartSize matchedPartSize = SIZE_NONE;
     699 
     700  Int iMaxMatchSum = 0;
     701  for(Int p=0; p<6; p++)  // loop over partition sizes
     702  {
     703    for( Int b=0; b<=1; b++ ) // loop over boolean options
     704    {
     705      if(matchedPartSum[p][b] > iMaxMatchSum)
     706      {
     707        iMaxMatchSum = matchedPartSum[p][b];
     708        matchedPartSize = virtualPartSizes[p];
     709      }
     710    }
     711  }
     712 
     713  AOF( matchedPartSize != SIZE_NONE );
     714 
     715  return matchedPartSize;
     716}
     717
     718Bool TComPrediction::getSegmentMaskFromDepth( Pel* pDepthPels, UInt uiDepthStride, UInt uiWidth, UInt uiHeight, Bool* pMask )
     719{
     720  AOF( uiWidth == uiHeight );
     721 
     722  // segmentation of texture block --> mask IDs
     723  Pel*  pDepthBlockStart      = pDepthPels;
     724 
     725  // first compute average of depth block for thresholding
     726  Int iSumDepth = 0;
     727  Int uiMinDepth = MAX_INT;
     728  Int uiMaxDepth = 0;
     729  for (Int y=0; y<uiHeight; y++)
     730  {
     731    for (Int x=0; x<uiWidth; x++)
     732    {
     733      Int depthPel = pDepthPels[x];
     734      iSumDepth += depthPel;
     735     
     736      if( depthPel > uiMaxDepth )
     737        uiMaxDepth = depthPel;
     738      if( depthPel < uiMinDepth )
     739        uiMinDepth = depthPel;
     740    }
     741   
     742    // next row
     743    pDepthPels += uiDepthStride;
     744  }
     745 
     746  // don't generate mask for blocks with small depth range (encoder decision)
     747  if( uiMaxDepth - uiMinDepth < 10 )
     748    return false;
     749 
     750  Int iSizeInBits = g_aucConvertToBit[uiWidth]+2;
     751  Int iMean = iSumDepth >> iSizeInBits*2;       // iMean /= (uiWidth*uiHeight);
     752  AOF( iMean == iSumDepth/(uiWidth*uiHeight) );
     753  AOF( iMean >= 0 && iMean < 256);
     754 
     755  // start again for segmentation
     756  pDepthPels = pDepthBlockStart;
     757 
     758  Bool bInvertMask = pDepthPels[0]>iMean; // top-left segment needs to be mapped to partIdx 0
     759 
     760  // generate mask
     761  UInt uiSumPix[2] = {0,0};
     762  for (Int y=0; y<uiHeight; y++)
     763  {
     764    for (Int x=0; x<uiHeight; x++)
     765    {
     766      Int depthPel = pDepthPels[x];
     767     
     768      // decide which segment this pixel belongs to
     769      Int ucSegment = (Int)(depthPel>iMean);
     770      AOF( ucSegment == 0 || ucSegment == 1 );
     771     
     772      if( bInvertMask )
     773        ucSegment = 1-ucSegment;
     774     
     775      // count pixels for each segment
     776      uiSumPix[ucSegment]++;
     777     
     778      // set mask value
     779      pMask[x] = (Bool)ucSegment;
     780    }
     781   
     782    // next row
     783    pDepthPels += uiDepthStride;
     784    pMask += MAX_CU_SIZE;
     785  }
     786 
     787  // don't generate valid mask for tiny segments (encoder decision)
     788  // each segment needs to cover at least 1/8th of block
     789  UInt uiMinPixPerSegment = (uiWidth*uiHeight) >> 3;
     790  if( !( uiSumPix[0] > uiMinPixPerSegment && uiSumPix[1] > uiMinPixPerSegment ) )
     791    return false;
     792 
     793  // all good
     794  return true;
     795}
     796
     797Void TComPrediction::combineSegmentsWithMask( TComYuv* pInYuv[2], TComYuv* pOutYuv, Bool* pMask, UInt uiWidth, UInt uiHeight, UInt uiPartAddr )
     798{
     799  Pel*  piSrc[2]    = {pInYuv[0]->getLumaAddr(uiPartAddr), pInYuv[1]->getLumaAddr(uiPartAddr)};
     800  UInt  uiSrcStride = pInYuv[0]->getStride();
     801  Pel*  piDst       = pOutYuv->getLumaAddr(uiPartAddr);
     802  UInt  uiDstStride = pOutYuv->getStride();
     803 
     804  UInt  uiMaskStride= MAX_CU_SIZE;
     805 
     806  // backup pointer
     807  Bool* pMaskStart = pMask;
     808 
     809  // combine luma first
     810  for (Int y=0; y<uiHeight; y++)
     811  {
     812    for (Int x=0; x<uiWidth; x++)
     813    {
     814      UChar ucSegment = (UChar)pMask[x];
     815      AOF( ucSegment < 2 );
     816     
     817      // filtering
     818      Bool t = (y==0)?pMaskStart[(y+1)*uiMaskStride+x]:pMaskStart[(y-1)*uiMaskStride+x];
     819      Bool l = (x==0)?pMaskStart[y*uiMaskStride+x+1]:pMaskStart[y*uiMaskStride+x-1];
     820      Bool b = (y==uiHeight-1)?pMaskStart[(y-1)*uiMaskStride+x]:pMaskStart[(y+1)*uiMaskStride+x];
     821      Bool r = (x==uiWidth-1)?pMaskStart[y*uiMaskStride+x-1]:pMaskStart[y*uiMaskStride+x+1];
     822     
     823      Bool bBlend = !((t&&l&&b&&r) || (!t&&!l&&!b&&!r));
     824      piDst[x] = bBlend?((piSrc[0][x]+piSrc[1][x]+1)>>1):piSrc[ucSegment][x];
     825    }
     826   
     827    piSrc[0]  += uiSrcStride;
     828    piSrc[1]  += uiSrcStride;
     829    piDst     += uiDstStride;
     830    pMask     += uiMaskStride;
     831  }
     832 
     833  // now combine chroma
     834  Pel*  piSrcU[2]       = { pInYuv[0]->getCbAddr(uiPartAddr), pInYuv[1]->getCbAddr(uiPartAddr) };
     835  Pel*  piSrcV[2]       = { pInYuv[0]->getCrAddr(uiPartAddr), pInYuv[1]->getCrAddr(uiPartAddr) };
     836  UInt  uiSrcStrideC    = pInYuv[0]->getCStride();
     837  Pel*  piDstU          = pOutYuv->getCbAddr(uiPartAddr);
     838  Pel*  piDstV          = pOutYuv->getCrAddr(uiPartAddr);
     839  UInt  uiDstStrideC    = pOutYuv->getCStride();
     840  UInt  uiWidthC        = uiWidth >> 1;
     841  UInt  uiHeightC       = uiHeight >> 1;
     842  pMask = pMaskStart;
     843 
     844  for (Int y=0; y<uiHeightC; y++)
     845  {
     846    for (Int x=0; x<uiWidthC; x++)
     847    {
     848      UChar ucSegment = (UChar)pMask[x*2];
     849      AOF( ucSegment < 2 );
     850     
     851      // filtering
     852      Bool t = (y==0)?pMaskStart[(y+1)*2*uiMaskStride+x*2]:pMaskStart[(y-1)*2*uiMaskStride+x*2];
     853      Bool l = (x==0)?pMaskStart[y*2*uiMaskStride+(x+1)*2]:pMaskStart[y*2*uiMaskStride+(x-1)*2];
     854      Bool b = (y==uiHeightC-1)?pMaskStart[(y-1)*2*uiMaskStride+x*2]:pMaskStart[(y+1)*2*uiMaskStride+x*2];
     855      Bool r = (x==uiWidthC-1)?pMaskStart[y*2*uiMaskStride+(x-1)*2]:pMaskStart[y*2*uiMaskStride+(x+1)*2];
     856     
     857      Bool bBlend = !((t&&l&&b&&r) || (!t&&!l&&!b&&!r));
     858     
     859      piDstU[x] = bBlend?((piSrcU[0][x]+piSrcU[1][x]+1)>>1):piSrcU[ucSegment][x];
     860      piDstV[x] = bBlend?((piSrcV[0][x]+piSrcV[1][x]+1)>>1):piSrcV[ucSegment][x];
     861    }
     862   
     863    piSrcU[0]   += uiSrcStrideC;
     864    piSrcU[1]   += uiSrcStrideC;
     865    piSrcV[0]   += uiSrcStrideC;
     866    piSrcV[1]   += uiSrcStrideC;
     867    piDstU      += uiDstStrideC;
     868    piDstV      += uiDstStrideC;
     869    pMask       += 2*uiMaskStride;
     870  }
     871}
     872#endif
     873
    603874Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx )
    604875{
Note: See TracChangeset for help on using the changeset viewer.