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


Ignore:
Timestamp:
7 Feb 2013, 02:16:51 (12 years ago)
Author:
seregin
Message:

Reintegrate SHM-1.0-dev branch

Location:
trunk/source/Lib/TLibCommon
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/source/Lib/TLibCommon/TComDataCU.cpp

    r12 r28  
    21432143#endif
    21442144
     2145#if REF_IDX_ME_ZEROMV
     2146Bool TComDataCU::xCheckZeroMVILRMerge(UChar uhInterDir, TComMvField& cMvFieldL0, TComMvField& cMvFieldL1)
     2147{
     2148        Bool checkZeroMVILR = true;
     2149
     2150        if(uhInterDir&0x1)  //list0
     2151        {
     2152                Int refIdxL0 = cMvFieldL0.getRefIdx();
     2153                if(getSlice()->getRefPic(REF_PIC_LIST_0, refIdxL0)->getIsILR())
     2154                        checkZeroMVILR &= (cMvFieldL0.getHor() == 0 && cMvFieldL0.getVer() == 0);
     2155        }
     2156        if(uhInterDir&0x2)  //list1
     2157        {
     2158                Int refIdxL1  = cMvFieldL1.getRefIdx();
     2159                if(getSlice()->getRefPic(REF_PIC_LIST_1, refIdxL1)->getIsILR())
     2160                        checkZeroMVILR &= (cMvFieldL1.getHor() == 0 && cMvFieldL1.getVer() == 0);
     2161        }
     2162
     2163        return checkZeroMVILR;
     2164}
     2165
     2166Bool TComDataCU::xCheckZeroMVILRMvdL1Zero(Int iRefList, Int iRefIdx, Int MvpIdx)
     2167{
     2168        RefPicList eRefPicList = iRefList > 0? REF_PIC_LIST_1: REF_PIC_LIST_0;
     2169        assert(eRefPicList == REF_PIC_LIST_1);
     2170
     2171        Bool checkZeroMVILR = true;
     2172
     2173        if(getSlice()->getRefPic(eRefPicList, iRefIdx)->getIsILR())
     2174        {
     2175                AMVPInfo* pcAMVPInfo = getCUMvField(eRefPicList)->getAMVPInfo();
     2176                TComMv    cMv        = pcAMVPInfo->m_acMvCand[MvpIdx];
     2177                checkZeroMVILR &= (cMv.getHor() == 0 && cMv.getVer() == 0);
     2178        }
     2179
     2180        return checkZeroMVILR;
     2181}
     2182#endif
     2183
    21452184UInt TComDataCU::getCtxSkipFlag( UInt uiAbsPartIdx )
    21462185{
  • trunk/source/Lib/TLibCommon/TComDataCU.h

    r2 r28  
    562562  UInt          getCtxIntraBLFlag               ( UInt   uiAbsPartIdx                                 );
    563563#endif 
    564  
     564
     565#if REF_IDX_ME_ZEROMV
     566  Bool xCheckZeroMVILRMerge(UChar uhInterDir, TComMvField& cMvFieldL0, TComMvField& cMvFieldL1);
     567  Bool xCheckZeroMVILRMvdL1Zero(Int iRefList, Int iRefIdx, Int MvpIdx);
     568#endif
     569
    565570  UInt          getSliceStartCU         ( UInt pos )                  { return m_uiSliceStartCU[pos-m_uiAbsIdxInLCU];                                                                                          }
    566571  UInt          getDependentSliceStartCU  ( UInt pos )                  { return m_uiDependentSliceStartCU[pos-m_uiAbsIdxInLCU];                                                                                   }
     
    591596#endif
    592597};
     598
     599
    593600
    594601namespace RasterAddress
  • trunk/source/Lib/TLibCommon/TComMotionInfo.h

    r2 r28  
    158158  Void compress(Char* pePredMode, Int scale);
    159159#endif
     160
     161#if REF_IDX_MFM
     162  Void    setMvField( TComMvField const  & mvField, Int iIdx)
     163  {
     164    m_pcMv[iIdx]      = mvField.getMv();
     165    m_piRefIdx[iIdx]  = mvField.getRefIdx();
     166    return;
     167  }
     168
     169  Void    setMvField( TComMv  cMv,  Int iRefIdx, Int iIdx)
     170  {
     171    m_pcMv[iIdx]      = cMv;
     172    m_piRefIdx[iIdx]  = iRefIdx;
     173    return;
     174  }
     175#endif
    160176};
    161177
  • trunk/source/Lib/TLibCommon/TComPic.cpp

    r21 r28  
    6868, m_bSpatialEnhLayer( false )
    6969, m_pcFullPelBaseRec( NULL )
    70 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE
     70#if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM
    7171, m_bIsILR                                (false)
    7272#endif
     73
    7374#endif
    7475{
     
    554555    upsampledRowWidthCroma);
    555556}
     557
     558#if REF_IDX_MFM
     559Void TComPic::deriveUnitIdxBase( UInt uiUpsamplePelX, UInt uiUpsamplePelY, UInt ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx )
     560{
     561  //pixel in the base layer
     562
     563  UInt uiPelX       = (uiUpsamplePelX<<1)/ratio;
     564  UInt uiPelY       = (uiUpsamplePelY<<1)/ratio;
     565  UInt uiBaseWidth  = getPicYuvRec()->getWidth();
     566  UInt uiBaseHeight = getPicYuvRec()->getHeight();
     567
     568  UInt uiWidthInCU       = ( uiBaseWidth % g_uiMaxCUWidth  ) ? uiBaseWidth /g_uiMaxCUWidth  + 1 : uiBaseWidth /g_uiMaxCUWidth;
     569  UInt uiHeightInCU      = ( uiBaseHeight% g_uiMaxCUHeight ) ? uiBaseHeight/ g_uiMaxCUHeight + 1 : uiBaseHeight/ g_uiMaxCUHeight;
     570
     571  uiPelX     = (UInt)Clip3<UInt>(0, uiWidthInCU * g_uiMaxCUWidth - 1, uiPelX);
     572  uiPelY     = (UInt)Clip3<UInt>(0, uiHeightInCU * g_uiMaxCUHeight - 1, uiPelY);
     573 
     574  uiBaseCUAddr = uiPelY / g_uiMaxCUHeight * uiWidthInCU + uiPelX / g_uiMaxCUWidth;
     575
     576  UInt uiWidthMinPU = g_uiMaxCUWidth / (1<<g_uiMaxCUDepth);
     577  UInt uiHeightMinPU = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth);
     578 
     579  UInt uiAbsPelX = uiPelX - (uiPelX / g_uiMaxCUWidth) * g_uiMaxCUWidth;
     580  UInt uiAbsPelY = uiPelY - (uiPelY / g_uiMaxCUHeight) * g_uiMaxCUHeight;
     581
     582  UInt RasterIdx = uiAbsPelY / uiHeightMinPU * (g_uiMaxCUWidth/uiWidthMinPU) + uiAbsPelX / uiWidthMinPU;
     583  uiBaseAbsPartIdx = g_auiRasterToZscan[RasterIdx];
     584
     585  return;
     586}
     587
     588
     589
     590
     591Void TComPic::copyUpsampledMvField(TComPic* pcPicBase)
     592{
     593
     594
     595
     596        Int iBWidth   = pcPicBase->getPicYuvRec()->getWidth () - pcPicBase->getPicYuvRec()->getPicCropLeftOffset() - pcPicBase->getPicYuvRec()->getPicCropRightOffset();
     597        Int iBHeight  = pcPicBase->getPicYuvRec()->getHeight() - pcPicBase->getPicYuvRec()->getPicCropTopOffset() - pcPicBase->getPicYuvRec()->getPicCropBottomOffset();
     598
     599        Int iEWidth   = getPicYuvRec()->getWidth() -  getPicYuvRec()->getPicCropLeftOffset() - getPicYuvRec()->getPicCropRightOffset();
     600        Int iEHeight  = getPicYuvRec()->getHeight() - getPicYuvRec()->getPicCropTopOffset() -  getPicYuvRec()->getPicCropBottomOffset();
     601
     602
     603        UInt upSampleRatio = 0;
     604        if(iEWidth == iBWidth && iEHeight == iBHeight)
     605        {
     606                upSampleRatio = 2;
     607        }
     608        else if(2*iEWidth == 3*iBWidth && 2*iEHeight == 3*iBHeight)
     609        {
     610                upSampleRatio = 3;
     611        }
     612        else if(iEWidth == 2*iBWidth && iEHeight == 2*iBHeight)
     613        {
     614                upSampleRatio = 4;
     615        }
     616        else
     617        {
     618                assert(0);
     619        }
     620
     621        for(UInt cuIdx = 0; cuIdx < getPicSym()->getNumberOfCUsInFrame(); cuIdx++)  //each LCU
     622        {
     623                UInt uiNumPartitions   = 1<<(g_uiMaxCUDepth<<1);
     624
     625                TComDataCU*             pcCUDes = getCU(cuIdx);
     626
     627                UInt uiWidthMinPU      = g_uiMaxCUWidth/(1<<g_uiMaxCUDepth);
     628                UInt uiHeightMinPU     = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth);
     629                Int unitNum = max (1, (Int)((16/uiWidthMinPU)*(16/uiHeightMinPU)) );
     630
     631                for(UInt uiAbsPartIdx = 0; uiAbsPartIdx < uiNumPartitions; uiAbsPartIdx+=unitNum )  //each 16x16 unit
     632                {
     633                        //pixel position of each unit in up-sampled layer
     634                        UInt    uiPelX = pcCUDes->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ];
     635                        UInt    uiPelY = pcCUDes->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ];
     636                        UInt uiBaseCUAddr, uiBaseAbsPartIdx;
     637                pcPicBase->deriveUnitIdxBase(uiPelX + 8, uiPelY + 8, upSampleRatio, uiBaseCUAddr, uiBaseAbsPartIdx);
     638                        if( (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) )  //base layer unit not skip and invalid mode
     639                        {
     640                                for(UInt list = 0; list < 2; list++)  //each list
     641                                {
     642                                        TComMv cMv = pcPicBase->getCU(uiBaseCUAddr)->getCUMvField((RefPicList)list)->getMv(uiBaseAbsPartIdx);
     643                                        Int refIdx = pcPicBase->getCU(uiBaseCUAddr)->getCUMvField((RefPicList)list)->getRefIdx(uiBaseAbsPartIdx);
     644
     645                                        Int Hor =  ((Int)upSampleRatio * cMv.getHor())/2 ;
     646                                        Int Ver =  ((Int)upSampleRatio * cMv.getVer())/2 ;
     647
     648                                        TComMv cScaledMv(Hor, Ver);
     649                                        TComMvField sMvField;
     650                                        sMvField.setMvField(cScaledMv, refIdx);
     651
     652                                        pcCUDes->getCUMvField((RefPicList)list)->setMvField(sMvField, uiAbsPartIdx);
     653                                        pcCUDes->setPredictionMode(uiAbsPartIdx, MODE_INTER);
     654                                }
     655                        }
     656
     657                        else
     658                        {
     659                                TComMvField zeroMvField;  //zero MV and invalid reference index
     660                                pcCUDes->getCUMvField(REF_PIC_LIST_0)->setMvField(zeroMvField, uiAbsPartIdx);
     661                                pcCUDes->getCUMvField(REF_PIC_LIST_1)->setMvField(zeroMvField, uiAbsPartIdx);
     662                                pcCUDes->setPredictionMode(uiAbsPartIdx, MODE_INTRA);
     663                        }
     664
     665                        for(UInt i = 1; i < unitNum; i++ ) 
     666                        {
     667                                pcCUDes->getCUMvField(REF_PIC_LIST_0)->setMvField(pcCUDes->getCUMvField(REF_PIC_LIST_0)->getMv(uiAbsPartIdx), pcCUDes->getCUMvField(REF_PIC_LIST_0)->getRefIdx(uiAbsPartIdx), uiAbsPartIdx + i);
     668                                pcCUDes->getCUMvField(REF_PIC_LIST_1)->setMvField(pcCUDes->getCUMvField(REF_PIC_LIST_1)->getMv(uiAbsPartIdx), pcCUDes->getCUMvField(REF_PIC_LIST_1)->getRefIdx(uiAbsPartIdx), uiAbsPartIdx + i);
     669                                pcCUDes->setPredictionMode(uiAbsPartIdx+i, pcCUDes->getPredictionMode(uiAbsPartIdx))  ;
     670                        }
     671                }
     672                        memset( pcCUDes->getPartitionSize(), SIZE_2Nx2N, sizeof(char)*uiNumPartitions);
     673        }
     674}
    556675#endif
    557676
     677#endif
     678
    558679//! \}
  • trunk/source/Lib/TLibCommon/TComPic.h

    r21 r28  
    8888  Bool                  m_bSpatialEnhLayer;       // whether current layer is a spatial enhancement layer,
    8989  TComPicYuv*           m_pcFullPelBaseRec;    // upsampled base layer recontruction for difference domain inter prediction
    90 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE
     90#if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM
    9191  Bool                  m_bIsILR;                 //  Is ILR picture
    9292#endif
     
    118118  TComPicYuv*   getFullPelBaseRec   ()  { return  m_pcFullPelBaseRec;  }
    119119#endif
    120 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE
     120#if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM
    121121  Void          setIsILR( Bool bIsILR)      {m_bIsILR = bIsILR;}
    122122  Bool          getIsILR()                  {return m_bIsILR;}
     123#endif
     124
     125#if REF_IDX_MFM
     126  Void          copyUpsampledMvField  (  TComPic* pcPicBase );
     127  Void          deriveUnitIdxBase     (  UInt uiUpsamplePelX, UInt uiUpsamplePelY, UInt ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx );
    123128#endif
    124129
  • trunk/source/Lib/TLibCommon/TComPicYuv.h

    r2 r28  
    129129#endif
    130130
     131#if JCTVC_L0178
     132  Void   setWidth   ( Int iPicWidth )     { m_iPicWidth = iPicWidth; }
     133#endif
    131134  Int   getStride   ()     { return (m_iPicWidth     ) + (m_iLumaMarginX  <<1); }
    132135  Int   getCStride  ()     { return (m_iPicWidth >> 1) + (m_iChromaMarginX<<1); }
  • trunk/source/Lib/TLibCommon/TComSlice.cpp

    r11 r28  
    519519  if(getSPS()->getLayerId() && m_eSliceType != I_SLICE)
    520520  {
     521#if REF_IDX_MFM
     522    assert(iRefPicNum == 1);
     523    if( getPOC() != 0 )
     524    {
     525      pIlpPicList[0]->copyUpsampledMvField(getBaseColPic());
     526    }
     527#endif
    521528    //add to list 0;
    522529    Int iOffset;
     
    546553  }
    547554}
     555
     556#if REF_IDX_MFM
     557Void TComSlice::setRefPOCListILP( TComPic** ilpPic, TComPic *pcRefPicBL )
     558{
     559  //set reference picture POC of each ILP reference
     560  Int thePoc = ilpPic[0]->getPOC();
     561  assert(thePoc >= 0);
     562  assert(thePoc == pcRefPicBL->getPOC());
     563
     564  //initialize reference POC of ILP
     565  for(Int refIdx = 0; refIdx < MAX_NUM_REF; refIdx++)
     566  {
     567    ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_0, refIdx);
     568    ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_1, refIdx);
     569
     570    ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_0, refIdx);
     571    ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_1, refIdx);
     572  }
     573
     574  //set reference POC of ILP
     575  ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_0, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0));
     576  assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0) <= MAX_NUM_REF);
     577  ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_1, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1));
     578  assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1) <= MAX_NUM_REF);
     579
     580  for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++)
     581  {
     582          ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx);
     583  }
     584  for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++)
     585  {
     586          ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx);
     587  }
     588  for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++)
     589  {
     590          ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx);
     591  }
     592  for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++)
     593  {
     594          ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx);
     595  }
     596  return;
     597}
     598#endif
     599
    548600#endif
    549601
  • trunk/source/Lib/TLibCommon/TComSlice.h

    r11 r28  
    649649  UInt m_layerId;
    650650#endif
     651#if REF_IDX_MFM
     652  Bool m_bMFMEnabledFlag;
     653#endif
    651654public:
    652655  TComSPS();
     
    837840  UInt     getLayerId() { return m_layerId; }
    838841#endif
     842#if REF_IDX_MFM
     843  Void     setMFMEnabledFlag(Bool flag) {m_bMFMEnabledFlag = flag;}
     844  Bool     getMFMEnabledFlag()          {return m_bMFMEnabledFlag;}
     845#endif
    839846};
    840847
     
    14481455  TComPicYuv* getFullPelBaseRec   ()  { return  m_pcFullPelBaseRec;  }
    14491456#endif
     1457
     1458#if REF_IDX_MFM
     1459  Void      setRefPOCListILP(TComPic** ilpPic, TComPic *pcRefPicBL);
     1460#endif
     1461
    14501462  Void      setRefPicList       ( TComList<TComPic*>& rcListPic );
    14511463  Void      setRefPOCList       ();
  • trunk/source/Lib/TLibCommon/TComUpsampleFilter.cpp

    r18 r28  
    143143  Int iEHeight  = pcUsPic->getHeight() - pcUsPic->getPicCropTopOffset() - pcUsPic->getPicCropBottomOffset();
    144144  Int iEStride  = pcUsPic->getStride();
    145 
     145 
     146  Pel* piTempBufY = pcTempPic->getLumaAddr();
     147  Pel* piSrcBufY  = pcBasePic->getLumaAddr();
     148  Pel* piDstBufY  = pcUsPic->getLumaAddr();
     149 
     150  Pel* piSrcY;
     151  Pel* piDstY;
     152 
     153  Pel* piTempBufU = pcTempPic->getCbAddr();
     154  Pel* piSrcBufU  = pcBasePic->getCbAddr();
     155  Pel* piDstBufU  = pcUsPic->getCbAddr();
     156 
     157  Pel* piTempBufV = pcTempPic->getCrAddr();
     158  Pel* piSrcBufV  = pcBasePic->getCrAddr();
     159  Pel* piDstBufV  = pcUsPic->getCrAddr();
     160 
     161  Pel* piSrcU;
     162  Pel* piDstU;
     163  Pel* piSrcV;
     164  Pel* piDstV;
     165 
     166#if JCTVC_L0178
     167  Pel *tempBufRight = NULL, *tempBufBottom = NULL;
     168  Int tempBufSizeRight = 0, tempBufSizeBottom = 0;
     169 
     170  if ( pcBasePic->getPicCropRightOffset() )
     171  {
     172    tempBufSizeRight = pcBasePic->getPicCropRightOffset() * pcBasePic->getHeight();
     173  }
     174 
     175  if( pcBasePic->getPicCropBottomOffset() )
     176  {
     177    tempBufSizeBottom = pcBasePic->getPicCropBottomOffset() * pcBasePic->getWidth ();
     178  }
     179 
     180  if( tempBufSizeRight )
     181  {
     182    tempBufRight = (Pel *) xMalloc(Pel, tempBufSizeRight + (tempBufSizeRight>>1) );
     183    assert( tempBufRight );
     184  }
     185 
     186  if( tempBufSizeBottom )
     187  {
     188    tempBufBottom = (Pel *) xMalloc(Pel, tempBufSizeBottom + (tempBufSizeBottom>>1) );
     189    assert( tempBufBottom );
     190  }
     191 
     192#endif
     193 
    146194#if PHASE_DERIVATION_IN_INTEGER
    147195  Int iRefPos16 = 0;
     
    179227#endif
    180228
    181   Pel* piTempBufY = pcTempPic->getLumaAddr();
    182   Pel* piSrcBufY  = pcBasePic->getLumaAddr();
    183   Pel* piDstBufY  = pcUsPic->getLumaAddr();
    184 
    185   Pel* piSrcY;
    186   Pel* piDstY;
     229
    187230
    188231  assert ( iEWidth == 2*iBWidth || 2*iEWidth == 3*iBWidth );
    189232  assert ( iEHeight == 2*iBHeight || 2*iEHeight == 3*iBHeight );
    190233
     234#if JCTVC_L0178
     235  // save the cropped region to copy back to the base picture since the base picture might be used as a reference picture
     236  if( tempBufSizeRight )
     237  {
     238    piSrcY = piSrcBufY + iBWidth;
     239    piDstY = tempBufRight;
     240    for( i = 0; i < pcBasePic->getHeight(); i++ )
     241    {
     242      memcpy(piDstY, piSrcY, sizeof(Pel) * pcBasePic->getPicCropRightOffset());
     243      piSrcY += iBStride;
     244      piDstY += pcBasePic->getPicCropRightOffset();
     245    }
     246   
     247    if(pcBasePic->getPicCropRightOffset()>>1)
     248    {
     249      Int iBStrideChroma = (iBStride>>1);
     250      piSrcU = piSrcBufU + (iBWidth>>1);
     251      piDstU = tempBufRight + pcBasePic->getPicCropRightOffset() * pcBasePic->getHeight();
     252      piSrcV = piSrcBufV + (iBWidth>>1);
     253      piDstV = piDstU + (pcBasePic->getPicCropRightOffset()>>1) * (pcBasePic->getHeight()>>1);
     254   
     255      for( i = 0; i < pcBasePic->getHeight()>>1; i++ )
     256      {
     257        memcpy(piDstU, piSrcU, sizeof(Pel) * (pcBasePic->getPicCropRightOffset()>>1));
     258        piSrcU += iBStrideChroma;
     259        piDstU += (pcBasePic->getPicCropRightOffset()>>1);
     260       
     261        memcpy(piDstV, piSrcV, sizeof(Pel) * (pcBasePic->getPicCropRightOffset()>>1));
     262        piSrcV += iBStrideChroma;
     263        piDstV += (pcBasePic->getPicCropRightOffset()>>1);
     264      }
     265    }
     266   
     267    pcBasePic->setWidth(iBWidth);
     268  }
     269 
     270  if( tempBufSizeBottom )
     271  {
     272    piSrcY = piSrcBufY + iBHeight * iBStride;
     273    piDstY = tempBufBottom;
     274    for( i = 0; i < pcBasePic->getPicCropBottomOffset(); i++ )
     275    {
     276      memcpy(piDstY, piSrcY, sizeof(Pel) * pcBasePic->getWidth());
     277      piSrcY += iBStride;
     278      piDstY += pcBasePic->getWidth();
     279    }
     280   
     281    if(pcBasePic->getPicCropBottomOffset()>>1)
     282    {
     283      Int iBStrideChroma = (iBStride>>1);
     284      piSrcU = piSrcBufU + (iBHeight>>1) * iBStrideChroma;
     285      piDstU = tempBufBottom + pcBasePic->getPicCropBottomOffset() * pcBasePic->getWidth();
     286      piSrcV = piSrcBufV + (iBHeight>>1) * iBStrideChroma;
     287      piDstV = piDstU + (pcBasePic->getPicCropBottomOffset()>>1) * (pcBasePic->getWidth()>>1);
     288     
     289      for( i = 0; i < pcBasePic->getPicCropBottomOffset()>>1; i++ )
     290      {
     291        memcpy(piDstU, piSrcU, sizeof(Pel) * (pcBasePic->getWidth()>>1));
     292        piSrcU += iBStrideChroma;
     293        piDstU += (pcBasePic->getWidth()>>1);
     294       
     295        memcpy(piDstV, piSrcV, sizeof(Pel) * (pcBasePic->getWidth()>>1));
     296        piSrcV += iBStrideChroma;
     297        piDstV += (pcBasePic->getWidth()>>1);
     298      }
     299    }
     300
     301    pcBasePic->setHeight(iBHeight);
     302  }
     303#endif
     304 
    191305  pcBasePic->setBorderExtension(false);
    192306  pcBasePic->extendPicBorder   (); // extend the border.
     
    278392
    279393  //========== UV component upsampling ===========
    280   Pel* piTempBufU = pcTempPic->getCbAddr();
    281   Pel* piSrcBufU  = pcBasePic->getCbAddr();
    282   Pel* piDstBufU  = pcUsPic->getCbAddr();
    283 
    284   Pel* piTempBufV = pcTempPic->getCrAddr();
    285   Pel* piSrcBufV  = pcBasePic->getCrAddr();
    286   Pel* piDstBufV  = pcUsPic->getCrAddr();
    287 
    288   Pel* piSrcU;
    289   Pel* piDstU;
    290   Pel* piSrcV;
    291   Pel* piDstV;
    292394
    293395  iEWidth  >>= 1;
     
    405507  pcTempPic->setBorderExtension(false);
    406508  pcBasePic->setBorderExtension(false);
     509 
     510#if JCTVC_L0178
     511  // copy back the saved cropped region
     512  if( tempBufSizeRight )
     513  {
     514    // put the correct width back
     515    pcBasePic->setWidth(pcBasePic->getWidth()+pcBasePic->getPicCropRightOffset());
     516  }
     517  if( tempBufSizeBottom )
     518  {
     519    pcBasePic->setHeight(pcBasePic->getHeight()+pcBasePic->getPicCropBottomOffset());
     520  }
     521 
     522  iBWidth   = pcBasePic->getWidth () - pcBasePic->getPicCropLeftOffset() - pcBasePic->getPicCropRightOffset();
     523  iBHeight  = pcBasePic->getHeight() - pcBasePic->getPicCropTopOffset() - pcBasePic->getPicCropBottomOffset();
     524 
     525  iBStride  = pcBasePic->getStride();
     526 
     527  if( tempBufSizeRight )
     528  {
     529    piSrcY = tempBufRight;
     530    piDstY = piSrcBufY + iBWidth;
     531   
     532    for( i = 0; i < pcBasePic->getHeight(); i++ )
     533    {
     534      memcpy(piDstY, piSrcY, sizeof(Pel) * pcBasePic->getPicCropRightOffset());
     535      piSrcY += pcBasePic->getPicCropRightOffset();
     536      piDstY += iBStride;
     537    }
     538   
     539    if(pcBasePic->getPicCropRightOffset()>>1)
     540    {
     541      Int iBStrideChroma = (iBStride>>1);
     542      piSrcU = tempBufRight + pcBasePic->getPicCropRightOffset() * pcBasePic->getHeight();
     543      piDstU = piSrcBufU + (iBWidth>>1);
     544      piSrcV = piSrcU + (pcBasePic->getPicCropRightOffset()>>1) * (pcBasePic->getHeight()>>1);
     545      piDstV = piSrcBufV + (iBWidth>>1);
     546
     547      for( i = 0; i < pcBasePic->getHeight()>>1; i++ )
     548      {
     549        memcpy(piDstU, piSrcU, sizeof(Pel) * (pcBasePic->getPicCropRightOffset()>>1));
     550        piSrcU += (pcBasePic->getPicCropRightOffset()>>1);
     551        piDstU += iBStrideChroma;
     552       
     553        memcpy(piDstV, piSrcV, sizeof(Pel) * (pcBasePic->getPicCropRightOffset()>>1));
     554        piSrcV += (pcBasePic->getPicCropRightOffset()>>1);
     555        piDstV += iBStrideChroma;
     556      }
     557    }
     558  }
     559 
     560  if( tempBufSizeBottom )
     561  {
     562    piDstY = piSrcBufY + iBHeight * iBStride;
     563    piSrcY = tempBufBottom;
     564    for( i = 0; i < pcBasePic->getPicCropBottomOffset(); i++ )
     565    {
     566      memcpy(piDstY, piSrcY, sizeof(Pel) * pcBasePic->getWidth());
     567      piDstY += iBStride;
     568      piSrcY += pcBasePic->getWidth();
     569    }
     570   
     571    if(pcBasePic->getPicCropBottomOffset()>>1)
     572    {
     573      Int iBStrideChroma = (iBStride>>1);
     574      piSrcU = tempBufBottom + pcBasePic->getPicCropBottomOffset() * pcBasePic->getWidth();
     575      piDstU = piSrcBufU + (iBHeight>>1) * iBStrideChroma;
     576      piSrcV = piSrcU + (pcBasePic->getPicCropBottomOffset()>>1) * (pcBasePic->getWidth()>>1);
     577      piDstV = piSrcBufV + (iBHeight>>1) * iBStrideChroma;
     578           
     579      for( i = 0; i < pcBasePic->getPicCropBottomOffset()>>1; i++ )
     580      {
     581        memcpy(piDstU, piSrcU, sizeof(Pel) * (pcBasePic->getWidth()>>1));
     582        piSrcU += (pcBasePic->getWidth()>>1);
     583        piDstU += iBStrideChroma;
     584       
     585        memcpy(piDstV, piSrcV, sizeof(Pel) * (pcBasePic->getWidth()>>1));
     586        piSrcV += (pcBasePic->getWidth()>>1);
     587        piDstV += iBStrideChroma;
     588      }
     589    }
     590 
     591  }
     592
     593  if( tempBufSizeRight )
     594  {
     595    xFree( tempBufRight );
     596  }
     597  if( tempBufSizeBottom )
     598  {
     599    xFree( tempBufBottom );
     600  }
     601#endif
    407602}
    408603#endif //SVC_EXTENSION
  • trunk/source/Lib/TLibCommon/TypeDef.h

    r21 r28  
    6060#define REF_IDX_ME_ZEROMV                1      ///< L0051: use zero motion for inter-layer reference picture (without fractional ME)
    6161#define ENCODER_FAST_MODE                1      ///< L0174: enable encoder fast mode. TestMethod 1 is enabled by setting to 1 and TestMethod 2 is enable by setting to 2. By default it is set to 1.
     62#define REF_IDX_MFM                      1      ///< L0336: motion vector mapping of inter-layer reference picture
    6263#else
    6364#define INTRA_BL                         1      ///< inter-layer texture prediction
     
    7273#define SVC_BL_CAND_INTRA                0      ///< Intra Base Mode Prediction hook as an example
    7374#endif
     75#endif
     76
     77#if SVC_UPSAMPLING
     78#define JCTVC_L0178                      1      ///< implementation of JCTVC-L0178 (code only supports right and bottom croppping offsets)
    7479#endif
    7580
Note: See TracChangeset for help on using the changeset viewer.