Changeset 464 in 3DVCSoftware


Ignore:
Timestamp:
11 Jun 2013, 20:35:00 (11 years ago)
Author:
zhang
Message:

Implementation of ARP from QC

Location:
branches/HTM-DEV-0.3-dev2a
Files:
1 added
43 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-DEV-0.3-dev2a/cfg/3D-HEVC/baseCfg_2view+depth.cfg

    r446 r464  
    195195
    196196#========== multiview coding tools ==========
     197AdvMultiviewResPred                 : 1                # Advanced inter-view residual prediction (0:off, 1:on)
    197198
    198199
  • branches/HTM-DEV-0.3-dev2a/cfg/3D-HEVC/baseCfg_2view.cfg

    r446 r464  
    149149RCForceIntraQP                      : 0                # Rate control: force intra QP to be equal to initial QP
    150150
     151#========== multiview coding tools ==========
     152AdvMultiviewResPred                 : 1                # Advanced inter-view residual prediction (0:off, 1:on)
     153
    151154### DO NOT ADD ANYTHING BELOW THIS LINE ###
    152155### DO NOT DELETE THE EMPTY LINE BELOW ###
  • branches/HTM-DEV-0.3-dev2a/cfg/3D-HEVC/baseCfg_3view+depth.cfg

    r446 r464  
    194194
    195195#========== multiview coding tools ==========
     196AdvMultiviewResPred                 : 1                # Advanced inter-view residual prediction (0:off, 1:on)
    196197
    197198
  • branches/HTM-DEV-0.3-dev2a/cfg/3D-HEVC/baseCfg_3view.cfg

    r446 r464  
    159159RCForceIntraQP                      : 0                # Rate control: force intra QP to be equal to initial QP
    160160
     161#========== multiview coding tools ==========
     162AdvMultiviewResPred                 : 1                # Advanced inter-view residual prediction (0:off, 1:on)
     163
    161164### DO NOT ADD ANYTHING BELOW THIS LINE ###
    162165### DO NOT DELETE THE EMPTY LINE BELOW ###
  • branches/HTM-DEV-0.3-dev2a/source/App/TAppDecoder/TAppDecTop.cpp

    r456 r464  
    647647#if H_3D
    648648   m_tDecTop[ decIdx ]->setCamParsCollector( &m_cCamParsCollector );
     649#if H_3D_ARP
     650    m_tDecTop[ decIdx ]->setTAppDecTop(this);
     651#endif
    649652#endif
    650653
  • branches/HTM-DEV-0.3-dev2a/source/App/TAppDecoder/TAppDecTop.h

    r446 r464  
    9191  Void  decode            (); ///< main decoding function
    9292 
     93#if H_3D_ARP
     94  TDecTop* getTDecTop     ( Int layerId )          { return m_tDecTop[layerId]; }
     95#endif
     96
    9397protected:
    9498  Void  xCreateDecLib     (); ///< create internal classes
  • branches/HTM-DEV-0.3-dev2a/source/App/TAppEncoder/TAppEncCfg.cpp

    r446 r464  
    503503#if L0386_DB_METRIC
    504504  ("DeblockingFilterMetric",         m_DeblockingFilterMetric,         false )
     505#endif
     506
     507#if H_3D_ARP
     508  ("AdvMultiviewResPred",      m_uiUseAdvResPred,           (UInt)1, "Usage of Advanced Residual Prediction" )
    505509#endif
    506510
     
    13871391  xConfirmPara(  m_maxNumMergeCand < 1,  "MaxNumMergeCand must be 1 or greater.");
    13881392  xConfirmPara(  m_maxNumMergeCand > 5,  "MaxNumMergeCand must be 5 or smaller.");
     1393
     1394#if H_3D_ARP
     1395  xConfirmPara( ( 0 != m_uiUseAdvResPred ) &&  ( 1 != m_uiUseAdvResPred ), "UseAdvResPred must be 0 or 1." );
     1396#endif
    13891397
    13901398#if ADAPTIVE_QP_SELECTION
     
    22782286  printf("WVSO:%d ", m_bUseWVSO ); 
    22792287#endif
     2288#if H_3D_ARP
     2289  printf(" ARP:%d  ", m_uiUseAdvResPred  );
     2290#endif
    22802291  printf("\n\n"); 
    22812292
  • branches/HTM-DEV-0.3-dev2a/source/App/TAppEncoder/TAppEncCfg.h

    r446 r464  
    238238  Bool      m_bUseFastEnc;                                    ///< flag for using fast encoder setting
    239239  Bool      m_bUseEarlyCU;                                    ///< flag for using Early CU setting
     240
     241#if H_3D_ARP
     242  UInt      m_uiUseAdvResPred;
     243  UInt      m_uiARPStepNum;
     244#endif
     245
    240246  Bool      m_useFastDecisionForMerge;                        ///< flag for using Fast Decision Merge RD-Cost
    241247  Bool      m_bUseCbfFastMode;                              ///< flag for using Cbf Fast PU Mode Decision
  • branches/HTM-DEV-0.3-dev2a/source/App/TAppEncoder/TAppEncTop.cpp

    r446 r464  
    122122  vps.initViewIndex();
    123123  m_ivPicLists.setVPS      ( &vps );
     124#if H_3D_ARP
     125  for(Int i = 0; i < m_numberOfLayers; i++)
     126  {
     127    Bool isDepth = vps.getDepthId( i );
     128    vps.setUseAdvRP        ( i, ( isDepth || 0==i ) ? 0 : m_uiUseAdvResPred );
     129    vps.setARPStepNum      ( i, ( isDepth || 0==i ) ? 1 : H_3D_ARP_WFNR     );
     130  }
     131#endif
    124132#endif
    125133
     
    166174    m_cTEncTop.setDWeight                      ( isDepth ? m_iDWeight             : 0     );
    167175#endif // H_3D_VSO
     176#if H_3D_ARP
     177    //====== Advanced Inter-view Residual Prediction =========
     178    m_cTEncTop.setUseAdvRP                     ( ( isDepth || 0==layer ) ? 0 : m_uiUseAdvResPred );
     179    m_cTEncTop.setARPStepNum                   ( ( isDepth || 0==layer ) ? 1 : H_3D_ARP_WFNR     );
     180#endif
    168181#endif // H_3D
    169182
     
    605618  {
    606619    m_acTEncTopList[layer]->init( );
     620#if H_3D_ARP
     621    m_acTEncTopList[layer]->setTAppEncTop( this );
     622#endif
    607623  }
    608624#else
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/ContextTables.h

    r324 r464  
    9595#define NUM_TRANSFORMSKIP_FLAG_CTX    1       ///< number of context models for transform skipping
    9696#define NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX  1
     97
     98#if H_3D_ARP
     99#define NUM_ARPW_CTX                  4       ///< number of context models for weighting factor index used by advanced residual prediction
     100#endif
     101
    97102#define CNU                          154      ///< dummy initialization value for unused context models 'Context model Not Used'
    98103
     
    334339  { 139,  139},
    335340};
     341
     342#if H_3D_ARP
     343static const UChar
     344INIT_ARPW[3][NUM_ARPW_CTX] =
     345{
     346  { 154, 154, 154, 154 },
     347  { 154, 154, 154, 154 },
     348  { 154, 154, 154, 154 },
     349};
     350#endif
    336351//! \}
    337352
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComDataCU.cpp

    r456 r464  
    115115  m_pDvInfo              = NULL;
    116116#endif
     117
     118#if H_3D_ARP
     119  m_puhARPW              = NULL;
     120#endif
    117121}
    118122
     
    208212    m_acCUMvField[1].create( uiNumPartition );
    209213   
     214#if H_3D_ARP
     215    m_puhARPW            = new UChar[ uiNumPartition];
     216#endif
    210217  }
    211218  else
     
    293300    if ( m_pDvInfo            ) { xFree(m_pDvInfo);             m_pDvInfo           = NULL; }
    294301#endif
     302
     303#if H_3D_ARP
     304    if ( m_puhARPW            ) { delete[] m_puhARPW;           m_puhARPW           = NULL; }
     305#endif
     306
    295307    m_acCUMvField[0].destroy();
    296308    m_acCUMvField[1].destroy();
     
    402414    m_CUTransquantBypass[ui] = pcFrom->getCUTransquantBypass(ui);
    403415    m_puhDepth[ui] = pcFrom->getDepth(ui);
     416#if H_3D_ARP
     417    m_puhARPW   [ui] = pcFrom->getARPW( ui );
     418#endif
    404419    m_puhWidth  [ui] = pcFrom->getWidth(ui);
    405420    m_puhHeight [ui] = pcFrom->getHeight(ui);
     
    455470    memset( m_puhCbf[2]         + firstElement, 0,                        numElements * sizeof( *m_puhCbf[2] ) );
    456471    memset( m_pbIPCMFlag        + firstElement, false,                    numElements * sizeof( *m_pbIPCMFlag ) );
     472#if H_3D_ARP
     473    memset( m_puhARPW           + firstElement, 0,                        numElements * sizeof( UChar )         );
     474#endif
    457475  }
    458476 
     
    590608      m_puhCbf[1][ui] = 0;
    591609      m_puhCbf[2][ui] = 0;
     610#if H_3D_ARP
     611      m_puhARPW[ui] = 0;
     612#endif
    592613    }
    593614  }
     
    662683#if H_3D_NBDV
    663684  m_pDvInfo->bDV = false;
     685#endif
     686#if H_3D_ARP
     687  memset( m_puhARPW,            0, iSizeInUchar  );
    664688#endif
    665689  UChar uhWidth  = g_uiMaxCUWidth  >> uiDepth;
     
    706730      m_puhCbf[2][ui]=pcCU->m_puhCbf[2][uiPartOffset+ui];
    707731
     732#if H_3D_ARP
     733      m_puhARPW           [ui] = pcCU->getARPW( uiPartOffset+ui );
     734#endif
    708735    }
    709736  }
     
    816843  m_puhMergeIndex       = pcCU->getMergeIndex()       + uiPart;
    817844
     845#if H_3D_ARP
     846  m_puhARPW             = pcCU->getARPW()             + uiPart;
     847#endif
     848
    818849  m_puhLumaIntraDir     = pcCU->getLumaIntraDir()     + uiPart;
    819850  m_puhChromaIntraDir   = pcCU->getChromaIntraDir()   + uiPart;
     
    932963  m_apiMVPNum[eRefPicList] = pcCU->getMVPNum(eRefPicList) + uiAbsPartIdx;
    933964 
     965#if H_3D_ARP
     966  m_puhARPW            = pcCU->getARPW()                  + uiAbsPartIdx;
     967#endif
     968
    934969  m_acCUMvField[ eRefPicList ].linkToWithOffset( pcCU->getCUMvField(eRefPicList), uiAbsPartIdx );
    935970
     
    10191054  memcpy( m_sliceStartCU        + uiOffset, pcCU->m_sliceStartCU,        sizeof( UInt ) * uiNumPartition  );
    10201055  memcpy( m_sliceSegmentStartCU + uiOffset, pcCU->m_sliceSegmentStartCU, sizeof( UInt ) * uiNumPartition  );
     1056
     1057#if H_3D_ARP
     1058  memcpy( m_puhARPW             + uiOffset, pcCU->getARPW(),              iSizeInUchar );
     1059#endif
    10211060}
    10221061
     
    10941133  memcpy( rpcCU->m_sliceStartCU        + m_uiAbsIdxInLCU, m_sliceStartCU,        sizeof( UInt ) * m_uiNumPartition  );
    10951134  memcpy( rpcCU->m_sliceSegmentStartCU + m_uiAbsIdxInLCU, m_sliceSegmentStartCU, sizeof( UInt ) * m_uiNumPartition  );
     1135
     1136#if H_3D_ARP
     1137  memcpy( rpcCU->getARPW()             + m_uiAbsIdxInLCU, m_puhARPW,             iSizeInUchar );
     1138#endif
    10961139}
    10971140
     
    11661209  memcpy( rpcCU->m_sliceStartCU        + uiPartOffset, m_sliceStartCU,        sizeof( UInt ) * uiQNumPart  );
    11671210  memcpy( rpcCU->m_sliceSegmentStartCU + uiPartOffset, m_sliceSegmentStartCU, sizeof( UInt ) * uiQNumPart  );
     1211
     1212#if H_3D_ARP
     1213  memcpy( rpcCU->getARPW()             + uiPartOffset, m_puhARPW,             iSizeInUchar );
     1214#endif
    11681215}
    11691216
     
    18071854  return uiCtx;
    18081855}
     1856
     1857#if H_3D_ARP
     1858UInt TComDataCU::getCTXARPWFlag( UInt uiAbsPartIdx )
     1859{
     1860  TComDataCU* pcTempCU;
     1861  UInt        uiTempPartIdx;
     1862  UInt        uiCtx = 0;
     1863 
     1864  pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx );
     1865  uiCtx    = ( pcTempCU ) ? ((pcTempCU->getARPW( uiTempPartIdx )==0)?0:1) : 0;
     1866 
     1867  pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx );
     1868  uiCtx   += ( pcTempCU ) ? ((pcTempCU->getARPW( uiTempPartIdx )==0)?0:1): 0;
     1869 
     1870  return uiCtx;
     1871}
     1872#endif
    18091873
    18101874UInt TComDataCU::getCtxInterDir( UInt uiAbsPartIdx )
     
    42464310}
    42474311#endif
     4312#if H_3D_ARP
     4313Void TComDataCU::setARPWSubParts ( UChar w, UInt uiAbsPartIdx, UInt uiDepth )
     4314{
     4315  assert( sizeof( *m_puhARPW) == 1 );
     4316  memset( m_puhARPW + uiAbsPartIdx, w, m_pcPic->getNumPartInCU() >> ( 2 * uiDepth ) );
     4317}
     4318#endif
    42484319//! \}
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComDataCU.h

    r455 r464  
    4949#include "TComPattern.h"
    5050
     51#if H_3D_ARP
     52#include "TComYuv.h"
     53#endif
     54
    5155#include <algorithm>
    5256#include <vector>
     
    190194  DisInfo*      m_pDvInfo;
    191195#endif
     196#if H_3D_ARP
     197  UChar*        m_puhARPW;
     198#endif
    192199  // -------------------------------------------------------------------------------------------------------------------
    193200  // misc. variables
     
    220227 
    221228  /// compute scaling factor from POC difference
     229#if !H_3D_ARP
    222230  Int           xGetDistScaleFactor   ( Int iCurrPOC, Int iCurrRefPOC, Int iColPOC, Int iColRefPOC );
    223  
     231#endif
     232
    224233  Void xDeriveCenterIdx( UInt uiPartIdx, UInt& ruiPartIdxCenter );
    225234
     
    231240  // create / destroy / initialize / copy
    232241  // -------------------------------------------------------------------------------------------------------------------
    233  
     242#if H_3D_ARP
     243  Int           xGetDistScaleFactor   ( Int iCurrPOC, Int iCurrRefPOC, Int iColPOC, Int iColRefPOC );
     244#endif
    234245  Void          create                ( UInt uiNumPartition, UInt uiWidth, UInt uiHeight, Bool bDecSubCu, Int unitSize
    235246#if ADAPTIVE_QP_SELECTION
     
    434445   
    435446#endif
     447
     448#if H_3D_ARP
     449  UChar*        getARPW            ()                        { return m_puhARPW;               }
     450  UChar         getARPW            ( UInt uiIdx )            { return m_puhARPW[uiIdx];        }
     451  Void          setARPW            ( UInt uiIdx, UChar w )   { m_puhARPW[uiIdx] = w;           }
     452  Void          setARPWSubParts    ( UChar w, UInt uiAbsPartIdx, UInt uiDepth );
     453  Double        getARPWFactor      ( UInt uiIdx );
     454#endif
    436455  // -------------------------------------------------------------------------------------------------------------------
    437456  // member functions for accessing partition information
     
    539558  UInt          getCtxInterDir                  ( UInt   uiAbsPartIdx                                 );
    540559 
     560#if H_3D_ARP
     561  UInt          getCTXARPWFlag                  ( UInt   uiAbsPartIdx                                 );
     562#endif 
     563
    541564  UInt          getSliceStartCU         ( UInt pos )                  { return m_sliceStartCU[pos-m_uiAbsIdxInLCU];                                                                                          }
    542565  UInt          getSliceSegmentStartCU  ( UInt pos )                  { return m_sliceSegmentStartCU[pos-m_uiAbsIdxInLCU];                                                                                   }
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComInterpolationFilter.cpp

    r324 r464  
    7373};
    7474
     75#if H_3D_ARP
     76const Short TComInterpolationFilter::m_lumaFilterARP[4][NTAPS_LUMA_ARP] =
     77{
     78  {64,  0},
     79  {48, 16},
     80  {32, 32},
     81  {16, 48}
     82};
     83const Short TComInterpolationFilter::m_chromaFilterARP[8][NTAPS_CHROMA_ARP] =
     84{
     85  {64,  0},
     86  {56,  8},
     87  {48, 16},
     88  {40, 24},
     89  {32, 32},
     90  {24, 40},
     91  {16, 48},
     92  {8,  56}
     93};
     94#endif
     95
    7596// ====================================================================================================================
    7697// Private member functions
     
    325346 * \param  isLast     Flag indicating whether it is the last filtering operation
    326347 */
    327 Void TComInterpolationFilter::filterHorLuma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isLast )
     348Void TComInterpolationFilter::filterHorLuma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isLast
     349#if H_3D_ARP
     350    , Bool filterType
     351#endif
     352  )
    328353{
    329354  assert(frac >= 0 && frac < 4);
     
    335360  else
    336361  {
     362#if H_3D_ARP
     363    if(filterType)
     364    {
     365      filterHor<NTAPS_LUMA_ARP>(g_bitDepthY, src, srcStride, dst, dstStride, width, height, isLast, m_lumaFilterARP[frac]);
     366    }
     367    else
     368    {
     369#endif
    337370    filterHor<NTAPS_LUMA>(g_bitDepthY, src, srcStride, dst, dstStride, width, height, isLast, m_lumaFilter[frac]);
     371#if H_3D_ARP
     372    }
     373#endif
    338374  }
    339375}
     
    352388 * \param  isLast     Flag indicating whether it is the last filtering operation
    353389 */
    354 Void TComInterpolationFilter::filterVerLuma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast )
     390Void TComInterpolationFilter::filterVerLuma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast
     391#if H_3D_ARP
     392    , Bool filterType
     393#endif
     394  )
    355395{
    356396  assert(frac >= 0 && frac < 4);
     
    362402  else
    363403  {
     404#if H_3D_ARP
     405    if(filterType)
     406    {
     407      filterVer<NTAPS_LUMA_ARP>(g_bitDepthY, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_lumaFilterARP[frac]);   
     408    }
     409    else
     410    {
     411#endif
    364412    filterVer<NTAPS_LUMA>(g_bitDepthY, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_lumaFilter[frac]);
     413#if H_3D_ARP
     414    }
     415#endif
    365416  }
    366417}
     
    378429 * \param  isLast     Flag indicating whether it is the last filtering operation
    379430 */
    380 Void TComInterpolationFilter::filterHorChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isLast )
     431Void TComInterpolationFilter::filterHorChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isLast
     432#if H_3D_ARP
     433    , Bool filterType
     434#endif
     435  )
    381436{
    382437  assert(frac >= 0 && frac < 8);
     
    388443  else
    389444  {
     445#if H_3D_ARP
     446    if(filterType)
     447    {
     448      filterHor<NTAPS_CHROMA_ARP>(g_bitDepthC, src, srcStride, dst, dstStride, width, height, isLast, m_chromaFilterARP[frac]);
     449    }
     450    else
     451    {
     452#endif
    390453    filterHor<NTAPS_CHROMA>(g_bitDepthC, src, srcStride, dst, dstStride, width, height, isLast, m_chromaFilter[frac]);
     454#if H_3D_ARP
     455    }
     456#endif
    391457  }
    392458}
     
    405471 * \param  isLast     Flag indicating whether it is the last filtering operation
    406472 */
    407 Void TComInterpolationFilter::filterVerChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast )
     473Void TComInterpolationFilter::filterVerChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast
     474#if H_3D_ARP
     475    , Bool filterType
     476#endif
     477  )
    408478{
    409479  assert(frac >= 0 && frac < 8);
     
    415485  else
    416486  {
     487#if H_3D_ARP
     488    if(filterType)
     489    {
     490      filterVer<NTAPS_CHROMA_ARP>(g_bitDepthC, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_chromaFilterARP[frac]);
     491    }
     492    else
     493    {
     494#endif
    417495    filterVer<NTAPS_CHROMA>(g_bitDepthC, src, srcStride, dst, dstStride, width, height, isFirst, isLast, m_chromaFilter[frac]);
     496#if H_3D_ARP
     497    }
     498#endif
    418499  }
    419500}
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComInterpolationFilter.h

    r324 r464  
    4545//! \{
    4646
     47#if H_3D_ARP
     48#define NTAPS_LUMA_ARP    2 ///< Number of taps for luma
     49#define NTAPS_CHROMA_ARP  2 ///< Number of taps for chroma
     50#endif
     51
    4752#define NTAPS_LUMA        8 ///< Number of taps for luma
    4853#define NTAPS_CHROMA      4 ///< Number of taps for chroma
     
    5863  static const Short m_lumaFilter[4][NTAPS_LUMA];     ///< Luma filter taps
    5964  static const Short m_chromaFilter[8][NTAPS_CHROMA]; ///< Chroma filter taps
    60  
     65#if H_3D_ARP
     66  static const Short m_lumaFilterARP  [4][NTAPS_LUMA_ARP];     ///< Luma filter taps for ARP
     67  static const Short m_chromaFilterARP[8][NTAPS_CHROMA_ARP];   ///< Chroma filter taps for ARP
     68#endif
    6169  static Void filterCopy(Int bitDepth, const Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Bool isFirst, Bool isLast);
    6270 
     
    7381  ~TComInterpolationFilter() {}
    7482
    75   Void filterHorLuma  (Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac,               Bool isLast );
    76   Void filterVerLuma  (Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast );
    77   Void filterHorChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac,               Bool isLast );
    78   Void filterVerChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast );
     83  Void filterHorLuma  (Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac,               Bool isLast
     84#if H_3D_ARP
     85    , Bool filterType = false
     86#endif
     87    );
     88  Void filterVerLuma  (Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast
     89#if H_3D_ARP
     90    , Bool filterType = false
     91#endif
     92    );
     93  Void filterHorChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac,               Bool isLast
     94#if H_3D_ARP
     95    , Bool filterType = false
     96#endif
     97    );
     98  Void filterVerChroma(Pel *src, Int srcStride, Short *dst, Int dstStride, Int width, Int height, Int frac, Bool isFirst, Bool isLast
     99#if H_3D_ARP
     100    , Bool filterType = false
     101#endif
     102    );
    79103};
    80104
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComPrediction.cpp

    r446 r464  
    6363  m_cYuvPredTemp.destroy();
    6464
     65#if H_3D_ARP
     66  m_acYuvPredBase[0].destroy();
     67  m_acYuvPredBase[1].destroy();
     68#endif
     69
    6570  if( m_pLumaRecBuffer )
    6671  {
     
    103108
    104109    m_cYuvPredTemp.create( MAX_CU_SIZE, MAX_CU_SIZE );
     110#if H_3D_ARP
     111    m_acYuvPredBase[0] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
     112    m_acYuvPredBase[1] .create( g_uiMaxCUWidth, g_uiMaxCUHeight );
     113#endif
    105114  }
    106115
     
    485494  TComMv      cMv         = pcCU->getCUMvField( eRefPicList )->getMv( uiPartAddr );
    486495  pcCU->clipMv(cMv);
     496#if H_3D_ARP
     497  if(  pcCU->getARPW( uiPartAddr ) > 0
     498    && pcCU->getPartitionSize(uiPartAddr)==SIZE_2Nx2N
     499    && pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPOC()!= pcCU->getSlice()->getPOC()
     500    )
     501  {
     502    xPredInterUniARP( pcCU, uiPartAddr, iWidth, iHeight, eRefPicList, rpcYuvPred, bi );
     503  }
     504  else
     505  {
     506#endif
    487507  xPredInterLumaBlk  ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
    488508  xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
    489 }
     509#if H_3D_ARP
     510  }
     511#endif
     512}
     513
     514#if H_3D_ARP
     515Void TComPrediction::xPredInterUniARP( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi, TComMvField * pNewMvFiled )
     516{
     517  Int         iRefIdx      = pNewMvFiled ? pNewMvFiled->getRefIdx() : pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );           
     518  TComMv      cMv          = pNewMvFiled ? pNewMvFiled->getMv()     : pcCU->getCUMvField( eRefPicList )->getMv( uiPartAddr );
     519  Bool        bTobeScaled  = false;
     520  TComPic* pcPicYuvBaseCol = NULL;
     521  TComPic* pcPicYuvBaseRef = NULL;
     522
     523#if H_3D_NBDV
     524  DisInfo cDistparity;
     525  cDistparity.bDV           = pcCU->getDvInfo(uiPartAddr).bDV;
     526  if( cDistparity.bDV )
     527  {
     528    cDistparity.m_acNBDV = pcCU->getDvInfo(0).m_acNBDV;
     529    assert(pcCU->getDvInfo(uiPartAddr).bDV ==  pcCU->getDvInfo(0).bDV);
     530    cDistparity.m_aVIdxCan = pcCU->getDvInfo(uiPartAddr).m_aVIdxCan;
     531  }
     532#else
     533  assert(0); // ARP can be applied only when a DV is available
     534#endif
     535
     536  UChar dW = cDistparity.bDV ? pcCU->getARPW ( uiPartAddr ) : 0;
     537
     538  if( cDistparity.bDV )
     539  {
     540    if( dW > 0 && pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC()!= pcCU->getSlice()->getPOC() )
     541    {
     542      bTobeScaled = true;
     543    }
     544
     545    pcPicYuvBaseCol =  pcCU->getSlice()->getBaseViewRefPic( pcCU->getSlice()->getPOC(),                              cDistparity.m_aVIdxCan );
     546    pcPicYuvBaseRef =  pcCU->getSlice()->getBaseViewRefPic( pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC(), cDistparity.m_aVIdxCan );
     547   
     548    if( ( !pcPicYuvBaseCol || pcPicYuvBaseCol->getPOC() != pcCU->getSlice()->getPOC() ) || ( !pcPicYuvBaseRef || pcPicYuvBaseRef->getPOC() != pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC() ) )
     549    {
     550      dW = 0;
     551      bTobeScaled = false;
     552    }
     553    else
     554    {
     555      assert( pcPicYuvBaseCol->getPOC() == pcCU->getSlice()->getPOC() && pcPicYuvBaseRef->getPOC() == pcCU->getSlice()->getRefPic( eRefPicList, 0 )->getPOC() );
     556    }
     557
     558    if(bTobeScaled)
     559    {     
     560      Int iCurrPOC    = pcCU->getSlice()->getPOC();
     561      Int iColRefPOC  = pcCU->getSlice()->getRefPOC( eRefPicList, iRefIdx );
     562      Int iCurrRefPOC = pcCU->getSlice()->getRefPOC( eRefPicList,  0);
     563      Int iScale = pcCU-> xGetDistScaleFactor(iCurrPOC, iCurrRefPOC, iCurrPOC, iColRefPOC);
     564      if ( iScale != 4096 )
     565      {
     566        cMv = cMv.scaleMv( iScale );
     567      }
     568      iRefIdx = 0;
     569    }
     570  }
     571
     572  pcCU->clipMv(cMv);
     573  TComPicYuv* pcPicYuvRef = pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec();
     574  xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, true );
     575  xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, true );
     576
     577  if( dW > 0 )
     578  {
     579    TComYuv * pYuvB0 = &m_acYuvPredBase[0];
     580    TComYuv * pYuvB1  = &m_acYuvPredBase[1];
     581
     582    TComMv cMVwithDisparity = cMv + cDistparity.m_acNBDV;
     583    pcCU->clipMv(cMVwithDisparity);
     584
     585    assert ( cDistparity.bDV );
     586
     587    pcPicYuvRef = pcPicYuvBaseCol->getPicYuvRec();
     588    xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cDistparity.m_acNBDV, iWidth, iHeight, pYuvB0, bi, true );
     589    xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cDistparity.m_acNBDV, iWidth, iHeight, pYuvB0, bi, true );
     590   
     591    pcPicYuvRef = pcPicYuvBaseRef->getPicYuvRec();
     592    xPredInterLumaBlk  ( pcCU, pcPicYuvRef, uiPartAddr, &cMVwithDisparity, iWidth, iHeight, pYuvB1, bi, true );
     593    xPredInterChromaBlk( pcCU, pcPicYuvRef, uiPartAddr, &cMVwithDisparity, iWidth, iHeight, pYuvB1, bi, true );
     594
     595    pYuvB0->subtractARP( pYuvB0 , pYuvB1 , uiPartAddr , iWidth , iHeight );
     596
     597    if( 2 == dW )
     598    {
     599      pYuvB0->multiplyARP( uiPartAddr , iWidth , iHeight , dW );
     600    }
     601
     602    rpcYuvPred->addARP( rpcYuvPred , pYuvB0 , uiPartAddr , iWidth , iHeight , !bi );
     603  }
     604}
     605#endif
    490606
    491607Void TComPrediction::xPredInterBi ( TComDataCU* pcCU, UInt uiPartAddr, Int iWidth, Int iHeight, TComYuv*& rpcYuvPred )
     
    551667 * \param bi       Flag indicating whether bipred is used
    552668 */
    553 Void TComPrediction::xPredInterLumaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi )
     669Void TComPrediction::xPredInterLumaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
     670#if H_3D_ARP
     671    , Bool filterType
     672#endif
     673  )
    554674{
    555675  Int refStride = refPic->getStride(); 
     
    565685  if ( yFrac == 0 )
    566686  {
    567     m_if.filterHorLuma( ref, refStride, dst, dstStride, width, height, xFrac,       !bi );
     687    m_if.filterHorLuma( ref, refStride, dst, dstStride, width, height, xFrac,       !bi
     688#if H_3D_ARP
     689    , filterType
     690#endif
     691      );
    568692  }
    569693  else if ( xFrac == 0 )
    570694  {
    571     m_if.filterVerLuma( ref, refStride, dst, dstStride, width, height, yFrac, true, !bi );
     695    m_if.filterVerLuma( ref, refStride, dst, dstStride, width, height, yFrac, true, !bi
     696#if H_3D_ARP
     697    , filterType
     698#endif
     699      );
    572700  }
    573701  else
     
    579707    Int halfFilterSize = ( filterSize >> 1 );
    580708
    581     m_if.filterHorLuma(ref - (halfFilterSize-1)*refStride, refStride, tmp, tmpStride, width, height+filterSize-1, xFrac, false     );
    582     m_if.filterVerLuma(tmp + (halfFilterSize-1)*tmpStride, tmpStride, dst, dstStride, width, height,              yFrac, false, !bi);   
     709    m_if.filterHorLuma(ref - (halfFilterSize-1)*refStride, refStride, tmp, tmpStride, width, height+filterSize-1, xFrac, false     
     710#if H_3D_ARP
     711    , filterType
     712#endif
     713      );
     714    m_if.filterVerLuma(tmp + (halfFilterSize-1)*tmpStride, tmpStride, dst, dstStride, width, height,              yFrac, false, !bi
     715#if H_3D_ARP
     716    , filterType
     717#endif
     718      );   
    583719  }
    584720}
     
    596732 * \param bi       Flag indicating whether bipred is used
    597733 */
    598 Void TComPrediction::xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi )
     734Void TComPrediction::xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
     735#if H_3D_ARP
     736    , Bool filterType
     737#endif   
     738  )
    599739{
    600740  Int     refStride  = refPic->getCStride();
     
    623763  if ( yFrac == 0 )
    624764  {
    625     m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride, cxWidth, cxHeight, xFrac, !bi);   
    626     m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride, cxWidth, cxHeight, xFrac, !bi);   
     765    m_if.filterHorChroma(refCb, refStride, dstCb,  dstStride, cxWidth, cxHeight, xFrac, !bi
     766#if H_3D_ARP
     767    , filterType
     768#endif
     769    );   
     770    m_if.filterHorChroma(refCr, refStride, dstCr,  dstStride, cxWidth, cxHeight, xFrac, !bi
     771#if H_3D_ARP
     772    , filterType
     773#endif
     774    );
    627775  }
    628776  else if ( xFrac == 0 )
    629777  {
    630     m_if.filterVerChroma(refCb, refStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, true, !bi);   
    631     m_if.filterVerChroma(refCr, refStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, true, !bi);   
     778    m_if.filterVerChroma(refCb, refStride, dstCb, dstStride, cxWidth, cxHeight, yFrac, true, !bi
     779#if H_3D_ARP
     780    , filterType
     781#endif
     782    );
     783    m_if.filterVerChroma(refCr, refStride, dstCr, dstStride, cxWidth, cxHeight, yFrac, true, !bi
     784#if H_3D_ARP
     785    , filterType
     786#endif
     787    );
    632788  }
    633789  else
    634790  {
    635     m_if.filterHorChroma(refCb - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false);
    636     m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCb, dstStride, cxWidth, cxHeight  , yFrac, false, !bi);
     791    m_if.filterHorChroma(refCb - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false
     792#if H_3D_ARP
     793    , filterType
     794#endif 
     795      );
     796    m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCb, dstStride, cxWidth, cxHeight  , yFrac, false, !bi
     797#if H_3D_ARP
     798    , filterType
     799#endif
     800      );
    637801   
    638     m_if.filterHorChroma(refCr - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false);
    639     m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCr, dstStride, cxWidth, cxHeight  , yFrac, false, !bi);   
     802    m_if.filterHorChroma(refCr - (halfFilterSize-1)*refStride, refStride, extY,  extStride, cxWidth, cxHeight+filterSize-1, xFrac, false
     803#if H_3D_ARP
     804    , filterType
     805#endif
     806      );
     807    m_if.filterVerChroma(extY  + (halfFilterSize-1)*extStride, extStride, dstCr, dstStride, cxWidth, cxHeight  , yFrac, false, !bi
     808#if H_3D_ARP
     809    , filterType
     810#endif
     811      );   
    640812  }
    641813}
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComPrediction.h

    r324 r464  
    6565  TComYuv   m_acYuvPred[2];
    6666  TComYuv   m_cYuvPredTemp;
     67#if H_3D_ARP
     68  TComYuv   m_acYuvPredBase[2];
     69#endif
    6770  TComYuv m_filteredBlock[4][4];
    6871  TComYuv m_filteredBlockTmp[4];
     
    7780 
    7881  // motion compensation functions
     82#if H_3D_ARP
     83  Void xPredInterUniARP         ( TComDataCU* pcCU,                          UInt uiPartAddr,               Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi=false, TComMvField * pNewMvFiled = NULL );
     84#endif
    7985  Void xPredInterUni            ( TComDataCU* pcCU,                          UInt uiPartAddr,               Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Bool bi=false          );
    8086  Void xPredInterBi             ( TComDataCU* pcCU,                          UInt uiPartAddr,               Int iWidth, Int iHeight,                         TComYuv*& rpcYuvPred );
    81   Void xPredInterLumaBlk  ( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi );
    82   Void xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi );
     87  Void xPredInterLumaBlk  ( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
     88#if H_3D_ARP
     89    , Bool filterType = false
     90#endif
     91    );
     92  Void xPredInterChromaBlk( TComDataCU *cu, TComPicYuv *refPic, UInt partAddr, TComMv *mv, Int width, Int height, TComYuv *&dstPic, Bool bi
     93#if H_3D_ARP
     94    , Bool filterType = false
     95#endif
     96    );
    8397  Void xWeightedAverage         ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartAddr, Int iWidth, Int iHeight, TComYuv*& rpcYuvDst );
    8498 
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComSlice.cpp

    r446 r464  
    14861486      m_dimensionId[i][j] = 0;
    14871487    }
     1488
     1489#if H_3D_ARP
     1490    m_uiUseAdvResPred[i]  = 0;
     1491    m_uiARPStepNum[i]     = 1;
     1492#endif
    14881493  }
    14891494#endif
     
    22572262  }
    22582263}
     2264
     2265#if H_3D_ARP
     2266Void TComSlice::setARPStepNum()                                 
     2267{
     2268  Bool bAllIvRef = true;
     2269
     2270  if(!getVPS()->getUseAdvRP(getLayerId()))
     2271  {
     2272    m_nARPStepNum = 0;
     2273  }
     2274  else
     2275  {
     2276    for( Int iRefListId = 0; iRefListId < 2; iRefListId++ )
     2277    {
     2278      RefPicList  eRefPicList = RefPicList( iRefListId );
     2279      Int iNumRefIdx = getNumRefIdx(eRefPicList);
     2280     
     2281      if( iNumRefIdx <= 0 )
     2282      {
     2283        continue;
     2284      }
     2285
     2286      for ( Int i = 0; i < iNumRefIdx; i++ )
     2287      {
     2288        if( getRefPic( eRefPicList, i)->getPOC() != getPOC() )
     2289        {
     2290          bAllIvRef = false;
     2291          break;
     2292        }
     2293      }
     2294
     2295      if( bAllIvRef == false ) { break; }
     2296    }
     2297    m_nARPStepNum = !bAllIvRef ? getVPS()->getARPStepNum(getLayerId()) : 0;
     2298  }
     2299}
     2300#endif
    22592301#endif
    22602302/** get scaling matrix from RefMatrixID
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComSlice.h

    r446 r464  
    524524#if H_3D
    525525  Int         m_viewIndex                [MAX_NUM_LAYERS   ];
     526#if H_3D_ARP
     527  UInt        m_uiUseAdvResPred          [MAX_NUM_LAYERS   ];
     528  UInt        m_uiARPStepNum             [MAX_NUM_LAYERS   ];
     529#endif
    526530#endif
    527531
     
    642646  Int     getDepthId      ( Int layerIdInVps )                             { return getScalabilityId( layerIdInVps, DEPTH_ID ); }
    643647  Int     getLayerIdInNuh( Int viewIndex, Bool depthFlag ); 
     648#if H_3D_ARP
     649  UInt    getUseAdvRP  ( Int layerIdInVps )                                { return m_uiUseAdvResPred[layerIdInVps];    }
     650  UInt    getARPStepNum( Int layerIdInVps )                                { return m_uiARPStepNum[layerIdInVps];       }
     651  Void    setUseAdvRP  ( Int layerIdInVps, UInt val )                      { m_uiUseAdvResPred[layerIdInVps] = val;     }
     652  Void    setARPStepNum( Int layerIdInVps, UInt val )                      { m_uiARPStepNum[layerIdInVps]    = val;     }
     653#endif
    644654#endif
    645655
     
    14861496  Int        m_aaiCodedScale [2][MAX_NUM_LAYERS];
    14871497  Int        m_aaiCodedOffset[2][MAX_NUM_LAYERS];
     1498#if H_3D_ARP
     1499  TComList<TComPic*> * m_pBaseViewRefPicList[MAX_NUM_LAYERS];
     1500  UInt                 m_nARPStepNum;
     1501#endif
    14881502#endif
    14891503#endif
     
    16111625#endif
    16121626#endif
     1627
     1628#if H_3D_ARP
     1629  Void      setBaseViewRefPicList( TComList<TComPic*> *pListPic, Int iViewIdx )      { m_pBaseViewRefPicList[iViewIdx] = pListPic;                   }
     1630  Void      setARPStepNum();                                 
     1631  TComPic*  getBaseViewRefPic    ( UInt uiPOC , Int iViewIdx )                       { return xGetRefPic( *m_pBaseViewRefPicList[iViewIdx], uiPOC ); }
     1632  UInt      getARPStepNum( )                                                         { return m_nARPStepNum;                                         } 
     1633#endif
     1634
    16131635  Void      setRefPOCList       ();
    16141636  Void      setColFromL0Flag    ( UInt colFromL0 ) { m_colFromL0Flag = colFromL0; }
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComYuv.cpp

    r446 r464  
    661661  }
    662662}
     663
     664#if H_3D_ARP
     665Void TComYuv::addARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     666{
     667  addARPLuma   ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth   , uiHeight    , bClip );
     668  addARPChroma ( pcYuvSrc0, pcYuvSrc1, uiAbsPartIdx, uiWidth>>1, uiHeight>>1 , bClip );
     669}
     670
     671Void TComYuv::addARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     672{
     673  Int x, y;
     674
     675  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
     676  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
     677  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     678
     679  UInt iSrc0Stride = pcYuvSrc0->getStride();
     680  UInt iSrc1Stride = pcYuvSrc1->getStride();
     681  UInt iDstStride  = getStride();
     682  for ( y = uiHeight-1; y >= 0; y-- )
     683  {
     684    for ( x = uiWidth-1; x >= 0; x-- )
     685    {
     686      pDst[x] = pSrc0[x] + pSrc1[x];
     687      if( bClip )
     688      {
     689        pDst[x] = ClipY( pDst[x] );
     690      }
     691    }
     692    pSrc0 += iSrc0Stride;
     693    pSrc1 += iSrc1Stride;
     694    pDst  += iDstStride;
     695  }
     696}
     697
     698Void TComYuv::addARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, Bool bClip )
     699{
     700  Int x, y;
     701
     702  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
     703  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
     704  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
     705  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
     706  Pel* pDstU = getCbAddr( uiAbsPartIdx );
     707  Pel* pDstV = getCrAddr( uiAbsPartIdx );
     708
     709  UInt  iSrc0Stride = pcYuvSrc0->getCStride();
     710  UInt  iSrc1Stride = pcYuvSrc1->getCStride();
     711  UInt  iDstStride  = getCStride();
     712  for ( y = uiHeight-1; y >= 0; y-- )
     713  {
     714    for ( x = uiWidth-1; x >= 0; x-- )
     715    {
     716      pDstU[x] = pSrcU0[x] + pSrcU1[x];
     717      pDstV[x] = pSrcV0[x] + pSrcV1[x];
     718      if( bClip )
     719      {
     720        pDstU[x] = ClipC( pDstU[x] );
     721        pDstV[x] = ClipC( pDstV[x] );
     722      }
     723    }
     724
     725    pSrcU0 += iSrc0Stride;
     726    pSrcU1 += iSrc1Stride;
     727    pSrcV0 += iSrc0Stride;
     728    pSrcV1 += iSrc1Stride;
     729    pDstU  += iDstStride;
     730    pDstV  += iDstStride;
     731  }
     732}
     733
     734Void TComYuv::subtractARP( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     735{
     736  subtractARPLuma  ( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth    , uiHeight    );
     737  subtractARPChroma( pcYuvSrc0, pcYuvSrc1,  uiAbsPartIdx, uiWidth>>1 , uiHeight>>1 );
     738}
     739
     740Void TComYuv::subtractARPLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     741{
     742  Int x, y;
     743
     744  Pel* pSrc0 = pcYuvSrc0->getLumaAddr( uiAbsPartIdx );
     745  Pel* pSrc1 = pcYuvSrc1->getLumaAddr( uiAbsPartIdx );
     746  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     747
     748  Int  iSrc0Stride = pcYuvSrc0->getStride();
     749  Int  iSrc1Stride = pcYuvSrc1->getStride();
     750  Int  iDstStride  = getStride();
     751  for ( y = uiHeight-1; y >= 0; y-- )
     752  {
     753    for ( x = uiWidth-1; x >= 0; x-- )
     754    {
     755      pDst[x] = pSrc0[x] - pSrc1[x];
     756    }
     757    pSrc0 += iSrc0Stride;
     758    pSrc1 += iSrc1Stride;
     759    pDst  += iDstStride;
     760  }
     761}
     762
     763Void TComYuv::subtractARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight )
     764{
     765  Int x, y;
     766
     767  Pel* pSrcU0 = pcYuvSrc0->getCbAddr( uiAbsPartIdx );
     768  Pel* pSrcU1 = pcYuvSrc1->getCbAddr( uiAbsPartIdx );
     769  Pel* pSrcV0 = pcYuvSrc0->getCrAddr( uiAbsPartIdx );
     770  Pel* pSrcV1 = pcYuvSrc1->getCrAddr( uiAbsPartIdx );
     771  Pel* pDstU  = getCbAddr( uiAbsPartIdx );
     772  Pel* pDstV  = getCrAddr( uiAbsPartIdx );
     773
     774  Int  iSrc0Stride = pcYuvSrc0->getCStride();
     775  Int  iSrc1Stride = pcYuvSrc1->getCStride();
     776  Int  iDstStride  = getCStride();
     777  for ( y = uiHeight-1; y >= 0; y-- )
     778  {
     779    for ( x = uiWidth-1; x >= 0; x-- )
     780    {
     781      pDstU[x] = pSrcU0[x] - pSrcU1[x];
     782      pDstV[x] = pSrcV0[x] - pSrcV1[x];
     783    }
     784    pSrcU0 += iSrc0Stride;
     785    pSrcU1 += iSrc1Stride;
     786    pSrcV0 += iSrc0Stride;
     787    pSrcV1 += iSrc1Stride;
     788    pDstU  += iDstStride;
     789    pDstV  += iDstStride;
     790  }
     791}
     792
     793Void TComYuv::multiplyARP( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     794{
     795  multiplyARPLuma( uiAbsPartIdx , uiWidth , uiHeight , dW );
     796  multiplyARPChroma( uiAbsPartIdx , uiWidth >> 1 , uiHeight >> 1 , dW );
     797}
     798
     799Void TComYuv::xxMultiplyLine( Pel* pSrcDst , UInt uiWidth , UChar dW )
     800{
     801  assert( dW == 2 );
     802  for( UInt x = 0 ; x < uiWidth ; x++ )
     803    pSrcDst[x] =  pSrcDst[x] >> 1;
     804}
     805
     806Void TComYuv::multiplyARPLuma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     807{
     808  Pel* pDst  = getLumaAddr( uiAbsPartIdx );
     809  Int  iDstStride  = getStride();
     810  for ( Int y = uiHeight-1; y >= 0; y-- )
     811  {
     812    xxMultiplyLine( pDst , uiWidth , dW );
     813    pDst  += iDstStride;
     814  }
     815}
     816
     817Void TComYuv::multiplyARPChroma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW )
     818{
     819  Pel* pDstU  = getCbAddr( uiAbsPartIdx );
     820  Pel* pDstV  = getCrAddr( uiAbsPartIdx );
     821
     822  Int  iDstStride  = getCStride();
     823  for ( Int y = uiHeight-1; y >= 0; y-- )
     824  {
     825    xxMultiplyLine( pDstU , uiWidth , dW );
     826    xxMultiplyLine( pDstV , uiWidth , dW );
     827    pDstU  += iDstStride;
     828    pDstV  += iDstStride;
     829  }
     830}
     831#endif
    663832#endif
    664833//! \}
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TComYuv.h

    r446 r464  
    182182#if H_3D
    183183  Void addClipPartLuma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiTrUnitIdx, UInt uiPartSize );
     184
     185#if H_3D_ARP
     186  Void    addARP           ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip );
     187  Void    addARPLuma       ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip );
     188  Void    addARPChroma     ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight , Bool bClip );
     189  Void    subtractARP      ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight );
     190  Void    subtractARPLuma  ( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight );
     191  Void    subtractARPChroma( TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, UInt uiAbsPartIdx, UInt uiWidth , UInt uiHeight );
     192  Void    multiplyARP      ( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW );
     193  Void    multiplyARPLuma  ( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW );
     194  Void    multiplyARPChroma( UInt uiAbsPartIdx , UInt uiWidth , UInt uiHeight , UChar dW );
     195private:
     196  Void    xxMultiplyLine( Pel * pSrcDst , UInt uiWidth , UChar dW );
    184197#endif
     198#endif
    185199
    186200};// END CLASS DEFINITION TComYuv
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibCommon/TypeDef.h

    r456 r464  
    8989                                              // QC_CU_NBDV_D0181
    9090                                              // SEC_DEFAULT_DV_D0112
     91
     92#define H_3D_ARP                          1   // Advanced residual prediction (ARP), JCT3V-D0177
    9193#endif
    9294
     
    115117#define DVFROM_ABOVELEFT                  5
    116118#endif
     119
     120///// ***** ADVANCED INTERVIEW RESIDUAL PREDICTION *********
     121#if H_3D_ARP
     122#define H_3D_ARP_WFNR                     3
     123#endif
     124
    117125/////////////////////////////////////////////////////////////////////////////////////////
    118126///////////////////////////////////   HM RELATED DEFINES ////////////////////////////////
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecCAVLC.cpp

    r446 r464  
    950950    }
    951951   
     952#if H_3D_ARP
     953    for( Int layer = 0; layer <= pcVPS->getMaxLayers() - 1; layer++ )
     954    {
     955      if( ( layer!=0 ) && ( pcVPS->getDepthId(layer)!=1 ) )
     956      {
     957        READ_FLAG( uiCode, "advanced_residual_pred_flag"  );
     958        pcVPS->setUseAdvRP  ( layer, uiCode );
     959        pcVPS->setARPStepNum( layer, uiCode ? H_3D_ARP_WFNR : 1 );
     960      }
     961      else
     962      {
     963        pcVPS->setUseAdvRP  ( layer, 0 );
     964        pcVPS->setARPStepNum( layer, 1 );
     965      }
     966    }
     967#endif
     968
    952969    READ_FLAG( uiCode,  "vps_extension2_flag" );
    953970    if (uiCode)
     
    18601877}
    18611878
     1879#if H_3D_ARP
     1880Void TDecCavlc::parseARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     1881{
     1882  assert(0);
     1883}
     1884#endif
     1885
    18621886// ====================================================================================================================
    18631887// Protected member functions
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecCAVLC.h

    r446 r464  
    9999  Void parseMergeFlag       ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx );
    100100  Void parseMergeIndex      ( TComDataCU* pcCU, UInt& ruiMergeIndex );
     101#if H_3D_ARP
     102  Void parseARPW            ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
     103#endif
    101104  Void parseSplitFlag       ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    102105  Void parsePartSize        ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecCu.cpp

    r455 r464  
    281281  if(!pcCU->getSlice()->isIntra())
    282282  {
     283#if H_3D_ARP
     284    if( pcCU->getSlice()->getVPS()->getUseAdvRP( pcCU->getSlice()->getLayerId() ) )
     285#else
    283286    if(pcCU->getSlice()->getViewIndex() && !pcCU->getSlice()->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done.
     287#endif
    284288    {
    285289      m_ppcCU[uiDepth]->copyInterPredInfoFrom( pcCU, uiAbsPartIdx, REF_PIC_LIST_0, true );
     
    343347      }
    344348    }
     349#if H_3D_ARP
     350    m_pcEntropyDecoder->decodeARPW( pcCU , uiAbsPartIdx , uiDepth );
     351#endif
    345352    xFinishDecodeCU( pcCU, uiAbsPartIdx, uiDepth, ruiIsLast );
    346353    return;
     
    366373  // prediction mode ( Intra : direction mode, Inter : Mv, reference idx )
    367374  m_pcEntropyDecoder->decodePredInfo( pcCU, uiAbsPartIdx, uiDepth, m_ppcCU[uiDepth]);
    368  
     375#if H_3D_ARP
     376  m_pcEntropyDecoder->decodeARPW    ( pcCU , uiAbsPartIdx , uiDepth ); 
     377#endif 
    369378  // Coefficient decoding
    370379  Bool bCodeDQP = getdQPFlag();
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecEntropy.cpp

    r324 r464  
    8787}
    8888
     89#if H_3D_ARP
     90Void TDecEntropy::decodeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     91{
     92  if( !pcCU->getSlice()->getARPStepNum() || pcCU->isIntra( uiAbsPartIdx ) )
     93  {
     94    return;
     95  }
     96
     97  if( pcCU->getPartitionSize(uiAbsPartIdx) != SIZE_2Nx2N )
     98  {
     99    pcCU->setARPWSubParts( 0 , uiAbsPartIdx, uiDepth );
     100  }
     101  else
     102  {
     103    m_pcEntropyDecoderIf->parseARPW( pcCU , uiAbsPartIdx , uiDepth );
     104  }
     105}
     106#endif
     107
    89108Void TDecEntropy::decodeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
    90109{
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecEntropy.h

    r446 r464  
    8585  virtual Void parseMergeFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx ) = 0;
    8686  virtual Void parseMergeIndex    ( TComDataCU* pcCU, UInt& ruiMergeIndex ) = 0;
     87#if H_3D_ARP
     88  virtual Void parseARPW          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
     89#endif
    8790  virtual Void parsePartSize      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
    8891  virtual Void parsePredMode      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
     
    154157  Void decodePartSize          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    155158 
     159#if H_3D_ARP
     160  Void decodeARPW              ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
     161#endif
     162
    156163  Void decodeIPCMInfo          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    157164
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecSbac.cpp

    r324 r464  
    5454, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
    5555, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
     56#if H_3D_ARP
     57, m_cCUPUARPW                 ( 1,             1,               NUM_ARPW_CTX                  , m_contextModels + m_numContextModels, m_numContextModels)
     58#endif
    5659, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
    5760, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     
    113116  m_cCUMergeFlagExtSCModel.initBuffer    ( sliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT );
    114117  m_cCUMergeIdxExtSCModel.initBuffer     ( sliceType, qp, (UChar*)INIT_MERGE_IDX_EXT );
     118#if H_3D_ARP
     119  m_cCUPUARPW.initBuffer                 ( sliceType, qp, (UChar*)INIT_ARPW );
     120#endif
    115121  m_cCUPartSizeSCModel.initBuffer        ( sliceType, qp, (UChar*)INIT_PART_SIZE );
    116122  m_cCUAMPSCModel.initBuffer             ( sliceType, qp, (UChar*)INIT_CU_AMP_POS );
     
    158164  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT );
    159165  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT );
     166#if H_3D_ARP
     167  m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
     168#endif
    160169  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
    161170  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
     
    15511560  xCopyContextsFrom(pScr);
    15521561}
     1562
     1563#if H_3D_ARP
     1564Void TDecSbac::parseARPW( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
     1565{
     1566  UInt uiMaxW = pcCU->getSlice()->getARPStepNum() - 1;
     1567  UInt uiW = 0;
     1568  UInt uiOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
     1569  UInt uiCode = 0;
     1570
     1571  assert ( uiMaxW > 0 );
     1572
     1573  m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPW.get( 0, 0, 0 + uiOffset ) );
     1574
     1575  uiW = uiCode;
     1576  if( 1 == uiW )   
     1577  {
     1578    m_pcTDecBinIf->decodeBin( uiCode , m_cCUPUARPW.get( 0, 0, 3 ) );
     1579    uiW += ( 1 == uiCode ? 1 : 0 );
     1580  }
     1581  pcCU->setARPWSubParts( ( UChar )( uiW ) , uiAbsPartIdx, uiDepth ); 
     1582}
     1583#endif
    15531584//! \}
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecSbac.h

    r446 r464  
    108108  Void parseMergeFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiPUIdx );
    109109  Void parseMergeIndex    ( TComDataCU* pcCU, UInt& ruiMergeIndex );
     110#if H_3D_ARP
     111  Void parseARPW          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
     112#endif
    110113  Void parsePartSize      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    111114  Void parsePredMode      ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
     
    145148  ContextModel3DBuffer m_cCUMergeFlagExtSCModel;
    146149  ContextModel3DBuffer m_cCUMergeIdxExtSCModel;
     150#if H_3D_ARP
     151  ContextModel3DBuffer m_cCUPUARPW;
     152#endif
    147153  ContextModel3DBuffer m_cCUPartSizeSCModel;
    148154  ContextModel3DBuffer m_cCUPredModeSCModel;
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecTop.cpp

    r446 r464  
    3737
    3838#include "NALread.h"
     39#if H_3D_ARP
     40#include "../../App/TAppDecoder/TAppDecTop.h"
     41#endif
    3942#include "TDecTop.h"
    4043
     
    886889#if H_MV   
    887890    pcSlice->setRefPicList( m_cListPic, m_refPicSetInterLayer, true );   
     891#if H_3D_ARP
     892    pcSlice->setARPStepNum();
     893    if( pcSlice->getARPStepNum() > 1 )
     894    {
     895      for(Int iLayerId = 0; iLayerId < nalu.m_layerId; iLayerId ++ )
     896      {
     897        Int  iViewIdx =   pcSlice->getVPS()->getViewIndex(iLayerId);
     898        Bool bIsDepth = ( pcSlice->getVPS()->getDepthId  ( iLayerId ) == 1 );
     899        if( iViewIdx<getViewIndex() && !bIsDepth )
     900        {
     901          pcSlice->setBaseViewRefPicList( m_tAppDecTop->getTDecTop(iLayerId)->getListPic(), iViewIdx );
     902        }
     903      }
     904    }
     905#endif
    888906#else
    889907#if FIX1071
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibDecoder/TDecTop.h

    r446 r464  
    225225#endif
    226226
     227#if H_3D_ARP
     228  TAppDecTop*             m_tAppDecTop;
     229#endif
     230
    227231public:
    228232  TDecTop();
     
    265269  Bool                    getIsDepth            ()               { return m_isDepth;    }
    266270  Void                    setCamParsCollector( CamParsCollector* pcCamParsCollector ) { m_pcCamParsCollector = pcCamParsCollector; }
     271
     272#if H_3D_ARP
     273  Void                    setTAppDecTop( TAppDecTop* pcTAppDecTop ) { m_tAppDecTop = pcTAppDecTop; }
     274  TAppDecTop*             getTAppDecTop()                           { return  m_tAppDecTop; }
     275#endif
    267276#endif
    268277#endif
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncCavlc.cpp

    r446 r464  
    741741    }
    742742  }
     743
     744#if H_3D_ARP
     745  for( Int layer = 0; layer <= pcVPS->getMaxLayers() - 1; layer++ )
     746  {
     747    if( ( layer!=0 ) && ( pcVPS->getDepthId(layer)!=1 ) )
     748    {
     749      WRITE_FLAG( pcVPS->getUseAdvRP ( layer ) ? 1 : 0,      "advanced_residual_pred_flag"  );
     750    }
     751    else
     752    {
     753      assert( pcVPS->getUseAdvRP ( layer ) == 0 );
     754    }
     755  }
     756#endif
     757
    743758  WRITE_FLAG( 0,                                             "vps_extension2_flag" );
    744759#else
     
    13491364}
    13501365
     1366#if H_3D_ARP
     1367Void TEncCavlc::codeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
     1368{
     1369  assert(0);
     1370}
     1371#endif
     1372
    13511373Void TEncCavlc::codeInterModeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiEncMode )
    13521374{
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncCavlc.h

    r446 r464  
    114114  Void codeMergeIndex    ( TComDataCU* pcCU, UInt uiAbsPartIdx );
    115115 
     116#if H_3D_ARP
     117  Void codeARPW          ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     118#endif
     119
    116120  Void codeInterModeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiEncMode );
    117121  Void codeSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncCfg.h

    r446 r464  
    394394  Bool      m_bUseEstimatedVSD;
    395395  Double    m_dDispCoeff;
     396
     397#if H_3D_ARP
     398  UInt      m_uiUseAdvResPred;
     399  UInt      m_uiARPStepNum;
     400#endif
    396401#endif
    397402
     
    467472  Bool      getMaxTempLayer                 ()                              { return m_maxTempLayer;              }
    468473  Void      setMaxTempLayer                 ( Int maxTempLayer )            { m_maxTempLayer = maxTempLayer;      }
     474
     475#if H_3D_ARP
     476  UInt       getUseAdvRP                    ( )              { return m_uiUseAdvResPred; }
     477  Void       setUseAdvRP                    ( UInt  u )      { m_uiUseAdvResPred = u;    }
     478
     479  UInt       getARPStepNum                  ()               { return m_uiARPStepNum;    }
     480  Void       setARPStepNum                  ( UInt  u )      { m_uiARPStepNum = u;       }
     481#endif
     482
    469483  //======== Transform =============
    470484  Void      setQuadtreeTULog2MaxSize        ( UInt  u )      { m_uiQuadtreeTULog2MaxSize = u; }
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncCu.cpp

    r455 r464  
    6565  m_ppcTempCU      = new TComDataCU*[m_uhTotalDepth-1];
    6666   
     67#if H_3D_ARP
     68  m_ppcWeightedTempCU = new TComDataCU*[m_uhTotalDepth-1];
     69#endif
     70
    6771  m_ppcPredYuvBest = new TComYuv*[m_uhTotalDepth-1];
    6872  m_ppcResiYuvBest = new TComYuv*[m_uhTotalDepth-1];
     
    8387    m_ppcTempCU[i] = new TComDataCU; m_ppcTempCU[i]->create( uiNumPartitions, uiWidth, uiHeight, false, uiMaxWidth >> (m_uhTotalDepth - 1) );
    8488   
     89#if H_3D_ARP
     90    m_ppcWeightedTempCU[i] = new TComDataCU; m_ppcWeightedTempCU[i]->create( uiNumPartitions, uiWidth, uiHeight, false, uiMaxWidth >> (m_uhTotalDepth - 1) );
     91#endif 
     92
    8593    m_ppcPredYuvBest[i] = new TComYuv; m_ppcPredYuvBest[i]->create(uiWidth, uiHeight);
    8694    m_ppcResiYuvBest[i] = new TComYuv; m_ppcResiYuvBest[i]->create(uiWidth, uiHeight);
     
    124132      m_ppcTempCU[i]->destroy();      delete m_ppcTempCU[i];      m_ppcTempCU[i] = NULL;
    125133    }
     134#if H_3D_ARP
     135    if(m_ppcWeightedTempCU[i])
     136    {
     137      m_ppcWeightedTempCU[i]->destroy(); delete m_ppcWeightedTempCU[i]; m_ppcWeightedTempCU[i] = NULL;
     138    }
     139#endif
    126140    if(m_ppcPredYuvBest[i])
    127141    {
     
    468482      if( rpcTempCU->getSlice()->getSliceType() != I_SLICE )
    469483      {
     484#if H_3D_ARP
     485        if( rpcTempCU->getSlice()->getVPS()->getUseAdvRP(rpcTempCU->getSlice()->getLayerId()) )
     486#else
    470487        if(rpcTempCU->getSlice()->getViewIndex() && !rpcTempCU->getSlice()->getIsDepth()) //Notes from QC: this condition shall be changed once the configuration is completed, e.g. in pcSlice->getSPS()->getMultiviewMvPredMode() || ARP in prev. HTM. Remove this comment once it is done. Remove this comment once it is done.
     488#endif
    471489        {
    472490          PartSize ePartTemp = rpcTempCU->getPartitionSize(0);
     
    12201238  {
    12211239    m_pcEntropyCoder->encodeMergeIndex( pcCU, uiAbsPartIdx );
     1240#if H_3D_ARP
     1241    m_pcEntropyCoder->encodeARPW( pcCU , uiAbsPartIdx );
     1242#endif
    12221243    finishCU(pcCU,uiAbsPartIdx,uiDepth);
    12231244    return;
     
    12411262  // prediction Info ( Intra : direction mode, Inter : Mv, reference idx )
    12421263  m_pcEntropyCoder->encodePredInfo( pcCU, uiAbsPartIdx );
    1243  
     1264#if H_3D_ARP
     1265  m_pcEntropyCoder->encodeARPW( pcCU , uiAbsPartIdx );
     1266#endif
     1267
    12441268  // Encode Coefficients
    12451269  Bool bCodeDQP = getdQPFlag();
     
    13021326  }
    13031327
     1328#if H_3D_ARP
     1329  Int nARPWMax = rpcTempCU->getSlice()->getARPStepNum() - 1;
     1330  if( nARPWMax < 0 || !rpcTempCU->getDvInfo(0).bDV )
     1331  {
     1332    nARPWMax = 0;
     1333  }
     1334  for( Int nARPW=nARPWMax; nARPW >= 0 ; nARPW-- )
     1335  {
     1336    memset( mergeCandBuffer, 0, MRG_MAX_NUM_CANDS*sizeof(Int) );
     1337#endif
    13041338  for( UInt uiNoResidual = 0; uiNoResidual < iteration; ++uiNoResidual )
    13051339  {
     
    13161350          rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(),     0, uhDepth );
    13171351          rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uhDepth ); // interprets depth relative to LCU level
     1352#if H_3D_ARP
     1353          rpcTempCU->setARPWSubParts( (UChar)nARPW , 0 , uhDepth );
     1354#endif
    13181355          rpcTempCU->setMergeFlagSubParts( true, 0, 0, uhDepth ); // interprets depth relative to LCU level
    13191356          rpcTempCU->setMergeIndexSubParts( uiMergeCand, 0, 0, uhDepth ); // interprets depth relative to LCU level
     
    13221359          rpcTempCU->getCUMvField( REF_PIC_LIST_1 )->setAllMvField( cMvFieldNeighbours[1 + 2*uiMergeCand], SIZE_2Nx2N, 0, 0 ); // interprets depth relative to rpcTempCU level
    13231360
     1361#if H_3D_ARP
     1362          if( nARPW )
     1363          {
     1364            Bool bSignalflag[2] = { true, true };
     1365            for( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx ++ )
     1366            {
     1367              Int iRefIdx = cMvFieldNeighbours[uiRefListIdx + 2*uiMergeCand].getRefIdx();
     1368              RefPicList eRefList = uiRefListIdx ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
     1369              if( iRefIdx < 0 || rpcTempCU->getSlice()->getPOC() == rpcTempCU->getSlice()->getRefPOC(eRefList, iRefIdx) )
     1370              {
     1371                bSignalflag[uiRefListIdx] = false;
     1372              }
     1373            }
     1374            if( !bSignalflag[0] && !bSignalflag[1] )
     1375            {
     1376              rpcTempCU->setARPWSubParts( 0 , 0 , uhDepth );
     1377            }
     1378          }
     1379#endif
    13241380       // do MC
    13251381       m_pcPredSearch->motionCompensation ( rpcTempCU, m_ppcPredYuvTemp[uhDepth] );
     
    14011457  }
    14021458 }
     1459#if H_3D_ARP
     1460 }
     1461#endif
    14031462}
    14041463
     
    14111470{
    14121471  UChar uhDepth = rpcTempCU->getDepth( 0 );
     1472#if H_3D_ARP
     1473  Int iLayerId    = rpcTempCU->getSlice()->getLayerId();
     1474  Bool bFirstTime = true;
     1475  Int nARPWMax    = rpcTempCU->getSlice()->getARPStepNum() - 1;
     1476
     1477  if( nARPWMax < 0 || ePartSize != SIZE_2Nx2N || !rpcTempCU->getDvInfo(0).bDV  )
     1478  {
     1479    nARPWMax = 0;
     1480  }
     1481
     1482  for( Int nARPW = 0; nARPW <= nARPWMax; nARPW++ )
     1483  {
     1484    if( bFirstTime == false && rpcTempCU->getSlice()->getVPS()->getUseAdvRP( iLayerId ) )
     1485    {
     1486      rpcTempCU->initEstData( rpcTempCU->getDepth(0), rpcTempCU->getQP(0) );
     1487    }
     1488#endif
    14131489#if H_3D_VSO // M3
    14141490  if( m_pcRdCost->getUseRenModel() )
     
    14301506  rpcTempCU->setCUTransquantBypassSubParts  ( m_pcEncCfg->getCUTransquantBypassFlagValue(),      0, uhDepth );
    14311507 
     1508#if H_3D_ARP
     1509  rpcTempCU->setARPWSubParts( (UChar)nARPW , 0 , uhDepth );
     1510#endif
     1511
     1512#if H_3D_ARP
     1513  if( bFirstTime == false && nARPWMax )
     1514  {
     1515    rpcTempCU->copyPartFrom( m_ppcWeightedTempCU[uhDepth] , 0 , uhDepth );
     1516    rpcTempCU->setARPWSubParts( (UChar)nARPW , 0 , uhDepth );
     1517
     1518    m_pcPredSearch->motionCompensation( rpcTempCU , m_ppcPredYuvTemp[uhDepth] );
     1519
     1520    if(rpcTempCU->getPartitionSize(0)==SIZE_2Nx2N)
     1521    {
     1522      Bool bSignalflag[2] = { true, true };
     1523      for(UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx ++ )
     1524      {
     1525        RefPicList eRefList = uiRefListIdx ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
     1526        Int iRefIdx = rpcTempCU->getCUMvField(eRefList)->getRefIdx(0);
     1527        if( iRefIdx < 0 || rpcTempCU->getSlice()->getPOC() == rpcTempCU->getSlice()->getRefPOC(eRefList, iRefIdx) )
     1528        {
     1529          bSignalflag[uiRefListIdx] = false;
     1530        }
     1531      }
     1532      if( !bSignalflag[0] && !bSignalflag[1] )
     1533      {
     1534        rpcTempCU->setARPWSubParts( 0 , 0 , uhDepth );
     1535      }
     1536    }
     1537  }
     1538  else
     1539  {
     1540    bFirstTime = false;
     1541#endif
    14321542#if AMP_MRG
    14331543  rpcTempCU->setMergeAMP (true);
     
    14361546  m_pcPredSearch->predInterSearch ( rpcTempCU, m_ppcOrigYuv[uhDepth], m_ppcPredYuvTemp[uhDepth], m_ppcResiYuvTemp[uhDepth], m_ppcRecoYuvTemp[uhDepth] );
    14371547#endif
     1548#if H_3D_ARP
     1549   if( nARPWMax )
     1550   {
     1551     m_ppcWeightedTempCU[uhDepth]->copyPartFrom( rpcTempCU , 0 , uhDepth );
     1552
     1553     Bool bSignalflag[2] = { true, true };
     1554     for(UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx ++ )
     1555     {
     1556       RefPicList eRefList = uiRefListIdx ? REF_PIC_LIST_1 : REF_PIC_LIST_0;
     1557       Int iRefIdx = rpcTempCU->getCUMvField(eRefList)->getRefIdx(0);
     1558       if( iRefIdx < 0 || rpcTempCU->getSlice()->getPOC() == rpcTempCU->getSlice()->getRefPOC(eRefList, iRefIdx) )
     1559       {
     1560         bSignalflag[uiRefListIdx] = false;
     1561       }
     1562     }
     1563     if( !bSignalflag[0] && !bSignalflag[1])
     1564     {
     1565       rpcTempCU->setARPWSubParts( 0 , 0 , uhDepth );
     1566     }
     1567   }
     1568  }
     1569#endif
    14381570
    14391571#if AMP_MRG
    14401572  if ( !rpcTempCU->getMergeAMP() )
    14411573  {
     1574#if H_3D_ARP
     1575    if( nARPWMax )
     1576    {
     1577      continue;
     1578    }
     1579    else
     1580#endif
    14421581    return;
    14431582  }
     
    14661605  xCheckDQP( rpcTempCU );
    14671606  xCheckBestMode(rpcBestCU, rpcTempCU, uhDepth);
     1607#if H_3D_ARP
     1608  }
     1609#endif
    14681610}
    14691611
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncCu.h

    r324 r464  
    6969  TComDataCU**            m_ppcBestCU;      ///< Best CUs in each depth
    7070  TComDataCU**            m_ppcTempCU;      ///< Temporary CUs in each depth
     71#if H_3D_ARP
     72  TComDataCU**            m_ppcWeightedTempCU;
     73#endif
    7174  UChar                   m_uhTotalDepth;
    7275 
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncEntropy.cpp

    r446 r464  
    157157}
    158158
     159#if H_3D_ARP
     160Void TEncEntropy::encodeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
     161{
     162  if( !pcCU->getSlice()->getARPStepNum() || pcCU->isIntra( uiAbsPartIdx ) )
     163  {
     164    return;
     165  }
     166
     167  if ( pcCU->getPartitionSize(uiAbsPartIdx)!=SIZE_2Nx2N )
     168  {
     169    assert(pcCU->getARPW (uiAbsPartIdx) == 0);
     170  }
     171  else
     172  {
     173    m_pcEntropyCoderIf->codeARPW( pcCU, uiAbsPartIdx );
     174  }
     175}
     176#endif
     177
    159178/** encode prediction mode
    160179 * \param pcCU
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncEntropy.h

    r446 r464  
    8888  virtual Void codeMergeFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0;
    8989  virtual Void codeMergeIndex    ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0;
     90#if H_3D_ARP
     91  virtual Void codeARPW          ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0;
     92#endif
    9093  virtual Void codeSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0;
    9194 
     
    169172  Void encodeMergeFlag    ( TComDataCU* pcCU, UInt uiAbsPartIdx );
    170173  Void encodeMergeIndex   ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false );
     174#if H_3D_ARP
     175  Void encodeARPW         ( TComDataCU* pcCU, UInt uiAbspartIdx );
     176#endif
    171177  Void encodePredMode          ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false );
    172178  Void encodePartSize          ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD = false );
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncGOP.cpp

    r455 r464  
    4747#include "TLibCommon/NAL.h"
    4848#include "NALwrite.h"
     49#if H_3D_ARP
     50#include "../../App/TAppEncoder/TAppEncTop.h"
     51#endif
    4952#include <time.h>
    5053#include <math.h>
     
    670673#if H_MV   
    671674    pcSlice->setRefPicList( rcListPic, m_refPicSetInterLayer );
     675#if H_3D_ARP
     676    pcSlice->setARPStepNum();
     677    if(pcSlice->getARPStepNum() > 1)
     678    {
     679      for(Int iLayerId = 0; iLayerId < getLayerId(); iLayerId ++ )
     680      {
     681        Int  iViewIdx =   pcSlice->getVPS()->getViewIndex(iLayerId);
     682        Bool bIsDepth = ( pcSlice->getVPS()->getDepthId  ( iLayerId ) == 1 );
     683        if( iViewIdx<getViewIndex() && !bIsDepth )
     684        {
     685          pcSlice->setBaseViewRefPicList( m_pcEncTop->getTAppEncTop()->getTEncTop( iLayerId )->getListPic(), iViewIdx );
     686        }
     687      }
     688    }
     689#endif
    672690#else
    673691    pcSlice->setRefPicList ( rcListPic );
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncSbac.cpp

    r446 r464  
    6060, m_cCUMergeFlagExtSCModel    ( 1,             1,               NUM_MERGE_FLAG_EXT_CTX        , m_contextModels + m_numContextModels, m_numContextModels)
    6161, m_cCUMergeIdxExtSCModel     ( 1,             1,               NUM_MERGE_IDX_EXT_CTX         , m_contextModels + m_numContextModels, m_numContextModels)
     62#if H_3D_ARP
     63, m_cCUPUARPW                 ( 1,             1,               NUM_ARPW_CTX                  , m_contextModels + m_numContextModels, m_numContextModels)
     64#endif
    6265, m_cCUPartSizeSCModel        ( 1,             1,               NUM_PART_SIZE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
    6366, m_cCUPredModeSCModel        ( 1,             1,               NUM_PRED_MODE_CTX             , m_contextModels + m_numContextModels, m_numContextModels)
     
    111114  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
    112115  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
     116#if H_3D_ARP
     117  m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
     118#endif
    113119  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
    114120  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
     
    214220  m_cCUMergeFlagExtSCModel.initBuffer    ( eSliceType, iQp, (UChar*)INIT_MERGE_FLAG_EXT);
    215221  m_cCUMergeIdxExtSCModel.initBuffer     ( eSliceType, iQp, (UChar*)INIT_MERGE_IDX_EXT);
     222#if H_3D_ARP
     223  m_cCUPUARPW.initBuffer                 ( eSliceType, iQp, (UChar*)INIT_ARPW );
     224#endif
    216225  m_cCUPartSizeSCModel.initBuffer        ( eSliceType, iQp, (UChar*)INIT_PART_SIZE );
    217226  m_cCUAMPSCModel.initBuffer             ( eSliceType, iQp, (UChar*)INIT_CU_AMP_POS );
     
    589598  DTRACE_CABAC_T( "\n" );
    590599}
     600
     601#if H_3D_ARP
     602Void TEncSbac::codeARPW( TComDataCU* pcCU, UInt uiAbsPartIdx )
     603{
     604  Int  iW = (Int)pcCU->getARPW( uiAbsPartIdx );
     605  Int  iMaxW = pcCU->getSlice()->getARPStepNum() - 1;
     606  assert( iMaxW > 0);
     607
     608  Int nOffset = pcCU->getCTXARPWFlag(uiAbsPartIdx);
     609  Int nBinNum = iW + ( iW != iMaxW );
     610  m_pcBinIf->encodeBin( iW ? 1 : 0 , m_cCUPUARPW.get( 0, 0, 0 + nOffset ) );
     611  if( nBinNum > 1 )
     612  {
     613     m_pcBinIf->encodeBin( ( iW == iMaxW ) ? 1 : 0, m_cCUPUARPW.get( 0, 0, 3 ) );
     614  }
     615}
     616#endif
    591617
    592618Void TEncSbac::codeSplitFlag   ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth )
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncSbac.h

    r446 r464  
    134134  Void codeMergeFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx );
    135135  Void codeMergeIndex    ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     136#if H_3D_ARP
     137  Void codeARPW          ( TComDataCU* pcCU, UInt uiAbsPartIdx );
     138#endif
    136139  Void codeSplitFlag     ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth );
    137140  Void codeMVPIdx        ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList );
     
    181184  ContextModel3DBuffer m_cCUMergeFlagExtSCModel;
    182185  ContextModel3DBuffer m_cCUMergeIdxExtSCModel;
     186#if H_3D_ARP
     187  ContextModel3DBuffer m_cCUPUARPW;
     188#endif
    183189  ContextModel3DBuffer m_cCUPartSizeSCModel;
    184190  ContextModel3DBuffer m_cCUPredModeSCModel;
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncSearch.cpp

    r456 r464  
    47414741    m_pcEntropyCoder->encodeSkipFlag(pcCU, 0, true);
    47424742    m_pcEntropyCoder->encodeMergeIndex( pcCU, 0, true );
    4743    
     4743#if H_3D_ARP
     4744    m_pcEntropyCoder->encodeARPW( pcCU, 0 );
     4745#endif
    47444746    uiBits = m_pcEntropyCoder->getNumberOfWrittenBits();
    47454747    pcCU->getTotalBits()       = uiBits;
     
    61506152    m_pcEntropyCoder->encodeSkipFlag(pcCU, 0, true);
    61516153    m_pcEntropyCoder->encodeMergeIndex(pcCU, 0, true);
     6154#if H_3D_ARP
     6155    m_pcEntropyCoder->encodeARPW( pcCU, 0 );
     6156#endif
    61526157    ruiBits += m_pcEntropyCoder->getNumberOfWrittenBits();
    61536158  }
     
    61636168    m_pcEntropyCoder->encodePartSize( pcCU, 0, pcCU->getDepth(0), true );
    61646169    m_pcEntropyCoder->encodePredInfo( pcCU, 0, true );
     6170#if H_3D_ARP
     6171    m_pcEntropyCoder->encodeARPW( pcCU , 0 );
     6172#endif
    61656173    Bool bDummy = false;
    61666174    m_pcEntropyCoder->encodeCoeff   ( pcCU, 0, pcCU->getDepth(0), pcCU->getWidth(0), pcCU->getHeight(0), bDummy );
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibEncoder/TEncTop.h

    r446 r464  
    6363// Class definition
    6464// ====================================================================================================================
     65
     66#if H_3D_ARP
     67class TAppEncTop;
     68#endif
    6569
    6670/// encoder class
     
    124128  TComScalingList         m_scalingList;                 ///< quantization matrix information
    125129  TEncRateCtrl            m_cRateCtrl;                    ///< Rate control class
    126  
     130
     131#if H_3D_ARP
     132  TAppEncTop*             m_pcTAppEncTop;
     133#endif
     134
    127135#if H_MV
    128136  TEncAnalyze             m_cAnalyzeAll;
     
    205213  Void                    setIvPicLists         ( TComPicLists* picLists) { m_ivPicLists = picLists; }
    206214#endif
     215#if H_3D_ARP
     216  Void            setTAppEncTop( TAppEncTop* pcTAppEncTop ) { m_pcTAppEncTop = pcTAppEncTop; }
     217  TAppEncTop*     getTAppEncTop()                           { return  m_pcTAppEncTop; }
     218#endif
    207219  // -------------------------------------------------------------------------------------------------------------------
    208220  // encoder function
  • branches/HTM-DEV-0.3-dev2a/source/Lib/TLibExtractor/TExtrTop.cpp

    r446 r464  
    115115}
    116116#endif
     117
Note: See TracChangeset for help on using the changeset viewer.