Changeset 287 in SHVCSoftware for branches/SHM-2.1-dev/source


Ignore:
Timestamp:
12 Jun 2013, 00:02:03 (11 years ago)
Author:
seregin
Message:

correct the loop separation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/SHM-2.1-dev/source/Lib/TLibCommon/TComUpsampleFilter.cpp

    r286 r287  
    242242    }
    243243
    244 
    245244    //========== vertical upsampling ===========
    246245    pcTempPic->setBorderExtension(false);
     
    269268
    270269      piSrcY = piTempBufY + (refPos -((NTAPS_US_LUMA>>1) - 1))*strideEL;
    271       piDstY = piDstBufY + j * strideEL;
    272 #if SCALED_REF_LAYER_OFFSETS
    273       for( i = 0; i < leftStartL; i++ )
    274       {
    275         *piDstY = ClipY( (sumLumaVer(piSrcY, coeff, strideEL) + iOffset) >> (nShift));
    276         piDstY++;
    277       }
    278 
    279       for( i = leftStartL; i < rightEndL-1; i++ )
     270#if SCALED_REF_LAYER_OFFSETS
     271#if 1 // it should provide identical result
     272      Pel* piDstY0 = piDstBufY + j * strideEL;           
     273      piDstY = piDstY0 + ( leftStartL > 0 ? leftStartL : 0 );
     274
     275      for( i = min<Int>(rightEndL, pcTempPic->getWidth()) - max<Int>(0, leftStartL); i > 0; i-- )
    280276      {
    281277        *piDstY = ClipY( (sumLumaVer(piSrcY, coeff, strideEL) + iOffset) >> (nShift));
     
    284280      }
    285281
    286       for( i = rightEndL-1; i < pcTempPic->getWidth(); i++ )
     282      for( i = rightEndL; i < pcTempPic->getWidth(); i++ )
     283      {
     284        *piDstY = piDstY0[rightEndL-1];
     285        piDstY++;
     286      }
     287
     288      piDstY = piDstY0;
     289      for( i = 0; i < leftStartL; i++ )
     290      {
     291        *piDstY = piDstY0[leftStartL];
     292        piDstY++;
     293      }
     294#else
     295      piDstY = piDstBufY + j * strideEL;
     296
     297      for( i = 0; i < pcTempPic->getWidth(); i++ )
    287298      {
    288299        *piDstY = ClipY( (sumLumaVer(piSrcY, coeff, strideEL) + iOffset) >> (nShift));
     300
     301        // Only increase the x position of reference upsample picture when within the window
     302        // "-2" to ensure that pointer doesn't go beyond the boundary rightEndL-1
     303        if( (i >= leftStartL) && (i <= rightEndL-2) )
     304        {
     305          piSrcY++;
     306        }
    289307        piDstY++;
    290308      }
    291 #else
     309#endif
     310#else
     311      piDstY = piDstBufY + j * strideEL;
     312
    292313      for( i = 0; i < widthEL; i++ )
    293314      {
     
    411432      refPos   = refPos16 >> 4;
    412433      coeff = m_chromaFilter[phase];
    413 
     434     
    414435      piSrcU = piTempBufU  + (refPos -((NTAPS_US_CHROMA>>1) - 1))*strideEL;
    415436      piSrcV = piTempBufV  + (refPos -((NTAPS_US_CHROMA>>1) - 1))*strideEL;
    416 
    417       piDstU = piDstBufU + j*strideEL;
    418       piDstV = piDstBufV + j*strideEL;
    419 
    420 #if SCALED_REF_LAYER_OFFSETS
    421       for( i = 0; i < leftStartC; i++ )
    422       {
    423         *piDstU = ClipC( (sumChromaVer(piSrcU, coeff, strideEL) + iOffset) >> (nShift));
    424         *piDstV = ClipC( (sumChromaVer(piSrcV, coeff, strideEL) + iOffset) >> (nShift));
    425         piDstU++;
    426         piDstV++;
    427       }
    428 
    429       for( i = leftStartC; i < rightEndC-1; i++ )
     437#if SCALED_REF_LAYER_OFFSETS
     438#if 1 // it should provide identical result
     439      Pel* piDstU0 = piDstBufU + j*strideEL;
     440      Pel* piDstV0 = piDstBufV + j*strideEL;
     441      piDstU = piDstU0 + ( leftStartC > 0 ? leftStartC : 0 );
     442      piDstV = piDstV0 + ( leftStartC > 0 ? leftStartC : 0 );
     443
     444      for( i = min<Int>(rightEndC, pcTempPic->getWidth() >> 1) - max<Int>(0, leftStartC); i > 0; i-- )
    430445      {
    431446        *piDstU = ClipC( (sumChromaVer(piSrcU, coeff, strideEL) + iOffset) >> (nShift));
     
    437452      }
    438453
    439       for( i = rightEndC-1; i < pcTempPic->getWidth() >> 1; i++ )
     454      for( i = rightEndC; i < pcTempPic->getWidth() >> 1; i++ )
     455      {
     456        *piDstU = piDstU0[rightEndC-1];
     457        *piDstV = piDstV0[rightEndC-1];
     458        piDstU++;
     459        piDstV++;
     460      }
     461
     462      piDstU = piDstU0;
     463      piDstV = piDstV0;
     464      for( i = 0; i < leftStartC; i++ )
     465      {
     466        *piDstU = piDstU0[leftStartC];
     467        *piDstV = piDstV0[leftStartC];
     468        piDstU++;
     469        piDstV++;
     470      }
     471#else
     472      piDstU = piDstBufU + j*strideEL;
     473      piDstV = piDstBufV + j*strideEL;
     474
     475      for( i = 0; i < pcTempPic->getWidth() >> 1; i++ )
    440476      {
    441477        *piDstU = ClipC( (sumChromaVer(piSrcU, coeff, strideEL) + iOffset) >> (nShift));
    442478        *piDstV = ClipC( (sumChromaVer(piSrcV, coeff, strideEL) + iOffset) >> (nShift));
     479
     480        // Only increase the x position of reference upsample picture when within the window
     481        // "-2" to ensure that pointer doesn't go beyond the boundary rightEndC-1
     482        if( (i >= leftStartC) && (i <= rightEndC-2) )
     483        {
     484          piSrcU++;
     485          piSrcV++;
     486        }
     487
    443488        piDstU++;
    444489        piDstV++;
    445490      }
    446 #else
     491#endif
     492#else
     493      piDstU = piDstBufU + j*strideEL;
     494      piDstV = piDstBufV + j*strideEL;
     495
    447496      for( i = 0; i < widthEL; i++ )
    448497      {
Note: See TracChangeset for help on using the changeset viewer.