// 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 }
// 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); } } //-------------------------------------------------------------------------------------------------- } } }