Ignore:
Timestamp:
26 Jan 2013, 19:36:53 (11 years ago)
Author:
mitsubishi-htm
Message:

-Integration of JCT3V-C0152 & JCT3V-C0131
-This check-in enable C0131 only

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HTM-5.1-dev3-MERL/source/Lib/TLibCommon/TComPrediction.cpp

    r210 r231  
    5454{
    5555  m_piYuvExt = NULL;
     56#if MERL_VSP_C0152
     57  m_pDepth = (Int*) malloc(64*64*sizeof(Int)); // TODO: Use a smart way to determine the size of the array
     58  if (m_pDepth == NULL)
     59  {
     60      printf("ERROR: UKTGHU, No memory allocated.\n");
     61  }
     62#endif
    5663}
    5764
     
    5966{
    6067 
     68#if MERL_VSP_C0152
     69  if (m_pDepth != NULL)
     70  {
     71      free(m_pDepth);
     72  }
     73#endif
    6174  delete[] m_piYuvExt;
    6275
     
    886899  }
    887900}
     901
     902#if MERL_VSP_C0152
     903#if DEPTH_MAP_GENERATION
     904Void TComPrediction::motionCompensationBWVSP( TComDataCU* pcCU, TComYuv* pcYuvPred, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY )
     905#else
     906Void TComPrediction::motionCompensationBWVSP ( TComDataCU* pcCU, TComYuv* pcYuvPred, UInt uiAbsPartIdx, RefPicList eRefPicList, Int iPartIdx )
     907#endif
     908{
     909  Int         iWidth;
     910  Int         iHeight;
     911  UInt        uiPartAddr;
     912
     913  if ( iPartIdx >= 0 )
     914  {
     915    pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iWidth, iHeight );
     916
     917#if DEPTH_MAP_GENERATION
     918    if( bPrdDepthMap )
     919    {
     920      iWidth  >>= uiSubSampExpX;
     921      iHeight >>= uiSubSampExpY;
     922    }
     923#endif
     924
     925    if ( eRefPicList != REF_PIC_LIST_X )
     926    {
     927#if LGE_ILLUCOMP_B0045
     928      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
     929#else
     930      if( pcCU->getSlice()->getPPS()->getUseWP())
     931#endif
     932      {
     933#if DEPTH_MAP_GENERATION
     934        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
     935#else
     936        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, true );
     937#endif
     938      }
     939      else
     940      {
     941#if DEPTH_MAP_GENERATION
     942        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     943#else
     944        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, false );
     945#endif
     946      }
     947#if LGE_ILLUCOMP_B0045
     948      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
     949#else
     950      if( pcCU->getSlice()->getPPS()->getUseWP())
     951#endif
     952      {
     953        xWeightedPredictionUni( pcCU, pcYuvPred, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx );
     954      }
     955    }
     956    else
     957    {
     958#if DEPTH_MAP_GENERATION
     959      if( xCheckIdenticalMotion( pcCU, uiPartAddr ) && !bPrdDepthMap )
     960#else
     961      if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) )
     962#endif
     963      {
     964#if DEPTH_MAP_GENERATION
     965        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     966#else
     967        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, false );
     968#endif
     969      }
     970      else
     971      {
     972#if DEPTH_MAP_GENERATION
     973        xPredInterBiBWVSP  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
     974#else
     975        xPredInterBiBWVSP  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, pcYuvPred, iPartIdx );
     976#endif
     977      }
     978    }
     979    return;
     980  }
     981
     982  for ( iPartIdx = 0; iPartIdx < pcCU->getNumPartInter(); iPartIdx++ )
     983  {
     984    pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iWidth, iHeight );
     985
     986#if DEPTH_MAP_GENERATION
     987    if( bPrdDepthMap )
     988    {
     989      iWidth  >>= uiSubSampExpX;
     990      iHeight >>= uiSubSampExpY;
     991    }
     992#endif
     993
     994    if ( eRefPicList != REF_PIC_LIST_X )
     995    {
     996#if LGE_ILLUCOMP_B0045
     997      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
     998#else
     999      if( pcCU->getSlice()->getPPS()->getUseWP())
     1000#endif
     1001      {
     1002#if DEPTH_MAP_GENERATION
     1003        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr , iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
     1004#else
     1005        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, true );
     1006#endif   
     1007      }
     1008      else
     1009      {
     1010#if DEPTH_MAP_GENERATION
     1011        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     1012#else
     1013        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, false );
     1014#endif   
     1015      }
     1016#if DEPTH_MAP_GENERATION
     1017      xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     1018#else
     1019      xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx, false );
     1020#endif 
     1021#if LGE_ILLUCOMP_B0045
     1022      if( pcCU->getSlice()->getPPS()->getUseWP() && !pcCU->getICFlag(uiPartAddr))
     1023#else
     1024      if( pcCU->getSlice()->getPPS()->getUseWP())
     1025#endif
     1026      {
     1027        xWeightedPredictionUni( pcCU, pcYuvPred, uiPartAddr, iWidth, iHeight, eRefPicList, pcYuvPred, iPartIdx );
     1028      }
     1029    }
     1030    else
     1031    {
     1032      if ( xCheckIdenticalMotion( pcCU, uiPartAddr ) )
     1033      {
     1034#if DEPTH_MAP_GENERATION
     1035        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     1036#else
     1037        xPredInterUniBWVSP (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, REF_PIC_LIST_0, pcYuvPred, iPartIdx, false );
     1038#endif
     1039      }
     1040      else
     1041      {
     1042#if DEPTH_MAP_GENERATION
     1043        xPredInterBiBWVSP  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, pcYuvPred, iPartIdx, bPrdDepthMap );
     1044#else
     1045        xPredInterBiBWVSP  (pcCU, uiPartAddr, uiAbsPartIdx+uiPartAddr, iWidth, iHeight, pcYuvPred, iPartIdx );
     1046#endif
     1047      }
     1048    }
     1049  }
     1050
     1051  return;
     1052}
     1053
     1054
     1055// Output: rpcYuvPred
     1056#if DEPTH_MAP_GENERATION
     1057Void TComPrediction::xPredInterUniBWVSP ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap, UInt uiSubSampExpX, UInt uiSubSampExpY, Bool bi )
     1058#else
     1059Void TComPrediction::xPredInterUniBWVSP ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, RefPicList eRefPicList, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bi )
     1060#endif
     1061{
     1062  Int  iRefIdx = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );   
     1063  Int  vspIdx  = pcCU->getVSPIndex(uiPartAddr);
     1064  if (vspIdx != 0)
     1065  {
     1066    if (iRefIdx >= 0)
     1067    {
     1068      printf("vspIdx = %d, iRefIdx = %d\n", vspIdx, iRefIdx);
     1069    }
     1070    assert (iRefIdx < 0); // assert (iRefIdx == NOT_VALID);
     1071  }
     1072  else
     1073  {
     1074    assert (iRefIdx >= 0);
     1075  }
     1076
     1077  TComMv cMv = pcCU->getCUMvField( eRefPicList )->getMv( uiPartAddr );
     1078  pcCU->clipMv(cMv);
     1079
     1080#if DEPTH_MAP_GENERATION
     1081  if( bPrdDepthMap )
     1082  {
     1083    UInt uiRShift = 0;
     1084#if PDM_REMOVE_DEPENDENCE
     1085    if( pcCU->getPic()->getStoredPDMforV2() == 1 )
     1086      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPredDepthMapTemp(), uiPartAddr, &cMv, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, rpcYuvPred, uiRShift, 0 );
     1087    else
     1088#endif
     1089      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPredDepthMap(), uiPartAddr, &cMv, iWidth, iHeight, uiSubSampExpX, uiSubSampExpY, rpcYuvPred, uiRShift, 0 );
     1090
     1091    return;
     1092  }
     1093#endif
     1094
     1095#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
     1096  if( pcCU->getSlice()->getSPS()->isDepth() )
     1097  {
     1098    if (vspIdx != 0)
     1099    { // depth, vsp
     1100      // get depth estimator here
     1101      TComPic* pRefPicBaseDepth = pcCU->getSlice()->getRefPicBaseDepth();
     1102      TComPicYuv* pcBaseViewDepthPicYuv = NULL;
     1103      if (vspIdx < 4) // spatial
     1104      {
     1105        pcBaseViewDepthPicYuv = pRefPicBaseDepth->getPicYuvRec();
     1106      }
     1107      Int iBlkX = ( pcCU->getAddr() % pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUWidth  + g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
     1108      Int iBlkY = ( pcCU->getAddr() / pRefPicBaseDepth->getFrameWidthInCU() ) * g_uiMaxCUHeight + g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
     1109      Int* pShiftLUT;
     1110      Int iShiftPrec;
     1111      pcCU->getSlice()->getBWVSPLUTParam(pShiftLUT, iShiftPrec);
     1112      //using disparity to find the depth block of the base view as the depth block estimator of the current block
     1113      //using depth block estimator and base view texture to get Backward warping
     1114      xPredInterLumaBlkFromDM  ( pcBaseViewDepthPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX,    iBlkY,    iWidth,    iHeight,     pcCU->getSlice()->getSPS()->isDepth(), vspIdx, rpcYuvPred );
     1115      xPredInterChromaBlkFromDM( pcBaseViewDepthPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX>>1, iBlkY>>1, iWidth>>1, iHeight>>1,  pcCU->getSlice()->getSPS()->isDepth(), vspIdx, rpcYuvPred );
     1116    }
     1117    else
     1118    { // depth, non-vsp
     1119      UInt uiRShift = ( bi ? 14-g_uiBitDepth-g_uiBitIncrement : 0 );
     1120      UInt uiOffset = bi ? IF_INTERNAL_OFFS : 0;
     1121#if DEPTH_MAP_GENERATION
     1122      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, 0, 0, rpcYuvPred, uiRShift, uiOffset );
     1123#else
     1124      xPredInterPrdDepthMap( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, uiRShift, uiOffset );
     1125#endif
     1126
     1127      xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
     1128    }
     1129  }
     1130  else // texture
     1131  {
     1132#endif
     1133    if ( vspIdx != 0 && !pcCU->getSlice()->getSPS()->isDepth())
     1134    { // texture, vsp
     1135      TComPic*    pRefPicBaseTxt        = pcCU->getSlice()->getRefPicBaseTxt();
     1136      TComPicYuv* pcBaseViewTxtPicYuv   = pRefPicBaseTxt->getPicYuvRec();
     1137      TComPicYuv* pcBaseViewDepthPicYuv = NULL;
     1138      if (vspIdx < 4) // spatial
     1139      {
     1140        TComPic* pRefPicBaseDepth = pcCU->getSlice()->getRefPicBaseDepth();
     1141        pcBaseViewDepthPicYuv     = pRefPicBaseDepth->getPicYuvRec();
     1142      }
     1143      Int iBlkX = ( pcCU->getAddr() % pRefPicBaseTxt->getFrameWidthInCU() ) * g_uiMaxCUWidth  + g_auiRasterToPelX[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
     1144      Int iBlkY = ( pcCU->getAddr() / pRefPicBaseTxt->getFrameWidthInCU() ) * g_uiMaxCUHeight + g_auiRasterToPelY[ g_auiZscanToRaster[ uiAbsPartIdx ] ];
     1145      Int* pShiftLUT;
     1146      Int iShiftPrec;
     1147      pcCU->getSlice()->getBWVSPLUTParam(pShiftLUT, iShiftPrec);
     1148
     1149      //using disparity to find the depth block of the base view as the depth block estimator of the current block
     1150      //using depth block estimator and base view texture to get Backward warping
     1151      xPredInterLumaBlkFromDM  ( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX,    iBlkY,    iWidth,    iHeight,    pcCU->getSlice()->getSPS()->isDepth(), vspIdx, rpcYuvPred );
     1152      xPredInterChromaBlkFromDM( pcBaseViewTxtPicYuv, pcBaseViewDepthPicYuv, pShiftLUT, iShiftPrec, &cMv, uiPartAddr, iBlkX>>1, iBlkY>>1, iWidth>>1, iHeight>>1, pcCU->getSlice()->getSPS()->isDepth(), vspIdx, rpcYuvPred );
     1153    }
     1154    else
     1155    { // texture, non-vsp
     1156#if LGE_ILLUCOMP_B0045
     1157      Bool bICFlag = pcCU->getICFlag(uiPartAddr) && (pcCU->getSlice()->getRefViewId( eRefPicList, iRefIdx ) != pcCU->getSlice()->getViewId());
     1158
     1159      xPredInterLumaBlk  ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, bICFlag);
     1160      xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi, bICFlag );
     1161#else
     1162      xPredInterLumaBlk  ( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
     1163      xPredInterChromaBlk( pcCU, pcCU->getSlice()->getRefPic( eRefPicList, iRefIdx )->getPicYuvRec(), uiPartAddr, &cMv, iWidth, iHeight, rpcYuvPred, bi );
     1164#endif
     1165    }
     1166#if HHI_FULL_PEL_DEPTH_MAP_MV_ACC
     1167  }
     1168#endif
     1169}
     1170
     1171
     1172#if DEPTH_MAP_GENERATION
     1173Void TComPrediction::xPredInterBiBWVSP ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, UInt uiSubSampExpX, UInt uiSubSampExpY, TComYuv*& rpcYuvPred, Int iPartIdx, Bool bPrdDepthMap )
     1174#else
     1175Void TComPrediction::xPredInterBiSDM ( TComDataCU* pcCU, UInt uiPartAddr, UInt uiAbsPartIdx, Int iWidth, Int iHeight, TComYuv*& rpcYuvPred, Int iPartIdx )
     1176#endif
     1177{
     1178  TComYuv* pcMbYuv;
     1179  Int      iRefIdx[2] = {-1, -1};
     1180
     1181  for ( Int iRefList = 0; iRefList < 2; iRefList++ )
     1182  {
     1183    RefPicList eRefPicList = (iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0);
     1184    iRefIdx[iRefList] = pcCU->getCUMvField( eRefPicList )->getRefIdx( uiPartAddr );
     1185#if MERL_VSP_C0152
     1186    if(!pcCU->getVSPIndex(uiPartAddr))
     1187    {
     1188      if ( iRefIdx[iRefList] < 0 )
     1189      {
     1190        continue;
     1191      }
     1192    }
     1193    else
     1194    {
     1195      if ( iRefList== REF_PIC_LIST_1 && iRefIdx[iRefList] < 0 ) // iRefIdx[iRefList] ==NOT_VALID
     1196      {
     1197        continue;
     1198      }
     1199    }
     1200#else
     1201    if ( iRefIdx[iRefList] < 0 )
     1202    {
     1203      continue;
     1204    }
     1205#endif
     1206    assert( iRefIdx[iRefList] < pcCU->getSlice()->getNumRefIdx(eRefPicList) );
     1207
     1208    pcMbYuv = &m_acYuvPred[iRefList];
     1209    if( pcCU->getCUMvField( REF_PIC_LIST_0 )->getRefIdx( uiPartAddr ) >= 0 && pcCU->getCUMvField( REF_PIC_LIST_1 )->getRefIdx( uiPartAddr ) >= 0 )
     1210    {
     1211#if DEPTH_MAP_GENERATION
     1212      xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
     1213#else
     1214      xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, true );
     1215#endif
     1216    }
     1217    else
     1218    {
     1219      if ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() )
     1220      {
     1221#if DEPTH_MAP_GENERATION
     1222        xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, true );
     1223#else
     1224        xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, true );
     1225#endif
     1226      }
     1227      else
     1228      {
     1229#if DEPTH_MAP_GENERATION
     1230        xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, bPrdDepthMap, uiSubSampExpX, uiSubSampExpY, false );
     1231#else
     1232        xPredInterUniBWVSP ( pcCU, uiPartAddr, uiAbsPartIdx, iWidth, iHeight, eRefPicList, pcMbYuv, iPartIdx, false );
     1233#endif
     1234      }
     1235    }
     1236  }
     1237
     1238  if ( pcCU->getSlice()->getPPS()->getWPBiPredIdc() )
     1239  {
     1240#if MERL_VSP_C0152
     1241    if(pcCU->getVSPIndex(uiPartAddr))
     1242      m_acYuvPred[0].copyPartToPartYuv( rpcYuvPred, uiPartAddr, iWidth, iHeight );
     1243    else
     1244#endif
     1245    xWeightedPredictionBi( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
     1246  }
     1247  else
     1248  {
     1249#if DEPTH_MAP_GENERATION
     1250    if ( bPrdDepthMap )
     1251    {
     1252      xWeightedAveragePdm( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred, uiSubSampExpX, uiSubSampExpY );
     1253    }
     1254    else
     1255    {
     1256#if MERL_VSP_C0152
     1257      if(pcCU->getVSPIndex(uiPartAddr))
     1258        m_acYuvPred[0].copyPartToPartYuv( rpcYuvPred, uiPartAddr, iWidth, iHeight );
     1259      else
     1260#endif
     1261      xWeightedAverage( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
     1262    }
     1263#else
     1264    xWeightedAverage( pcCU, &m_acYuvPred[0], &m_acYuvPred[1], iRefIdx[0], iRefIdx[1], uiPartAddr, iWidth, iHeight, rpcYuvPred );
     1265#endif
     1266  }
     1267}
     1268#endif
    8881269
    8891270Void
     
    11191500}
    11201501
     1502#if MERL_VSP_C0152
     1503// Input:
     1504// refPic: Ref picture. Full picture, with padding
     1505// posX, posY:     PU position, texture
     1506// size_x, size_y: PU size
     1507// partAddr: z-order index
     1508// mv: disparity vector. derived from neighboring blocks
     1509//
     1510// Output: dstPic, PU predictor 64x64
     1511Void TComPrediction::xPredInterLumaBlkFromDM( TComPicYuv *refPic, TComPicYuv *pPicBaseDepth, Int* pShiftLUT, Int iShiftPrec, TComMv* mv, UInt partAddr,Int posX, Int posY, Int size_x, Int size_y, Bool isDepth, Int vspIdx
     1512                                            , TComYuv *&dstPic )
     1513{
     1514  Int widthLuma;
     1515  Int heightLuma;
     1516
     1517  if (isDepth)
     1518  {
     1519    widthLuma   =  pPicBaseDepth->getWidth();
     1520    heightLuma  =  pPicBaseDepth->getHeight();
     1521  }
     1522  else
     1523  {
     1524    widthLuma   =  refPic->getWidth();
     1525    heightLuma  =  refPic->getHeight();
     1526  }
     1527
     1528#if MERL_VSP_BLOCKSIZE_C0152 != 1
     1529  Int widthDepth  = pPicBaseDepth->getWidth();
     1530  Int heightDepth = pPicBaseDepth->getHeight();
     1531#endif
     1532
     1533  Int nTxtPerDepthX = widthLuma  / ( pPicBaseDepth->getWidth() );  // texture pixel # per depth pixel
     1534  Int nTxtPerDepthY = heightLuma / ( pPicBaseDepth->getHeight() );
     1535
     1536  Int refStride = refPic->getStride();
     1537  Int dstStride = dstPic->getStride();
     1538  Int depStride =  pPicBaseDepth->getStride();
     1539
     1540  Int depthPosX = Clip3(0,   widthLuma - size_x - 1,  (posX/nTxtPerDepthX) + (mv->getHor()>>2));
     1541  Int depthPosY = Clip3(0,   heightLuma- size_y - 1,  (posY/nTxtPerDepthY) + (mv->getVer()>>2));
     1542
     1543  Pel *ref    = refPic->getLumaAddr() + posX + posY * refStride;
     1544  Pel *dst    = dstPic->getLumaAddr(partAddr);
     1545  Pel *depth  = pPicBaseDepth->getLumaAddr() + depthPosX + depthPosY * depStride;
     1546
     1547#if MERL_VSP_BLOCKSIZE_C0152 != 1
     1548#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1549  Int  dW = size_x>>1;
     1550  Int  dH = size_y>>1;
     1551#endif
     1552#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1553  Int  dW = size_x>>2;
     1554  Int  dH = size_y>>2;
     1555#endif
     1556  {
     1557    Pel* depthi = depth;
     1558    for (Int j = 0; j < dH; j++)
     1559    {
     1560      for (Int i = 0; i < dW; i++)
     1561      {
     1562        Pel* depthTmp;
     1563#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1564        if (depthPosX + (i<<1) < widthDepth)
     1565          depthTmp = depthi + (i << 1);
     1566        else
     1567          depthTmp = depthi + (widthDepth - depthPosX - 1);
     1568#endif
     1569#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1570        if (depthPosX + (i<<2) < widthDepth)
     1571          depthTmp = depthi + (i << 2);
     1572        else
     1573          depthTmp = depthi + (widthDepth - depthPosX - 1);
     1574#endif
     1575        Int maxV = 0;
     1576        for (Int blockj = 0; blockj < MERL_VSP_BLOCKSIZE_C0152; blockj++)
     1577        {
     1578          Int iX = 0;
     1579          for (Int blocki = 0; blocki < MERL_VSP_BLOCKSIZE_C0152; blocki++)
     1580          {
     1581            if (maxV < depthTmp[iX])
     1582              maxV = depthTmp[iX];
     1583#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1584            if (depthPosX + (i<<1) + blocki < widthDepth - 1)
     1585#else // MERL_VSP_BLOCKSIZE_C0152 == 4
     1586            if (depthPosX + (i<<2) + blocki < widthDepth - 1)
     1587#endif
     1588              iX++;
     1589          }
     1590#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1591          if (depthPosY + (j<<1) + blockj < heightDepth - 1)
     1592#else // MERL_VSP_BLOCKSIZE_C0152 == 4
     1593          if (depthPosY + (j<<2) + blockj < heightDepth - 1)
     1594#endif
     1595            depthTmp += depStride;
     1596        }
     1597        m_pDepth[i+j*dW] = maxV;
     1598      } // end of i < dW
     1599#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1600      if (depthPosY + ((j+1)<<1) < heightDepth)
     1601        depthi += (depStride << 1);
     1602      else
     1603        depthi  = depth + (heightDepth-depthPosY-1)*depStride;
     1604#endif
     1605#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1606      if (depthPosY + ((j+1)<<2) < heightDepth) // heightDepth-1
     1607        depthi += (depStride << 2);
     1608      else
     1609        depthi  = depth + (heightDepth-depthPosY-1)*depStride; // the last line
     1610#endif
     1611    }
     1612  }
     1613#endif
     1614 
     1615#if MERL_VSP_BLOCKSIZE_C0152 != 1
     1616  Int yDepth = 0;
     1617#endif
     1618  for ( Int yTxt = 0; yTxt < size_y; yTxt += nTxtPerDepthY )
     1619  {
     1620    for ( Int xTxt = 0, xDepth = 0; xTxt < size_x; xTxt += nTxtPerDepthX, xDepth++ )
     1621    {
     1622      Pel rep_depth = 0; // to store the depth value used for warping
     1623#if MERL_VSP_BLOCKSIZE_C0152 == 1
     1624      rep_depth = depth[xDepth];
     1625#endif
     1626#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1627      rep_depth = m_pDepth[(xTxt>>1) + (yTxt>>1)*dW];
     1628#endif
     1629#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1630      rep_depth = m_pDepth[(xTxt>>2) + (yTxt>>2)*dW];
     1631#endif
     1632
     1633      assert( rep_depth >= 0 && rep_depth <= 255 );
     1634      Int disparity = pShiftLUT[ rep_depth ] << iShiftPrec;
     1635      Int refOffset = xTxt + (disparity >> 2);
     1636      Int xFrac = disparity & 0x3;
     1637      Int absX  = posX + refOffset;
     1638
     1639      if (xFrac == 0)
     1640        absX = Clip3(0, widthLuma-1, absX);
     1641      else
     1642        absX = Clip3(4, widthLuma-5, absX);
     1643
     1644      refOffset = absX - posX;
     1645
     1646      assert( ref[refOffset] >= 0 && ref[refOffset]<= 255 );
     1647      m_if.filterHorLuma( &ref[refOffset], refStride, &dst[xTxt], dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true );
     1648    }
     1649    ref   += refStride*nTxtPerDepthY;
     1650    dst   += dstStride*nTxtPerDepthY;
     1651    depth += depStride;
     1652#if MERL_VSP_BLOCKSIZE_C0152 != 1
     1653    yDepth++;
     1654#endif
     1655  }
     1656}
     1657
     1658Void TComPrediction::xPredInterChromaBlkFromDM ( TComPicYuv *refPic, TComPicYuv *pPicBaseDepth, Int* pShiftLUT, Int iShiftPrec, TComMv*mv, UInt partAddr, Int posX, Int posY, Int size_x, Int size_y, Bool isDepth, Int vspIdx
     1659                                               , TComYuv *&dstPic )
     1660{
     1661  Int refStride = refPic->getCStride();
     1662  Int dstStride = dstPic->getCStride();
     1663  Int depStride = pPicBaseDepth->getStride();
     1664
     1665  Int widthChroma, heightChroma;
     1666  if( isDepth)
     1667  {
     1668     widthChroma   = pPicBaseDepth->getWidth()>>1;
     1669     heightChroma  = pPicBaseDepth->getHeight()>>1;
     1670  }
     1671  else
     1672  {
     1673     widthChroma   = refPic->getWidth()>>1;
     1674     heightChroma  = refPic->getHeight()>>1;
     1675  }
     1676
     1677  // Below is only for Texture chroma component
     1678
     1679  Int widthDepth  = pPicBaseDepth->getWidth();
     1680  Int heightDepth = pPicBaseDepth->getHeight();
     1681
     1682  Int nTxtPerDepthX, nTxtPerDepthY;  // Number of texture samples per one depth sample
     1683  Int nDepthPerTxtX, nDepthPerTxtY;  // Number of depth samples per one texture sample
     1684
     1685  Int depthPosX;  // Starting position in depth image
     1686  Int depthPosY;
     1687
     1688  if ( widthChroma > widthDepth )
     1689  {
     1690    nTxtPerDepthX = widthChroma / widthDepth;
     1691    nDepthPerTxtX = 1;
     1692    depthPosX = posX / nTxtPerDepthX + (mv->getHor()>>2);        //mv denotes the disparity for VSP
     1693  }
     1694  else
     1695  {
     1696    nTxtPerDepthX = 1;
     1697    nDepthPerTxtX = widthDepth / widthChroma;
     1698    depthPosX = posX * nDepthPerTxtX + (mv->getHor()>>2);        //mv denotes the disparity for VSP
     1699  }
     1700  depthPosX = Clip3(0, widthDepth - (size_x<<1) - 1, depthPosX);
     1701 
     1702  if ( heightChroma > heightDepth )
     1703  {
     1704    nTxtPerDepthY = heightChroma / heightDepth;
     1705    nDepthPerTxtY = 1;
     1706    depthPosY = posY / nTxtPerDepthY + (mv->getVer()>>2);     //mv denotes the disparity for VSP
     1707  }
     1708  else
     1709  {
     1710    nTxtPerDepthY = 1;
     1711    nDepthPerTxtY = heightDepth / heightChroma;
     1712    depthPosY = posY * nDepthPerTxtY + (mv->getVer()>>2);     //mv denotes the disparity for VSP
     1713  }
     1714  depthPosY = Clip3(0, heightDepth - (size_y<<1) - 1, depthPosY);
     1715
     1716  Pel *refCb  = refPic->getCbAddr() + posX + posY * refStride;
     1717  Pel *refCr  = refPic->getCrAddr() + posX + posY * refStride;
     1718  Pel *dstCb  = dstPic->getCbAddr(partAddr);
     1719  Pel *dstCr  = dstPic->getCrAddr(partAddr);
     1720  Pel *depth  = pPicBaseDepth->getLumaAddr() + depthPosX + depthPosY * depStride;  // move the pointer to the current depth pixel position
     1721 
     1722  Int refStrideBlock = refStride * nTxtPerDepthY;
     1723  Int dstStrideBlock = dstStride * nTxtPerDepthY;
     1724  Int depStrideBlock = depStride * nDepthPerTxtY;
     1725
     1726  if (isDepth)
     1727  {
     1728     // DT: Since the call for this function is redundant, ..
     1729     for (Int y = 0; y < size_y; y++)
     1730     {
     1731       for (Int x = 0; x < size_x; x++)
     1732       {
     1733         dstCb[x] = 128;
     1734         dstCr[x] = 128;
     1735       }
     1736       dstCb += dstStride;
     1737       dstCr += dstStride;
     1738     }
     1739     return;
     1740  }
     1741 
     1742  if ( widthChroma > widthDepth ) // We assume
     1743  {
     1744    assert( heightChroma > heightDepth );
     1745    printf("This branch should never been reached.\n");
     1746    exit(0);
     1747  }
     1748  else
     1749  {
     1750#if MERL_VSP_BLOCKSIZE_C0152 == 1
     1751  Int  dW = size_x;
     1752  Int  dH = size_y;
     1753  Int  sW = 2; // search window size
     1754  Int  sH = 2;
     1755#endif
     1756#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1757  Int  dW = size_x;
     1758  Int  dH = size_y;
     1759  Int  sW = 2; // search window size
     1760  Int  sH = 2;
     1761#endif
     1762#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1763  Int  dW = size_x>>1;
     1764  Int  dH = size_y>>1;
     1765  Int  sW = 4; // search window size
     1766  Int  sH = 4;
     1767#endif
     1768
     1769  {
     1770    Pel* depthi = depth;
     1771    for (Int j = 0; j < dH; j++)
     1772    {
     1773      for (Int i = 0; i < dW; i++)
     1774      {
     1775        Pel* depthTmp;
     1776#if MERL_VSP_BLOCKSIZE_C0152 == 1
     1777        depthTmp = depthi + (i << 1);
     1778#endif
     1779#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1780        if (depthPosX + (i<<1) < widthDepth)
     1781          depthTmp = depthi + (i << 1);
     1782        else
     1783          depthTmp = depthi + (widthDepth - depthPosX - 1);
     1784#endif
     1785#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1786        if (depthPosX + (i<<2) < widthDepth)
     1787          depthTmp = depthi + (i << 2);
     1788        else
     1789          depthTmp = depthi + (widthDepth - depthPosX - 1);
     1790#endif
     1791        Int maxV = 0;
     1792        for (Int blockj = 0; blockj < sH; blockj++)
     1793        {
     1794          Int iX = 0;
     1795          for (Int blocki = 0; blocki < sW; blocki++)
     1796          {
     1797            if (maxV < depthTmp[iX])
     1798              maxV = depthTmp[iX];
     1799            if (depthPosX + i*sW + blocki < widthDepth - 1)
     1800              iX++;
     1801          }
     1802          if (depthPosY + j*sH + blockj < heightDepth - 1)
     1803            depthTmp += depStride;
     1804        }
     1805        m_pDepth[i+j*dW] = maxV;
     1806      } // end of i < dW
     1807#if MERL_VSP_BLOCKSIZE_C0152 == 1
     1808      if (depthPosY + ((j+1)<<1) < heightDepth)
     1809        depthi += (depStride << 1);
     1810      else
     1811        depthi  = depth + (heightDepth-1)*depStride;
     1812#endif
     1813#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1814      if (depthPosY + ((j+1)<<1) < heightDepth)
     1815        depthi += (depStride << 1);
     1816      else
     1817        depthi  = depth + (heightDepth-depthPosY-1)*depStride;
     1818#endif
     1819#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1820      if (depthPosY + ((j+1)<<2) < heightDepth) // heightDepth-1
     1821        depthi += (depStride << 2);
     1822      else
     1823        depthi  = depth + (heightDepth-depthPosY-1)*depStride; // the last line
     1824#endif
     1825    }
     1826  }
     1827
     1828
     1829    // (size_x, size_y) is Chroma block size
     1830    for ( Int yTxt = 0, yDepth = 0; yTxt < size_y; yTxt += nTxtPerDepthY, yDepth += nDepthPerTxtY )
     1831    {
     1832      for ( Int xTxt = 0, xDepth = 0; xTxt < size_x; xTxt += nTxtPerDepthX, xDepth += nDepthPerTxtX )
     1833      {
     1834        Pel rep_depth = 0; // to store the depth value used for warping
     1835#if MERL_VSP_BLOCKSIZE_C0152 == 1
     1836        rep_depth = m_pDepth[(xTxt) + (yTxt)*dW];
     1837#endif
     1838#if MERL_VSP_BLOCKSIZE_C0152 == 2
     1839        rep_depth = m_pDepth[(xTxt) + (yTxt)*dW];
     1840#endif
     1841#if MERL_VSP_BLOCKSIZE_C0152 == 4
     1842        rep_depth = m_pDepth[(xTxt>>1) + (yTxt>>1)*dW];
     1843#endif
     1844
     1845      // calculate the offset in the reference picture
     1846        Int disparity = pShiftLUT[ rep_depth ] << iShiftPrec;
     1847        Int refOffset = xTxt + (disparity >> 3); // in integer pixel in chroma image
     1848        Int xFrac = disparity & 0x7;
     1849        Int absX  = posX + refOffset;
     1850
     1851        if (xFrac == 0)
     1852          absX = Clip3(0, widthChroma-1, absX);
     1853        else
     1854          absX = Clip3(4, widthChroma-5, absX);
     1855
     1856        refOffset = absX - posX;
     1857
     1858        assert( refCb[refOffset] >= 0 && refCb[refOffset]<= 255 );
     1859        assert( refCr[refOffset] >= 0 && refCr[refOffset]<= 255 );
     1860        m_if.filterHorChroma(&refCb[refOffset], refStride, &dstCb[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true);
     1861        m_if.filterHorChroma(&refCr[refOffset], refStride, &dstCr[xTxt],  dstStride, nTxtPerDepthX, nTxtPerDepthY, xFrac, true);
     1862      }
     1863      refCb += refStrideBlock;
     1864      refCr += refStrideBlock;
     1865      dstCb += dstStrideBlock;
     1866      dstCr += dstStrideBlock;
     1867      depth += depStrideBlock;
     1868    }
     1869  }
     1870}
     1871
     1872#endif // MERL_VSP_C0152
     1873
    11211874#if DEPTH_MAP_GENERATION
    11221875Void TComPrediction::xWeightedAveragePdm( TComDataCU* pcCU, TComYuv* pcYuvSrc0, TComYuv* pcYuvSrc1, Int iRefIdx0, Int iRefIdx1, UInt uiPartIdx, Int iWidth, Int iHeight, TComYuv*& rpcYuvDst, UInt uiSubSampExpX, UInt uiSubSampExpY )
Note: See TracChangeset for help on using the changeset viewer.