Changeset 77 in 3DVCSoftware for trunk/source/Lib/TLibEncoder


Ignore:
Timestamp:
14 Jun 2012, 16:38:29 (13 years ago)
Author:
tech
Message:

Merged with branch/HTM-3.0Samsung REV74 including:

  • restricted residual prediction m24766
  • Inter-view residual prediction m24938
  • VPS concept m24714,m24878, m24945,m24896, m2491
  • reference list modification, restriction on IDR m24876, m24874
  • depth based motion parameter prediction m24829

Fixed bugs:

  • interview prediction
  • VSO

Added:

  • xcode project
Location:
trunk/source/Lib/TLibEncoder
Files:
16 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibEncoder/NALwrite.cpp

    r56 r77  
    6464#endif
    6565
     66#if VIDYO_VPS_INTEGRATION
     67  bsNALUHeader.write(nalu.m_temporalId, 3); // temporal_id
     68  bsNALUHeader.write(nalu.m_layerId + 1, 5); // layer_id_plus1
     69#else
    6670#if H0388
    6771  bsNALUHeader.write(nalu.m_temporalId, 3); // temporal_id
     
    9094  }
    9195#endif
     96#endif
     97 
    9298  out.write(bsNALUHeader.getByteStream(), bsNALUHeader.getByteStreamLength());
    9399
     
    201207  naluDest.m_nalRefIDC   = naluSrc.m_nalRefIDC;
    202208#endif
     209#if !VIDYO_VPS_INTEGRATION
    203210  naluDest.m_viewId      = naluSrc.m_viewId;
    204211  naluDest.m_isDepth     = naluSrc.m_isDepth;
     212#endif
    205213  naluDest.m_temporalId  = naluSrc.m_temporalId;
     214#if VIDYO_VPS_INTEGRATION
     215  naluDest.m_layerId = naluSrc.m_layerId;
     216#else
     217 
    206218#if !H0388
    207219  naluDest.m_OutputFlag  = naluSrc.m_OutputFlag;
    208220#endif
     221#endif
    209222  naluDest.m_Bitstream   = naluSrc.m_Bitstream;
    210223}
  • trunk/source/Lib/TLibEncoder/NALwrite.h

    r56 r77  
    6262    NalRefIdc nalRefIDC,
    6363#endif
     64#if VIDYO_VPS_INTEGRATION
     65    unsigned layerId,
     66#else
    6467    Int viewId,
    6568    Bool isDepth,
     69#endif
    6670    unsigned temporalID = 0)
    6771#if NAL_REF_FLAG
     72#if VIDYO_VPS_INTEGRATION
     73  : NALUnit(nalUnitType, nalRefFlag, layerId, temporalID)
     74#else
    6875  : NALUnit(nalUnitType, nalRefFlag, viewId, isDepth, temporalID)
     76#endif
     77#else
     78#if VIDYO_VPS_INTEGRATION
     79  : NALUnit(nalUnitType, nalRefIDC, layerId, temporalID)
    6980#else
    7081  : NALUnit(nalUnitType, nalRefIDC, viewId, isDepth, temporalID)
     82#endif
    7183#endif
    7284  , m_Bitstream()
  • trunk/source/Lib/TLibEncoder/TEncCavlc.cpp

    r56 r77  
    375375}
    376376
     377#if VIDYO_VPS_INTEGRATION
     378Void TEncCavlc::codeVPS( TComVPS* pcVPS )
     379{
     380        WRITE_CODE( pcVPS->getMaxTLayers() - 1,     3,        "max_temporal_layers_minus1" );
     381  WRITE_CODE( pcVPS->getMaxLayers() - 1,      5,        "max_layers_minus1" );
     382  WRITE_FLAG( pcVPS->getTemporalNestingFlag() - 1,      "temporal_id_nesting_flag" );
     383  WRITE_UVLC( pcVPS->getVPSId(),                        "video_parameter_set_id" );
     384  for(UInt i=0; i <= pcVPS->getMaxTLayers()-1; i++)
     385  {
     386    WRITE_UVLC( pcVPS->getMaxDecPicBuffering(i),           "max_dec_pic_buffering[i]" );
     387    WRITE_UVLC( pcVPS->getNumReorderPics(i),               "num_reorder_pics[i]" );
     388    WRITE_UVLC( pcVPS->getMaxLatencyIncrease(i),           "max_latency_increase[i]" );
     389  }
     390 
     391  WRITE_CODE( 1,      1,        "bit_equal_to_one" );
     392 
     393  if( pcVPS->getMaxLayers() - 1 > 0 )
     394  {
     395    WRITE_UVLC( pcVPS->getExtensionType(),                        "extension_type" );
     396   
     397    for(UInt i=1; i <= pcVPS->getMaxLayers()-1; i++)
     398    {
     399      WRITE_FLAG( pcVPS->getDependentFlag(i),                     "dependent_flag[i]" );
     400      if( pcVPS->getDependentFlag(i) )
     401      {
     402        WRITE_UVLC( i - pcVPS->getDependentLayer(i) - 1,          "delta_reference_layer_id_minus1[i]" );
     403        if( pcVPS->getExtensionType() == VPS_EXTENSION_TYPE_MULTI_VIEW )
     404        {
     405          WRITE_UVLC( pcVPS->getViewId(i),                        "view_id[i]" );
     406          WRITE_FLAG( pcVPS->getDepthFlag(i),                     "depth_flag[i]" );
     407          WRITE_SVLC( pcVPS->getViewOrderIdx(i),                  "view_order_idx[i]" );
     408        }
     409       
     410      }
     411    }
     412  }
     413 
     414  WRITE_FLAG( 0,                     "vps_extension_flag" );
     415 
     416  //future extensions here..
     417 
     418  return;
     419}
     420#endif
     421
    377422#if HHI_MPI
    378423Void TEncCavlc::codeSPS( TComSPS* pcSPS, Bool bIsDepth )
     
    388433  WRITE_CODE( pcSPS->getLevelIdc (),       8,       "level_idc" );
    389434  WRITE_UVLC( pcSPS->getSPSId (),                   "seq_parameter_set_id" );
     435#if VIDYO_VPS_INTEGRATION
     436  WRITE_UVLC( pcSPS->getVPSId (),                   "video_parameter_set_id" );
     437#endif
    390438  WRITE_UVLC( pcSPS->getChromaFormatIdc (),         "chroma_format_idc" );
    391439  WRITE_CODE( pcSPS->getMaxTLayers() - 1,  3,       "max_temporal_layers_minus1" );
     
    727775    {
    728776      WRITE_CODE( (pcSlice->getPOC()-pcSlice->getLastIDR()+(1<<pcSlice->getSPS()->getBitsForPOC()))%(1<<pcSlice->getSPS()->getBitsForPOC()), pcSlice->getSPS()->getBitsForPOC(), "pic_order_cnt_lsb");
    729 
    730       if( pcSlice->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDV )
     777#if HHI_FIX
     778      if( pcSlice->getPOC() == 0 && pcSlice->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDV )
    731779      {
    732780        TComReferencePictureSet* rps = pcSlice->getRPS();
     
    799847        }
    800848      }
     849      if( pcSlice->getPOC() != 0 )
     850#else
     851      if( pcSlice->getNalUnitType() != NAL_UNIT_CODED_SLICE_IDV )
     852#endif
     853      {
     854        TComReferencePictureSet* rps = pcSlice->getRPS();
     855        if(pcSlice->getRPSidx() < 0)
     856        {
     857          WRITE_FLAG( 0, "short_term_ref_pic_set_sps_flag");
     858#if RPS_IN_SPS
     859          codeShortTermRefPicSet(pcSlice->getSPS(), rps);
     860#else
     861          codeShortTermRefPicSet(pcSlice->getPPS(), rps);
     862#endif
     863        }
     864        else
     865        {
     866          WRITE_FLAG( 1, "short_term_ref_pic_set_sps_flag");
     867          WRITE_UVLC( pcSlice->getRPSidx(), "short_term_ref_pic_set_idx" );
     868        }
     869#if RPS_IN_SPS
     870        if(pcSlice->getSPS()->getLongTermRefsPresent())
     871#else
     872        if(pcSlice->getPPS()->getLongTermRefsPresent())
     873#endif
     874        {
     875          WRITE_UVLC( rps->getNumberOfLongtermPictures(), "num_long_term_pics");
     876          Int maxPocLsb = 1<<pcSlice->getSPS()->getBitsForPOC();
     877          Int prev = 0;
     878#if LTRP_MULT
     879          Int prevDeltaPocLt=0;
     880          Int currDeltaPocLt=0;
     881#endif
     882          for(Int i=rps->getNumberOfPictures()-1 ; i > rps->getNumberOfPictures()-rps->getNumberOfLongtermPictures()-1; i--)
     883          {
     884            WRITE_UVLC((maxPocLsb-rps->getDeltaPOC(i)+prev)%maxPocLsb, "delta_poc_lsb_lt");
     885         
     886#if LTRP_MULT
     887            currDeltaPocLt=((maxPocLsb-rps->getDeltaPOC(i)+prev)%maxPocLsb)+prevDeltaPocLt;
     888
     889            Int deltaMsbCycle=0;
     890            if( (i==(rps->getNumberOfPictures()-1)) )
     891            {
     892              deltaMsbCycle=((-rps->getDeltaPOC(i))/maxPocLsb)-1;
     893            }
     894            else if( prevDeltaPocLt!=currDeltaPocLt )
     895            {
     896              deltaMsbCycle=((-rps->getDeltaPOC(i))/maxPocLsb)-1;
     897              if( ((prevDeltaPocLt==maxPocLsb-1) && (currDeltaPocLt==maxPocLsb+1)) ||  ((prevDeltaPocLt==maxPocLsb-2) && (currDeltaPocLt==maxPocLsb)))
     898              {
     899                deltaMsbCycle=deltaMsbCycle-1;
     900              }
     901            }
     902            else
     903            {
     904              deltaMsbCycle=((rps->getDeltaPOC(i+1)-rps->getDeltaPOC(i))/maxPocLsb)-1;
     905            }
     906
     907            if(deltaMsbCycle>=0)
     908            {
     909              WRITE_FLAG( 1, "delta_poc_msb_present_flag");
     910              WRITE_UVLC(deltaMsbCycle, "delta_poc_msb_cycle_lt_minus1");
     911            }
     912            else
     913            {
     914              WRITE_FLAG( 0, "delta_poc_msb_present_flag");
     915            }
     916            prevDeltaPocLt=currDeltaPocLt;
     917#endif
     918            prev = rps->getDeltaPOC(i);
     919            WRITE_FLAG( rps->getUsed(i), "used_by_curr_pic_lt_flag");
     920          }
     921        }
     922      }
    801923    }
    802924
  • trunk/source/Lib/TLibEncoder/TEncCavlc.h

    r56 r77  
    114114  UInt  getCoeffCost          ()                { return  m_uiCoeffCost;  }
    115115 
     116#if VIDYO_VPS_INTEGRATION
     117  Void  codeVPS                 ( TComVPS* pcVPS );
     118#endif
     119
    116120#if HHI_MPI
    117121  Void  codeSPS                 ( TComSPS* pcSPS, Bool bIsDepth );
  • trunk/source/Lib/TLibEncoder/TEncCfg.h

    r56 r77  
    290290#endif
    291291
     292#if VIDYO_VPS_INTEGRATION
     293  UInt     m_layerId;
     294#endif
     295 
    292296  Int      m_viewId;
    293297  Bool     m_isDepth;
     
    765769  Int       getTSIG()                            { return m_signHidingThreshold; }
    766770#endif
     771#if VIDYO_VPS_INTEGRATION
     772  Void      setLayerId             ( UInt layerId )   { m_layerId = layerId; }
     773  UInt      getLayerId             ()               { return m_layerId; }
     774#endif
    767775
    768776  Void      setViewId             ( Int viewId )   { m_viewId = viewId; }
  • trunk/source/Lib/TLibEncoder/TEncCu.cpp

    r61 r77  
    604604        if( bResPredAllowed )
    605605        {
    606           bResPredAvailable       = rpcBestCU->getResidualSamples( 0, m_ppcResPredTmp[uiDepth] );
     606          bResPredAvailable       = rpcBestCU->getResidualSamples( 0,
     607#if QC_SIMPLIFIEDIVRP_M24938
     608            true ,
     609#endif
     610            m_ppcResPredTmp[uiDepth] );
    607611        }
    608612
     
    698702        if( bResPredAllowed )
    699703        {
    700           bResPredAvailable       = rpcBestCU->getResidualSamples( 0, m_ppcResPredTmp[uiDepth] );
     704          bResPredAvailable       = rpcBestCU->getResidualSamples( 0,
     705#if QC_SIMPLIFIEDIVRP_M24938
     706            true,
     707#endif
     708            m_ppcResPredTmp[uiDepth] );
    701709        }
    702710
     
    19031911 
    19041912#if HHI_INTER_VIEW_RESIDUAL_PRED
     1913#if !LG_RESTRICTEDRESPRED_M24766
    19051914  if( rpcTempCU->getResPredFlag( 0 ) )
    19061915  { // subtract residual prediction from original in motion search
     
    19081917  }
    19091918#endif
     1919#endif
    19101920
    19111921#if AMP_MRG
    19121922  rpcTempCU->setMergeAMP (true);
    19131923  #if HHI_INTERVIEW_SKIP
     1924#if LG_RESTRICTEDRESPRED_M24766
     1925  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcResPredTmp[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], bSkipRes, bUseMRG  );
     1926#else
    19141927  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], bSkipRes, bUseMRG  );
     1928#endif
    19151929#else
    19161930  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth], false, bUseMRG );
     
    19251939
    19261940#if HHI_INTER_VIEW_RESIDUAL_PRED
     1941#if !LG_RESTRICTEDRESPRED_M24766
    19271942  if( rpcTempCU->getResPredFlag( 0 ) )
    19281943  { // add residual prediction to original again
    19291944    m_ppcOrigYuv[uhDepth]->add( m_ppcResPredTmp [uhDepth], rpcTempCU->getWidth( 0 ), rpcTempCU->getHeight( 0 ) );
    19301945  }
     1946#endif
    19311947#endif
    19321948
  • trunk/source/Lib/TLibEncoder/TEncEntropy.cpp

    r56 r77  
    121121}
    122122
     123#if VIDYO_VPS_INTEGRATION
     124Void TEncEntropy::encodeVPS( TComVPS* pcVPS )
     125{
     126  m_pcEntropyCoderIf->codeVPS( pcVPS );
     127  return;
     128}
     129#endif
     130
     131#if VIDYO_VPS_INTEGRATION
     132Void  codeVPS                 ( TComVPS* pcVPS );
     133#endif
     134
    123135#if HHI_MPI
    124136Void TEncEntropy::encodeSPS( TComSPS* pcSPS, Bool bIsDepth )
     
    471483  ROTVS( pcCU->isIntra           ( uiAbsPartIdx )              );
    472484  ROFVS( pcCU->getResPredAvail   ( uiAbsPartIdx )              );
    473 
     485#if LG_RESTRICTEDRESPRED_M24766
     486  Int iPUResiPredShift[4];
     487  pcCU->getPUResiPredShift(iPUResiPredShift, uiAbsPartIdx);
     488  if(iPUResiPredShift[0] >= 0 || iPUResiPredShift[1] >= 0  || iPUResiPredShift[2] >= 0  || iPUResiPredShift[3] >= 0 )
     489#endif
    474490  // encode flag
    475491  m_pcEntropyCoderIf->codeResPredFlag( pcCU, uiAbsPartIdx );
  • trunk/source/Lib/TLibEncoder/TEncEntropy.h

    r56 r77  
    7676  virtual UInt  getCoeffCost          ()                = 0;
    7777
     78#if VIDYO_VPS_INTEGRATION
     79        virtual Void  codeVPS                 ( TComVPS* pcVPS )                                      = 0;
     80#endif
     81       
    7882#if HHI_MPI
    7983  virtual Void  codeSPS                 ( TComSPS* pcSPS, Bool bIsDepth )                       = 0;
     
    229233 
    230234public:
     235#if VIDYO_VPS_INTEGRATION
     236        Void encodeVPS               ( TComVPS* pcVPS);
     237#endif
    231238  // SPS
    232239#if HHI_MPI
  • trunk/source/Lib/TLibEncoder/TEncGOP.cpp

    r56 r77  
    246246
    247247      std::vector<TComAPS>& vAPS = m_pcEncTop->getAPS();
     248#if VIDYO_VPS_INTEGRATION
     249    m_pcSliceEncoder->initEncSlice ( pcPic, iPOCLast, uiPOCCurr, iNumPicRcvd, iGOPid, pcSlice, m_pcEncTop->getEncTop()->getVPS(), m_pcEncTop->getSPS(), m_pcEncTop->getPPS() );
     250#else
    248251      m_pcSliceEncoder->initEncSlice ( pcPic, iPOCLast, uiPOCCurr, iNumPicRcvd, iGOPid, pcSlice, m_pcEncTop->getSPS(), m_pcEncTop->getPPS() );
     252#endif
    249253      pcSlice->setLastIDR(m_iLastIDR);
    250254      pcSlice->setSliceIdx(0);
     
    809813      if ( m_bSeqFirst )
    810814      {
     815#if VIDYO_VPS_INTEGRATION
     816        {
     817          OutputNALUnit nalu(NAL_UNIT_VPS, true, m_pcEncTop->getLayerId());
     818          m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream);
     819          m_pcEntropyCoder->encodeVPS(m_pcEncTop->getEncTop()->getVPS());
     820          writeRBSPTrailingBits(nalu.m_Bitstream);
     821          accessUnit.push_back(new NALUnitEBSP(nalu));
     822        }
     823#endif
    811824#if NAL_REF_FLAG
     825#if VIDYO_VPS_INTEGRATION
     826        OutputNALUnit nalu(NAL_UNIT_SPS, true, m_pcEncTop->getLayerId());
     827#else
    812828        OutputNALUnit nalu(NAL_UNIT_SPS, true, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     829#endif
    813830#else
    814831        OutputNALUnit nalu(NAL_UNIT_SPS, NAL_REF_IDC_PRIORITY_HIGHEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     
    827844
    828845#if NAL_REF_FLAG
     846#if VIDYO_VPS_INTEGRATION
     847        nalu = NALUnit(NAL_UNIT_PPS, true, m_pcEncTop->getLayerId());
     848#else
    829849        nalu = NALUnit(NAL_UNIT_PPS, true, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     850#endif
    830851#else
    831852        nalu = NALUnit(NAL_UNIT_PPS, NAL_REF_IDC_PRIORITY_HIGHEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     
    954975#if H0388
    955976#if NAL_REF_FLAG
    956         OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced(), m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer() );
    957 #else
    958         OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced() ? NAL_REF_IDC_PRIORITY_HIGHEST: NAL_REF_IDC_PRIORITY_LOWEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer() );
    959 #endif
    960 #else
    961         OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced() ? NAL_REF_IDC_PRIORITY_HIGHEST: NAL_REF_IDC_PRIORITY_LOWEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer(), true);
    962 #endif
     977        OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced(),
     978#if !VIDYO_VPS_INTEGRATION
     979                           m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer() );
     980#else
     981                           m_pcEncTop->getLayerId(), pcSlice->getTLayer() );
     982#endif
     983#else
     984        OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced() ? NAL_REF_IDC_PRIORITY_HIGHEST: NAL_REF_IDC_PRIORITY_LOWEST,
     985#if !VIDYO_VPS_INTEGRATION
     986                           m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer() );
     987#else
     988                           m_pcEncTop->getLayerId(), pcSlice->getTLayer() );
     989#endif
     990#endif
     991#else
     992        OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->isReferenced() ? NAL_REF_IDC_PRIORITY_HIGHEST: NAL_REF_IDC_PRIORITY_LOWEST,
     993#if !VIDYO_VPS_INTEGRATION
     994                           m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth(), pcSlice->getTLayer(), true );
     995#else
     996                           m_pcEncTop->getLayerId(), pcSlice->getTLayer(), true );
     997#endif
     998
     999#endif
     1000           
    9631001        Bool bEntropySlice = (!pcSlice->isNextSlice());
    9641002        if (!bEntropySlice)
     
    14141452          {
    14151453#if NAL_REF_FLAG
     1454#if VIDYO_VPS_INTEGRATION
     1455            OutputNALUnit nalu(NAL_UNIT_APS, true, m_pcEncTop->getLayerId());
     1456#else
    14161457            OutputNALUnit nalu(NAL_UNIT_APS, true, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     1458#endif
    14171459#else
    14181460            OutputNALUnit nalu(NAL_UNIT_APS, NAL_REF_IDC_PRIORITY_HIGHEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     
    14761518
    14771519#if NAL_REF_FLAG
     1520#if VIDYO_VPS_INTEGRATION
     1521        OutputNALUnit nalu(NAL_UNIT_SEI, false, m_pcEncTop->getLayerId());
     1522#else
    14781523        OutputNALUnit nalu(NAL_UNIT_SEI, false, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     1524#endif
    14791525#else
    14801526        OutputNALUnit nalu(NAL_UNIT_SEI, NAL_REF_IDC_PRIORITY_LOWEST, m_pcEncTop->getViewId(), m_pcEncTop->getIsDepth());
     
    19622008 
    19632009#if HHI_VSO
     2010#if HHI_VSO_SYNTH_DIST_OUT
    19642011  if ( m_pcRdCost->getUseRenModel() )
    19652012  {
     
    19752022  }
    19762023  else
     2024#endif
    19772025#endif
    19782026  {
  • trunk/source/Lib/TLibEncoder/TEncSbac.cpp

    r58 r77  
    342342}
    343343
     344#if VIDYO_VPS_INTEGRATION
     345Void TEncSbac::codeVPS( TComVPS* pcVPS )
     346{
     347        assert (0);
     348  return;
     349}
     350#endif
     351
    344352#if HHI_MPI
    345353Void TEncSbac::codeSPS( TComSPS* pcSPS, Bool bIsDepth )
  • trunk/source/Lib/TLibEncoder/TEncSbac.h

    r56 r77  
    9898  //--SBAC RD
    9999
     100#if VIDYO_VPS_INTEGRATION
     101  Void  codeVPS                 ( TComVPS* pcVPS );
     102#endif
     103       
    100104#if HHI_MPI
    101105  Void  codeSPS                 ( TComSPS* pcSPS, Bool bIsDepth );
  • trunk/source/Lib/TLibEncoder/TEncSearch.cpp

    r56 r77  
    25052505Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost, TComMvField* cMvFieldNeighbours, UChar* uhInterDirNeighbours, Int& numValidMergeCand )
    25062506#else
     2507#if LG_RESTRICTEDRESPRED_M24766
     2508Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* rpcResiPredYuv, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost )
     2509#else
    25072510Void TEncSearch::xMergeEstimation( TComDataCU* pcCU, TComYuv* pcYuvOrg, Int iPUIdx, UInt& uiInterDir, TComMvField* pacMvField, UInt& uiMergeIndex, UInt& ruiCost )
     2511#endif
    25082512#endif
    25092513{
     
    25532557  const int maxNumMergeCand = MRG_MAX_NUM_CANDS_SIGNALED + ( pcCU->getSlice()->getSPS()->getMultiviewMvPredMode() ? 1 : 0 );
    25542558#endif
    2555 
     2559#if LG_RESTRICTEDRESPRED_M24766
     2560  Int iPUResiPredShift[4];
     2561  Int iLastAddResiShift = -1000;
     2562#endif
    25562563  ruiCost = MAX_UINT;
    25572564  for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand )
     
    25652572      pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( cMvFieldNeighbours[0 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx );
    25662573      pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], ePartSize, uiAbsPartIdx, 0, iPUIdx );
    2567 
     2574#if LG_RESTRICTEDRESPRED_M24766
     2575          Int iAddResiShift;
     2576          UInt uiPartAddr;
     2577          Int iRoiWidth, iRoiHeight;
     2578
     2579          pcCU->getPartIndexAndSize( iPUIdx, uiPartAddr, iRoiWidth, iRoiHeight );
     2580          iAddResiShift = pcCU->getResiPredMode(uiPartAddr);
     2581          iAddResiShift = (pcCU->getSlice()->getPPS()->getUseWP() || pcCU->getInterDir(uiPartAddr) != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1 - iAddResiShift : -1);
     2582
     2583          if( pcCU->getResPredFlag( 0 ))
     2584          { // subtract residual prediction from original in motion search
     2585                  if(iLastAddResiShift != iAddResiShift)
     2586                  {
     2587                          //add subtracted residual last time
     2588                          if(iLastAddResiShift >= 0)
     2589                          {
     2590                                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     2591                                  pcYuvOrg->add(iPUResiPredShift, ePartSize, rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2592                          }
     2593                          //subtract residual
     2594                          if(iAddResiShift >= 0)
     2595                          {
     2596                                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iAddResiShift;
     2597                                  pcYuvOrg->add(iPUResiPredShift, ePartSize, rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     2598                          }
     2599                          iLastAddResiShift = iAddResiShift;
     2600                  }
     2601          }
     2602#endif
    25682603      xGetInterPredictionError( pcCU, pcYuvOrg, iPUIdx, uiCostCand, m_pcEncCfg->getUseHADME() );
    25692604      uiBitsCand = uiMergeCand + 1;
     
    25872622    }
    25882623  }
     2624#if LG_RESTRICTEDRESPRED_M24766
     2625  if( pcCU->getResPredFlag( 0 ) && iLastAddResiShift >= 0)
     2626  {
     2627          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     2628          pcYuvOrg->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2629  }
     2630#endif
    25892631}
    25902632
     
    25992641 */
    26002642#if AMP_MRG
     2643#if LG_RESTRICTEDRESPRED_M24766
     2644Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv* rpcResiPredYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes, Bool bUseMRG )
     2645#else
    26012646Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes, Bool bUseMRG )
     2647#endif
    26022648#else
    26032649Void TEncSearch::predInterSearch( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv, Bool bUseRes )
     
    27022748    for (Int iNumRef=0; iNumRef < MAX_NUM_REF; iNumRef++) uiCostTempL0[iNumRef] = MAX_UINT;
    27032749    UInt          uiBitsTempL0[MAX_NUM_REF];
    2704 
     2750#if LG_RESTRICTEDRESPRED_M24766
     2751        Int iPUResiPredShift[4] = {0, 0, 0, 0};
     2752#endif
    27052753    xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits);
    27062754   
     
    27182766    {
    27192767#endif
    2720 
     2768#if LG_RESTRICTEDRESPRED_M24766
     2769                Bool bLastResiFlag = false;
     2770#endif
    27212771    //  Uni-directional prediction
    27222772    for ( Int iRefList = 0; iRefList < iNumPredDir; iRefList++ )
     
    27262776      for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ )
    27272777      {
     2778#if LG_RESTRICTEDRESPRED_M24766
     2779                  if( pcCU->getResPredFlag( 0 ))
     2780                  {
     2781                          if(pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList, iRefIdxTemp))
     2782                          { // subtract residual prediction from original in motion search
     2783                                  if(!bLastResiFlag)
     2784                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     2785                                  bLastResiFlag = true;
     2786                          }
     2787                          else
     2788                          {
     2789                                  if(bLastResiFlag)
     2790                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2791                                  bLastResiFlag = false;
     2792                          }
     2793                  }
     2794#endif
    27282795        uiBitsTemp = uiMbBits[iRefList];
    27292796        if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 )
     
    28892956      }
    28902957    }
     2958#if LG_RESTRICTEDRESPRED_M24766
     2959        if( pcCU->getResPredFlag( 0 ) && bLastResiFlag)
     2960        { // subtract residual prediction from original in motion search
     2961                pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     2962        }
     2963#endif
    28912964    //  Bi-directional prediction
    28922965    if ( pcCU->getSlice()->isInterB() )
    28932966    {
    2894      
     2967#if LG_RESTRICTEDRESPRED_M24766
     2968                Int iLastAddResiShift = -1000;
     2969#endif
    28952970      cMvBi[0] = cMv[0];            cMvBi[1] = cMv[1];
    28962971      iRefIdxBi[0] = iRefIdx[0];    iRefIdxBi[1] = iRefIdx[1];
     
    29943069#else
    29953070          uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdxBi[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS];
     3071#endif
     3072#if LG_RESTRICTEDRESPRED_M24766
     3073                  Int iAddResiShift = -1, iPredFrom = 0;
     3074                  Int iBestRefIdx = pcCU->getCUMvField(eRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0)->getRefIdx(uiPartAddr);
     3075
     3076                  iPredFrom = iBestRefIdx >= 0 ? 3 : 1;
     3077                  if(iBestRefIdx >= 0 && pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList == REF_PIC_LIST_0 ? REF_PIC_LIST_1 : REF_PIC_LIST_0, iBestRefIdx))
     3078                          iAddResiShift++;
     3079                  if(pcCU->getSlice()->getViewId() == pcCU->getSlice()->getRefViewId(eRefPicList, iRefIdxTemp))
     3080                          iAddResiShift++;
     3081                  iAddResiShift = (pcCU->getSlice()->getPPS()->getUseWP() || iPredFrom != 3) ? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3082
     3083                  if( pcCU->getResPredFlag( 0 ) )
     3084                  {
     3085                          if(iLastAddResiShift != iAddResiShift)
     3086                          {
     3087                                  //add substracted residual last time
     3088                                  if(iLastAddResiShift >= 0 )
     3089                                  {
     3090                                          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     3091                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3092                                  }
     3093                                  //substract residual
     3094                                  if(iAddResiShift >= 0)
     3095                                  {
     3096                                          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iAddResiShift;
     3097                                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true );
     3098                                  }
     3099                                  iLastAddResiShift = iAddResiShift;
     3100                          }
     3101                  }
    29963102#endif
    29973103          // call ME
     
    30493155        }
    30503156      } // for loop-iter
     3157#if LG_RESTRICTEDRESPRED_M24766
     3158          if( pcCU->getResPredFlag( 0 ) && iLastAddResiShift >= 0)
     3159          {
     3160                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = iLastAddResiShift;
     3161                  pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3162          }
     3163#endif
    30513164    } // if (B_SLICE)
    30523165#if ZERO_MVD_EST
     
    32553368      if (bTestNormalMC)
    32563369      {
     3370#if LG_RESTRICTEDRESPRED_M24766
     3371                  Int iAddResiShift = pcCU->getResiPredMode(uiPartAddr);
     3372                  iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = \
     3373                          (pcCU->getSlice()->getPPS()->getUseWP() || pcCU->getInterDir(uiPartAddr) != 3)? (iAddResiShift >= 0 ? 0 : -1) : (iAddResiShift >= 0 ? 1-iAddResiShift : -1);
     3374                  if(pcCU->getResPredFlag(0) && iAddResiShift >= 0)
     3375                  {
     3376                          pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ), true);
     3377                  }
     3378#endif
    32573379        xGetInterPredictionError( pcCU, pcOrgYuv, iPartIdx, uiMEError, m_pcEncCfg->getUseHADME() );
    32583380        uiMECost = uiMEError + m_pcRdCost->getCost( uiMEBits );
     3381#if LG_RESTRICTEDRESPRED_M24766
     3382                if(pcCU->getResPredFlag(0) && iAddResiShift >= 0)
     3383                {
     3384                        pcOrgYuv->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcResiPredYuv, pcCU->getWidth( 0 ), pcCU->getHeight( 0 ));
     3385                }
     3386#endif
    32593387      }
    32603388#else
     
    32743402      xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost, cMvFieldNeighbours, uhInterDirNeighbours, numValidMergeCand);
    32753403#else
     3404#if LG_RESTRICTEDRESPRED_M24766
     3405      xMergeEstimation( pcCU, pcOrgYuv, rpcResiPredYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost );
     3406#else
    32763407      xMergeEstimation( pcCU, pcOrgYuv, iPartIdx, uiMRGInterDir, cMRGMvField, uiMRGIndex, uiMRGCost );
     3408#endif
    32773409#endif
    32783410      if ( uiMRGCost < uiMECost )
     
    41164248  UInt      uiWidth      = pcCU->getWidth ( 0 );
    41174249  UInt      uiHeight     = pcCU->getHeight( 0 );
    4118  
     4250#if LG_RESTRICTEDRESPRED_M24766
     4251  Int       iPUResiPredShift[4];
     4252#endif
    41194253  //  No residual coding : SKIP mode
    41204254  if ( ePredMode == MODE_SKIP && bSkipRes )
     
    41284262    if( pcCU->getResPredFlag( 0 ) )
    41294263    {
     4264#if LG_RESTRICTEDRESPRED_M24766
     4265                pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4266                rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResPrd, uiWidth, uiHeight );
     4267#else
    41304268      rpcYuvRec->add( rpcYuvResPrd, uiWidth, uiHeight );
     4269#endif
    41314270      rpcYuvRec->clip( uiWidth, uiHeight );
    41324271    }
     
    42374376  else
    42384377  {
     4378#if LG_RESTRICTEDRESPRED_M24766
     4379          iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = 0;
     4380          rpcYuvResi->subtract(iPUResiPredShift, pcCU->getPartitionSize(0), pcYuvOrg, pcYuvPred, 0, uiWidth );
     4381#else
    42394382  rpcYuvResi->subtract( pcYuvOrg, pcYuvPred, 0, uiWidth );
     4383#endif
    42404384#if HHI_INTER_VIEW_RESIDUAL_PRED
    42414385    // subtract residual prediction
    42424386    if( pcCU->getResPredFlag( 0 ) )
    42434387    {
     4388#if LG_RESTRICTEDRESPRED_M24766
     4389                pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4390                rpcYuvResi->subtract(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResi, rpcYuvResPrd, 0, uiWidth );
     4391#else
    42444392      rpcYuvResi->subtract( rpcYuvResi, rpcYuvResPrd, 0, uiWidth );
     4393#endif
    42454394    }
    42464395#endif
     
    44564605  {
    44574606    pcYuvPred->copyToPartYuv( rpcYuvRec, 0 );
     4607#if LG_RESTRICTEDRESPRED_M24766
     4608        pcCU->getPUResiPredShift(iPUResiPredShift, 0);
     4609        rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResPrd,   uiWidth, uiHeight );
     4610        iPUResiPredShift[0] = iPUResiPredShift[1] = iPUResiPredShift[2] = iPUResiPredShift[3] = 0;
     4611    rpcYuvRec->add(iPUResiPredShift, pcCU->getPartitionSize(0), rpcYuvResiBest, uiWidth, uiHeight );
     4612#else
    44584613    rpcYuvRec->add( rpcYuvResPrd,   uiWidth, uiHeight );
    44594614    rpcYuvRec->add( rpcYuvResiBest, uiWidth, uiHeight );
     4615#endif
    44604616    rpcYuvRec->clip( uiWidth, uiHeight );
    44614617  }
  • trunk/source/Lib/TLibEncoder/TEncSearch.h

    r56 r77  
    188188  Void predInterSearch          ( TComDataCU* pcCU,
    189189                                  TComYuv*    pcOrgYuv,
     190#if LG_RESTRICTEDRESPRED_M24766
     191                                                                  TComYuv*     rpcResiPredYuv,
     192#endif
    190193                                  TComYuv*&   rpcPredYuv,
    191194                                  TComYuv*&   rpcResiYuv,
     
    440443  Void xMergeEstimation           ( TComDataCU*     pcCU,
    441444                                    TComYuv*        pcYuvOrg,
     445#if LG_RESTRICTEDRESPRED_M24766
     446                                                                        TComYuv*        rpcResiPredYuv,
     447#endif
    442448                                    Int             iPartIdx,
    443449                                    UInt&           uiInterDir,
  • trunk/source/Lib/TLibEncoder/TEncSlice.cpp

    r56 r77  
    161161 \param pPPS          PPS associated with the slice
    162162 */
     163#if VIDYO_VPS_INTEGRATION
     164Void TEncSlice::initEncSlice( TComPic* pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComVPS * pVPS, TComSPS* pSPS, TComPPS *pPPS )
     165#else
    163166Void TEncSlice::initEncSlice( TComPic* pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComSPS* pSPS, TComPPS *pPPS )
     167#endif
    164168{
    165169  Double dQP;
     
    167171 
    168172  rpcSlice = pcPic->getSlice(0);
     173#if VIDYO_VPS_INTEGRATION
     174  rpcSlice->setVPS( pVPS );
     175#endif
    169176  rpcSlice->setSPS( pSPS );
    170177  rpcSlice->setPPS( pPPS );
  • trunk/source/Lib/TLibEncoder/TEncSlice.h

    r56 r77  
    110110 
    111111  /// preparation of slice encoding (reference marking, QP and lambda)
     112#if VIDYO_VPS_INTEGRATION
     113  Void    initEncSlice        ( TComPic*  pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComVPS* pVPS, TComSPS* pSPS, TComPPS *pPPS );
     114#else
    112115  Void    initEncSlice        ( TComPic*  pcPic, Int iPOCLast, UInt uiPOCCurr, Int iNumPicRcvd, Int iGOPid, TComSlice*& rpcSlice, TComSPS* pSPS, TComPPS *pPPS );
    113 
     116#endif
    114117  // compress and encode slice
    115118  Void    precompressSlice    ( TComPic*& rpcPic                                );      ///< precompress slice for multi-loop opt.
  • trunk/source/Lib/TLibEncoder/TEncTop.cpp

    r56 r77  
    348348
    349349#if DEPTH_MAP_GENERATION
     350#if VIDYO_VPS_INTEGRATION
     351  m_cDepthMapGenerator.init( (TComPrediction*)this->getPredSearch(), m_pcTAppEncTop->getVPSAccess(), m_pcTAppEncTop->getSPSAccess(), m_pcTAppEncTop->getAUPicAccess() );
     352#else
    350353  m_cDepthMapGenerator.init( (TComPrediction*)this->getPredSearch(), m_pcTAppEncTop->getSPSAccess(), m_pcTAppEncTop->getAUPicAccess() );
     354#endif
    351355#endif
    352356#if HHI_INTER_VIEW_RESIDUAL_PRED
     
    977981Void TEncTop::selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid,TComList<TComPic*>& listPic )
    978982{
     983#if HHI_FIX
     984  if( slice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDV && POCCurr == 0 )
     985#else
    979986  if( slice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDV )
     987#endif
    980988  {
    981989    TComReferencePictureSet* rps = slice->getLocalRPS();
Note: See TracChangeset for help on using the changeset viewer.