Ignore:
Timestamp:
6 Aug 2012, 05:35:11 (12 years ago)
Author:
lg
Message:

Implemented the Region boundary chain coding (A0070) and R/D selection between Non-Zero Residual and All-Zero Residual Intra Coding (A0087) with macro: "LGE_EDGE_INTRA" and "LG_ZEROINTRADEPTHRESI_M26039"

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-3.1-LG/source/Lib/TLibCommon/TComPrediction.cpp

    r93 r97  
    419419}
    420420
     421#if LGE_EDGE_INTRA
     422Void TComPrediction::predIntraLumaEdge ( TComDataCU* pcCU, TComPattern* pcTComPattern, UInt uiAbsPartIdx, Int iWidth, Int iHeight, Pel* piPred, UInt uiStride, Bool bDelta )
     423{
     424        Pel *piDst = piPred;
     425        Int *piSrc;
     426        Int iSrcStride = ( iWidth<<1 ) + 1;
     427        Int iDstStride = uiStride;
     428
     429        piSrc = pcTComPattern->getPredictorPtr( 0, g_aucConvertToBit[ iWidth ] + 2, m_piYuvExt );
     430
     431        xPredIntraEdge ( pcCU, uiAbsPartIdx, iWidth, iHeight, piSrc, iSrcStride, piDst, iDstStride
     432#if LGE_EDGE_INTRA_DELTA_DC
     433                , bDelta
     434#endif
     435                );
     436}
     437
     438Pel  TComPrediction::xGetNearestNeighbor( Int x, Int y, Int* pSrc, Int srcStride, Int iWidth, Int iHeight, Bool* bpRegion )
     439{
     440        Bool bLeft = (x < y) ? true : false;
     441        Bool bFound = false;
     442        Int  iFoundX = -1, iFoundY = -1;
     443        Int  cResult = 0;
     444
     445#define MAX_DISTANCE_EDGEINTRA 255
     446
     447        UChar* piTopDistance = new UChar[iWidth];
     448        UChar* piLeftDistance = new UChar[iHeight];
     449
     450        for( Int i = 0; i < iWidth; i++ )
     451        {
     452                int Abs = x > i ? x - i : i - x;
     453                piTopDistance[ i ] = y + Abs;
     454
     455                Abs = y > i ? y - i : i - y;
     456                piLeftDistance[ i ] = x + Abs;
     457        }
     458
     459        for( Int dist = 0; dist < MAX_DISTANCE_EDGEINTRA && !bFound; dist++ )
     460        {
     461                if( !bLeft )
     462                {
     463                        for( Int i = 0; i < iWidth; i++ )
     464                        {
     465                                if( piTopDistance[ i ] == dist )
     466                                {
     467                                        if( bpRegion[ i ] == bpRegion[ x + y * iWidth ] )
     468                                        {
     469                                                iFoundX = i;
     470                                                iFoundY = 0;
     471                                                bFound = true;
     472                                        }
     473                                }
     474                        }
     475                        for( Int i = 0; i < iHeight; i++ )
     476                        {
     477                                if( piLeftDistance[ i ] == dist )
     478                                {
     479                                        if( bpRegion[ i * iWidth ] == bpRegion[ x + y * iWidth ] )
     480                                        {
     481                                                iFoundX = 0;
     482                                                iFoundY = i;
     483                                                bFound = true;
     484                                        }
     485                                }
     486                        }
     487                }
     488                else
     489                {
     490                        for( Int i = 0; i < iHeight; i++ )
     491                        {
     492                                if( piLeftDistance[ i ] == dist )
     493                                {
     494                                        if( bpRegion[ i * iWidth ] == bpRegion[ x + y * iWidth ] )
     495                                        {
     496                                                iFoundX = 0;
     497                                                iFoundY = i;
     498                                                bFound = true;
     499                                        }
     500                                }
     501                        }
     502                        for( Int i = 0; i < iWidth; i++ )
     503                        {
     504                                if( piTopDistance[ i ] == dist )
     505                                {
     506                                        if( bpRegion[ i ] == bpRegion[ x + y * iWidth ] )
     507                                        {
     508                                                iFoundX = i;
     509                                                iFoundY = 0;
     510                                                bFound = true;
     511                                        }
     512                                }
     513                        }
     514                }
     515        }
     516
     517        if( iFoundY == 0 )
     518        {
     519                cResult = pSrc[ iFoundX + 1 ];
     520        }
     521        else // iFoundX == 0
     522        {
     523                cResult = pSrc[ (iFoundY + 1) * srcStride ];
     524        }
     525
     526        delete[] piTopDistance;  piTopDistance = NULL;
     527        delete[] piLeftDistance; piLeftDistance = NULL;
     528
     529        assert( bFound );
     530
     531        return cResult;
     532}
     533
     534Void TComPrediction::xPredIntraEdge( TComDataCU* pcCU, UInt uiAbsPartIdx, Int iWidth, Int iHeight, Int* pSrc, Int srcStride, Pel*& rpDst, Int dstStride, Bool bDelta )
     535{
     536        Pel* pDst = rpDst;
     537        Bool* pbRegion = pcCU->getEdgePartition( uiAbsPartIdx );
     538
     539        // Do prediction
     540        {
     541                UInt uiSum0 = 0, uiSum1 = 0;
     542                UInt uiMean0, uiMean1;
     543                UInt uiCount0 = 0, uiCount1 = 0;
     544                for( UInt ui = 0; ui < iWidth; ui++ )
     545                {
     546                        if( pbRegion[ ui ] == false )
     547                        {
     548                                uiSum0 += (pSrc[ ui + 1 ]);
     549                                uiCount0++;
     550                        }
     551                        else
     552                        {
     553                                uiSum1 += (pSrc[ ui + 1 ]);
     554                                uiCount1++;
     555                        }
     556                }
     557                for( UInt ui = 0; ui < iHeight; ui++ ) // (0,0) recount (to avoid division)
     558                {
     559                        if( pbRegion[ ui * iWidth ] == false )
     560                        {
     561                                uiSum0 += (pSrc[ (ui + 1) * srcStride ]);
     562                                uiCount0++;
     563                        }
     564                        else
     565                        {
     566                                uiSum1 += (pSrc[ (ui + 1) * srcStride ]);
     567                                uiCount1++;
     568                        }
     569                }
     570                if( uiCount0 == 0 )
     571                        assert(false);
     572                if( uiCount1 == 0 )
     573                        assert(false);
     574                uiMean0 = uiSum0 / uiCount0; // TODO : integer op.
     575                uiMean1 = uiSum1 / uiCount1;
     576#if LGE_EDGE_INTRA_DELTA_DC
     577                if( bDelta )
     578                {
     579                        Int iDeltaDC0 = pcCU->getEdgeDeltaDC0( uiAbsPartIdx );
     580                        Int iDeltaDC1 = pcCU->getEdgeDeltaDC1( uiAbsPartIdx );
     581                        xDeltaDCQuantScaleUp( pcCU, iDeltaDC0 );
     582                        xDeltaDCQuantScaleUp( pcCU, iDeltaDC1 );
     583                        uiMean0 = Clip( uiMean0 + iDeltaDC0 );
     584                        uiMean1 = Clip( uiMean1 + iDeltaDC1 );
     585                }
     586#endif
     587                for( UInt ui = 0; ui < iHeight; ui++ )
     588                {
     589                        for( UInt uii = 0; uii < iWidth; uii++ )
     590                        {
     591                                if( pbRegion[ uii + ui * iWidth ] == false )
     592                                        pDst[ uii + ui * dstStride ] = uiMean0;
     593                                else
     594                                        pDst[ uii + ui * dstStride ] = uiMean1;
     595                        }
     596                }
     597        }
     598}
     599#endif
     600
    421601#if DEPTH_MAP_GENERATION
    422602Void TComPrediction::motionCompensation( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY )
Note: See TracChangeset for help on using the changeset viewer.