// initialize ROM variables Void initROM() { Int i, c; // g_aucConvertToBit[ x ]: log2(x/4), if x=4 -> 0, x=8 -> 1, x=16 -> 2, ... ::memset( g_aucConvertToBit, -1, sizeof( g_aucConvertToBit ) ); c=0; for ( i=4; i<=MAX_CU_SIZE; i*=2 ) { g_aucConvertToBit[ i ] = c; c++; } // initialise scan orders for(UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++) { for(UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++) { const UInt blockWidth = 1 << log2BlockWidth; const UInt blockHeight = 1 << log2BlockHeight; const UInt totalValues = blockWidth * blockHeight; //-------------------------------------------------------------------------------------------------- //non-grouped scan orders for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++) { const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex); g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues]; ScanGenerator fullBlockScan(blockWidth, blockHeight, blockWidth, scanType); for (UInt scanPosition = 0; scanPosition < totalValues; scanPosition++) { g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight][scanPosition] = fullBlockScan.GetNextIndex(0, 0); } } //-------------------------------------------------------------------------------------------------- //grouped scan orders const UInt groupWidth = 1 << MLS_CG_LOG2_WIDTH; const UInt groupHeight = 1 << MLS_CG_LOG2_HEIGHT; const UInt widthInGroups = blockWidth >> MLS_CG_LOG2_WIDTH; const UInt heightInGroups = blockHeight >> MLS_CG_LOG2_HEIGHT; const UInt groupSize = groupWidth * groupHeight; const UInt totalGroups = widthInGroups * heightInGroups; for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++) { const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex); g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues]; ScanGenerator fullBlockScan(widthInGroups, heightInGroups, groupWidth, scanType); for (UInt groupIndex = 0; groupIndex < totalGroups; groupIndex++) { const UInt groupPositionY = fullBlockScan.GetCurrentY(); const UInt groupPositionX = fullBlockScan.GetCurrentX(); const UInt groupOffsetX = groupPositionX * groupWidth; const UInt groupOffsetY = groupPositionY * groupHeight; const UInt groupOffsetScan = groupIndex * groupSize; ScanGenerator groupScan(groupWidth, groupHeight, blockWidth, scanType); for (UInt scanPosition = 0; scanPosition < groupSize; scanPosition++) { g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight][groupOffsetScan + scanPosition] = groupScan.GetNextIndex(groupOffsetX, groupOffsetY); } fullBlockScan.GetNextIndex(0,0); } } //-------------------------------------------------------------------------------------------------- } } }
// initialize ROM variables Void initROM() { Int i, c; // g_aucConvertToBit[ x ]: log2(x/4), if x=4 -> 0, x=8 -> 1, x=16 -> 2, ... ::memset( g_aucConvertToBit, -1, sizeof( g_aucConvertToBit ) ); c=0; for ( i=4; i<=MAX_CU_SIZE; i*=2 ) { g_aucConvertToBit[ i ] = c; c++; } // initialise scan orders for(UInt log2BlockHeight = 0; log2BlockHeight < MAX_CU_DEPTH; log2BlockHeight++) { for(UInt log2BlockWidth = 0; log2BlockWidth < MAX_CU_DEPTH; log2BlockWidth++) { const UInt blockWidth = 1 << log2BlockWidth; const UInt blockHeight = 1 << log2BlockHeight; const UInt totalValues = blockWidth * blockHeight; //-------------------------------------------------------------------------------------------------- //non-grouped scan orders for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++) { const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex); g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues]; ScanGenerator fullBlockScan(blockWidth, blockHeight, blockWidth, scanType); for (UInt scanPosition = 0; scanPosition < totalValues; scanPosition++) { g_scanOrder[SCAN_UNGROUPED][scanType][log2BlockWidth][log2BlockHeight][scanPosition] = fullBlockScan.GetNextIndex(0, 0); } } //-------------------------------------------------------------------------------------------------- //grouped scan orders const UInt groupWidth = 1 << MLS_CG_LOG2_WIDTH; const UInt groupHeight = 1 << MLS_CG_LOG2_HEIGHT; const UInt widthInGroups = blockWidth >> MLS_CG_LOG2_WIDTH; const UInt heightInGroups = blockHeight >> MLS_CG_LOG2_HEIGHT; const UInt groupSize = groupWidth * groupHeight; const UInt totalGroups = widthInGroups * heightInGroups; for (UInt scanTypeIndex = 0; scanTypeIndex < SCAN_NUMBER_OF_TYPES; scanTypeIndex++) { const COEFF_SCAN_TYPE scanType = COEFF_SCAN_TYPE(scanTypeIndex); g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight] = new UInt[totalValues]; ScanGenerator fullBlockScan(widthInGroups, heightInGroups, groupWidth, scanType); for (UInt groupIndex = 0; groupIndex < totalGroups; groupIndex++) { const UInt groupPositionY = fullBlockScan.GetCurrentY(); const UInt groupPositionX = fullBlockScan.GetCurrentX(); const UInt groupOffsetX = groupPositionX * groupWidth; const UInt groupOffsetY = groupPositionY * groupHeight; const UInt groupOffsetScan = groupIndex * groupSize; ScanGenerator groupScan(groupWidth, groupHeight, blockWidth, scanType); for (UInt scanPosition = 0; scanPosition < groupSize; scanPosition++) { g_scanOrder[SCAN_GROUPED_4x4][scanType][log2BlockWidth][log2BlockHeight][groupOffsetScan + scanPosition] = groupScan.GetNextIndex(groupOffsetX, groupOffsetY); } fullBlockScan.GetNextIndex(0,0); } } //-------------------------------------------------------------------------------------------------- } } #if NH_MV #if NH_MV_HLS_PTL_LIMITS g_generalTierAndLevelLimits[ Level::LEVEL1 ] = TComGeneralTierAndLevelLimits( 36864, 350, MIN_INT, 16, 1, 1 ); g_generalTierAndLevelLimits[ Level::LEVEL2 ] = TComGeneralTierAndLevelLimits( 122880, 1500, MIN_INT, 16, 1, 1 ); g_generalTierAndLevelLimits[ Level::LEVEL2_1 ] = TComGeneralTierAndLevelLimits( 245760, 3000, MIN_INT, 20, 1, 1 ); g_generalTierAndLevelLimits[ Level::LEVEL3 ] = TComGeneralTierAndLevelLimits( 552960, 6000, MIN_INT, 30, 2, 2 ); g_generalTierAndLevelLimits[ Level::LEVEL3_1 ] = TComGeneralTierAndLevelLimits( 983040, 10000, MIN_INT, 40, 3, 3 ); g_generalTierAndLevelLimits[ Level::LEVEL4 ] = TComGeneralTierAndLevelLimits( 2228224, 12000, 30000, 75, 5, 5 ); g_generalTierAndLevelLimits[ Level::LEVEL4_1 ] = TComGeneralTierAndLevelLimits( 2228224, 20000, 50000, 75, 5, 5 ); g_generalTierAndLevelLimits[ Level::LEVEL5 ] = TComGeneralTierAndLevelLimits( 8912896, 25000, 100000, 200, 11, 10 ); g_generalTierAndLevelLimits[ Level::LEVEL5_1 ] = TComGeneralTierAndLevelLimits( 8912896, 40000, 160000, 200, 11, 10 ); g_generalTierAndLevelLimits[ Level::LEVEL5_2 ] = TComGeneralTierAndLevelLimits( 8912896, 60000, 240000, 200, 11, 10 ); g_generalTierAndLevelLimits[ Level::LEVEL6 ] = TComGeneralTierAndLevelLimits( 35651584, 60000, 240000, 600, 22, 20 ); g_generalTierAndLevelLimits[ Level::LEVEL6_1 ] = TComGeneralTierAndLevelLimits( 35651584, 120000, 480000, 600, 22, 20 ); g_generalTierAndLevelLimits[ Level::LEVEL6_2 ] = TComGeneralTierAndLevelLimits( 35651584, 240000, 800000, 600, 22, 20 ); #endif #endif }
Void getTUEntropyCodingParameters( TUEntropyCodingParameters &result, TComTU &rTu, const ComponentID component) { //------------------------------------------------ //set the local parameters TComDataCU *const pcCU = rTu.getCU(); const TComRectangle & area = rTu.getRect(component); const UInt uiAbsPartIdx = rTu.GetAbsPartIdxTU(component); const UInt log2BlockWidth = g_aucConvertToBit[area.width] + 2; const UInt log2BlockHeight = g_aucConvertToBit[area.height] + 2; const ChannelType channelType = toChannelType(component); result.scanType = COEFF_SCAN_TYPE(pcCU->getCoefScanIdx(uiAbsPartIdx, area.width, area.height, component)); //------------------------------------------------ //set the group layout result.widthInGroups = area.width >> MLS_CG_LOG2_WIDTH; result.heightInGroups = area.height >> MLS_CG_LOG2_HEIGHT; //------------------------------------------------ //set the scan orders const UInt log2WidthInGroups = g_aucConvertToBit[result.widthInGroups * 4]; const UInt log2HeightInGroups = g_aucConvertToBit[result.heightInGroups * 4]; result.scan = g_scanOrder[ SCAN_GROUPED_4x4 ][ result.scanType ][ log2BlockWidth ][ log2BlockHeight ]; result.scanCG = g_scanOrder[ SCAN_UNGROUPED ][ result.scanType ][ log2WidthInGroups ][ log2HeightInGroups ]; //------------------------------------------------ //set the significance map context selection parameters if (pcCU->getSlice()->getSPS()->getUseSingleSignificanceMapContext() && (pcCU->getCUTransquantBypass(uiAbsPartIdx) || (pcCU->getTransformSkip(uiAbsPartIdx, component) != 0))) { result.firstSignificanceMapContext = significanceMapContextSetStart[channelType][CONTEXT_TYPE_SINGLE]; } else { if ((area.width == 4) && (area.height == 4)) { result.firstSignificanceMapContext = significanceMapContextSetStart[channelType][CONTEXT_TYPE_4x4]; } else if ((area.width == 8) && (area.height == 8)) { result.firstSignificanceMapContext = significanceMapContextSetStart[channelType][CONTEXT_TYPE_8x8]; if (result.scanType != SCAN_DIAG) result.firstSignificanceMapContext += nonDiagonalScan8x8ContextOffset[channelType]; } else { result.firstSignificanceMapContext = significanceMapContextSetStart[channelType][CONTEXT_TYPE_NxN]; } } //------------------------------------------------ }