Changeset 54 in SHVCSoftware for branches/HM-10.0-dev-SHM/source/Lib
- Timestamp:
- 2 Mar 2013, 09:25:00 (12 years ago)
- Location:
- branches/HM-10.0-dev-SHM/source/Lib
- Files:
-
- 2 added
- 60 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HM-10.0-dev-SHM/source/Lib/TAppCommon/program_options_lite.h
r51 r54 209 209 return *this; 210 210 } 211 211 #if 1 //SVC_EXTENSION 212 template<typename T> 213 OptionSpecific& 214 operator()(const std::string& name, T* storage, T default_val, unsigned uiMaxNum, const std::string& desc = "" ) 215 { 216 std::string cNameBuffer; 217 std::string cDescriptionBuffer; 218 219 cNameBuffer .resize( name.size() + 10 ); 220 cDescriptionBuffer.resize( desc.size() + 10 ); 221 222 for ( unsigned int uiK = 0; uiK < uiMaxNum; uiK++ ) 223 { 224 // isn't there are sprintf function for string?? 225 sprintf((char*) cNameBuffer.c_str() ,name.c_str(),uiK,uiK); 226 sprintf((char*) cDescriptionBuffer.c_str(),desc.c_str(),uiK,uiK); 227 228 size_t pos = cNameBuffer.find_first_of('\0'); 229 if(pos != std::string::npos) 230 cNameBuffer.resize(pos); 231 232 parent.addOption(new Option<T>( cNameBuffer, (storage[uiK]), default_val, cDescriptionBuffer )); 233 } 234 235 return *this; 236 } 237 238 template<typename T> 239 OptionSpecific& 240 operator()(const std::string& name, T** storage, T default_val, unsigned uiMaxNum, const std::string& desc = "" ) 241 { 242 std::string cNameBuffer; 243 std::string cDescriptionBuffer; 244 245 cNameBuffer .resize( name.size() + 10 ); 246 cDescriptionBuffer.resize( desc.size() + 10 ); 247 248 for ( unsigned int uiK = 0; uiK < uiMaxNum; uiK++ ) 249 { 250 // isn't there are sprintf function for string?? 251 sprintf((char*) cNameBuffer.c_str() ,name.c_str(),uiK,uiK); 252 sprintf((char*) cDescriptionBuffer.c_str(),desc.c_str(),uiK,uiK); 253 254 size_t pos = cNameBuffer.find_first_of('\0'); 255 if(pos != std::string::npos) 256 cNameBuffer.resize(pos); 257 258 parent.addOption(new Option<T>( cNameBuffer, *(storage[uiK]), default_val, cDescriptionBuffer )); 259 } 260 261 return *this; 262 } 263 #endif 212 264 /** 213 265 * Add option described by name to the parent Options list, -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/CommonDef.h
r51 r54 56 56 // ==================================================================================================================== 57 57 58 #define NV_VERSION "1 0.0" ///< Current software version58 #define NV_VERSION "1.2" ///< Current software version 59 59 60 60 // ==================================================================================================================== -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/ContextTables.h
r51 r54 92 92 #define NUM_SAO_MERGE_FLAG_CTX 1 ///< number of context models for SAO merge flags 93 93 #define NUM_SAO_TYPE_IDX_CTX 1 ///< number of context models for SAO type index 94 #if INTRA_BL 95 #define NUM_INTRA_BL_PRED_CTX 3 96 #endif 94 97 95 98 #define NUM_TRANSFORMSKIP_FLAG_CTX 1 ///< number of context models for transform skipping … … 327 330 }; 328 331 332 #if INTRA_BL 333 static const UChar 334 INIT_INTRA_BL_PRED_FLAG[3][NUM_INTRA_BL_PRED_CTX] = 335 { 336 { 185, 185, 201, }, 337 { 197, 197, 185, }, 338 { 197, 197, 185, }, 339 }; 340 #endif 329 341 static const UChar 330 342 INIT_TRANSFORMSKIP_FLAG[3][2*NUM_TRANSFORMSKIP_FLAG_CTX] = -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/NAL.h
r51 r54 47 47 NalUnitType m_nalUnitType; ///< nal_unit_type 48 48 UInt m_temporalId; ///< temporal_id 49 #if SVC_EXTENSION 50 UInt m_layerId; ///< layer id 51 #endif 49 52 UInt m_reservedZero6Bits; ///< reserved_zero_6bits 50 53 … … 53 56 NalUnitType nalUnitType, 54 57 Int temporalId = 0, 58 #if SVC_EXTENSION 59 UInt layerId = 0, 60 #endif 55 61 Int reservedZero6Bits = 0) 56 62 :m_nalUnitType (nalUnitType) 57 63 ,m_temporalId (temporalId) 64 #if SVC_EXTENSION 65 ,m_layerId (layerId) 66 #endif 58 67 ,m_reservedZero6Bits(reservedZero6Bits) 59 68 {} -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComDataCU.cpp
r51 r54 359 359 m_uiTotalBins = 0; 360 360 m_uiNumPartition = pcPic->getNumPartInCU(); 361 362 #if SVC_EXTENSION 363 m_layerId = pcPic->getLayerId(); 364 #endif 361 365 362 366 for(Int i=0; i<pcPic->getNumPartInCU(); i++) … … 1647 1651 pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx ); 1648 1652 1653 #if INTRA_BL 1654 iLeftIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) && ( !pcTempCU->isIntraBL( uiTempPartIdx ) ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX; 1655 #else 1649 1656 iLeftIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX; 1657 #endif 1650 1658 1651 1659 // Get intra direction of above PU 1652 1660 pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx, true, true ); 1653 1661 1662 #if INTRA_BL 1663 iAboveIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) && ( !pcTempCU->isIntraBL( uiTempPartIdx ) ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX; 1664 #else 1654 1665 iAboveIntraDir = pcTempCU ? ( pcTempCU->isIntra( uiTempPartIdx ) ? pcTempCU->getLumaIntraDir( uiTempPartIdx ) : DC_IDX ) : DC_IDX; 1666 #endif 1667 1668 #if SVC_BL_CAND_INTRA 1669 if(m_layerId > 0) 1670 { 1671 UInt uiCUAddrBase, uiAbsPartAddrBase; 1672 pcTempCU = getBaseColCU( uiAbsPartIdx, uiCUAddrBase, uiAbsPartAddrBase ); 1673 1674 if(pcTempCU->getPredictionMode( uiAbsPartAddrBase ) == MODE_INTRA ) 1675 { 1676 Int iColBaseDir = pcTempCU->getLumaIntraDir( uiAbsPartAddrBase ); 1677 if( iColBaseDir != iAboveIntraDir && iColBaseDir != iLeftIntraDir && iAboveIntraDir != iLeftIntraDir) 1678 { 1679 uiIntraDirPred[0] = iColBaseDir; 1680 uiIntraDirPred[1] = iLeftIntraDir; 1681 uiIntraDirPred[2] = iAboveIntraDir; 1682 if( piMode ) 1683 { 1684 *piMode = 2; 1685 } 1686 uiPredNum = 3; 1687 return uiPredNum; 1688 } 1689 else 1690 { 1691 iAboveIntraDir = (iColBaseDir == iLeftIntraDir) ? iAboveIntraDir : iLeftIntraDir; 1692 iLeftIntraDir = iColBaseDir; 1693 } 1694 } 1695 } 1696 #endif 1655 1697 1656 1698 uiPredNum = 3; … … 1730 1772 UInt log2CbSize = g_aucConvertToBit[getWidth( absPartIdx )] + 2; 1731 1773 PartSize partSize = getPartitionSize( absPartIdx ); 1774 #if INTRA_BL 1775 UInt quadtreeTUMaxDepth = isIntra( absPartIdx ) ? m_pcSlice->getSPS()->getQuadtreeTUMaxDepthIntra() : m_pcSlice->getSPS()->getQuadtreeTUMaxDepthInter(); 1776 #else 1732 1777 UInt quadtreeTUMaxDepth = getPredictionMode( absPartIdx ) == MODE_INTRA ? m_pcSlice->getSPS()->getQuadtreeTUMaxDepthIntra() : m_pcSlice->getSPS()->getQuadtreeTUMaxDepthInter(); 1778 #endif 1733 1779 Int intraSplitFlag = ( getPredictionMode( absPartIdx ) == MODE_INTRA && partSize == SIZE_NxN ) ? 1 : 0; 1734 1780 Int interSplitFlag = ((quadtreeTUMaxDepth == 1) && (getPredictionMode( absPartIdx ) == MODE_INTER) && (partSize != SIZE_2Nx2N) ); … … 1752 1798 return log2MinTUSizeInCU; 1753 1799 } 1800 1801 #if INTRA_BL 1802 UInt TComDataCU::getCtxIntraBLFlag( UInt uiAbsPartIdx ) 1803 { 1804 TComDataCU* pcTempCU; 1805 UInt uiTempPartIdx; 1806 UInt uiCtx = 0; 1807 1808 // Get BCBP of left PU 1809 #if DEPENDENT_SLICES 1810 Bool bDepSliceRestriction = ( !m_pcSlice->getPPS()->getDependentSliceEnabledFlag()); 1811 pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx, true, bDepSliceRestriction ); 1812 #else 1813 pcTempCU = getPULeft( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx ); 1814 #endif 1815 uiCtx = ( pcTempCU ) ? pcTempCU->isIntraBL( uiTempPartIdx ) : 0; 1816 1817 // Get BCBP of above PU 1818 #if DEPENDENT_SLICES 1819 pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx, true, bDepSliceRestriction ); 1820 #else 1821 pcTempCU = getPUAbove( uiTempPartIdx, m_uiAbsIdxInLCU + uiAbsPartIdx ); 1822 #endif 1823 uiCtx += ( pcTempCU ) ? pcTempCU->isIntraBL( uiTempPartIdx ) : 0; 1824 1825 return uiCtx; 1826 } 1827 #endif 1828 1829 #if REF_IDX_ME_ZEROMV 1830 Bool TComDataCU::xCheckZeroMVILRMerge(UChar uhInterDir, TComMvField& cMvFieldL0, TComMvField& cMvFieldL1) 1831 { 1832 Bool checkZeroMVILR = true; 1833 1834 if(uhInterDir&0x1) //list0 1835 { 1836 Int refIdxL0 = cMvFieldL0.getRefIdx(); 1837 if(getSlice()->getRefPic(REF_PIC_LIST_0, refIdxL0)->getIsILR()) 1838 checkZeroMVILR &= (cMvFieldL0.getHor() == 0 && cMvFieldL0.getVer() == 0); 1839 } 1840 if(uhInterDir&0x2) //list1 1841 { 1842 Int refIdxL1 = cMvFieldL1.getRefIdx(); 1843 if(getSlice()->getRefPic(REF_PIC_LIST_1, refIdxL1)->getIsILR()) 1844 checkZeroMVILR &= (cMvFieldL1.getHor() == 0 && cMvFieldL1.getVer() == 0); 1845 } 1846 1847 return checkZeroMVILR; 1848 } 1849 1850 Bool TComDataCU::xCheckZeroMVILRMvdL1Zero(Int iRefList, Int iRefIdx, Int MvpIdx) 1851 { 1852 RefPicList eRefPicList = iRefList > 0? REF_PIC_LIST_1: REF_PIC_LIST_0; 1853 assert(eRefPicList == REF_PIC_LIST_1); 1854 1855 Bool checkZeroMVILR = true; 1856 1857 if(getSlice()->getRefPic(eRefPicList, iRefIdx)->getIsILR()) 1858 { 1859 AMVPInfo* pcAMVPInfo = getCUMvField(eRefPicList)->getAMVPInfo(); 1860 TComMv cMv = pcAMVPInfo->m_acMvCand[MvpIdx]; 1861 checkZeroMVILR &= (cMv.getHor() == 0 && cMv.getVer() == 0); 1862 } 1863 1864 return checkZeroMVILR; 1865 } 1866 #endif 1754 1867 1755 1868 UInt TComDataCU::getCtxSkipFlag( UInt uiAbsPartIdx ) … … 2406 2519 deriveLeftRightTopIdxGeneral( uiAbsPartIdx, uiPUIdx, uiPartIdxLT, uiPartIdxRT ); 2407 2520 deriveLeftBottomIdxGeneral ( uiAbsPartIdx, uiPUIdx, uiPartIdxLB ); 2521 #if SVC_MVP 2522 // BL collocated 2523 TComDataCU *pcColCU = 0; 2524 UInt uiCUAddrBase, uiAbsPartAddrBase ; 2525 TComMvField cMvFieldBaseColCU[2]; 2526 if(m_layerId) 2527 { 2528 #if MV_SCALING_POS_FIX 2529 pcColCU = getBaseColCU( xP + nPSW/2, yP + nPSH/2, uiCUAddrBase, uiAbsPartAddrBase ); 2530 #else 2531 UInt uiPartIdxCenter; 2532 xDeriveCenterIdx( cCurPS, uiPUIdx, uiPartIdxCenter ); 2533 uiPartIdxCenter -= m_uiAbsIdxInLCU; 2534 pcColCU = getBaseColCU( uiPartIdxCenter, uiCUAddrBase, uiAbsPartAddrBase ); 2535 #endif 2536 2537 #if INTRA_BL 2538 if( pcColCU && pcColCU->isIntraBL( uiAbsPartAddrBase ) ) 2539 { 2540 pcColCU = NULL; 2541 } 2542 #endif 2543 2544 if(pcColCU && !pcColCU->isIntra( uiAbsPartAddrBase ) ) 2545 { 2546 abCandIsInter[iCount] = true; 2547 2548 // get interDir 2549 puhInterDirNeighbours[iCount] = pcColCU->getInterDir( uiAbsPartAddrBase ); 2550 2551 pcMvFieldNeighbours[(iCount << 1)].setMvField( TComMv(0,0), -1); 2552 pcMvFieldNeighbours[(iCount << 1) + 1].setMvField( TComMv(0,0), -1); 2553 2554 if( puhInterDirNeighbours[iCount] & 1 ) 2555 { 2556 pcColCU->getMvField( pcColCU, uiAbsPartAddrBase, REF_PIC_LIST_0, cMvFieldBaseColCU[0]); 2557 scaleBaseMV( pcMvFieldNeighbours[iCount<<1], cMvFieldBaseColCU[0] ); 2558 } 2559 2560 if ( getSlice()->isInterB() && puhInterDirNeighbours[iCount] & 2 ) 2561 { 2562 pcColCU->getMvField( pcColCU, uiAbsPartAddrBase, REF_PIC_LIST_1, cMvFieldBaseColCU[1] ); 2563 scaleBaseMV( pcMvFieldNeighbours[(iCount<<1)+1], cMvFieldBaseColCU[1] ); 2564 } 2565 2566 if( puhInterDirNeighbours[iCount] > 0 ) 2567 { 2568 if ( mrgCandIdx == iCount ) 2569 { 2570 return; 2571 } 2572 iCount ++; 2573 } 2574 } 2575 } 2576 #endif 2408 2577 2409 2578 //left … … 2411 2580 TComDataCU* pcCULeft = 0; 2412 2581 pcCULeft = getPULeft( uiLeftPartIdx, uiPartIdxLB ); 2582 #if INTRA_BL 2583 if( pcCULeft && pcCULeft->isIntraBL( uiLeftPartIdx ) ) 2584 { 2585 pcCULeft = NULL; 2586 } 2587 #endif 2413 2588 Bool isAvailableA1 = pcCULeft && 2414 2589 pcCULeft->isDiffMER(xP -1, yP+nPSH-1, xP, yP) && 2590 #if SVC_MVP 2591 ( !pcColCU || pcColCU->isIntra( uiAbsPartAddrBase ) || !pcCULeft->hasEqualMotion( uiLeftPartIdx, puhInterDirNeighbours[0], &pcMvFieldNeighbours[0])) && 2592 #endif 2415 2593 !( uiPUIdx == 1 && (cCurPS == SIZE_Nx2N || cCurPS == SIZE_nLx2N || cCurPS == SIZE_nRx2N) ) && 2416 2594 !pcCULeft->isIntra( uiLeftPartIdx ) ; … … 2442 2620 TComDataCU* pcCUAbove = 0; 2443 2621 pcCUAbove = getPUAbove( uiAbovePartIdx, uiPartIdxRT ); 2622 #if INTRA_BL 2623 if( pcCUAbove && pcCUAbove->isIntraBL( uiAbovePartIdx ) ) 2624 { 2625 pcCUAbove = NULL; 2626 } 2627 #endif 2444 2628 Bool isAvailableB1 = pcCUAbove && 2629 #if SVC_MVP 2630 ( !pcColCU || pcColCU->isIntra( uiAbsPartAddrBase ) || !pcCUAbove->hasEqualMotion( uiAbovePartIdx, puhInterDirNeighbours[0], &pcMvFieldNeighbours[0] )) && 2631 #endif 2445 2632 pcCUAbove->isDiffMER(xP+nPSW-1, yP-1, xP, yP) && 2446 2633 !( uiPUIdx == 1 && (cCurPS == SIZE_2NxN || cCurPS == SIZE_2NxnU || cCurPS == SIZE_2NxnD) ) && … … 2473 2660 TComDataCU* pcCUAboveRight = 0; 2474 2661 pcCUAboveRight = getPUAboveRight( uiAboveRightPartIdx, uiPartIdxRT ); 2662 #if INTRA_BL 2663 if( pcCUAboveRight && pcCUAboveRight->isIntraBL( uiAboveRightPartIdx ) ) 2664 { 2665 pcCUAboveRight = NULL; 2666 } 2667 #endif 2475 2668 Bool isAvailableB0 = pcCUAboveRight && 2669 #if SVC_MVP 2670 ( !pcColCU || pcColCU->isIntra( uiAbsPartAddrBase ) || !pcCUAboveRight->hasEqualMotion( uiAboveRightPartIdx, puhInterDirNeighbours[0], &pcMvFieldNeighbours[0] )) && 2671 #endif 2476 2672 pcCUAboveRight->isDiffMER(xP+nPSW, yP-1, xP, yP) && 2477 2673 !pcCUAboveRight->isIntra( uiAboveRightPartIdx ); … … 2500 2696 2501 2697 //left bottom 2698 #if SVC_MVP 2699 if( iCount < 4 ) 2700 { 2701 #endif 2502 2702 UInt uiLeftBottomPartIdx = 0; 2503 2703 TComDataCU* pcCULeftBottom = 0; 2504 2704 pcCULeftBottom = this->getPUBelowLeft( uiLeftBottomPartIdx, uiPartIdxLB ); 2705 #if INTRA_BL 2706 if( pcCULeftBottom && pcCULeftBottom->isIntraBL( uiLeftBottomPartIdx ) ) 2707 { 2708 pcCULeftBottom = NULL; 2709 } 2710 #endif 2505 2711 Bool isAvailableA0 = pcCULeftBottom && 2506 2712 pcCULeftBottom->isDiffMER(xP-1, yP+nPSH, xP, yP) && 2713 #if SVC_MVP 2714 ( !pcColCU || pcColCU->isIntra( uiAbsPartAddrBase ) || !pcCULeftBottom->hasEqualMotion( uiLeftBottomPartIdx, puhInterDirNeighbours[0], &pcMvFieldNeighbours[0])) 2715 #endif 2507 2716 !pcCULeftBottom->isIntra( uiLeftBottomPartIdx ) ; 2508 2717 if ( isAvailableA0 && ( !isAvailableA1 || !pcCULeft->hasEqualMotion( uiLeftPartIdx, pcCULeftBottom, uiLeftBottomPartIdx ) ) ) … … 2528 2737 return; 2529 2738 } 2739 #if SVC_MVP 2740 } 2741 #endif 2742 2530 2743 // above left 2531 2744 if( iCount < 4 ) … … 2534 2747 TComDataCU* pcCUAboveLeft = 0; 2535 2748 pcCUAboveLeft = getPUAboveLeft( uiAboveLeftPartIdx, uiAbsPartAddr ); 2749 #if INTRA_BL 2750 if( pcCUAboveLeft && pcCUAboveLeft->isIntraBL( uiAboveLeftPartIdx ) ) 2751 { 2752 pcCUAboveLeft = NULL; 2753 } 2754 #endif 2536 2755 Bool isAvailableB2 = pcCUAboveLeft && 2537 2756 pcCUAboveLeft->isDiffMER(xP-1, yP-1, xP, yP) && 2757 #if SVC_MVP 2758 ( !pcColCU || pcColCU->isIntra( uiAbsPartAddrBase ) || !pcCUAboveLeft->hasEqualMotion( uiAboveLeftPartIdx, puhInterDirNeighbours[0], &pcMvFieldNeighbours[0] )) 2759 #endif 2538 2760 !pcCUAboveLeft->isIntra( uiAboveLeftPartIdx ); 2539 2761 if ( isAvailableB2 && ( !isAvailableA1 || !pcCULeft->hasEqualMotion( uiLeftPartIdx, pcCUAboveLeft, uiAboveLeftPartIdx ) ) … … 2840 3062 UInt idx; 2841 3063 tmpCU = getPUBelowLeft(idx, uiPartIdxLB); 3064 #if INTRA_BL 3065 bAddedSmvp = (tmpCU != NULL) && (!tmpCU->isIntra(idx)); 3066 #else 2842 3067 bAddedSmvp = (tmpCU != NULL) && (tmpCU->getPredictionMode(idx) != MODE_INTRA); 3068 #endif 2843 3069 2844 3070 if (!bAddedSmvp) 2845 3071 { 2846 3072 tmpCU = getPULeft(idx, uiPartIdxLB); 3073 #if INTRA_BL 3074 bAddedSmvp = (tmpCU != NULL) && (!tmpCU->isIntra(idx)); 3075 #else 2847 3076 bAddedSmvp = (tmpCU != NULL) && (tmpCU->getPredictionMode(idx) != MODE_INTRA); 3077 #endif 2848 3078 } 2849 3079 … … 3406 3636 if (scaleFactor > 0) 3407 3637 { 3638 #if SVC_MVP 3639 m_acCUMvField[0].compress(m_pePredMode, m_puhInterDir, scaleFactor); 3640 m_acCUMvField[1].compress(m_pePredMode, m_puhInterDir, scaleFactor); 3641 #else 3408 3642 m_acCUMvField[0].compress(m_pePredMode, scaleFactor); 3409 3643 m_acCUMvField[1].compress(m_pePredMode, scaleFactor); 3644 #endif 3410 3645 } 3411 3646 } … … 3839 4074 } 3840 4075 4076 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 4077 Void TComDataCU::getBaseLumaBlk ( UInt uiWidth, UInt uiHeight, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride ) 4078 { 4079 TComPicYuv* pcBaseRec = getSlice()->getFullPelBaseRec(); 4080 UInt uiStrideBase = pcBaseRec->getStride(); 4081 Pel* piBase = pcBaseRec->getLumaAddr( getAddr(), getZorderIdxInCU() + uiAbsPartIdx ); 4082 4083 for ( UInt y = 0; y < uiHeight; y ++ ) 4084 { 4085 memcpy( piPred + y * uiStride, piBase + y * uiStrideBase, uiWidth * sizeof( Pel ) ); 4086 } 4087 } 4088 4089 Void TComDataCU::getBaseChromaBlk ( UInt uiWidth, UInt uiHeight, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, UInt uiChromaId ) 4090 { 4091 TComPicYuv* pcBaseRec = getSlice()->getFullPelBaseRec(); 4092 4093 UInt uiStrideBase = pcBaseRec->getCStride(); 4094 Pel* piBase; 4095 4096 if( uiChromaId == 0 ) 4097 { 4098 piBase = pcBaseRec->getCbAddr( getAddr(), getZorderIdxInCU() + uiAbsPartIdx ); 4099 } 4100 else 4101 { 4102 piBase = pcBaseRec->getCrAddr( getAddr(), getZorderIdxInCU() + uiAbsPartIdx ); 4103 } 4104 4105 for ( UInt y = 0; y < uiHeight; y ++ ) 4106 { 4107 memcpy( piPred + y * uiStride, piBase + y * uiStrideBase, uiWidth * sizeof( Pel ) ); 4108 } 4109 } 4110 4111 #endif 4112 4113 #if SVC_COL_BLK 4114 TComDataCU* TComDataCU::getBaseColCU( UInt uiCuAbsPartIdx, UInt &uiCUAddrBase, UInt &uiAbsPartIdxBase ) 4115 { 4116 #if 1 // it should provide identical resutls 4117 UInt uiPelX = getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiCuAbsPartIdx] ]; 4118 UInt uiPelY = getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiCuAbsPartIdx] ]; 4119 4120 return getBaseColCU( uiPelX, uiPelY, uiCUAddrBase, uiAbsPartIdxBase ); 4121 #else 4122 TComPic* cBaseColPic = m_pcSlice->getBaseColPic(); 4123 4124 #if SVC_UPSAMPLING 4125 Int iBWidth = cBaseColPic->getPicYuvRec()->getWidth () - cBaseColPic->getPicYuvRec()->getPicCropLeftOffset() - cBaseColPic->getPicYuvRec()->getPicCropRightOffset(); 4126 Int iBHeight = cBaseColPic->getPicYuvRec()->getHeight() - cBaseColPic->getPicYuvRec()->getPicCropTopOffset() - cBaseColPic->getPicYuvRec()->getPicCropBottomOffset(); 4127 4128 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth() - m_pcPic->getPicYuvRec()->getPicCropLeftOffset() - m_pcPic->getPicYuvRec()->getPicCropRightOffset(); 4129 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight() - m_pcPic->getPicYuvRec()->getPicCropTopOffset() - m_pcPic->getPicYuvRec()->getPicCropBottomOffset(); 4130 #else 4131 Int iBWidth = cBaseColPic->getPicYuvRec()->getWidth(); 4132 Int iBHeight = cBaseColPic->getPicYuvRec()->getHeight(); 4133 4134 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth(); 4135 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight(); 4136 #endif 4137 4138 if (iBWidth == iEWidth && iEHeight == iBHeight) 4139 { 4140 uiAbsPartIdxBase = uiCuAbsPartIdx + m_uiAbsIdxInLCU; 4141 uiCUAddrBase = m_uiCUAddr; 4142 } 4143 else 4144 { 4145 UInt uiMinUnitSize = m_pcPic->getMinCUWidth(); 4146 UInt uiRasterAddr = g_auiZscanToRaster[uiCuAbsPartIdx]; 4147 UInt uiNumPartInCUWidth = m_pcPic->getNumPartInWidth(); 4148 4149 Int iEX = m_uiCUPelX + uiMinUnitSize*(uiRasterAddr%uiNumPartInCUWidth); 4150 Int iEY = m_uiCUPelY + uiMinUnitSize*(uiRasterAddr/uiNumPartInCUWidth); 4151 4152 Int iBX = (iEX*iBWidth + iEWidth/2)/iEWidth; 4153 Int iBY = (iEY*iBHeight+ iEHeight/2)/iEHeight; 4154 4155 uiCUAddrBase = (iBY/g_uiMaxCUHeight)*cBaseColPic->getFrameWidthInCU() + (iBX/g_uiMaxCUWidth); 4156 4157 assert(uiCUAddrBase < cBaseColPic->getNumCUsInFrame()); 4158 4159 UInt uiRasterAddrBase = (iBY - (iBY/g_uiMaxCUHeight)*g_uiMaxCUHeight)/uiMinUnitSize*cBaseColPic->getNumPartInWidth() 4160 + (iBX - (iBX/g_uiMaxCUWidth)*g_uiMaxCUWidth)/uiMinUnitSize; 4161 4162 uiAbsPartIdxBase = g_auiRasterToZscan[uiRasterAddrBase]; 4163 } 4164 4165 return cBaseColPic->getCU(uiCUAddrBase); 4166 #endif 4167 } 4168 4169 TComDataCU* TComDataCU::getBaseColCU( UInt uiPelX, UInt uiPelY, UInt &uiCUAddrBase, UInt &uiAbsPartIdxBase ) 4170 { 4171 TComPic* cBaseColPic = m_pcSlice->getBaseColPic(); 4172 4173 #if SVC_UPSAMPLING 4174 const Window &confBL = cBaseColPic->getPicYuvRec()->getConformanceWindow(); 4175 const Window &confEL = m_pcPic->getPicYuvRec()->getConformanceWindow(); 4176 4177 Int iBWidth = m_pcSlice->getBaseColPic()->getPicYuvRec()->getWidth () - confBL.getWindowLeftOffset() - confBL.getWindowRightOffset(); 4178 Int iBHeight = m_pcSlice->getBaseColPic()->getPicYuvRec()->getHeight() - confBL.getWindowTopOffset() - confBL.getWindowBottomOffset(); 4179 4180 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth() - confEL.getWindowLeftOffset() - confEL.getWindowRightOffset(); 4181 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight() - confEL.getWindowTopOffset() - confEL.getWindowBottomOffset(); 4182 #else 4183 Int iBWidth = cBaseColPic->getPicYuvRec()->getWidth(); 4184 Int iBHeight = cBaseColPic->getPicYuvRec()->getHeight(); 4185 4186 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth(); 4187 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight(); 4188 #endif 4189 4190 uiPelX = (UInt)Clip3<UInt>(0, m_pcPic->getPicYuvRec()->getWidth() - 1, uiPelX); 4191 uiPelY = (UInt)Clip3<UInt>(0, m_pcPic->getPicYuvRec()->getHeight() - 1, uiPelY); 4192 4193 UInt uiMinUnitSize = m_pcPic->getMinCUWidth(); 4194 4195 Int iBX = (uiPelX*iBWidth + iEWidth/2)/iEWidth; 4196 Int iBY = (uiPelY*iBHeight+ iEHeight/2)/iEHeight; 4197 4198 if ( iBX >= cBaseColPic->getPicYuvRec()->getWidth() || iBY >= cBaseColPic->getPicYuvRec()->getHeight()) 4199 { 4200 return NULL; 4201 } 4202 4203 #if AVC_SYNTAX 4204 if( iBX >= iBWidth || iBY >= iBHeight ) //outside of the reference layer cropped picture 4205 { 4206 return NULL; 4207 } 4208 #endif 4209 4210 uiCUAddrBase = (iBY/g_uiMaxCUHeight)*cBaseColPic->getFrameWidthInCU() + (iBX/g_uiMaxCUWidth); 4211 4212 assert(uiCUAddrBase < cBaseColPic->getNumCUsInFrame()); 4213 4214 UInt uiRasterAddrBase = (iBY - (iBY/g_uiMaxCUHeight)*g_uiMaxCUHeight)/uiMinUnitSize*cBaseColPic->getNumPartInWidth() 4215 + (iBX - (iBX/g_uiMaxCUWidth)*g_uiMaxCUWidth)/uiMinUnitSize; 4216 4217 uiAbsPartIdxBase = g_auiRasterToZscan[uiRasterAddrBase]; 4218 4219 return cBaseColPic->getCU(uiCUAddrBase); 4220 } 4221 4222 Void TComDataCU::scaleBaseMV( TComMvField& rcMvFieldEnhance, TComMvField& rcMvFieldBase ) 4223 { 4224 TComMvField cMvFieldBase; 4225 TComMv cMv; 4226 4227 #if MV_SCALING_FIX 4228 const Window &confBL = m_pcSlice->getBaseColPic()->getPicYuvRec()->getConformanceWindow(); 4229 const Window &confEL = m_pcPic->getPicYuvRec()->getConformanceWindow(); 4230 4231 Int iBWidth = m_pcSlice->getBaseColPic()->getPicYuvRec()->getWidth () - confBL.getWindowLeftOffset() - confBL.getWindowRightOffset(); 4232 Int iBHeight = m_pcSlice->getBaseColPic()->getPicYuvRec()->getHeight() - confBL.getWindowTopOffset() - confBL.getWindowBottomOffset(); 4233 4234 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth() - confEL.getWindowLeftOffset() - confEL.getWindowRightOffset(); 4235 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight() - confEL.getWindowTopOffset() - confEL.getWindowBottomOffset(); 4236 #else 4237 Int iBWidth = m_pcSlice->getBaseColPic()->getPicYuvRec()->getWidth(); 4238 Int iBHeight = m_pcSlice->getBaseColPic()->getPicYuvRec()->getHeight(); 4239 4240 Int iEWidth = m_pcPic->getPicYuvRec()->getWidth(); 4241 Int iEHeight = m_pcPic->getPicYuvRec()->getHeight(); 4242 #endif 4243 4244 Int iMvX = (rcMvFieldBase.getHor()*iEWidth + (iBWidth/2 -1) * (rcMvFieldBase.getHor() > 0 ? 1: -1) )/iBWidth; 4245 Int iMvY = (rcMvFieldBase.getVer()*iEHeight + (iBHeight/2 -1) * (rcMvFieldBase.getVer() > 0 ? 1: -1) )/iBHeight; 4246 4247 cMv.set(iMvX, iMvY); 4248 4249 rcMvFieldEnhance.setMvField( cMv, rcMvFieldBase.getRefIdx() ); 4250 } 4251 #endif 4252 4253 #if SVC_MVP 4254 Bool TComDataCU::hasEqualMotion( UInt uiAbsPartIdx, UChar uchInterDir, TComMvField* pcMvField ) 4255 { 4256 if ( getInterDir( uiAbsPartIdx ) != uchInterDir ) 4257 { 4258 return false; 4259 } 4260 4261 for ( UInt uiRefListIdx = 0; uiRefListIdx < 2; uiRefListIdx++ ) 4262 { 4263 if ( getInterDir( uiAbsPartIdx ) & ( 1 << uiRefListIdx ) ) 4264 { 4265 if ( getCUMvField( RefPicList( uiRefListIdx ) )->getMv( uiAbsPartIdx ) != pcMvField[uiRefListIdx].getMv() || 4266 getCUMvField( RefPicList( uiRefListIdx ) )->getRefIdx( uiAbsPartIdx ) != pcMvField[uiRefListIdx].getRefIdx() ) 4267 { 4268 return false; 4269 } 4270 } 4271 } 4272 4273 return true; 4274 } 4275 #endif 3841 4276 3842 4277 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComDataCU.h
r51 r54 125 125 Int m_unitSize; ///< size of a "minimum partition" 126 126 127 #if SVC_EXTENSION 128 UInt m_layerId; ///< layer id 129 #endif 130 127 131 // ------------------------------------------------------------------------------------------------------------------- 128 132 // CU data … … 434 438 Void compressMV (); 435 439 440 #if SVC_EXTENSION 441 Void setLayerId (UInt layerId) { m_layerId = layerId; } 442 UInt getLayerId () { return m_layerId; } 443 #endif 444 436 445 // ------------------------------------------------------------------------------------------------------------------- 437 446 // utility functions for neighbouring information … … 476 485 Void deriveLeftBottomIdxGeneral ( UInt uiAbsPartIdx, UInt uiPartIdx, UInt& ruiPartIdxLB ); 477 486 487 #if SVC_MVP 488 Bool hasEqualMotion ( UInt uiAbsPartIdx, UChar uchInterDir, TComMvField* pcMvField ); 489 #endif 478 490 479 491 // ------------------------------------------------------------------------------------------------------------------- … … 481 493 // ------------------------------------------------------------------------------------------------------------------- 482 494 495 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 496 Void getBaseLumaBlk ( UInt uiWidth, UInt uiHeight, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride ); 497 Void getBaseChromaBlk ( UInt uiWidth, UInt uiHeight, UInt uiAbsPartIdx, Pel* piPred, UInt uiStride, UInt uiChromaId ); 498 #endif 499 #if INTRA_BL 500 Bool isIntraBL ( UInt uiPartIdx ) { return m_pePredMode[ uiPartIdx ] == MODE_INTRA_BL; } 501 Bool isIntra ( UInt uiPartIdx ) { return m_pePredMode[ uiPartIdx ] == MODE_INTRA || m_pePredMode[ uiPartIdx ] == MODE_INTRA_BL; } 502 #else 483 503 Bool isIntra ( UInt uiPartIdx ) { return m_pePredMode[ uiPartIdx ] == MODE_INTRA; } 504 #endif 484 505 Bool isSkipped ( UInt uiPartIdx ); ///< SKIP (no residual) 485 506 Bool isBipredRestriction( UInt puIdx ); … … 507 528 UInt getSliceSegmentStartCU ( UInt pos ) { return m_sliceSegmentStartCU[pos-m_uiAbsIdxInLCU]; } 508 529 UInt& getTotalBins () { return m_uiTotalBins; } 530 531 #if INTRA_BL 532 UInt getCtxIntraBLFlag ( UInt uiAbsPartIdx ); 533 #endif 534 535 #if REF_IDX_ME_ZEROMV 536 Bool xCheckZeroMVILRMerge(UChar uhInterDir, TComMvField& cMvFieldL0, TComMvField& cMvFieldL1); 537 Bool xCheckZeroMVILRMvdL1Zero(Int iRefList, Int iRefIdx, Int MvpIdx); 538 #endif 539 509 540 // ------------------------------------------------------------------------------------------------------------------- 510 541 // member functions for RD cost storage … … 518 549 UInt getCoefScanIdx(UInt uiAbsPartIdx, UInt uiWidth, Bool bIsLuma, Bool bIsIntra); 519 550 551 #if SVC_COL_BLK 552 TComDataCU* getBaseColCU( UInt uiCuAbsPartIdx, UInt &uiCUAddrBase, UInt &uiAbsPartIdxBase ); 553 TComDataCU* getBaseColCU( UInt uiPelX, UInt uiPelY, UInt &uiCUAddrBase, UInt &uiAbsPartIdxBase ); 554 Void scaleBaseMV( TComMvField& rcMvFieldEnhance, TComMvField& rcMvFieldBase ); 555 #endif 520 556 }; 521 557 -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComMotionInfo.cpp
r51 r54 328 328 * \param scale Factor by which to subsample motion information 329 329 */ 330 #if SVC_MVP 331 Void TComCUMvField::compress(Char* pePredMode, UChar* peInterDir, Int scale) 332 #else 330 333 Void TComCUMvField::compress(Char* pePredMode, Int scale) 334 #endif 331 335 { 332 336 Int N = scale * scale; … … 347 351 pePredMode[ uiPartIdx + i ] = predMode; 348 352 m_piRefIdx[ uiPartIdx + i ] = iRefIdx; 353 #if SVC_MVP 354 peInterDir[ uiPartIdx + i ] = peInterDir[ uiPartIdx ]; 355 #endif 349 356 } 350 357 } -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComMotionInfo.h
r51 r54 141 141 Void setAllMvField( TComMvField const & mvField, PartSize eMbMode, Int iPartAddr, UInt uiDepth, Int iPartIdx=0 ); 142 142 143 #if AVC_SYNTAX 144 Void setMv (TComMv cMv, Int iIdx ) { m_pcMv [iIdx] = cMv; } 145 Void setRefIdx(Int iRefIdx, Int iIdx ) { m_piRefIdx[iIdx] = iRefIdx; } 146 #endif 147 143 148 Void setNumPartition( Int iNumPart ) 144 149 { … … 153 158 } 154 159 160 #if SVC_MVP 161 Void compress(Char* pePredMode, UChar* peInterDir, Int scale); 162 #else 155 163 Void compress(Char* pePredMode, Int scale); 164 #endif 165 166 #if REF_IDX_MFM 167 Void setMvField( TComMvField const& mvField, Int iIdx ) 168 { 169 m_pcMv[iIdx] = mvField.getMv(); 170 m_piRefIdx[iIdx] = mvField.getRefIdx(); 171 return; 172 } 173 174 Void setMvField( TComMv cMv, Int iRefIdx, Int iIdx ) 175 { 176 m_pcMv[iIdx] = cMv; 177 m_piRefIdx[iIdx] = iRefIdx; 178 return; 179 } 180 #endif 156 181 }; 157 182 -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPic.cpp
r51 r54 64 64 , m_pNDBFilterYuvTmp (NULL) 65 65 , m_bCheckLTMSB (false) 66 #if SVC_EXTENSION 67 , m_layerId( 0 ) 68 , m_bSpatialEnhLayer( false ) 69 , m_pcFullPelBaseRec( NULL ) 70 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 71 , m_bIsILR (false) 72 #endif 73 #endif 66 74 { 67 75 m_apcPicYuv[0] = NULL; … … 72 80 { 73 81 } 74 82 #if SVC_UPSAMPLING 83 Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow, 84 Int *numReorderPics, TComSPS* pcSps, Bool bIsVirtual) 85 86 { 87 m_apcPicSym = new TComPicSym; m_apcPicSym ->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth ); 88 if (!bIsVirtual) 89 { 90 m_apcPicYuv[0] = new TComPicYuv; m_apcPicYuv[0]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps ); 91 } 92 m_apcPicYuv[1] = new TComPicYuv; m_apcPicYuv[1]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps ); 93 94 if (m_bSpatialEnhLayer) 95 { 96 m_pcFullPelBaseRec = new TComPicYuv; m_pcFullPelBaseRec->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps ); 97 } 98 99 m_layerId = pcSps->getLayerId(); 100 101 // there are no SEI messages associated with this picture initially 102 if (m_SEIs.size() > 0) 103 { 104 deleteSEIs (m_SEIs); 105 } 106 m_bUsedByCurr = false; 107 108 /* store conformance window parameters with picture */ 109 m_conformanceWindow = conformanceWindow; 110 111 /* store display window parameters with picture */ 112 m_defaultDisplayWindow = defaultDisplayWindow; 113 114 /* store number of reorder pics with picture */ 115 memcpy(m_numReorderPics, numReorderPics, MAX_TLAYER*sizeof(Int)); 116 117 return; 118 } 119 #if REF_IDX_FRAMEWORK 120 Void TComPic::createWithOutYuv( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, TComSPS* pcSps, Bool bIsVirtual) 121 { 122 m_apcPicSym = new TComPicSym; m_apcPicSym ->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth ); 123 if (!bIsVirtual) 124 { 125 m_apcPicYuv[0] = new TComPicYuv; m_apcPicYuv[0]->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps ); 126 } 127 m_apcPicYuv[1] = NULL; 128 129 #if SVC_UPSAMPLING 130 if (m_bSpatialEnhLayer) 131 { 132 m_pcFullPelBaseRec = new TComPicYuv; m_pcFullPelBaseRec->create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, pcSps ); 133 } 134 #endif 135 136 /* there are no SEI messages associated with this picture initially */ 137 m_SEIs = NULL; 138 m_bUsedByCurr = false; 139 return; 140 } 141 #endif 142 #else 75 143 Void TComPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow, 76 144 Int *numReorderPics, Bool bIsVirtual) … … 102 170 return; 103 171 } 172 #endif 104 173 105 174 Void TComPic::destroy() … … 127 196 128 197 deleteSEIs(m_SEIs); 198 #if SVC_EXTENSION && SVC_UPSAMPLING 199 if (m_bSpatialEnhLayer) 200 { 201 m_pcFullPelBaseRec->destroy(); 202 delete m_pcFullPelBaseRec; 203 m_pcFullPelBaseRec = NULL; 204 } 205 #endif 129 206 } 130 207 … … 465 542 } 466 543 544 #if REF_IDX_FRAMEWORK 545 Void copyOnetoOnePicture( // SVC_NONCOLL 546 Pel *in, 547 Pel *out, 548 Int nCols, 549 Int nRows, 550 Int fullRowWidth) 551 { 552 Int rX; 553 554 for (rX = 0; rX < nRows; rX++) 555 { 556 memcpy( out, in, sizeof(Pel) * nCols ); 557 in = in + fullRowWidth; 558 out = out + fullRowWidth; 559 } 560 } 561 562 Void TComPic:: copyUpsampledPictureYuv(TComPicYuv* pcPicYuvIn, TComPicYuv* pcPicYuvOut) 563 { 564 Int upsampledRowWidthLuma = pcPicYuvOut->getStride(); // 2 * pcPicYuvOut->getLumaMargin() + pcPicYuvOut->getWidth(); 565 Int upsampledRowWidthCroma = pcPicYuvOut->getCStride(); //2 * pcPicYuvOut->getChromaMargin() + (pcPicYuvOut->getWidth()>>1); 566 567 copyOnetoOnePicture( 568 pcPicYuvIn->getLumaAddr(), 569 pcPicYuvOut->getLumaAddr(), 570 pcPicYuvOut->getWidth(), 571 pcPicYuvOut->getHeight(), 572 upsampledRowWidthLuma); 573 copyOnetoOnePicture( 574 pcPicYuvIn->getCrAddr(), 575 pcPicYuvOut->getCrAddr(), 576 pcPicYuvOut->getWidth()>>1, 577 pcPicYuvOut->getHeight()>>1, 578 upsampledRowWidthCroma); 579 copyOnetoOnePicture( 580 pcPicYuvIn->getCbAddr(), 581 pcPicYuvOut->getCbAddr(), 582 pcPicYuvOut->getWidth()>>1, 583 pcPicYuvOut->getHeight()>>1, 584 upsampledRowWidthCroma); 585 } 586 587 #if REF_IDX_MFM 588 #if !REUSE_BLKMAPPING 589 Void TComPic::deriveUnitIdxBase( UInt uiUpsamplePelX, UInt uiUpsamplePelY, UInt ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx ) 590 { 591 //pixel in the base layer 592 593 UInt uiPelX = (uiUpsamplePelX<<1)/ratio; 594 UInt uiPelY = (uiUpsamplePelY<<1)/ratio; 595 UInt uiBaseWidth = getPicYuvRec()->getWidth(); 596 UInt uiBaseHeight = getPicYuvRec()->getHeight(); 597 598 UInt uiWidthInCU = ( uiBaseWidth % g_uiMaxCUWidth ) ? uiBaseWidth /g_uiMaxCUWidth + 1 : uiBaseWidth /g_uiMaxCUWidth; 599 600 #if MFM_CLIPPING_FIX 601 uiPelX = (UInt)Clip3<UInt>(0, getPicYuvRec()->getWidth() - 1, uiPelX); 602 uiPelY = (UInt)Clip3<UInt>(0, getPicYuvRec()->getHeight() - 1, uiPelY); 603 #else 604 UInt uiHeightInCU = ( uiBaseHeight% g_uiMaxCUHeight ) ? uiBaseHeight/ g_uiMaxCUHeight + 1 : uiBaseHeight/ g_uiMaxCUHeight; 605 606 uiPelX = (UInt)Clip3<UInt>(0, uiWidthInCU * g_uiMaxCUWidth - 1, uiPelX); 607 uiPelY = (UInt)Clip3<UInt>(0, uiHeightInCU * g_uiMaxCUHeight - 1, uiPelY); 608 #endif 609 610 uiBaseCUAddr = uiPelY / g_uiMaxCUHeight * uiWidthInCU + uiPelX / g_uiMaxCUWidth; 611 612 UInt uiWidthMinPU = g_uiMaxCUWidth / (1<<g_uiMaxCUDepth); 613 UInt uiHeightMinPU = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth); 614 615 UInt uiAbsPelX = uiPelX - (uiPelX / g_uiMaxCUWidth) * g_uiMaxCUWidth; 616 UInt uiAbsPelY = uiPelY - (uiPelY / g_uiMaxCUHeight) * g_uiMaxCUHeight; 617 618 UInt RasterIdx = uiAbsPelY / uiHeightMinPU * (g_uiMaxCUWidth/uiWidthMinPU) + uiAbsPelX / uiWidthMinPU; 619 uiBaseAbsPartIdx = g_auiRasterToZscan[RasterIdx]; 620 621 return; 622 } 623 #endif 624 625 Void TComPic::copyUpsampledMvField(TComPic* pcPicBase) 626 { 627 #if !REUSE_MVSCALE || !REUSE_BLKMAPPING || AVC_SYNTAX 628 Int iBWidth = pcPicBase->getPicYuvRec()->getWidth () - pcPicBase->getPicYuvRec()->getPicCropLeftOffset() - pcPicBase->getPicYuvRec()->getPicCropRightOffset(); 629 Int iBHeight = pcPicBase->getPicYuvRec()->getHeight() - pcPicBase->getPicYuvRec()->getPicCropTopOffset() - pcPicBase->getPicYuvRec()->getPicCropBottomOffset(); 630 631 Int iEWidth = getPicYuvRec()->getWidth() - getPicYuvRec()->getPicCropLeftOffset() - getPicYuvRec()->getPicCropRightOffset(); 632 Int iEHeight = getPicYuvRec()->getHeight() - getPicYuvRec()->getPicCropTopOffset() - getPicYuvRec()->getPicCropBottomOffset(); 633 #endif 634 635 #if !REUSE_MVSCALE || !REUSE_BLKMAPPING 636 UInt upSampleRatio = 0; 637 if(iEWidth == iBWidth && iEHeight == iBHeight) 638 { 639 upSampleRatio = 2; 640 } 641 else if(2*iEWidth == 3*iBWidth && 2*iEHeight == 3*iBHeight) 642 { 643 upSampleRatio = 3; 644 } 645 else if(iEWidth == 2*iBWidth && iEHeight == 2*iBHeight) 646 { 647 upSampleRatio = 4; 648 } 649 else 650 { 651 assert(0); 652 } 653 #endif 654 655 UInt uiNumPartitions = 1<<(g_uiMaxCUDepth<<1); 656 UInt uiWidthMinPU = g_uiMaxCUWidth/(1<<g_uiMaxCUDepth); 657 UInt uiHeightMinPU = g_uiMaxCUHeight/(1<<g_uiMaxCUDepth); 658 Int unitNum = max (1, (Int)((16/uiWidthMinPU)*(16/uiHeightMinPU)) ); 659 660 for(UInt cuIdx = 0; cuIdx < getPicSym()->getNumberOfCUsInFrame(); cuIdx++) //each LCU 661 { 662 TComDataCU* pcCUDes = getCU(cuIdx); 663 664 for(UInt uiAbsPartIdx = 0; uiAbsPartIdx < uiNumPartitions; uiAbsPartIdx+=unitNum ) //each 16x16 unit 665 { 666 //pixel position of each unit in up-sampled layer 667 UInt uiPelX = pcCUDes->getCUPelX() + g_auiRasterToPelX[ g_auiZscanToRaster[uiAbsPartIdx] ]; 668 UInt uiPelY = pcCUDes->getCUPelY() + g_auiRasterToPelY[ g_auiZscanToRaster[uiAbsPartIdx] ]; 669 UInt uiBaseCUAddr, uiBaseAbsPartIdx; 670 671 #if REUSE_BLKMAPPING 672 TComDataCU *pcColCU = 0; 673 pcColCU = pcCUDes->getBaseColCU(uiPelX + 8, uiPelY + 8, uiBaseCUAddr, uiBaseAbsPartIdx); 674 #else 675 pcPicBase->deriveUnitIdxBase(uiPelX + 8, uiPelY + 8, upSampleRatio, uiBaseCUAddr, uiBaseAbsPartIdx); 676 #endif 677 678 #if AVC_SYNTAX 679 Int iBX = ( (uiPelX + 8) * iBWidth + iEWidth/2 ) / iEWidth; 680 Int iBY = ( (uiPelY + 8) * iBHeight+ iEHeight/2 ) / iEHeight; 681 682 #if REUSE_BLKMAPPING 683 if( ( iBX < iBWidth && iBY < iBHeight ) && pcColCU && (pcColCU->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (pcColCU->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) ) //base layer unit not skip and invalid mode 684 #else 685 if( ( iBX < iBWidth && iBY < iBHeight ) && (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) ) //base layer unit not skip and invalid mode 686 #endif 687 #else 688 #if REUSE_BLKMAPPING 689 if( pcColCU && (pcColCU->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (pcColCU->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) ) //base layer unit not skip and invalid mode 690 #else 691 if( (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_NONE) && (pcPicBase->getCU(uiBaseCUAddr)->getPredictionMode(uiBaseAbsPartIdx) != MODE_INTRA) ) //base layer unit not skip and invalid mode 692 #endif 693 #endif 694 { 695 for(UInt refPicList = 0; refPicList < 2; refPicList++) //for each reference list 696 { 697 #if REUSE_MVSCALE 698 TComMvField sMvFieldBase, sMvField; 699 #if REUSE_BLKMAPPING 700 pcColCU->getMvField( pcColCU, uiBaseAbsPartIdx, (RefPicList)refPicList, sMvFieldBase); 701 #else 702 pcPicBase->getCU(uiBaseCUAddr)->getMvField( pcPicBase->getCU(uiBaseCUAddr), uiBaseAbsPartIdx, (RefPicList)refPicList, sMvFieldBase); 703 #endif 704 pcCUDes->scaleBaseMV( sMvField, sMvFieldBase ); 705 #else 706 TComMv cMv = pcPicBase->getCU(uiBaseCUAddr)->getCUMvField((RefPicList)refPicList)->getMv(uiBaseAbsPartIdx); 707 Int refIdx = pcPicBase->getCU(uiBaseCUAddr)->getCUMvField((RefPicList)refPicList)->getRefIdx(uiBaseAbsPartIdx); 708 709 Int Hor = ((Int)upSampleRatio * cMv.getHor())/2 ; 710 Int Ver = ((Int)upSampleRatio * cMv.getVer())/2 ; 711 712 TComMv cScaledMv(Hor, Ver); 713 TComMvField sMvField; 714 sMvField.setMvField(cScaledMv, refIdx); 715 #endif 716 717 pcCUDes->getCUMvField((RefPicList)refPicList)->setMvField(sMvField, uiAbsPartIdx); 718 pcCUDes->setPredictionMode(uiAbsPartIdx, MODE_INTER); 719 } 720 } 721 else 722 { 723 TComMvField zeroMvField; //zero MV and invalid reference index 724 pcCUDes->getCUMvField(REF_PIC_LIST_0)->setMvField(zeroMvField, uiAbsPartIdx); 725 pcCUDes->getCUMvField(REF_PIC_LIST_1)->setMvField(zeroMvField, uiAbsPartIdx); 726 pcCUDes->setPredictionMode(uiAbsPartIdx, MODE_INTRA); 727 } 728 729 for(UInt i = 1; i < unitNum; i++ ) 730 { 731 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); 732 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); 733 pcCUDes->setPredictionMode(uiAbsPartIdx+i, pcCUDes->getPredictionMode(uiAbsPartIdx)) ; 734 } 735 } 736 memset( pcCUDes->getPartitionSize(), SIZE_2Nx2N, sizeof(char)*uiNumPartitions); 737 } 738 } 739 #endif 740 741 #endif 742 743 #if AVC_SYNTAX 744 Void TComPic::readBLSyntax( fstream* filestream, UInt numBytes ) 745 { 746 if( !filestream->good() ) 747 { 748 return; 749 } 750 751 UInt uiWidth = this->getPicYuvRec()->getWidth() - this->getPicYuvRec()->getPicCropLeftOffset() - this->getPicYuvRec()->getPicCropRightOffset(); 752 UInt uiHeight = this->getPicYuvRec()->getHeight() - this->getPicYuvRec()->getPicCropTopOffset() - this->getPicYuvRec()->getPicCropBottomOffset(); 753 UInt64 uiPOC = (UInt64)this->getPOC(); 754 UInt uiPartWidth = uiWidth / 4; 755 UInt uiPartHeight = uiHeight / 4; 756 757 UInt uiNumPartInWidth = this->getNumPartInWidth(); 758 UInt uiNumPartInHeight = this->getNumPartInHeight(); 759 UInt uiNumPartLCUInWidth = this->getFrameWidthInCU(); 760 761 UInt64 uiPos = (UInt64)uiPOC * uiWidth * uiHeight * numBytes / 16; 762 763 filestream->seekg( uiPos, ios_base::beg ); 764 765 for( Int i = 0; i < uiPartHeight; i++ ) 766 { 767 for( Int j = 0; j < uiPartWidth; j++ ) 768 { 769 UInt uiX = ( j / uiNumPartInWidth ); 770 UInt uiY = ( i / uiNumPartInHeight ); 771 772 UInt uiLCUAddr = uiY * uiNumPartLCUInWidth + uiX; 773 UInt uiPartAddr = ( i - uiY * uiNumPartInHeight ) * uiNumPartInWidth + ( j - uiX * uiNumPartInWidth ); 774 uiPartAddr = g_auiRasterToZscan[uiPartAddr]; 775 776 TComDataCU* pcCU = this->getCU( uiLCUAddr ); 777 778 TComMv mv; 779 Short temp; 780 781 // RefIdxL0 782 Char refIdxL0 = -1; 783 filestream->read( &refIdxL0, 1 ); 784 assert( refIdxL0 >= -1 ); 785 pcCU->getCUMvField( REF_PIC_LIST_0 )->setRefIdx( (Int)refIdxL0, uiPartAddr ); 786 787 // RefIdxL1 788 Char refIdxL1 = -1; 789 filestream->read( &refIdxL1, 1 ); 790 assert( refIdxL1 >= -1 ); 791 pcCU->getCUMvField( REF_PIC_LIST_1 )->setRefIdx( (Int)refIdxL1, uiPartAddr ); 792 793 // MV L0 794 temp = 0; 795 filestream->read( reinterpret_cast<char*>(&temp), 2 ); 796 mv.setHor( (Short)temp ); 797 temp = 0; 798 filestream->read( reinterpret_cast<char*>(&temp), 2 ); 799 mv.setVer( (Short)temp ); 800 pcCU->getCUMvField( REF_PIC_LIST_0 )->setMv( mv, uiPartAddr ); 801 802 // MV L1 803 temp = 0; 804 filestream->read( reinterpret_cast<char*>(&temp), 2 ); 805 mv.setHor( (Short)temp ); 806 temp = 0; 807 filestream->read( reinterpret_cast<char*>(&temp), 2 ); 808 mv.setVer( (Short)temp ); 809 pcCU->getCUMvField( REF_PIC_LIST_1 )->setMv( mv, uiPartAddr ); 810 811 // set dependent information 812 pcCU->setPredictionMode( uiPartAddr, ( refIdxL0 == NOT_VALID && refIdxL1 == NOT_VALID ) ? MODE_INTRA : MODE_INTER ); 813 UInt uiInterDir = ( refIdxL0 != NOT_VALID ) + ( refIdxL1 != NOT_VALID && this->getSlice(0)->isInterB() ) * 2; 814 assert( uiInterDir >= 0 && uiInterDir <= 3 ); 815 pcCU->setInterDir( uiPartAddr, uiInterDir ); 816 } 817 } 818 } 819 #endif 820 821 #if SYNTAX_OUTPUT 822 Void TComPic::wrireBLSyntax( fstream* filestream, UInt numBytes ) 823 { 824 if( !filestream->good() ) 825 { 826 return; 827 } 828 829 UInt uiWidth = this->getPicYuvRec()->getWidth() - getSlice(0)->getSPS()->getPicCropLeftOffset() - getSlice(0)->getSPS()->getPicCropRightOffset(); 830 UInt uiHeight = this->getPicYuvRec()->getHeight() - getSlice(0)->getSPS()->getPicCropTopOffset() - getSlice(0)->getSPS()->getPicCropBottomOffset(); 831 UInt64 uiPOC = (UInt64)this->getPOC(); 832 UInt uiPartWidth = uiWidth / 4; 833 UInt uiPartHeight = uiHeight / 4; 834 835 UInt uiNumPartInWidth = this->getNumPartInWidth(); 836 UInt uiNumPartInHeight = this->getNumPartInHeight(); 837 UInt uiNumPartLCUInWidth = this->getFrameWidthInCU(); 838 839 filestream->seekg( uiPOC * uiWidth * uiHeight * numBytes / 16 ); 840 841 for( Int i = 0; i < uiPartHeight; i++ ) 842 { 843 for( Int j = 0; j < uiPartWidth; j++ ) 844 { 845 UInt uiX = ( j / uiNumPartInWidth ); 846 UInt uiY = ( i / uiNumPartInHeight ); 847 848 UInt uiLCUAddr = uiY * uiNumPartLCUInWidth + uiX; 849 UInt uiPartAddr = ( i - uiY * uiNumPartInHeight ) * uiNumPartInWidth + ( j - uiX * uiNumPartInWidth ); 850 uiPartAddr = g_auiRasterToZscan[uiPartAddr]; 851 852 TComDataCU* pcCU = this->getCU( uiLCUAddr ); 853 854 TComMv mv; 855 Short temp; 856 Char refIdxL0 = NOT_VALID, refIdxL1 = NOT_VALID; 857 858 // RefIdx 859 if( !pcCU->isIntra( uiPartAddr ) ) 860 { 861 refIdxL0 = (Char)pcCU->getCUMvField( REF_PIC_LIST_0 )->getRefIdx( uiPartAddr ); 862 refIdxL1 = (Char)pcCU->getCUMvField( REF_PIC_LIST_1 )->getRefIdx( uiPartAddr ); 863 } 864 assert( refIdxL0 >= - 1 && refIdxL1 >= - 1 ); 865 filestream->put( refIdxL0 ); 866 filestream->put( refIdxL1 ); 867 868 // MV L0 869 mv.setZero(); 870 if( refIdxL0 >= 0 ) 871 { 872 mv = pcCU->getCUMvField( REF_PIC_LIST_0 )->getMv( uiPartAddr ); 873 } 874 temp = (Short)mv.getHor(); 875 filestream->write( reinterpret_cast<char*>(&temp), 2 ); 876 temp = (Short)mv.getVer(); 877 filestream->write( reinterpret_cast<char*>(&temp), 2 ); 878 879 // MV L1 880 mv.setZero(); 881 if( refIdxL1 >= 0 ) 882 { 883 mv = pcCU->getCUMvField( REF_PIC_LIST_1 )->getMv( uiPartAddr ); 884 } 885 temp = (Short)mv.getHor(); 886 filestream->write( reinterpret_cast<char*>(&temp), 2 ); 887 temp = (Short)mv.getVer(); 888 filestream->write( reinterpret_cast<char*>(&temp), 2 ); 889 } 890 } 891 } 892 #endif 893 467 894 468 895 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPic.h
r51 r54 45 45 #include "TComBitStream.h" 46 46 #include "SEI.h" 47 #if AVC_BASE || SYNTAX_OUTPUT 48 #include <fstream> 49 #endif 47 50 48 51 //! \ingroup TLibCommon … … 58 61 private: 59 62 UInt m_uiTLayer; // Temporal layer 63 #if SVC_EXTENSION 64 UInt m_layerId; // Layer ID 65 #endif 60 66 Bool m_bUsedByCurr; // Used by current picture 61 67 Bool m_bIsLongTerm; // IS long term picture … … 85 91 86 92 SEIMessages m_SEIs; ///< Any SEI messages that have been received. If !NULL we own the object. 93 #if SVC_EXTENSION 94 Bool m_bSpatialEnhLayer; // whether current layer is a spatial enhancement layer, 95 TComPicYuv* m_pcFullPelBaseRec; // upsampled base layer recontruction for difference domain inter prediction 96 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 97 Bool m_bIsILR; // Is ILR picture 98 #endif 99 #endif 87 100 88 101 public: … … 90 103 virtual ~TComPic(); 91 104 105 #if SVC_UPSAMPLING 92 106 Void create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow, 93 Int *numReorderPics, Bool bIsVirtual = false ); 94 107 Int *numReorderPics, TComSPS* pcSps = NULL, Bool bIsVirtual = false ); 108 #if REF_IDX_FRAMEWORK 109 Void createWithOutYuv( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, TComSPS* pcSps = NULL, Bool bIsVirtual = false ); 110 Void setPicYuvRec(TComPicYuv *pPicYuv) { m_apcPicYuv[1]=pPicYuv; } 111 #endif 112 #else 113 Void create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, Window &conformanceWindow, Window &defaultDisplayWindow, 114 Int *numReorderPics, Bool bIsVirtual = false ); 115 #endif 95 116 virtual Void destroy(); 96 117 97 118 UInt getTLayer() { return m_uiTLayer; } 98 119 Void setTLayer( UInt uiTLayer ) { m_uiTLayer = uiTLayer; } 120 #if SVC_EXTENSION 121 Void setLayerId (UInt layerId) { m_layerId = layerId; } 122 UInt getLayerId () { return m_layerId; } 123 Bool isSpatialEnhLayer() { return m_bSpatialEnhLayer; } 124 Void setSpatialEnhLayerFlag (Bool b) { m_bSpatialEnhLayer = b; } 125 Void setFullPelBaseRec ( TComPicYuv* p) { m_pcFullPelBaseRec = p; } 126 TComPicYuv* getFullPelBaseRec () { return m_pcFullPelBaseRec; } 127 #endif 128 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 129 Void setIsILR( Bool bIsILR) {m_bIsILR = bIsILR;} 130 Bool getIsILR() {return m_bIsILR;} 131 #endif 132 133 #if REF_IDX_MFM 134 Void copyUpsampledMvField ( TComPic* pcPicBase ); 135 #if !REUSE_BLKMAPPING 136 Void deriveUnitIdxBase ( UInt uiUpsamplePelX, UInt uiUpsamplePelY, UInt ratio, UInt& uiBaseCUAddr, UInt& uiBaseAbsPartIdx ); 137 #endif 138 #endif 99 139 100 140 Bool getUsedByCurr() { return m_bUsedByCurr; } … … 177 217 const SEIMessages& getSEIs() const { return m_SEIs; } 178 218 219 #if REF_IDX_FRAMEWORK 220 Void copyUpsampledPictureYuv(TComPicYuv* pcPicYuvIn, TComPicYuv* pcPicYuvOut); 221 #endif 222 #if AVC_SYNTAX 223 Void readBLSyntax( fstream* filestream, UInt numBytes ); 224 #endif 225 #if SYNTAX_OUTPUT 226 Void wrireBLSyntax( fstream* filestream, UInt numBytes ); 227 #endif 228 179 229 };// END CLASS DEFINITION TComPic 180 230 -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPicSym.cpp
r51 r54 147 147 m_apcTComDataCU = NULL; 148 148 149 #if AVC_BASE || REF_IDX_FRAMEWORK 150 if( m_apcTComTile ) 151 { 152 #endif 149 153 for(Int i = 0; i < (m_iNumColumnsMinus1+1)*(m_iNumRowsMinus1+1); i++ ) 150 154 { … … 152 156 } 153 157 delete [] m_apcTComTile; 158 #if AVC_BASE || REF_IDX_FRAMEWORK 159 } 160 #endif 154 161 155 162 m_apcTComTile = NULL; … … 178 185 { 179 186 m_apcTComSlice[m_uiNumAllocatedSlice-1]->copySliceInfo( m_apcTComSlice[m_uiNumAllocatedSlice-2] ); 187 #if SET_SLICE_LAYER_ID 188 m_apcTComSlice[m_uiNumAllocatedSlice-1]->initSlice( m_apcTComSlice[m_uiNumAllocatedSlice-1]->getLayerId() ); 189 #else 180 190 m_apcTComSlice[m_uiNumAllocatedSlice-1]->initSlice(); 191 #endif 181 192 } 182 193 } -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPicSym.h
r51 r54 122 122 TComDataCU*& getCU( UInt uiCUAddr ) { return m_apcTComDataCU[uiCUAddr]; } 123 123 124 #if AVC_SYNTAX 125 UInt getMaxCUWidth() { return m_uiMaxCUWidth; } 126 UInt getMaxCUHeight() { return m_uiMaxCUHeight; } 127 UInt getMaxDepth() { return m_uhTotalDepth; } 128 #endif 129 124 130 Void setSlice(TComSlice* p, UInt i) { m_apcTComSlice[i] = p; } 125 131 UInt getNumAllocatedSlice() { return m_uiNumAllocatedSlice; } -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPicYuv.cpp
r51 r54 60 60 m_piPicOrgU = NULL; 61 61 m_piPicOrgV = NULL; 62 63 62 m_bIsBorderExtended = false; 64 63 } … … 67 66 { 68 67 } 69 68 #if SVC_UPSAMPLING 69 Void TComPicYuv::create( Int iPicWidth, Int iPicHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxCUDepth, TComSPS* pcSps ) 70 #else 70 71 Void TComPicYuv::create( Int iPicWidth, Int iPicHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxCUDepth ) 72 #endif 71 73 { 72 74 m_iPicWidth = iPicWidth; 73 75 m_iPicHeight = iPicHeight; 74 76 77 #if SVC_UPSAMPLING 78 if(pcSps != NULL) 79 { 80 m_conformanceWindow = pcSps->getConformanceWindow(); 81 } 82 #endif 83 75 84 // --> After config finished! 76 85 m_iCuWidth = uiMaxCUWidth; -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPicYuv.h
r51 r54 42 42 #include "CommonDef.h" 43 43 #include "TComRom.h" 44 44 #if SVC_UPSAMPLING 45 #include "TComSlice.h" 46 #endif 45 47 //! \ingroup TLibCommon 46 48 //! \{ … … 86 88 Int m_iChromaMarginY; 87 89 90 #if SVC_UPSAMPLING 91 Window m_conformanceWindow; 92 #endif 93 88 94 Bool m_bIsBorderExtended; 89 95 … … 98 104 // Memory management 99 105 // ------------------------------------------------------------------------------------------------ 106 #if SVC_UPSAMPLING 107 Void create ( Int iPicWidth, Int iPicHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxCUDepth, TComSPS* pcSps = NULL); 108 #else 109 Void create ( Int iPicWidth, Int iPicHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxCUDepth ); 110 #endif 100 111 101 Void create ( Int iPicWidth, Int iPicHeight, UInt uiMaxCUWidth, UInt uiMaxCUHeight, UInt uiMaxCUDepth );102 112 Void destroy (); 103 113 … … 112 122 Int getHeight () { return m_iPicHeight; } 113 123 124 #if SVC_EXTENSION 125 Void setHeight ( Int iPicHeight ) { m_iPicHeight = iPicHeight; } 126 #endif 127 128 #if JCTVC_L0178 129 Void setWidth ( Int iPicWidth ) { m_iPicWidth = iPicWidth; } 130 #endif 114 131 Int getStride () { return (m_iPicWidth ) + (m_iLumaMarginX <<1); } 115 132 Int getCStride () { return (m_iPicWidth >> 1) + (m_iChromaMarginX<<1); } … … 140 157 Pel* getCrAddr ( Int iCuAddr, Int uiAbsZorderIdx ) { return m_piPicOrgV + m_cuOffsetC[iCuAddr] + m_buOffsetC[g_auiZscanToRaster[uiAbsZorderIdx]]; } 141 158 159 #if SVC_UPSAMPLING 160 Window& getConformanceWindow() { return m_conformanceWindow; } 161 Void setConformanceWindow(Window& conformanceWindow ) { m_conformanceWindow = conformanceWindow; } 162 #endif 163 142 164 // ------------------------------------------------------------------------------------------------ 143 165 // Miscellaneous -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPrediction.cpp
r51 r54 407 407 } 408 408 409 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 410 Void TComPrediction::getBaseBlk( TComDataCU* pcCU, TComYuv* pcYuvPred, Int iPartAddr, Int iWidth, Int iHeight ) 411 { 412 pcCU->getBaseLumaBlk( iWidth, iHeight, iPartAddr, pcYuvPred->getLumaAddr( iPartAddr ), pcYuvPred->getStride() ); 413 pcCU->getBaseChromaBlk( iWidth >> 1, iHeight >> 1, iPartAddr, pcYuvPred->getCbAddr( iPartAddr ), pcYuvPred->getCStride(), 0 ); 414 pcCU->getBaseChromaBlk( iWidth >> 1, iHeight >> 1, iPartAddr, pcYuvPred->getCrAddr( iPartAddr ), pcYuvPred->getCStride(), 1 ); 415 } 416 #endif 409 417 410 418 Void TComPrediction::motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList, Int iPartIdx ) … … 758 766 return; 759 767 } 768 769 #if SVC_UPSAMPLING 770 Void TComPrediction::upsampleBasePic( TComPicYuv* pcUsPic, TComPicYuv* pcBasePic, TComPicYuv* pcTempPic) 771 { 772 m_cUsf.upsampleBasePic( pcUsPic, pcBasePic, pcTempPic); 773 } 774 #endif 760 775 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComPrediction.h
r51 r54 48 48 #include "TComWeightPrediction.h" 49 49 50 #if SVC_UPSAMPLING 51 #include "TComDataCU.h" 52 #include "TComUpsampleFilter.h" 53 #endif 50 54 //! \ingroup TLibCommon 51 55 //! \{ … … 70 74 TComInterpolationFilter m_if; 71 75 76 #if SVC_UPSAMPLING 77 TComUpsampleFilter m_cUsf; 78 #endif 79 72 80 Pel* m_pLumaRecBuffer; ///< array for downsampled reconstructed luma sample 73 81 Int m_iLumaRecStride; ///< stride of #m_pLumaRecBuffer array … … 94 102 Void initTempBuff(); 95 103 104 #if INTRA_BL 105 Void getBaseBlk ( TComDataCU* pcCU, TComYuv* pcYuvPred, Int iPartAddr, Int iWidth, Int iHeight ); 106 #endif 96 107 // inter 97 108 Void motionCompensation ( TComDataCU* pcCU, TComYuv* pcYuvPred, RefPicList eRefPicList = REF_PIC_LIST_X, Int iPartIdx = -1 ); … … 110 121 Int getPredicBufHeight() { return m_iYuvExtHeight; } 111 122 123 #if SVC_UPSAMPLING 124 Void upsampleBasePic( TComPicYuv* pcUsPic, TComPicYuv* pcBasePic, TComPicYuv* pcTempPic ); 125 #endif 112 126 }; 113 127 -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.cpp
r51 r54 81 81 , m_bNoBackPredFlag ( false ) 82 82 , m_uiTLayer ( 0 ) 83 #if SVC_EXTENSION 84 , m_layerId ( 0 ) 85 , m_pcBaseColPic ( NULL ) 86 #endif 83 87 , m_bTLayerSwitchingFlag ( false ) 84 88 , m_sliceMode ( 0 ) … … 136 140 137 141 142 #if SET_SLICE_LAYER_ID 143 Void TComSlice::initSlice( UInt layerId ) 144 #else 138 145 Void TComSlice::initSlice() 139 { 146 #endif 147 { 148 #if SET_SLICE_LAYER_ID 149 m_layerId = layerId; 150 #endif 140 151 m_aiNumRefIdx[0] = 0; 141 152 m_aiNumRefIdx[1] = 0; … … 344 355 Void TComSlice::setRefPicList( TComList<TComPic*>& rcListPic ) 345 356 { 357 #if REF_IDX_FRAMEWORK 358 if( m_eSliceType == I_SLICE || ( getSPS()->getLayerId() && 359 (getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA) && 360 (getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA) ) ) 361 #else 346 362 if (m_eSliceType == I_SLICE) 363 #endif 347 364 { 348 365 ::memset( m_apcRefPicList, 0, sizeof (m_apcRefPicList)); … … 1261 1278 , m_vuiParametersPresentFlag (false) 1262 1279 , m_vuiParameters () 1280 #if SVC_EXTENSION 1281 , m_layerId(0) 1282 #endif 1263 1283 { 1264 1284 for ( Int i = 0; i < MAX_TLAYER; i++ ) … … 1926 1946 //! activate a PPS and depending on isIDR parameter also SPS and VPS 1927 1947 //! \returns true, if activation is successful 1948 #if SVC_EXTENSION 1949 Bool ParameterSetManager::activatePPS(Int ppsId, Bool isIDR, UInt layerId) 1950 #else 1928 1951 Bool ParameterSetManager::activatePPS(Int ppsId, Bool isIDR) 1952 #endif 1929 1953 { 1930 1954 TComPPS *pps = m_ppsMap.getPS(ppsId); … … 1932 1956 { 1933 1957 Int spsId = pps->getSPSId(); 1958 #if SVC_EXTENSION 1959 if (!isIDR && (spsId != layerId )) 1960 #else 1934 1961 if (!isIDR && (spsId != m_activeSPSId)) 1962 #endif 1935 1963 { 1936 1964 printf("Warning: tried to activate PPS referring to a inactive SPS at non-IDR."); … … 2001 2029 } 2002 2030 #endif 2031 2032 #if SVC_EXTENSION 2033 #if AVC_SYNTAX 2034 Void TComSlice::initBaseLayerRPL( TComSlice *pcSlice ) 2035 { 2036 // Assumed that RPL of the base layer is same to the EL, otherwise this information should be also dumped and read from the metadata file 2037 setPOC( pcSlice->getPOC() ); 2038 if( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) 2039 { 2040 setSliceType( I_SLICE ); 2041 } 2042 else 2043 { 2044 setSliceType( pcSlice->getSliceType() ); 2045 } 2046 2047 if( this->isIntra() ) 2048 { 2049 return; 2050 } 2051 2052 //initialize reference POC of BL 2053 for( Int iRefPicList = 0; iRefPicList < 2; iRefPicList++ ) 2054 { 2055 RefPicList eRefPicList = RefPicList( iRefPicList ); 2056 2057 assert( pcSlice->getNumRefIdx( eRefPicList) > 0 ); 2058 setNumRefIdx( eRefPicList, pcSlice->getNumRefIdx( eRefPicList ) - 1 ); 2059 assert( getNumRefIdx( eRefPicList) <= MAX_NUM_REF); 2060 2061 for(Int refIdx = 0; refIdx < getNumRefIdx( eRefPicList ); refIdx++) 2062 { 2063 setRefPOC( pcSlice->getRefPic( eRefPicList, refIdx )->getPOC(), eRefPicList, refIdx ); 2064 setRefPic( pcSlice->getRefPic( eRefPicList, refIdx ), eRefPicList, refIdx ); 2065 /* 2066 // should be set if the base layer has its own instance of the reference picture lists, currently EL RPL is reused. 2067 getRefPic( eRefPicList, refIdx )->setLayerId( 0 ); 2068 getRefPic( eRefPicList, refIdx )->setIsLongTerm( pcSlice->getRefPic( eRefPicList, refIdx )->getIsLongTerm() ); 2069 getRefPic( eRefPicList, refIdx )->setIsUsedAsLongTerm( pcSlice->getRefPic( eRefPicList, refIdx )->getIsUsedAsLongTerm() ); 2070 */ 2071 2072 } 2073 } 2074 return; 2075 } 2076 #endif 2077 2078 Void TComSlice::setBaseColPic( TComList<TComPic*>& rcListPic, UInt layerID ) 2079 { 2080 if (layerID == 0) 2081 { 2082 m_pcBaseColPic = NULL; 2083 return; 2084 } 2085 setBaseColPic(xGetRefPic(rcListPic, getPOC())); 2086 } 2087 #endif 2088 2089 #if REF_IDX_FRAMEWORK 2090 Void TComSlice::addRefPicList( TComPic **pIlpPicList, Int iRefPicNum, Int iInsertOffset ) 2091 { 2092 if(getSPS()->getLayerId() && m_eSliceType != I_SLICE) 2093 { 2094 #if REF_IDX_MFM 2095 assert(iRefPicNum == 1); 2096 if( getPOC() != 0 ) 2097 { 2098 pIlpPicList[0]->copyUpsampledMvField(getBaseColPic()); 2099 } 2100 #endif 2101 //add to list 0; 2102 Int iOffset; 2103 m_aiNumRefIdx[REF_PIC_LIST_0] += iInsertOffset; 2104 iOffset = m_aiNumRefIdx[REF_PIC_LIST_0]; 2105 for (Int i=0; i<iRefPicNum; i++) 2106 { 2107 pIlpPicList[i]->setIsLongTerm(1); //mark ilp as long-term reference 2108 pIlpPicList[i]->setIsUsedAsLongTerm(1); //mark ilp as long-term reference 2109 m_apcRefPicList[REF_PIC_LIST_0][iOffset + i] = pIlpPicList[i]; 2110 m_aiNumRefIdx[REF_PIC_LIST_0]++; 2111 //m_aiNumRefIdx[REF_PIC_LIST_C]++; 2112 } 2113 if(m_eSliceType == B_SLICE) 2114 { 2115 m_aiNumRefIdx[REF_PIC_LIST_1] += iInsertOffset; 2116 iOffset = m_aiNumRefIdx[REF_PIC_LIST_1]; 2117 for (Int i=0; i<iRefPicNum; i++) 2118 { 2119 pIlpPicList[i]->setIsLongTerm(1); //mark ilp as long-term reference 2120 pIlpPicList[i]->setIsUsedAsLongTerm(1); //mark ilp as long-term reference 2121 m_apcRefPicList[REF_PIC_LIST_1][iOffset + i] = pIlpPicList[i]; 2122 m_aiNumRefIdx[REF_PIC_LIST_1]++; 2123 //m_aiNumRefIdx[REF_PIC_LIST_C]++; 2124 } 2125 } 2126 } 2127 } 2128 2129 #if REF_IDX_MFM 2130 Void TComSlice::setRefPOCListILP( TComPic** ilpPic, TComPic *pcRefPicBL ) 2131 { 2132 //set reference picture POC of each ILP reference 2133 Int thePoc = ilpPic[0]->getPOC(); 2134 assert(thePoc >= 0); 2135 assert(thePoc == pcRefPicBL->getPOC()); 2136 2137 #if REUSE_MVSCALE || REUSE_BLKMAPPING 2138 ilpPic[0]->getSlice(0)->setBaseColPic( pcRefPicBL ); 2139 #endif 2140 2141 //initialize reference POC of ILP 2142 for(Int refIdx = 0; refIdx < MAX_NUM_REF; refIdx++) 2143 { 2144 ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_0, refIdx); 2145 ilpPic[0]->getSlice(0)->setRefPOC(0, REF_PIC_LIST_1, refIdx); 2146 2147 ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_0, refIdx); 2148 ilpPic[0]->getSlice(0)->setRefPic(NULL, REF_PIC_LIST_1, refIdx); 2149 } 2150 2151 //set reference POC of ILP 2152 ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_0, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0)); 2153 assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0) <= MAX_NUM_REF); 2154 ilpPic[0]->getSlice(0)->setNumRefIdx(REF_PIC_LIST_1, pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1)); 2155 assert(ilpPic[0]->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1) <= MAX_NUM_REF); 2156 2157 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++) 2158 { 2159 ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx); 2160 } 2161 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++) 2162 { 2163 ilpPic[0]->getSlice(0)->setRefPOC(pcRefPicBL->getSlice(0)->getRefPOC(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx); 2164 } 2165 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_0); refIdx++) 2166 { 2167 ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_0, refIdx), REF_PIC_LIST_0, refIdx); 2168 } 2169 for(Int refIdx = 0; refIdx < pcRefPicBL->getSlice(0)->getNumRefIdx(REF_PIC_LIST_1); refIdx++) 2170 { 2171 ilpPic[0]->getSlice(0)->setRefPic(pcRefPicBL->getSlice(0)->getRefPic(REF_PIC_LIST_1, refIdx), REF_PIC_LIST_1, refIdx); 2172 } 2173 return; 2174 } 2175 #endif 2176 2177 2178 #endif 2003 2179 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComSlice.h
r51 r54 51 51 class TComPic; 52 52 class TComTrQuant; 53 54 #if SVC_EXTENSION 55 class TComPicYuv; 56 #endif 53 57 // ==================================================================================================================== 54 58 // Constants … … 850 854 static const Int m_winUnitY[MAX_CHROMA_FORMAT_IDC+1]; 851 855 TComPTL m_pcPTL; 856 857 #if SVC_EXTENSION 858 UInt m_layerId; 859 #endif 860 #if REF_IDX_MFM 861 Bool m_bMFMEnabledFlag; 862 #endif 852 863 public: 853 864 TComSPS(); … … 976 987 977 988 TComPTL* getPTL() { return &m_pcPTL; } 989 990 #if SVC_EXTENSION 991 Void setLayerId(UInt layerId) { m_layerId = layerId; } 992 UInt getLayerId() { return m_layerId; } 993 #endif 994 #if REF_IDX_MFM 995 Void setMFMEnabledFlag(Bool flag) {m_bMFMEnabledFlag = flag;} 996 Bool getMFMEnabledFlag() {return m_bMFMEnabledFlag;} 997 #endif 978 998 }; 979 999 … … 1283 1303 Bool m_bNoBackPredFlag; 1284 1304 UInt m_uiTLayer; 1305 #if SVC_EXTENSION 1306 UInt m_layerId; 1307 TComPic* m_pcBaseColPic; 1308 TComPicYuv* m_pcFullPelBaseRec; 1309 #endif 1285 1310 Bool m_bTLayerSwitchingFlag; 1286 1311 … … 1319 1344 TComSlice(); 1320 1345 virtual ~TComSlice(); 1346 #if SET_SLICE_LAYER_ID 1347 Void initSlice ( UInt layerId ); 1348 #else 1321 1349 Void initSlice (); 1350 #endif 1322 1351 1323 1352 Void setVPS ( TComVPS* pcVPS ) { m_pcVPS = pcVPS; } … … 1417 1446 Void setDepth ( Int iDepth ) { m_iDepth = iDepth; } 1418 1447 1448 #if SVC_EXTENSION 1449 Void setBaseColPic ( TComPic* p) { m_pcBaseColPic = p; } 1450 Void setBaseColPic ( TComList<TComPic*>& rcListPic , UInt layerID ); 1451 TComPic* getBaseColPic () { return m_pcBaseColPic; } 1452 1453 Void setLayerId (UInt layerId) { m_layerId = layerId; } 1454 UInt getLayerId () { return m_layerId; } 1455 1456 Void setFullPelBaseRec ( TComPicYuv* p) { m_pcFullPelBaseRec = p; } 1457 TComPicYuv* getFullPelBaseRec () { return m_pcFullPelBaseRec; } 1458 1459 #if AVC_SYNTAX 1460 Void initBaseLayerRPL( TComSlice *pcSlice ); 1461 #endif 1462 #endif 1463 1464 #if REF_IDX_MFM 1465 Void setRefPOCListILP(TComPic** ilpPic, TComPic *pcRefPicBL); 1466 #endif 1467 1419 1468 Void setRefPicList ( TComList<TComPic*>& rcListPic ); 1420 1469 Void setRefPOCList (); … … 1536 1585 Void setEnableTMVPFlag ( Bool b ) { m_enableTMVPFlag = b; } 1537 1586 Bool getEnableTMVPFlag () { return m_enableTMVPFlag;} 1538 1587 #if REF_IDX_FRAMEWORK 1588 Void addRefPicList( TComPic **pIlpPicList, Int iRefPicNum, Int iInsertOffset=0 ); 1589 #endif 1539 1590 protected: 1540 1591 TComPic* xGetRefPic (TComList<TComPic*>& rcListPic, … … 1625 1676 //! activate a PPS and depending on isIDR parameter also SPS and VPS 1626 1677 //! \returns true, if activation is successful 1678 #if SVC_EXTENSION 1679 Bool activatePPS(Int ppsId, Bool isIDR, UInt layerId); 1680 #else 1627 1681 Bool activatePPS(Int ppsId, Bool isIDR); 1682 #endif 1628 1683 1629 1684 TComVPS* getActiveVPS(){ return m_vpsMap.getPS(m_activeVPSId); }; -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComTrQuant.cpp
r51 r54 1236 1236 uiMode = pcCU->getLumaIntraDir( uiAbsPartIdx ); 1237 1237 } 1238 #if INTRA_BL_DST4x4 1239 else if(eTType == TEXT_LUMA && pcCU->isIntraBL(uiAbsPartIdx) ) 1240 { 1241 uiMode = DC_IDX; //Using DST 1242 } 1243 #endif 1238 1244 else 1239 1245 { … … 1309 1315 Int scalingListType = (pcCU->isIntra(uiAbsPartIdx) ? 0 : 3) + g_eTTable[(Int)eTxt]; 1310 1316 assert(scalingListType < 6); 1317 #if NO_RESIDUAL_FLAG_FOR_BLPRED 1318 if(pcCU->isIntraBL(uiAbsPartIdx) && eTxt == TEXT_LUMA) 1319 { 1320 invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), eTxt, DC_IDX, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType, pcCU->getTransformSkip(uiAbsPartIdx, eTxt) ); 1321 } 1322 else 1323 { 1324 invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType, pcCU->getTransformSkip(uiAbsPartIdx, eTxt) ); 1325 } 1326 #else 1311 1327 invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), eTxt, REG_DCT, pResi, uiStride, rpcCoeff, uiWidth, uiHeight, scalingListType, pcCU->getTransformSkip(uiAbsPartIdx, eTxt) ); 1328 #endif 1312 1329 } 1313 1330 else … … 1803 1820 Int ui16CtxCbf = 0; 1804 1821 Int iBestLastIdxP1 = 0; 1822 #if NO_RESIDUAL_FLAG_FOR_BLPRED 1823 if( (!pcCU->isIntra( uiAbsPartIdx ) || pcCU->isIntraBL( uiAbsPartIdx )) && eTType == TEXT_LUMA && pcCU->getTransformIdx( uiAbsPartIdx ) == 0 ) 1824 #else 1805 1825 if( !pcCU->isIntra( uiAbsPartIdx ) && eTType == TEXT_LUMA && pcCU->getTransformIdx( uiAbsPartIdx ) == 0 ) 1826 #endif 1806 1827 { 1807 1828 ui16CtxCbf = 0; -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComYuv.cpp
r51 r54 184 184 } 185 185 186 #if NO_RESIDUAL_FLAG_FOR_BLPRED 187 Void TComYuv::copyFromPicLuma ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiZorderIdxInCU, UInt uiAbsZorderIdx, UInt uiWidth, UInt uiHeight ) 188 { 189 Int y; 190 191 Pel* pDst = getLumaAddr(uiAbsZorderIdx); 192 Pel* pSrc = pcPicYuvSrc->getLumaAddr ( iCuAddr, uiZorderIdxInCU + uiAbsZorderIdx ); 193 194 UInt iDstStride = getStride(); 195 UInt iSrcStride = pcPicYuvSrc->getStride(); 196 for ( y = uiHeight; y != 0; y-- ) 197 { 198 ::memcpy( pDst, pSrc, sizeof(Pel)*uiWidth); 199 pDst += iDstStride; 200 pSrc += iSrcStride; 201 } 202 } 203 204 Void TComYuv::copyFromPicChroma( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiZorderIdxInCU, UInt uiAbsZorderIdx, UInt uiCWidth, UInt uiCHeight, UInt uiChromaId ) 205 { 206 Int y; 207 208 if (!uiChromaId) 209 { 210 Pel* pDstU = getCbAddr(uiAbsZorderIdx); 211 Pel* pSrcU = pcPicYuvSrc->getCbAddr( iCuAddr, uiZorderIdxInCU + uiAbsZorderIdx ); 212 213 UInt iDstStride = getCStride(); 214 UInt iSrcStride = pcPicYuvSrc->getCStride(); 215 for ( y = uiCHeight; y != 0; y-- ) 216 { 217 ::memcpy( pDstU, pSrcU, sizeof(Pel)*(uiCWidth) ); 218 pSrcU += iSrcStride; 219 pDstU += iDstStride; 220 } 221 } 222 else 223 { 224 Pel* pDstV = getCrAddr(uiAbsZorderIdx); 225 Pel* pSrcV = pcPicYuvSrc->getCrAddr( iCuAddr, uiZorderIdxInCU + uiAbsZorderIdx ); 226 227 UInt iDstStride = getCStride(); 228 UInt iSrcStride = pcPicYuvSrc->getCStride(); 229 for ( y = uiCHeight; y != 0; y-- ) 230 { 231 ::memcpy( pDstV, pSrcV, sizeof(Pel)*(uiCWidth) ); 232 pSrcV += iSrcStride; 233 pDstV += iDstStride; 234 } 235 } 236 } 237 #endif 238 186 239 Void TComYuv::copyToPartYuv( TComYuv* pcYuvDst, UInt uiDstPartIdx ) 187 240 { -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TComYuv.h
r51 r54 115 115 Void copyFromPicLuma ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx ); 116 116 Void copyFromPicChroma ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiAbsZorderIdx ); 117 #if NO_RESIDUAL_FLAG_FOR_BLPRED 118 Void copyFromPicLuma ( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiZorderIdxInCU, UInt uiAbsZorderIdx, UInt uiWidth, UInt uiHeight ); 119 Void copyFromPicChroma( TComPicYuv* pcPicYuvSrc, UInt iCuAddr, UInt uiZorderIdxInCU, UInt uiAbsZorderIdx, UInt uiCWidth, UInt uiCHeight, UInt uiChromaId ); 120 #endif 117 121 118 122 // Copy Small YUV buffer to the part of other Big YUV buffer -
branches/HM-10.0-dev-SHM/source/Lib/TLibCommon/TypeDef.h
r51 r54 38 38 #ifndef _TYPEDEF__ 39 39 #define _TYPEDEF__ 40 41 #define SVC_EXTENSION 1 42 43 #define SYNTAX_BYTES 10 ///< number of bytes taken by syntaxes per 4x4 block [RefIdxL0(1byte), RefIdxL1(1byte), MVxL0(2bytes), MVyL0(2bytes), MVxL1(2bytes), MVyL1(2bytes)] 44 45 #if SVC_EXTENSION 46 #define MAX_LAYERS 2 ///< max number of layers the codec is supposed to handle 47 48 #define SVC_COL_BLK 1 ///< get co-located block 49 #define SVC_UPSAMPLING 1 ///< upsampling filters 50 #define PHASE_DERIVATION_IN_INTEGER 1 ///< upsampling filters implementation using only integer arithmetic 51 #define SET_SLICE_LAYER_ID 1 ///< set layerId to the slice 52 #define BUGFIX_925 1 ///< bug fix ticket #925 53 #define ENCODER_BUGFIX 1 ///< L0167: encoder bug fix for inter mode 54 #define CHROMA_UPSAMPLING 1 ///< L0335: Chroma upsampling with 5 bits coefficients 55 56 #define MV_SCALING_FIX 1 ///< fixing the base layer MV scaling 57 #define MV_SCALING_POS_FIX 1 ///< use center pixels to get co-located base layer block 58 #define MFM_CLIPPING_FIX 1 ///< set the right picture size for the clipping 59 60 #define AVC_BASE 0 ///< YUV BL reading for AVC base SVC 61 #define REF_IDX_FRAMEWORK 0 ///< inter-layer reference framework 62 63 #if AVC_BASE 64 #define AVC_SYNTAX 1 ///< Syntax reading for AVC base 65 #endif 66 67 #if REF_IDX_FRAMEWORK 68 #define REF_IDX_ME_AROUND_ZEROMV 0 ///< added ME around zero MV for inter-layer reference picture 69 #define REF_IDX_ME_ZEROMV 1 ///< L0051: use zero motion for inter-layer reference picture (without fractional ME) 70 #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. 71 #if !AVC_BASE || AVC_SYNTAX 72 #define REF_IDX_MFM 1 ///< L0336: motion vector mapping of inter-layer reference picture 73 #endif 74 75 #if REF_IDX_MFM 76 #define REUSE_MVSCALE 1 ///< using the base layer MV scaling function 77 #define REUSE_BLKMAPPING 1 ///< using the base layer get co-located block function 78 #endif 79 80 #else 81 #define INTRA_BL 0 ///< inter-layer texture prediction 82 83 #if INTRA_BL 84 #define INTRA_BL_DST4x4 1 ///< L0067/L0204: DST4x4 for Intra BL 85 #define NO_RESIDUAL_FLAG_FOR_BLPRED 1 ///< L0437: Root cbf for Intra_BL 86 87 // Hooks 88 #if !AVC_BASE || AVC_SYNTAX 89 #define SVC_MVP 1 ///< motion hook for merge mode as an example 90 #if !AVC_SYNTAX 91 #define SVC_BL_CAND_INTRA 0 ///< Intra Base Mode Prediction hook as an example 92 #endif 93 #endif 94 95 #if SVC_UPSAMPLING 96 #define JCTVC_L0178 1 ///< implementation of JCTVC-L0178 (code only supports right and bottom croppping offsets) 97 #endif 98 99 #endif 100 #endif 101 #else 102 #define SYNTAX_OUTPUT 0 103 #endif 40 104 41 105 //! \ingroup TLibCommon -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/NALread.cpp
r51 r54 100 100 nalu.m_nalUnitType = (NalUnitType) bs.read(6); // nal_unit_type 101 101 nalu.m_reservedZero6Bits = bs.read(6); // nuh_reserved_zero_6bits 102 #if SVC_EXTENSION 103 nalu.m_layerId = nalu.m_reservedZero6Bits; 104 #else 102 105 assert(nalu.m_reservedZero6Bits == 0); 106 #endif 103 107 nalu.m_temporalId = bs.read(3) - 1; // nuh_temporal_id_plus1 104 108 -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCAVLC.cpp
r51 r54 697 697 } 698 698 READ_FLAG( uiCode, "sps_temporal_mvp_enable_flag" ); pcSPS->setTMVPFlagsPresent(uiCode); 699 699 #if REF_IDX_MFM 700 if(pcSPS->getLayerId() > 0) 701 { 702 READ_FLAG( uiCode, "sps_enh_mfm_enable_flag" ); 703 pcSPS->setMFMEnabledFlag( uiCode ? true : false ); 704 assert(pcSPS->getMFMEnabledFlag()); 705 } 706 #endif 700 707 READ_FLAG( uiCode, "sps_strong_intra_smoothing_enable_flag" ); pcSPS->setUseStrongIntraSmoothing(uiCode); 701 708 … … 1927 1934 } 1928 1935 1936 #if INTRA_BL 1937 Void TDecCavlc::parseIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ) 1938 { 1939 assert(0); 1940 } 1941 #endif 1942 1929 1943 //! \} 1930 1944 -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCAVLC.h
r51 r54 120 120 Void updateContextTables ( SliceType /*eSliceType*/, Int /*iQp*/ ) { return; } 121 121 122 #if INTRA_BL 123 Void parseIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ); 124 #endif 125 122 126 Void xParsePredWeightTable ( TComSlice* pcSlice ); 123 127 Void parseScalingList ( TComScalingList* scalingList ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCu.cpp
r51 r54 37 37 38 38 #include "TDecCu.h" 39 #if SVC_EXTENSION 40 #include "TDecTop.h" 41 #endif 42 39 43 40 44 //! \ingroup TLibDecoder … … 56 60 } 57 61 62 #if SVC_EXTENSION 63 Void TDecCu::init(TDecTop** ppcDecTop, TDecEntropy* pcEntropyDecoder, TComTrQuant* pcTrQuant, TComPrediction* pcPrediction, UInt layerId) 64 { 65 m_pcEntropyDecoder = pcEntropyDecoder; 66 m_pcTrQuant = pcTrQuant; 67 m_pcPrediction = pcPrediction; 68 m_ppcTDecTop = ppcDecTop; 69 m_layerId = layerId; 70 71 for ( UInt ui = 0; ui < m_uiMaxDepth-1; ui++ ) 72 { 73 m_ppcCU [ui]->setLayerId(layerId); 74 } 75 } 76 #else 58 77 Void TDecCu::init( TDecEntropy* pcEntropyDecoder, TComTrQuant* pcTrQuant, TComPrediction* pcPrediction) 59 78 { … … 62 81 m_pcPrediction = pcPrediction; 63 82 } 83 #endif 64 84 65 85 /** … … 128 148 129 149 // start from the top level CU 150 #if SVC_EXTENSION 151 pcCU->setLayerId(m_layerId); 152 #endif 130 153 xDecodeCU( pcCU, 0, 0, ruiIsLast); 131 154 } … … 311 334 return; 312 335 } 336 #if INTRA_BL 337 m_pcEntropyDecoder->decodeIntraBLFlag( pcCU, uiAbsPartIdx, 0, uiDepth ); 338 if ( pcCU->isIntraBL( uiAbsPartIdx ) ) 339 { 340 pcCU->setSizeSubParts( g_uiMaxCUWidth>>uiDepth, g_uiMaxCUHeight>>uiDepth, uiAbsPartIdx, uiDepth ); 341 } 342 else 343 { 344 #endif 313 345 314 346 m_pcEntropyDecoder->decodePredMode( pcCU, uiAbsPartIdx, uiDepth ); … … 325 357 } 326 358 } 359 #if INTRA_BL 360 // prediction mode ( Intra : direction mode, Inter : Mv, reference idx ) 361 m_pcEntropyDecoder->decodePredInfo( pcCU, uiAbsPartIdx, uiDepth, m_ppcCU[uiDepth]); 362 } 363 #endif 327 364 328 365 UInt uiCurrWidth = pcCU->getWidth ( uiAbsPartIdx ); 329 366 UInt uiCurrHeight = pcCU->getHeight( uiAbsPartIdx ); 330 367 368 #if !INTRA_BL 331 369 // prediction mode ( Intra : direction mode, Inter : Mv, reference idx ) 332 370 m_pcEntropyDecoder->decodePredInfo( pcCU, uiAbsPartIdx, uiDepth, m_ppcCU[uiDepth]); 371 #endif 333 372 334 373 // Coefficient decoding … … 401 440 xReconIntraQT( m_ppcCU[uiDepth], uiDepth ); 402 441 break; 442 #if INTRA_BL 443 case MODE_INTRA_BL: 444 #if NO_RESIDUAL_FLAG_FOR_BLPRED 445 xReconIntraBL( m_ppcCU[uiDepth], uiAbsPartIdx, uiDepth ); 446 #else 447 xReconIntraQT( m_ppcCU[uiDepth], uiAbsPartIdx, uiDepth ); 448 #endif 449 break; 450 #endif 403 451 default: 404 452 assert(0); … … 468 516 469 517 //===== get prediction signal ===== 518 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 519 if(pcCU->isIntraBL ( uiAbsPartIdx ) ) 520 { 521 pcCU->getBaseLumaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride ); 522 } 523 else 524 #endif 470 525 m_pcPrediction->predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail ); 471 526 … … 552 607 553 608 //===== get prediction signal ===== 609 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 610 if(pcCU->isIntraBL ( uiAbsPartIdx ) ) 611 { 612 pcCU->getBaseChromaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride, uiChromaId ); 613 } 614 else 615 #endif 554 616 { 555 617 if( uiChromaPredMode == DM_CHROMA_IDX ) … … 869 931 } 870 932 933 #if NO_RESIDUAL_FLAG_FOR_BLPRED 934 Void 935 TDecCu::xReconIntraBL( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) 936 { 937 m_ppcYuvReco[uiDepth]->copyFromPicLuma ( pcCU->getSlice()->getFullPelBaseRec(), pcCU->getAddr(), pcCU->getZorderIdxInCU(), 0, pcCU->getWidth(0), pcCU->getHeight(0)); 938 m_ppcYuvReco[uiDepth]->copyFromPicChroma( pcCU->getSlice()->getFullPelBaseRec(), pcCU->getAddr(), pcCU->getZorderIdxInCU(), 0, (pcCU->getWidth(0)>>1), (pcCU->getHeight(0)>>1), 0); 939 m_ppcYuvReco[uiDepth]->copyFromPicChroma( pcCU->getSlice()->getFullPelBaseRec(), pcCU->getAddr(), pcCU->getZorderIdxInCU(), 0, (pcCU->getWidth(0)>>1), (pcCU->getHeight(0)>>1), 1); 940 941 // inter recon 942 xDecodeInterTexture( pcCU, 0, uiDepth ); 943 944 // clip for only non-zero cbp case 945 if ( ( pcCU->getCbf( 0, TEXT_LUMA ) ) || ( pcCU->getCbf( 0, TEXT_CHROMA_U ) ) || ( pcCU->getCbf(0, TEXT_CHROMA_V ) ) ) 946 { 947 m_ppcYuvReco[uiDepth]->addClip( m_ppcYuvReco[uiDepth], m_ppcYuvResi[uiDepth], 0, pcCU->getWidth( 0 ) ); 948 } 949 else 950 { 951 m_ppcYuvReco[uiDepth]->copyPartToPartYuv( m_ppcYuvReco[uiDepth],0, pcCU->getWidth( 0 ),pcCU->getHeight( 0 )); 952 } 953 } 954 #endif 955 871 956 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecCu.h
r51 r54 49 49 //! \ingroup TLibDecoder 50 50 //! \{ 51 #if SVC_EXTENSION 52 class TDecTop; 53 #endif 51 54 52 55 // ==================================================================================================================== … … 69 72 70 73 Bool m_bDecodeDQP; 74 #if SVC_EXTENSION 75 TDecTop** m_ppcTDecTop; 76 UInt m_layerId; 77 #endif 78 79 #if INTRA_BL 80 TComPicYuv* m_pcPicYuvRecBase; ///< reconstructed base layer 81 #endif 71 82 72 83 public: … … 75 86 76 87 /// initialize access channels 88 #if SVC_EXTENSION 89 Void init ( TDecTop** ppcDecTop, TDecEntropy* pcEntropyDecoder, TComTrQuant* pcTrQuant, TComPrediction* pcPrediction, UInt layerId ); 90 #else 77 91 Void init ( TDecEntropy* pcEntropyDecoder, TComTrQuant* pcTrQuant, TComPrediction* pcPrediction ); 92 #endif 78 93 79 94 /// create internal buffers … … 89 104 Void decompressCU ( TComDataCU* pcCU ); 90 105 106 #if SVC_EXTENSION 107 TDecTop* getLayerDec ( UInt LayerId ) { return m_ppcTDecTop[LayerId]; } 108 #if INTRA_BL 109 Void setBaseRecPic ( TComPicYuv* p ) { m_pcPicYuvRecBase = p; } 110 #endif 111 #endif 91 112 protected: 92 113 … … 101 122 Void xIntraRecLumaBlk ( TComDataCU* pcCU, UInt uiTrDepth, UInt uiAbsPartIdx, TComYuv* pcRecoYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv ); 102 123 Void xIntraRecChromaBlk ( TComDataCU* pcCU, UInt uiTrDepth, UInt uiAbsPartIdx, TComYuv* pcRecoYuv, TComYuv* pcPredYuv, TComYuv* pcResiYuv, UInt uiChromaId ); 124 #if NO_RESIDUAL_FLAG_FOR_BLPRED 125 Void xReconIntraBL ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ); 126 #endif 103 127 104 128 Void xReconPCM ( TComDataCU* pcCU, UInt uiDepth ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecEntropy.cpp
r51 r54 58 58 } 59 59 60 #if INTRA_BL 61 Void TDecEntropy::decodeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ) 62 { 63 m_pcEntropyDecoderIf->parseIntraBLFlag( pcCU, uiAbsPartIdx, uiPartIdx, uiDepth ); 64 } 65 #endif 66 60 67 /** decode merge flag 61 68 * \param pcSubCU … … 104 111 Void TDecEntropy::decodePredInfo ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, TComDataCU* pcSubCU ) 105 112 { 113 #if INTRA_BL 114 if( pcCU->isIntraBL( uiAbsPartIdx ) ) // Do nothing for Intra BL mode. 115 { 116 return; 117 } 118 #endif 106 119 if( pcCU->isIntra( uiAbsPartIdx ) ) // If it is Intra mode, encode intra prediction mode. 107 120 { … … 175 188 decodeMergeIndex( pcCU, uiPartIdx, uiSubPartIdx, uiDepth ); 176 189 UInt uiMergeIndex = pcCU->getMergeIndex(uiSubPartIdx); 190 #if REF_IDX_FRAMEWORK // HM bug fix 191 if(uiPartIdx) 192 { 193 for(UInt ui=0; ui<uiMergeIndex+1; ui++) 194 { 195 cMvFieldNeighbours[(ui<<1)].setMvField(TComMv(), NOT_VALID); 196 cMvFieldNeighbours[(ui<<1)+1].setMvField(TComMv(), NOT_VALID); 197 } 198 } 199 #endif 177 200 if ( pcCU->getSlice()->getPPS()->getLog2ParallelMergeLevelMinus2() && ePartSize != SIZE_2Nx2N && pcSubCU->getWidth( 0 ) <= 8 ) 178 201 { … … 437 460 438 461 pcCU->setCbfSubParts ( 0, TEXT_LUMA, uiAbsPartIdx, uiDepth ); 462 #if INTRA_BL 463 #if NO_RESIDUAL_FLAG_FOR_BLPRED 464 if( ( !pcCU->isIntra(uiAbsPartIdx) || pcCU->isIntraBL(uiAbsPartIdx)) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 465 #else 466 if( ( !pcCU->isIntra(uiAbsPartIdx) ) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 467 #endif 468 #else 439 469 if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 470 #endif 440 471 { 441 472 pcCU->setCbfSubParts( 1 << uiTrDepth, TEXT_LUMA, uiAbsPartIdx, uiDepth ); … … 535 566 UInt uiChromaOffset = uiLumaOffset>>2; 536 567 568 #if NO_RESIDUAL_FLAG_FOR_BLPRED 569 if( pcCU->isIntra(uiAbsPartIdx) && !pcCU->isIntraBL(uiAbsPartIdx) ) 570 #else 537 571 if( pcCU->isIntra(uiAbsPartIdx) ) 572 #endif 538 573 { 539 574 } -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecEntropy.h
r51 r54 102 102 virtual Void parseCoeffNxN( TComDataCU* pcCU, TCoeff* pcCoef, UInt uiAbsPartIdx, UInt uiWidth, UInt uiHeight, UInt uiDepth, TextType eTType ) = 0; 103 103 virtual Void parseTransformSkipFlags ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt width, UInt height, UInt uiDepth, TextType eTType) = 0; 104 105 #if INTRA_BL 106 virtual Void parseIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ) = 0; 107 #endif 108 104 109 virtual Void updateContextTables( SliceType eSliceType, Int iQp ) = 0; 105 110 … … 157 162 Void updateContextTables ( SliceType eSliceType, Int iQp ) { m_pcEntropyDecoderIf->updateContextTables( eSliceType, iQp ); } 158 163 164 #if INTRA_BL 165 Void decodeIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ); 166 #endif 159 167 160 168 private: -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecGop.cpp
r51 r54 43 43 #include "libmd5/MD5.h" 44 44 #include "TLibCommon/SEI.h" 45 #if SVC_EXTENSION 46 #include "TDecTop.h" 47 #endif 45 48 46 49 #include <time.h> … … 67 70 } 68 71 72 #if SVC_EXTENSION 73 Void TDecGop::create(UInt layerId) 74 { 75 m_layerId = layerId; 76 } 77 #else 69 78 Void TDecGop::create() 70 79 { 71 80 72 81 } 73 82 #endif 74 83 75 84 Void TDecGop::destroy() 76 85 { 77 86 } 78 87 #if SVC_EXTENSION 88 Void TDecGop::init(TDecTop** ppcDecTop, 89 TDecEntropy* pcEntropyDecoder, 90 #else 79 91 Void TDecGop::init( TDecEntropy* pcEntropyDecoder, 92 #endif 80 93 TDecSbac* pcSbacDecoder, 81 94 TDecBinCABAC* pcBinCABAC, … … 93 106 m_pcLoopFilter = pcLoopFilter; 94 107 m_pcSAO = pcSAO; 108 #if SVC_EXTENSION 109 m_ppcTDecTop = ppcDecTop; 110 #endif 95 111 } 96 112 … … 210 226 211 227 //-- For time output for each slice 228 #if SVC_EXTENSION 229 printf("\nPOC %4d LId: %1d TId: %1d ( %c-SLICE, QP%3d ) ", pcSlice->getPOC(), 230 rpcPic->getLayerId(), 231 pcSlice->getTLayer(), 232 c, 233 pcSlice->getSliceQp() ); 234 #else 212 235 printf("\nPOC %4d TId: %1d ( %c-SLICE, QP%3d ) ", pcSlice->getPOC(), 213 236 pcSlice->getTLayer(), 214 237 c, 215 238 pcSlice->getSliceQp() ); 216 239 #endif 217 240 m_dDecTime += (Double)(clock()-iBeforeTime) / CLOCKS_PER_SEC; 218 241 printf ("[DT %6.3f] ", m_dDecTime ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecGop.h
r51 r54 87 87 std::vector<Bool> m_LFCrossSliceBoundaryFlag; 88 88 89 #if SVC_EXTENSION 90 UInt m_layerId; 91 TDecTop** m_ppcTDecTop; 92 #endif 89 93 public: 90 94 TDecGop(); 91 95 virtual ~TDecGop(); 92 96 97 #if SVC_EXTENSION 98 Void init ( TDecTop** ppcDecTop, 99 TDecEntropy* pcEntropyDecoder, 100 #else 93 101 Void init ( TDecEntropy* pcEntropyDecoder, 102 #endif 94 103 TDecSbac* pcSbacDecoder, 95 104 TDecBinCABAC* pcBinCABAC, … … 99 108 TComSampleAdaptiveOffset* pcSAO 100 109 ); 110 #if SVC_EXTENSION 111 Void create (UInt layerId); 112 #else 101 113 Void create (); 114 #endif 102 115 Void destroy (); 103 116 Void decompressSlice(TComInputBitstream* pcBitstream, TComPic*& rpcPic ); … … 105 118 106 119 void setDecodedPictureHashSEIEnabled(Int enabled) { m_decodedPictureHashSEIEnabled = enabled; } 120 #if SVC_EXTENSION 121 TDecTop* getLayerDec(UInt LayerId) { return m_ppcTDecTop[LayerId]; } 122 #endif 107 123 108 124 }; -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecSbac.cpp
r51 r54 77 77 , m_cTransformSkipSCModel ( 1, 2, NUM_TRANSFORMSKIP_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 78 78 , m_CUTransquantBypassFlagSCModel( 1, 1, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels) 79 #if INTRA_BL 80 , m_cIntraBLPredFlagSCModel (1, 1, NUM_INTRA_BL_PRED_CTX , m_contextModels + m_numContextModels, m_numContextModels) 81 #endif 79 82 { 80 83 assert( m_numContextModels <= MAX_NUM_CTX_MOD ); … … 135 138 136 139 m_cCUTransSubdivFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); 140 #if INTRA_BL 141 m_cIntraBLPredFlagSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_INTRA_BL_PRED_FLAG ); 142 #endif 137 143 m_cTransformSkipSCModel.initBuffer ( sliceType, qp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); 138 144 m_CUTransquantBypassFlagSCModel.initBuffer( sliceType, qp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG ); … … 179 185 m_cSaoTypeIdxSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX ); 180 186 m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); 187 #if INTRA_BL 188 m_cIntraBLPredFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRA_BL_PRED_FLAG ); 189 #endif 181 190 m_cTransformSkipSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); 182 191 m_CUTransquantBypassFlagSCModel.initBuffer( eSliceType, iQp, (UChar*)INIT_CU_TRANSQUANT_BYPASS_FLAG ); … … 431 440 } 432 441 442 #if INTRA_BL 443 Void TDecSbac::parseIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ) 444 { 445 if( pcCU->getLayerId() == 0 ) 446 { 447 return; 448 } 449 450 UInt uiSymbol = 0; 451 452 UInt uiCtxIntraBL = pcCU->getCtxIntraBLFlag( uiAbsPartIdx ) ; 453 m_pcTDecBinIf->decodeBin( uiSymbol, m_cIntraBLPredFlagSCModel.get( 0, 0, uiCtxIntraBL )); 454 DTRACE_CABAC_VL( g_nSymbolCounter++ ); 455 DTRACE_CABAC_T( "\tIntrBLFlag" ); 456 DTRACE_CABAC_T( "\tuiSymbol: "); 457 DTRACE_CABAC_V( uiSymbol ); 458 DTRACE_CABAC_T( "\n"); 459 460 if ( uiSymbol ) 461 { 462 pcCU->setPartSizeSubParts( SIZE_2Nx2N, uiAbsPartIdx, uiDepth ); 463 pcCU->setPredModeSubParts( MODE_INTRA_BL, uiAbsPartIdx, uiDepth ); 464 pcCU->setTrIdxSubParts( 0, uiAbsPartIdx, uiDepth ); 465 pcCU->setLumaIntraDirSubParts ( DC_IDX, uiAbsPartIdx, uiDepth ); 466 } 467 } 468 #endif 469 433 470 /** parse merge flag 434 471 * \param pcCU … … 521 558 PartSize eMode; 522 559 560 #if INTRA_BL 561 if ( pcCU->isIntraBL( uiAbsPartIdx ) ) 562 { 563 assert( 0 ); 564 } 565 #endif 523 566 if ( pcCU->isIntra( uiAbsPartIdx ) ) 524 567 { -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecSbac.h
r51 r54 131 131 Void parseScalingList ( TComScalingList* /*scalingList*/ ) {} 132 132 133 #if INTRA_BL 134 Void parseIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiPartIdx, UInt uiDepth ); 135 #endif 133 136 private: 134 137 UInt m_uiLastDQpNonZero; … … 167 170 ContextModel3DBuffer m_cTransformSkipSCModel; 168 171 ContextModel3DBuffer m_CUTransquantBypassFlagSCModel; 172 #if INTRA_BL 173 ContextModel3DBuffer m_cIntraBLPredFlagSCModel; 174 #endif 169 175 }; 170 176 -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecSlice.cpp
r51 r54 100 100 } 101 101 102 Void TDecSlice::init(TDecEntropy* pcEntropyDecoder, TDecCu* pcCuDecoder) 102 #if SVC_EXTENSION 103 Void TDecSlice::init(TDecTop** ppcDecTop,TDecEntropy* pcEntropyDecoder, TDecCu* pcCuDecoder) 103 104 { 104 105 m_pcEntropyDecoder = pcEntropyDecoder; 105 106 m_pcCuDecoder = pcCuDecoder; 106 } 107 m_ppcTDecTop = ppcDecTop; 108 } 109 #else 110 Void TDecSlice::init(TDecEntropy* pcEntropyDecoder, TDecCu* pcCuDecoder) 111 { 112 m_pcEntropyDecoder = pcEntropyDecoder; 113 m_pcCuDecoder = pcCuDecoder; 114 } 115 #endif 107 116 108 117 Void TDecSlice::decompressSlice(TComInputBitstream** ppcSubstreams, TComPic*& rpcPic, TDecSbac* pcSbacDecoder, TDecSbac* pcSbacDecoders) … … 184 193 UInt uiTileLCUX; 185 194 Int iNumSubstreamsPerTile = 1; // if independent. 195 #if INTRA_BL 196 m_pcCuDecoder->setBaseRecPic( rpcPic->getLayerId() > 0 ? rpcPic->getFullPelBaseRec() : NULL); 197 #endif 186 198 Bool depSliceSegmentsEnabled = rpcPic->getSlice(rpcPic->getCurrSliceIdx())->getPPS()->getDependentSliceSegmentsEnabledFlag(); 187 199 uiTileStartLCU = rpcPic->getPicSym()->getTComTile(rpcPic->getPicSym()->getTileIdxMap(iStartCUAddr))->getFirstCUAddr(); -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecSlice.h
r51 r54 72 72 TDecBinCABAC* m_pcBufferLowLatBinCABACs; 73 73 std::vector<TDecSbac*> CTXMem; 74 #if SVC_EXTENSION 75 TDecTop** m_ppcTDecTop; 76 #endif 74 77 75 78 public: … … 77 80 virtual ~TDecSlice(); 78 81 82 #if SVC_EXTENSION 83 Void init ( TDecTop** ppcDecTop, TDecEntropy* pcEntropyDecoder, TDecCu* pcMbDecoder ); 84 #else 79 85 Void init ( TDecEntropy* pcEntropyDecoder, TDecCu* pcMbDecoder ); 86 #endif 80 87 Void create (); 81 88 Void destroy (); … … 84 91 Void initCtxMem( UInt i ); 85 92 Void setCtxMem( TDecSbac* sb, Int b ) { CTXMem[b] = sb; } 93 #if SVC_EXTENSION 94 TDecTop* getLayerDec ( UInt LayerId ) { return m_ppcTDecTop[LayerId]; } 95 #endif 86 96 }; 87 97 -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecTop.cpp
r51 r54 39 39 #include "TDecTop.h" 40 40 41 #if SVC_EXTENSION 42 ParameterSetManagerDecoder TDecTop::m_parameterSetManagerDecoder; // storage for parameter sets 43 UInt TDecTop::m_prevPOC = MAX_UINT; 44 UInt TDecTop::m_uiPrevLayerId = MAX_UINT; 45 Bool TDecTop::m_bFirstSliceInSequence = true; 46 #endif 47 41 48 //! \ingroup TLibDecoder 42 49 //! \{ … … 54 61 m_prevRAPisBLA = false; 55 62 m_pocRandomAccess = MAX_INT; 63 #if !SVC_EXTENSION 56 64 m_prevPOC = MAX_INT; 65 #endif 57 66 m_bFirstSliceInPicture = true; 67 #if !SVC_EXTENSION 58 68 m_bFirstSliceInSequence = true; 69 #endif 70 #if SVC_EXTENSION 71 m_layerId = 0; 72 #if AVC_BASE 73 m_pBLReconFile = NULL; 74 #endif 75 #endif 76 #if REF_IDX_FRAMEWORK 77 memset(m_cIlpPic, 0, sizeof(m_cIlpPic)); 78 #endif 79 #if AVC_SYNTAX || SYNTAX_OUTPUT 80 m_pBLSyntaxFile = NULL; 81 #endif 82 59 83 } 60 84 … … 68 92 Void TDecTop::create() 69 93 { 94 #if SVC_EXTENSION 95 m_cGopDecoder.create( m_layerId ); 96 #else 70 97 m_cGopDecoder.create(); 98 #endif 71 99 m_apcSlicePilot = new TComSlice; 72 100 m_uiSliceIdx = 0; … … 81 109 82 110 m_cSliceDecoder.destroy(); 111 #if REF_IDX_FRAMEWORK 112 for(Int i=0; i<MAX_NUM_REF; i++) 113 { 114 if(m_cIlpPic[i]) 115 { 116 //m_cIlpPic[i]->setPicYuvRec(NULL); 117 m_cIlpPic[i]->destroy(); 118 delete m_cIlpPic[i]; 119 m_cIlpPic[i] = NULL; 120 } 121 } 122 #endif 83 123 } 84 124 85 125 Void TDecTop::init() 86 126 { 127 #if !SVC_EXTENSION 87 128 // initialize ROM 88 129 initROM(); 130 #endif 131 #if SVC_EXTENSION 132 m_cGopDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO); 133 m_cSliceDecoder.init( m_ppcTDecTop, &m_cEntropyDecoder, &m_cCuDecoder ); 134 #else 89 135 m_cGopDecoder.init( &m_cEntropyDecoder, &m_cSbacDecoder, &m_cBinCABAC, &m_cCavlcDecoder, &m_cSliceDecoder, &m_cLoopFilter, &m_cSAO); 90 136 m_cSliceDecoder.init( &m_cEntropyDecoder, &m_cCuDecoder ); 137 #endif 91 138 m_cEntropyDecoder.init(&m_cPrediction); 92 139 } 140 141 #if REF_IDX_FRAMEWORK 142 Void TDecTop::xInitILRP(TComSPS *pcSPS) 143 { 144 if(m_layerId>0) 145 { 146 if (m_cIlpPic[0] == NULL) 147 { 148 for (Int j=0; j<1/*MAX_NUM_REF*/; j++) 149 { 150 m_cIlpPic[j] = new TComPic; 151 //m_cIlpPic[j]->createWithOutYuv(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true); 152 #if SVC_UPSAMPLING 153 m_cIlpPic[j]->create(pcSPS->getPicWidthInLumaSamples(), pcSPS->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, pcSPS, true); 154 #else 155 m_cIlpPic[j]->create(pcSPS->getPicWidthInLumaSamples(), pcSPS->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, true); 156 #endif 157 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || REF_IDX_MFM 158 m_cIlpPic[j]->setIsILR(true); 159 #endif 160 for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++) 161 { 162 m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i); 163 } 164 } 165 } 166 } 167 } 168 169 Void TDecTop::setILRPic(TComPic *pcPic) 170 { 171 if(m_cIlpPic[0]) 172 { 173 //m_cIlpPic[0]->setPicYuvRec(pcPic->getFullPelBaseRec()); 174 m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec()); 175 m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC()); 176 m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false); 177 m_cIlpPic[0]->getPicYuvRec()->extendPicBorder(); 178 } 179 } 180 #endif 93 181 94 182 Void TDecTop::deletePicBuffer ( ) … … 100 188 { 101 189 TComPic* pcPic = *(iterPic++); 190 #if SVC_EXTENSION 191 if( pcPic ) 192 { 193 pcPic->destroy(); 194 195 delete pcPic; 196 pcPic = NULL; 197 } 198 #else 102 199 pcPic->destroy(); 103 200 104 201 delete pcPic; 105 202 pcPic = NULL; 203 #endif 106 204 } 107 205 … … 110 208 m_cLoopFilter. destroy(); 111 209 210 #if !SVC_EXTENSION 112 211 // destroy ROM 113 212 destroyROM(); 213 #endif 114 214 } 115 215 … … 129 229 { 130 230 rpcPic = new TComPic(); 231 232 #if SVC_EXTENSION //Temporal solution, should be modified 233 if(m_layerId > 0) 234 { 235 TDecTop *pcTDecTopBase = (TDecTop *)getLayerDec( m_layerId-1 ); 236 //TComPic* pcPic = *(pcTDecTopBase->getListPic()->begin()); 237 TComPicYuv* pcPicYuvRecBase = (*(pcTDecTopBase->getListPic()->begin()))->getPicYuvRec(); 238 if(pcPicYuvRecBase->getWidth() != pcSlice->getSPS()->getPicWidthInLumaSamples() || pcPicYuvRecBase->getHeight() != pcSlice->getSPS()->getPicHeightInLumaSamples() ) 239 { 240 rpcPic->setSpatialEnhLayerFlag( true ); 241 } 242 } 243 #endif 131 244 245 #if SVC_UPSAMPLING 246 rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 247 conformanceWindow, defaultDisplayWindow, numReorderPics, pcSlice->getSPS(), true); 248 #else 132 249 rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 133 250 conformanceWindow, defaultDisplayWindow, numReorderPics, true); 251 #endif 134 252 rpcPic->getPicSym()->allocSaoParam(&m_cSAO); 135 253 m_cListPic.pushBack( rpcPic ); … … 152 270 if ( rpcPic->getSlice( 0 )->isReferenced() == false && rpcPic->getOutputMark() == false) 153 271 { 272 #if !SVC_EXTENSION 154 273 rpcPic->setOutputMark(false); 274 #endif 155 275 rpcPic->setReconMark( false ); 156 276 rpcPic->getPicYuvRec()->setBorderExtension( false ); … … 168 288 } 169 289 rpcPic->destroy(); 290 291 #if SVC_UPSAMPLING 292 rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 293 conformanceWindow, defaultDisplayWindow, numReorderPics, pcSlice->getSPS(), true); 294 295 #else 170 296 rpcPic->create ( pcSlice->getSPS()->getPicWidthInLumaSamples(), pcSlice->getSPS()->getPicHeightInLumaSamples(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 171 297 conformanceWindow, defaultDisplayWindow, numReorderPics, true); 298 #endif 172 299 rpcPic->getPicSym()->allocSaoParam(&m_cSAO); 173 300 } … … 187 314 m_cGopDecoder.filterPicture(pcPic); 188 315 316 #if SYNTAX_OUTPUT 317 pcPic->wrireBLSyntax( getBLSyntaxFile(), SYNTAX_BYTES ); 318 #endif 189 319 TComSlice::sortPicList( m_cListPic ); // sorting for application output 190 320 poc = pcPic->getSlice(m_uiSliceIdx-1)->getPOC(); … … 202 332 cFillSlice.setSPS( m_parameterSetManagerDecoder.getFirstSPS() ); 203 333 cFillSlice.setPPS( m_parameterSetManagerDecoder.getFirstPPS() ); 334 #if SET_SLICE_LAYER_ID 335 cFillSlice.initSlice( m_parameterSetManagerDecoder.getFirstSPS()->getLayerId() ); 336 #else 204 337 cFillSlice.initSlice(); 338 #endif 205 339 TComPic *cFillPic; 206 340 xGetNewPicBuffer(&cFillSlice,cFillPic); 207 341 cFillPic->getSlice(0)->setSPS( m_parameterSetManagerDecoder.getFirstSPS() ); 208 342 cFillPic->getSlice(0)->setPPS( m_parameterSetManagerDecoder.getFirstPPS() ); 343 #if SET_SLICE_LAYER_ID 344 cFillPic->getSlice(0)->initSlice( cFillPic->getLayerId() ); 345 #else 209 346 cFillPic->getSlice(0)->initSlice(); 347 #endif 210 348 211 349 TComList<TComPic*>::iterator iterPic = m_cListPic.begin(); … … 256 394 assert (sps != 0); 257 395 396 #if SVC_EXTENSION 397 if (false == m_parameterSetManagerDecoder.activatePPS(m_apcSlicePilot->getPPSId(), m_apcSlicePilot->getIdrPicFlag(), m_apcSlicePilot->getLayerId() )) 398 #else 258 399 if (false == m_parameterSetManagerDecoder.activatePPS(m_apcSlicePilot->getPPSId(),m_apcSlicePilot->getIdrPicFlag())) 400 #endif 259 401 { 260 402 printf ("Parameter set activation failed!"); … … 283 425 } 284 426 427 #if SVC_EXTENSION 428 Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC ) 429 #else 285 430 Bool TDecTop::xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay ) 431 #endif 286 432 { 287 433 TComPic*& pcPic = m_pcPic; 434 #if SET_SLICE_LAYER_ID 435 m_apcSlicePilot->initSlice( nalu.m_layerId ); 436 #else 288 437 m_apcSlicePilot->initSlice(); 438 #endif 289 439 290 440 if (m_bFirstSliceInPicture) … … 324 474 325 475 // exit when a new picture is found 476 #if SVC_EXTENSION 477 bNewPOC = (m_apcSlicePilot->getPOC()!= m_prevPOC); 478 if (m_apcSlicePilot->isNextSlice() && (bNewPOC || m_layerId!=m_uiPrevLayerId) && !m_bFirstSliceInSequence ) 479 { 480 m_prevPOC = m_apcSlicePilot->getPOC(); 481 curLayerId = m_uiPrevLayerId; 482 m_uiPrevLayerId = m_layerId; 483 return true; 484 } 485 #else 326 486 if (m_apcSlicePilot->isNextSlice() && m_apcSlicePilot->getPOC()!=m_prevPOC && !m_bFirstSliceInSequence) 327 487 { … … 333 493 m_prevPOC = m_apcSlicePilot->getPOC(); 334 494 } 495 #endif 335 496 // actual decoding starts here 336 497 xActivateParameterSets(); … … 339 500 { 340 501 m_prevPOC = m_apcSlicePilot->getPOC(); 502 #if SVC_EXTENSION 503 curLayerId = m_layerId; 504 m_uiPrevLayerId = m_layerId; 505 #endif 341 506 } 342 507 m_bFirstSliceInSequence = false; … … 349 514 if (m_bFirstSliceInPicture) 350 515 { 516 #if AVC_BASE 517 if( m_layerId == 1 ) 518 { 519 TComPic* pBLPic = (*m_ppcTDecTop[0]->getListPic()->begin()); 520 fstream* pFile = m_ppcTDecTop[0]->getBLReconFile(); 521 UInt uiWidth = pBLPic->getPicYuvRec()->getWidth() - pBLPic->getPicYuvRec()->getPicCropLeftOffset() - pBLPic->getPicYuvRec()->getPicCropRightOffset();; 522 UInt uiHeight = pBLPic->getPicYuvRec()->getHeight() - pBLPic->getPicYuvRec()->getPicCropTopOffset() - pBLPic->getPicYuvRec()->getPicCropBottomOffset(); 523 524 if( pFile->good() ) 525 { 526 UInt64 uiPos = (UInt64) m_apcSlicePilot->getPOC() * uiWidth * uiHeight * 3 / 2; 527 528 pFile->seekg((UInt)uiPos, ios::beg ); 529 530 Pel* pPel = pBLPic->getPicYuvRec()->getLumaAddr(); 531 UInt uiStride = pBLPic->getPicYuvRec()->getStride(); 532 for( Int i = 0; i < uiHeight; i++ ) 533 { 534 for( Int j = 0; j < uiWidth; j++ ) 535 { 536 pPel[j] = pFile->get(); 537 } 538 pPel += uiStride; 539 } 540 541 pPel = pBLPic->getPicYuvRec()->getCbAddr(); 542 uiStride = pBLPic->getPicYuvRec()->getCStride(); 543 for( Int i = 0; i < uiHeight/2; i++ ) 544 { 545 for( Int j = 0; j < uiWidth/2; j++ ) 546 { 547 pPel[j] = pFile->get(); 548 } 549 pPel += uiStride; 550 } 551 552 pPel = pBLPic->getPicYuvRec()->getCrAddr(); 553 uiStride = pBLPic->getPicYuvRec()->getCStride(); 554 for( Int i = 0; i < uiHeight/2; i++ ) 555 { 556 for( Int j = 0; j < uiWidth/2; j++ ) 557 { 558 pPel[j] = pFile->get(); 559 } 560 pPel += uiStride; 561 } 562 } 563 } 564 #endif 565 351 566 // Buffer initialize for prediction. 352 567 m_cPrediction.initTempBuff(); … … 361 576 // Recursive structure 362 577 m_cCuDecoder.create ( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight ); 578 #if SVC_EXTENSION 579 m_cCuDecoder.init ( m_ppcTDecTop,&m_cEntropyDecoder, &m_cTrQuant, &m_cPrediction, curLayerId ); 580 #else 363 581 m_cCuDecoder.init ( &m_cEntropyDecoder, &m_cTrQuant, &m_cPrediction ); 582 #endif 364 583 m_cTrQuant.init ( g_uiMaxCUWidth, g_uiMaxCUHeight, m_apcSlicePilot->getSPS()->getMaxTrSize()); 365 584 … … 483 702 pcPic->setTLayer(nalu.m_temporalId); 484 703 704 #if SVC_EXTENSION 705 pcPic->setLayerId(nalu.m_layerId); 706 pcSlice->setLayerId(nalu.m_layerId); 707 #endif 708 485 709 if (bNextSlice) 486 710 { 487 711 pcSlice->checkCRA(pcSlice->getRPS(), m_pocCRA, m_prevRAPisBLA ); 712 #if !REF_IDX_FRAMEWORK || AVC_SYNTAX 488 713 // Set reference list 489 714 pcSlice->setRefPicList( m_cListPic ); 715 #endif 716 717 #if SVC_EXTENSION 718 if(m_layerId > 0) 719 { 720 #if AVC_BASE 721 pcSlice->setBaseColPic ( *m_ppcTDecTop[0]->getListPic()->begin() ); 722 #if AVC_SYNTAX 723 TComPic* pBLPic = pcSlice->getBaseColPic(); 724 if( pcSlice->getPOC() == 0 ) 725 { 726 // initialize partition order. 727 UInt* piTmp = &g_auiZscanToRaster[0]; 728 initZscanToRaster( pBLPic->getPicSym()->getMaxDepth() + 1, 1, 0, piTmp ); 729 initRasterToZscan( pBLPic->getPicSym()->getMaxCUWidth(), pBLPic->getPicSym()->getMaxCUHeight(), pBLPic->getPicSym()->getMaxDepth() + 1 ); 730 } 731 pBLPic->getSlice( 0 )->initBaseLayerRPL( pcSlice ); 732 pBLPic->readBLSyntax( m_ppcTDecTop[0]->getBLSyntaxFile(), SYNTAX_BYTES ); 733 #endif 734 735 #else 736 TDecTop *pcTDecTop = (TDecTop *)getLayerDec( m_layerId-1 ); 737 TComList<TComPic*> *cListPic = pcTDecTop->getListPic(); 738 pcSlice->setBaseColPic ( *cListPic, m_layerId ); 739 #endif 740 #if SVC_UPSAMPLING 741 if ( pcPic->isSpatialEnhLayer()) 742 { 743 m_cPrediction.upsampleBasePic( pcPic->getFullPelBaseRec(), pcSlice->getBaseColPic()->getPicYuvRec(), pcPic->getPicYuvRec() ); 744 } 745 else 746 { 747 pcPic->setFullPelBaseRec( pcSlice->getBaseColPic()->getPicYuvRec() ); 748 } 749 pcSlice->setFullPelBaseRec ( pcPic->getFullPelBaseRec() ); 750 #endif 751 } 752 #endif 753 754 #if REF_IDX_FRAMEWORK 755 #if !AVC_SYNTAX 756 // Set reference list 757 pcSlice->setRefPicList( m_cListPic ); 758 #endif 759 if(m_layerId > 0) 760 { 761 setILRPic(pcPic); 762 #if REF_IDX_MFM 763 pcSlice->setRefPOCListILP(m_ppcTDecTop[m_layerId]->m_cIlpPic, pcSlice->getBaseColPic()); 764 #endif 765 766 pcSlice->addRefPicList ( m_cIlpPic, 767 1, 768 ((pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA) && 769 (pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA)) ? 0: -1); 770 } 771 #endif 490 772 491 773 // For generalized B … … 590 872 { 591 873 TComSPS* sps = new TComSPS(); 874 #if SVC_EXTENSION 875 sps->setLayerId(m_layerId); 876 #endif 592 877 m_cEntropyDecoder.decodeSPS( sps ); 593 878 m_parameterSetManagerDecoder.storePrefetchedSPS(sps); 879 #if REF_IDX_MFM 880 m_pcSPS = sps; 881 setMFMEnabledFlag(sps->getMFMEnabledFlag()); 882 #endif 883 #if REF_IDX_FRAMEWORK 884 if(m_numLayer>0) 885 { 886 xInitILRP(sps); 887 } 888 #endif 594 889 } 595 890 … … 637 932 } 638 933 934 #if SVC_EXTENSION 935 Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC) 936 #else 639 937 Bool TDecTop::decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay) 938 #endif 640 939 { 641 940 // Initialize entropy decoder … … 651 950 case NAL_UNIT_SPS: 652 951 xDecodeSPS(); 952 #if AVC_BASE 953 { 954 TComPic* pBLPic = (*m_ppcTDecTop[0]->getListPic()->begin()); 955 if( nalu.m_layerId == 1 && pBLPic->getPicYuvRec() == NULL ) 956 { 957 #if SVC_UPSAMPLING 958 #if AVC_SYNTAX 959 TComSPS* sps = new TComSPS(); 960 pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, sps, true); 961 #else 962 pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, NULL, true); 963 #endif 964 #else 965 pBLPic->create( m_ppcTDecTop[0]->getBLWidth(), m_ppcTDecTop[0]->getBLHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, true); 966 #endif 967 } 968 } 969 #endif 653 970 return false; 654 971 … … 678 995 case NAL_UNIT_CODED_SLICE_RASL_N: 679 996 case NAL_UNIT_CODED_SLICE_TFD: 997 #if SVC_EXTENSION 998 return xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay, curLayerId, bNewPOC); 999 #else 680 1000 return xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay); 1001 #endif 681 1002 break; 682 1003 default: -
branches/HM-10.0-dev-SHM/source/Lib/TLibDecoder/TDecTop.h
r51 r54 72 72 73 73 TComList<TComPic*> m_cListPic; // Dynamic buffer 74 #if SVC_EXTENSION 75 static ParameterSetManagerDecoder m_parameterSetManagerDecoder; // storage for parameter sets 76 #else 74 77 ParameterSetManagerDecoder m_parameterSetManagerDecoder; // storage for parameter sets 78 #endif 79 80 #if REF_IDX_MFM 81 TComSPS* m_pcSPS; 82 Bool m_bMFMEnabledFlag; 83 #endif 84 75 85 TComSlice* m_apcSlicePilot; 76 86 … … 95 105 TComPic* m_pcPic; 96 106 UInt m_uiSliceIdx; 107 #if !SVC_EXTENSION 97 108 Int m_prevPOC; 109 #endif 98 110 Bool m_bFirstSliceInPicture; 111 #if !SVC_EXTENSION 99 112 Bool m_bFirstSliceInSequence; 113 #endif 114 115 #if SVC_EXTENSION 116 static UInt m_prevPOC; // POC of the previous slice 117 static UInt m_uiPrevLayerId; // LayerId of the previous slice 118 static Bool m_bFirstSliceInSequence; 119 UInt m_layerId; 120 UInt m_numLayer; 121 TDecTop** m_ppcTDecTop; 122 #if AVC_BASE 123 fstream* m_pBLReconFile; 124 Int m_iBLSourceWidth; 125 Int m_iBLSourceHeight; 126 #endif 127 #endif 128 #if AVC_SYNTAX || SYNTAX_OUTPUT 129 fstream* m_pBLSyntaxFile; 130 #endif 131 #if REF_IDX_FRAMEWORK 132 TComPic* m_cIlpPic[MAX_NUM_REF]; ///< Inter layer Prediction picture = upsampled picture 133 #endif 100 134 101 135 public: … … 109 143 110 144 Void init(); 145 #if SVC_EXTENSION 146 Bool decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC); 147 #else 111 148 Bool decode(InputNALUnit& nalu, Int& iSkipFrame, Int& iPOCLastDisplay); 149 #endif 112 150 113 151 Void deletePicBuffer(); 114 152 115 153 Void executeLoopFilters(Int& poc, TComList<TComPic*>*& rpcListPic); 154 155 #if SVC_EXTENSION 156 UInt getLayerId () { return m_layerId; } 157 Void setLayerId (UInt layer) { m_layerId = layer; } 158 UInt getNumLayer () { return m_numLayer; } 159 Void setNumLayer (UInt uiNum) { m_numLayer = uiNum; } 160 TComList<TComPic*>* getListPic() { return &m_cListPic; } 161 Void setLayerDec(TDecTop **p) { m_ppcTDecTop = p; } 162 TDecTop* getLayerDec(UInt layer) { return m_ppcTDecTop[layer]; } 163 #if AVC_BASE 164 Void setBLReconFile( fstream* pFile ) { m_pBLReconFile = pFile; } 165 fstream* getBLReconFile() { return m_pBLReconFile; } 166 Void setBLsize( Int iWidth, Int iHeight ) { m_iBLSourceWidth = iWidth; m_iBLSourceHeight = iHeight; } 167 Int getBLWidth() { return m_iBLSourceWidth; } 168 Int getBLHeight() { return m_iBLSourceHeight; } 169 #endif 170 #endif 171 #if AVC_SYNTAX || SYNTAX_OUTPUT 172 Void setBLSyntaxFile( fstream* pFile ) { m_pBLSyntaxFile = pFile; } 173 fstream* getBLSyntaxFile() { return m_pBLSyntaxFile; } 174 #endif 175 #if REF_IDX_FRAMEWORK 176 Void xInitILRP(TComSPS *pcSPS); 177 Void setILRPic(TComPic *pcPic); 178 #endif 179 #if REF_IDX_MFM 180 TComSPS* getSPS() {return m_pcSPS;} 181 Void setMFMEnabledFlag(Bool flag) {m_bMFMEnabledFlag = flag;} 182 Bool getMFMEnabledFlag() {return m_bMFMEnabledFlag;} 183 #endif 116 184 117 185 protected: … … 120 188 121 189 Void xActivateParameterSets(); 190 #if SVC_EXTENSION 191 Bool xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay, UInt& curLayerId, Bool& bNewPOC); 192 #else 122 193 Bool xDecodeSlice(InputNALUnit &nalu, Int &iSkipFrame, Int iPOCLastDisplay); 194 #endif 123 195 Void xDecodeVPS(); 124 196 Void xDecodeSPS(); -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/NALwrite.cpp
r51 r54 53 53 bsNALUHeader.write(0,1); // forbidden_zero_bit 54 54 bsNALUHeader.write(nalu.m_nalUnitType, 6); // nal_unit_type 55 #if SVC_EXTENSION 56 bsNALUHeader.write(nalu.m_layerId, 6); // reserved_one_5bits 57 #else 55 58 bsNALUHeader.write(nalu.m_reservedZero6Bits, 6); // nuh_reserved_zero_6bits 59 #endif 56 60 bsNALUHeader.write(nalu.m_temporalId+1, 3); // nuh_temporal_id_plus1 57 61 … … 145 149 naluDest.m_temporalId = naluSrc.m_temporalId; 146 150 naluDest.m_Bitstream = naluSrc.m_Bitstream; 151 #if SVC_EXTENSION 152 naluDest.m_layerId = naluSrc.m_layerId; 153 #endif 147 154 } 148 155 -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/NALwrite.h
r51 r54 57 57 NalUnitType nalUnitType, 58 58 UInt temporalID = 0, 59 #if SVC_EXTENSION 60 UInt layerId = 0, 61 #endif 59 62 UInt reserved_zero_6bits = 0) 63 #if SVC_EXTENSION 64 : NALUnit(nalUnitType, temporalID, layerId, reserved_zero_6bits) 65 #else 60 66 : NALUnit(nalUnitType, temporalID, reserved_zero_6bits) 67 #endif 61 68 , m_Bitstream() 62 69 {} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncAnalyze.cpp
r51 r54 45 45 ////////////////////////////////////////////////////////////////////// 46 46 47 #if SVC_EXTENSION 48 TEncAnalyze m_gcAnalyzeAll [MAX_LAYERS]; 49 TEncAnalyze m_gcAnalyzeI [MAX_LAYERS]; 50 TEncAnalyze m_gcAnalyzeP [MAX_LAYERS]; 51 TEncAnalyze m_gcAnalyzeB [MAX_LAYERS]; 52 #else 47 53 TEncAnalyze m_gcAnalyzeAll; 48 54 TEncAnalyze m_gcAnalyzeI; 49 55 TEncAnalyze m_gcAnalyzeP; 50 56 TEncAnalyze m_gcAnalyzeB; 57 #endif 51 58 52 59 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncAnalyze.h
r51 r54 88 88 Void setFrmRate (Double dFrameRate) { m_dFrmRate = dFrameRate; } //--CFG_KDY 89 89 Void clear() { m_dPSNRSumY = m_dPSNRSumU = m_dPSNRSumV = m_dAddBits = m_uiNumPic = 0; } 90 #if SVC_EXTENSION 91 Void printOut ( Char cDelim, UInt layer ) 92 { 93 Double dFps = m_dFrmRate; //--CFG_KDY 94 Double dScale = dFps / 1000 / (Double)m_uiNumPic; 95 96 printf( " L%d\t %8d %c" "%12.4lf " "%8.4lf " "%8.4lf " "%8.4lf\n", 97 layer, 98 getNumPic(), cDelim, 99 getBits() * dScale, 100 getPsnrY() / (Double)getNumPic(), 101 getPsnrU() / (Double)getNumPic(), 102 getPsnrV() / (Double)getNumPic() ); 103 } 104 #else 90 105 Void printOut ( Char cDelim ) 91 106 { … … 102 117 getPsnrV() / (Double)getNumPic() ); 103 118 } 119 #endif 104 120 105 121 Void printSummaryOut () … … 150 166 }; 151 167 168 #if SVC_EXTENSION 169 extern TEncAnalyze m_gcAnalyzeAll [MAX_LAYERS]; 170 extern TEncAnalyze m_gcAnalyzeI [MAX_LAYERS]; 171 extern TEncAnalyze m_gcAnalyzeP [MAX_LAYERS]; 172 extern TEncAnalyze m_gcAnalyzeB [MAX_LAYERS]; 173 #else 152 174 extern TEncAnalyze m_gcAnalyzeAll; 153 175 extern TEncAnalyze m_gcAnalyzeI; 154 176 extern TEncAnalyze m_gcAnalyzeP; 155 177 extern TEncAnalyze m_gcAnalyzeB; 178 #endif 156 179 157 180 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.cpp
r51 r54 545 545 } 546 546 WRITE_FLAG( pcSPS->getTMVPFlagsPresent() ? 1 : 0, "sps_temporal_mvp_enable_flag" ); 547 547 #if REF_IDX_MFM 548 if( pcSPS->getLayerId() > 0 ) 549 { 550 assert(pcSPS->getMFMEnabledFlag()); 551 WRITE_FLAG( pcSPS->getMFMEnabledFlag() ? 1 : 0, "sps_enh_mfm_enable_flag" ); 552 } 553 #endif 548 554 WRITE_FLAG( pcSPS->getUseStrongIntraSmoothing(), "sps_strong_intra_smoothing_enable_flag" ); 549 555 … … 1549 1555 return true; 1550 1556 } 1557 1558 #if INTRA_BL 1559 Void TEncCavlc::codeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx ) 1560 { 1561 assert(0); 1562 } 1563 1564 #endif 1551 1565 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCavlc.h
r51 r54 114 114 Void codeMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx ); 115 115 Void codeMergeIndex ( TComDataCU* pcCU, UInt uiAbsPartIdx ); 116 #if INTRA_BL 117 Void codeIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx ); 118 #endif 116 119 117 120 Void codeInterModeFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, UInt uiEncMode ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCfg.h
r51 r54 298 298 299 299 Bool m_useStrongIntraSmoothing; ///< enable the use of strong intra smoothing (bi_linear interpolation) for 32x32 blocks when reference samples are flat. 300 #if SVC_EXTENSION 301 UInt m_layerId; 302 UInt m_numLayer; 303 #endif 304 #if REF_IDX_FRAMEWORK 305 Int m_elRapSliceBEnabled; 306 #endif 300 307 301 308 public: … … 692 699 Void setFrameOnlyConstraintFlag(Bool b) { m_frameOnlyConstraintFlag = b; } 693 700 #endif 701 702 #if SVC_EXTENSION 703 UInt getLayerId () { return m_layerId; } 704 Void setLayerId (UInt layer) { m_layerId = layer; } 705 UInt getNumLayer () { return m_numLayer; } 706 Void setNumLayer (UInt uiNum) { m_numLayer = uiNum; } 707 Void setConformanceMode (Int mode) { m_conformanceMode = mode; } 708 Void setConformanceWindow(Window& conformanceWindow ) { m_conformanceWindow = conformanceWindow; } 709 #endif 710 #if REF_IDX_FRAMEWORK 711 Void setElRapSliceTypeB(Int bEnabled) {m_elRapSliceBEnabled = bEnabled;} 712 Int getElRapSliceTypeB() {return m_elRapSliceBEnabled;} 713 #endif 694 714 }; 695 715 -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCu.cpp
r51 r54 211 211 m_pcRdCost = pcEncTop->getRdCost(); 212 212 213 #if SVC_EXTENSION 214 m_ppcTEncTop = pcEncTop->getLayerEnc(); 215 for(UInt i=0 ; i< m_uhTotalDepth-1 ; i++) 216 { 217 m_ppcBestCU[i]->setLayerId(pcEncTop->getLayerId()); 218 m_ppcTempCU[i]->setLayerId(pcEncTop->getLayerId()); 219 } 220 #endif 221 213 222 m_pcEntropyCoder = pcEncTop->getEntropyCoder(); 214 223 m_pcCavlcCoder = pcEncTop->getCavlcCoder(); … … 445 454 if(!bSliceEnd && !bSliceStart && bInsidePicture ) 446 455 { 456 #if (ENCODER_FAST_MODE) 457 bool testInter = true; 458 if (rpcBestCU->getLayerId() > 0) 459 { 460 if (rpcBestCU->getSlice()->getBaseColPic()->getSlice(0)->getSliceType() == I_SLICE) 461 { 462 testInter = false; 463 } 464 465 } 466 #endif 447 467 for (Int iQP=iMinQP; iQP<=iMaxQP; iQP++) 448 468 { … … 459 479 460 480 // do inter modes, SKIP and 2Nx2N 481 #if (ENCODER_FAST_MODE == 1) 482 if( rpcBestCU->getSlice()->getSliceType() != I_SLICE && testInter ) 483 #else 461 484 if( rpcBestCU->getSlice()->getSliceType() != I_SLICE ) 485 #endif 462 486 { 463 487 // 2Nx2N … … 480 504 } 481 505 } 506 #if (ENCODER_FAST_MODE == 2) 507 if (testInter) 508 { 509 #endif 482 510 483 511 if(!m_pcEncCfg->getUseEarlySkipDetection()) … … 493 521 } 494 522 } 523 #if (ENCODER_FAST_MODE == 2) 524 } 525 #endif 526 495 527 } 496 528 … … 531 563 532 564 // do inter modes, NxN, 2NxN, and Nx2N 565 #if (ENCODER_FAST_MODE) 566 if( rpcBestCU->getSlice()->getSliceType() != I_SLICE && testInter ) 567 #else 533 568 if( rpcBestCU->getSlice()->getSliceType() != I_SLICE ) 569 #endif 534 570 { 535 571 // 2Nx2N, NxN … … 685 721 { 686 722 // speedup for inter frames 723 #if (ENCODER_FAST_MODE) 724 if( rpcBestCU->getSlice()->getSliceType() == I_SLICE || 725 !testInter || 726 rpcBestCU->getCbf( 0, TEXT_LUMA ) != 0 || 727 rpcBestCU->getCbf( 0, TEXT_CHROMA_U ) != 0 || 728 rpcBestCU->getCbf( 0, TEXT_CHROMA_V ) != 0 ) // avoid very complex intra if it is unlikely 729 #else 687 730 if( rpcBestCU->getSlice()->getSliceType() == I_SLICE || 688 731 rpcBestCU->getCbf( 0, TEXT_LUMA ) != 0 || 689 732 rpcBestCU->getCbf( 0, TEXT_CHROMA_U ) != 0 || 690 733 rpcBestCU->getCbf( 0, TEXT_CHROMA_V ) != 0 ) // avoid very complex intra if it is unlikely 734 #endif 691 735 { 692 736 xCheckRDCostIntra( rpcBestCU, rpcTempCU, SIZE_2Nx2N ); … … 716 760 } 717 761 } 762 #if INTRA_BL 763 if(m_pcPicYuvRecBase) 764 { 765 xCheckRDCostIntraBL( rpcBestCU, rpcTempCU ); 766 rpcTempCU->initEstData( uiDepth, iQP ); 767 } 768 #endif 769 770 #if (ENCODER_FAST_MODE) 771 if(pcPic->getLayerId() > 0) 772 { 773 xCheckRDCostILRUni( rpcBestCU, rpcTempCU); 774 rpcTempCU->initEstData( uiDepth, iQP ); 775 } 776 #endif 777 718 778 if (isAddLowestQP && (iQP == lowestQP)) 719 779 { … … 1150 1210 return; 1151 1211 } 1212 #if INTRA_BL 1213 m_pcEntropyCoder->encodeIntraBLFlag( pcCU, uiAbsPartIdx ); 1214 if ( !pcCU->isIntraBL( uiAbsPartIdx ) ) 1215 { 1216 #endif 1152 1217 m_pcEntropyCoder->encodePredMode( pcCU, uiAbsPartIdx ); 1153 1218 … … 1168 1233 // prediction Info ( Intra : direction mode, Inter : Mv, reference idx ) 1169 1234 m_pcEntropyCoder->encodePredInfo( pcCU, uiAbsPartIdx ); 1235 #if INTRA_BL 1236 } 1237 #endif 1170 1238 1171 1239 // Encode Coefficients … … 1221 1289 for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand ) 1222 1290 { 1223 { 1291 #if REF_IDX_ME_ZEROMV 1292 Bool bZeroMVILR = rpcTempCU->xCheckZeroMVILRMerge(uhInterDirNeighbours[uiMergeCand], cMvFieldNeighbours[0 + 2*uiMergeCand], cMvFieldNeighbours[1 + 2*uiMergeCand]); 1293 if(bZeroMVILR) 1294 { 1295 #endif 1224 1296 if(!(uiNoResidual==1 && mergeCandBuffer[uiMergeCand]==1)) 1225 1297 { … … 1271 1343 } 1272 1344 } 1345 #if REF_IDX_ME_ZEROMV 1273 1346 } 1347 #endif 1274 1348 } 1275 1349 … … 1377 1451 1378 1452 m_pcEntropyCoder->resetBits(); 1453 #if INTRA_BL 1454 m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0, true ); 1455 #endif 1379 1456 if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) 1380 1457 { … … 1430 1507 1431 1508 m_pcEntropyCoder->resetBits(); 1509 #if INTRA_BL 1510 m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0, true ); 1511 #endif 1432 1512 if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) 1433 1513 { … … 1681 1761 } 1682 1762 #endif 1763 1764 #if INTRA_BL 1765 Void TEncCu::xCheckRDCostIntraBL( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU ) 1766 { 1767 UInt uiDepth = rpcTempCU->getDepth( 0 ); 1768 rpcTempCU->setSkipFlagSubParts( false, 0, uiDepth ); 1769 rpcTempCU->setPartSizeSubParts( SIZE_2Nx2N, 0, uiDepth ); 1770 rpcTempCU->setPredModeSubParts( MODE_INTRA_BL, 0, uiDepth ); 1771 rpcTempCU->setCUTransquantBypassSubParts( m_pcEncCfg->getCUTransquantBypassFlagValue(), 0, uiDepth ); 1772 1773 m_pcPredSearch->setBaseRecPic( m_pcPicYuvRecBase ); 1774 #if NO_RESIDUAL_FLAG_FOR_BLPRED 1775 rpcTempCU->setDepthSubParts( uiDepth, 0 ); 1776 // rpcTempCU->setLumaIntraDirSubParts( DC_IDX, 0, uiDepth ); 1777 // rpcTempCU->setChromIntraDirSubParts( DC_IDX, 0, uiDepth ); 1778 m_ppcPredYuvTemp[uiDepth]->copyFromPicLuma ( rpcTempCU->getSlice()->getFullPelBaseRec(), rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, rpcTempCU->getWidth(0), rpcTempCU->getHeight(0)); 1779 m_ppcPredYuvTemp[uiDepth]->copyFromPicChroma( rpcTempCU->getSlice()->getFullPelBaseRec(), rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, (rpcTempCU->getWidth(0)>>1), (rpcTempCU->getHeight(0)>>1), 0); 1780 m_ppcPredYuvTemp[uiDepth]->copyFromPicChroma( rpcTempCU->getSlice()->getFullPelBaseRec(), rpcTempCU->getAddr(), rpcTempCU->getZorderIdxInCU(), 0, (rpcTempCU->getWidth(0)>>1), (rpcTempCU->getHeight(0)>>1), 1); 1781 m_pcPredSearch->encodeResAndCalcRdInterCU( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcResiYuvBest[uiDepth], m_ppcRecoYuvTemp[uiDepth], false ); 1782 rpcTempCU->getTotalCost() = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() ); 1783 #else 1784 1785 m_pcPredSearch->estIntraBLPredQT( rpcTempCU, m_ppcOrigYuv[uiDepth], m_ppcPredYuvTemp[uiDepth], m_ppcResiYuvTemp[uiDepth], m_ppcRecoYuvTemp[uiDepth] ); 1786 1787 m_pcEntropyCoder->resetBits(); 1788 m_pcEntropyCoder->encodeIntraBLFlag ( rpcTempCU, 0, true ); 1789 m_pcEntropyCoder->encodeSkipFlag( rpcTempCU, 0, true ); 1790 if ( rpcTempCU->getSlice()->getPPS()->getTransquantBypassEnableFlag()) 1791 { 1792 m_pcEntropyCoder->encodeCUTransquantBypassFlag( rpcTempCU, 0, true ); 1793 } 1794 1795 // Encode Coefficients 1796 Bool bCodeDQP = getdQPFlag(); 1797 m_pcEntropyCoder->encodeCoeff( rpcTempCU, 0, uiDepth, rpcTempCU->getWidth (0), rpcTempCU->getHeight(0), bCodeDQP ); 1798 setdQPFlag( bCodeDQP ); 1799 1800 if( m_bUseSBACRD ) m_pcRDGoOnSbacCoder->store(m_pppcRDSbacCoder[uiDepth][CI_TEMP_BEST]); 1801 1802 rpcTempCU->getTotalBits() = m_pcEntropyCoder->getNumberOfWrittenBits(); 1803 if(m_pcEncCfg->getUseSBACRD()) 1804 { 1805 rpcTempCU->getTotalBins() = ((TEncBinCABAC *)((TEncSbac*)m_pcEntropyCoder->m_pcEntropyCoderIf)->getEncBinIf())->getBinsCoded(); 1806 } 1807 rpcTempCU->getTotalCost() = m_pcRdCost->calcRdCost( rpcTempCU->getTotalBits(), rpcTempCU->getTotalDistortion() ); 1808 #endif 1809 1810 xCheckDQP( rpcTempCU ); 1811 xCheckBestMode(rpcBestCU, rpcTempCU, uiDepth); 1812 } 1813 #endif 1814 1815 1816 1817 1683 1818 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncCu.h
r51 r54 84 84 // Access channel 85 85 TEncCfg* m_pcEncCfg; 86 #if INTRA_BL 87 TComPicYuv* m_pcPicYuvRecBase; ///< reconstructed base layer 88 #endif 86 89 TEncSearch* m_pcPredSearch; 87 90 TComTrQuant* m_pcTrQuant; 88 91 TComBitCounter* m_pcBitCounter; 89 92 TComRdCost* m_pcRdCost; 93 94 #if SVC_EXTENSION 95 TEncTop** m_ppcTEncTop; 96 #endif 90 97 91 98 TEncEntropy* m_pcEntropyCoder; … … 124 131 UInt getLCUPredictionSAD() { return m_LCUPredictionSAD; } 125 132 #endif 133 #if INTRA_BL 134 Void setBaseRecPic ( TComPicYuv* p ) { m_pcPicYuvRecBase = p; } 135 #endif 126 136 protected: 127 137 Void finishCU ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ); … … 144 154 #endif 145 155 Void xCheckRDCostIntra ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU, PartSize ePartSize ); 156 #if INTRA_BL 157 Void xCheckRDCostIntraBL ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU ); 158 #endif 159 #if ENCODER_FAST_MODE 160 Void xCheckRDCostILRUni ( TComDataCU*& rpcBestCU, TComDataCU*& rpcTempCU ); 161 #endif 146 162 Void xCheckDQP ( TComDataCU* pcCU ); 147 163 … … 168 184 #endif 169 185 186 #if SVC_EXTENSION 187 TEncTop* getLayerEnc(UInt LayerId) {return m_ppcTEncTop[LayerId]; } 188 #endif 189 170 190 Void xFillPCMBuffer ( TComDataCU*& pCU, TComYuv* pOrgYuv ); 171 191 }; -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncEntropy.cpp
r51 r54 166 166 } 167 167 168 #if INTRA_BL 169 if( pcCU->isIntraBL( uiAbsPartIdx ) ) 170 { 171 return; 172 } 173 #endif 174 168 175 m_pcEntropyCoderIf->codePredMode( pcCU, uiAbsPartIdx ); 169 176 } … … 244 251 } 245 252 } 253 #if INTRA_BL 254 if( pcCU->isIntra(uiAbsPartIdx) && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) ) 255 #else 246 256 247 257 if( pcCU->getPredictionMode(uiAbsPartIdx) == MODE_INTRA && pcCU->getPartitionSize(uiAbsPartIdx) == SIZE_NxN && uiDepth == pcCU->getDepth(uiAbsPartIdx) ) 258 #endif 248 259 { 249 260 assert( uiSubdiv ); … … 331 342 } 332 343 344 #if INTRA_BL 345 #if NO_RESIDUAL_FLAG_FOR_BLPRED 346 if( ( !pcCU->isIntra( uiAbsPartIdx ) || pcCU->isIntraBL(uiAbsPartIdx)) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 347 #else 348 if( ( !pcCU->isIntra( uiAbsPartIdx ) ) && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 349 #endif 350 #else 333 351 if( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA && uiDepth == pcCU->getDepth( uiAbsPartIdx ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_U, 0 ) && !pcCU->getCbf( uiAbsPartIdx, TEXT_CHROMA_V, 0 ) ) 352 #endif 334 353 { 335 354 assert( pcCU->getCbf( uiAbsPartIdx, TEXT_LUMA, 0 ) ); … … 412 431 Void TEncEntropy::encodePredInfo( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD ) 413 432 { 433 #if INTRA_BL 434 assert ( !pcCU->isIntraBL( uiAbsPartIdx ) ); 435 #endif 414 436 if( bRD ) 415 437 { … … 585 607 UInt uiChromaOffset = uiLumaOffset>>2; 586 608 609 #if NO_RESIDUAL_FLAG_FOR_BLPRED 610 if( pcCU->isIntra(uiAbsPartIdx) && !pcCU->isIntraBL(uiAbsPartIdx) ) 611 #else 587 612 if( pcCU->isIntra(uiAbsPartIdx) ) 613 #endif 588 614 { 589 615 DTRACE_CABAC_VL( g_nSymbolCounter++ ) … … 733 759 } 734 760 761 #if INTRA_BL 762 Void TEncEntropy::encodeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD ) 763 { 764 if( pcCU->getLayerId() == 0 ) 765 { 766 return; 767 } 768 769 if( bRD ) 770 { 771 uiAbsPartIdx = 0; 772 } 773 m_pcEntropyCoderIf->codeIntraBLFlag( pcCU, uiAbsPartIdx ); 774 } 775 #endif 735 776 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncEntropy.h
r51 r54 86 86 virtual Void codeSplitFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0; 87 87 88 #if INTRA_BL 89 virtual Void codeIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0; 90 #endif 88 91 virtual Void codePartSize ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ) = 0; 89 92 virtual Void codePredMode ( TComDataCU* pcCU, UInt uiAbsPartIdx ) = 0; … … 161 164 Void encodeMergeFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx ); 162 165 Void encodeMergeIndex ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false ); 166 #if INTRA_BL 167 Void encodeIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false ); 168 #endif 163 169 Void encodePredMode ( TComDataCU* pcCU, UInt uiAbsPartIdx, Bool bRD = false ); 164 170 Void encodePartSize ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth, Bool bRD = false ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncGOP.cpp
r51 r54 97 97 xResetNonNestedSEIPresentFlags(); 98 98 #endif 99 #if SVC_UPSAMPLING 100 m_pcPredSearch = NULL; 101 #endif 99 102 return; 100 103 } … … 106 109 /** Create list to contain pointers to LCU start addresses of slice. 107 110 */ 111 #if SVC_EXTENSION 112 Void TEncGOP::create( UInt layerId ) 113 { 114 m_bLongtermTestPictureHasBeenCoded = 0; 115 m_bLongtermTestPictureHasBeenCoded2 = 0; 116 m_layerId = layerId; 117 } 118 #else 108 119 Void TEncGOP::create() 109 120 { … … 111 122 m_bLongtermTestPictureHasBeenCoded2 = 0; 112 123 } 124 #endif 113 125 114 126 Void TEncGOP::destroy() … … 121 133 m_pcCfg = pcTEncTop; 122 134 m_pcSliceEncoder = pcTEncTop->getSliceEncoder(); 123 m_pcListPic = pcTEncTop->getListPic(); 124 135 m_pcListPic = pcTEncTop->getListPic(); 125 136 m_pcEntropyCoder = pcTEncTop->getEntropyCoder(); 126 137 m_pcCavlcCoder = pcTEncTop->getCavlcCoder(); … … 136 147 m_totalCoded = 0; 137 148 149 #if SVC_EXTENSION 150 m_ppcTEncTop = pcTEncTop->getLayerEnc(); 151 #endif 152 #if SVC_UPSAMPLING 153 m_pcPredSearch = pcTEncTop->getPredSearch(); ///< encoder search class 154 #endif 138 155 } 139 156 … … 239 256 // Public member functions 240 257 // ==================================================================================================================== 258 #if SVC_EXTENSION 259 Void TEncGOP::compressGOP( Int iPicIdInGOP, Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsInGOP) 260 #else 241 261 Void TEncGOP::compressGOP( Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsInGOP) 262 #endif 242 263 { 243 264 TComPic* pcPic; … … 261 282 UInt *accumNalsDU = NULL; 262 283 SEIDecodingUnitInfo decodingUnitInfoSEI; 284 #if SVC_EXTENSION 285 for ( Int iGOPid=iPicIdInGOP; iGOPid < iPicIdInGOP+1; iGOPid++ ) 286 #else 263 287 for ( Int iGOPid=0; iGOPid < m_iGopSize; iGOPid++ ) 288 #endif 264 289 { 265 290 UInt uiColDir = 1; … … 337 362 m_pcSliceEncoder->setSliceIdx(0); 338 363 pcPic->setCurrSliceIdx(0); 364 #if SVC_EXTENSION 365 pcPic->setLayerId( m_layerId ); 366 #endif 339 367 340 368 m_pcSliceEncoder->initEncSlice ( pcPic, iPOCLast, pocCurr, iNumPicRcvd, iGOPid, pcSlice, m_pcEncTop->getSPS(), m_pcEncTop->getPPS() ); … … 384 412 // Set the nal unit type 385 413 pcSlice->setNalUnitType(getNalUnitType(pocCurr)); 414 #if REF_IDX_FRAMEWORK 415 if( m_layerId > 0 && (uiPOCCurr % m_pcCfg->getIntraPeriod() == 0) ) 416 { 417 pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_CRA); 418 } 419 if( m_layerId > 0 && !m_pcEncTop->getElRapSliceTypeB() ) 420 { 421 if( (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA) && 422 (pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_CRA) && 423 pcSlice->getSliceType() == B_SLICE ) 424 { 425 pcSlice->setSliceType(P_SLICE); 426 } 427 } 428 #endif 386 429 if(pcSlice->getNalUnitType()==NAL_UNIT_CODED_SLICE_TRAIL_R) 387 430 { … … 470 513 #endif 471 514 515 #if SVC_EXTENSION 516 if(m_layerId > 0) 517 { 518 TComList<TComPic*> *cListPic = m_ppcTEncTop[m_layerId-1]->getListPic(); 519 pcSlice->setBaseColPic (*cListPic, m_layerId ); 520 #if SVC_UPSAMPLING 521 if ( pcPic->isSpatialEnhLayer()) 522 { 523 m_pcPredSearch->upsampleBasePic( pcPic->getFullPelBaseRec(), pcSlice->getBaseColPic()->getPicYuvRec(), pcPic->getPicYuvRec() ); 524 } 525 else 526 { 527 pcPic->setFullPelBaseRec( pcSlice->getBaseColPic()->getPicYuvRec() ); 528 } 529 pcSlice->setFullPelBaseRec ( pcPic->getFullPelBaseRec() ); 530 #endif 531 } 532 #endif 533 534 #if REF_IDX_FRAMEWORK 535 if( pcSlice->getSliceType() == B_SLICE ) 536 { 537 pcSlice->setColFromL0Flag(1-uiColDir); 538 } 539 #endif 540 472 541 // Set reference list 473 542 pcSlice->setRefPicList ( rcListPic ); 543 #if REF_IDX_FRAMEWORK 544 if(m_layerId > 0) 545 { 546 m_pcEncTop->setILRPic(pcPic); 547 548 #if REF_IDX_MFM 549 pcSlice->setRefPOCListILP(m_pcEncTop->getIlpList(), pcSlice->getBaseColPic()); 550 #endif 551 pcSlice->addRefPicList ( m_pcEncTop->getIlpList(), 1); 552 553 #if REF_IDX_MFM 554 Bool found = false; 555 UInt ColFromL0Flag = pcSlice->getColFromL0Flag(); 556 UInt ColRefIdx = pcSlice->getColRefIdx(); 557 for(Int colIdx = 0; colIdx < pcSlice->getNumRefIdx( RefPicList(1 - ColFromL0Flag) ); colIdx++) 558 { 559 if( pcSlice->getRefPic( RefPicList(1 - ColFromL0Flag), colIdx)->getIsILR() ) 560 { 561 ColRefIdx = colIdx; 562 found = true; 563 break; 564 } 565 } 566 567 if( found == false ) 568 { 569 ColFromL0Flag = 1 - ColFromL0Flag; 570 for(Int colIdx = 0; colIdx < pcSlice->getNumRefIdx( RefPicList(1 - ColFromL0Flag) ); colIdx++) 571 { 572 if( pcSlice->getRefPic( RefPicList(1 - ColFromL0Flag), colIdx)->getIsILR() ) 573 { 574 ColRefIdx = colIdx; 575 found = true; 576 break; 577 } 578 } 579 } 580 581 if(found == true) 582 { 583 pcSlice->setColFromL0Flag(ColFromL0Flag); 584 pcSlice->setColRefIdx(ColRefIdx); 585 } 586 #endif 587 } 588 #endif 474 589 475 590 // Slice info. refinement … … 493 608 if (pcSlice->getSliceType() == B_SLICE) 494 609 { 610 #if !REF_IDX_FRAMEWORK 495 611 pcSlice->setColFromL0Flag(1-uiColDir); 612 #endif 496 613 Bool bLowDelay = true; 497 614 Int iCurrPOC = pcSlice->getPOC(); … … 780 897 m_storedStartCUAddrForEncodingSliceSegment.push_back(nextCUAddr); 781 898 startCUAddrSliceSegmentIdx++; 899 #if AVC_BASE 900 if( m_layerId == 0 ) 901 { 902 pcPic->getPicYuvOrg()->copyToPic( pcPic->getPicYuvRec() ); 903 #if AVC_SYNTAX 904 pcPic->readBLSyntax( m_ppcTEncTop[0]->getBLSyntaxFile(), SYNTAX_BYTES ); 905 #endif 906 return; 907 } 908 #endif 782 909 783 910 while(nextCUAddr<uiRealEndAddress) // determine slice boundaries … … 878 1005 if ( m_bSeqFirst ) 879 1006 { 1007 #if SVC_EXTENSION 1008 OutputNALUnit nalu(NAL_UNIT_VPS, 0, m_layerId); 1009 #else 880 1010 OutputNALUnit nalu(NAL_UNIT_VPS); 1011 #endif 881 1012 m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream); 882 1013 m_pcEntropyCoder->encodeVPS(m_pcEncTop->getVPS()); … … 887 1018 #endif 888 1019 1020 #if SVC_EXTENSION 1021 nalu = NALUnit(NAL_UNIT_SPS, 0, m_layerId); 1022 #else 889 1023 nalu = NALUnit(NAL_UNIT_SPS); 1024 #endif 890 1025 m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream); 891 1026 if (m_bSeqFirst) … … 920 1055 #endif 921 1056 1057 #if SVC_EXTENSION 1058 nalu = NALUnit(NAL_UNIT_PPS, 0, m_layerId); 1059 #else 922 1060 nalu = NALUnit(NAL_UNIT_PPS); 1061 #endif 923 1062 m_pcEntropyCoder->setBitstream(&nalu.m_Bitstream); 924 1063 m_pcEntropyCoder->encodePPS(pcSlice->getPPS()); … … 1174 1313 m_pcEntropyCoder->resetEntropy (); 1175 1314 /* start slice NALunit */ 1315 #if SVC_EXTENSION 1316 OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->getTLayer(), m_layerId ); 1317 #else 1176 1318 OutputNALUnit nalu( pcSlice->getNalUnitType(), pcSlice->getTLayer() ); 1319 #endif 1177 1320 Bool sliceSegment = (!pcSlice->isNextSlice()); 1178 1321 if (!sliceSegment) … … 1436 1579 digestStr = digestToString(sei_recon_picture_digest.digest, 4); 1437 1580 } 1581 #if SVC_EXTENSION 1582 OutputNALUnit nalu(NAL_UNIT_SEI_SUFFIX, pcSlice->getTLayer(), m_layerId); 1583 #else 1438 1584 OutputNALUnit nalu(NAL_UNIT_SEI_SUFFIX, pcSlice->getTLayer()); 1585 #endif 1439 1586 1440 1587 /* write the SEI messages */ … … 1708 1855 if( accumNalsDU != NULL) delete accumNalsDU; 1709 1856 1857 #if SVC_EXTENSION 1858 assert ( m_iNumPicCoded <= 1 ); 1859 #else 1710 1860 assert ( m_iNumPicCoded == iNumPicRcvd ); 1861 #endif 1711 1862 } 1712 1863 1864 #if !SVC_EXTENSION 1713 1865 Void TEncGOP::printOutSummary(UInt uiNumAllPicCoded) 1714 1866 { … … 1746 1898 printf("\nRVM: %.3lf\n" , xCalculateRVM()); 1747 1899 } 1900 #endif 1748 1901 1749 1902 Void TEncGOP::preLoopFilterPicAll( TComPic* pcPic, UInt64& ruiDist, UInt64& ruiBits ) … … 2020 2173 2021 2174 //===== add PSNR ===== 2175 #if SVC_EXTENSION 2176 m_gcAnalyzeAll[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2177 TComSlice* pcSlice = pcPic->getSlice(0); 2178 if (pcSlice->isIntra()) 2179 { 2180 m_gcAnalyzeI[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2181 } 2182 if (pcSlice->isInterP()) 2183 { 2184 m_gcAnalyzeP[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2185 } 2186 if (pcSlice->isInterB()) 2187 { 2188 m_gcAnalyzeB[m_layerId].addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2189 } 2190 #else 2022 2191 m_gcAnalyzeAll.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2023 2192 TComSlice* pcSlice = pcPic->getSlice(0); … … 2034 2203 m_gcAnalyzeB.addResult (dYPSNR, dUPSNR, dVPSNR, (Double)uibits); 2035 2204 } 2205 #endif 2036 2206 2037 2207 Char c = (pcSlice->isIntra() ? 'I' : pcSlice->isInterP() ? 'P' : 'B'); 2038 2208 if (!pcSlice->isReferenced()) c += 32; 2039 2209 2210 #if SVC_EXTENSION 2211 #if ADAPTIVE_QP_SELECTION 2212 printf("POC %4d LId: %1d TId: %1d ( %c-SLICE, nQP %d QP %d ) %10d bits", 2213 pcSlice->getPOC(), 2214 pcSlice->getLayerId(), 2215 pcSlice->getTLayer(), 2216 c, 2217 pcSlice->getSliceQpBase(), 2218 pcSlice->getSliceQp(), 2219 uibits ); 2220 #else 2221 printf("POC %4d LId: %1d TId: %1d ( %c-SLICE, QP %d ) %10d bits", 2222 pcSlice->getPOC()-pcSlice->getLastIDR(), 2223 pcSlice->getLayerId(), 2224 pcSlice->getTLayer(), 2225 c, 2226 pcSlice->getSliceQp(), 2227 uibits ); 2228 #endif 2229 #else 2040 2230 #if ADAPTIVE_QP_SELECTION 2041 2231 printf("POC %4d TId: %1d ( %c-SLICE, nQP %d QP %d ) %10d bits", … … 2054 2244 uibits ); 2055 2245 #endif 2246 #endif 2056 2247 2057 2248 printf(" [Y %6.4lf dB U %6.4lf dB V %6.4lf dB]", dYPSNR, dUPSNR, dVPSNR ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncGOP.h
r51 r54 83 83 Bool m_bFirst; 84 84 85 #if SVC_EXTENSION 86 UInt m_layerId; 87 #endif 88 85 89 // Access channel 86 90 TEncTop* m_pcEncTop; … … 88 92 TEncSlice* m_pcSliceEncoder; 89 93 TComList<TComPic*>* m_pcListPic; 94 95 #if SVC_EXTENSION 96 TEncTop** m_ppcTEncTop; 97 #if SVC_UPSAMPLING 98 TEncSearch* m_pcPredSearch; ///< encoder search class 99 #endif 100 #endif 90 101 91 102 TEncEntropy* m_pcEntropyCoder; … … 125 136 virtual ~TEncGOP(); 126 137 138 #if SVC_EXTENSION 139 Void create ( UInt layerId ); 140 #else 127 141 Void create (); 142 #endif 128 143 Void destroy (); 129 144 130 145 Void init ( TEncTop* pcTEncTop ); 146 #if SVC_EXTENSION 147 Void compressGOP ( Int iPicIdInGOP, Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRec, std::list<AccessUnit>& accessUnitsInGOP ); 148 #else 131 149 Void compressGOP ( Int iPOCLast, Int iNumPicRcvd, TComList<TComPic*>& rcListPic, TComList<TComPicYuv*>& rcListPicYuvRec, std::list<AccessUnit>& accessUnitsInGOP ); 150 #endif 132 151 Void xWriteTileLocationToSliceHeader (OutputNALUnit& rNalu, TComOutputBitstream*& rpcBitstreamRedirect, TComSlice*& rpcSlice); 133 152 -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncPic.cpp
r51 r54 126 126 * \return Void 127 127 */ 128 #if SVC_UPSAMPLING 129 Void TEncPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 130 Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, TComSPS* pcSps, Bool bIsVirtual ) 131 132 #else 128 133 Void TEncPic::create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 129 134 Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual ) 135 #endif 130 136 { 137 #if SVC_UPSAMPLING 138 TComPic::create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, 139 conformanceWindow, defaultDisplayWindow, numReorderPics, pcSps, bIsVirtual ); 140 #else 131 141 TComPic::create( iWidth, iHeight, uiMaxWidth, uiMaxHeight, uiMaxDepth, 132 142 conformanceWindow, defaultDisplayWindow, numReorderPics, bIsVirtual ); 143 #endif 133 144 m_uiMaxAQDepth = uiMaxAQDepth; 134 145 if ( uiMaxAQDepth > 0 ) -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncPic.h
r51 r54 41 41 #include "TLibCommon/CommonDef.h" 42 42 #include "TLibCommon/TComPic.h" 43 43 #if SVC_UPSAMPLING 44 #include "TLibCommon/TComSlice.h" 45 #endif 44 46 //! \ingroup TLibEncoder 45 47 //! \{ … … 103 105 virtual ~TEncPic(); 104 106 107 #if SVC_UPSAMPLING 108 Void create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 109 Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, TComSPS* pcSps, Bool bIsVirtual = false ); 110 #else 105 111 Void create( Int iWidth, Int iHeight, UInt uiMaxWidth, UInt uiMaxHeight, UInt uiMaxDepth, UInt uiMaxAQDepth, 106 112 Window &conformanceWindow, Window &defaultDisplayWindow, Int *numReorderPics, Bool bIsVirtual = false ); 113 #endif 107 114 virtual Void destroy(); 108 115 -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSbac.cpp
r51 r54 83 83 , m_cTransformSkipSCModel ( 1, 2, NUM_TRANSFORMSKIP_FLAG_CTX , m_contextModels + m_numContextModels, m_numContextModels) 84 84 , m_CUTransquantBypassFlagSCModel( 1, 1, NUM_CU_TRANSQUANT_BYPASS_FLAG_CTX, m_contextModels + m_numContextModels, m_numContextModels) 85 #if INTRA_BL 86 , m_cIntraBLPredFlagSCModel (1, 1, NUM_INTRA_BL_PRED_CTX , m_contextModels + m_numContextModels, m_numContextModels) 87 #endif 85 88 { 86 89 assert( m_numContextModels <= MAX_NUM_CTX_MOD ); … … 131 134 m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); 132 135 m_cSaoMergeSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG ); 136 #if INTRA_BL 137 m_cIntraBLPredFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRA_BL_PRED_FLAG ); 138 #endif 133 139 m_cSaoTypeIdxSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX ); 134 140 m_cTransformSkipSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); … … 163 169 curCost = m_cCUSplitFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_SPLIT_FLAG ); 164 170 curCost += m_cCUSkipFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_SKIP_FLAG ); 171 #if INTRA_BL 172 curCost += m_cIntraBLPredFlagSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_INTRA_BL_PRED_FLAG ); 173 #endif 165 174 curCost += m_cCUMergeFlagExtSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_MERGE_FLAG_EXT); 166 175 curCost += m_cCUMergeIdxExtSCModel.calcCost ( curSliceType, qp, (UChar*)INIT_MERGE_IDX_EXT); … … 234 243 m_cCUTransSubdivFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANS_SUBDIV_FLAG ); 235 244 m_cSaoMergeSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_MERGE_FLAG ); 245 #if INTRA_BL 246 m_cIntraBLPredFlagSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_INTRA_BL_PRED_FLAG ); 247 #endif 236 248 m_cSaoTypeIdxSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_SAO_TYPE_IDX ); 237 249 m_cTransformSkipSCModel.initBuffer ( eSliceType, iQp, (UChar*)INIT_TRANSFORMSKIP_FLAG ); … … 416 428 { 417 429 PartSize eSize = pcCU->getPartitionSize( uiAbsPartIdx ); 430 #if INTRA_BL 431 assert( !pcCU->isIntraBL( uiAbsPartIdx ) ); 432 #endif 418 433 if ( pcCU->isIntra( uiAbsPartIdx ) ) 419 434 { … … 1584 1599 this->xCopyContextsFrom(pScr); 1585 1600 } 1601 1602 #if INTRA_BL 1603 /** code intra_bl flag 1604 * \param pcCU 1605 * \param uiAbsPartIdx 1606 * \returns Void 1607 */ 1608 Void TEncSbac::codeIntraBLFlag( TComDataCU* pcCU, UInt uiAbsPartIdx ) 1609 { 1610 // get context function is here 1611 UInt uiSymbol = pcCU->isIntraBL( uiAbsPartIdx ) ? 1 : 0; 1612 1613 UInt uiCtxIntraBL = pcCU->getCtxIntraBLFlag( uiAbsPartIdx ) ; 1614 m_pcBinIf->encodeBin(uiSymbol, m_cIntraBLPredFlagSCModel.get( 0, 0, uiCtxIntraBL )); 1615 1616 DTRACE_CABAC_VL( g_nSymbolCounter++ ); 1617 DTRACE_CABAC_T( "\tuiSymbol: "); 1618 DTRACE_CABAC_V( uiSymbol ); 1619 DTRACE_CABAC_T( "\n"); 1620 } 1621 #endif 1586 1622 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSbac.h
r51 r54 134 134 Void codeMVPIdx ( TComDataCU* pcCU, UInt uiAbsPartIdx, RefPicList eRefList ); 135 135 136 #if INTRA_BL 137 Void codeIntraBLFlag ( TComDataCU* pcCU, UInt uiAbsPartIdx ); 138 #endif 136 139 Void codePartSize ( TComDataCU* pcCU, UInt uiAbsPartIdx, UInt uiDepth ); 137 140 Void codePredMode ( TComDataCU* pcCU, UInt uiAbsPartIdx ); … … 204 207 ContextModel3DBuffer m_cTransformSkipSCModel; 205 208 ContextModel3DBuffer m_CUTransquantBypassFlagSCModel; 209 #if INTRA_BL 210 ContextModel3DBuffer m_cIntraBLPredFlagSCModel; 211 #endif 206 212 }; 207 213 -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSearch.cpp
r51 r54 906 906 m_pcEntropyCoder->encodePredMode( pcCU, 0, true ); 907 907 } 908 908 #if INTRA_BL 909 m_pcEntropyCoder->encodeIntraBLFlag ( pcCU, 0, true ); 910 if( pcCU->isIntraBL( 0 ) ) 911 { 912 return; 913 } 914 #endif 909 915 m_pcEntropyCoder ->encodePartSize( pcCU, 0, pcCU->getDepth(0), true ); 910 916 … … 944 950 } 945 951 } 952 #if INTRA_BL 953 if( pcCU->isIntraBL( 0 ) ) 954 { 955 return; 956 } 957 #endif 946 958 if( bChroma ) 947 959 { … … 1043 1055 pcCU->getPattern()->initAdiPattern( pcCU, uiAbsPartIdx, uiTrDepth, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail ); 1044 1056 //===== get prediction signal ===== 1057 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 1058 if(pcCU->isIntraBL ( uiAbsPartIdx ) ) 1059 { 1060 pcCU->getBaseLumaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride ); 1061 } 1062 else 1063 #endif 1045 1064 predIntraLumaAng( pcCU->getPattern(), uiLumaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail ); 1046 1065 // save prediction … … 1228 1247 1229 1248 //===== get prediction signal ===== 1249 #if INTRA_BL && !NO_RESIDUAL_FLAG_FOR_BLPRED 1250 if(pcCU->isIntraBL ( uiAbsPartIdx ) ) 1251 { 1252 pcCU->getBaseChromaBlk( uiWidth, uiHeight, uiAbsPartIdx, piPred, uiStride, uiChromaId ); 1253 } 1254 else 1255 #endif 1230 1256 { 1231 1257 predIntraChromaAng( pPatChroma, uiChromaPredMode, piPred, uiStride, uiWidth, uiHeight, bAboveAvail, bLeftAvail ); … … 3039 3065 Int iHeight = 0; 3040 3066 3067 #if REF_IDX_FRAMEWORK // HM bug fix 3068 for( UInt uiMergeCand = 0; uiMergeCand < pcCU->getSlice()->getMaxNumMergeCand(); ++uiMergeCand ) 3069 { 3070 uhInterDirNeighbours[uiMergeCand] = 0; 3071 cMvFieldNeighbours[0 + 2*uiMergeCand].setMvField(TComMv(), NOT_VALID); 3072 cMvFieldNeighbours[1 + 2*uiMergeCand].setMvField(TComMv(), NOT_VALID); 3073 } 3074 #endif 3041 3075 pcCU->getPartIndexAndSize( iPUIdx, uiAbsPartIdx, iWidth, iHeight ); 3042 3076 UInt uiDepth = pcCU->getDepth( uiAbsPartIdx ); … … 3060 3094 for( UInt uiMergeCand = 0; uiMergeCand < numValidMergeCand; ++uiMergeCand ) 3061 3095 { 3062 { 3096 #if REF_IDX_ME_ZEROMV 3097 Bool bZeroMVILR = pcCU->xCheckZeroMVILRMerge(uhInterDirNeighbours[uiMergeCand], cMvFieldNeighbours[0 + 2*uiMergeCand], cMvFieldNeighbours[1 + 2*uiMergeCand]); 3098 if(bZeroMVILR) 3099 { 3100 #endif 3063 3101 UInt uiCostCand = MAX_UINT; 3064 3102 UInt uiBitsCand = 0; … … 3084 3122 uiMergeIndex = uiMergeCand; 3085 3123 } 3086 } 3124 #if REF_IDX_ME_ZEROMV 3125 } 3126 #endif 3087 3127 } 3088 3128 } … … 3209 3249 UInt uiBitsTempL0[MAX_NUM_REF]; 3210 3250 3251 #if (ENCODER_FAST_MODE) 3252 Bool testILR; 3253 #endif 3254 3211 3255 xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits); 3212 3256 … … 3230 3274 RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); 3231 3275 3276 #if (ENCODER_FAST_MODE) 3277 if (pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1) 3278 { 3279 testILR = false; 3280 } 3281 else 3282 { 3283 testILR = true; 3284 } 3285 #endif 3286 3232 3287 for ( Int iRefIdxTemp = 0; iRefIdxTemp < pcCU->getSlice()->getNumRefIdx(eRefPicList); iRefIdxTemp++ ) 3233 3288 { 3289 #if (ENCODER_FAST_MODE) 3290 TComPic* pcPic = pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxTemp ); 3291 if( !testILR && pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N) ) 3292 { 3293 continue; 3294 } 3295 #endif 3296 3234 3297 uiBitsTemp = uiMbBits[iRefList]; 3235 3298 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) … … 3248 3311 if(pcCU->getSlice()->getMvdL1ZeroFlag() && iRefList==1 && biPDistTemp < bestBiPDist) 3249 3312 { 3313 #if REF_IDX_ME_ZEROMV 3314 Bool bZeroMVILR = pcCU->xCheckZeroMVILRMvdL1Zero(iRefList, iRefIdxTemp, aaiMvpIdx[iRefList][iRefIdxTemp]); 3315 if(bZeroMVILR) 3316 { 3317 #endif 3250 3318 bestBiPDist = biPDistTemp; 3251 3319 bestBiPMvpL1 = aaiMvpIdx[iRefList][iRefIdxTemp]; 3252 3320 bestBiPRefIdxL1 = iRefIdxTemp; 3321 #if REF_IDX_ME_ZEROMV 3322 } 3323 #endif 3253 3324 } 3254 3325 … … 3343 3414 } 3344 3415 3416 #if ENCODER_BUGFIX 3417 if ( ( iRefList == 0 && uiCostTemp < uiCost[iRefList] ) || 3418 ( iRefList == 1 && pcCU->getSlice()->getNoBackPredFlag() && iRefIdxTemp == iRefIdx[0] ) || 3419 ( iRefList == 1 && !pcCU->getSlice()->getNoBackPredFlag() && uiCostTemp < uiCost[iRefList] ) ) 3420 #else 3345 3421 if ( ( iRefList == 0 && uiCostTemp < uiCost[iRefList] ) || 3346 3422 ( iRefList == 1 && pcCU->getSlice()->getNoBackPredFlag() && iRefIdxTemp == iRefIdx[0] ) || 3347 3423 ( iRefList == 1 && (pcCU->getSlice()->getNumRefIdx(REF_PIC_LIST_C) > 0) && (iRefIdxTemp==0 || iRefIdxTemp == iRefIdx[0]) && !pcCU->getSlice()->getNoBackPredFlag() && (iRefIdxTemp == pcCU->getSlice()->getRefIdxOfL0FromRefIdxOfL1(iRefIdxTemp)) ) || 3348 3424 ( iRefList == 1 && !pcCU->getSlice()->getNoBackPredFlag() && uiCostTemp < uiCost[iRefList] ) ) 3425 #endif 3349 3426 { 3350 3427 uiCost[iRefList] = uiCostTemp; … … 3375 3452 } 3376 3453 // Bi-directional prediction 3454 #if REF_IDX_ME_ZEROMV 3455 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) && !(pcCU->getSlice()->getMvdL1ZeroFlag() && bestBiPDist == MAX_INT) ) 3456 #else 3377 3457 if ( (pcCU->getSlice()->isInterB()) && (pcCU->isBipredRestriction(iPartIdx) == false) ) 3458 #endif 3378 3459 { 3379 3460 … … 3449 3530 Bool bChanged = false; 3450 3531 3532 #if (ENCODER_FAST_MODE) 3533 Bool testIter = true; 3534 TComPic* pcPic = pcCU->getSlice()->getRefPic( RefPicList(1 - iRefList), iRefIdxBi[1 - iRefList] ); 3535 if(pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N)) 3536 testIter = false; //the fixed part is ILR, skip this iteration 3537 if(testIter) 3538 { 3539 #endif 3451 3540 iRefStart = 0; 3452 3541 iRefEnd = pcCU->getSlice()->getNumRefIdx(eRefPicList)-1; … … 3454 3543 for ( Int iRefIdxTemp = iRefStart; iRefIdxTemp <= iRefEnd; iRefIdxTemp++ ) 3455 3544 { 3545 #if (ENCODER_FAST_MODE) 3546 Bool testRefIdx = true; 3547 pcPic = pcCU->getSlice()->getRefPic( RefPicList(iRefList) , iRefIdxTemp ); 3548 if(pcPic->getIsILR() && (ePartSize == SIZE_2Nx2N)) 3549 testRefIdx = false; //the refined part is ILR, skip this reference pic 3550 if(testRefIdx) 3551 { 3552 #endif 3456 3553 uiBitsTemp = uiMbBits[2] + uiMotBits[1-iRefList]; 3457 3554 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) … … 3487 3584 } 3488 3585 } 3586 #if (ENCODER_FAST_MODE) 3587 } 3588 #endif 3589 } 3590 #if (ENCODER_FAST_MODE) 3489 3591 } // for loop-iRefIdxTemp 3592 #endif 3490 3593 3491 3594 if ( !bChanged ) … … 4104 4207 setWpScalingDistParam( pcCU, iRefIdxPred, eRefPicList ); 4105 4208 // Do integer search 4209 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV 4210 #if REF_IDX_ME_AROUND_ZEROMV 4211 if( pcCU->getSlice()->getRefPic(eRefPicList, iRefIdxPred )->getIsILR()) //ILR reference pic 4212 { 4213 xPatternSearchILR ( pcCU, pcPatternKey, piRefY, iRefStride, rcMv, ruiCost ); 4214 } 4215 else //non ILR reference pic 4216 { 4106 4217 if ( !m_iFastSearch || bBi ) 4107 4218 { … … 4112 4223 rcMv = *pcMvPred; 4113 4224 xPatternSearchFast ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost ); 4114 } 4225 } 4226 } 4227 #endif 4228 #if REF_IDX_ME_ZEROMV 4229 if( pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxPred )->getIsILR()) //ILR reference pic 4230 { 4231 rcMv.setZero(); //use Mv(0, 0) for integer ME 4232 } 4233 else //non ILR reference pic 4234 { 4235 if ( !m_iFastSearch || bBi ) 4236 { 4237 xPatternSearch ( pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost ); 4238 } 4239 else 4240 { 4241 rcMv = *pcMvPred; 4242 xPatternSearchFast ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost ); 4243 } 4244 } 4245 #endif 4246 #else 4247 if ( !m_iFastSearch || bBi ) 4248 { 4249 xPatternSearch ( pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost ); 4250 } 4251 else 4252 { 4253 rcMv = *pcMvPred; 4254 xPatternSearchFast ( pcCU, pcPatternKey, piRefY, iRefStride, &cMvSrchRngLT, &cMvSrchRngRB, rcMv, ruiCost ); 4255 } 4256 #endif 4115 4257 4116 4258 m_pcRdCost->getMotionCost( 1, 0 ); … … 4118 4260 4119 4261 { 4262 #if REF_IDX_ME_ZEROMV 4263 if( pcCU->getSlice()->getRefPic( eRefPicList, iRefIdxPred )->getIsILR()) //ILR reference pic 4264 { 4265 xPatternSearchFracDIFMv0( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost, bBi ); 4266 } 4267 else //non ILR reference pic 4268 { 4269 xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost, bBi ); 4270 } 4271 #else 4120 4272 xPatternSearchFracDIF( pcCU, pcPatternKey, piRefY, iRefStride, &rcMv, cMvHalf, cMvQter, ruiCost 4121 4273 ,bBi 4122 4274 ); 4275 #endif 4123 4276 } 4124 4277 … … 4457 4610 Void TEncSearch::encodeResAndCalcRdInterCU( TComDataCU* pcCU, TComYuv* pcYuvOrg, TComYuv* pcYuvPred, TComYuv*& rpcYuvResi, TComYuv*& rpcYuvResiBest, TComYuv*& rpcYuvRec, Bool bSkipRes ) 4458 4611 { 4612 #if NO_RESIDUAL_FLAG_FOR_BLPRED 4613 if ( pcCU->isIntra(0) && !pcCU->isIntraBL(0)) 4614 #else 4459 4615 if ( pcCU->isIntra(0) ) 4616 #endif 4460 4617 { 4461 4618 return; … … 4568 4725 pcCU->setTransformSkipSubParts ( 0, 0, 0, 0, pcCU->getDepth(0) ); 4569 4726 } 4727 #if NO_RESIDUAL_FLAG_FOR_BLPRED 4728 else if(pcCU->getLayerId() > 0 && pcCU->isIntraBL(0) && uiZeroDistortion == uiDistortion) // all zeros 4729 { 4730 const UInt uiQPartNum = pcCU->getPic()->getNumPartInCU() >> (pcCU->getDepth(0) << 1); 4731 ::memset( pcCU->getTransformIdx() , 0, uiQPartNum * sizeof(UChar) ); 4732 ::memset( pcCU->getCbf( TEXT_LUMA ) , 0, uiQPartNum * sizeof(UChar) ); 4733 ::memset( pcCU->getCbf( TEXT_CHROMA_U ), 0, uiQPartNum * sizeof(UChar) ); 4734 ::memset( pcCU->getCbf( TEXT_CHROMA_V ), 0, uiQPartNum * sizeof(UChar) ); 4735 ::memset( pcCU->getCoeffY() , 0, uiWidth * uiHeight * sizeof( TCoeff ) ); 4736 ::memset( pcCU->getCoeffCb() , 0, uiWidth * uiHeight * sizeof( TCoeff ) >> 2 ); 4737 ::memset( pcCU->getCoeffCr() , 0, uiWidth * uiHeight * sizeof( TCoeff ) >> 2 ); 4738 pcCU->setTransformSkipSubParts ( 0, 0, 0, 0, pcCU->getDepth(0) ); 4739 } 4740 #endif 4570 4741 else 4571 4742 { … … 4866 5037 Int scalingListType = 3 + g_eTTable[(Int)TEXT_LUMA]; 4867 5038 assert(scalingListType < 6); 5039 #if NO_RESIDUAL_FLAG_FOR_BLPRED 5040 if(pcCU->isIntraBL(uiAbsPartIdx) ) 5041 { 5042 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,DC_IDX, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only 5043 } 5044 else 5045 { 5046 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only 5047 } 5048 #else 4868 5049 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType );//this is for inter mode only 5050 #endif 4869 5051 4870 5052 const UInt uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), … … 5136 5318 assert(scalingListType < 6); 5137 5319 5320 #if NO_RESIDUAL_FLAG_FOR_BLPRED 5321 if(pcCU->isIntraBL(uiAbsPartIdx) ) 5322 { 5323 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,DC_IDX, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType, true ); 5324 } 5325 else 5326 { 5327 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType, true ); 5328 } 5329 #else 5138 5330 m_pcTrQuant->invtransformNxN( pcCU->getCUTransquantBypass(uiAbsPartIdx), TEXT_LUMA,REG_DCT, pcResiCurrY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), pcCoeffCurrY, trWidth, trHeight, scalingListType, true ); 5331 #endif 5139 5332 5140 5333 uiNonzeroDistY = m_pcRdCost->getDistPart(g_bitDepthY, m_pcQTTempTComYuv[uiQTTempAccessLayer].getLumaAddr( absTUPartIdx ), m_pcQTTempTComYuv[uiQTTempAccessLayer].getStride(), … … 5467 5660 5468 5661 { 5662 #if INTRA_BL 5663 #if NO_RESIDUAL_FLAG_FOR_BLPRED 5664 assert( !pcCU->isIntra(uiAbsPartIdx) || pcCU->isIntraBL(uiAbsPartIdx)); 5665 #else 5666 assert( !pcCU->isIntra(uiAbsPartIdx) ); 5667 #endif 5668 #else 5469 5669 assert( pcCU->getPredictionMode(uiAbsPartIdx) != MODE_INTRA ); 5670 #endif 5470 5671 if( bSubdivAndCbf ) 5471 5672 { … … 5701 5902 } 5702 5903 m_pcEntropyCoder->encodeSkipFlag ( pcCU, 0, true ); 5904 #if INTRA_BL 5905 if(m_pcEncCfg->getLayerId()) 5906 { 5907 m_pcEntropyCoder->encodeIntraBLFlag(pcCU, 0, true); 5908 #if !NO_RESIDUAL_FLAG_FOR_BLPRED 5909 assert( pcCU->isIntraBL( 0 ) == false ); 5910 #endif 5911 } 5912 #endif 5913 #if NO_RESIDUAL_FLAG_FOR_BLPRED 5914 if( !pcCU->isIntraBL(0)) 5915 { 5916 #endif 5703 5917 m_pcEntropyCoder->encodePredMode( pcCU, 0, true ); 5704 5918 m_pcEntropyCoder->encodePartSize( pcCU, 0, pcCU->getDepth(0), true ); 5705 5919 m_pcEntropyCoder->encodePredInfo( pcCU, 0, true ); 5920 #if NO_RESIDUAL_FLAG_FOR_BLPRED 5921 } 5922 #endif 5706 5923 Bool bDummy = false; 5707 5924 m_pcEntropyCoder->encodeCoeff ( pcCU, 0, pcCU->getDepth(0), pcCU->getWidth(0), pcCU->getHeight(0), bDummy ); … … 5952 6169 } 5953 6170 6171 #if REF_IDX_ME_ZEROMV 6172 Void TEncSearch::xPatternSearchFracDIFMv0(TComDataCU* pcCU, 6173 TComPattern* pcPatternKey, 6174 Pel* piRefY, 6175 Int iRefStride, 6176 TComMv* pcMvInt, 6177 TComMv& rcMvHalf, 6178 TComMv& rcMvQter, 6179 UInt& ruiCost, 6180 Bool biPred 6181 ) 6182 { 6183 assert(pcMvInt->getHor() == 0 && pcMvInt->getVer() == 0); 6184 Int iOffset = pcMvInt->getHor() + pcMvInt->getVer() * iRefStride; 6185 m_pcRdCost->setDistParam( pcPatternKey, piRefY + iOffset, iRefStride, 1, m_cDistParam, m_pcEncCfg->getUseHADME() ); 6186 m_pcRdCost->setCostScale ( 2 ); 6187 setDistParamComp(0); 6188 ruiCost = m_cDistParam.DistFunc( &m_cDistParam ); //SATD 6189 ruiCost += m_pcRdCost->getCost( pcMvInt->getHor(), pcMvInt->getVer() ); //SATD rdCost 6190 rcMvHalf.setZero(); 6191 rcMvQter.setZero(); 6192 } 6193 #endif 6194 6195 #if REF_IDX_ME_AROUND_ZEROMV 6196 //ILR integer pixel motion estimation search 6197 //pcCU is CU pointer 6198 //pcPatterney contains target PU infor 6199 //piRefY is the PU at the same position as the source PU, but in the reference pic 6200 //iRefStride is the reference stride 6201 //rcMv output best integer MV 6202 //ruiSAD outputs the SAD of best integer MV 6203 Void TEncSearch::xPatternSearchILR( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv& rcMv, UInt& ruiSAD ) 6204 { 6205 Int candMvX[5] = {0, -1, 1, 0, 0}; 6206 Int candMvY[5] = {0, 0, 0, -1, 1}; 6207 Int numCand = 1; 6208 Int iBestX = 0; 6209 Int iBestY = 0; 6210 Int uiSadBest = MAX_UINT; 6211 UInt uiSad; 6212 6213 Pel* piRefSrch; 6214 6215 //-- jclee for using the SAD function pointer 6216 m_pcRdCost->setDistParam( pcPatternKey, piRefY, iRefStride, m_cDistParam ); 6217 6218 // fast encoder decision: use subsampled SAD for integer ME 6219 if ( m_pcEncCfg->getUseFastEnc() ) 6220 { 6221 if ( m_cDistParam.iRows > 8 ) 6222 { 6223 m_cDistParam.iSubShift = 1; 6224 } 6225 } 6226 6227 for(Int candId = 0; candId < numCand; candId++) 6228 { 6229 piRefSrch = piRefY + (candMvY[candId] * iRefStride) + candMvX[candId]; 6230 m_cDistParam.pCur = piRefSrch; 6231 6232 setDistParamComp(0); 6233 6234 uiSad = m_cDistParam.DistFunc( &m_cDistParam ); //SAD 6235 6236 //motion cost 6237 uiSad += m_pcRdCost->getCost( candMvX[candId], candMvY[candId] ); //SAD rdCost 6238 6239 if(uiSad < uiSadBest) 6240 { 6241 uiSadBest = uiSad; 6242 iBestX = candMvX[candId]; 6243 iBestY = candMvY[candId]; 6244 } 6245 } 6246 6247 rcMv.set( iBestX, iBestY ); 6248 6249 ruiSAD = uiSadBest - m_pcRdCost->getCost( iBestX, iBestY ); 6250 return; 6251 } 6252 #endif 6253 6254 #if ENCODER_FAST_MODE 6255 Bool TEncSearch::predInterSearchILRUni( TComDataCU* pcCU, TComYuv* pcOrgYuv, TComYuv*& rpcPredYuv, TComYuv*& rpcResiYuv, TComYuv*& rpcRecoYuv ) 6256 { 6257 rpcPredYuv->clear(); 6258 rpcRecoYuv->clear(); 6259 6260 Int iNumPredDir = pcCU->getSlice()->isInterP() ? 1 : 2; 6261 6262 TComMv cMv[2]; 6263 TComMv cMvPred[2][33]; 6264 TComMv cMvTemp[2][33]; 6265 TComMv TempMv; 6266 6267 Int iRefIdx[2]={0,0}; 6268 6269 Int aaiMvpIdx[2][33]; 6270 Int aaiMvpNum[2][33]; 6271 6272 UInt uiMbBits[3] = {1, 1, 0}; 6273 UInt uiLastMode = 0; 6274 6275 UInt uiCost[2] = { MAX_UINT, MAX_UINT }; //uni, rdCost 6276 UInt uiCostTemp; 6277 UInt biPDistTemp = MAX_INT; 6278 UInt uiBitsTemp; 6279 6280 PartSize ePartSize = pcCU->getPartitionSize( 0 ); //2Nx2N 6281 Int iPartIdx = 0; //one PU in CU 6282 UInt uiPartAddr; 6283 Int iRoiWidth, iRoiHeight; 6284 6285 xGetBlkBits( ePartSize, pcCU->getSlice()->isInterP(), iPartIdx, uiLastMode, uiMbBits); 6286 pcCU->getPartIndexAndSize( iPartIdx, uiPartAddr, iRoiWidth, iRoiHeight ); 6287 6288 for( Int iRefList = 0; iRefList < iNumPredDir; iRefList++) //list 6289 { 6290 RefPicList eRefPicList = ( iRefList ? REF_PIC_LIST_1 : REF_PIC_LIST_0 ); 6291 6292 Int iRefIdxTemp = -1; 6293 Bool foundILR = false; 6294 for( Int refIdx = 0; refIdx < pcCU->getSlice()->getNumRefIdx(eRefPicList); refIdx++ ) 6295 if( pcCU->getSlice()->getRefPic(eRefPicList, refIdx)->getIsILR() ) 6296 { 6297 iRefIdxTemp = refIdx; 6298 foundILR = true; 6299 break; 6300 } 6301 6302 if(!foundILR) //no ILR in eRefPiclist 6303 continue; 6304 6305 uiBitsTemp = uiMbBits[iRefList]; 6306 if ( pcCU->getSlice()->getNumRefIdx(eRefPicList) > 1 ) 6307 { 6308 uiBitsTemp += iRefIdxTemp+1; 6309 if ( iRefIdxTemp == pcCU->getSlice()->getNumRefIdx(eRefPicList)-1 ) uiBitsTemp--; 6310 } 6311 6312 xEstimateMvPredAMVP( pcCU, pcOrgYuv, iPartIdx, eRefPicList, iRefIdxTemp, cMvPred[iRefList][iRefIdxTemp], false, &biPDistTemp); 6313 aaiMvpIdx[iRefList][iRefIdxTemp] = pcCU->getMVPIdx(eRefPicList, uiPartAddr); 6314 aaiMvpNum[iRefList][iRefIdxTemp] = pcCU->getMVPNum(eRefPicList, uiPartAddr); 6315 6316 uiBitsTemp += m_auiMVPIdxCost[aaiMvpIdx[iRefList][iRefIdxTemp]][AMVP_MAX_NUM_CANDS]; 6317 6318 xMotionEstimation ( pcCU, pcOrgYuv, iPartIdx, eRefPicList, &cMvPred[iRefList][iRefIdxTemp], iRefIdxTemp, cMvTemp[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp ); 6319 xCheckBestMVP(pcCU, eRefPicList, cMvTemp[iRefList][iRefIdxTemp], cMvPred[iRefList][iRefIdxTemp], aaiMvpIdx[iRefList][iRefIdxTemp], uiBitsTemp, uiCostTemp); 6320 6321 if( uiCostTemp < uiCost[iRefList] ) 6322 { 6323 uiCost[iRefList] = uiCostTemp; 6324 6325 cMv[iRefList] = cMvTemp[iRefList][iRefIdxTemp]; 6326 iRefIdx[iRefList] = iRefIdxTemp; 6327 6328 pcCU->getCUMvField(eRefPicList)->setAllMv( cMv[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 6329 pcCU->getCUMvField(eRefPicList)->setAllRefIdx( iRefIdx[iRefList], ePartSize, uiPartAddr, 0, iPartIdx ); 6330 } 6331 } 6332 6333 if( uiCost[0] == MAX_UINT && uiCost[1] == MAX_UINT ) //no ILR in both list0 and list1 6334 return false; 6335 6336 // Clear Motion Field 6337 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvField( TComMvField(), ePartSize, uiPartAddr, 0, iPartIdx ); 6338 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvField( TComMvField(), ePartSize, uiPartAddr, 0, iPartIdx ); 6339 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd ( TComMv(), ePartSize, uiPartAddr, 0, iPartIdx ); 6340 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd ( TComMv(), ePartSize, uiPartAddr, 0, iPartIdx ); 6341 6342 pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6343 pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6344 pcCU->setMVPIdxSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6345 pcCU->setMVPNumSubParts( -1, REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6346 6347 if( uiCost[0] <= uiCost[1] ) //list0 ILR 6348 { 6349 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMv ( cMv[0], ePartSize, uiPartAddr, 0, iPartIdx ); 6350 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllRefIdx( iRefIdx[0], ePartSize, uiPartAddr, 0, iPartIdx ); 6351 6352 TempMv = cMv[0] - cMvPred[0][iRefIdx[0]]; 6353 pcCU->getCUMvField(REF_PIC_LIST_0)->setAllMvd( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 6354 6355 pcCU->setInterDirSubParts( 1, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 6356 6357 pcCU->setMVPIdxSubParts( aaiMvpIdx[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6358 pcCU->setMVPNumSubParts( aaiMvpNum[0][iRefIdx[0]], REF_PIC_LIST_0, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6359 } 6360 else if( uiCost[1] < uiCost[0] ) //list1 ILR 6361 { 6362 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMv ( cMv[1], ePartSize, uiPartAddr, 0, iPartIdx ); 6363 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllRefIdx( iRefIdx[1], ePartSize, uiPartAddr, 0, iPartIdx ); 6364 6365 TempMv = cMv[1] - cMvPred[1][iRefIdx[1]]; 6366 pcCU->getCUMvField(REF_PIC_LIST_1)->setAllMvd( TempMv, ePartSize, uiPartAddr, 0, iPartIdx ); 6367 6368 pcCU->setInterDirSubParts( 2, uiPartAddr, iPartIdx, pcCU->getDepth(0) ); 6369 6370 pcCU->setMVPIdxSubParts( aaiMvpIdx[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6371 pcCU->setMVPNumSubParts( aaiMvpNum[1][iRefIdx[1]], REF_PIC_LIST_1, uiPartAddr, iPartIdx, pcCU->getDepth(uiPartAddr)); 6372 } 6373 else 6374 assert(0); 6375 6376 pcCU->setMergeFlagSubParts( false, uiPartAddr, iPartIdx, pcCU->getDepth( uiPartAddr ) ); 6377 6378 motionCompensation ( pcCU, rpcPredYuv, REF_PIC_LIST_X, iPartIdx ); 6379 6380 setWpScalingDistParam( pcCU, -1, REF_PIC_LIST_X ); 6381 6382 return true; 6383 } 6384 6385 6386 #endif 6387 6388 #if INTRA_BL 6389 Void 6390 TEncSearch::estIntraBLPredQT( TComDataCU* pcCU, 6391 TComYuv* pcOrgYuv, 6392 TComYuv* pcPredYuv, 6393 TComYuv* pcResiYuv, 6394 TComYuv* pcRecoYuv ) 6395 { 6396 UInt uiDepth = pcCU->getDepth(0); 6397 UInt uiOverallDistY = 0; 6398 UInt uiOverallDistC = 0; 6399 6400 //===== set QP and clear Cbf ===== 6401 if ( pcCU->getSlice()->getPPS()->getUseDQP() == true) 6402 { 6403 pcCU->setQPSubParts( pcCU->getQP(0), 0, uiDepth ); 6404 } 6405 else 6406 { 6407 pcCU->setQPSubParts( pcCU->getSlice()->getSliceQp(), 0, uiDepth ); 6408 } 6409 6410 //===== init pattern for luma prediction ===== 6411 Bool bAboveAvail = false; 6412 Bool bLeftAvail = false; 6413 pcCU->getPattern()->initPattern ( pcCU, 0, 0 ); 6414 pcCU->getPattern()->initAdiPattern( pcCU, 0, 0, m_piYuvExt, m_iYuvExtStride, m_iYuvExtHeight, bAboveAvail, bLeftAvail ); 6415 6416 pcCU->setLumaIntraDirSubParts ( DC_IDX, 0, uiDepth ); 6417 6418 // set context models 6419 if( m_bUseSBACRD ) 6420 { 6421 m_pcRDGoOnSbacCoder->load( m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST] ); 6422 } 6423 6424 // determine residual for partition 6425 Double dPUCost = 0.0; 6426 xRecurIntraCodingQT( pcCU, 0, 0, false, pcOrgYuv, pcPredYuv, pcResiYuv, uiOverallDistY, uiOverallDistC, false, dPUCost ); 6427 xSetIntraResultQT( pcCU, 0, 0, false, pcRecoYuv ); 6428 6429 //=== update PU data ==== 6430 pcCU->copyToPic( uiDepth, 0, 0 ); 6431 6432 //===== reset context models ===== 6433 if(m_bUseSBACRD) 6434 { 6435 m_pcRDGoOnSbacCoder->load(m_pppcRDSbacCoder[uiDepth][CI_CURR_BEST]); 6436 } 6437 6438 //===== set distortion (rate and r-d costs are determined later) ===== 6439 pcCU->getTotalDistortion() = uiOverallDistY + uiOverallDistC; 6440 } 6441 6442 #endif 5954 6443 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSearch.h
r51 r54 97 97 TEncCfg* m_pcEncCfg; 98 98 99 #if SVC_EXTENSION 100 TEncTop** m_ppcTEncTop; 101 #if INTRA_BL 102 TComPicYuv* m_pcPicYuvRecBase; ///< reconstructed base layer 103 #endif 104 #endif 105 99 106 // interface to classes 100 107 TComTrQuant* m_pcTrQuant; … … 186 193 UInt uiPreCalcDistC ); 187 194 195 #if INTRA_BL 196 Void setBaseRecPic ( TComPicYuv* pcPicYuvRecBase ) { m_pcPicYuvRecBase = pcPicYuvRecBase; } 197 TComPicYuv* getBaseRecPic () { return m_pcPicYuvRecBase; } 198 Void estIntraBLPredQT ( TComDataCU* pcCU, 199 TComYuv* pcOrgYuv, 200 TComYuv* pcPredYuv, 201 TComYuv* pcResiYuv, 202 TComYuv* pcRecoYuv ); 203 #endif 188 204 189 205 /// encoder estimation - inter prediction (non-skip) … … 198 214 #endif 199 215 ); 216 217 #if (ENCODER_FAST_MODE) 218 Bool predInterSearchILRUni ( TComDataCU* pcCU, 219 TComYuv* pcOrgYuv, 220 TComYuv*& rpcPredYuv, 221 TComYuv*& rpcResiYuv, 222 TComYuv*& rpcRecoYuv 223 ); 224 225 #endif 200 226 201 227 /// encode residual and compute rd-cost for inter mode … … 436 462 ,Bool biPred 437 463 ); 438 464 #if REF_IDX_ME_AROUND_ZEROMV 465 Void xPatternSearchILR ( TComDataCU* pcCU, 466 TComPattern* pcPatternKey, 467 Pel* piRefY, 468 Int iRefStride, 469 TComMv& rcMv, 470 UInt& ruiSAD ); 471 #endif 472 473 #if REF_IDX_ME_ZEROMV 474 Void xPatternSearchFracDIFMv0 ( TComDataCU* pcCU, 475 TComPattern* pcPatternKey, 476 Pel* piRefY, 477 Int iRefStride, 478 TComMv* pcMvInt, 479 TComMv& rcMvHalf, 480 TComMv& rcMvQter, 481 UInt& ruiCost, 482 Bool biPred ); 483 #endif 439 484 Void xExtDIFUpSamplingH( TComPattern* pcPattern, Bool biPred ); 440 485 Void xExtDIFUpSamplingQ( TComPattern* pcPatternKey, TComMv halfPelRef, Bool biPred ); -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSlice.cpp
r51 r54 137 137 m_pcCfg = pcEncTop; 138 138 m_pcListPic = pcEncTop->getListPic(); 139 139 #if SVC_EXTENSION 140 m_ppcTEncTop = pcEncTop->getLayerEnc(); 141 #endif 140 142 m_pcGOPEncoder = pcEncTop->getGOPEncoder(); 141 143 m_pcCuEncoder = pcEncTop->getCuEncoder(); … … 186 188 rpcSlice->setSliceBits(0); 187 189 rpcSlice->setPic( pcPic ); 190 #if SET_SLICE_LAYER_ID 191 rpcSlice->initSlice( pcPic->getLayerId() ); 192 #else 188 193 rpcSlice->initSlice(); 194 #endif 189 195 rpcSlice->setPicOutputFlag( true ); 190 196 rpcSlice->setPOC( pocCurr ); 197 #if SVC_EXTENSION && !SET_SLICE_LAYER_ID 198 rpcSlice->setLayerId( pcPic->getLayerId()); 199 #endif 191 200 192 201 // depth computation based on GOP size … … 369 378 eSliceType = (pocLast == 0 || pocCurr % m_pcCfg->getIntraPeriod() == 0 || m_pcGOPEncoder->getGOPSize() == 0) ? I_SLICE : eSliceType; 370 379 380 #if REF_IDX_FRAMEWORK 381 if(m_pcCfg->getLayerId() > 0) 382 { 383 eSliceType=B_SLICE; 384 } 385 #endif 371 386 rpcSlice->setSliceType ( eSliceType ); 372 387 #endif … … 877 892 UInt uiTileStartLCU = 0; 878 893 UInt uiTileLCUX = 0; 894 895 #if INTRA_BL 896 m_pcCuEncoder->setBaseRecPic( rpcPic->getLayerId() > 0 ? rpcPic->getFullPelBaseRec() : NULL); 897 #endif 898 879 899 Bool depSliceSegmentsEnabled = pcSlice->getPPS()->getDependentSliceSegmentsEnabledFlag(); 880 900 uiCUAddr = rpcPic->getPicSym()->getCUOrderMap( uiStartCUAddr /rpcPic->getNumPartInCU()); … … 924 944 TComDataCU*& pcCU = rpcPic->getCU( uiCUAddr ); 925 945 pcCU->initCU( rpcPic, uiCUAddr ); 946 #if SVC_EXTENSION 947 pcCU->setLayerId(m_pcCfg->getLayerId()); 948 #endif 926 949 927 950 #if !RATE_CONTROL_LAMBDA_DOMAIN -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncSlice.h
r51 r54 66 66 TEncCfg* m_pcCfg; ///< encoder configuration class 67 67 68 #if SVC_EXTENSION 69 TEncTop** m_ppcTEncTop; 70 #endif 71 68 72 // pictures 69 73 TComList<TComPic*>* m_pcListPic; ///< list of pictures -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncTop.cpp
r51 r54 45 45 //! \ingroup TLibEncoder 46 46 //! \{ 47 #if SVC_EXTENSION 48 Int TEncTop::m_iSPSIdCnt = 0; 49 Int TEncTop::m_iPPSIdCnt = 0; 50 #endif 47 51 48 52 // ==================================================================================================================== … … 78 82 m_pcBitCounters = NULL; 79 83 m_pcRdCosts = NULL; 84 #if REF_IDX_FRAMEWORK 85 memset(m_cIlpPic, 0, sizeof(m_cIlpPic)); 86 #endif 87 #if REF_IDX_MFM 88 m_bMFMEnabledFlag = false; 89 #endif 80 90 } 81 91 … … 89 99 Void TEncTop::create () 90 100 { 101 #if !SVC_EXTENSION 91 102 // initialize global variables 92 103 initROM(); 104 #endif 93 105 94 106 // create processing unit classes 107 #if SVC_EXTENSION 108 m_cGOPEncoder. create( m_layerId ); 109 #else 95 110 m_cGOPEncoder. create(); 111 #endif 96 112 m_cSliceEncoder. create( getSourceWidth(), getSourceHeight(), g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth ); 97 113 m_cCuEncoder. create( g_uiMaxCUDepth, g_uiMaxCUWidth, g_uiMaxCUHeight ); … … 268 284 delete[] m_pcRdCosts; 269 285 286 #if !SVC_EXTENSION 270 287 // destroy ROM 271 288 destroyROM(); 272 289 #endif 290 #if REF_IDX_FRAMEWORK 291 for(Int i=0; i<MAX_NUM_REF; i++) 292 { 293 if(m_cIlpPic[i]) 294 { 295 //m_cIlpPic[i]->setPicYuvRec(NULL); 296 m_cIlpPic[i]->destroy(); 297 delete m_cIlpPic[i]; 298 m_cIlpPic[i] = NULL; 299 } 300 } 301 #endif 273 302 return; 274 303 } … … 313 342 314 343 m_iMaxRefPicNum = 0; 344 #if SVC_EXTENSION 345 m_iSPSIdCnt ++; 346 m_iPPSIdCnt ++; 347 #endif 348 #if REF_IDX_FRAMEWORK 349 xInitILRP(); 350 #endif 315 351 } 316 352 … … 345 381 \retval iNumEncoded number of encoded pictures 346 382 */ 347 Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded ) 383 #if SVC_EXTENSION 384 Void TEncTop::encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP ) 385 { 386 // compress GOP 387 #if RATE_CONTROL_LAMBDA_DOMAIN 388 if ( m_RCEnableRateControl ) 389 { 390 m_cRateCtrl.initRCGOP( m_iNumPicRcvd ); 391 } 392 #endif 393 394 // compress GOP 395 m_cGOPEncoder.compressGOP(iPicIdInGOP, m_iPOCLast, m_iNumPicRcvd, m_cListPic, rcListPicYuvRecOut, accessUnitsOut); 396 397 #if RATE_CONTROL_LAMBDA_DOMAIN 398 if ( m_RCEnableRateControl ) 399 { 400 m_cRateCtrl.destroyRCGOP(); 401 } 402 #endif 403 404 m_uiNumAllPicCoded ++; 405 } 406 407 Void TEncTop::encodePrep( TComPicYuv* pcPicYuvOrg ) 348 408 { 349 409 if (pcPicYuvOrg) { … … 359 419 } 360 420 } 421 } 422 #else 423 Void TEncTop::encode(Bool flush, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded ) 424 { 425 if (pcPicYuvOrg) { 426 // get original YUV 427 TComPic* pcPicCurr = NULL; 428 xGetNewPicBuffer( pcPicCurr ); 429 pcPicYuvOrg->copyToPic( pcPicCurr->getPicYuvOrg() ); 430 431 // compute image characteristics 432 if ( getUseAdaptiveQP() ) 433 { 434 m_cPreanalyzer.xPreanalyze( dynamic_cast<TEncPic*>( pcPicCurr ) ); 435 } 436 } 361 437 362 438 if (!m_iNumPicRcvd || (!flush && m_iPOCLast != 0 && m_iNumPicRcvd != m_iGOPSize && m_iGOPSize)) … … 387 463 m_uiNumAllPicCoded += iNumEncoded; 388 464 } 465 #endif 389 466 390 467 // ==================================================================================================================== … … 421 498 { 422 499 TEncPic* pcEPic = new TEncPic; 500 #if SVC_EXTENSION //Temporal solution, should be modified 501 if(m_layerId > 0) 502 { 503 TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 ); 504 if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() ) 505 { 506 pcEPic->setSpatialEnhLayerFlag( true ); 507 } 508 } 509 #endif 510 511 #if SVC_UPSAMPLING 512 pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 , 513 m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS); 514 #else 423 515 pcEPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, m_cPPS.getMaxCuDQPDepth()+1 , 424 516 m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics); 517 #endif 425 518 rpcPic = pcEPic; 426 519 } … … 429 522 rpcPic = new TComPic; 430 523 524 #if SVC_EXTENSION //Temporal solution, should be modified 525 if(m_layerId > 0) 526 { 527 TEncTop *pcEncTopBase = (TEncTop *)getLayerEnc( m_layerId-1 ); 528 if(m_iSourceWidth != pcEncTopBase->getSourceWidth() || m_iSourceHeight != pcEncTopBase->getSourceHeight() ) 529 { 530 rpcPic->setSpatialEnhLayerFlag( true ); 531 } 532 } 533 #endif 534 535 #if SVC_UPSAMPLING 536 rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 537 m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics, &m_cSPS); 538 #else 431 539 rpcPic->create( m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, 432 540 m_conformanceWindow, m_defaultDisplayWindow, m_numReorderPics); 541 #endif 433 542 } 434 543 if (getUseSAO()) … … 450 559 Void TEncTop::xInitSPS() 451 560 { 561 #if SVC_EXTENSION 562 m_cSPS.setLayerId(m_layerId); 563 #endif 564 #if REF_IDX_MFM 565 m_cSPS.setMFMEnabledFlag(m_bMFMEnabledFlag); 566 #endif 452 567 ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL(); 453 568 profileTierLevel.setLevelIdc(m_level); … … 484 599 m_cSPS.setMinTrDepth ( 0 ); 485 600 m_cSPS.setMaxTrDepth ( 1 ); 601 #if SVC_EXTENSION 602 m_cSPS.setSPSId ( m_iSPSIdCnt ); 603 #endif 486 604 487 605 m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize); … … 690 808 } 691 809 } 810 #if SVC_EXTENSION 811 m_cPPS.setPPSId ( m_iPPSIdCnt ); 812 m_cPPS.setSPSId ( m_iSPSIdCnt ); 813 #endif 692 814 } 693 815 … … 981 1103 } 982 1104 } 1105 1106 #if REF_IDX_FRAMEWORK 1107 Void TEncTop::xInitILRP() 1108 { 1109 if(m_layerId>0) 1110 { 1111 if (m_cIlpPic[0] == NULL) 1112 { 1113 for (Int j=0; j<1/*MAX_NUM_REF*/; j++) 1114 { 1115 m_cIlpPic[j] = new TComPic; 1116 //m_cIlpPic[j]->createWithOutYuv(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true); 1117 #if SVC_UPSAMPLING 1118 m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, &m_cSPS, true); 1119 #else 1120 m_cIlpPic[j]->create(m_iSourceWidth, m_iSourceHeight, g_uiMaxCUWidth, g_uiMaxCUHeight, g_uiMaxCUDepth, true); 1121 #endif 1122 #if REF_IDX_ME_AROUND_ZEROMV || REF_IDX_ME_ZEROMV || ENCODER_FAST_MODE || REF_IDX_MFM 1123 m_cIlpPic[j]->setIsILR(true); 1124 #endif 1125 for (Int i=0; i<m_cIlpPic[j]->getPicSym()->getNumberOfCUsInFrame(); i++) 1126 { 1127 m_cIlpPic[j]->getPicSym()->getCU(i)->initCU(m_cIlpPic[j], i); 1128 } 1129 } 1130 } 1131 } 1132 } 1133 1134 Void TEncTop::setILRPic(TComPic *pcPic) 1135 { 1136 if(m_cIlpPic[0]) 1137 { 1138 //m_cIlpPic[0]->setPicYuvRec(pcPic->getFullPelBaseRec()); 1139 m_cIlpPic[0]->copyUpsampledPictureYuv(pcPic->getFullPelBaseRec(), m_cIlpPic[0]->getPicYuvRec()); 1140 m_cIlpPic[0]->getSlice(0)->setPOC(pcPic->getPOC()); 1141 m_cIlpPic[0]->getPicYuvRec()->setBorderExtension(false); 1142 m_cIlpPic[0]->getPicYuvRec()->extendPicBorder(); 1143 } 1144 } 1145 #endif 983 1146 //! \} -
branches/HM-10.0-dev-SHM/source/Lib/TLibEncoder/TEncTop.h
r51 r54 73 73 UInt m_uiNumAllPicCoded; ///< number of coded pictures 74 74 TComList<TComPic*> m_cListPic; ///< dynamic list of pictures 75 #if SVC_EXTENSION 76 static Int m_iSPSIdCnt; ///< next Id number for SPS 77 static Int m_iPPSIdCnt; ///< next Id number for PPS 78 #if AVC_SYNTAX 79 fstream* m_pBLSyntaxFile; 80 #endif 81 #endif 75 82 76 83 // encoder search … … 122 129 TEncRateCtrl m_cRateCtrl; ///< Rate control class 123 130 131 #if SVC_EXTENSION 132 TEncTop** m_ppcTEncTop; 133 TEncTop* getLayerEnc(UInt layer) { return m_ppcTEncTop[layer]; } 134 #endif 135 #if REF_IDX_FRAMEWORK 136 TComPic* m_cIlpPic[MAX_NUM_REF]; ///< Inter layer Prediction picture = upsampled picture 137 #endif 138 #if REF_IDX_MFM 139 Bool m_bMFMEnabledFlag; 140 #endif 124 141 protected: 125 142 Void xGetNewPicBuffer ( TComPic*& rpcPic ); ///< get picture buffer which will be processed … … 129 146 Void xInitPPSforTiles (); 130 147 Void xInitRPS (); ///< initialize PPS from encoder options 131 148 #if REF_IDX_FRAMEWORK 149 Void xInitILRP(); 150 #endif 132 151 public: 133 152 TEncTop(); … … 174 193 Void selectReferencePictureSet(TComSlice* slice, Int POCCurr, Int GOPid ); 175 194 TComScalingList* getScalingList () { return &m_scalingList; } 195 #if SVC_EXTENSION 196 Void setLayerEnc(TEncTop** p) {m_ppcTEncTop = p;} 197 TEncTop** getLayerEnc() {return m_ppcTEncTop;} 198 Int getPOCLast () { return m_iPOCLast; } 199 Int getNumPicRcvd () { return m_iNumPicRcvd; } 200 Void setNumPicRcvd ( Int num ) { m_iNumPicRcvd = num; } 201 #endif 202 176 203 // ------------------------------------------------------------------------------------------------------------------- 177 204 // encoder function … … 179 206 180 207 /// encode several number of pictures until end-of-sequence 208 #if SVC_EXTENSION 209 #if REF_IDX_FRAMEWORK 210 TComPic** getIlpList() { return m_cIlpPic; } 211 Void setILRPic(TComPic *pcPic); 212 #endif 213 #if REF_IDX_MFM 214 Void setMFMEnabledFlag (Bool flag) {m_bMFMEnabledFlag = flag;} 215 Bool getMFMEnabledFlag() {return m_bMFMEnabledFlag;} 216 #endif 217 #if AVC_SYNTAX 218 Void setBLSyntaxFile( fstream* pFile ) { m_pBLSyntaxFile = pFile; } 219 fstream* getBLSyntaxFile() { return m_pBLSyntaxFile; } 220 #endif 221 Void encode( TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, 222 std::list<AccessUnit>& accessUnitsOut, Int iPicIdInGOP ); 223 Void encodePrep( TComPicYuv* pcPicYuvOrg ); 224 #else 181 225 Void encode( Bool bEos, TComPicYuv* pcPicYuvOrg, TComList<TComPicYuv*>& rcListPicYuvRecOut, 182 226 std::list<AccessUnit>& accessUnitsOut, Int& iNumEncoded ); 227 #endif 183 228 184 229 void printSummary() { m_cGOPEncoder.printOutSummary (m_uiNumAllPicCoded); }
Note: See TracChangeset for help on using the changeset viewer.