Changeset 54 in SHVCSoftware for branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder


Ignore:
Timestamp:
2 Mar 2013, 09:25:00 (12 years ago)
Author:
seregin
Message:

port simulcast

Location:
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder
Files:
23 edited

Legend:

Unmodified
Added
Removed
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/NALwrite.cpp

    r51 r54  
    5353  bsNALUHeader.write(0,1);                    // forbidden_zero_bit
    5454  bsNALUHeader.write(nalu.m_nalUnitType, 6);  // nal_unit_type
     55#if SVC_EXTENSION
     56  bsNALUHeader.write(nalu.m_layerId, 6); // reserved_one_5bits
     57#else
    5558  bsNALUHeader.write(nalu.m_reservedZero6Bits, 6);                   // nuh_reserved_zero_6bits
     59#endif
    5660  bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1
    5761
     
    145149  naluDest.m_temporalId  = naluSrc.m_temporalId;
    146150  naluDest.m_Bitstream   = naluSrc.m_Bitstream;
     151#if SVC_EXTENSION
     152  naluDest.m_layerId   = naluSrc.m_layerId;
     153#endif
    147154}
    148155
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/NALwrite.h

    r51 r54  
    5757    NalUnitType nalUnitType,
    5858    UInt temporalID = 0,
     59#if SVC_EXTENSION
     60    UInt     layerId = 0,
     61#endif
    5962    UInt reserved_zero_6bits = 0)
     63#if SVC_EXTENSION
     64  : NALUnit(nalUnitType, temporalID, layerId, reserved_zero_6bits)
     65#else
    6066  : NALUnit(nalUnitType, temporalID, reserved_zero_6bits)
     67#endif
    6168  , m_Bitstream()
    6269  {}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncAnalyze.cpp

    r51 r54  
    4545//////////////////////////////////////////////////////////////////////
    4646
     47#if SVC_EXTENSION
     48TEncAnalyze             m_gcAnalyzeAll [MAX_LAYERS];
     49TEncAnalyze             m_gcAnalyzeI [MAX_LAYERS];
     50TEncAnalyze             m_gcAnalyzeP [MAX_LAYERS];
     51TEncAnalyze             m_gcAnalyzeB [MAX_LAYERS];
     52#else
    4753TEncAnalyze             m_gcAnalyzeAll;
    4854TEncAnalyze             m_gcAnalyzeI;
    4955TEncAnalyze             m_gcAnalyzeP;
    5056TEncAnalyze             m_gcAnalyzeB;
     57#endif
    5158
    5259//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncAnalyze.h

    r51 r54  
    8888  Void    setFrmRate  (Double dFrameRate) { m_dFrmRate = dFrameRate; } //--CFG_KDY
    8989  Void    clear() { m_dPSNRSumY = m_dPSNRSumU = m_dPSNRSumV = m_dAddBits = m_uiNumPic = 0;  }
     90#if SVC_EXTENSION
     91  Void    printOut ( Char cDelim, UInt layer )
     92  {
     93    Double dFps     =   m_dFrmRate; //--CFG_KDY
     94    Double dScale   = dFps / 1000 / (Double)m_uiNumPic;
     95   
     96    printf( "    L%d\t %8d    %c"          "%12.4lf  "    "%8.4lf  "   "%8.4lf  "    "%8.4lf\n",
     97           layer,
     98           getNumPic(), cDelim,
     99           getBits() * dScale,
     100           getPsnrY() / (Double)getNumPic(),
     101           getPsnrU() / (Double)getNumPic(),
     102           getPsnrV() / (Double)getNumPic() );
     103  }
     104#else
    90105  Void    printOut ( Char cDelim )
    91106  {
     
    102117           getPsnrV() / (Double)getNumPic() );
    103118  }
     119#endif
    104120 
    105121  Void    printSummaryOut ()
     
    150166};
    151167
     168#if SVC_EXTENSION
     169extern TEncAnalyze             m_gcAnalyzeAll [MAX_LAYERS];
     170extern TEncAnalyze             m_gcAnalyzeI [MAX_LAYERS];
     171extern TEncAnalyze             m_gcAnalyzeP [MAX_LAYERS];
     172extern TEncAnalyze             m_gcAnalyzeB [MAX_LAYERS];
     173#else
    152174extern TEncAnalyze             m_gcAnalyzeAll;
    153175extern TEncAnalyze             m_gcAnalyzeI;
    154176extern TEncAnalyze             m_gcAnalyzeP;
    155177extern TEncAnalyze             m_gcAnalyzeB;
     178#endif
    156179
    157180//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.cpp

    r51 r54  
    545545  }
    546546  WRITE_FLAG( pcSPS->getTMVPFlagsPresent()  ? 1 : 0,           "sps_temporal_mvp_enable_flag" );
    547 
     547#if REF_IDX_MFM
     548  if( pcSPS->getLayerId() > 0 )
     549  {
     550    assert(pcSPS->getMFMEnabledFlag());
     551    WRITE_FLAG( pcSPS->getMFMEnabledFlag() ? 1 : 0,          "sps_enh_mfm_enable_flag" );
     552  }
     553#endif
    548554  WRITE_FLAG( pcSPS->getUseStrongIntraSmoothing(),             "sps_strong_intra_smoothing_enable_flag" );
    549555
     
    15491555  return true;
    15501556}
     1557
     1558#if INTRA_BL
     1559Void TEncCavlc::codeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
     1560{
     1561  assert(0);
     1562}
     1563
     1564#endif
    15511565//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.h

    r51 r54  
    114114  Void codeMergeFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx );
    115115  Void codeMergeIndex    ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     116#if INTRA_BL
     117  Void codeIntraBLFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     118#endif
    116119 
    117120  Void codeInterModeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiEncMode );
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCfg.h

    r51 r54  
    298298
    299299  Bool      m_useStrongIntraSmoothing;                        ///< enable the use of strong intra smoothing (bi_linear interpolation) for 32x32 blocks when reference samples are flat.
     300#if SVC_EXTENSION
     301  UInt      m_layerId;   
     302  UInt      m_numLayer;
     303#endif
     304#if REF_IDX_FRAMEWORK
     305  Int      m_elRapSliceBEnabled;
     306#endif
    300307
    301308public:
     
    692699  Void setFrameOnlyConstraintFlag(Bool b) { m_frameOnlyConstraintFlag = b; }
    693700#endif
     701
     702#if SVC_EXTENSION
     703  UInt      getLayerId            () { return m_layerId;              }
     704  Void      setLayerId            (UInt layer) { m_layerId = layer; }
     705  UInt      getNumLayer           () { return m_numLayer;             } 
     706  Void      setNumLayer           (UInt uiNum)   { m_numLayer = uiNum;  }
     707  Void      setConformanceMode    (Int mode)     { m_conformanceMode = mode; }
     708  Void      setConformanceWindow(Window& conformanceWindow ) { m_conformanceWindow = conformanceWindow; }
     709#endif
     710#if REF_IDX_FRAMEWORK
     711  Void      setElRapSliceTypeB(Int bEnabled) {m_elRapSliceBEnabled = bEnabled;}
     712  Int       getElRapSliceTypeB()              {return m_elRapSliceBEnabled;}
     713#endif
    694714};
    695715
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCu.cpp

    r51 r54  
    211211  m_pcRdCost           = pcEncTop->getRdCost();
    212212 
     213#if SVC_EXTENSION
     214  m_ppcTEncTop         = pcEncTop->getLayerEnc();
     215  for(UInt i=0 ; i< m_uhTotalDepth-1 ; i++)
     216  {   
     217    m_ppcBestCU[i]->setLayerId(pcEncTop->getLayerId());
     218    m_ppcTempCU[i]->setLayerId(pcEncTop->getLayerId());
     219  }
     220#endif
     221 
    213222  m_pcEntropyCoder     = pcEncTop->getEntropyCoder();
    214223  m_pcCavlcCoder       = pcEncTop->getCavlcCoder();
     
    445454  if(!bSliceEnd && !bSliceStart && bInsidePicture )
    446455  {
     456#if (ENCODER_FAST_MODE)
     457    bool testInter = true;
     458    if (rpcBestCU->getLayerId() > 0)
     459    {
     460      if (rpcBestCU->getSlice()->getBaseColPic()->getSlice(0)->getSliceType() == I_SLICE)
     461      {
     462        testInter = false;
     463      }
     464
     465    }
     466#endif
    447467    for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++)
    448468    {
     
    459479
    460480      // do inter modes, SKIP and 2Nx2N
     481#if (ENCODER_FAST_MODE == 1)
     482      if( rpcBestCU->getSlice()->getSliceType() != I_SLICE && testInter )
     483#else
    461484      if( rpcBestCU->getSlice()->getSliceType() != I_SLICE )
     485#endif
    462486      {
    463487        // 2Nx2N
     
    480504          }
    481505        }
     506#if (ENCODER_FAST_MODE == 2)
     507        if (testInter)
     508        {
     509#endif
    482510
    483511        if(!m_pcEncCfg->getUseEarlySkipDetection())
     
    493521          }
    494522        }
     523#if (ENCODER_FAST_MODE == 2)
     524    }
     525#endif
     526
    495527      }
    496528
     
    531563
    532564        // do inter modes, NxN, 2NxN, and Nx2N
     565#if (ENCODER_FAST_MODE)
     566      if( rpcBestCU->getSlice()->getSliceType() != I_SLICE && testInter )
     567#else
    533568        if( rpcBestCU->getSlice()->getSliceType() != I_SLICE )
     569#endif
    534570        {
    535571          // 2Nx2N, NxN
     
    685721        {
    686722          // speedup for inter frames
     723#if (ENCODER_FAST_MODE)
     724        if( rpcBestCU->getSlice()->getSliceType() == I_SLICE ||
     725          !testInter ||
     726          rpcBestCU->getCbf( 0, TEXT_LUMA     ) != 0   ||
     727          rpcBestCU->getCbf( 0, TEXT_CHROMA_U ) != 0   ||
     728          rpcBestCU->getCbf( 0, TEXT_CHROMA_V ) != 0     ) // avoid very complex intra if it is unlikely
     729#else
    687730          if( rpcBestCU->getSlice()->getSliceType() == I_SLICE ||
    688731            rpcBestCU->getCbf( 0, TEXT_LUMA     ) != 0   ||
    689732            rpcBestCU->getCbf( 0, TEXT_CHROMA_U ) != 0   ||
    690733            rpcBestCU->getCbf( 0, TEXT_CHROMA_V ) != 0     ) // avoid very complex intra if it is unlikely
     734#endif
    691735          {
    692736            xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_2Nx2N );
     
    716760          }
    717761        }
     762#if INTRA_BL
     763      if(m_pcPicYuvRecBase)
     764      {
     765        xCheckRDCostIntraBL( rpcBestCU, rpcTempCU );
     766        rpcTempCU->initEstData( uiDepth, iQP );
     767      }
     768#endif
     769
     770#if (ENCODER_FAST_MODE)
     771        if(pcPic->getLayerId() > 0)
     772        {
     773          xCheckRDCostILRUni( rpcBestCU, rpcTempCU);
     774          rpcTempCU->initEstData( uiDepth, iQP );
     775       }
     776#endif
     777
    718778        if (isAddLowestQP && (iQP == lowestQP))
    719779        {
     
    11501210    return;
    11511211  }
     1212#if INTRA_BL
     1213  m_pcEntropyCoder->encodeIntraBLFlag( pcCU, uiAbsPartIdx );
     1214  if ( !pcCU->isIntraBL( uiAbsPartIdx ) )
     1215  {
     1216#endif
    11521217  m_pcEntropyCoder->encodePredMode( pcCU, uiAbsPartIdx );
    11531218 
     
    11681233  // prediction Info ( Intra : direction mode, Inter : Mv, reference idx )
    11691234  m_pcEntropyCoder->encodePredInfo( pcCU, uiAbsPartIdx );
     1235#if INTRA_BL
     1236  }
     1237#endif
    11701238 
    11711239  // Encode Coefficients
     
    12211289    for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
    12221290    {
    1223       {
     1291#if REF_IDX_ME_ZEROMV
     1292      Bool bZeroMVILR = rpcTempCU->xCheckZeroMVILRMerge(uhInterDirNeighbours[uiMergeCand], cMvFieldNeighbours[0 + 2*uiMergeCand], cMvFieldNeighbours[1 + 2*uiMergeCand]);
     1293      if(bZeroMVILR)
     1294      {
     1295#endif
    12241296        if(!(uiNoResidual==1 && mergeCandBuffer[uiMergeCand]==1))
    12251297        {
     
    12711343    }
    12721344    }
     1345#if REF_IDX_ME_ZEROMV
    12731346   }
     1347#endif
    12741348  }
    12751349
     
    13771451 
    13781452  m_pcEntropyCoder->resetBits();
     1453#if INTRA_BL
     1454  m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0,       true );
     1455#endif
    13791456  if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())
    13801457  {
     
    14301507
    14311508  m_pcEntropyCoder->resetBits();
     1509#if INTRA_BL
     1510  m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0,       true );
     1511#endif
    14321512  if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())
    14331513  {
     
    16811761}
    16821762#endif
     1763
     1764#if INTRA_BL
     1765Void TEncCu::xCheckRDCostIntraBL( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU )
     1766{
     1767  UInt uiDepth = rpcTempCU->getDepth( 0 );
     1768  rpcTempCU->setSkipFlagSubParts( false, 0, uiDepth );
     1769  rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth );
     1770  rpcTempCU->setPredModeSubParts( MODE_INTRA_BL, 0, uiDepth ); 
     1771  rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(), 0, uiDepth );
     1772
     1773  m_pcPredSearch->setBaseRecPic( m_pcPicYuvRecBase );
     1774#if NO_RESIDUAL_FLAG_FOR_BLPRED
     1775  rpcTempCU->setDepthSubParts( uiDepth, 0 );
     1776  //   rpcTempCU->setLumaIntraDirSubParts( DC_IDX, 0, uiDepth );
     1777  //   rpcTempCU->setChromIntraDirSubParts( DC_IDX, 0, uiDepth );
     1778  m_ppcPredYuvTemp[uiDepth]->copyFromPicLuma  ( rpcTempCU->getSlice()->getFullPelBaseRec(),  rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, rpcTempCU->getWidth(0), rpcTempCU->getHeight(0));
     1779  m_ppcPredYuvTemp[uiDepth]->copyFromPicChroma( rpcTempCU->getSlice()->getFullPelBaseRec(),  rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, (rpcTempCU->getWidth(0)>>1), (rpcTempCU->getHeight(0)>>1), 0);
     1780  m_ppcPredYuvTemp[uiDepth]->copyFromPicChroma( rpcTempCU->getSlice()->getFullPelBaseRec(),  rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, (rpcTempCU->getWidth(0)>>1), (rpcTempCU->getHeight(0)>>1), 1);
     1781  m_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcResiYuvBest[uiDepth], m_ppcRecoYuvTemp[uiDepth], false );
     1782  rpcTempCU->getTotalCost()  = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() );
     1783#else
     1784
     1785  m_pcPredSearch->estIntraBLPredQT( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcRecoYuvTemp[uiDepth] );
     1786
     1787  m_pcEntropyCoder->resetBits();
     1788  m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0,       true );
     1789  m_pcEntropyCoder->encodeSkipFlag( rpcTempCU, 0,       true );
     1790  if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag())
     1791  {
     1792    m_pcEntropyCoder->encodeCUTransquantBypassFlag( rpcTempCU, 0,          true );
     1793  }
     1794
     1795  // Encode Coefficients
     1796  Bool bCodeDQP = getdQPFlag();
     1797  m_pcEntropyCoder->encodeCoeff( rpcTempCU, 0, uiDepth, rpcTempCU->getWidth (0), rpcTempCU->getHeight(0), bCodeDQP );
     1798  setdQPFlag( bCodeDQP );
     1799 
     1800  if( m_bUseSBACRD ) m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]);
     1801 
     1802  rpcTempCU->getTotalBits() = m_pcEntropyCoder->getNumberOfWrittenBits();
     1803  if(m_pcEncCfg->getUseSBACRD())
     1804  {
     1805    rpcTempCU->getTotalBins() = ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded();
     1806  }
     1807  rpcTempCU->getTotalCost() = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() );
     1808#endif
     1809 
     1810  xCheckDQP( rpcTempCU );
     1811  xCheckBestMode(rpcBestCU, rpcTempCU, uiDepth);
     1812}
     1813#endif
     1814
     1815
     1816
     1817
    16831818//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCu.h

    r51 r54  
    8484  //  Access channel
    8585  TEncCfg*                m_pcEncCfg;
     86#if INTRA_BL
     87  TComPicYuv*             m_pcPicYuvRecBase;       ///< reconstructed base layer
     88#endif
    8689  TEncSearch*             m_pcPredSearch;
    8790  TComTrQuant*            m_pcTrQuant;
    8891  TComBitCounter*         m_pcBitCounter;
    8992  TComRdCost*             m_pcRdCost;
     93 
     94#if SVC_EXTENSION
     95  TEncTop**               m_ppcTEncTop;
     96#endif
    9097 
    9198  TEncEntropy*            m_pcEntropyCoder;
     
    124131  UInt getLCUPredictionSAD() { return m_LCUPredictionSAD; }
    125132#endif
     133#if INTRA_BL
     134  Void  setBaseRecPic       ( TComPicYuv* p ) { m_pcPicYuvRecBase = p; }   
     135#endif
    126136protected:
    127137  Void  finishCU            ( TComDataCU*  pcCU, UInt uiAbsPartIdx,           UInt uiDepth        );
     
    144154#endif
    145155  Void  xCheckRDCostIntra   ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, PartSize ePartSize  );
     156#if INTRA_BL
     157  Void  xCheckRDCostIntraBL ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU  );
     158#endif
     159#if ENCODER_FAST_MODE
     160  Void  xCheckRDCostILRUni  ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU );
     161#endif
    146162  Void  xCheckDQP           ( TComDataCU*  pcCU );
    147163 
     
    168184#endif
    169185
     186#if SVC_EXTENSION
     187  TEncTop*   getLayerEnc(UInt LayerId)  {return m_ppcTEncTop[LayerId]; }
     188#endif
     189
    170190  Void  xFillPCMBuffer     ( TComDataCU*& pCU, TComYuv* pOrgYuv );
    171191};
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncEntropy.cpp

    r51 r54  
    166166  }
    167167
     168#if INTRA_BL
     169  if( pcCU->isIntraBL( uiAbsPartIdx ) )
     170  {
     171    return;
     172  }
     173#endif
     174
    168175  m_pcEntropyCoderIf->codePredMode( pcCU, uiAbsPartIdx );
    169176}
     
    244251    }
    245252  }
     253#if INTRA_BL
     254    if( pcCU->isIntra(uiAbsPartIdx) && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
     255#else
    246256 
    247257  if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) )
     258#endif
    248259  {
    249260    assert( uiSubdiv );
     
    331342    }
    332343   
     344#if INTRA_BL
     345#if NO_RESIDUAL_FLAG_FOR_BLPRED
     346    if( ( !pcCU->isIntra( uiAbsPartIdx ) || pcCU->isIntraBL(uiAbsPartIdx)) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
     347#else
     348    if( ( !pcCU->isIntra( uiAbsPartIdx ) ) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
     349#endif
     350#else
    333351    if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) )
     352#endif
    334353    {
    335354      assert( pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, 0 ) );
     
    412431Void TEncEntropy::encodePredInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
    413432{
     433#if INTRA_BL
     434  assert ( !pcCU->isIntraBL( uiAbsPartIdx ) );
     435#endif
    414436  if( bRD )
    415437  {
     
    585607  UInt uiChromaOffset = uiLumaOffset>>2;
    586608   
     609#if NO_RESIDUAL_FLAG_FOR_BLPRED
     610  if( pcCU->isIntra(uiAbsPartIdx) && !pcCU->isIntraBL(uiAbsPartIdx) )
     611#else
    587612  if( pcCU->isIntra(uiAbsPartIdx) )
     613#endif
    588614  {
    589615    DTRACE_CABAC_VL( g_nSymbolCounter++ )
     
    733759}
    734760
     761#if INTRA_BL
     762Void TEncEntropy::encodeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD )
     763{
     764  if( pcCU->getLayerId() == 0 )
     765  {
     766    return;
     767  }
     768
     769  if( bRD )
     770  {
     771    uiAbsPartIdx = 0;
     772  }
     773  m_pcEntropyCoderIf->codeIntraBLFlag( pcCU, uiAbsPartIdx );
     774}
     775#endif
    735776//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncEntropy.h

    r51 r54  
    8686  virtual Void codeSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
    8787 
     88#if INTRA_BL
     89  virtual Void codeIntraBLFlag      ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0;
     90#endif
    8891  virtual Void codePartSize      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
    8992  virtual Void codePredMode      ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0;
     
    161164  Void encodeMergeFlag    ( TComDataCU* pcCU, UInt uiAbsPartIdx );
    162165  Void encodeMergeIndex   ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false );
     166#if INTRA_BL
     167  Void encodeIntraBLFlag  ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false );
     168#endif
    163169  Void encodePredMode          ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false );
    164170  Void encodePartSize          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD = false );
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncGOP.cpp

    r51 r54  
    9797  xResetNonNestedSEIPresentFlags();
    9898#endif
     99#if SVC_UPSAMPLING
     100  m_pcPredSearch        = NULL;
     101#endif
    99102  return;
    100103}
     
    106109/** Create list to contain pointers to LCU start addresses of slice.
    107110 */
     111#if SVC_EXTENSION
     112Void  TEncGOP::create( UInt layerId )
     113{
     114  m_bLongtermTestPictureHasBeenCoded = 0;
     115  m_bLongtermTestPictureHasBeenCoded2 = 0;
     116  m_layerId = layerId;
     117}
     118#else
    108119Void  TEncGOP::create()
    109120{
     
    111122  m_bLongtermTestPictureHasBeenCoded2 = 0;
    112123}
     124#endif
    113125
    114126Void  TEncGOP::destroy()
     
    121133  m_pcCfg                = pcTEncTop;
    122134  m_pcSliceEncoder       = pcTEncTop->getSliceEncoder();
    123   m_pcListPic            = pcTEncTop->getListPic();
    124  
     135  m_pcListPic            = pcTEncTop->getListPic(); 
    125136  m_pcEntropyCoder       = pcTEncTop->getEntropyCoder();
    126137  m_pcCavlcCoder         = pcTEncTop->getCavlcCoder();
     
    136147  m_totalCoded         = 0;
    137148
     149#if SVC_EXTENSION
     150  m_ppcTEncTop           = pcTEncTop->getLayerEnc();
     151#endif
     152#if SVC_UPSAMPLING
     153  m_pcPredSearch         = pcTEncTop->getPredSearch();                       ///< encoder search class
     154#endif
    138155}
    139156
     
    239256// Public member functions
    240257// ====================================================================================================================
     258#if SVC_EXTENSION
     259Void TEncGOP::compressGOP( Int iPicIdInGOP, Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsInGOP)
     260#else
    241261Void TEncGOP::compressGOP( Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsInGOP)
     262#endif
    242263{
    243264  TComPic*        pcPic;
     
    261282  UInt *accumNalsDU = NULL;
    262283  SEIDecodingUnitInfo decodingUnitInfoSEI;
     284#if SVC_EXTENSION
     285  for ( Int iGOPid=iPicIdInGOP; iGOPid < iPicIdInGOP+1; iGOPid++ )
     286#else
    263287  for ( Int iGOPid=0; iGOPid < m_iGopSize; iGOPid++ )
     288#endif
    264289  {
    265290    UInt uiColDir = 1;
     
    337362    m_pcSliceEncoder->setSliceIdx(0);
    338363    pcPic->setCurrSliceIdx(0);
     364#if SVC_EXTENSION
     365    pcPic->setLayerId( m_layerId );
     366#endif
    339367
    340368    m_pcSliceEncoder->initEncSlice ( pcPic, iPOCLast, pocCurr, iNumPicRcvd, iGOPid, pcSlice, m_pcEncTop->getSPS(), m_pcEncTop->getPPS() );
     
    384412    // Set the nal unit type
    385413    pcSlice->setNalUnitType(getNalUnitType(pocCurr));
     414#if REF_IDX_FRAMEWORK
     415    if( m_layerId > 0 && (uiPOCCurr % m_pcCfg->getIntraPeriod() == 0) )
     416    {
     417      pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_CRA);
     418    }
     419    if( m_layerId > 0 && !m_pcEncTop->getElRapSliceTypeB() )
     420    {
     421      if( (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA) &&
     422          (pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA) &&
     423           pcSlice->getSliceType() == B_SLICE )
     424      {
     425        pcSlice->setSliceType(P_SLICE);
     426      }
     427    }
     428#endif
    386429    if(pcSlice->getNalUnitType()==NAL_UNIT_CODED_SLICE_TRAIL_R)
    387430    {
     
    470513#endif     
    471514
     515#if SVC_EXTENSION     
     516      if(m_layerId > 0)
     517      {
     518        TComList<TComPic*> *cListPic = m_ppcTEncTop[m_layerId-1]->getListPic();
     519        pcSlice->setBaseColPic (*cListPic, m_layerId );
     520#if SVC_UPSAMPLING
     521        if ( pcPic->isSpatialEnhLayer())
     522        {   
     523          m_pcPredSearch->upsampleBasePic( pcPic->getFullPelBaseRec(), pcSlice->getBaseColPic()->getPicYuvRec(), pcPic->getPicYuvRec() );
     524        }
     525        else
     526        {
     527          pcPic->setFullPelBaseRec( pcSlice->getBaseColPic()->getPicYuvRec() );
     528        }
     529        pcSlice->setFullPelBaseRec ( pcPic->getFullPelBaseRec() );
     530#endif
     531      }
     532#endif
     533
     534#if REF_IDX_FRAMEWORK
     535    if( pcSlice->getSliceType() == B_SLICE )
     536    {
     537      pcSlice->setColFromL0Flag(1-uiColDir);
     538    }
     539#endif
     540
    472541    //  Set reference list
    473542    pcSlice->setRefPicList ( rcListPic );
     543#if REF_IDX_FRAMEWORK
     544    if(m_layerId > 0)
     545    {
     546      m_pcEncTop->setILRPic(pcPic);
     547
     548#if REF_IDX_MFM
     549      pcSlice->setRefPOCListILP(m_pcEncTop->getIlpList(), pcSlice->getBaseColPic());
     550#endif
     551      pcSlice->addRefPicList ( m_pcEncTop->getIlpList(), 1);
     552
     553#if REF_IDX_MFM
     554      Bool found         = false;
     555      UInt ColFromL0Flag = pcSlice->getColFromL0Flag();
     556      UInt ColRefIdx     = pcSlice->getColRefIdx();
     557      for(Int colIdx = 0; colIdx < pcSlice->getNumRefIdx( RefPicList(1 - ColFromL0Flag) ); colIdx++)
     558      {
     559        if( pcSlice->getRefPic( RefPicList(1 - ColFromL0Flag), colIdx)->getIsILR() )
     560        {
     561          ColRefIdx = colIdx;
     562          found = true;
     563          break;
     564        }
     565      }
     566
     567      if( found == false )
     568      {
     569        ColFromL0Flag = 1 - ColFromL0Flag;
     570        for(Int colIdx = 0; colIdx < pcSlice->getNumRefIdx( RefPicList(1 - ColFromL0Flag) ); colIdx++)
     571        {
     572          if( pcSlice->getRefPic( RefPicList(1 - ColFromL0Flag), colIdx)->getIsILR() )
     573          {
     574            ColRefIdx = colIdx;
     575            found = true;
     576            break;
     577          }
     578        }
     579      }
     580
     581      if(found == true)
     582      {
     583        pcSlice->setColFromL0Flag(ColFromL0Flag);
     584        pcSlice->setColRefIdx(ColRefIdx);
     585      }
     586#endif
     587    }
     588#endif
    474589
    475590    //  Slice info. refinement
     
    493608    if (pcSlice->getSliceType() == B_SLICE)
    494609    {
     610#if !REF_IDX_FRAMEWORK
    495611      pcSlice->setColFromL0Flag(1-uiColDir);
     612#endif
    496613      Bool bLowDelay = true;
    497614      Int  iCurrPOC  = pcSlice->getPOC();
     
    780897    m_storedStartCUAddrForEncodingSliceSegment.push_back(nextCUAddr);
    781898    startCUAddrSliceSegmentIdx++;
     899#if AVC_BASE
     900    if( m_layerId == 0 )
     901    {
     902      pcPic->getPicYuvOrg()->copyToPic( pcPic->getPicYuvRec() );
     903#if AVC_SYNTAX
     904      pcPic->readBLSyntax( m_ppcTEncTop[0]->getBLSyntaxFile(), SYNTAX_BYTES );
     905#endif
     906      return;
     907    }
     908#endif
    782909
    783910    while(nextCUAddr<uiRealEndAddress) // determine slice boundaries
     
    8781005    if ( m_bSeqFirst )
    8791006    {
     1007#if SVC_EXTENSION
     1008      OutputNALUnit nalu(NAL_UNIT_VPS, 0, m_layerId);
     1009#else
    8801010      OutputNALUnit nalu(NAL_UNIT_VPS);
     1011#endif
    8811012      m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
    8821013      m_pcEntropyCoder->encodeVPS(m_pcEncTop->getVPS());
     
    8871018#endif
    8881019
     1020#if SVC_EXTENSION
     1021      nalu = NALUnit(NAL_UNIT_SPS, 0, m_layerId);
     1022#else
    8891023      nalu = NALUnit(NAL_UNIT_SPS);
     1024#endif
    8901025      m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
    8911026      if (m_bSeqFirst)
     
    9201055#endif
    9211056
     1057#if SVC_EXTENSION
     1058      nalu = NALUnit(NAL_UNIT_PPS, 0, m_layerId);
     1059#else
    9221060      nalu = NALUnit(NAL_UNIT_PPS);
     1061#endif
    9231062      m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
    9241063      m_pcEntropyCoder->encodePPS(pcSlice->getPPS());
     
    11741313          m_pcEntropyCoder->resetEntropy      ();
    11751314          /* start slice NALunit */
     1315#if SVC_EXTENSION
     1316          OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->getTLayer(), m_layerId );
     1317#else
    11761318          OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->getTLayer() );
     1319#endif
    11771320          Bool sliceSegment = (!pcSlice->isNextSlice());
    11781321          if (!sliceSegment)
     
    14361579          digestStr = digestToString(sei_recon_picture_digest.digest, 4);
    14371580        }
     1581#if SVC_EXTENSION
     1582        OutputNALUnit nalu(NAL_UNIT_SEI_SUFFIX, pcSlice->getTLayer(), m_layerId);
     1583#else
    14381584        OutputNALUnit nalu(NAL_UNIT_SEI_SUFFIX, pcSlice->getTLayer());
     1585#endif
    14391586
    14401587        /* write the SEI messages */
     
    17081855  if( accumNalsDU != NULL) delete accumNalsDU;
    17091856
     1857#if SVC_EXTENSION
     1858  assert ( m_iNumPicCoded <= 1 );
     1859#else
    17101860  assert ( m_iNumPicCoded == iNumPicRcvd );
     1861#endif
    17111862}
    17121863
     1864#if !SVC_EXTENSION
    17131865Void TEncGOP::printOutSummary(UInt uiNumAllPicCoded)
    17141866{
     
    17461898  printf("\nRVM: %.3lf\n" , xCalculateRVM());
    17471899}
     1900#endif
    17481901
    17491902Void TEncGOP::preLoopFilterPicAll( TComPic* pcPic, UInt64& ruiDist, UInt64& ruiBits )
     
    20202173
    20212174  //===== add PSNR =====
     2175#if SVC_EXTENSION
     2176  m_gcAnalyzeAll[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
     2177  TComSlice*  pcSlice = pcPic->getSlice(0);
     2178  if (pcSlice->isIntra())
     2179  {
     2180    m_gcAnalyzeI[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
     2181  }
     2182  if (pcSlice->isInterP())
     2183  {
     2184    m_gcAnalyzeP[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
     2185  }
     2186  if (pcSlice->isInterB())
     2187  {
     2188    m_gcAnalyzeB[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
     2189  }
     2190#else
    20222191  m_gcAnalyzeAll.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
    20232192  TComSlice*  pcSlice = pcPic->getSlice(0);
     
    20342203    m_gcAnalyzeB.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits);
    20352204  }
     2205#endif
    20362206
    20372207  Char c = (pcSlice->isIntra() ? 'I' : pcSlice->isInterP() ? 'P' : 'B');
    20382208  if (!pcSlice->isReferenced()) c += 32;
    20392209
     2210#if SVC_EXTENSION
     2211#if ADAPTIVE_QP_SELECTION
     2212  printf("POC %4d LId: %1d TId: %1d ( %c-SLICE, nQP %d QP %d ) %10d bits",
     2213         pcSlice->getPOC(),
     2214         pcSlice->getLayerId(),
     2215         pcSlice->getTLayer(),
     2216         c,
     2217         pcSlice->getSliceQpBase(),
     2218         pcSlice->getSliceQp(),
     2219         uibits );
     2220#else
     2221  printf("POC %4d LId: %1d TId: %1d ( %c-SLICE, QP %d ) %10d bits",
     2222         pcSlice->getPOC()-pcSlice->getLastIDR(),
     2223         pcSlice->getLayerId(),
     2224         pcSlice->getTLayer(),
     2225         c,
     2226         pcSlice->getSliceQp(),
     2227         uibits );
     2228#endif
     2229#else
    20402230#if ADAPTIVE_QP_SELECTION
    20412231  printf("POC %4d TId: %1d ( %c-SLICE, nQP %d QP %d ) %10d bits",
     
    20542244         uibits );
    20552245#endif
     2246#endif
    20562247
    20572248  printf(" [Y %6.4lf dB    U %6.4lf dB    V %6.4lf dB]", dYPSNR, dUPSNR, dVPSNR );
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncGOP.h

    r51 r54  
    8383  Bool                    m_bFirst;
    8484 
     85#if SVC_EXTENSION
     86  UInt                    m_layerId;     
     87#endif
     88
    8589  //  Access channel
    8690  TEncTop*                m_pcEncTop;
     
    8892  TEncSlice*              m_pcSliceEncoder;
    8993  TComList<TComPic*>*     m_pcListPic;
     94 
     95#if SVC_EXTENSION
     96  TEncTop**               m_ppcTEncTop;
     97#if SVC_UPSAMPLING
     98  TEncSearch*             m_pcPredSearch;                       ///< encoder search class
     99#endif 
     100#endif
    90101 
    91102  TEncEntropy*            m_pcEntropyCoder;
     
    125136  virtual ~TEncGOP();
    126137 
     138#if SVC_EXTENSION
     139  Void  create      ( UInt layerId );
     140#else
    127141  Void  create      ();
     142#endif
    128143  Void  destroy     ();
    129144 
    130145  Void  init        ( TEncTop* pcTEncTop );
     146#if SVC_EXTENSION
     147  Void  compressGOP ( Int iPicIdInGOP, Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRec, std::list<AccessUnit>& accessUnitsInGOP );
     148#else
    131149  Void  compressGOP ( Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRec, std::list<AccessUnit>& accessUnitsInGOP );
     150#endif
    132151  Void xWriteTileLocationToSliceHeader (OutputNALUnit& rNalu, TComOutputBitstream*& rpcBitstreamRedirect, TComSlice*& rpcSlice);
    133152
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncPic.cpp

    r51 r54  
    126126 * \return Void
    127127 */
     128#if SVC_UPSAMPLING
     129Void TEncPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 
     130                      Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, TComSPS* pcSps, Bool bIsVirtual )
     131
     132#else
    128133Void TEncPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 
    129134                      Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual )
     135#endif
    130136{
     137#if SVC_UPSAMPLING
     138  TComPic::create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, 
     139                   conformanceWindow, defaultDisplayWindow, numReorderPics, pcSps, bIsVirtual );
     140#else
    131141  TComPic::create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, 
    132142                   conformanceWindow, defaultDisplayWindow, numReorderPics, bIsVirtual );
     143#endif
    133144  m_uiMaxAQDepth = uiMaxAQDepth;
    134145  if ( uiMaxAQDepth > 0 )
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncPic.h

    r51 r54  
    4141#include "TLibCommon/CommonDef.h"
    4242#include "TLibCommon/TComPic.h"
    43 
     43#if SVC_UPSAMPLING
     44#include "TLibCommon/TComSlice.h"
     45#endif
    4446//! \ingroup TLibEncoder
    4547//! \{
     
    103105  virtual ~TEncPic();
    104106
     107#if SVC_UPSAMPLING
     108  Void          create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth,   
     109                        Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, TComSPS* pcSps, Bool bIsVirtual = false );
     110#else
    105111  Void          create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth,   
    106112                        Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual = false );
     113#endif
    107114  virtual Void  destroy();
    108115
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSbac.cpp

    r51 r54  
    8383, m_cTransformSkipSCModel     ( 1,             2,               NUM_TRANSFORMSKIP_FLAG_CTX    , m_contextModels + m_numContextModels, m_numContextModels)
    8484, m_CUTransquantBypassFlagSCModel( 1,          1,               NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels)
     85#if INTRA_BL
     86, m_cIntraBLPredFlagSCModel   (1,              1,               NUM_INTRA_BL_PRED_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
     87#endif
    8588{
    8689  assert( m_numContextModels <= MAX_NUM_CTX_MOD );
     
    131134  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    132135  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     136#if INTRA_BL
     137  m_cIntraBLPredFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRA_BL_PRED_FLAG );
     138#endif
    133139  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    134140  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
     
    163169      curCost  = m_cCUSplitFlagSCModel.calcCost       ( curSliceType, qp, (UChar*)INIT_SPLIT_FLAG );
    164170      curCost += m_cCUSkipFlagSCModel.calcCost        ( curSliceType, qp, (UChar*)INIT_SKIP_FLAG );
     171#if INTRA_BL
     172      curCost += m_cIntraBLPredFlagSCModel.calcCost   ( curSliceType, qp, (UChar*)INIT_INTRA_BL_PRED_FLAG );
     173#endif
    165174      curCost += m_cCUMergeFlagExtSCModel.calcCost    ( curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT);
    166175      curCost += m_cCUMergeIdxExtSCModel.calcCost     ( curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT);
     
    234243  m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG );
    235244  m_cSaoMergeSCModel.initBuffer      ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG );
     245#if INTRA_BL
     246  m_cIntraBLPredFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRA_BL_PRED_FLAG );
     247#endif
    236248  m_cSaoTypeIdxSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX );
    237249  m_cTransformSkipSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG );
     
    416428{
    417429  PartSize eSize         = pcCU->getPartitionSize( uiAbsPartIdx );
     430#if INTRA_BL
     431  assert( !pcCU->isIntraBL( uiAbsPartIdx ) );
     432#endif
    418433  if ( pcCU->isIntra( uiAbsPartIdx ) )
    419434  {
     
    15841599  this->xCopyContextsFrom(pScr);
    15851600}
     1601
     1602#if INTRA_BL
     1603/** code intra_bl flag
     1604 * \param pcCU
     1605 * \param uiAbsPartIdx
     1606 * \returns Void
     1607 */
     1608Void TEncSbac::codeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx )
     1609{
     1610  // get context function is here
     1611  UInt uiSymbol = pcCU->isIntraBL( uiAbsPartIdx ) ? 1 : 0;
     1612
     1613  UInt uiCtxIntraBL = pcCU->getCtxIntraBLFlag( uiAbsPartIdx ) ;
     1614  m_pcBinIf->encodeBin(uiSymbol, m_cIntraBLPredFlagSCModel.get( 0, 0, uiCtxIntraBL ));
     1615
     1616  DTRACE_CABAC_VL( g_nSymbolCounter++ );
     1617  DTRACE_CABAC_T( "\tuiSymbol: ");
     1618  DTRACE_CABAC_V( uiSymbol );
     1619  DTRACE_CABAC_T( "\n");
     1620}
     1621#endif
    15861622//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSbac.h

    r51 r54  
    134134  Void codeMVPIdx        ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
    135135 
     136#if INTRA_BL
     137  Void codeIntraBLFlag      ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     138#endif
    136139  Void codePartSize      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    137140  Void codePredMode      ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     
    204207  ContextModel3DBuffer m_cTransformSkipSCModel;
    205208  ContextModel3DBuffer m_CUTransquantBypassFlagSCModel;
     209#if INTRA_BL
     210  ContextModel3DBuffer m_cIntraBLPredFlagSCModel;
     211#endif
    206212};
    207213
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSearch.cpp

    r51 r54  
    906906        m_pcEntropyCoder->encodePredMode( pcCU, 0, true );
    907907      }
    908      
     908#if INTRA_BL
     909      m_pcEntropyCoder->encodeIntraBLFlag ( pcCU, 0, true );
     910      if( pcCU->isIntraBL( 0 ) )
     911      {
     912        return;
     913      }
     914#endif     
    909915      m_pcEntropyCoder  ->encodePartSize( pcCU, 0, pcCU->getDepth(0), true );
    910916
     
    944950    }
    945951  }
     952#if INTRA_BL
     953  if( pcCU->isIntraBL( 0 ) )
     954  {
     955    return;
     956  }
     957#endif
    946958  if( bChroma )
    947959  {
     
    10431055    pcCU->getPattern()->initAdiPattern( pcCU, uiAbsPartIdx, uiTrDepth, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail );
    10441056    //===== get prediction signal =====
     1057#if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED
     1058    if(pcCU->isIntraBL ( uiAbsPartIdx ) )
     1059    {
     1060      pcCU->getBaseLumaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride );
     1061    }
     1062    else
     1063#endif
    10451064    predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail );
    10461065    // save prediction
     
    12281247
    12291248    //===== get prediction signal =====
     1249#if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED
     1250  if(pcCU->isIntraBL ( uiAbsPartIdx ) )
     1251  {
     1252    pcCU->getBaseChromaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride, uiChromaId );
     1253  }
     1254  else
     1255#endif
    12301256    {
    12311257      predIntraChromaAng( pPatChroma, uiChromaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail );
     
    30393065  Int iHeight = 0;
    30403066
     3067#if REF_IDX_FRAMEWORK  // HM bug fix
     3068  for( UInt uiMergeCand = 0; uiMergeCand < pcCU->getSlice()->getMaxNumMergeCand(); ++uiMergeCand )
     3069  {
     3070    uhInterDirNeighbours[uiMergeCand] = 0;
     3071    cMvFieldNeighbours[0 + 2*uiMergeCand].setMvField(TComMv(), NOT_VALID);
     3072    cMvFieldNeighbours[1 + 2*uiMergeCand].setMvField(TComMv(), NOT_VALID);
     3073  }
     3074#endif
    30413075  pcCU->getPartIndexAndSize( iPUIdx, uiAbsPartIdx, iWidth, iHeight );
    30423076  UInt uiDepth = pcCU->getDepth( uiAbsPartIdx );
     
    30603094  for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
    30613095  {
    3062     {
     3096#if REF_IDX_ME_ZEROMV
     3097    Bool bZeroMVILR = pcCU->xCheckZeroMVILRMerge(uhInterDirNeighbours[uiMergeCand], cMvFieldNeighbours[0 + 2*uiMergeCand], cMvFieldNeighbours[1 + 2*uiMergeCand]);
     3098    if(bZeroMVILR)
     3099    {
     3100#endif
    30633101      UInt uiCostCand = MAX_UINT;
    30643102      UInt uiBitsCand = 0;
     
    30843122        uiMergeIndex = uiMergeCand;
    30853123      }
    3086     }
     3124#if REF_IDX_ME_ZEROMV
     3125    }
     3126#endif
    30873127  }
    30883128}
     
    32093249    UInt          uiBitsTempL0[MAX_NUM_REF];
    32103250
     3251#if (ENCODER_FAST_MODE)
     3252    Bool          testILR;
     3253#endif
     3254
    32113255    xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits);
    32123256   
     
    32303274      RefPicList  eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
    32313275     
     3276#if (ENCODER_FAST_MODE)
     3277      if (pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1)
     3278      {
     3279        testILR = false;
     3280      }
     3281      else
     3282      {
     3283        testILR = true;
     3284      }
     3285#endif
     3286
    32323287      for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ )
    32333288      {
     3289#if (ENCODER_FAST_MODE)
     3290        TComPic* pcPic    = pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxTemp );
     3291        if( !testILR && pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N) )
     3292        {
     3293          continue;
     3294        }
     3295#endif
     3296
    32343297        uiBitsTemp = uiMbBits[iRefList];
    32353298        if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 )
     
    32483311        if(pcCU->getSlice()->getMvdL1ZeroFlag() && iRefList==1 && biPDistTemp < bestBiPDist)
    32493312        {
     3313#if REF_IDX_ME_ZEROMV
     3314          Bool bZeroMVILR = pcCU->xCheckZeroMVILRMvdL1Zero(iRefList, iRefIdxTemp, aaiMvpIdx[iRefList][iRefIdxTemp]);
     3315          if(bZeroMVILR)
     3316          {
     3317#endif
    32503318          bestBiPDist = biPDistTemp;
    32513319          bestBiPMvpL1 = aaiMvpIdx[iRefList][iRefIdxTemp];
    32523320          bestBiPRefIdxL1 = iRefIdxTemp;
     3321#if REF_IDX_ME_ZEROMV
     3322          }
     3323#endif
    32533324        }
    32543325
     
    33433414        }
    33443415
     3416#if ENCODER_BUGFIX
     3417        if ( ( iRefList == 0 && uiCostTemp < uiCost[iRefList] ) ||
     3418            ( iRefList == 1 &&  pcCU->getSlice()->getNoBackPredFlag() && iRefIdxTemp == iRefIdx[0] ) ||
     3419            ( iRefList == 1 && !pcCU->getSlice()->getNoBackPredFlag() && uiCostTemp < uiCost[iRefList] ) )
     3420#else
    33453421        if ( ( iRefList == 0 && uiCostTemp < uiCost[iRefList] ) ||
    33463422            ( iRefList == 1 &&  pcCU->getSlice()->getNoBackPredFlag() && iRefIdxTemp == iRefIdx[0] ) ||
    33473423            ( iRefList == 1 && (pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0) && (iRefIdxTemp==0 || iRefIdxTemp == iRefIdx[0]) && !pcCU->getSlice()->getNoBackPredFlag() && (iRefIdxTemp == pcCU->getSlice()->getRefIdxOfL0FromRefIdxOfL1(iRefIdxTemp)) ) ||
    33483424            ( iRefList == 1 && !pcCU->getSlice()->getNoBackPredFlag() && uiCostTemp < uiCost[iRefList] ) )
     3425#endif
    33493426          {
    33503427            uiCost[iRefList] = uiCostTemp;
     
    33753452    }
    33763453    //  Bi-directional prediction
     3454#if REF_IDX_ME_ZEROMV
     3455    if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) && !(pcCU->getSlice()->getMvdL1ZeroFlag() && bestBiPDist == MAX_INT) )
     3456#else
    33773457    if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) )
     3458#endif
    33783459    {
    33793460     
     
    34493530        Bool bChanged = false;
    34503531       
     3532#if (ENCODER_FAST_MODE)
     3533        Bool     testIter = true;
     3534        TComPic* pcPic    = pcCU->getSlice()->getRefPic( RefPicList(1 - iRefList), iRefIdxBi[1 - iRefList] );
     3535        if(pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N))
     3536          testIter = false;  //the fixed part is ILR, skip this iteration       
     3537        if(testIter)
     3538        {
     3539#endif
    34513540        iRefStart = 0;
    34523541        iRefEnd   = pcCU->getSlice()->getNumRefIdx(eRefPicList)-1;
     
    34543543        for ( Int iRefIdxTemp = iRefStart; iRefIdxTemp <= iRefEnd; iRefIdxTemp++ )
    34553544        {
     3545#if (ENCODER_FAST_MODE)
     3546            Bool testRefIdx = true;
     3547            pcPic           = pcCU->getSlice()->getRefPic( RefPicList(iRefList) , iRefIdxTemp );
     3548            if(pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N))
     3549              testRefIdx = false;  //the refined part is ILR, skip this reference pic           
     3550            if(testRefIdx)
     3551            {
     3552#endif
    34563553          uiBitsTemp = uiMbBits[2] + uiMotBits[1-iRefList];
    34573554          if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 )
     
    34873584            }
    34883585          }
     3586#if (ENCODER_FAST_MODE)
     3587            }
     3588#endif
     3589          }
     3590#if (ENCODER_FAST_MODE)
    34893591        } // for loop-iRefIdxTemp
     3592#endif
    34903593       
    34913594        if ( !bChanged )
     
    41044207  setWpScalingDistParam( pcCU, iRefIdxPred, eRefPicList );
    41054208  //  Do integer search
     4209#if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV
     4210#if REF_IDX_ME_AROUND_ZEROMV
     4211  if( pcCU->getSlice()->getRefPic(eRefPicList, iRefIdxPred )->getIsILR())  //ILR reference pic
     4212  {
     4213    xPatternSearchILR  ( pcCU, pcPatternKey, piRefY, iRefStride, rcMv, ruiCost );
     4214  }
     4215  else  //non ILR reference pic
     4216  {
    41064217  if ( !m_iFastSearch || bBi )
    41074218  {
     
    41124223    rcMv = *pcMvPred;
    41134224    xPatternSearchFast  ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
    4114   }
     4225    }
     4226  }
     4227#endif
     4228#if REF_IDX_ME_ZEROMV
     4229  if( pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxPred )->getIsILR())  //ILR reference pic
     4230  {
     4231    rcMv.setZero();  //use Mv(0, 0) for integer ME
     4232  }
     4233  else  //non ILR reference pic
     4234  {
     4235    if ( !m_iFastSearch || bBi )
     4236    {
     4237      xPatternSearch      ( pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
     4238    }
     4239    else
     4240    {
     4241      rcMv = *pcMvPred;
     4242      xPatternSearchFast  ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
     4243    }
     4244  }
     4245#endif
     4246#else
     4247  if ( !m_iFastSearch || bBi )
     4248  {
     4249    xPatternSearch      ( pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
     4250  }
     4251  else
     4252  {
     4253    rcMv = *pcMvPred;
     4254    xPatternSearchFast  ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost );
     4255  }
     4256#endif
    41154257 
    41164258  m_pcRdCost->getMotionCost( 1, 0 );
     
    41184260 
    41194261  {
     4262#if REF_IDX_ME_ZEROMV
     4263    if( pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxPred )->getIsILR())  //ILR reference pic
     4264    {
     4265      xPatternSearchFracDIFMv0( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost, bBi );
     4266    }
     4267    else    //non ILR reference pic
     4268    {
     4269      xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost, bBi );
     4270    }
     4271#else
    41204272    xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost
    41214273                          ,bBi
    41224274                          );
     4275#endif
    41234276  }
    41244277 
     
    44574610Void TEncSearch::encodeResAndCalcRdInterCU( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* pcYuvPred, TComYuv*& rpcYuvResi, TComYuv*& rpcYuvResiBest, TComYuv*& rpcYuvRec, Bool bSkipRes )
    44584611{
     4612#if NO_RESIDUAL_FLAG_FOR_BLPRED
     4613  if ( pcCU->isIntra(0) && !pcCU->isIntraBL(0))
     4614#else
    44594615  if ( pcCU->isIntra(0) )
     4616#endif
    44604617  {
    44614618    return;
     
    45684725      pcCU->setTransformSkipSubParts ( 0, 0, 0, 0, pcCU->getDepth(0) );
    45694726    }
     4727#if NO_RESIDUAL_FLAG_FOR_BLPRED
     4728    else if(pcCU->getLayerId() > 0 && pcCU->isIntraBL(0) && uiZeroDistortion == uiDistortion) // all zeros
     4729    {
     4730      const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (pcCU->getDepth(0) << 1);
     4731      ::memset( pcCU->getTransformIdx()      , 0, uiQPartNum * sizeof(UChar) );
     4732      ::memset( pcCU->getCbf( TEXT_LUMA )    , 0, uiQPartNum * sizeof(UChar) );
     4733      ::memset( pcCU->getCbf( TEXT_CHROMA_U ), 0, uiQPartNum * sizeof(UChar) );
     4734      ::memset( pcCU->getCbf( TEXT_CHROMA_V ), 0, uiQPartNum * sizeof(UChar) );
     4735      ::memset( pcCU->getCoeffY()            , 0, uiWidth * uiHeight * sizeof( TCoeff )      );
     4736      ::memset( pcCU->getCoeffCb()           , 0, uiWidth * uiHeight * sizeof( TCoeff ) >> 2 );
     4737      ::memset( pcCU->getCoeffCr()           , 0, uiWidth * uiHeight * sizeof( TCoeff ) >> 2 );
     4738      pcCU->setTransformSkipSubParts ( 0, 0, 0, 0, pcCU->getDepth(0) );
     4739    }
     4740#endif
    45704741    else
    45714742    {
     
    48665037      Int scalingListType = 3 + g_eTTable[(Int)TEXT_LUMA];
    48675038      assert(scalingListType < 6);     
     5039#if NO_RESIDUAL_FLAG_FOR_BLPRED
     5040      if(pcCU->isIntraBL(uiAbsPartIdx) )
     5041      {
     5042        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,DC_IDX, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only
     5043      }
     5044      else
     5045      {
     5046        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only
     5047      }
     5048#else
    48685049      m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only
     5050#endif
    48695051     
    48705052      const UInt uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),
     
    51365318        assert(scalingListType < 6);     
    51375319
     5320#if NO_RESIDUAL_FLAG_FOR_BLPRED
     5321        if(pcCU->isIntraBL(uiAbsPartIdx) )
     5322        {
     5323          m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,DC_IDX, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType, true );
     5324        }
     5325        else
     5326        {
     5327          m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType, true );
     5328        }
     5329#else
    51385330        m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),  pcCoeffCurrY, trWidth, trHeight, scalingListType, true );
     5331#endif
    51395332
    51405333        uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(),
     
    54675660
    54685661  {
     5662#if INTRA_BL
     5663#if NO_RESIDUAL_FLAG_FOR_BLPRED
     5664    assert( !pcCU->isIntra(uiAbsPartIdx) || pcCU->isIntraBL(uiAbsPartIdx));
     5665#else
     5666    assert( !pcCU->isIntra(uiAbsPartIdx) );
     5667#endif
     5668#else
    54695669    assert( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA );
     5670#endif
    54705671    if( bSubdivAndCbf )
    54715672    {
     
    57015902    }
    57025903    m_pcEntropyCoder->encodeSkipFlag ( pcCU, 0, true );
     5904#if INTRA_BL
     5905    if(m_pcEncCfg->getLayerId())
     5906    {
     5907      m_pcEntropyCoder->encodeIntraBLFlag(pcCU, 0, true);
     5908#if !NO_RESIDUAL_FLAG_FOR_BLPRED
     5909      assert( pcCU->isIntraBL( 0 ) == false );
     5910#endif
     5911    }
     5912#endif
     5913#if NO_RESIDUAL_FLAG_FOR_BLPRED
     5914    if( !pcCU->isIntraBL(0))
     5915    {
     5916#endif
    57035917    m_pcEntropyCoder->encodePredMode( pcCU, 0, true );
    57045918    m_pcEntropyCoder->encodePartSize( pcCU, 0, pcCU->getDepth(0), true );
    57055919    m_pcEntropyCoder->encodePredInfo( pcCU, 0, true );
     5920#if NO_RESIDUAL_FLAG_FOR_BLPRED
     5921    }
     5922#endif
    57065923    Bool bDummy = false;
    57075924    m_pcEntropyCoder->encodeCoeff   ( pcCU, 0, pcCU->getDepth(0), pcCU->getWidth(0), pcCU->getHeight(0), bDummy );
     
    59526169}
    59536170
     6171#if REF_IDX_ME_ZEROMV
     6172Void TEncSearch::xPatternSearchFracDIFMv0(TComDataCU* pcCU,
     6173                                          TComPattern* pcPatternKey,
     6174                                          Pel* piRefY,
     6175                                          Int iRefStride,
     6176                                          TComMv* pcMvInt,
     6177                                          TComMv& rcMvHalf,
     6178                                          TComMv& rcMvQter,
     6179                                          UInt& ruiCost,
     6180                                          Bool biPred
     6181                                          )
     6182{
     6183  assert(pcMvInt->getHor() == 0 && pcMvInt->getVer() == 0);
     6184  Int         iOffset    = pcMvInt->getHor() + pcMvInt->getVer() * iRefStride;
     6185  m_pcRdCost->setDistParam( pcPatternKey, piRefY + iOffset, iRefStride, 1, m_cDistParam, m_pcEncCfg->getUseHADME() );
     6186  m_pcRdCost->setCostScale ( 2 );
     6187  setDistParamComp(0);
     6188  ruiCost = m_cDistParam.DistFunc( &m_cDistParam );  //SATD
     6189  ruiCost += m_pcRdCost->getCost( pcMvInt->getHor(), pcMvInt->getVer() );  //SATD rdCost
     6190  rcMvHalf.setZero();
     6191  rcMvQter.setZero();
     6192}
     6193#endif
     6194
     6195#if REF_IDX_ME_AROUND_ZEROMV
     6196//ILR integer pixel motion estimation search
     6197//pcCU is CU pointer
     6198//pcPatterney contains target PU infor
     6199//piRefY is the PU at the same position as the source PU, but in the reference pic
     6200//iRefStride is the reference stride
     6201//rcMv output best integer MV
     6202//ruiSAD outputs the SAD of best integer MV
     6203Void TEncSearch::xPatternSearchILR( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv& rcMv, UInt& ruiSAD )
     6204{
     6205  Int      candMvX[5] = {0, -1, 1,  0, 0};
     6206  Int      candMvY[5] = {0,  0, 0, -1, 1};
     6207  Int      numCand    = 1;
     6208  Int      iBestX = 0;
     6209  Int      iBestY = 0;
     6210  Int      uiSadBest = MAX_UINT;
     6211  UInt     uiSad;
     6212
     6213  Pel*  piRefSrch;
     6214
     6215  //-- jclee for using the SAD function pointer
     6216  m_pcRdCost->setDistParam( pcPatternKey, piRefY, iRefStride,  m_cDistParam );
     6217
     6218  // fast encoder decision: use subsampled SAD for integer ME
     6219  if ( m_pcEncCfg->getUseFastEnc() )
     6220  {
     6221    if ( m_cDistParam.iRows > 8 )
     6222    {
     6223      m_cDistParam.iSubShift = 1;
     6224    }
     6225  }
     6226
     6227  for(Int candId = 0; candId < numCand; candId++)
     6228  {
     6229    piRefSrch         = piRefY + (candMvY[candId] * iRefStride) + candMvX[candId];
     6230    m_cDistParam.pCur = piRefSrch;
     6231
     6232    setDistParamComp(0);
     6233   
     6234    uiSad = m_cDistParam.DistFunc( &m_cDistParam );  //SAD
     6235
     6236    //motion cost
     6237    uiSad += m_pcRdCost->getCost( candMvX[candId], candMvY[candId] );  //SAD rdCost
     6238
     6239    if(uiSad < uiSadBest)
     6240    {
     6241      uiSadBest = uiSad;
     6242      iBestX    = candMvX[candId];
     6243      iBestY    = candMvY[candId];
     6244    }
     6245  }
     6246
     6247  rcMv.set( iBestX, iBestY );
     6248
     6249  ruiSAD = uiSadBest - m_pcRdCost->getCost( iBestX, iBestY );
     6250  return;
     6251}
     6252#endif
     6253
     6254#if ENCODER_FAST_MODE
     6255Bool TEncSearch::predInterSearchILRUni( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv )
     6256{
     6257  rpcPredYuv->clear();
     6258  rpcRecoYuv->clear();
     6259
     6260  Int           iNumPredDir = pcCU->getSlice()->isInterP() ? 1 : 2;
     6261
     6262  TComMv        cMv[2];
     6263  TComMv        cMvPred[2][33];
     6264  TComMv        cMvTemp[2][33];
     6265  TComMv        TempMv;
     6266
     6267  Int           iRefIdx[2]={0,0};
     6268
     6269  Int           aaiMvpIdx[2][33];
     6270  Int           aaiMvpNum[2][33];
     6271
     6272  UInt          uiMbBits[3] = {1, 1, 0};
     6273  UInt          uiLastMode = 0;
     6274
     6275  UInt          uiCost[2]   = { MAX_UINT, MAX_UINT };     //uni, rdCost
     6276  UInt          uiCostTemp;
     6277  UInt          biPDistTemp = MAX_INT;
     6278  UInt          uiBitsTemp;
     6279
     6280  PartSize      ePartSize = pcCU->getPartitionSize( 0 );  //2Nx2N
     6281  Int           iPartIdx  = 0;                            //one PU in CU
     6282  UInt          uiPartAddr;
     6283  Int           iRoiWidth, iRoiHeight;
     6284
     6285  xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits);
     6286  pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iRoiWidth, iRoiHeight );
     6287
     6288  for( Int iRefList = 0; iRefList < iNumPredDir; iRefList++)  //list
     6289  {
     6290    RefPicList  eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 );
     6291
     6292    Int  iRefIdxTemp = -1;
     6293    Bool foundILR    = false;
     6294    for( Int refIdx = 0; refIdx < pcCU->getSlice()->getNumRefIdx(eRefPicList); refIdx++ )
     6295      if( pcCU->getSlice()->getRefPic(eRefPicList, refIdx)->getIsILR() )
     6296      {
     6297        iRefIdxTemp = refIdx;
     6298        foundILR    = true;
     6299        break;
     6300      }
     6301
     6302    if(!foundILR)  //no ILR in eRefPiclist
     6303      continue; 
     6304
     6305    uiBitsTemp = uiMbBits[iRefList];
     6306    if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 )
     6307    {
     6308      uiBitsTemp += iRefIdxTemp+1;
     6309      if ( iRefIdxTemp == pcCU->getSlice()->getNumRefIdx(eRefPicList)-1 ) uiBitsTemp--;
     6310    }
     6311
     6312    xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp);
     6313    aaiMvpIdx[iRefList][iRefIdxTemp] = pcCU->getMVPIdx(eRefPicList, uiPartAddr);
     6314    aaiMvpNum[iRefList][iRefIdxTemp] = pcCU->getMVPNum(eRefPicList, uiPartAddr);
     6315
     6316    uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdx[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS];
     6317
     6318    xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp );
     6319    xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPred[iRefList][iRefIdxTemp], aaiMvpIdx[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp);
     6320
     6321    if( uiCostTemp < uiCost[iRefList] )
     6322    {
     6323      uiCost[iRefList] = uiCostTemp;
     6324
     6325      cMv[iRefList]     = cMvTemp[iRefList][iRefIdxTemp];
     6326      iRefIdx[iRefList] = iRefIdxTemp;
     6327
     6328      pcCU->getCUMvField(eRefPicList)->setAllMv( cMv[iRefList], ePartSize, uiPartAddr, 0, iPartIdx );
     6329      pcCU->getCUMvField(eRefPicList)->setAllRefIdx( iRefIdx[iRefList], ePartSize, uiPartAddr, 0, iPartIdx );
     6330    }
     6331  }
     6332
     6333  if( uiCost[0] == MAX_UINT && uiCost[1] == MAX_UINT )  //no ILR in both list0 and list1
     6334    return false;
     6335
     6336  //  Clear Motion Field
     6337  pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( TComMvField(), ePartSize, uiPartAddr, 0, iPartIdx );
     6338  pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( TComMvField(), ePartSize, uiPartAddr, 0, iPartIdx );
     6339  pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd    ( TComMv(),      ePartSize, uiPartAddr, 0, iPartIdx );
     6340  pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd    ( TComMv(),      ePartSize, uiPartAddr, 0, iPartIdx );
     6341
     6342  pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6343  pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6344  pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6345  pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6346
     6347  if( uiCost[0] <= uiCost[1] )  //list0 ILR
     6348  {
     6349    pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv    ( cMv[0], ePartSize, uiPartAddr, 0, iPartIdx );
     6350    pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx );
     6351
     6352    TempMv = cMv[0] - cMvPred[0][iRefIdx[0]];
     6353    pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd( TempMv, ePartSize, uiPartAddr, 0, iPartIdx );
     6354
     6355    pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
     6356
     6357    pcCU->setMVPIdxSubParts( aaiMvpIdx[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6358    pcCU->setMVPNumSubParts( aaiMvpNum[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6359  }
     6360  else if( uiCost[1] < uiCost[0] )  //list1 ILR
     6361  {
     6362    pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv    ( cMv[1], ePartSize, uiPartAddr, 0, iPartIdx );
     6363    pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx );
     6364
     6365    TempMv = cMv[1] - cMvPred[1][iRefIdx[1]];
     6366    pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd( TempMv, ePartSize, uiPartAddr, 0, iPartIdx );
     6367
     6368    pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) );
     6369
     6370    pcCU->setMVPIdxSubParts( aaiMvpIdx[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6371    pcCU->setMVPNumSubParts( aaiMvpNum[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr));
     6372  }
     6373  else
     6374    assert(0);
     6375
     6376  pcCU->setMergeFlagSubParts( false, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) );
     6377
     6378  motionCompensation ( pcCU, rpcPredYuv, REF_PIC_LIST_X, iPartIdx );
     6379
     6380  setWpScalingDistParam( pcCU, -1, REF_PIC_LIST_X );
     6381
     6382  return true;
     6383}
     6384
     6385
     6386#endif
     6387
     6388#if INTRA_BL
     6389Void
     6390TEncSearch::estIntraBLPredQT( TComDataCU* pcCU,
     6391                           TComYuv*    pcOrgYuv,
     6392                           TComYuv*    pcPredYuv,
     6393                           TComYuv*    pcResiYuv,
     6394                           TComYuv*    pcRecoYuv )
     6395{
     6396  UInt    uiDepth        = pcCU->getDepth(0);
     6397  UInt    uiOverallDistY = 0;
     6398  UInt    uiOverallDistC = 0;
     6399 
     6400  //===== set QP and clear Cbf =====
     6401  if ( pcCU->getSlice()->getPPS()->getUseDQP() == true)
     6402  {
     6403    pcCU->setQPSubParts( pcCU->getQP(0), 0, uiDepth );
     6404  }
     6405  else
     6406  {
     6407    pcCU->setQPSubParts( pcCU->getSlice()->getSliceQp(), 0, uiDepth );
     6408  }
     6409 
     6410  //===== init pattern for luma prediction =====
     6411  Bool bAboveAvail = false;
     6412  Bool bLeftAvail  = false;
     6413  pcCU->getPattern()->initPattern   ( pcCU, 0, 0 );
     6414  pcCU->getPattern()->initAdiPattern( pcCU, 0, 0, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail );
     6415 
     6416  pcCU->setLumaIntraDirSubParts ( DC_IDX, 0, uiDepth );
     6417 
     6418  // set context models
     6419  if( m_bUseSBACRD )
     6420  {
     6421    m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] );
     6422  }
     6423 
     6424  // determine residual for partition
     6425  Double dPUCost   = 0.0;
     6426  xRecurIntraCodingQT( pcCU, 0, 0, false, pcOrgYuv, pcPredYuv, pcResiYuv, uiOverallDistY, uiOverallDistC, false, dPUCost );
     6427  xSetIntraResultQT( pcCU, 0, 0, false, pcRecoYuv );
     6428 
     6429  //=== update PU data ====
     6430  pcCU->copyToPic( uiDepth, 0, 0 );
     6431   
     6432  //===== reset context models =====
     6433  if(m_bUseSBACRD)
     6434  {
     6435    m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]);
     6436  }
     6437
     6438  //===== set distortion (rate and r-d costs are determined later) =====
     6439  pcCU->getTotalDistortion() = uiOverallDistY + uiOverallDistC;
     6440}
     6441
     6442#endif
    59546443//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSearch.h

    r51 r54  
    9797  TEncCfg*        m_pcEncCfg;
    9898 
     99#if SVC_EXTENSION
     100  TEncTop**       m_ppcTEncTop;
     101#if INTRA_BL
     102  TComPicYuv*     m_pcPicYuvRecBase;       ///< reconstructed base layer
     103#endif
     104#endif
     105 
    99106  // interface to classes
    100107  TComTrQuant*    m_pcTrQuant;
     
    186193                                  UInt        uiPreCalcDistC );
    187194 
     195#if INTRA_BL
     196  Void setBaseRecPic            ( TComPicYuv* pcPicYuvRecBase ) { m_pcPicYuvRecBase = pcPicYuvRecBase; } 
     197  TComPicYuv* getBaseRecPic     ()                              { return m_pcPicYuvRecBase; }
     198  Void  estIntraBLPredQT        ( TComDataCU* pcCU,
     199                                  TComYuv*    pcOrgYuv,
     200                                  TComYuv*    pcPredYuv,
     201                                  TComYuv*    pcResiYuv,
     202                                  TComYuv*    pcRecoYuv );
     203#endif
    188204 
    189205  /// encoder estimation - inter prediction (non-skip)
     
    198214#endif
    199215                                );
     216 
     217#if (ENCODER_FAST_MODE)
     218  Bool predInterSearchILRUni    ( TComDataCU* pcCU,
     219                                  TComYuv*    pcOrgYuv,
     220                                  TComYuv*&   rpcPredYuv,
     221                                  TComYuv*&   rpcResiYuv,
     222                                  TComYuv*&   rpcRecoYuv
     223                                );
     224
     225#endif
    200226 
    201227  /// encode residual and compute rd-cost for inter mode
     
    436462                                   ,Bool biPred
    437463                                   );
    438  
     464#if REF_IDX_ME_AROUND_ZEROMV
     465  Void xPatternSearchILR         ( TComDataCU*    pcCU,
     466                                   TComPattern*   pcPatternKey,
     467                                   Pel*           piRefY,
     468                                   Int            iRefStride,
     469                                   TComMv&        rcMv,
     470                                   UInt&          ruiSAD );
     471#endif
     472 
     473#if REF_IDX_ME_ZEROMV
     474  Void xPatternSearchFracDIFMv0  ( TComDataCU*   pcCU,
     475                                   TComPattern*  pcPatternKey,
     476                                   Pel*          piRefY,
     477                                   Int           iRefStride,
     478                                   TComMv*       pcMvInt,
     479                                   TComMv&       rcMvHalf,
     480                                   TComMv&       rcMvQter,
     481                                   UInt&         ruiCost,
     482                                   Bool          biPred );
     483#endif
    439484  Void xExtDIFUpSamplingH( TComPattern* pcPattern, Bool biPred  );
    440485  Void xExtDIFUpSamplingQ( TComPattern* pcPatternKey, TComMv halfPelRef, Bool biPred );
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSlice.cpp

    r51 r54  
    137137  m_pcCfg             = pcEncTop;
    138138  m_pcListPic         = pcEncTop->getListPic();
    139  
     139#if SVC_EXTENSION
     140  m_ppcTEncTop        = pcEncTop->getLayerEnc();
     141#endif 
    140142  m_pcGOPEncoder      = pcEncTop->getGOPEncoder();
    141143  m_pcCuEncoder       = pcEncTop->getCuEncoder();
     
    186188  rpcSlice->setSliceBits(0);
    187189  rpcSlice->setPic( pcPic );
     190#if SET_SLICE_LAYER_ID
     191  rpcSlice->initSlice( pcPic->getLayerId() );
     192#else
    188193  rpcSlice->initSlice();
     194#endif
    189195  rpcSlice->setPicOutputFlag( true );
    190196  rpcSlice->setPOC( pocCurr );
     197#if SVC_EXTENSION && !SET_SLICE_LAYER_ID
     198  rpcSlice->setLayerId( pcPic->getLayerId());
     199#endif
    191200 
    192201  // depth computation based on GOP size
     
    369378  eSliceType = (pocLast == 0 || pocCurr % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType;
    370379 
     380#if REF_IDX_FRAMEWORK
     381  if(m_pcCfg->getLayerId() > 0)
     382  {
     383    eSliceType=B_SLICE;
     384  }
     385#endif
    371386  rpcSlice->setSliceType        ( eSliceType );
    372387#endif
     
    877892  UInt uiTileStartLCU = 0;
    878893  UInt uiTileLCUX     = 0;
     894
     895#if INTRA_BL
     896  m_pcCuEncoder->setBaseRecPic( rpcPic->getLayerId() > 0 ? rpcPic->getFullPelBaseRec() : NULL);
     897#endif
     898
    879899  Bool depSliceSegmentsEnabled = pcSlice->getPPS()->getDependentSliceSegmentsEnabledFlag();
    880900  uiCUAddr = rpcPic->getPicSym()->getCUOrderMap( uiStartCUAddr /rpcPic->getNumPartInCU());
     
    924944    TComDataCU*& pcCU = rpcPic->getCU( uiCUAddr );
    925945    pcCU->initCU( rpcPic, uiCUAddr );
     946#if SVC_EXTENSION
     947    pcCU->setLayerId(m_pcCfg->getLayerId());
     948#endif
    926949
    927950#if !RATE_CONTROL_LAMBDA_DOMAIN
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSlice.h

    r51 r54  
    6666  TEncCfg*                m_pcCfg;                              ///< encoder configuration class
    6767 
     68#if SVC_EXTENSION
     69  TEncTop**               m_ppcTEncTop;
     70#endif 
     71
    6872  // pictures
    6973  TComList<TComPic*>*     m_pcListPic;                          ///< list of pictures
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncTop.cpp

    r51 r54  
    4545//! \ingroup TLibEncoder
    4646//! \{
     47#if SVC_EXTENSION 
     48Int TEncTop::m_iSPSIdCnt = 0;
     49Int TEncTop::m_iPPSIdCnt = 0;
     50#endif
    4751
    4852// ====================================================================================================================
     
    7882  m_pcBitCounters          = NULL;
    7983  m_pcRdCosts              = NULL;
     84#if REF_IDX_FRAMEWORK
     85  memset(m_cIlpPic, 0, sizeof(m_cIlpPic));
     86#endif
     87#if REF_IDX_MFM
     88  m_bMFMEnabledFlag = false;
     89#endif
    8090}
    8191
     
    8999Void TEncTop::create ()
    90100{
     101#if !SVC_EXTENSION
    91102  // initialize global variables
    92103  initROM();
     104#endif
    93105 
    94106  // create processing unit classes
     107#if SVC_EXTENSION
     108  m_cGOPEncoder.        create( m_layerId );
     109#else
    95110  m_cGOPEncoder.        create();
     111#endif
    96112  m_cSliceEncoder.      create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth );
    97113  m_cCuEncoder.         create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight );
     
    268284  delete[] m_pcRdCosts;
    269285 
     286#if !SVC_EXTENSION
    270287  // destroy ROM
    271288  destroyROM();
    272  
     289#endif
     290#if REF_IDX_FRAMEWORK
     291  for(Int i=0; i<MAX_NUM_REF; i++)
     292  {
     293    if(m_cIlpPic[i])
     294    {
     295      //m_cIlpPic[i]->setPicYuvRec(NULL);
     296      m_cIlpPic[i]->destroy();
     297      delete m_cIlpPic[i];
     298      m_cIlpPic[i] = NULL;
     299    }
     300  }   
     301#endif
    273302  return;
    274303}
     
    313342
    314343  m_iMaxRefPicNum = 0;
     344#if SVC_EXTENSION
     345  m_iSPSIdCnt ++;
     346  m_iPPSIdCnt ++;
     347#endif
     348#if REF_IDX_FRAMEWORK
     349  xInitILRP();
     350#endif
    315351}
    316352
     
    345381 \retval  iNumEncoded         number of encoded pictures
    346382 */
    347 Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
     383#if SVC_EXTENSION
     384Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP )
     385{
     386  // compress GOP
     387#if RATE_CONTROL_LAMBDA_DOMAIN
     388  if ( m_RCEnableRateControl )
     389  {
     390    m_cRateCtrl.initRCGOP( m_iNumPicRcvd );
     391  }
     392#endif
     393
     394  // compress GOP
     395  m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut);
     396
     397#if RATE_CONTROL_LAMBDA_DOMAIN
     398  if ( m_RCEnableRateControl )
     399  {
     400    m_cRateCtrl.destroyRCGOP();
     401  }
     402#endif
     403 
     404  m_uiNumAllPicCoded ++;
     405}
     406
     407Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg )
    348408{
    349409  if (pcPicYuvOrg) {
     
    359419    }
    360420  }
     421}
     422#else
     423Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded )
     424{
     425  if (pcPicYuvOrg) {
     426    // get original YUV
     427    TComPic* pcPicCurr = NULL;
     428    xGetNewPicBuffer( pcPicCurr );
     429    pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() );
     430
     431    // compute image characteristics
     432    if ( getUseAdaptiveQP() )
     433    {
     434      m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) );
     435    }
     436  }
    361437 
    362438  if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize))
     
    387463  m_uiNumAllPicCoded += iNumEncoded;
    388464}
     465#endif
    389466
    390467// ====================================================================================================================
     
    421498    {
    422499      TEncPic* pcEPic = new TEncPic;
     500#if SVC_EXTENSION //Temporal solution, should be modified
     501      if(m_layerId > 0)
     502      {
     503        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
     504        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
     505        {
     506          pcEPic->setSpatialEnhLayerFlag( true );
     507        }
     508      }
     509#endif
     510
     511#if SVC_UPSAMPLING
     512      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
     513                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
     514#else
    423515      pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 ,
    424516                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
     517#endif
    425518      rpcPic = pcEPic;
    426519    }
     
    429522      rpcPic = new TComPic;
    430523
     524#if SVC_EXTENSION //Temporal solution, should be modified
     525      if(m_layerId > 0)
     526      {
     527        TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 );
     528        if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() )
     529        {
     530          rpcPic->setSpatialEnhLayerFlag( true );
     531        }
     532      }
     533#endif
     534
     535#if SVC_UPSAMPLING
     536      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
     537                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS);
     538#else
    431539      rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth,
    432540                      m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics);
     541#endif
    433542    }
    434543    if (getUseSAO())
     
    450559Void TEncTop::xInitSPS()
    451560{
     561#if SVC_EXTENSION
     562  m_cSPS.setLayerId(m_layerId);
     563#endif
     564#if REF_IDX_MFM
     565  m_cSPS.setMFMEnabledFlag(m_bMFMEnabledFlag);
     566#endif
    452567  ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL();
    453568  profileTierLevel.setLevelIdc(m_level);
     
    484599  m_cSPS.setMinTrDepth    ( 0                   );
    485600  m_cSPS.setMaxTrDepth    ( 1                   );
     601#if SVC_EXTENSION
     602  m_cSPS.setSPSId         ( m_iSPSIdCnt       );
     603#endif
    486604 
    487605  m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize);
     
    690808    }
    691809  }
     810#if SVC_EXTENSION
     811  m_cPPS.setPPSId         ( m_iPPSIdCnt         );
     812  m_cPPS.setSPSId         ( m_iSPSIdCnt         );
     813#endif
    692814}
    693815
     
    9811103  }
    9821104}
     1105
     1106#if REF_IDX_FRAMEWORK
     1107Void TEncTop::xInitILRP()
     1108{
     1109  if(m_layerId>0)
     1110  {
     1111    if (m_cIlpPic[0] == NULL)
     1112    {
     1113      for (Int j=0; j<1/*MAX_NUM_REF*/; j++)
     1114      {
     1115        m_cIlpPic[j] = new  TComPic;
     1116        //m_cIlpPic[j]->createWithOutYuv(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true);
     1117#if SVC_UPSAMPLING
     1118        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true);
     1119#else
     1120        m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, true);
     1121#endif
     1122#if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM
     1123        m_cIlpPic[j]->setIsILR(true);
     1124#endif
     1125        for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++)
     1126        {
     1127          m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i);
     1128        }
     1129      }
     1130    }
     1131  }
     1132}
     1133
     1134Void TEncTop::setILRPic(TComPic *pcPic)
     1135{
     1136  if(m_cIlpPic[0])
     1137  {
     1138    //m_cIlpPic[0]->setPicYuvRec(pcPic->getFullPelBaseRec());
     1139    m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec());
     1140    m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC());
     1141    m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false);
     1142    m_cIlpPic[0]->getPicYuvRec()->extendPicBorder();
     1143  }
     1144}
     1145#endif
    9831146//! \}
  • branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncTop.h

    r51 r54  
    7373  UInt                    m_uiNumAllPicCoded;             ///< number of coded pictures
    7474  TComList<TComPic*>      m_cListPic;                     ///< dynamic list of pictures
     75#if SVC_EXTENSION
     76  static Int              m_iSPSIdCnt;                    ///< next Id number for SPS   
     77  static Int              m_iPPSIdCnt;                    ///< next Id number for PPS   
     78#if AVC_SYNTAX
     79  fstream*                m_pBLSyntaxFile;
     80#endif
     81#endif
    7582 
    7683  // encoder search
     
    122129  TEncRateCtrl            m_cRateCtrl;                    ///< Rate control class
    123130 
     131#if SVC_EXTENSION
     132  TEncTop**               m_ppcTEncTop;
     133  TEncTop*                getLayerEnc(UInt layer)   { return m_ppcTEncTop[layer]; }
     134#endif
     135#if REF_IDX_FRAMEWORK
     136  TComPic*                m_cIlpPic[MAX_NUM_REF];                    ///<  Inter layer Prediction picture =  upsampled picture
     137#endif
     138#if REF_IDX_MFM
     139  Bool                    m_bMFMEnabledFlag;
     140#endif
    124141protected:
    125142  Void  xGetNewPicBuffer  ( TComPic*& rpcPic );           ///< get picture buffer which will be processed
     
    129146  Void  xInitPPSforTiles  ();
    130147  Void  xInitRPS          ();                             ///< initialize PPS from encoder options
    131 
     148#if REF_IDX_FRAMEWORK
     149  Void xInitILRP();
     150#endif
    132151public:
    133152  TEncTop();
     
    174193  Void selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid );
    175194  TComScalingList*        getScalingList        () { return  &m_scalingList;         }
     195#if SVC_EXTENSION
     196  Void                    setLayerEnc(TEncTop** p) {m_ppcTEncTop = p;}
     197  TEncTop**               getLayerEnc()            {return m_ppcTEncTop;}
     198  Int                     getPOCLast            () { return m_iPOCLast;               }
     199  Int                     getNumPicRcvd         () { return m_iNumPicRcvd;            }
     200  Void                    setNumPicRcvd         ( Int num ) { m_iNumPicRcvd = num;      }
     201#endif
     202
    176203  // -------------------------------------------------------------------------------------------------------------------
    177204  // encoder function
     
    179206
    180207  /// encode several number of pictures until end-of-sequence
     208#if SVC_EXTENSION
     209#if REF_IDX_FRAMEWORK
     210  TComPic** getIlpList() { return m_cIlpPic; }
     211  Void setILRPic(TComPic *pcPic);
     212#endif
     213#if REF_IDX_MFM
     214  Void setMFMEnabledFlag       (Bool flag)   {m_bMFMEnabledFlag = flag;}
     215  Bool getMFMEnabledFlag()                   {return m_bMFMEnabledFlag;}   
     216#endif
     217#if AVC_SYNTAX
     218  Void      setBLSyntaxFile( fstream* pFile ) { m_pBLSyntaxFile = pFile; }
     219  fstream*  getBLSyntaxFile() { return m_pBLSyntaxFile; }
     220#endif
     221  Void encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut,
     222              std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP  );
     223  Void encodePrep( TComPicYuv* pcPicYuvOrg );
     224#else
    181225  Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut,
    182226              std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded ); 
     227#endif
    183228
    184229  void printSummary() { m_cGOPEncoder.printOutSummary (m_uiNumAllPicCoded); }
Note: See TracChangeset for help on using the changeset viewer.