Changeset 540 in SHVCSoftware for trunk/source/Lib/TLibCommon


Ignore:
Timestamp:
9 Jan 2014, 05:04:17 (11 years ago)
Author:
seregin
Message:

merge SHM-4.1-dev branch

Location:
trunk
Files:
21 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/source

  • trunk/source/Lib/TLibCommon/CommonDef.h

    r499 r540  
    4040
    4141#include <algorithm>
    42 
    4342#if _MSC_VER > 1000
    4443// disable "signed and unsigned mismatch"
     
    5756
    5857#if SVC_EXTENSION
    59 #define NV_VERSION        "4.0"                 ///< Current software version
     58#include <vector>
     59#define NV_VERSION        "4.1"                 ///< Current software version
    6060#else
    61 #define NV_VERSION        "12.0"                ///< Current software version
     61#define NV_VERSION        "12.1"                ///< Current software version
    6262#endif
    6363
     
    209209 
    210210  NAL_UNIT_CODED_SLICE_TSA_N,     // 2
    211   NAL_UNIT_CODED_SLICE_TLA_R,       // 3
     211  NAL_UNIT_CODED_SLICE_TSA_R,       // 3
    212212 
    213213  NAL_UNIT_CODED_SLICE_STSA_N,    // 4
     
    280280};
    281281
     282#if OUTPUT_LAYER_SET_INDEX
     283class CommonDecoderParams
     284{
     285  Int m_targetLayerId;
     286  Int m_outputLayerSetIdx;
     287  std::vector<Int> *m_targetDecLayerIdSet;
     288  Bool m_valueCheckedFlag;
     289public:
     290  CommonDecoderParams():
     291    m_targetLayerId(0)
     292    , m_outputLayerSetIdx(-1)
     293    , m_targetDecLayerIdSet(NULL)
     294    , m_valueCheckedFlag(false)
     295 {}
     296
     297  Void setTargetLayerId(const Int x) { m_targetLayerId = x;   }
     298  Int  getTargetLayerId()            { return m_targetLayerId;}
     299 
     300  Void setOutputLayerSetIdx(const Int x) { m_outputLayerSetIdx = x;   }
     301  Int  getOutputLayerSetIdx()            { return m_outputLayerSetIdx;}
     302
     303  Void               setTargetDecLayerIdSet(std::vector<Int> *x) { m_targetDecLayerIdSet = x;   }
     304  std::vector<Int>*  getTargetDecLayerIdSet()                    { return m_targetDecLayerIdSet;}
     305 
     306  Void setValueCheckedFlag(const Bool x) { m_valueCheckedFlag = x;   }
     307  Bool getValueCheckedFlag()            { return m_valueCheckedFlag;}
     308 
     309};
     310#endif
    282311//! \}
    283312
  • trunk/source/Lib/TLibCommon/NAL.h

    r313 r540  
    7676    return m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_R
    7777        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_N
    78         || m_nalUnitType == NAL_UNIT_CODED_SLICE_TLA_R
     78        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_R
    7979        || m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_N
    8080        || m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA_R
  • trunk/source/Lib/TLibCommon/TComDataCU.cpp

    r494 r540  
    309309  }
    310310}
    311 
     311#if !HM_CLEANUP_SAO
    312312const NDBFBlockInfo& NDBFBlockInfo::operator= (const NDBFBlockInfo& src)
    313313{
     
    328328}
    329329
    330 
     330#endif
    331331// ====================================================================================================================
    332332// Public member functions
     
    36383638  return getPic()->getPicSym()->getInverseCUOrderMap(m_uiCUAddr)*(1<<(m_pcSlice->getSPS()->getMaxCUDepth()<<1))+m_uiAbsIdxInLCU;
    36393639}
    3640 
     3640#if !HM_CLEANUP_SAO
    36413641/** Set neighboring blocks availabilities for non-deblocked filtering
    36423642 * \param numLCUInPicWidth number of LCUs in picture width
     
    40084008}
    40094009
     4010#endif
     4011
    40104012#if SVC_EXTENSION
    40114013TComDataCU*  TComDataCU::getBaseColCU( UInt refLayerIdc, UInt uiCuAbsPartIdx, UInt &uiCUAddrBase, UInt &uiAbsPartIdxBase, Int iMotionMapping )
     
    40284030#endif
    40294031
     4032#if O0098_SCALED_REF_LAYER_ID
     4033  Int leftStartL = getSlice()->getSPS()->getScaledRefLayerWindowForLayer(getSlice()->getVPS()->getRefLayerId(getSlice()->getLayerId(), refLayerIdc)).getWindowLeftOffset();
     4034  Int topStartL  = getSlice()->getSPS()->getScaledRefLayerWindowForLayer(getSlice()->getVPS()->getRefLayerId(getSlice()->getLayerId(), refLayerIdc)).getWindowTopOffset();
     4035#else
    40304036  Int leftStartL = this->getSlice()->getSPS()->getScaledRefLayerWindow(refLayerIdc).getWindowLeftOffset();
    40314037  Int topStartL  = this->getSlice()->getSPS()->getScaledRefLayerWindow(refLayerIdc).getWindowTopOffset();
     4038#endif
    40324039  Int iBX = ((uiPelX - leftStartL)*g_posScalingFactor[refLayerIdc][0] + (1<<15)) >> 16;
    40334040  Int iBY = ((uiPelY - topStartL )*g_posScalingFactor[refLayerIdc][1] + (1<<15)) >> 16;
  • trunk/source/Lib/TLibCommon/TComDataCU.h

    r494 r540  
    5555//! \{
    5656
     57#if !HM_CLEANUP_SAO
    5758// ====================================================================================================================
    5859// Non-deblocking in-loop filter processing block data structure
     
    9293  const NDBFBlockInfo& operator= (const NDBFBlockInfo& src);  //!< "=" operator
    9394};
     95#endif
    9496
    9597
     
    159161  Pel*          m_pcIPCMSampleCr;     ///< PCM sample buffer (Cr)
    160162
     163#if !HM_CLEANUP_SAO
    161164  Int*          m_piSliceSUMap;       ///< pointer of slice ID map
    162165  std::vector<NDBFBlockInfo> m_vNDFBlock;
    163 
     166#endif
    164167  // -------------------------------------------------------------------------------------------------------------------
    165168  // neighbour access variables
     
    389392  Void          setIPCMFlagSubParts   (Bool bIpcmFlag, UInt uiAbsPartIdx, UInt uiDepth);
    390393
     394#if !HM_CLEANUP_SAO
    391395  /// get slice ID for SU
    392396  Int           getSUSliceID          (UInt uiIdx)              {return m_piSliceSUMap[uiIdx];      }
     
    403407                                          ,Bool bTopTileBoundary, Bool bDownTileBoundary, Bool bLeftTileBoundary, Bool bRightTileBoundary
    404408                                          ,Bool bIndependentTileBoundaryEnabled );
     409#endif
    405410  // -------------------------------------------------------------------------------------------------------------------
    406411  // member functions for accessing partition information
  • trunk/source/Lib/TLibCommon/TComPic.cpp

    r494 r540  
    5959, m_bNeededForOutput                      (false)
    6060, m_uiCurrSliceIdx                        (0)
     61#if !HM_CLEANUP_SAO
    6162, m_pSliceSUMap                           (NULL)
    6263, m_pbValidSlice                          (NULL)
     
    6566, m_bIndependentTileBoundaryForNDBFilter  (false)
    6667, m_pNDBFilterYuvTmp                      (NULL)
     68#endif
    6769, m_bCheckLTMSB                           (false)
    6870{
     
    212214  }
    213215}
    214 
     216#if HM_CLEANUP_SAO
     217Bool  TComPic::getSAOMergeAvailability(Int currAddr, Int mergeAddr)
     218{
     219  Bool mergeCtbInSliceSeg = (mergeAddr >= getPicSym()->getCUOrderMap(getCU(currAddr)->getSlice()->getSliceCurStartCUAddr()/getNumPartInCU()));
     220  Bool mergeCtbInTile     = (getPicSym()->getTileIdxMap(mergeAddr) == getPicSym()->getTileIdxMap(currAddr));
     221  return (mergeCtbInSliceSeg && mergeCtbInTile);
     222}
     223#else
    215224/** Create non-deblocked filter information
    216225 * \param pSliceStartAddress array for storing slice start addresses
     
    548557
    549558}
     559#endif
    550560
    551561#if SVC_EXTENSION
  • trunk/source/Lib/TLibCommon/TComPic.h

    r494 r540  
    7575  Bool                  m_bNeededForOutput;
    7676  UInt                  m_uiCurrSliceIdx;         // Index of current slice
     77#if !HM_CLEANUP_SAO
    7778  Int*                  m_pSliceSUMap;
    7879  Bool*                 m_pbValidSlice;
     
    8182  Bool                  m_bIndependentTileBoundaryForNDBFilter;
    8283  TComPicYuv*           m_pNDBFilterYuvTmp;    //!< temporary picture buffer when non-cross slice/tile boundary in-loop filtering is enabled
     84#endif
    8385  Bool                  m_bCheckLTMSB;
    8486 
     
    199201  Window&       getDefDisplayWindow()   { return m_defaultDisplayWindow; }
    200202
     203#if HM_CLEANUP_SAO
     204  Bool          getSAOMergeAvailability(Int currAddr, Int mergeAddr);
     205#else
    201206  Void          createNonDBFilterInfo   (std::vector<Int> sliceStartAddress, Int sliceGranularityDepth
    202207                                        ,std::vector<Bool>* LFCrossSliceBoundary
     
    211216  TComPicYuv*   getYuvPicBufferForIndependentBoundaryProcessing()             {return m_pNDBFilterYuvTmp;}
    212217  std::vector<TComDataCU*>& getOneSliceCUDataForNDBFilter      (Int sliceID) { return m_vSliceCUDataLink[sliceID];}
     218#endif
    213219
    214220  /* field coding parameters*/
  • trunk/source/Lib/TLibCommon/TComPicSym.cpp

    r442 r540  
    6767,m_puiTileIdxMap(NULL)
    6868,m_puiInverseCUOrderMap(NULL)
     69#if HM_CLEANUP_SAO
     70,m_saoBlkParams(NULL)
     71#endif
    6972{};
    7073
     
    127130    m_puiInverseCUOrderMap[i] = i;
    128131  }
     132
     133#if HM_CLEANUP_SAO
     134  m_saoBlkParams = new SAOBlkParam[m_uiNumCUsInFrame];
     135#else
    129136  m_saoParam = NULL;
     137#endif
    130138}
    131139
     
    183191  m_puiInverseCUOrderMap = NULL;
    184192 
     193#if HM_CLEANUP_SAO
     194  if(m_saoBlkParams)
     195  {
     196    delete[] m_saoBlkParams; m_saoBlkParams = NULL;
     197  }
     198#else
    185199  if (m_saoParam)
    186200  {
     
    189203    m_saoParam = NULL;
    190204  }
     205#endif
    191206}
    192207
     
    332347}
    333348
     349
     350#if HM_CLEANUP_SAO
     351Void TComPicSym::deriveLoopFilterBoundaryAvailibility(Int ctu,
     352                                                      Bool& isLeftAvail,
     353                                                      Bool& isRightAvail,
     354                                                      Bool& isAboveAvail,
     355                                                      Bool& isBelowAvail,
     356                                                      Bool& isAboveLeftAvail,
     357                                                      Bool& isAboveRightAvail,
     358                                                      Bool& isBelowLeftAvail,
     359                                                      Bool& isBelowRightAvail
     360                                                      )
     361{
     362
     363  isLeftAvail      = (ctu % m_uiWidthInCU != 0);
     364  isRightAvail     = (ctu % m_uiWidthInCU != m_uiWidthInCU-1);
     365  isAboveAvail     = (ctu >= m_uiWidthInCU );
     366  isBelowAvail     = (ctu <  m_uiNumCUsInFrame - m_uiWidthInCU);
     367  isAboveLeftAvail = (isAboveAvail && isLeftAvail);
     368  isAboveRightAvail= (isAboveAvail && isRightAvail);
     369  isBelowLeftAvail = (isBelowAvail && isLeftAvail);
     370  isBelowRightAvail= (isBelowAvail && isRightAvail);
     371
     372  Bool isLoopFiltAcrossTilePPS = getCU(ctu)->getSlice()->getPPS()->getLoopFilterAcrossTilesEnabledFlag();
     373
     374  {
     375    TComDataCU* ctuCurr  = getCU(ctu);
     376    TComDataCU* ctuLeft  = isLeftAvail ?getCU(ctu-1):NULL;
     377    TComDataCU* ctuRight = isRightAvail?getCU(ctu+1):NULL;
     378    TComDataCU* ctuAbove = isAboveAvail?getCU(ctu-m_uiWidthInCU):NULL;
     379    TComDataCU* ctuBelow = isBelowAvail?getCU(ctu+m_uiWidthInCU):NULL;
     380    TComDataCU* ctuAboveLeft  = isAboveLeftAvail ? getCU(ctu-m_uiWidthInCU-1):NULL;
     381    TComDataCU* ctuAboveRigtht= isAboveRightAvail? getCU(ctu-m_uiWidthInCU+1):NULL;
     382    TComDataCU* ctuBelowLeft  = isBelowLeftAvail ? getCU(ctu+m_uiWidthInCU-1):NULL;
     383    TComDataCU* ctuBelowRight = isBelowRightAvail? getCU(ctu+m_uiWidthInCU+1):NULL;
     384
     385    {
     386      //left
     387      if(ctuLeft != NULL)
     388      {
     389        isLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     390      }
     391      //above
     392      if(ctuAbove != NULL)
     393      {
     394        isAboveAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAbove->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     395      }
     396      //right
     397      if(ctuRight != NULL)
     398      {
     399        isRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuRight->getSlice()->getSliceCurStartCUAddr())?ctuRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     400      }
     401      //below
     402      if(ctuBelow != NULL)
     403      {
     404        isBelowAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelow->getSlice()->getSliceCurStartCUAddr())?ctuBelow->getSlice()->getLFCrossSliceBoundaryFlag():true;
     405      }
     406      //above-left
     407      if(ctuAboveLeft != NULL)
     408      {
     409        isAboveLeftAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuAboveLeft->getSlice()->getSliceCurStartCUAddr())?ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag():true;
     410      }
     411      //below-right
     412      if(ctuBelowRight != NULL)
     413      {
     414        isBelowRightAvail = (ctuCurr->getSlice()->getSliceCurStartCUAddr() != ctuBelowRight->getSlice()->getSliceCurStartCUAddr())?ctuBelowRight->getSlice()->getLFCrossSliceBoundaryFlag():true;
     415      }
     416
     417
     418      //above-right
     419      if(ctuAboveRigtht != NULL)
     420      {
     421        Int curSliceStartTS  = getCUOrderMap(ctuCurr->getSlice()->getSliceCurStartCUAddr()/m_uiNumPartitions);
     422        Int aboveRigthtSliceStartTS = getCUOrderMap(ctuAboveRigtht->getSlice()->getSliceCurStartCUAddr()/m_uiNumPartitions);
     423
     424        isAboveRightAvail = (curSliceStartTS == aboveRigthtSliceStartTS)?(true):
     425          (
     426          (curSliceStartTS > aboveRigthtSliceStartTS)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     427          :(ctuAboveRigtht->getSlice()->getLFCrossSliceBoundaryFlag())
     428          );         
     429      }
     430      //below-left
     431      if(ctuBelowLeft != NULL)
     432      {
     433        Int curSliceStartTS       = getCUOrderMap(ctuCurr->getSlice()->getSliceCurStartCUAddr()/m_uiNumPartitions);
     434        Int belowLeftSliceStartTS = getCUOrderMap(ctuBelowLeft->getSlice()->getSliceCurStartCUAddr()/m_uiNumPartitions);
     435
     436        isBelowLeftAvail = (curSliceStartTS == belowLeftSliceStartTS)?(true):
     437          (
     438          (curSliceStartTS > belowLeftSliceStartTS)?(ctuCurr->getSlice()->getLFCrossSliceBoundaryFlag())
     439          :(ctuBelowLeft->getSlice()->getLFCrossSliceBoundaryFlag())
     440          );
     441      }       
     442    }
     443
     444    if(!isLoopFiltAcrossTilePPS)
     445    {     
     446      isLeftAvail      = (!isLeftAvail      ) ?false:(getTileIdxMap( ctuLeft->getAddr()         ) == getTileIdxMap( ctu ));
     447      isAboveAvail     = (!isAboveAvail     ) ?false:(getTileIdxMap( ctuAbove->getAddr()        ) == getTileIdxMap( ctu ));
     448      isRightAvail     = (!isRightAvail     ) ?false:(getTileIdxMap( ctuRight->getAddr()        ) == getTileIdxMap( ctu ));
     449      isBelowAvail     = (!isBelowAvail     ) ?false:(getTileIdxMap( ctuBelow->getAddr()        ) == getTileIdxMap( ctu ));
     450      isAboveLeftAvail = (!isAboveLeftAvail ) ?false:(getTileIdxMap( ctuAboveLeft->getAddr()    ) == getTileIdxMap( ctu ));
     451      isAboveRightAvail= (!isAboveRightAvail) ?false:(getTileIdxMap( ctuAboveRigtht->getAddr()  ) == getTileIdxMap( ctu ));
     452      isBelowLeftAvail = (!isBelowLeftAvail ) ?false:(getTileIdxMap( ctuBelowLeft->getAddr()    ) == getTileIdxMap( ctu ));
     453      isBelowRightAvail= (!isBelowRightAvail) ?false:(getTileIdxMap( ctuBelowRight->getAddr()   ) == getTileIdxMap( ctu ));
     454    }
     455  }
     456
     457}
     458#else
    334459Void TComPicSym::allocSaoParam(TComSampleAdaptiveOffset *sao)
    335460{
     
    337462  sao->allocSaoParam(m_saoParam);
    338463}
     464#endif
    339465
    340466TComTile::TComTile()
  • trunk/source/Lib/TLibCommon/TComPicSym.h

    r494 r540  
    112112  UInt*         m_puiInverseCUOrderMap;
    113113
     114#if HM_CLEANUP_SAO
     115  SAOBlkParam *m_saoBlkParams;
     116#else
    114117  SAOParam *m_saoParam;
     118#endif
     119
    115120public:
    116121  Void        create  ( Int iPicWidth, Int iPicHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth );
     
    171176  Void         xInitTiles();
    172177  UInt         xCalculateNxtCUAddr( UInt uiCurrCUAddr );
     178#if HM_CLEANUP_SAO
     179  SAOBlkParam* getSAOBlkParam() { return m_saoBlkParams;}
     180  Void deriveLoopFilterBoundaryAvailibility(Int ctu, Bool& isLeftAvail,Bool& isRightAvail,Bool& isAboveAvail,Bool& isBelowAvail,Bool& isAboveLeftAvail,Bool& isAboveRightAvail,Bool& isBelowLeftAvail,Bool& isBelowRightAvail);
     181#else
    173182  Void allocSaoParam(TComSampleAdaptiveOffset *sao);
    174183  SAOParam *getSaoParam() { return m_saoParam; }
     184#endif
     185
     186
    175187};// END CLASS DEFINITION TComPicSym
    176188
  • trunk/source/Lib/TLibCommon/TComRdCost.cpp

    r494 r540  
    330330
    331331// Setting the Distortion Parameter for Inter (subpel ME with step)
    332 #if NS_HAD
    333 Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME, Bool bUseNSHAD )
    334 #else
    335332Void TComRdCost::setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME )
    336 #endif
    337333{
    338334#if O0194_WEIGHTED_PREDICTION_CGS
     
    353349  rcDistParam.iCols    = pcPatternKey->getROIYWidth();
    354350  rcDistParam.iRows    = pcPatternKey->getROIYHeight();
    355 #if NS_HAD
    356   rcDistParam.bUseNSHAD = bUseNSHAD;
    357 #endif
    358351
    359352  // set distortion function
     
    386379
    387380Void
    388 #if NS_HAD
    389 TComRdCost::setDistParam( DistParam& rcDP, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard, Bool bUseNSHAD )
    390 #else
    391381TComRdCost::setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard )
    392 #endif
    393382{
    394383  rcDP.pOrg       = p1;
     
    402391  rcDP.bitDepth   = bitDepth;
    403392  rcDP.DistFunc   = m_afpDistortFunc[ ( bHadamard ? DF_HADS : DF_SADS ) + g_aucConvertToBit[ iWidth ] + 1 ];
    404 #if NS_HAD
    405   rcDP.bUseNSHAD  = bUseNSHAD;
    406 #endif
    407393}
    408394
     
    453439}
    454440
    455 #if WEIGHTED_CHROMA_DISTORTION
    456441UInt TComRdCost::getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, TextType eText, DFunc eDFunc)
    457 #else
    458 UInt TComRdCost::getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc )
    459 #endif
    460442{
    461443  DistParam cDtParam;
     
    471453  cDtParam.bitDepth = bitDepth;
    472454
    473 #if WEIGHTED_CHROMA_DISTORTION
    474455  if (eText == TEXT_CHROMA_U)
    475456  {
     
    484465    return cDtParam.DistFunc( &cDtParam );
    485466  }
    486 #else
    487   return cDtParam.DistFunc( &cDtParam );
    488 #endif
    489 }
    490 
    491 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT
    492 UInt TComRdCost::getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height )
    493 {
    494   UInt SAD = 0;
    495   Int shift = DISTORTION_PRECISION_ADJUSTMENT(bitDepth-8);
    496   for ( Int i=0; i<height; i++ )
    497   {
    498     for( Int j=0; j<width; j++ )
    499     {
    500       SAD += abs((pelCur[j] - pelOrg[j])) >> shift;
    501     }
    502     pelCur = pelCur + curStride;
    503     pelOrg = pelOrg + orgStride;
    504   }
    505   return SAD;
    506 }
    507 #endif
     467}
    508468
    509469// ====================================================================================================================
     
    15791539}
    15801540
    1581 #if NS_HAD
    1582 UInt TComRdCost::xCalcHADs16x4( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
    1583 {
    1584   Int k, i, j, jj, sad=0;
    1585   Int diff[64], m1[4][16], m2[4][16];
    1586   assert( iStep == 1 );
    1587   for( k = 0; k < 64; k += 16 )
    1588   {
    1589     diff[k+0] = piOrg[0] - piCur[0];
    1590     diff[k+1] = piOrg[1] - piCur[1];
    1591     diff[k+2] = piOrg[2] - piCur[2];
    1592     diff[k+3] = piOrg[3] - piCur[3];
    1593     diff[k+4] = piOrg[4] - piCur[4];
    1594     diff[k+5] = piOrg[5] - piCur[5];
    1595     diff[k+6] = piOrg[6] - piCur[6];
    1596     diff[k+7] = piOrg[7] - piCur[7];
    1597 
    1598     diff[k+8]  = piOrg[8]  - piCur[8] ;
    1599     diff[k+9]  = piOrg[9]  - piCur[9] ;
    1600     diff[k+10] = piOrg[10] - piCur[10];
    1601     diff[k+11] = piOrg[11] - piCur[11];
    1602     diff[k+12] = piOrg[12] - piCur[12];
    1603     diff[k+13] = piOrg[13] - piCur[13];
    1604     diff[k+14] = piOrg[14] - piCur[14];
    1605     diff[k+15] = piOrg[15] - piCur[15];
    1606 
    1607     piCur += iStrideCur;
    1608     piOrg += iStrideOrg;
    1609   }
    1610 
    1611   //horizontal
    1612   for (j=0; j < 4; j++)
    1613   {
    1614     jj = j << 4;
    1615 
    1616     m2[j][0]  = diff[jj  ] + diff[jj+8];
    1617     m2[j][1]  = diff[jj+1] + diff[jj+9];
    1618     m2[j][2]  = diff[jj+2] + diff[jj+10];
    1619     m2[j][3]  = diff[jj+3] + diff[jj+11];
    1620     m2[j][4]  = diff[jj+4] + diff[jj+12];
    1621     m2[j][5]  = diff[jj+5] + diff[jj+13];
    1622     m2[j][6]  = diff[jj+6] + diff[jj+14];
    1623     m2[j][7]  = diff[jj+7] + diff[jj+15];
    1624     m2[j][8]  = diff[jj  ] - diff[jj+8];
    1625     m2[j][9]  = diff[jj+1] - diff[jj+9];
    1626     m2[j][10] = diff[jj+2] - diff[jj+10];
    1627     m2[j][11] = diff[jj+3] - diff[jj+11];
    1628     m2[j][12] = diff[jj+4] - diff[jj+12];
    1629     m2[j][13] = diff[jj+5] - diff[jj+13];
    1630     m2[j][14] = diff[jj+6] - diff[jj+14];
    1631     m2[j][15] = diff[jj+7] - diff[jj+15];
    1632 
    1633     m1[j][0]  = m2[j][0]  + m2[j][4];
    1634     m1[j][1]  = m2[j][1]  + m2[j][5];
    1635     m1[j][2]  = m2[j][2]  + m2[j][6];
    1636     m1[j][3]  = m2[j][3]  + m2[j][7];
    1637     m1[j][4]  = m2[j][0]  - m2[j][4];
    1638     m1[j][5]  = m2[j][1]  - m2[j][5];
    1639     m1[j][6]  = m2[j][2]  - m2[j][6];
    1640     m1[j][7]  = m2[j][3]  - m2[j][7];
    1641     m1[j][8]  = m2[j][8]  + m2[j][12];
    1642     m1[j][9]  = m2[j][9]  + m2[j][13];
    1643     m1[j][10] = m2[j][10] + m2[j][14];
    1644     m1[j][11] = m2[j][11] + m2[j][15];
    1645     m1[j][12] = m2[j][8]  - m2[j][12];
    1646     m1[j][13] = m2[j][9]  - m2[j][13];
    1647     m1[j][14] = m2[j][10] - m2[j][14];
    1648     m1[j][15] = m2[j][11] - m2[j][15];
    1649 
    1650     m2[j][0]  = m1[j][0]  + m1[j][2];
    1651     m2[j][1]  = m1[j][1]  + m1[j][3];
    1652     m2[j][2]  = m1[j][0]  - m1[j][2];
    1653     m2[j][3]  = m1[j][1]  - m1[j][3];
    1654     m2[j][4]  = m1[j][4]  + m1[j][6];
    1655     m2[j][5]  = m1[j][5]  + m1[j][7];
    1656     m2[j][6]  = m1[j][4]  - m1[j][6];
    1657     m2[j][7]  = m1[j][5]  - m1[j][7];
    1658     m2[j][8]  = m1[j][8]  + m1[j][10];
    1659     m2[j][9]  = m1[j][9]  + m1[j][11];
    1660     m2[j][10] = m1[j][8]  - m1[j][10];
    1661     m2[j][11] = m1[j][9]  - m1[j][11];
    1662     m2[j][12] = m1[j][12] + m1[j][14];
    1663     m2[j][13] = m1[j][13] + m1[j][15];
    1664     m2[j][14] = m1[j][12] - m1[j][14];
    1665     m2[j][15] = m1[j][13] - m1[j][15];
    1666 
    1667     m1[j][0]  = m2[j][0]  + m2[j][1];
    1668     m1[j][1]  = m2[j][0]  - m2[j][1];
    1669     m1[j][2]  = m2[j][2]  + m2[j][3];
    1670     m1[j][3]  = m2[j][2]  - m2[j][3];
    1671     m1[j][4]  = m2[j][4]  + m2[j][5];
    1672     m1[j][5]  = m2[j][4]  - m2[j][5];
    1673     m1[j][6]  = m2[j][6]  + m2[j][7];
    1674     m1[j][7]  = m2[j][6]  - m2[j][7];
    1675     m1[j][8]  = m2[j][8]  + m2[j][9];
    1676     m1[j][9]  = m2[j][8]  - m2[j][9];
    1677     m1[j][10] = m2[j][10] + m2[j][11];
    1678     m1[j][11] = m2[j][10] - m2[j][11];
    1679     m1[j][12] = m2[j][12] + m2[j][13];
    1680     m1[j][13] = m2[j][12] - m2[j][13];
    1681     m1[j][14] = m2[j][14] + m2[j][15];
    1682     m1[j][15] = m2[j][14] - m2[j][15];
    1683   }
    1684 
    1685   //vertical
    1686   for (i=0; i < 16; i++)
    1687   {
    1688     m2[0][i] = m1[0][i] + m1[2][i];
    1689     m2[1][i] = m1[1][i] + m1[3][i];
    1690     m2[2][i] = m1[0][i] - m1[2][i];
    1691     m2[3][i] = m1[1][i] - m1[3][i];
    1692 
    1693     m1[0][i] = m2[0][i] + m2[1][i];
    1694     m1[1][i] = m2[0][i] - m2[1][i];
    1695     m1[2][i] = m2[2][i] + m2[3][i];
    1696     m1[3][i] = m2[2][i] - m2[3][i];
    1697   }
    1698 
    1699   for (i = 0; i < 4; i++)
    1700   {
    1701     for (j = 0; j < 16; j++)
    1702     {
    1703       sad += abs(m1[i][j]);
    1704     }
    1705   }
    1706 
    1707   sad=((sad+2)>>2);
    1708 
    1709   return sad;
    1710 }
    1711 
    1712 UInt TComRdCost::xCalcHADs4x16( Pel *piOrg, Pel *piCur, Int iStrideOrg, Int iStrideCur, Int iStep )
    1713 {
    1714   Int k, i, j, jj, sad=0;
    1715   Int diff[64], m1[16][4], m2[16][4], m3[16][4];
    1716   assert( iStep == 1 );
    1717   for( k = 0; k < 64; k += 4 )
    1718   {
    1719     diff[k+0] = piOrg[0] - piCur[0];
    1720     diff[k+1] = piOrg[1] - piCur[1];
    1721     diff[k+2] = piOrg[2] - piCur[2];
    1722     diff[k+3] = piOrg[3] - piCur[3];
    1723 
    1724     piCur += iStrideCur;
    1725     piOrg += iStrideOrg;
    1726   }
    1727 
    1728   //horizontal
    1729   for (j=0; j < 16; j++)
    1730   {
    1731     jj = j << 2;
    1732     m2[j][0] = diff[jj  ] + diff[jj+2];
    1733     m2[j][1] = diff[jj+1] + diff[jj+3];
    1734     m2[j][2] = diff[jj  ] - diff[jj+2];
    1735     m2[j][3] = diff[jj+1] - diff[jj+3];
    1736 
    1737     m1[j][0] = m2[j][0] + m2[j][1];
    1738     m1[j][1] = m2[j][0] - m2[j][1];
    1739     m1[j][2] = m2[j][2] + m2[j][3];
    1740     m1[j][3] = m2[j][2] - m2[j][3];
    1741   }
    1742 
    1743   //vertical
    1744   for (i=0; i < 4; i++)
    1745   {
    1746     m2[0][i]  = m1[0][i] + m1[8][i];
    1747     m2[1][i]  = m1[1][i] + m1[9][i];
    1748     m2[2][i]  = m1[2][i] + m1[10][i];
    1749     m2[3][i]  = m1[3][i] + m1[11][i];
    1750     m2[4][i]  = m1[4][i] + m1[12][i];
    1751     m2[5][i]  = m1[5][i] + m1[13][i];
    1752     m2[6][i]  = m1[6][i] + m1[14][i];
    1753     m2[7][i]  = m1[7][i] + m1[15][i];
    1754     m2[8][i]  = m1[0][i] - m1[8][i];
    1755     m2[9][i]  = m1[1][i] - m1[9][i];
    1756     m2[10][i] = m1[2][i] - m1[10][i];
    1757     m2[11][i] = m1[3][i] - m1[11][i];
    1758     m2[12][i] = m1[4][i] - m1[12][i];
    1759     m2[13][i] = m1[5][i] - m1[13][i];
    1760     m2[14][i] = m1[6][i] - m1[14][i];
    1761     m2[15][i] = m1[7][i] - m1[15][i];
    1762 
    1763     m3[0][i]  = m2[0][i]  + m2[4][i];
    1764     m3[1][i]  = m2[1][i]  + m2[5][i];
    1765     m3[2][i]  = m2[2][i]  + m2[6][i];
    1766     m3[3][i]  = m2[3][i]  + m2[7][i];
    1767     m3[4][i]  = m2[0][i]  - m2[4][i];
    1768     m3[5][i]  = m2[1][i]  - m2[5][i];
    1769     m3[6][i]  = m2[2][i]  - m2[6][i];
    1770     m3[7][i]  = m2[3][i]  - m2[7][i];
    1771     m3[8][i]  = m2[8][i]  + m2[12][i];
    1772     m3[9][i]  = m2[9][i]  + m2[13][i];
    1773     m3[10][i] = m2[10][i] + m2[14][i];
    1774     m3[11][i] = m2[11][i] + m2[15][i];
    1775     m3[12][i] = m2[8][i]  - m2[12][i];
    1776     m3[13][i] = m2[9][i]  - m2[13][i];
    1777     m3[14][i] = m2[10][i] - m2[14][i];
    1778     m3[15][i] = m2[11][i] - m2[15][i];
    1779 
    1780     m1[0][i]  = m3[0][i]  + m3[2][i];
    1781     m1[1][i]  = m3[1][i]  + m3[3][i];
    1782     m1[2][i]  = m3[0][i]  - m3[2][i];
    1783     m1[3][i]  = m3[1][i]  - m3[3][i];
    1784     m1[4][i]  = m3[4][i]  + m3[6][i];
    1785     m1[5][i]  = m3[5][i]  + m3[7][i];
    1786     m1[6][i]  = m3[4][i]  - m3[6][i];
    1787     m1[7][i]  = m3[5][i]  - m3[7][i];
    1788     m1[8][i]  = m3[8][i]  + m3[10][i];
    1789     m1[9][i]  = m3[9][i]  + m3[11][i];
    1790     m1[10][i] = m3[8][i]  - m3[10][i];
    1791     m1[11][i] = m3[9][i]  - m3[11][i];
    1792     m1[12][i] = m3[12][i] + m3[14][i];
    1793     m1[13][i] = m3[13][i] + m3[15][i];
    1794     m1[14][i] = m3[12][i] - m3[14][i];
    1795     m1[15][i] = m3[13][i] - m3[15][i];
    1796 
    1797     m2[0][i]  = m1[0][i]  + m1[1][i];
    1798     m2[1][i]  = m1[0][i]  - m1[1][i];
    1799     m2[2][i]  = m1[2][i]  + m1[3][i];
    1800     m2[3][i]  = m1[2][i]  - m1[3][i];
    1801     m2[4][i]  = m1[4][i]  + m1[5][i];
    1802     m2[5][i]  = m1[4][i]  - m1[5][i];
    1803     m2[6][i]  = m1[6][i]  + m1[7][i];
    1804     m2[7][i]  = m1[6][i]  - m1[7][i];
    1805     m2[8][i]  = m1[8][i]  + m1[9][i];
    1806     m2[9][i]  = m1[8][i]  - m1[9][i];
    1807     m2[10][i] = m1[10][i] + m1[11][i];
    1808     m2[11][i] = m1[10][i] - m1[11][i];
    1809     m2[12][i] = m1[12][i] + m1[13][i];
    1810     m2[13][i] = m1[12][i] - m1[13][i];
    1811     m2[14][i] = m1[14][i] + m1[15][i];
    1812     m2[15][i] = m1[14][i] - m1[15][i];
    1813   }
    1814 
    1815   for (i = 0; i < 16; i++)
    1816   {
    1817     for (j = 0; j < 4; j++)
    1818     {
    1819       sad += abs(m2[i][j]);
    1820     }
    1821   }
    1822 
    1823   sad=((sad+2)>>2);
    1824 
    1825   return sad;
    1826 }
    1827 #endif
    1828 
    18291541UInt TComRdCost::xGetHADs4( DistParam* pcDtParam )
    18301542{
     
    19091621  UInt uiSum = 0;
    19101622
    1911 #if NS_HAD
    1912   if( ( ( iRows % 8 == 0) && (iCols % 8 == 0) && ( iRows == iCols ) ) || ( ( iRows % 8 == 0 ) && (iCols % 8 == 0) && !pcDtParam->bUseNSHAD ) )
    1913 #else
    19141623  if( ( iRows % 8 == 0) && (iCols % 8 == 0) )
    1915 #endif
    19161624  {
    19171625    Int  iOffsetOrg = iStrideOrg<<3;
     
    19271635    }
    19281636  }
    1929 #if NS_HAD
    1930   else if ( ( iCols > 8 ) && ( iCols > iRows ) && pcDtParam->bUseNSHAD )
    1931   {
    1932     Int  iOffsetOrg = iStrideOrg<<2;
    1933     Int  iOffsetCur = iStrideCur<<2;
    1934     for ( y=0; y<iRows; y+= 4 )
    1935     {
    1936       for ( x=0; x<iCols; x+= 16 )
    1937       {
    1938         uiSum += xCalcHADs16x4( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    1939       }
    1940       piOrg += iOffsetOrg;
    1941       piCur += iOffsetCur;
    1942     }
    1943   }
    1944   else if ( ( iRows > 8 ) && ( iCols < iRows ) && pcDtParam->bUseNSHAD )
    1945   {
    1946     Int  iOffsetOrg = iStrideOrg<<4;
    1947     Int  iOffsetCur = iStrideCur<<4;
    1948     for ( y=0; y<iRows; y+= 16 )
    1949     {
    1950       for ( x=0; x<iCols; x+= 4 )
    1951       {
    1952         uiSum += xCalcHADs4x16( &piOrg[x], &piCur[x*iStep], iStrideOrg, iStrideCur, iStep );
    1953       }
    1954       piOrg += iOffsetOrg;
    1955       piCur += iOffsetCur;
    1956     }
    1957   }
    1958 #endif
    19591637  else if( ( iRows % 4 == 0) && (iCols % 4 == 0) )
    19601638  {
  • trunk/source/Lib/TLibCommon/TComRdCost.h

    r442 r540  
    8484  UInt            uiComp;           // uiComp = 0 (luma Y), 1 (chroma U), 2 (chroma V)
    8585
    86 #if NS_HAD
    87   Bool            bUseNSHAD;
    88 #endif
    89 
    9086  // (vertical) subsampling shift (for reducing complexity)
    9187  // - 0 = no subsampling, 1 = even rows, 2 = every 4th, etc.
     
    104100    iSubShift = 0;
    105101    bitDepth = 0;
    106 #if NS_HAD
    107     bUseNSHAD = false;
    108 #endif
    109102  }
    110103};
     
    123116#endif 
    124117 
    125 #if WEIGHTED_CHROMA_DISTORTION
    126118  Double                  m_cbDistortionWeight;
    127119  Double                  m_crDistortionWeight;
    128 #endif
    129120  Double                  m_dLambda;
    130121  Double                  m_sqrtLambda;
     
    155146  Double  calcRdCost64( UInt64 uiBits, UInt64 uiDistortion, Bool bFlag = false, DFunc eDFunc = DF_DEFAULT );
    156147 
    157 #if WEIGHTED_CHROMA_DISTORTION
    158148  Void    setCbDistortionWeight      ( Double cbDistortionWeight) { m_cbDistortionWeight = cbDistortionWeight; };
    159149  Void    setCrDistortionWeight      ( Double crDistortionWeight) { m_crDistortionWeight = crDistortionWeight; };
    160 #endif
    161150  Void    setLambda      ( Double dLambda );
    162151  Void    setFrameLambda ( Double dLambda ) { m_dFrameLambda = dLambda; }
     
    164153  Double  getSqrtLambda ()   { return m_sqrtLambda; }
    165154
    166 #if RATE_CONTROL_LAMBDA_DOMAIN
    167155  Double  getLambda() { return m_dLambda; }
    168 #if M0036_RC_IMPROVEMENT
    169156  Double  getChromaWeight () {return((m_cbDistortionWeight+m_crDistortionWeight)/2.0);}
    170 #endif
    171 #endif
    172157 
    173158  // Distortion Functions
     
    176161  Void    setDistParam( UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc, DistParam& rcDistParam );
    177162  Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride,            DistParam& rcDistParam );
    178 #if NS_HAD
    179   Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME=false, Bool bUseNSHAD=false );
    180   Void    setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard = false, Bool bUseNSHAD=false );
    181 #else
    182163  Void    setDistParam( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, Int iStep, DistParam& rcDistParam, Bool bHADME=false );
    183164  Void    setDistParam( DistParam& rcDP, Int bitDepth, Pel* p1, Int iStride1, Pel* p2, Int iStride2, Int iWidth, Int iHeight, Bool bHadamard = false );
    184 #endif
    185165 
    186166  UInt    calcHAD(Int bitDepth, Pel* pi0, Int iStride0, Pel* pi1, Int iStride1, Int iWidth, Int iHeight );
     
    253233  static UInt xCalcHADs4x4      ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    254234  static UInt xCalcHADs8x8      ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    255 #if NS_HAD
    256   static UInt xCalcHADs16x4     ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    257   static UInt xCalcHADs4x16     ( Pel *piOrg, Pel *piCurr, Int iStrideOrg, Int iStrideCur, Int iStep );
    258 #endif
    259235 
    260236public:
    261 #if WEIGHTED_CHROMA_DISTORTION
    262237  UInt   getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, TextType eText = TEXT_LUMA, DFunc eDFunc = DF_SSE );
    263 #else
    264   UInt   getDistPart(Int bitDepth, Pel* piCur, Int iCurStride,  Pel* piOrg, Int iOrgStride, UInt uiBlkWidth, UInt uiBlkHeight, DFunc eDFunc = DF_SSE );
    265 #endif
    266 
    267 #if RATE_CONTROL_LAMBDA_DOMAIN && !M0036_RC_IMPROVEMENT
    268   UInt   getSADPart ( Int bitDepth, Pel* pelCur, Int curStride,  Pel* pelOrg, Int orgStride, UInt width, UInt height );
    269 #endif
     238
    270239};// END CLASS DEFINITION TComRdCost
    271240
  • trunk/source/Lib/TLibCommon/TComRom.cpp

    r494 r540  
    363363const UInt g_uiGroupIdx[ 32 ]   = {0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9};
    364364
    365 // Rice parameters for absolute transform levels
    366 const UInt g_auiGoRiceRange[5] =
    367 {
    368   7, 14, 26, 46, 78
    369 };
    370 
    371 const UInt g_auiGoRicePrefixLen[5] =
    372 {
    373   8, 7, 6, 5, 4
    374 };
    375 
    376365Void initSigLastScan(UInt* pBuffD, UInt* pBuffH, UInt* pBuffV, Int iWidth, Int iHeight)
    377366{
     
    541530Int g_mvScalingFactor  [MAX_LAYERS][2] = {{0,0}, {0,0}};
    542531Int g_posScalingFactor [MAX_LAYERS][2] = {{0,0}, {0,0}};
    543 
    544 #if IL_SL_SIGNALLING_N0371
    545 Int ref_scalingListDC         [MAX_LAYERS][SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM];
    546 Int ref_scalingListCoef       [MAX_LAYERS][SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][MAX_MATRIX_COEF_NUM];
    547 Int activeRefPPSId            [MAX_LAYERS];
    548 Int activeRefSPSId            [MAX_LAYERS];
    549 #endif
    550532#endif
    551533
  • trunk/source/Lib/TLibCommon/TComRom.h

    r494 r540  
    131131extern const UInt   g_uiMinInGroup[ 10 ];
    132132
    133 extern const UInt   g_auiGoRiceRange[5];                  //!< maximum value coded with Rice codes
    134 extern const UInt   g_auiGoRicePrefixLen[5];              //!< prefix length for each maximum value
    135  
    136133extern const UInt   g_sigLastScan8x8[ 3 ][ 4 ];           //!< coefficient group scan order for 8x8 TUs
    137134extern       UInt   g_sigLastScanCG32x32[ 64 ];
     
    291288#if SVC_EXTENSION
    292289extern Int g_mvScalingFactor  [MAX_LAYERS][2];
    293 extern Int g_posScalingFactor [MAX_LAYERS][2];
    294 
    295 #if IL_SL_SIGNALLING_N0371
    296 extern Int ref_scalingListDC         [MAX_LAYERS][SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM];
    297 extern Int ref_scalingListCoef       [MAX_LAYERS][SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM][MAX_MATRIX_COEF_NUM];
    298 extern Int activeRefPPSId            [MAX_LAYERS];
    299 extern Int activeRefSPSId            [MAX_LAYERS]; 
    300 #endif   
     290extern Int g_posScalingFactor [MAX_LAYERS][2];
    301291#endif
    302292
  • trunk/source/Lib/TLibCommon/TComSampleAdaptiveOffset.cpp

    r442 r540  
    4444//! \ingroup TLibCommon
    4545//! \{
     46#if HM_CLEANUP_SAO
     47UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS];
     48
     49SAOOffset::SAOOffset()
     50{
     51  reset();
     52}
     53
     54SAOOffset::~SAOOffset()
     55{
     56
     57}
     58
     59Void SAOOffset::reset()
     60{
     61  modeIdc = SAO_MODE_OFF;
     62  typeIdc = -1;
     63  typeAuxInfo = -1;
     64  ::memset(offset, 0, sizeof(Int)* MAX_NUM_SAO_CLASSES);
     65}
     66
     67const SAOOffset& SAOOffset::operator= (const SAOOffset& src)
     68{
     69  modeIdc = src.modeIdc;
     70  typeIdc = src.typeIdc;
     71  typeAuxInfo = src.typeAuxInfo;
     72  ::memcpy(offset, src.offset, sizeof(Int)* MAX_NUM_SAO_CLASSES);
     73
     74  return *this;
     75}
     76
     77
     78SAOBlkParam::SAOBlkParam()
     79{
     80  reset();
     81}
     82
     83SAOBlkParam::~SAOBlkParam()
     84{
     85
     86}
     87
     88Void SAOBlkParam::reset()
     89{
     90  for(Int compIdx=0; compIdx< 3; compIdx++)
     91  {
     92    offsetParam[compIdx].reset();
     93  }
     94}
     95
     96const SAOBlkParam& SAOBlkParam::operator= (const SAOBlkParam& src)
     97{
     98  for(Int compIdx=0; compIdx< 3; compIdx++)
     99  {
     100    offsetParam[compIdx] = src.offsetParam[compIdx];
     101  }
     102  return *this;
     103
     104}
     105
     106TComSampleAdaptiveOffset::TComSampleAdaptiveOffset()
     107{
     108  m_tempPicYuv = NULL;
     109  for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     110  {
     111    m_offsetClipTable[compIdx] = NULL;
     112  }
     113  m_signTable = NULL;
     114
     115 
     116  m_lineBufWidth = 0;
     117  m_signLineBuf1 = NULL;
     118  m_signLineBuf2 = NULL;
     119}
     120
     121
     122TComSampleAdaptiveOffset::~TComSampleAdaptiveOffset()
     123{
     124  destroy();
     125 
     126  if (m_signLineBuf1) delete[] m_signLineBuf1; m_signLineBuf1 = NULL;
     127  if (m_signLineBuf2) delete[] m_signLineBuf2; m_signLineBuf2 = NULL;
     128}
     129
     130#if AUXILIARY_PICTURES
     131Void TComSampleAdaptiveOffset::create( Int picWidth, Int picHeight, ChromaFormat chromaFormatIDC, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth )
     132#else
     133Void TComSampleAdaptiveOffset::create( Int picWidth, Int picHeight, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth )
     134#endif
     135{
     136  destroy();
     137
     138  m_picWidth = picWidth;   
     139  m_picHeight= picHeight;
     140  m_maxCUWidth= maxCUWidth;
     141  m_maxCUHeight= maxCUHeight;
     142
     143  m_numCTUInWidth = (m_picWidth/m_maxCUWidth) + ((m_picWidth % m_maxCUWidth)?1:0);
     144  m_numCTUInHeight= (m_picHeight/m_maxCUHeight) + ((m_picHeight % m_maxCUHeight)?1:0);
     145  m_numCTUsPic = m_numCTUInHeight*m_numCTUInWidth;
     146
     147  //temporary picture buffer
     148  if ( !m_tempPicYuv )
     149  {
     150    m_tempPicYuv = new TComPicYuv;
     151#if AUXILIARY_PICTURES
     152    m_tempPicYuv->create( m_picWidth, m_picHeight, chromaFormatIDC, m_maxCUWidth, m_maxCUHeight, maxCUDepth );
     153#else
     154    m_tempPicYuv->create( m_picWidth, m_picHeight, m_maxCUWidth, m_maxCUHeight, maxCUDepth );
     155#endif
     156  }
     157
     158  //bit-depth related
     159  for(Int compIdx =0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     160  {
     161    Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC;
     162    m_offsetStepLog2  [compIdx] = max(bitDepthSample - MAX_SAO_TRUNCATED_BITDEPTH, 0);
     163    g_saoMaxOffsetQVal[compIdx] = (1<<(min(bitDepthSample,MAX_SAO_TRUNCATED_BITDEPTH)-5))-1; //Table 9-32, inclusive
     164  }
     165
     166  //look-up table for clipping
     167  for(Int compIdx =0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     168  {
     169    Int bitDepthSample = (compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC; //exclusive
     170    Int maxSampleValue = (1<< bitDepthSample); //exclusive
     171    Int maxOffsetValue = (g_saoMaxOffsetQVal[compIdx] << m_offsetStepLog2[compIdx]);
     172
     173    m_offsetClipTable[compIdx] = new Int[(maxSampleValue + maxOffsetValue -1)+ (maxOffsetValue)+1 ]; //positive & negative range plus 0
     174    m_offsetClip[compIdx] = &(m_offsetClipTable[compIdx][maxOffsetValue]);
     175
     176    //assign clipped values
     177    Int* offsetClipPtr = m_offsetClip[compIdx];
     178    for(Int k=0; k< maxSampleValue; k++)
     179    {
     180      *(offsetClipPtr + k) = k;
     181    }
     182    for(Int k=0; k< maxOffsetValue; k++ )
     183    {
     184      *(offsetClipPtr + maxSampleValue+ k) = maxSampleValue-1;
     185      *(offsetClipPtr -k -1 )              = 0;
     186    }
     187    if(compIdx == SAO_Y) //g_bitDepthY is always larger than or equal to g_bitDepthC
     188    {
     189      m_signTable = new Short[ 2*(maxSampleValue-1) + 1 ];
     190      m_sign = &(m_signTable[maxSampleValue-1]);
     191
     192      m_sign[0] = 0;
     193      for(Int k=1; k< maxSampleValue; k++)
     194      {
     195        m_sign[k] = 1;
     196        m_sign[-k]= -1;
     197      }
     198    }
     199  } 
     200
     201}
     202
     203Void TComSampleAdaptiveOffset::destroy()
     204{
     205  if ( m_tempPicYuv )
     206  {
     207    m_tempPicYuv->destroy();
     208    delete m_tempPicYuv;
     209    m_tempPicYuv = NULL;
     210  }
     211
     212  for(Int compIdx=0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     213  {
     214    if(m_offsetClipTable[compIdx])
     215    {
     216      delete[] m_offsetClipTable[compIdx]; m_offsetClipTable[compIdx] = NULL;
     217    }
     218  }
     219  if( m_signTable )
     220  {
     221    delete[] m_signTable; m_signTable = NULL;
     222  }
     223}
     224
     225Void TComSampleAdaptiveOffset::invertQuantOffsets(Int compIdx, Int typeIdc, Int typeAuxInfo, Int* dstOffsets, Int* srcOffsets)
     226{
     227  Int codedOffset[MAX_NUM_SAO_CLASSES];
     228
     229  ::memcpy(codedOffset, srcOffsets, sizeof(Int)*MAX_NUM_SAO_CLASSES);
     230  ::memset(dstOffsets, 0, sizeof(Int)*MAX_NUM_SAO_CLASSES);
     231
     232  if(typeIdc == SAO_TYPE_START_BO)
     233  {
     234    for(Int i=0; i< 4; i++)
     235    {
     236      dstOffsets[(typeAuxInfo+ i)%NUM_SAO_BO_CLASSES] = codedOffset[(typeAuxInfo+ i)%NUM_SAO_BO_CLASSES]*(1<<m_offsetStepLog2[compIdx]);
     237    }
     238  }
     239  else //EO
     240  {
     241    for(Int i=0; i< NUM_SAO_EO_CLASSES; i++)
     242    {
     243      dstOffsets[i] = codedOffset[i] *(1<<m_offsetStepLog2[compIdx]);
     244    }
     245    assert(dstOffsets[SAO_CLASS_EO_PLAIN] == 0); //keep EO plain offset as zero
     246  }
     247
     248}
     249
     250Int TComSampleAdaptiveOffset::getMergeList(TComPic* pic, Int ctu, SAOBlkParam* blkParams, std::vector<SAOBlkParam*>& mergeList)
     251{
     252  Int ctuX = ctu % m_numCTUInWidth;
     253  Int ctuY = ctu / m_numCTUInWidth;
     254  Int mergedCTUPos;
     255  Int numValidMergeCandidates = 0;
     256
     257  for(Int mergeType=0; mergeType< NUM_SAO_MERGE_TYPES; mergeType++)
     258  {
     259    SAOBlkParam* mergeCandidate = NULL;
     260
     261    switch(mergeType)
     262    {
     263    case SAO_MERGE_ABOVE:
     264      {
     265        if(ctuY > 0)
     266        {
     267          mergedCTUPos = ctu- m_numCTUInWidth;
     268          if( pic->getSAOMergeAvailability(ctu, mergedCTUPos) )
     269          {
     270            mergeCandidate = &(blkParams[mergedCTUPos]);
     271          }
     272        }
     273      }
     274      break;
     275    case SAO_MERGE_LEFT:
     276      {
     277        if(ctuX > 0)
     278        {
     279          mergedCTUPos = ctu- 1;
     280          if( pic->getSAOMergeAvailability(ctu, mergedCTUPos) )
     281          {
     282            mergeCandidate = &(blkParams[mergedCTUPos]);
     283          }
     284        }
     285      }
     286      break;
     287    default:
     288      {
     289        printf("not a supported merge type");
     290        assert(0);
     291        exit(-1);
     292      }
     293    }
     294
     295    mergeList.push_back(mergeCandidate);
     296    if (mergeCandidate != NULL)
     297    {
     298      numValidMergeCandidates++;
     299    }
     300  }
     301
     302  return numValidMergeCandidates;
     303}
     304
     305
     306Void TComSampleAdaptiveOffset::reconstructBlkSAOParam(SAOBlkParam& recParam, std::vector<SAOBlkParam*>& mergeList)
     307{
     308  for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     309  {
     310    SAOOffset& offsetParam = recParam[compIdx];
     311
     312    if(offsetParam.modeIdc == SAO_MODE_OFF)
     313    {
     314      continue;
     315    }
     316
     317    switch(offsetParam.modeIdc)
     318    {
     319    case SAO_MODE_NEW:
     320      {
     321        invertQuantOffsets(compIdx, offsetParam.typeIdc, offsetParam.typeAuxInfo, offsetParam.offset, offsetParam.offset);
     322      }
     323      break;
     324    case SAO_MODE_MERGE:
     325      {
     326        SAOBlkParam* mergeTarget = mergeList[offsetParam.typeIdc];
     327        assert(mergeTarget != NULL);
     328
     329        offsetParam = (*mergeTarget)[compIdx];
     330      }
     331      break;
     332    default:
     333      {
     334        printf("Not a supported mode");
     335        assert(0);
     336        exit(-1);
     337      }
     338    }
     339  }
     340}
     341
     342Void TComSampleAdaptiveOffset::reconstructBlkSAOParams(TComPic* pic, SAOBlkParam* saoBlkParams)
     343{
     344  m_picSAOEnabled[SAO_Y] = m_picSAOEnabled[SAO_Cb] = m_picSAOEnabled[SAO_Cr] = false;
     345
     346  for(Int ctu=0; ctu< m_numCTUsPic; ctu++)
     347  {
     348    std::vector<SAOBlkParam*> mergeList;
     349    getMergeList(pic, ctu, saoBlkParams, mergeList);
     350
     351    reconstructBlkSAOParam(saoBlkParams[ctu], mergeList);
     352
     353    for(Int compIdx=0; compIdx< NUM_SAO_COMPONENTS; compIdx++)
     354    {
     355      if(saoBlkParams[ctu][compIdx].modeIdc != SAO_MODE_OFF)
     356      {
     357        m_picSAOEnabled[compIdx] = true;
     358      }
     359    }
     360  }
     361
     362
     363}
     364
     365
     366Void TComSampleAdaptiveOffset::offsetBlock(Int compIdx, Int typeIdx, Int* offset 
     367                                          , Pel* srcBlk, Pel* resBlk, Int srcStride, Int resStride,  Int width, Int height
     368                                          , Bool isLeftAvail,  Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail)
     369{
     370  if(m_lineBufWidth != m_maxCUWidth)
     371  {
     372    m_lineBufWidth = m_maxCUWidth;
     373   
     374    if (m_signLineBuf1) delete[] m_signLineBuf1; m_signLineBuf1 = NULL;
     375    m_signLineBuf1 = new Char[m_lineBufWidth+1];
     376   
     377    if (m_signLineBuf2) delete[] m_signLineBuf2; m_signLineBuf2 = NULL;
     378    m_signLineBuf2 = new Char[m_lineBufWidth+1];
     379  }
     380
     381  Int* offsetClip = m_offsetClip[compIdx];
     382
     383  Int x,y, startX, startY, endX, endY, edgeType;
     384  Int firstLineStartX, firstLineEndX, lastLineStartX, lastLineEndX;
     385  Char signLeft, signRight, signDown;
     386
     387  Pel* srcLine = srcBlk;
     388  Pel* resLine = resBlk;
     389
     390  switch(typeIdx)
     391  {
     392  case SAO_TYPE_EO_0:
     393    {
     394      offset += 2;
     395      startX = isLeftAvail ? 0 : 1;
     396      endX   = isRightAvail ? width : (width -1);
     397      for (y=0; y< height; y++)
     398      {
     399        signLeft = (Char)m_sign[srcLine[startX] - srcLine[startX-1]];
     400        for (x=startX; x< endX; x++)
     401        {
     402          signRight = (Char)m_sign[srcLine[x] - srcLine[x+1]];
     403          edgeType =  signRight + signLeft;
     404          signLeft  = -signRight;
     405
     406          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     407        }
     408        srcLine  += srcStride;
     409        resLine += resStride;
     410      }
     411
     412    }
     413    break;
     414  case SAO_TYPE_EO_90:
     415    {
     416      offset += 2;
     417      Char *signUpLine = m_signLineBuf1;
     418
     419      startY = isAboveAvail ? 0 : 1;
     420      endY   = isBelowAvail ? height : height-1;
     421      if (!isAboveAvail)
     422      {
     423        srcLine += srcStride;
     424        resLine += resStride;
     425      }
     426
     427      Pel* srcLineAbove= srcLine- srcStride;
     428      for (x=0; x< width; x++)
     429      {
     430        signUpLine[x] = (Char)m_sign[srcLine[x] - srcLineAbove[x]];
     431      }
     432
     433      Pel* srcLineBelow;
     434      for (y=startY; y<endY; y++)
     435      {
     436        srcLineBelow= srcLine+ srcStride;
     437
     438        for (x=0; x< width; x++)
     439        {
     440          signDown  = (Char)m_sign[srcLine[x] - srcLineBelow[x]];
     441          edgeType = signDown + signUpLine[x];
     442          signUpLine[x]= -signDown;
     443
     444          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     445        }
     446        srcLine += srcStride;
     447        resLine += resStride;
     448      }
     449
     450    }
     451    break;
     452  case SAO_TYPE_EO_135:
     453    {
     454      offset += 2;
     455      Char *signUpLine, *signDownLine, *signTmpLine;
     456
     457      signUpLine  = m_signLineBuf1;
     458      signDownLine= m_signLineBuf2;
     459
     460      startX = isLeftAvail ? 0 : 1 ;
     461      endX   = isRightAvail ? width : (width-1);
     462
     463      //prepare 2nd line's upper sign
     464      Pel* srcLineBelow= srcLine+ srcStride;
     465      for (x=startX; x< endX+1; x++)
     466      {
     467        signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x- 1]];
     468      }
     469
     470      //1st line
     471      Pel* srcLineAbove= srcLine- srcStride;
     472      firstLineStartX = isAboveLeftAvail ? 0 : 1;
     473      firstLineEndX   = isAboveAvail? endX: 1;
     474      for(x= firstLineStartX; x< firstLineEndX; x++)
     475      {
     476        edgeType  =  m_sign[srcLine[x] - srcLineAbove[x- 1]] - signUpLine[x+1];
     477        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     478      }
     479      srcLine  += srcStride;
     480      resLine  += resStride;
     481
     482
     483      //middle lines
     484      for (y= 1; y< height-1; y++)
     485      {
     486        srcLineBelow= srcLine+ srcStride;
     487
     488        for (x=startX; x<endX; x++)
     489        {
     490          signDown =  (Char)m_sign[srcLine[x] - srcLineBelow[x+ 1]] ;
     491          edgeType =  signDown + signUpLine[x];
     492          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     493
     494          signDownLine[x+1] = -signDown;
     495        }
     496        signDownLine[startX] = (Char)m_sign[srcLineBelow[startX] - srcLine[startX-1]];
     497
     498        signTmpLine  = signUpLine;
     499        signUpLine   = signDownLine;
     500        signDownLine = signTmpLine;
     501
     502        srcLine += srcStride;
     503        resLine += resStride;
     504      }
     505
     506      //last line
     507      srcLineBelow= srcLine+ srcStride;
     508      lastLineStartX = isBelowAvail ? startX : (width -1);
     509      lastLineEndX   = isBelowRightAvail ? width : (width -1);
     510      for(x= lastLineStartX; x< lastLineEndX; x++)
     511      {
     512        edgeType =  m_sign[srcLine[x] - srcLineBelow[x+ 1]] + signUpLine[x];
     513        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     514
     515      }
     516    }
     517    break;
     518  case SAO_TYPE_EO_45:
     519    {
     520      offset += 2;
     521      Char *signUpLine = m_signLineBuf1+1;
     522
     523      startX = isLeftAvail ? 0 : 1;
     524      endX   = isRightAvail ? width : (width -1);
     525
     526      //prepare 2nd line upper sign
     527      Pel* srcLineBelow= srcLine+ srcStride;
     528      for (x=startX-1; x< endX; x++)
     529      {
     530        signUpLine[x] = (Char)m_sign[srcLineBelow[x] - srcLine[x+1]];
     531      }
     532
     533
     534      //first line
     535      Pel* srcLineAbove= srcLine- srcStride;
     536      firstLineStartX = isAboveAvail ? startX : (width -1 );
     537      firstLineEndX   = isAboveRightAvail ? width : (width-1);
     538      for(x= firstLineStartX; x< firstLineEndX; x++)
     539      {
     540        edgeType = m_sign[srcLine[x] - srcLineAbove[x+1]] -signUpLine[x-1];
     541        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     542      }
     543      srcLine += srcStride;
     544      resLine += resStride;
     545
     546      //middle lines
     547      for (y= 1; y< height-1; y++)
     548      {
     549        srcLineBelow= srcLine+ srcStride;
     550
     551        for(x= startX; x< endX; x++)
     552        {
     553          signDown =  (Char)m_sign[srcLine[x] - srcLineBelow[x-1]] ;
     554          edgeType =  signDown + signUpLine[x];
     555          resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     556          signUpLine[x-1] = -signDown;
     557        }
     558        signUpLine[endX-1] = (Char)m_sign[srcLineBelow[endX-1] - srcLine[endX]];
     559        srcLine  += srcStride;
     560        resLine += resStride;
     561      }
     562
     563      //last line
     564      srcLineBelow= srcLine+ srcStride;
     565      lastLineStartX = isBelowLeftAvail ? 0 : 1;
     566      lastLineEndX   = isBelowAvail ? endX : 1;
     567      for(x= lastLineStartX; x< lastLineEndX; x++)
     568      {
     569        edgeType = m_sign[srcLine[x] - srcLineBelow[x-1]] + signUpLine[x];
     570        resLine[x] = offsetClip[srcLine[x] + offset[edgeType]];
     571
     572      }
     573    }
     574    break;
     575  case SAO_TYPE_BO:
     576    {
     577      Int shiftBits = ((compIdx == SAO_Y)?g_bitDepthY:g_bitDepthC)- NUM_SAO_BO_CLASSES_LOG2;
     578      for (y=0; y< height; y++)
     579      {
     580        for (x=0; x< width; x++)
     581        {
     582          resLine[x] = offsetClip[ srcLine[x] + offset[srcLine[x] >> shiftBits] ];
     583        }
     584        srcLine += srcStride;
     585        resLine += resStride;
     586      }
     587    }
     588    break;
     589  default:
     590    {
     591      printf("Not a supported SAO types\n");
     592      assert(0);
     593      exit(-1);
     594    }
     595  }
     596
     597
     598}
     599
     600Void TComSampleAdaptiveOffset::offsetCTU(Int ctu, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam& saoblkParam, TComPic* pPic)
     601{
     602  Bool isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail;
     603
     604  if(
     605    (saoblkParam[SAO_Y ].modeIdc == SAO_MODE_OFF) &&
     606    (saoblkParam[SAO_Cb].modeIdc == SAO_MODE_OFF) &&
     607    (saoblkParam[SAO_Cr].modeIdc == SAO_MODE_OFF)
     608    )
     609  {
     610    return;
     611  }
     612
     613  //block boundary availability
     614  pPic->getPicSym()->deriveLoopFilterBoundaryAvailibility(ctu, isLeftAvail,isRightAvail,isAboveAvail,isBelowAvail,isAboveLeftAvail,isAboveRightAvail,isBelowLeftAvail,isBelowRightAvail);
     615
     616  Int yPos   = (ctu / m_numCTUInWidth)*m_maxCUHeight;
     617  Int xPos   = (ctu % m_numCTUInWidth)*m_maxCUWidth;
     618  Int height = (yPos + m_maxCUHeight > m_picHeight)?(m_picHeight- yPos):m_maxCUHeight;
     619  Int width  = (xPos + m_maxCUWidth  > m_picWidth )?(m_picWidth - xPos):m_maxCUWidth;
     620
     621  for(Int compIdx= 0; compIdx < NUM_SAO_COMPONENTS; compIdx++)
     622  {
     623    SAOOffset& ctbOffset = saoblkParam[compIdx];
     624
     625    if(ctbOffset.modeIdc != SAO_MODE_OFF)
     626    {
     627      Bool isLuma     = (compIdx == SAO_Y);
     628      Int  formatShift= isLuma?0:1;
     629
     630      Int  blkWidth   = (width  >> formatShift);
     631      Int  blkHeight  = (height >> formatShift);
     632      Int  blkYPos    = (yPos   >> formatShift);
     633      Int  blkXPos    = (xPos   >> formatShift);
     634
     635      Int  srcStride = isLuma?srcYuv->getStride():srcYuv->getCStride();
     636      Pel* srcBlk    = getPicBuf(srcYuv, compIdx)+ (yPos >> formatShift)*srcStride+ (xPos >> formatShift);
     637
     638      Int  resStride  = isLuma?resYuv->getStride():resYuv->getCStride();
     639      Pel* resBlk     = getPicBuf(resYuv, compIdx)+ blkYPos*resStride+ blkXPos;
     640
     641      offsetBlock( compIdx, ctbOffset.typeIdc, ctbOffset.offset
     642                  , srcBlk, resBlk, srcStride, resStride, blkWidth, blkHeight
     643                  , isLeftAvail, isRightAvail
     644                  , isAboveAvail, isBelowAvail
     645                  , isAboveLeftAvail, isAboveRightAvail
     646                  , isBelowLeftAvail, isBelowRightAvail
     647                  );
     648    }
     649  } //compIdx
     650
     651}
     652
     653
     654Void TComSampleAdaptiveOffset::SAOProcess(TComPic* pDecPic)
     655{
     656  if(!m_picSAOEnabled[SAO_Y] && !m_picSAOEnabled[SAO_Cb] && !m_picSAOEnabled[SAO_Cr])
     657  {
     658    return;
     659  }
     660  TComPicYuv* resYuv = pDecPic->getPicYuvRec();
     661  TComPicYuv* srcYuv = m_tempPicYuv;
     662  resYuv->copyToPic(srcYuv);
     663  for(Int ctu= 0; ctu < m_numCTUsPic; ctu++)
     664  {
     665    offsetCTU(ctu, srcYuv, resYuv, (pDecPic->getPicSym()->getSAOBlkParam())[ctu], pDecPic);
     666  } //ctu
     667}
     668
     669
     670Pel* TComSampleAdaptiveOffset::getPicBuf(TComPicYuv* pPicYuv, Int compIdx)
     671{
     672  Pel* pBuf = NULL;
     673  switch(compIdx)
     674  {
     675  case SAO_Y:
     676    {
     677      pBuf = pPicYuv->getLumaAddr();
     678    }
     679    break;
     680  case SAO_Cb:
     681    {
     682      pBuf = pPicYuv->getCbAddr();
     683    }
     684    break;
     685  case SAO_Cr:
     686    {
     687      pBuf = pPicYuv->getCrAddr();
     688    }
     689    break;
     690  default:
     691    {
     692      printf("Not a legal component ID for SAO\n");
     693      assert(0);
     694      exit(-1);
     695    }
     696  }
     697
     698  return pBuf;
     699}
     700#else
    46701
    47702SAOParam::~SAOParam()
     
    13642019  }
    13652020}
    1366 
     2021#endif
    13672022/** PCM LF disable process.
    13682023 * \param pcPic picture (TComPic) pointer
  • trunk/source/Lib/TLibCommon/TComSampleAdaptiveOffset.h

    r313 r540  
    4545//! \{
    4646
     47
     48#if HM_CLEANUP_SAO
     49// ====================================================================================================================
     50// Constants
     51// ====================================================================================================================
     52
     53#define MAX_SAO_TRUNCATED_BITDEPTH     10
     54// ====================================================================================================================
     55// Class definition
     56// ====================================================================================================================
     57extern UInt g_saoMaxOffsetQVal[NUM_SAO_COMPONENTS];
     58
     59class TComSampleAdaptiveOffset
     60{
     61public:
     62  TComSampleAdaptiveOffset();
     63  virtual ~TComSampleAdaptiveOffset();
     64  Void SAOProcess(TComPic* pDecPic);
     65#if AUXILIARY_PICTURES
     66  Void create( Int picWidth, Int picHeight, ChromaFormat chromaFormatIDC, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth );
     67#else
     68  Void create( Int picWidth, Int picHeight, UInt maxCUWidth, UInt maxCUHeight, UInt maxCUDepth );
     69#endif
     70  Void destroy();
     71  Void reconstructBlkSAOParams(TComPic* pic, SAOBlkParam* saoBlkParams);
     72  Void PCMLFDisableProcess (TComPic* pcPic);
     73protected:
     74  Void offsetBlock(Int compIdx, Int typeIdx, Int* offset, Pel* srcBlk, Pel* resBlk, Int srcStride, Int resStride,  Int width, Int height
     75                  , Bool isLeftAvail, Bool isRightAvail, Bool isAboveAvail, Bool isBelowAvail, Bool isAboveLeftAvail, Bool isAboveRightAvail, Bool isBelowLeftAvail, Bool isBelowRightAvail);
     76  Pel* getPicBuf(TComPicYuv* pPicYuv, Int compIdx);
     77  Void invertQuantOffsets(Int compIdx, Int typeIdc, Int typeAuxInfo, Int* dstOffsets, Int* srcOffsets);
     78  Void reconstructBlkSAOParam(SAOBlkParam& recParam, std::vector<SAOBlkParam*>& mergeList);
     79  Int  getMergeList(TComPic* pic, Int ctu, SAOBlkParam* blkParams, std::vector<SAOBlkParam*>& mergeList);
     80  Void offsetCTU(Int ctu, TComPicYuv* srcYuv, TComPicYuv* resYuv, SAOBlkParam& saoblkParam, TComPic* pPic);
     81  Void xPCMRestoration(TComPic* pcPic);
     82  Void xPCMCURestoration ( TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth );
     83  Void xPCMSampleRestoration (TComDataCU* pcCU, UInt uiAbsZorderIdx, UInt uiDepth, TextType ttText);
     84protected:
     85  UInt m_offsetStepLog2[NUM_SAO_COMPONENTS]; //offset step 
     86  Int* m_offsetClip[NUM_SAO_COMPONENTS]; //clip table for fast operation
     87  Short* m_sign; //sign table for fast operation
     88  TComPicYuv*   m_tempPicYuv; //temporary buffer
     89  Int m_picWidth;
     90  Int m_picHeight;
     91  Int m_maxCUWidth;
     92  Int m_maxCUHeight;
     93  Int m_numCTUInWidth;
     94  Int m_numCTUInHeight;
     95  Int m_numCTUsPic;
     96 
     97 
     98  Int m_lineBufWidth;
     99  Char* m_signLineBuf1;
     100  Char* m_signLineBuf2;
     101private:
     102  Bool m_picSAOEnabled[NUM_SAO_COMPONENTS];
     103  Int*   m_offsetClipTable[NUM_SAO_COMPONENTS];
     104  Short* m_signTable;
     105
     106};
     107#else
     108
    47109// ====================================================================================================================
    48110// Constants
     
    145207};
    146208
     209#endif
     210
    147211//! \}
    148212#endif
  • trunk/source/Lib/TLibCommon/TComSlice.cpp

    r494 r540  
    4848ParameterSetMap<TComVPS> ParameterSetManager::m_vpsMap(MAX_NUM_VPS);
    4949Int ParameterSetManager::m_activeVPSId = -1;
    50 #if IL_SL_SIGNALLING_N0371
    51 TComSPS* TComSPS::m_pcSPS[MAX_LAYERS];
    52 TComPPS* TComPPS::m_pcPPS[MAX_LAYERS];
    53 #endif
    5450#endif
    5551
     
    8076, m_colFromL0Flag                 ( 1 )
    8177, m_colRefIdx                     ( 0 )
    82 #if SAO_CHROMA_LAMBDA
    83 , m_dLambdaLuma( 0.0 )
    84 , m_dLambdaChroma( 0.0 )
    85 #else
    86 , m_dLambda                       ( 0.0 )
    87 #endif
    8878, m_uiTLayer                      ( 0 )
    8979, m_bTLayerSwitchingFlag          ( false )
     
    118108#endif
    119109, m_bDiscardableFlag              ( false )
     110#if O0149_CROSS_LAYER_BLA_FLAG
     111, m_bCrossLayerBLAFlag            ( false )
     112#endif
    120113#endif //SVC_EXTENSION
    121114{
     
    143136  initEqualRef();
    144137 
     138  for (Int component = 0; component < 3; component++)
     139  {
     140    m_lambdas[component] = 0.0;
     141  }
     142 
    145143  for ( Int idx = 0; idx < MAX_NUM_REF; idx++ )
    146144  {
     
    157155  initWpAcDcParam();
    158156  m_saoEnabledFlag = false;
     157#if HM_CLEANUP_SAO
     158  m_saoEnabledFlagChroma = false;
     159#endif
    159160}
    160161
     
    276277    }
    277278    iterPic++;
     279#if SVC_EXTENSION
     280    // return NULL, if picture with requested POC is not in the list, otherwise iterator goes outside of the list
     281    if( iterPic == rcListPic.end() )
     282    {
     283      return NULL;
     284    }
     285#endif
    278286    pcPic = *(iterPic);
    279287  }
     
    308316      }
    309317     
     318#if POC_RESET_RPS
     319      if( ((!pocHasMsb) && ((poc & (pocCycle-1)) == picPoc)) || ( pocHasMsb && (poc == picPoc)) )
     320#else
    310321      if (poc == picPoc)
     322#endif
    311323      {
    312324       if (pcPic->getIsLongTerm())
     
    357369}
    358370
    359 #if FIX1071
    360371#if SVC_EXTENSION
    361372Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr, TComPic** ilpPic)
     
    363374Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr )
    364375#endif
    365 #else
    366 Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic )
    367 #endif
    368 {
    369 #if FIX1071
     376{
    370377  if (!checkNumPocTotalCurr)
    371 #endif
    372378  {
    373379    if (m_eSliceType == I_SLICE)
     
    522528      memset( refResamplingLayer, 0, sizeof( refResamplingLayer ) );
    523529#endif
     530#if !RESAMPLING_CONSTRAINT_BUG_FIX
    524531      const Window &scalEL = getSPS()->getScaledRefLayerWindow(m_interLayerPredLayerIdc[i]);
    525532      Int scalingOffset = ((scalEL.getWindowLeftOffset()   == 0 ) &&
     
    528535                           (scalEL.getWindowBottomOffset() == 0 )
    529536                          );
     537#endif
    530538
    531539      for( i=0; i < m_activeNumILRRefIdx; i++ )
    532540      {
    533541        UInt refLayerIdc = m_interLayerPredLayerIdc[i];
     542#if RESAMPLING_CONSTRAINT_BUG_FIX
     543#if O0098_SCALED_REF_LAYER_ID
     544        const Window &scalEL = getSPS()->getScaledRefLayerWindowForLayer(m_pcVPS->getRefLayerId( m_layerId, m_interLayerPredLayerIdc[i] ));
     545#else
     546        const Window &scalEL = getSPS()->getScaledRefLayerWindow(m_interLayerPredLayerIdc[i]);
     547#endif
     548        Int scalingOffset = ((scalEL.getWindowLeftOffset()   == 0 ) &&
     549                             (scalEL.getWindowRightOffset()  == 0 ) &&
     550                             (scalEL.getWindowTopOffset()    == 0 ) &&
     551                             (scalEL.getWindowBottomOffset() == 0 )
     552                            );
     553#endif
    534554        if(!( g_posScalingFactor[refLayerIdc][0] == 65536 && g_posScalingFactor[refLayerIdc][1] == 65536 ) || (!scalingOffset)) // ratio 1x
    535555        {
     
    585605  Int numPocTotalCurr = NumPocStCurr0 + NumPocStCurr1 + NumPocLtCurr;
    586606#endif //SVC_EXTENSION
    587 #if FIX1071
     607
    588608  if (checkNumPocTotalCurr)
    589609  {
     
    615635    m_aiNumRefIdx[1] = getNumRefIdx(REF_PIC_LIST_1);
    616636  }
    617 #endif
    618637
    619638#if M0457_IL_SAMPLE_PRED_ONLY_FLAG
     
    932951    numRpsCurrTempList += getNumILRRefIdx();
    933952#endif
    934   }
     953}
    935954#endif
    936955
     
    10381057 * If the current picture has a nal_ref_idc that is not 0, it will remain marked as "used for reference".
    10391058 */
     1059#if NO_CLRAS_OUTPUT_FLAG
     1060Void TComSlice::decodingRefreshMarking(Int& pocCRA, Bool& bRefreshPending, TComList<TComPic*>& rcListPic, Bool noClrasOutputFlag)
     1061#else
    10401062Void TComSlice::decodingRefreshMarking(Int& pocCRA, Bool& bRefreshPending, TComList<TComPic*>& rcListPic)
     1063#endif
    10411064{
    10421065  TComPic*                 rpcPic;
     
    10561079      rpcPic = *(iterPic);
    10571080      rpcPic->setCurrSliceIdx(0);
     1081#if NO_CLRAS_OUTPUT_FLAG
     1082      if (noClrasOutputFlag)
     1083      {
     1084        if (rpcPic->getPOC() != pocCurr) rpcPic->getSlice(0)->setReferenced(false);  // all layers
     1085      }
     1086      else
     1087      {
     1088        if (rpcPic->getPOC() != pocCurr && rpcPic->getLayerId() == m_layerId) rpcPic->getSlice(0)->setReferenced(false);  // only current layer
     1089      }
     1090#else
    10581091      if (rpcPic->getPOC() != pocCurr) rpcPic->getSlice(0)->setReferenced(false);
     1092#endif
    10591093      iterPic++;
    10601094    }
     
    11601194  m_colFromL0Flag        = pSrc->m_colFromL0Flag;
    11611195  m_colRefIdx            = pSrc->m_colRefIdx;
    1162 #if SAO_CHROMA_LAMBDA
    1163   m_dLambdaLuma          = pSrc->m_dLambdaLuma;
    1164   m_dLambdaChroma        = pSrc->m_dLambdaChroma;
    1165 #else
    1166   m_dLambda              = pSrc->m_dLambda;
    1167 #endif
     1196  setLambdas(pSrc->getLambdas());
    11681197  for (i = 0; i < 2; i++)
    11691198  {
     
    14901519    assert(rpcPic->getSlice( 0 )->isReferenced()==0||rpcPic->getUsedByCurr()==0||rpcPic->getTLayer()<=this->getTLayer());
    14911520    //check that pictures of higher or equal temporal layer are not in the RPS if the current picture is a TSA picture
    1492     if(this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TLA_R || this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N)
     1521    if(this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_R || this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N)
    14931522    {
    14941523      assert(rpcPic->getSlice( 0 )->isReferenced()==0||rpcPic->getTLayer()<this->getTLayer());
     
    16491678/** Function for constructing an explicit Reference Picture Set out of the available pictures in a referenced Reference Picture Set
    16501679*/
    1651 #if FIX1071
    16521680Void TComSlice::createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool isRAP)
    1653 #else
    1654 Void TComSlice::createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet)
    1655 #endif
    16561681{
    16571682  TComPic* rpcPic;
     
    16781703        // and should be added to the explicit Reference Picture Set
    16791704        pcRPS->setDeltaPOC(k, pReferencePictureSet->getDeltaPOC(i));
    1680 #if FIX1071
    16811705        pcRPS->setUsed(k, pReferencePictureSet->getUsed(i) && (!isRAP));
    1682 #else
    1683         pcRPS->setUsed(k, pReferencePictureSet->getUsed(i));
    1684 #endif
    16851706        if(pcRPS->getDeltaPOC(k) < 0)
    16861707        {
     
    18341855  TComVPS *vps = getVPS();
    18351856  UInt retVal, layerId = getLayerId();
     1857#if O0096_REP_FORMAT_INDEX
     1858  if ( layerId == 0 )
     1859  {
     1860    retVal = sps->getPicWidthInLumaSamples();
     1861  }
     1862  else
     1863  {
     1864    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(sps->getUpdateRepFormatFlag() ? sps->getUpdateRepFormatIndex() : layerId) )->getPicWidthVpsInLumaSamples();
     1865  }
     1866#else
    18361867  if( ( layerId == 0 ) || sps->getUpdateRepFormatFlag() )
    18371868  {
     
    18421873    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(layerId) )->getPicWidthVpsInLumaSamples();
    18431874  }
     1875#endif
    18441876  return retVal;
    18451877}
     
    18491881  TComVPS *vps = getVPS();
    18501882  UInt retVal, layerId = getLayerId();
     1883#if O0096_REP_FORMAT_INDEX
     1884  if( layerId == 0 )
     1885  {
     1886    retVal = sps->getPicHeightInLumaSamples();
     1887  }
     1888  else
     1889  {
     1890    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(sps->getUpdateRepFormatFlag() ? sps->getUpdateRepFormatIndex() : layerId) )->getPicHeightVpsInLumaSamples();
     1891  }
     1892#else
    18511893  if( ( layerId == 0 ) || sps->getUpdateRepFormatFlag() )
    18521894  {
     
    18571899    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(layerId) )->getPicHeightVpsInLumaSamples();
    18581900  }
     1901#endif
    18591902  return retVal;
    18601903}
     
    18731916  UInt retVal, layerId = getLayerId();
    18741917#endif
     1918#if O0096_REP_FORMAT_INDEX
     1919  if( layerId == 0 )
     1920  {
     1921    retVal = sps->getChromaFormatIdc();
     1922  }
     1923  else
     1924  {
     1925    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(sps->getUpdateRepFormatFlag() ? sps->getUpdateRepFormatIndex() : layerId) )->getChromaFormatVpsIdc();
     1926  }
     1927#else
    18751928  if( ( layerId == 0 ) || sps->getUpdateRepFormatFlag() )
    18761929  {
     
    18811934    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(layerId) )->getChromaFormatVpsIdc();
    18821935  }
     1936#endif
    18831937  return retVal;
    18841938}
     
    18881942  TComVPS *vps = getVPS();
    18891943  UInt retVal, layerId = getLayerId();
     1944#if O0096_REP_FORMAT_INDEX
     1945  if( layerId == 0 )
     1946  {
     1947    retVal = sps->getBitDepthY();
     1948  }
     1949  else
     1950  {
     1951    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(sps->getUpdateRepFormatFlag() ? sps->getUpdateRepFormatIndex() : layerId) )->getBitDepthVpsLuma();
     1952  }
     1953#else
    18901954  if( ( layerId == 0 ) || sps->getUpdateRepFormatFlag() )
    18911955  {
     
    18961960    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(layerId) )->getBitDepthVpsLuma();
    18971961  }
     1962#endif
    18981963  return retVal;
    18991964}
     
    19031968  TComVPS *vps = getVPS();
    19041969  UInt retVal, layerId = getLayerId();
     1970#if O0096_REP_FORMAT_INDEX
     1971  if( layerId == 0 )
     1972  {
     1973    retVal = sps->getBitDepthC();
     1974  }
     1975  else
     1976  {
     1977    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(sps->getUpdateRepFormatFlag() ? sps->getUpdateRepFormatIndex() : layerId) )->getBitDepthVpsChroma();
     1978  }
     1979#else
    19051980  if( ( layerId == 0 ) || sps->getUpdateRepFormatFlag() )
    19061981  {
     
    19111986    retVal = vps->getVpsRepFormat( vps->getVpsRepFormatIdx(layerId) )->getBitDepthVpsChroma();
    19121987  }
     1988#endif
    19131989  return retVal;
    19141990}
     
    20232099  ::memset(m_pocLsbNotPresentFlag, 0, sizeof(m_pocLsbNotPresentFlag));
    20242100#endif
     2101#if O0223_PICTURE_TYPES_ALIGN_FLAG
     2102  m_crossLayerPictureTypeAlignFlag = true;
     2103#endif
    20252104#if N0147_IRAP_ALIGN_FLAG
    20262105  m_crossLayerIrapAlignFlag = true;
     
    20422121  }
    20432122#endif
     2123#if VPS_VUI_TILES_NOT_IN_USE__FLAG
     2124   m_tilesNotInUseFlag = true;
     2125   ::memset(m_tilesInUseFlag,  0, sizeof(m_tilesInUseFlag));
     2126   ::memset(m_loopFilterNotAcrossTilesFlag,  0, sizeof(m_loopFilterNotAcrossTilesFlag));
     2127#endif
    20442128#if TILE_BOUNDARY_ALIGNED_FLAG
    20452129   ::memset(m_tileBoundariesAlignedFlag,  0, sizeof(m_tileBoundariesAlignedFlag));
    20462130#endif
     2131#if VPS_VUI_WPP_NOT_IN_USE__FLAG
     2132   m_wppNotInUseFlag = true;
     2133   ::memset(m_wppInUseFlag,  0, sizeof(m_wppInUseFlag));
     2134#endif
    20472135#if N0160_VUI_EXT_ILP_REF
    20482136   m_numIlpRestrictedRefLayers = false;
     
    20502138   ::memset(m_ctuBasedOffsetEnabledFlag,     0, sizeof(m_ctuBasedOffsetEnabledFlag));
    20512139   ::memset(m_minHorizontalCtuOffsetPlus1,   0, sizeof(m_minHorizontalCtuOffsetPlus1));
     2140#endif
     2141#if VPS_VUI_VIDEO_SIGNAL
     2142    m_vidSigPresentVpsFlag=true;
     2143    m_vpsVidSigInfo=1;
     2144    ::memset( m_vpsVidSigIdx, 0, sizeof(m_vpsVidSigIdx) );
     2145    m_vpsVidSigIdx[0]=0;
     2146    for (Int i=0; i < 16; i++)
     2147    {
     2148      m_vpsVidFormat[i] = 5;
     2149      m_vpsFullRangeFlag[i] = false;
     2150      m_vpsColorPrimaries[i] = 2;
     2151      m_vpsTransChar[i] = 2;
     2152      m_vpsMatCoeff[i] = 2;
     2153    }
    20522154#endif
    20532155#if VPS_VUI_BITRATE_PICRATE 
     
    20642166#if VIEW_ID_RELATED_SIGNALING
    20652167  ::memset(m_viewIdVal, 0, sizeof(m_viewIdVal));
     2168#endif
     2169#if O0092_0094_DEPENDENCY_CONSTRAINT
     2170  for (Int i = 0; i < MAX_NUM_LAYER_IDS; i++)
     2171  {
     2172    m_numberRefLayers[i] = 0;
     2173    for (Int j = 0; j < MAX_NUM_LAYER_IDS; j++)
     2174    {
     2175      m_recursiveRefLayerFlag[i][j] = 0;
     2176    }
     2177  }
     2178#endif
     2179#if VPS_DPB_SIZE_TABLE
     2180  ::memset( m_subLayerFlagInfoPresentFlag,  0, sizeof(m_subLayerFlagInfoPresentFlag ) );
     2181  ::memset( m_subLayerDpbInfoPresentFlag,   0, sizeof(m_subLayerDpbInfoPresentFlag )  );
     2182  ::memset( m_maxVpsDecPicBufferingMinus1,  0, sizeof(m_maxVpsDecPicBufferingMinus1 ) );
     2183  ::memset( m_maxVpsNumReorderPics,         0, sizeof(m_maxVpsNumReorderPics )        );
     2184  ::memset( m_maxVpsLatencyIncreasePlus1,   0, sizeof(m_maxVpsLatencyIncreasePlus1 )  );
     2185  ::memset( m_numSubDpbs                ,   0, sizeof(m_numSubDpbs)                   );
    20662186#endif
    20672187}
     
    21172237}
    21182238#endif
    2119 
    2120 #if IL_SL_SIGNALLING_N0371
    2121 Bool TComVPS::checkLayerDependency(UInt i, UInt j)
    2122 {
    2123   if( this->getDirectDependencyFlag(i, j) == true )
    2124   {                                                                                                                                   
    2125     return true;                                                                                                                       
    2126   }                                                                                                                                   
    2127   else                                                                                                                                   
    2128   {                                                                                                                                   
    2129     for(UInt k=i-1; k>j; k--)
    2130     {                                                                                                                               
    2131       if( this->getDirectDependencyFlag(i, k) == true )
    2132       {                                                                                                                           
    2133         checkLayerDependency( k,j );                                                                                           
    2134       }
    2135     }
    2136   }
    2137   return false;       
     2239#if VPS_DPB_SIZE_TABLE
     2240Void TComVPS::deriveNumberOfSubDpbs()
     2241{
     2242  // Derive number of sub-DPBs
     2243  // For output layer set 0
     2244  setNumSubDpbs(0, 1);
     2245  // For other output layer sets
     2246  for( Int i = 1; i < getNumOutputLayerSets(); i++)
     2247  {
     2248    setNumSubDpbs( i, getNumLayersInIdList( getOutputLayerSetIdx(i)) );
     2249  }
     2250}
     2251#endif
     2252#if VPS_VUI_TILES_NOT_IN_USE__FLAG
     2253Void TComVPS::setTilesNotInUseFlag(Bool x)
     2254{
     2255  m_tilesNotInUseFlag = x;
     2256  if (m_tilesNotInUseFlag)
     2257  {
     2258    for (int i = 0; i < getMaxLayers(); i++)
     2259    {
     2260      m_tilesInUseFlag[i] = m_loopFilterNotAcrossTilesFlag[i] = m_tilesNotInUseFlag;
     2261    }
     2262  }
     2263#if TILE_BOUNDARY_ALIGNED_FLAG 
     2264  if (m_tilesNotInUseFlag)
     2265  {
     2266    for (int i = 1; i < getMaxLayers(); i++)
     2267    {
     2268      for(int j = 0; j < getNumDirectRefLayers(getLayerIdInNuh(i)); j++)
     2269      {
     2270        setTileBoundariesAlignedFlag(i, j, m_tilesNotInUseFlag);
     2271      }
     2272    }
     2273  }
     2274#endif
     2275}
     2276#endif
     2277#if VPS_VUI_WPP_NOT_IN_USE__FLAG
     2278Void TComVPS::setWppNotInUseFlag(Bool x)
     2279{
     2280  m_wppNotInUseFlag = x;
     2281  if (m_wppNotInUseFlag)
     2282  {
     2283    for (int i = 0; i < getMaxLayers(); i++)
     2284    {
     2285      m_wppInUseFlag[i] = m_wppNotInUseFlag;
     2286    }
     2287  }
     2288}
     2289#endif
     2290#if O0092_0094_DEPENDENCY_CONSTRAINT
     2291Void TComVPS::setRefLayersFlags(Int currLayerId)
     2292{
     2293  for (Int i = 0; i < getNumDirectRefLayers(currLayerId); i++)
     2294  {
     2295    UInt refLayerId = getRefLayerId(currLayerId, i);
     2296    setRecursiveRefLayerFlag(currLayerId, refLayerId, true);
     2297    for (Int k = 0; k < MAX_NUM_LAYER_IDS; k++)
     2298    {
     2299      setRecursiveRefLayerFlag(currLayerId, k, (getRecursiveRefLayerFlag(currLayerId, k) | getRecursiveRefLayerFlag(refLayerId, k)));
     2300    }
     2301  }
     2302}
     2303
     2304Void TComVPS::setNumRefLayers(Int currLayerId)
     2305{
     2306  for (Int i = 0; i <= getMaxLayers(); i++)
     2307  {
     2308    UInt iNuhLId = getLayerIdInNuh(i);
     2309    setRefLayersFlags(iNuhLId);
     2310    for (UInt j = 0; j < MAX_NUM_LAYER_IDS; j++)
     2311    {
     2312      m_numberRefLayers[iNuhLId] += (getRecursiveRefLayerFlag(iNuhLId, j) == true ? 1 : 0);
     2313    }
     2314  }
    21382315}
    21392316#endif
     
    22242401#if REPN_FORMAT_IN_VPS
    22252402, m_updateRepFormatFlag       (false)
     2403#if O0096_REP_FORMAT_INDEX
     2404, m_updateRepFormatIndex      (0)
     2405#endif
     2406#endif
     2407#if SCALINGLIST_INFERRING
     2408, m_inferScalingListFlag ( false )
     2409, m_scalingListRefLayerId ( 0 )
    22262410#endif
    22272411#endif //SVC_EXTENSION
     
    22482432TComSPS::~TComSPS()
    22492433{
     2434#if SCALINGLIST_INFERRING
     2435  if( !m_inferScalingListFlag )
     2436#endif
    22502437  delete m_scalingList;
    22512438  m_RPSList.destroy();
     
    23732560const Int TComSPS::m_winUnitX[]={1,2,2,1};
    23742561const Int TComSPS::m_winUnitY[]={1,2,1,1};
     2562
     2563#if O0098_SCALED_REF_LAYER_ID
     2564Window& TComSPS::getScaledRefLayerWindowForLayer(Int layerId)
     2565{
     2566  static Window win;
     2567
     2568  for (Int i = 0; i < m_numScaledRefLayerOffsets; i++)
     2569  {
     2570    if (layerId == m_scaledRefLayerId[i])
     2571    {
     2572      return m_scaledRefLayerWindow[i];
     2573    }
     2574  }
     2575
     2576  win.resetWindow();  // scaled reference layer offsets are inferred to be zero when not present
     2577  return win;
     2578}
     2579#endif
    23752580
    23762581TComPPS::TComPPS()
     
    24072612, m_listsModificationPresentFlag(  0)
    24082613, m_numExtraSliceHeaderBits(0)
     2614#if SCALINGLIST_INFERRING
     2615, m_inferScalingListFlag ( false )
     2616, m_scalingListRefLayerId ( 0 )
     2617#endif
    24092618{
    24102619  m_scalingList = new TComScalingList;
     
    24232632    m_puiRowHeight = NULL;
    24242633  }
     2634
     2635#if SCALINGLIST_INFERRING
     2636  if( !m_inferScalingListFlag )
     2637#endif
    24252638  delete m_scalingList;
    24262639}
     
    26402853/** set default quantization matrix to array
    26412854*/
    2642 #if IL_SL_SIGNALLING_N0371
    2643 Void TComSlice::setDefaultScalingList( UInt layerId )
    2644 #else
    26452855Void TComSlice::setDefaultScalingList()
    2646 #endif
    26472856{
    26482857  for(UInt sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++)
     
    26502859    for(UInt listId=0;listId<g_scalingListNum[sizeId];listId++)
    26512860    {
    2652 #if IL_SL_SIGNALLING_N0371
    2653       getScalingList()->processDefaultMarix(sizeId, listId, layerId);
    2654 #else
    2655       getScalingList()->processDefaultMarix(sizeId, listId);
    2656 #endif
     2861      getScalingList()->processDefaultMatrix(sizeId, listId);
    26572862    }
    26582863  }
     
    28293034 * \param Index of input matrix
    28303035 */
    2831 #if IL_SL_SIGNALLING_N0371
    2832 Void TComScalingList::processDefaultMarix(UInt sizeId, UInt listId, UInt layerId)
    2833 #else
    2834 Void TComScalingList::processDefaultMarix(UInt sizeId, UInt listId)
    2835 #endif
    2836 {
    2837 #if IL_SL_SIGNALLING_N0371
    2838   Int i,coefNum = min(MAX_MATRIX_COEF_NUM,(Int)g_scalingListSize[sizeId]);
    2839   UInt* scan  = (sizeId == 0) ? g_auiSigLastScan [ SCAN_DIAG ] [ 1 ] :  g_sigLastScanCG32x32;
    2840   Int *src = getScalingListDefaultAddress(sizeId, listId);   
    2841 #endif
    2842 
     3036Void TComScalingList::processDefaultMatrix(UInt sizeId, UInt listId)
     3037{
    28433038  ::memcpy(getScalingListAddress(sizeId, listId),getScalingListDefaultAddress(sizeId,listId),sizeof(Int)*min(MAX_MATRIX_COEF_NUM,(Int)g_scalingListSize[sizeId]));
    2844 
    2845 #if IL_SL_SIGNALLING_N0371
    2846   for(i = 0; i < coefNum; i++)
    2847   {
    2848     ref_scalingListCoef[layerId][sizeId][listId][i] = src[scan[i]];
    2849   }
    2850 #endif
    2851 
    28523039  setScalingListDC(sizeId,listId,SCALING_LIST_DC);
    2853 #if IL_SL_SIGNALLING_N0371
    2854   ref_scalingListDC[layerId][sizeId][listId] = SCALING_LIST_DC;
    2855 #endif
    28563040}
    28573041
    28583042/** check DC value of matrix for default matrix signaling
    28593043 */
    2860 #if IL_SL_SIGNALLING_N0371
    2861 Void TComScalingList::checkDcOfMatrix( UInt layerId )
    2862 #else
    28633044Void TComScalingList::checkDcOfMatrix()
    2864 #endif
    28653045{
    28663046  for(UInt sizeId = 0; sizeId < SCALING_LIST_SIZE_NUM; sizeId++)
     
    28713051      if(getScalingListDC(sizeId,listId) == 0)
    28723052      {
    2873 #if IL_SL_SIGNALLING_N0371
    2874         processDefaultMarix(sizeId, listId, layerId);
    2875 #else
    2876         processDefaultMarix(sizeId, listId);
    2877 #endif
     3053        processDefaultMatrix(sizeId, listId);
    28783054      }
    28793055    }
     
    29563132        m_activeVPSId = vpsId;
    29573133        m_activeSPSId = spsId;
    2958 
    2959 #if IL_SL_SIGNALLING_N0371
    2960         activeRefPPSId[ sps->getLayerId() ] = ppsId;
    2961         activeRefSPSId[ sps->getLayerId() ] = spsId;
    2962 #endif
    29633134
    29643135        return true;
     
    30683239#endif
    30693240
    3070 Void TComSlice::setBaseColPic(  TComList<TComPic*>& rcListPic, UInt refLayerIdc )
     3241Bool TComSlice::setBaseColPic(  TComList<TComPic*>& rcListPic, UInt refLayerIdc )
    30713242
    30723243  if(m_layerId == 0)
    30733244  {
    30743245    memset( m_pcBaseColPic, 0, sizeof( m_pcBaseColPic ) );
    3075     return;
     3246    return false;
    30763247  }       
    30773248#if POC_RESET_FLAG
    3078   if( this->getPocResetFlag() )
    3079   {
    3080     setBaseColPic(refLayerIdc, xGetRefPic(rcListPic, 0));
     3249  TComPic* pic = xGetRefPic( rcListPic, m_bPocResetFlag ? 0 : m_iPOC );
     3250
     3251  if( pic )
     3252  {
     3253    setBaseColPic(refLayerIdc, pic );
    30813254  }
    30823255  else
    30833256  {
    3084     setBaseColPic(refLayerIdc, xGetRefPic(rcListPic, getPOC()));
    3085   }
     3257    return false;
     3258  }
     3259 
     3260  return true;
    30863261#else
    30873262  setBaseColPic(refLayerIdc, xGetRefPic(rcListPic, getPOC()));
  • trunk/source/Lib/TLibCommon/TComSlice.h

    r494 r540  
    156156  Void     setScalingListPresentFlag    (Bool b)                               { m_scalingListPresentFlag = b;    }
    157157  Bool     getScalingListPresentFlag    ()                                     { return m_scalingListPresentFlag; }
    158 
    159 #if IL_SL_SIGNALLING_N0371
    160   UInt     m_layerId;
    161 
    162   Void     setPredScalingListFlag    (Bool b)                               { m_predScalingListFlag = b;    }
    163   Bool     getPredScalingListFlag    ()                                     { return m_predScalingListFlag; }
    164   Void     setScalingListRefLayerId  (UInt b)                               { m_scalingListRefLayerId = b;  }
    165   UInt     getScalingListRefLayerId  ()                                     { return m_scalingListRefLayerId; }
    166 #endif
    167 
    168158  Int*     getScalingListAddress          (UInt sizeId, UInt listId)           { return m_scalingListCoef[sizeId][listId]; } //!< get matrix coefficient
    169159  Bool     checkPredMode                  (UInt sizeId, UInt listId);
     
    171161  UInt     getRefMatrixId                 (UInt sizeId, UInt listId)           { return m_refMatrixId[sizeId][listId]; }     //!< get reference matrix ID
    172162  Int*     getScalingListDefaultAddress   (UInt sizeId, UInt listId);                                                        //!< get default matrix coefficient
    173 
    174 #if IL_SL_SIGNALLING_N0371
    175   Void     processDefaultMarix            (UInt sizeId, UInt listId, UInt layerId );
    176 #else
    177   Void     processDefaultMarix            (UInt sizeId, UInt listId);
    178 #endif
    179 
     163  Void     processDefaultMatrix            (UInt sizeId, UInt listId);
    180164  Void     setScalingListDC               (UInt sizeId, UInt listId, UInt u)   { m_scalingListDC[sizeId][listId] = u; }      //!< set DC value
    181165
    182166  Int      getScalingListDC               (UInt sizeId, UInt listId)           { return m_scalingListDC[sizeId][listId]; }   //!< get DC value
    183 
    184 #if IL_SL_SIGNALLING_N0371
    185   Void     setLayerId(UInt layerId) { m_layerId = layerId; }
    186   UInt     getLayerId() { return m_layerId; }
    187   Void     checkDcOfMatrix                ( UInt m_layerId );
    188 #else
    189167  Void     checkDcOfMatrix                ();
    190 #endif
    191 
    192168  Void     processRefMatrix               (UInt sizeId, UInt listId , UInt refListId );
    193169  Bool     xParseScalingList              (Char* pchFile);
     
    200176  UInt     m_refMatrixId                 [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< RefMatrixID
    201177  Bool     m_scalingListPresentFlag;                                                //!< flag for using default matrix
    202 
    203 #if IL_SL_SIGNALLING_N0371
    204   Bool     m_predScalingListFlag;                                                   //!< flag for inter-layer scaling-list prediction
    205   UInt     m_scalingListRefLayerId;                                                 //!< scaling_list_ref_layer_id 
    206 #endif
    207 
    208178  UInt     m_predMatrixId                [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< reference list index
    209179  Int      *m_scalingListCoef            [SCALING_LIST_SIZE_NUM][SCALING_LIST_NUM]; //!< quantization matrix                                           
     
    436406class RepFormat
    437407{
     408#if REPN_FORMAT_CONTROL_FLAG
     409  Bool m_chromaAndBitDepthVpsPresentFlag;
     410#endif
    438411#if AUXILIARY_PICTURES
    439412  ChromaFormat m_chromaFormatVpsIdc;
     
    449422public:
    450423  RepFormat();
     424
     425#if REPN_FORMAT_CONTROL_FLAG
     426  Bool getChromaAndBitDepthVpsPresentFlag() { return m_chromaAndBitDepthVpsPresentFlag; }
     427  void setChromaAndBitDepthVpsPresentFlag(Bool x) { m_chromaAndBitDepthVpsPresentFlag = x; }
     428#endif
    451429
    452430#if AUXILIARY_PICTURES
     
    504482  Int         m_layerSetLayerIdList[MAX_VPS_LAYER_SETS_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
    505483  Int         m_numLayerInIdList[MAX_VPS_LAYER_SETS_PLUS1];
    506 #endif
    507 #if IL_SL_SIGNALLING_N0371
    508   Bool        m_scalingListLayerDependency[MAX_LAYERS][MAX_LAYERS];  // layer dependency for scaling list
    509484#endif
    510485#if VPS_EXTN_OFFSET
     
    555530#if M0457_PREDICTION_INDICATIONS
    556531  UInt       m_directDepTypeLen;
     532#if O0096_DEFAULT_DEPENDENCY_TYPE
     533  Bool       m_defaultDirectDependencyTypeFlag;
     534  UInt       m_defaultDirectDependencyType;
     535#endif
    557536  UInt       m_directDependencyType[MAX_VPS_LAYER_ID_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
    558537#endif
     
    569548  Bool       m_pocLsbNotPresentFlag[MAX_VPS_LAYER_ID_PLUS1];
    570549#endif
     550#if O0223_PICTURE_TYPES_ALIGN_FLAG
     551  Bool       m_crossLayerPictureTypeAlignFlag;
     552#endif
    571553#if N0147_IRAP_ALIGN_FLAG
    572554  Bool       m_crossLayerIrapAlignFlag;
     
    582564  Bool       m_maxTidRefPresentFlag;
    583565#endif
     566#if VPS_TSLAYERS
     567  Bool       m_maxTSLayersPresentFlag;
     568  UInt       m_maxTSLayerMinus1[MAX_VPS_LAYER_ID_PLUS1 - 1];
     569#endif
    584570#if M0040_ADAPTIVE_RESOLUTION_CHANGE
    585571  Bool       m_singleLayerForNonIrapFlag;
    586572#endif
     573#if HIGHER_LAYER_IRAP_SKIP_FLAG
     574  Bool       m_higherLayerIrapSkipFlag;
     575#endif
     576#if VPS_VUI_TILES_NOT_IN_USE__FLAG
     577  Bool       m_tilesNotInUseFlag;
     578  Bool       m_tilesInUseFlag[MAX_VPS_LAYER_ID_PLUS1];
     579  Bool       m_loopFilterNotAcrossTilesFlag[MAX_VPS_LAYER_ID_PLUS1];
     580#endif
    587581#if TILE_BOUNDARY_ALIGNED_FLAG
    588582  Bool       m_tileBoundariesAlignedFlag[MAX_VPS_LAYER_ID_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     583#endif
     584#if VPS_VUI_WPP_NOT_IN_USE__FLAG
     585  Bool       m_wppNotInUseFlag;
     586  Bool       m_wppInUseFlag[MAX_VPS_LAYER_ID_PLUS1];
    589587#endif
    590588#if N0160_VUI_EXT_ILP_REF   
     
    593591  Bool        m_ctuBasedOffsetEnabledFlag   [MAX_VPS_LAYER_ID_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
    594592  Int         m_minHorizontalCtuOffsetPlus1 [MAX_VPS_LAYER_ID_PLUS1][MAX_VPS_LAYER_ID_PLUS1];
     593#endif
     594#if VPS_VUI_VIDEO_SIGNAL
     595    Bool        m_vidSigPresentVpsFlag;
     596    Int         m_vpsVidSigInfo;
     597    Int         m_vpsVidSigIdx[MAX_VPS_LAYER_ID_PLUS1];
     598    Int         m_vpsVidFormat[16];
     599    Bool        m_vpsFullRangeFlag[16];
     600    Int         m_vpsColorPrimaries[16];
     601    Int         m_vpsTransChar[16];
     602    Int         m_vpsMatCoeff[16];
    595603#endif
    596604#if VPS_VUI_BITRATE_PICRATE
     
    604612  Int         m_avgPicRate          [MAX_VPS_LAYER_SETS_PLUS1][MAX_TLAYER];
    605613#endif
     614#if O0153_ALT_OUTPUT_LAYER_FLAG
     615  Bool       m_altOutputLayerFlag;
     616#endif
    606617#if REPN_FORMAT_IN_VPS
    607618  Bool       m_repFormatIdxPresentFlag;
     
    617628#if O0215_PHASE_ALIGNMENT
    618629  Bool       m_phaseAlignFlag;
     630#endif
     631
     632#if O0092_0094_DEPENDENCY_CONSTRAINT
     633  Int        m_numberRefLayers[MAX_NUM_LAYER_IDS];  // number of direct and indirect reference layers of a coding layer
     634  Bool       m_recursiveRefLayerFlag[MAX_NUM_LAYER_IDS][MAX_NUM_LAYER_IDS];  // flag to indicate if j-th layer is a direct or indirect reference layer of i-th layer
     635#endif
     636#if VPS_DPB_SIZE_TABLE
     637  Bool    m_subLayerFlagInfoPresentFlag [MAX_VPS_OP_LAYER_SETS_PLUS1];
     638  Bool    m_subLayerDpbInfoPresentFlag  [MAX_VPS_OP_LAYER_SETS_PLUS1][MAX_LAYERS];
     639  Int     m_maxVpsDecPicBufferingMinus1 [MAX_VPS_OP_LAYER_SETS_PLUS1][MAX_LAYERS][MAX_TLAYER];
     640  Int     m_maxVpsNumReorderPics        [MAX_VPS_OP_LAYER_SETS_PLUS1][MAX_LAYERS];
     641  Int     m_maxVpsLatencyIncreasePlus1  [MAX_VPS_OP_LAYER_SETS_PLUS1][MAX_LAYERS];
     642  Int     m_numSubDpbs                  [MAX_VPS_OP_LAYER_SETS_PLUS1];
    619643#endif
    620644#endif //SVC_EXTENSION
     
    683707  Void    deriveLayerIdListVariables();
    684708#endif
    685 
    686 #if IL_SL_SIGNALLING_N0371
    687   Bool    checkLayerDependency(UInt i, UInt j);
    688   Bool    getScalingListLayerDependency  ( UInt layerId, UInt refLayerId )            { return m_scalingListLayerDependency[layerId][refLayerId]; }
    689   Void    setScalingListLayerDependency  ( UInt layerId, UInt refLayerId, Bool val  ) { m_scalingListLayerDependency[layerId][refLayerId] = val;  }
    690 #endif
    691 
     709#if VPS_DPB_SIZE_TABLE
     710Void      deriveNumberOfSubDpbs();
     711#endif
     712
     713#if O0092_0094_DEPENDENCY_CONSTRAINT
     714  Void    setRefLayersFlags(Int currLayerId);
     715  Bool    getRecursiveRefLayerFlag(Int currLayerId, Int refLayerId)              { return m_recursiveRefLayerFlag[currLayerId][refLayerId];}
     716  Void    setRecursiveRefLayerFlag(Int currLayerId, Int refLayerId, Bool x)      { m_recursiveRefLayerFlag[currLayerId][refLayerId] = x;   }
     717  Int     getNumRefLayers(Int currLayerId)                                       { return m_numberRefLayers[currLayerId];                  }
     718  Void    setNumRefLayers(Int currLayerId);
     719#endif
    692720#if VPS_RENAME
    693721  UInt    getMaxLayerId()                                       { return m_maxLayerId; }
     
    764792  UInt   getDirectDepTypeLen()                                                  { return m_directDepTypeLen;                              }
    765793  Void   setDirectDepTypeLen(UInt x)                                            { m_directDepTypeLen = x;                                 }
    766 
     794#if O0096_DEFAULT_DEPENDENCY_TYPE
     795  Bool   getDefaultDirectDependencyTypeFlag()                                   { return m_defaultDirectDependencyTypeFlag;               }
     796  Void   setDefaultDirectDependecyTypeFlag(Bool x)                              { m_defaultDirectDependencyTypeFlag = x;                  }
     797  UInt   getDefaultDirectDependencyType()                                       { return m_defaultDirectDependencyType;                   }
     798  Void   setDefaultDirectDependecyType(UInt x)                                  { m_defaultDirectDependencyType = x;                      }
     799#endif
    767800  UInt   getDirectDependencyType(Int currLayerId, Int refLayerId)               { return m_directDependencyType[currLayerId][refLayerId]; }
    768801  Void   setDirectDependencyType(Int currLayerId, Int refLayerId, UInt x)       { m_directDependencyType[currLayerId][refLayerId] = x;    }
     
    791824  Void   setPocLsbNotPresentFlag(Int i, Bool x)                                 { m_pocLsbNotPresentFlag[i] = x;    }
    792825#endif
     826#if O0223_PICTURE_TYPES_ALIGN_FLAG
     827  Bool   getCrossLayerPictureTypeAlignFlag()                                    { return m_crossLayerPictureTypeAlignFlag;                      }
     828  Void   setCrossLayerPictureTypeAlignFlag(Bool x)                              { m_crossLayerPictureTypeAlignFlag = x;                         }
     829#endif
    793830#if N0147_IRAP_ALIGN_FLAG
    794831  Bool   getCrossLayerIrapAlignFlag()                                           { return m_crossLayerIrapAlignFlag;                      }
     
    808845  Void   setMaxTidRefPresentFlag(Bool x)                            { m_maxTidRefPresentFlag = x;}
    809846#endif
     847#if VPS_TSLAYERS
     848    Bool   getMaxTSLayersPresentFlag()                                  { return m_maxTSLayersPresentFlag ;}
     849    Void   setMaxTSLayersPresentFlag(Bool x)                            { m_maxTSLayersPresentFlag = x;}
     850    UInt   getMaxTSLayersMinus1(Int layerId)                            { return m_maxTSLayerMinus1[layerId];}
     851    Void   setMaxTSLayersMinus1(Int layerId, UInt maxTSublayer)         { m_maxTSLayerMinus1[layerId] = maxTSublayer;}
     852#endif
    810853#if M0040_ADAPTIVE_RESOLUTION_CHANGE
    811854  Bool   getSingleLayerForNonIrapFlag()                             { return m_singleLayerForNonIrapFlag; }
    812855  Void   setSingleLayerForNonIrapFlag(Bool x)                       { m_singleLayerForNonIrapFlag = x;    }
    813856#endif
     857#if HIGHER_LAYER_IRAP_SKIP_FLAG
     858  Bool   getHigherLayerIrapSkipFlag()                             { return m_higherLayerIrapSkipFlag; }
     859  Void   setHigherLayerIrapSkipFlag(Bool x)                       { m_higherLayerIrapSkipFlag = x;    }
     860#endif
     861#if VPS_VUI_TILES_NOT_IN_USE__FLAG 
     862  Bool   getTilesNotInUseFlag()         { return m_tilesNotInUseFlag; }
     863  Void   setTilesNotInUseFlag(Bool x);
     864  Bool   getTilesInUseFlag(Int currLayerId)    { return m_tilesInUseFlag[currLayerId]; }
     865  Void   setTilesInUseFlag(Int currLayerId, Bool x)    { m_tilesInUseFlag[currLayerId] = x; }
     866  Bool   getLoopFilterNotAcrossTilesFlag(Int currLayerId)    { return m_loopFilterNotAcrossTilesFlag[currLayerId]; }
     867  Void   setLoopFilterNotAcrossTilesFlag(Int currLayerId, Bool x)    { m_loopFilterNotAcrossTilesFlag[currLayerId] = x; }
     868#endif
    814869#if TILE_BOUNDARY_ALIGNED_FLAG 
    815870  Bool   getTileBoundariesAlignedFlag(Int currLayerId, Int refLayerId)           { return m_tileBoundariesAlignedFlag[currLayerId][refLayerId]; }
    816871  Void   setTileBoundariesAlignedFlag(Int currLayerId, Int refLayerId, Bool x)   { m_tileBoundariesAlignedFlag[currLayerId][refLayerId] = x; }
    817872#endif
     873#if VPS_VUI_WPP_NOT_IN_USE__FLAG 
     874  Bool   getWppNotInUseFlag()         { return m_wppNotInUseFlag; }
     875  Void   setWppNotInUseFlag(Bool x);
     876  Bool   getWppInUseFlag(Int currLayerId)    { return m_wppInUseFlag[currLayerId]; }
     877  Void   setWppInUseFlag(Int currLayerId, Bool x)    { m_wppInUseFlag[currLayerId] = x; }
     878#endif
    818879#if N0160_VUI_EXT_ILP_REF 
    819880  Bool  getNumIlpRestrictedRefLayers   ( )                                         { return m_numIlpRestrictedRefLayers        ;}
     
    828889  Int  getMinHorizontalCtuOffsetPlus1 ( Int currLayerId, Int refLayerId )            { return m_minHorizontalCtuOffsetPlus1[currLayerId][refLayerId];}
    829890  Void setMinHorizontalCtuOffsetPlus1 ( Int currLayerId, Int refLayerId, Int val )   { m_minHorizontalCtuOffsetPlus1[currLayerId][refLayerId] = val;} 
     891#endif
     892#if VPS_VUI_VIDEO_SIGNAL
     893    Bool   getVideoSigPresentVpsFlag()           { return m_vidSigPresentVpsFlag; }
     894    Void   setVideoSigPresentVpsFlag(Bool x)     { m_vidSigPresentVpsFlag = x;    }
     895    Int    getNumVideoSignalInfo()               { return m_vpsVidSigInfo;        }
     896    Void   setNumVideoSignalInfo(Int x)          { m_vpsVidSigInfo = x;           }
     897    Int    getVideoSignalInfoIdx(Int idx)        { return m_vpsVidSigIdx[idx];    }
     898    Void   setVideoSignalInfoIdx(Int idx, Int x) { m_vpsVidSigIdx[idx] = x;       }
     899    Int    getVideoVPSFormat(Int idx)            { return m_vpsVidFormat[idx];    }
     900    Void   setVideoVPSFormat(Int idx, Int x)     { m_vpsVidFormat[idx] = x;       }
     901    Bool   getVideoFullRangeVpsFlag(Int idx)     { return m_vpsFullRangeFlag[idx];}
     902    Void   setVideoFullRangeVpsFlag(Int idx, Bool x) { m_vpsFullRangeFlag[idx] = x;   }
     903    Int    getColorPrimaries(Int idx)            { return m_vpsColorPrimaries[idx];   }
     904    Void   setColorPrimaries(Int idx, Int x)     { m_vpsColorPrimaries[idx] = x;      }
     905    Int    getTransCharacter(Int idx)            { return m_vpsTransChar[idx];    }
     906    Void   setTransCharacter(Int idx, Int x)     { m_vpsTransChar[idx] = x;       }
     907    Int    getMaxtrixCoeff(Int idx)              { return m_vpsMatCoeff[idx];     }
     908    Void   setMaxtrixCoeff(Int idx, Int x)       { m_vpsMatCoeff[idx] = x;        }
    830909#endif
    831910#if VPS_VUI_BITRATE_PICRATE
     
    850929  Void setAvgPicRate(Int i, Int j, Int x)   { m_avgPicRate[i][j] = x;    }
    851930#endif
    852 
     931#if O0153_ALT_OUTPUT_LAYER_FLAG
     932  Bool   getAltOuputLayerFlag()             { return m_altOutputLayerFlag; }
     933  Void   setAltOuputLayerFlag(Bool x)       { m_altOutputLayerFlag = x;    }
     934#endif
    853935#if REPN_FORMAT_IN_VPS
    854936  Bool   getRepFormatIdxPresentFlag()       { return m_repFormatIdxPresentFlag; }
     
    883965  Bool   getPhaseAlignFlag()                             { return m_phaseAlignFlag; }
    884966  Void   setPhaseAlignFlag(Bool x)                       { m_phaseAlignFlag = x;    }
     967#endif
     968#if VPS_DPB_SIZE_TABLE
     969  Bool    getSubLayerFlagInfoPresentFlag(Int i)         {return m_subLayerFlagInfoPresentFlag[i]; }
     970  Void    setSubLayerFlagInfoPresentFlag(Int i, Bool x) {m_subLayerFlagInfoPresentFlag[i] = x;    }
     971
     972  Bool    getSubLayerDpbInfoPresentFlag(Int i, Int j)         {return m_subLayerDpbInfoPresentFlag[i][j]; }
     973  Void    setSubLayerDpbInfoPresentFlag(Int i, Int j, Bool x) {m_subLayerDpbInfoPresentFlag[i][j] = x;    }
     974
     975  // For the 0-th output layer set, use the date from the active SPS for base layer.
     976  Int     getMaxVpsDecPicBufferingMinus1(Int i, Int k, Int j)         { assert(i != 0); return m_maxVpsDecPicBufferingMinus1[i][k][j]; }
     977  Void    setMaxVpsDecPicBufferingMinus1(Int i, Int k, Int j, Int x) { m_maxVpsDecPicBufferingMinus1[i][k][j] = x;    }
     978
     979  Int     getMaxVpsNumReorderPics(Int i, Int j)         { assert(i != 0); return m_maxVpsNumReorderPics[i][j]; }
     980  Void    setMaxVpsNumReorderPics(Int i, Int j, Int x) { m_maxVpsNumReorderPics[i][j] = x;    }
     981
     982  Int     getMaxVpsLatencyIncreasePlus1(Int i, Int j)         { assert(i != 0); return m_maxVpsLatencyIncreasePlus1[i][j]; }
     983  Void    setMaxVpsLatencyIncreasePlus1(Int i, Int j, Int x) { m_maxVpsLatencyIncreasePlus1[i][j] = x;    }
     984
     985  Int     getNumSubDpbs(Int i)                          { return m_numSubDpbs[i]; }
     986  Void    setNumSubDpbs(Int i, Int x)                   { m_numSubDpbs[i] = x;    }
    885987#endif
    886988#endif //SVC_EXTENSION
     
    11851287  UInt m_layerId;
    11861288
    1187 #if IL_SL_SIGNALLING_N0371
    1188   TComVPS*    m_pVPS;
    1189   static TComSPS* m_pcSPS[MAX_LAYERS];
    1190   Bool        m_predScalingListFlag;
    1191   UInt        m_scalingListRefLayerId;
    1192 #endif
    1193 
    11941289#if REF_IDX_MFM
    11951290#if !M0457_COL_PICTURE_SIGNALING
     
    11981293#endif
    11991294  UInt        m_numScaledRefLayerOffsets;
     1295#if O0098_SCALED_REF_LAYER_ID
     1296  UInt        m_scaledRefLayerId[MAX_LAYERS];
     1297#endif
    12001298  Window      m_scaledRefLayerWindow[MAX_LAYERS];
    12011299#if REPN_FORMAT_IN_VPS
    12021300  Bool m_updateRepFormatFlag;
     1301#if O0096_REP_FORMAT_INDEX
     1302  UInt m_updateRepFormatIndex;
     1303#endif
     1304#endif
     1305#if SCALINGLIST_INFERRING
     1306  Bool       m_inferScalingListFlag;
     1307  UInt       m_scalingListRefLayerId;
    12031308#endif
    12041309#endif //SVC_EXTENSION
     
    13221427  Void setScalingListPresentFlag( Bool b ) { m_scalingListPresentFlag  = b;       }
    13231428
    1324 #if IL_SL_SIGNALLING_N0371
    1325   Bool getPredScalingListFlag()         { return m_predScalingListFlag;     }
    1326   Void setPredScalingListFlag( Bool b ) { m_predScalingListFlag  = b;       }
    1327   UInt getScalingListRefLayerId()         { return m_scalingListRefLayerId;   }
    1328   Void setScalingListRefLayerId( UInt b ) { m_scalingListRefLayerId  = b;       }
    1329 
    1330   TComVPS*  getVPS()                      { return  m_pVPS; }
    1331   Void      setVPS( TComVPS* vps )        { m_pVPS = vps;   }
    1332   static   TComSPS* getSPS(UInt layerId)               { return m_pcSPS[layerId]; }
    1333   static   Void     setSPS(UInt layerId, TComSPS* sps) { m_pcSPS[layerId] = sps;  }
    1334 #endif
    1335 
     1429#if SCALINGLIST_INFERRING
     1430  Void setScalingList( TComScalingList *scalingList ) { m_scalingList = scalingList; }
     1431#else
    13361432  Void setScalingList      ( TComScalingList *scalingList);
     1433#endif
    13371434  TComScalingList* getScalingList ()       { return m_scalingList; }               //!< get ScalingList class pointer in SPS
    13381435
     
    13801477  UInt     getNumScaledRefLayerOffsets()  { return m_numScaledRefLayerOffsets; }
    13811478  Void     setNumScaledRefLayerOffsets(Int x)  { m_numScaledRefLayerOffsets = x; }
     1479#if O0098_SCALED_REF_LAYER_ID
     1480  UInt     getScaledRefLayerId(Int x)          { return m_scaledRefLayerId[x]; }
     1481  Void     setScaledRefLayerId(Int x, UInt id) { m_scaledRefLayerId[x] = id; }
     1482  Window&  getScaledRefLayerWindowForLayer( Int layerId );
     1483#endif
    13821484  Window&  getScaledRefLayerWindow( Int x )   { return m_scaledRefLayerWindow[x]; }
    13831485#if REPN_FORMAT_IN_VPS
    13841486  Bool     getUpdateRepFormatFlag()       { return m_updateRepFormatFlag; }
    13851487  Void     setUpdateRepFormatFlag(Bool x) { m_updateRepFormatFlag = x;    }
     1488#if O0096_REP_FORMAT_INDEX
     1489  Int      getUpdateRepFormatIndex()      { return m_updateRepFormatIndex; }
     1490  Void     setUpdateRepFormatIndex(UInt index)  { m_updateRepFormatIndex = index; }
     1491#endif
     1492#endif
     1493#if SCALINGLIST_INFERRING
     1494  Bool     getInferScalingListFlag()  { return m_inferScalingListFlag;  }
     1495  UInt     getScalingListRefLayerId() { return m_scalingListRefLayerId; }
     1496  Void     setInferScalingListFlag( Bool flag )     { m_inferScalingListFlag = flag;     }
     1497  Void     setScalingListRefLayerId( UInt layerId ) { m_scalingListRefLayerId = layerId; }
    13861498#endif
    13871499#endif //SVC_EXTENSION
     
    14681580  Int      m_deblockingFilterTcOffsetDiv2;      //< tc offset for deblocking filter
    14691581  Bool     m_scalingListPresentFlag;
    1470 
    1471 #if SVC_EXTENSION
    1472   UInt m_layerId;
    1473 
    1474 #if IL_SL_SIGNALLING_N0371
    1475   static TComPPS* m_pcPPS[MAX_LAYERS];
    1476   Bool     m_predScalingListFlag;
    1477   UInt     m_scalingListRefLayerId;
    1478 #endif
    1479 
    1480 #endif
    1481 
    14821582  TComScalingList*     m_scalingList;   //!< ScalingList class pointer
    1483 
    14841583  Bool m_listsModificationPresentFlag;
    14851584  UInt m_log2ParallelMergeLevelMinus2;
    14861585  Int m_numExtraSliceHeaderBits;
     1586
     1587#if SVC_EXTENSION
     1588#if SCALINGLIST_INFERRING
     1589  UInt     m_layerId;
     1590  Bool     m_inferScalingListFlag;
     1591  UInt     m_scalingListRefLayerId;
     1592#endif
     1593#endif
    14871594
    14881595public:
     
    15961703  Void     setScalingListPresentFlag( Bool b ) { m_scalingListPresentFlag  = b;       }
    15971704
    1598 #if IL_SL_SIGNALLING_N0371
    1599   Void     setLayerId(UInt layerId) { m_layerId = layerId; }
     1705#if SCALINGLIST_INFERRING
    16001706  UInt     getLayerId() { return m_layerId; }
    1601 
    1602   Bool     getPredScalingListFlag()         { return m_predScalingListFlag;     }
    1603   Void     setPredScalingListFlag( Bool b ) { m_predScalingListFlag  = b;      }
    1604   UInt     getScalingListRefLayerId()         { return m_scalingListRefLayerId;     }
    1605   Void     setScalingListRefLayerId( UInt b ) { m_scalingListRefLayerId  = b;      }
    1606 
    1607   static   TComPPS* getPPS(UInt layerId)               { return m_pcPPS[layerId]; }
    1608   static   Void     setPPS(UInt layerId, TComPPS* pps) { m_pcPPS[layerId] = pps;  }
    1609 #endif
    1610 
     1707  Void     setLayerId( UInt layerId ) { m_layerId = layerId;            }
     1708  Bool     getInferScalingListFlag()  { return m_inferScalingListFlag;  }
     1709  UInt     getScalingListRefLayerId() { return m_scalingListRefLayerId; }
     1710  Void     setInferScalingListFlag( Bool flag )     { m_inferScalingListFlag = flag;     }
     1711  Void     setScalingListRefLayerId( UInt layerId ) { m_scalingListRefLayerId = layerId; }
     1712#endif
     1713
     1714#if SCALINGLIST_INFERRING
     1715  Void     setScalingList( TComScalingList *scalingList ) { m_scalingList = scalingList; }
     1716#else
    16111717  Void     setScalingList      ( TComScalingList *scalingList);
     1718#endif
    16121719  TComScalingList* getScalingList ()          { return m_scalingList; }         //!< get ScalingList class pointer in PPS
    16131720  Bool getListsModificationPresentFlag ()          { return m_listsModificationPresentFlag; }
     
    17051812  UInt        m_maxNumMergeCand;
    17061813
    1707 #if SAO_CHROMA_LAMBDA
    1708   Double      m_dLambdaLuma;
    1709   Double      m_dLambdaChroma;
    1710 #else
    1711   Double      m_dLambda;
    1712 #endif
     1814  Double      m_lambdas[3];
    17131815
    17141816  Bool        m_abEqualRef  [2][MAX_NUM_REF][MAX_NUM_REF];
     
    17801882#endif 
    17811883  Bool        m_bDiscardableFlag;
     1884#if O0149_CROSS_LAYER_BLA_FLAG
     1885  Bool        m_bCrossLayerBLAFlag;
     1886#endif
    17821887#endif //SVC_EXTENSION
    17831888
     
    18191924  Int       getRPSidx          () { return m_iBDidx; }
    18201925  Int       getPrevTid0POC      ()                        { return  m_prevTid0POC;       }
     1926#if PREVTID0_POC_RESET
     1927    Void     adjustPrevTid0POC      (Int adj)             { m_prevTid0POC=m_prevTid0POC-adj; }
     1928#endif
    18211929  TComRefPicListModification* getRefPicListModification() { return &m_RefPicListModification; }
    18221930  Void      setLastIDR(Int iIDRPOC)                       { m_iLastIDR = iIDRPOC; }
     
    18661974  Bool      isIRAP              () const                        { return (getNalUnitType() >= 16) && (getNalUnitType() <= 23); } 
    18671975  Void      checkCRA(TComReferencePictureSet *pReferencePictureSet, Int& pocCRA, NalUnitType& associatedIRAPType, TComList<TComPic *>& rcListPic);
     1976#if NO_CLRAS_OUTPUT_FLAG
     1977  Void      decodingRefreshMarking(Int& pocCRA, Bool& bRefreshPending, TComList<TComPic*>& rcListPic, Bool noClrasOutputFlag);
     1978#else
    18681979  Void      decodingRefreshMarking(Int& pocCRA, Bool& bRefreshPending, TComList<TComPic*>& rcListPic);
     1980#endif
    18691981  Void      setSliceType        ( SliceType e )                 { m_eSliceType        = e;      }
    18701982  Void      setSliceQp          ( Int i )                       { m_iSliceQp          = i;      }
     
    18861998  Void      setDepth            ( Int iDepth )                  { m_iDepth            = iDepth; }
    18871999
    1888 #if FIX1071
    18892000#if SVC_EXTENSION
    18902001  Void      setRefPicList       ( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr = false, TComPic** ilpPic = NULL );
    18912002#else
    18922003  Void      setRefPicList       ( TComList<TComPic*>& rcListPic, Bool checkNumPocTotalCurr = false );
    1893 #endif
    1894 #else
    1895   Void      setRefPicList       ( TComList<TComPic*>& rcListPic );
    18962004#endif
    18972005  Void      setRefPOCList       ();
     
    19052013  Bool      isInterP        ()                          { return  m_eSliceType == P_SLICE;  }
    19062014 
    1907 #if SAO_CHROMA_LAMBDA 
    1908   Void      setLambda( Double d, Double e ) { m_dLambdaLuma = d; m_dLambdaChroma = e;}
    1909   Double    getLambdaLuma() { return m_dLambdaLuma;        }
    1910   Double    getLambdaChroma() { return m_dLambdaChroma;        }
    1911 #else
    1912   Void      setLambda( Double d ) { m_dLambda = d; }
    1913   Double    getLambda() { return m_dLambda;        }
    1914 #endif
     2015  Void      setLambdas ( const Double lambdas[3] ) { for (Int component = 0; component < 3; component++) m_lambdas[component] = lambdas[component]; }
     2016  const Double* getLambdas() const { return m_lambdas; }
    19152017 
    19162018  Void      initEqualRef();
     
    19392041  Bool isStepwiseTemporalLayerSwitchingPointCandidate( TComList<TComPic*>& rcListPic );
    19402042  Int       checkThatAllRefPicsAreAvailable( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool printErrors, Int pocRandomAccess = 0);
    1941 #if FIX1071
    19422043  Void      createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet, Bool isRAP);
    1943 #else
    1944   Void      createExplicitReferencePictureSetFromReference( TComList<TComPic*>& rcListPic, TComReferencePictureSet *pReferencePictureSet);
    1945 #endif
    19462044
    19472045  Void setMaxNumMergeCand               (UInt val )         { m_maxNumMergeCand = val;                    }
     
    20012099  Void  setScalingList              ( TComScalingList* scalingList ) { m_scalingList = scalingList; }
    20022100  TComScalingList*   getScalingList ()                               { return m_scalingList; }
    2003 
    2004 #if IL_SL_SIGNALLING_N0371
    2005   Void  setDefaultScalingList       ( UInt m_layerId );
    2006 #else
    20072101  Void  setDefaultScalingList       ();
    2008 #endif
    2009 
    20102102  Bool  checkDefaultScalingList     ();
    20112103  Void      setCabacInitFlag  ( Bool val ) { m_cabacInitFlag = val;      }  //!< set CABAC initial flag
     
    20222114
    20232115#if SVC_EXTENSION
    2024   Void      setBaseColPic       ( TComList<TComPic*>& rcListPic , UInt refLayerIdc );
     2116  Bool      setBaseColPic       ( TComList<TComPic*>& rcListPic , UInt refLayerIdc );
    20252117  Void      setBaseColPic       (UInt refLayerIdc, TComPic* p)     { m_pcBaseColPic[refLayerIdc] = p; }
    20262118  TComPic*  getBaseColPic       (UInt refLayerIdc)                { return m_pcBaseColPic[refLayerIdc]; }
     
    20992191  Bool      getDiscardableFlag  ()                           { return m_bDiscardableFlag;    }
    21002192  Void      setDiscardableFlag  (Bool b)                     { m_bDiscardableFlag = b;       }
     2193#if O0149_CROSS_LAYER_BLA_FLAG
     2194  Bool      getCrossLayerBLAFlag  ()                         { return m_bCrossLayerBLAFlag;  }
     2195  Void      setCrossLayerBLAFlag  (Bool b)                   { m_bCrossLayerBLAFlag = b;     }
     2196#endif
    21012197
    21022198#if RPL_INIT_N0316_N0082
  • trunk/source/Lib/TLibCommon/TComTrQuant.cpp

    r442 r540  
    5454  {
    5555    iNNZbeforePos0 = 0;
    56   d64CodedLevelandDist = 0;
    57   d64UncodedDist = 0;
    58   d64SigCost = 0;
    59   d64SigCost_0 = 0;
     56    d64CodedLevelandDist = 0;
     57    d64UncodedDist = 0;
     58    d64SigCost = 0;
     59    d64SigCost_0 = 0;
    6060  }
    6161#endif
     
    19441944              Int64 costUp   = rdFactor * ( - deltaU[uiBlkPos] ) + rateIncUp[uiBlkPos] ;
    19451945              Int64 costDown = rdFactor * (   deltaU[uiBlkPos] ) + rateIncDown[uiBlkPos]
    1946               -   ( abs(piDstCoeff[uiBlkPos])==1?((1<<15)+sigRateDelta[uiBlkPos]):0 );
     1946              -   ((abs(piDstCoeff[uiBlkPos]) == 1) ? sigRateDelta[uiBlkPos] : 0);
    19471947             
    19481948              if(lastCG==1 && lastNZPosInCG==n && abs(piDstCoeff[uiBlkPos])==1)
     
    21632163  {
    21642164    Double dErr         = Double( lLevelDouble  - ( uiAbsLevel << iQBits ) );
    2165     Double dCurrCost    = dErr * dErr * dTemp + xGetICRateCost( uiAbsLevel, ui16CtxNumOne, ui16CtxNumAbs, ui16AbsGoRice, c1Idx, c2Idx );
     2165    Double dCurrCost    = dErr * dErr * dTemp + xGetICost(xGetICRate( uiAbsLevel, ui16CtxNumOne, ui16CtxNumAbs, ui16AbsGoRice, c1Idx, c2Idx ));
    21662166    dCurrCost          += dCurrCostSig;
    21672167
     
    21842184 * \returns cost of given absolute transform level
    21852185 */
    2186 __inline Double TComTrQuant::xGetICRateCost  ( UInt                            uiAbsLevel,
     2186__inline Int TComTrQuant::xGetICRate  ( UInt                            uiAbsLevel,
    21872187                                               UShort                          ui16CtxNumOne,
    21882188                                               UShort                          ui16CtxNumAbs,
     
    21922192                                               ) const
    21932193{
    2194   Double iRate = xGetIEPRate();
     2194  Int iRate = Int(xGetIEPRate());
    21952195  UInt baseLevel  =  (c1Idx < C1FLAG_NUMBER)? (2 + (c2Idx < C2FLAG_NUMBER)) : 1;
    21962196
     
    22362236  else
    22372237  {
    2238     assert (0);
    2239   }
    2240   return xGetICost( iRate );
    2241 }
    2242 
    2243 __inline Int TComTrQuant::xGetICRate  ( UInt                            uiAbsLevel,
    2244                                        UShort                          ui16CtxNumOne,
    2245                                        UShort                          ui16CtxNumAbs,
    2246                                        UShort                          ui16AbsGoRice
    2247                                      , UInt                            c1Idx,
    2248                                        UInt                            c2Idx
    2249                                        ) const
    2250 {
    2251   Int iRate = 0;
    2252   UInt baseLevel  =  (c1Idx < C1FLAG_NUMBER)? (2 + (c2Idx < C2FLAG_NUMBER)) : 1;
    2253 
    2254   if ( uiAbsLevel >= baseLevel )
    2255   {
    2256     UInt uiSymbol     = uiAbsLevel - baseLevel;
    2257     UInt uiMaxVlc     = g_auiGoRiceRange[ ui16AbsGoRice ];
    2258     Bool bExpGolomb   = ( uiSymbol > uiMaxVlc );
    2259 
    2260     if( bExpGolomb )
    2261     {
    2262       uiAbsLevel  = uiSymbol - uiMaxVlc;
    2263       Int iEGS    = 1;  for( UInt uiMax = 2; uiAbsLevel >= uiMax; uiMax <<= 1, iEGS += 2 );
    2264       iRate      += iEGS << 15;
    2265       uiSymbol    = min<UInt>( uiSymbol, ( uiMaxVlc + 1 ) );
    2266     }
    2267 
    2268     UShort ui16PrefLen = UShort( uiSymbol >> ui16AbsGoRice ) + 1;
    2269     UShort ui16NumBins = min<UInt>( ui16PrefLen, g_auiGoRicePrefixLen[ ui16AbsGoRice ] ) + ui16AbsGoRice;
    2270 
    2271     iRate += ui16NumBins << 15;
    2272 
    2273     if (c1Idx < C1FLAG_NUMBER)
    2274     {
    2275       iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 1 ];
    2276 
    2277       if (c2Idx < C2FLAG_NUMBER)
    2278       {
    2279         iRate += m_pcEstBitsSbac->m_levelAbsBits[ ui16CtxNumAbs ][ 1 ];
    2280       }
    2281     }
    2282   }
    2283   else
    2284   if( uiAbsLevel == 0 )
    2285   {
    2286     return 0;
    2287   }
    2288   else if( uiAbsLevel == 1 )
    2289   {
    2290     iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 0 ];
    2291   }
    2292   else if( uiAbsLevel == 2 )
    2293   {
    2294     iRate += m_pcEstBitsSbac->m_greaterOneBits[ ui16CtxNumOne ][ 1 ];
    2295     iRate += m_pcEstBitsSbac->m_levelAbsBits[ ui16CtxNumAbs ][ 0 ];
    2296   }
    2297   else
    2298   {
    2299     assert(0);
     2238    iRate = 0;
    23002239  }
    23012240  return iRate;
     
    24942433/** set flat matrix value to quantized coefficient
    24952434 */
    2496 #if IL_SL_SIGNALLING_N0371
    2497 Void TComTrQuant::setFlatScalingList( UInt m_layerId )
    2498 #else
    24992435Void TComTrQuant::setFlatScalingList()
    2500 #endif
    25012436{
    25022437  UInt size,list;
     
    25072442    for(list = 0; list <  g_scalingListNum[size]; list++)
    25082443    {
    2509 #if IL_SL_SIGNALLING_N0371
    2510       ref_scalingListDC[m_layerId][size][list] = SCALING_LIST_DC;
    2511       for(UInt i=0; i<MAX_MATRIX_COEF_NUM; i++)
    2512       {
    2513         ref_scalingListCoef[m_layerId][size][list][i] = SCALING_LIST_DC;
    2514       }
    2515 #endif
    2516 
    25172444      for(qp=0;qp<SCALING_LIST_REM_NUM;qp++)
    25182445      {
  • trunk/source/Lib/TLibCommon/TComTrQuant.h

    r442 r540  
    150150
    151151#if RDOQ_CHROMA_LAMBDA
    152   Void setLambda(Double dLambdaLuma, Double dLambdaChroma) { m_dLambdaLuma = dLambdaLuma; m_dLambdaChroma = dLambdaChroma; }
    153   Void selectLambda(TextType eTType) { m_dLambda = (eTType == TEXT_LUMA) ? m_dLambdaLuma : m_dLambdaChroma; }
     152  Void setLambdas ( const Double lambdas[3] ) { for (Int component = 0; component < 3; component++) m_lambdas[component] = lambdas[component]; }
     153  Void selectLambda(TextType eTType) { m_dLambda = (eTType == TEXT_LUMA) ? m_lambdas[0] : ((eTType == TEXT_CHROMA_U) ? m_lambdas[1] : m_lambdas[2]); }
    154154#else
    155155  Void setLambda(Double dLambda) { m_dLambda = dLambda;}
     
    181181  Void setUseScalingList   ( Bool bUseScalingList){ m_scalingListEnabledFlag = bUseScalingList; };
    182182  Bool getUseScalingList   (){ return m_scalingListEnabledFlag; };
    183 
    184 #if IL_SL_SIGNALLING_N0371
    185   Void setFlatScalingList  ( UInt m_layerId );
    186 #else
    187183  Void setFlatScalingList  ();
    188 #endif
    189 
    190184  Void xsetFlatScalingList ( UInt list, UInt size, UInt qp);
    191185  Void xSetScalingListEnc  ( TComScalingList *scalingList, UInt list, UInt size, UInt qp);
     
    213207  QpParam  m_cQP;
    214208#if RDOQ_CHROMA_LAMBDA
    215   Double   m_dLambdaLuma;
    216   Double   m_dLambdaChroma;
     209  Double   m_lambdas[3];
    217210#endif
    218211  Double   m_dLambda;
     
    279272                                             Double                          dTemp,
    280273                                             Bool                            bLast        ) const;
    281   __inline Double xGetICRateCost   ( UInt                            uiAbsLevel,
    282                                      UShort                          ui16CtxNumOne,
    283                                      UShort                          ui16CtxNumAbs,
    284                                      UShort                          ui16AbsGoRice
    285                                    , UInt                            c1Idx,
    286                                      UInt                            c2Idx
    287                                      ) const;
    288274__inline Int xGetICRate  ( UInt                            uiAbsLevel,
    289275                           UShort                          ui16CtxNumOne,
  • trunk/source/Lib/TLibCommon/TypeDef.h

    r494 r540  
    5151#define O0194_JOINT_US_BITSHIFT          1      ///< JCTVC-O0194: Joint Upsampling and bit-shift
    5252#endif
    53 #define O0194_WEIGHTED_PREDICTION_CGS    1      ///< JCTVC-O0194: Weighted prediciton for color gamut scalability
     53#define O0194_WEIGHTED_PREDICTION_CGS    0      ///< JCTVC-O0194: Weighted prediciton for color gamut scalability
    5454#define MFM_ENCCONSTRAINT                1      ///< JCTVC-O0216: Encoder constraint for motion field mapping
    5555#define VPS_NUH_LAYER_ID                 1      ///< JCTVC-N0085: Assert that the nuh_layer_id of VPS NAL unit should be 0
     
    5757#define ALIGN_TSA_STSA_PICS              1      ///< JCTVC-N0084: Alignment of TSA and STSA pictures across AU.
    5858#define REPN_FORMAT_IN_VPS               1      ///< JCTVC-N0092: Signal represenation format (spatial resolution, bit depth, colour format) in the VPS
     59#if REPN_FORMAT_IN_VPS
     60#define REPN_FORMAT_CONTROL_FLAG         1      ///< JCTVC-O0179: Add control flag in representation format to control sending of chroma and bitdepth parameters
     61#endif
    5962#define TIMING_INFO_NONZERO_LAYERID_SPS  1      ///< JCTVC-N0085: Semantics of vui_timing_info_present_flag to always set that flag to zero for non-zero layer ID SPS
    6063#define RPL_INIT_N0316_N0082             1      ///< JCTVC-N0316, JCTVC-N0082: initial reference picture list construction
    6164
    62 #define IL_SL_SIGNALLING_N0371           0      ///< JCTVC-N0371: inter-layer scaling list
     65#define SCALINGLIST_INFERRING            1      ///< JCTVC-N0371: inter-layer scaling list
    6366#define M0463_VUI_EXT_ILP_REF            0      ///< JCTVC-M0463: VUI extension inter-layer dependency offset signalling
    6467#define SPS_EXTENSION                    1      ///< Define sps_extension() syntax structure
     68#if SPS_EXTENSION
     69#define O0142_CONDITIONAL_SPS_EXTENSION  1      ///< JCTVC-O0142: Conditional SPS extension
     70#endif
    6571#define VERT_MV_CONSTRAINT               1      ///< Vertical MV component constraint flag
    6672#define SCALABILITY_MASK_E0104           1      ///< JCT3V-E0104: scalability mask for depth
    6773#define LAYER_CTB                        0      ///< enable layer-specific CTB structure
     74#if POC_RESET_FLAG
     75#define PREVTID0_POC_RESET               1      ///< JCTVC-O0117 Modification of the PicOrderCntVal of prevTid0Pic
     76#define POC_RESET_RPS                    1      ///< JCTVC-O0117 Modification to the decoding process for rps
     77#endif
    6878
    6979#define ILP_SSH_SIG                      1      ///< JCTVC-N0195 proposal 2, JCTVC-N0118: add presence flag in VPS ext to condition inter-layer prediction signaling in slice segment header
     
    8696
    8797#if VPS_VUI
     98#define VPS_VUI_TILES_NOT_IN_USE__FLAG    1      ///< JCTVC-O0226: VPS VUI flag to indicate tile not in use
     99#define VPS_VUI_WPP_NOT_IN_USE__FLAG    1      ///< JCTVC-O0226: VPS VUI flag to indicate tile not in use
    88100#define TILE_BOUNDARY_ALIGNED_FLAG       1      ///< JCTVC-N0160/JCTVC-N0199 proposal 2 variant 2: VPS VUI flag to indicate tile boundary alignment
    89101#define N0160_VUI_EXT_ILP_REF            1      ///< VUI extension inter-layer dependency offset signalling
    90102#define VPS_VUI_BITRATE_PICRATE          1      ///< JCTVC-N0085: Signal bit rate and picture in VPS VUI
     103#if M0040_ADAPTIVE_RESOLUTION_CHANGE
     104#define HIGHER_LAYER_IRAP_SKIP_FLAG      1      ///< JCTVC-O0199: Indication that higher layer IRAP picture uses skip blocks only
     105#endif
     106#define VPS_VUI_VIDEO_SIGNAL             1      ///< JCTVC-O0118 video signal information
    91107#endif //VPS_VUI
    92108
     
    127143#define N0120_MAX_TID_REF_CFG            1      ///< set max_tid_il_ref_pics_plus1 and max_tid_ref_present_flag in the config. file (configuration setting)
    128144#define O0225_MAX_TID_FOR_REF_LAYERS     1
     145#define O0225_TID_BASED_IL_RPS_DERIV     1
     146
     147#define VPS_TSLAYERS                     1      ///< JCTVC-O0120 signal max temporal sub-layers for each layer
     148#define TSLAYERS_IL_RPS                  1      ///< JCTVC-O0120 IL RPS based on max temporal sub-layers
    129149#endif
    130150#if REF_IDX_MFM
     
    139159#define M0457_IL_SAMPLE_PRED_ONLY_FLAG   0      ///< shall be 0, JCTVC-N0107
    140160#endif
     161
     162#define O0223_PICTURE_TYPES_ALIGN_FLAG   1  ///< a flag to indicatate whether picture types are aligned across layers.
    141163
    142164#define N0147_IRAP_ALIGN_FLAG            1      ///< a flag to indicatate whether IRAPs are aligned across layers
     
    166188#define SHM_FIX7                         1      ///< fix for SHVC WD ticket #7
    167189
     190#define O0092_0094_DEPENDENCY_CONSTRAINT 1      ///< JCTVC-O0092: constraint on the layer_id of SPS/PPS
     191#if O0092_0094_DEPENDENCY_CONSTRAINT
     192#define MAX_REF_LAYERS                   7
     193#endif
     194#define O0096_REP_FORMAT_INDEX           1      ///< JCTVC-O0096: identify SPS rep_format() with an index into the lists of formats in VPS extension.
     195#define O0096_DEFAULT_DEPENDENCY_TYPE    1      ///< JCTVC-O0096: specify default dependency type for all direct reference layers
     196
     197#define RESAMPLING_CONSTRAINT_BUG_FIX    1
     198#define O0098_SCALED_REF_LAYER_ID        1      ///< JCTVC-O0098: signal scaled reference id
     199
     200#define O0153_ALT_OUTPUT_LAYER_FLAG      1      ///< JCTVC-O0153: alt output layer flag
     201
     202#define VPS_DPB_SIZE_TABLE               1      ///< JCTVC-O0217: DPB operations: signaling DPB-related parameters
     203#if VPS_DPB_SIZE_TABLE
     204#define OUTPUT_LAYER_SET_INDEX           1      ///< JCTVC-O0217: DPB operations: Inference/input of output layer set index
     205#if OUTPUT_LAYER_SET_INDEX
     206#define USE_DPB_SIZE_TABLE               1      ///< JCTVC-O0217: DPB operations: Use signaled DPB-size table parameters in the decoder
     207#endif
     208#endif
     209
     210#define NO_CLRAS_OUTPUT_FLAG             1
     211#define O0149_CROSS_LAYER_BLA_FLAG       1      ///< JCTVC-O0149: signal cross_layer_bla_flag in slice header
     212
    168213#else
    169214#define SYNTAX_OUTPUT                    0
     
    174219//! \{
    175220
    176 #define FIX1071 1 ///< fix for issue #1071
     221#define HM_CLEANUP_SAO                  1  ///< JCTVC-N0230, 1) three SAO encoder-only software bugfixes. 2) new SAO implementation without picture quadtree, fine-grained slice legacies, and other redundancies.
     222#if HM_CLEANUP_SAO 
     223#define SAO_ENCODE_ALLOW_USE_PREDEBLOCK 1
     224#endif
    177225
    178226#define MAX_NUM_PICS_IN_SOP           1024
     
    184232#define MAX_VPS_NUM_SCALABILITY_TYPES             16
    185233#endif
     234#define MAX_VPS_OP_LAYER_SETS_PLUS1               3
    186235#if VPS_RENAME
    187236#define MAX_VPS_LAYER_SETS_PLUS1                  1024
     
    192241#define MAX_VPS_NUH_RESERVED_ZERO_LAYER_ID_PLUS1  1
    193242#endif
    194 #define RATE_CONTROL_LAMBDA_DOMAIN                  1  ///< JCTVC-K0103, rate control by R-lambda model
    195 #define M0036_RC_IMPROVEMENT                        1  ///< JCTVC-M0036, improvement for R-lambda model based rate control
    196 #define TICKET_1090_FIX                             1
    197 
    198 #define RC_FIX                                      1  /// suggested fix for M0036
    199 #define RATE_CONTROL_INTRA                          1  ///< JCTVC-M0257, rate control for intra
    200243
    201244#define MAX_CPB_CNT                     32  ///< Upper bound of (cpb_cnt_minus1 + 1)
     
    216259#define C1FLAG_NUMBER               8 // maximum number of largerThan1 flag coded in one chunk :  16 in HM5
    217260#define C2FLAG_NUMBER               1 // maximum number of largerThan2 flag coded in one chunk:  16 in HM5
    218 
     261#if !HM_CLEANUP_SAO
    219262#define REMOVE_SAO_LCU_ENC_CONSTRAINTS_3 1  ///< disable the encoder constraint that conditionally disable SAO for chroma for entire slice in interleaved mode
    220 
     263#endif
    221264#define SAO_ENCODING_CHOICE              1  ///< I0184: picture early termination
    222265#if SAO_ENCODING_CHOICE
     
    232275#define MAX_NUM_PPS                64
    233276
    234 #define WEIGHTED_CHROMA_DISTORTION  1   ///< F386: weighting of chroma for RDO
    235277#define RDOQ_CHROMA_LAMBDA          1   ///< F386: weighting of chroma for RDOQ
    236 #define SAO_CHROMA_LAMBDA           1   ///< F386: weighting of chroma for SAO
    237278
    238279#define MIN_SCAN_POS_CROSS          4
     
    248289#define LEVEL_RANGE                         30     ///< G382: max coefficient level in statistics collection
    249290#endif
    250 
    251 #define NS_HAD                               0
    252291
    253292#define HHI_RQT_INTRA_SPEEDUP             1           ///< tests one best mode with full rqt
     
    316355#define AMP_MRG                               1           ///< encoder only force merge for AMP partition (no motion search for AMP)
    317356#endif
    318 
    319 #define SCALING_LIST_OUTPUT_RESULT    0 //JCTVC-G880/JCTVC-G1016 quantization matrices
    320357
    321358#define CABAC_INIT_PRESENT_FLAG     1
     
    377414};
    378415
     416#if HM_CLEANUP_SAO
     417enum SAOComponentIdx
     418{
     419  SAO_Y =0,
     420  SAO_Cb,
     421  SAO_Cr,
     422  NUM_SAO_COMPONENTS
     423};
     424
     425enum SAOMode //mode
     426{
     427  SAO_MODE_OFF = 0,
     428  SAO_MODE_NEW,
     429  SAO_MODE_MERGE,
     430  NUM_SAO_MODES
     431};
     432
     433enum SAOModeMergeTypes
     434{
     435  SAO_MERGE_LEFT =0,
     436  SAO_MERGE_ABOVE,
     437  NUM_SAO_MERGE_TYPES
     438};
     439
     440
     441enum SAOModeNewTypes
     442{
     443  SAO_TYPE_START_EO =0,
     444  SAO_TYPE_EO_0 = SAO_TYPE_START_EO,
     445  SAO_TYPE_EO_90,
     446  SAO_TYPE_EO_135,
     447  SAO_TYPE_EO_45,
     448 
     449  SAO_TYPE_START_BO,
     450  SAO_TYPE_BO = SAO_TYPE_START_BO,
     451
     452  NUM_SAO_NEW_TYPES
     453};
     454#define NUM_SAO_EO_TYPES_LOG2 2
     455
     456enum SAOEOClasses
     457{
     458  SAO_CLASS_EO_FULL_VALLEY = 0,
     459  SAO_CLASS_EO_HALF_VALLEY = 1,
     460  SAO_CLASS_EO_PLAIN       = 2,
     461  SAO_CLASS_EO_HALF_PEAK   = 3,
     462  SAO_CLASS_EO_FULL_PEAK   = 4,
     463  NUM_SAO_EO_CLASSES,
     464};
     465
     466
     467#define NUM_SAO_BO_CLASSES_LOG2  5
     468enum SAOBOClasses
     469{
     470  //SAO_CLASS_BO_BAND0 = 0,
     471  //SAO_CLASS_BO_BAND1,
     472  //SAO_CLASS_BO_BAND2,
     473  //...
     474  //SAO_CLASS_BO_BAND31,
     475
     476  NUM_SAO_BO_CLASSES = (1<<NUM_SAO_BO_CLASSES_LOG2),
     477};
     478#define MAX_NUM_SAO_CLASSES  32  //(NUM_SAO_EO_GROUPS > NUM_SAO_BO_GROUPS)?NUM_SAO_EO_GROUPS:NUM_SAO_BO_GROUPS
     479
     480struct SAOOffset
     481{
     482  Int modeIdc; //NEW, MERGE, OFF
     483  Int typeIdc; //NEW: EO_0, EO_90, EO_135, EO_45, BO. MERGE: left, above
     484  Int typeAuxInfo; //BO: starting band index
     485  Int offset[MAX_NUM_SAO_CLASSES];
     486
     487  SAOOffset();
     488  ~SAOOffset();
     489  Void reset();
     490
     491  const SAOOffset& operator= (const SAOOffset& src);
     492};
     493
     494struct SAOBlkParam
     495{
     496
     497  SAOBlkParam();
     498  ~SAOBlkParam();
     499  Void reset();
     500  const SAOBlkParam& operator= (const SAOBlkParam& src);
     501  SAOOffset& operator[](Int compIdx){ return offsetParam[compIdx];}
     502private:
     503  SAOOffset offsetParam[NUM_SAO_COMPONENTS];
     504
     505};
     506
     507
     508#else
    379509#define NUM_DOWN_PART 4
    380510
     
    448578  ~SAOParam();
    449579};
    450 
     580#endif
    451581/// parameters for deblocking filter
    452582typedef struct _LFCUParam
Note: See TracChangeset for help on using the changeset viewer.