Void TEncTop::xInitSPS() { ProfileTierLevel& profileTierLevel = *m_cSPS.getPTL()->getGeneralPTL(); profileTierLevel.setLevelIdc(m_level); profileTierLevel.setTierFlag(m_levelTier); profileTierLevel.setProfileIdc(m_profile); profileTierLevel.setProfileCompatibilityFlag(m_profile, 1); profileTierLevel.setProgressiveSourceFlag(m_progressiveSourceFlag); profileTierLevel.setInterlacedSourceFlag(m_interlacedSourceFlag); profileTierLevel.setNonPackedConstraintFlag(m_nonPackedConstraintFlag); profileTierLevel.setFrameOnlyConstraintFlag(m_frameOnlyConstraintFlag); profileTierLevel.setBitDepthConstraint(m_bitDepthConstraintValue); profileTierLevel.setChromaFormatConstraint(m_chromaFormatConstraintValue); profileTierLevel.setIntraConstraintFlag(m_intraConstraintFlag); profileTierLevel.setLowerBitRateConstraintFlag(m_lowerBitRateConstraintFlag); if ((m_profile == Profile::MAIN10) && (m_bitDepth[CHANNEL_TYPE_LUMA] == 8) && (m_bitDepth[CHANNEL_TYPE_CHROMA] == 8)) { /* The above constraint is equal to Profile::MAIN */ profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN, 1); } if (m_profile == Profile::MAIN) { /* A Profile::MAIN10 decoder can always decode Profile::MAIN */ profileTierLevel.setProfileCompatibilityFlag(Profile::MAIN10, 1); } /* XXX: should Main be marked as compatible with still picture? */ /* XXX: may be a good idea to refactor the above into a function * that chooses the actual compatibility based upon options */ m_cSPS.setPicWidthInLumaSamples ( m_iSourceWidth ); m_cSPS.setPicHeightInLumaSamples ( m_iSourceHeight ); m_cSPS.setConformanceWindow ( m_conformanceWindow ); m_cSPS.setMaxCUWidth ( m_maxCUWidth ); m_cSPS.setMaxCUHeight ( m_maxCUHeight ); m_cSPS.setMaxTotalCUDepth ( m_maxTotalCUDepth ); m_cSPS.setChromaFormatIdc( m_chromaFormatIDC); m_cSPS.setLog2DiffMaxMinCodingBlockSize(m_log2DiffMaxMinCodingBlockSize); Int minCUSize = m_cSPS.getMaxCUWidth() >> ( m_cSPS.getLog2DiffMaxMinCodingBlockSize() ); Int log2MinCUSize = 0; while(minCUSize > 1) { minCUSize >>= 1; log2MinCUSize++; } m_cSPS.setLog2MinCodingBlockSize(log2MinCUSize); m_cSPS.setPCMLog2MinSize (m_uiPCMLog2MinSize); m_cSPS.setUsePCM ( m_usePCM ); m_cSPS.setPCMLog2MaxSize( m_pcmLog2MaxSize ); m_cSPS.setQuadtreeTULog2MaxSize( m_uiQuadtreeTULog2MaxSize ); m_cSPS.setQuadtreeTULog2MinSize( m_uiQuadtreeTULog2MinSize ); m_cSPS.setQuadtreeTUMaxDepthInter( m_uiQuadtreeTUMaxDepthInter ); m_cSPS.setQuadtreeTUMaxDepthIntra( m_uiQuadtreeTUMaxDepthIntra ); m_cSPS.setTMVPFlagsPresent((getTMVPModeId() == 2 || getTMVPModeId() == 1)); m_cSPS.setMaxTrSize ( 1 << m_uiQuadtreeTULog2MaxSize ); m_cSPS.setUseAMP ( m_useAMP ); for (UInt channelType = 0; channelType < MAX_NUM_CHANNEL_TYPE; channelType++) { m_cSPS.setBitDepth (ChannelType(channelType), m_bitDepth[channelType] ); #if O0043_BEST_EFFORT_DECODING m_cSPS.setStreamBitDepth(ChannelType(channelType), m_bitDepth[channelType] ); #endif m_cSPS.setQpBDOffset (ChannelType(channelType), (6 * (m_bitDepth[channelType] - 8))); m_cSPS.setPCMBitDepth (ChannelType(channelType), m_PCMBitDepth[channelType] ); } m_cSPS.setUseExtendedPrecision(m_useExtendedPrecision); m_cSPS.setUseHighPrecisionPredictionWeighting(m_useHighPrecisionPredictionWeighting); m_cSPS.setUseSAO( m_bUseSAO ); m_cSPS.setUseResidualRotation(m_useResidualRotation); m_cSPS.setUseSingleSignificanceMapContext(m_useSingleSignificanceMapContext); m_cSPS.setUseGolombRiceParameterAdaptation(m_useGolombRiceParameterAdaptation); m_cSPS.setAlignCABACBeforeBypass(m_alignCABACBeforeBypass); for (UInt signallingModeIndex = 0; signallingModeIndex < NUMBER_OF_RDPCM_SIGNALLING_MODES; signallingModeIndex++) { m_cSPS.setUseResidualDPCM(RDPCMSignallingMode(signallingModeIndex), m_useResidualDPCM[signallingModeIndex]); } m_cSPS.setMaxTLayers( m_maxTempLayer ); m_cSPS.setTemporalIdNestingFlag( ( m_maxTempLayer == 1 ) ? true : false ); for (Int i = 0; i < min(m_cSPS.getMaxTLayers(),(UInt) MAX_TLAYER); i++ ) { m_cSPS.setMaxDecPicBuffering(m_maxDecPicBuffering[i], i); m_cSPS.setNumReorderPics(m_numReorderPics[i], i); } m_cSPS.setPCMFilterDisableFlag ( m_bPCMFilterDisableFlag ); m_cSPS.setDisableIntraReferenceSmoothing( m_disableIntraReferenceSmoothing ); m_cSPS.setScalingListFlag ( (m_useScalingListId == SCALING_LIST_OFF) ? 0 : 1 ); m_cSPS.setUseStrongIntraSmoothing( m_useStrongIntraSmoothing ); m_cSPS.setVuiParametersPresentFlag(getVuiParametersPresentFlag()); if (m_cSPS.getVuiParametersPresentFlag()) { TComVUI* pcVUI = m_cSPS.getVuiParameters(); pcVUI->setAspectRatioInfoPresentFlag(getAspectRatioInfoPresentFlag()); pcVUI->setAspectRatioIdc(getAspectRatioIdc()); pcVUI->setSarWidth(getSarWidth()); pcVUI->setSarHeight(getSarHeight()); pcVUI->setOverscanInfoPresentFlag(getOverscanInfoPresentFlag()); pcVUI->setOverscanAppropriateFlag(getOverscanAppropriateFlag()); pcVUI->setVideoSignalTypePresentFlag(getVideoSignalTypePresentFlag()); pcVUI->setVideoFormat(getVideoFormat()); pcVUI->setVideoFullRangeFlag(getVideoFullRangeFlag()); pcVUI->setColourDescriptionPresentFlag(getColourDescriptionPresentFlag()); pcVUI->setColourPrimaries(getColourPrimaries()); pcVUI->setTransferCharacteristics(getTransferCharacteristics()); pcVUI->setMatrixCoefficients(getMatrixCoefficients()); pcVUI->setChromaLocInfoPresentFlag(getChromaLocInfoPresentFlag()); pcVUI->setChromaSampleLocTypeTopField(getChromaSampleLocTypeTopField()); pcVUI->setChromaSampleLocTypeBottomField(getChromaSampleLocTypeBottomField()); pcVUI->setNeutralChromaIndicationFlag(getNeutralChromaIndicationFlag()); pcVUI->setDefaultDisplayWindow(getDefaultDisplayWindow()); pcVUI->setFrameFieldInfoPresentFlag(getFrameFieldInfoPresentFlag()); pcVUI->setFieldSeqFlag(false); pcVUI->setHrdParametersPresentFlag(false); pcVUI->getTimingInfo()->setPocProportionalToTimingFlag(getPocProportionalToTimingFlag()); pcVUI->getTimingInfo()->setNumTicksPocDiffOneMinus1 (getNumTicksPocDiffOneMinus1() ); pcVUI->setBitstreamRestrictionFlag(getBitstreamRestrictionFlag()); pcVUI->setTilesFixedStructureFlag(getTilesFixedStructureFlag()); pcVUI->setMotionVectorsOverPicBoundariesFlag(getMotionVectorsOverPicBoundariesFlag()); pcVUI->setMinSpatialSegmentationIdc(getMinSpatialSegmentationIdc()); pcVUI->setMaxBytesPerPicDenom(getMaxBytesPerPicDenom()); pcVUI->setMaxBitsPerMinCuDenom(getMaxBitsPerMinCuDenom()); pcVUI->setLog2MaxMvLengthHorizontal(getLog2MaxMvLengthHorizontal()); pcVUI->setLog2MaxMvLengthVertical(getLog2MaxMvLengthVertical()); } m_cSPS.setNumLongTermRefPicSPS(NUM_LONG_TERM_REF_PIC_SPS); assert (NUM_LONG_TERM_REF_PIC_SPS <= MAX_NUM_LONG_TERM_REF_PICS); for (Int k = 0; k < NUM_LONG_TERM_REF_PIC_SPS; k++) { m_cSPS.setLtRefPicPocLsbSps(k, 0); m_cSPS.setUsedByCurrPicLtSPSFlag(k, 0); } if( getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() ) { Bool useDUParameters = (getSliceMode() > 0) || (getSliceSegmentMode() > 0); m_cSPS.setHrdParameters( getFrameRate(), useDUParameters, getTargetBitrate(), ( getIntraPeriod() > 0 ) ); } if( getBufferingPeriodSEIEnabled() || getPictureTimingSEIEnabled() || getDecodingUnitInfoSEIEnabled() ) { m_cSPS.getVuiParameters()->setHrdParametersPresentFlag( true ); } }
void TComSPS::setHrdParameters(uint32_t frameRate, uint32_t numDU, uint32_t bitRate, bool randomAccess) { if (!getVuiParametersPresentFlag()) { return; } TComVUI *vui = getVuiParameters(); TComHRD *hrd = vui->getHrdParameters(); TimingInfo *timingInfo = vui->getTimingInfo(); timingInfo->setTimingInfoPresentFlag(true); switch (frameRate) { case 24: timingInfo->setNumUnitsInTick(1125000); timingInfo->setTimeScale(27000000); break; case 25: timingInfo->setNumUnitsInTick(1080000); timingInfo->setTimeScale(27000000); break; case 30: timingInfo->setNumUnitsInTick(900900); timingInfo->setTimeScale(27000000); break; case 50: timingInfo->setNumUnitsInTick(540000); timingInfo->setTimeScale(27000000); break; case 60: timingInfo->setNumUnitsInTick(450450); timingInfo->setTimeScale(27000000); break; default: timingInfo->setNumUnitsInTick(1001); timingInfo->setTimeScale(60000); break; } bool rateCnt = (bitRate > 0); hrd->setNalHrdParametersPresentFlag(rateCnt); hrd->setVclHrdParametersPresentFlag(rateCnt); hrd->setSubPicCpbParamsPresentFlag((numDU > 1)); if (hrd->getSubPicCpbParamsPresentFlag()) { hrd->setTickDivisorMinus2(100 - 2); hrd->setDuCpbRemovalDelayLengthMinus1(7); // 8-bit precision ( plus 1 for last DU in AU ) hrd->setSubPicCpbParamsInPicTimingSEIFlag(true); hrd->setDpbOutputDelayDuLengthMinus1(5 + 7); // With sub-clock tick factor of 100, at least 7 bits to have the same value as AU dpb delay } else { hrd->setSubPicCpbParamsInPicTimingSEIFlag(false); } hrd->setBitRateScale(4); // in units of 2~( 6 + 4 ) = 1,024 bps hrd->setCpbSizeScale(6); // in units of 2~( 4 + 4 ) = 1,024 bit hrd->setDuCpbSizeScale(6); // in units of 2~( 4 + 4 ) = 1,024 bit hrd->setInitialCpbRemovalDelayLengthMinus1(15); // assuming 0.5 sec, log2( 90,000 * 0.5 ) = 16-bit if (randomAccess) { hrd->setCpbRemovalDelayLengthMinus1(5); // 32 = 2^5 (plus 1) hrd->setDpbOutputDelayLengthMinus1(5); // 32 + 3 = 2^6 } else { hrd->setCpbRemovalDelayLengthMinus1(9); // max. 2^10 hrd->setDpbOutputDelayLengthMinus1(9); // max. 2^10 } /* Note: only the case of "vps_max_temporal_layers_minus1 = 0" is supported. */ int i, j; uint32_t birateValue, cpbSizeValue; uint32_t ducpbSizeValue; uint32_t duBitRateValue = 0; for (i = 0; i < MAX_TLAYER; i++) { hrd->setFixedPicRateFlag(i, 1); hrd->setPicDurationInTcMinus1(i, 0); hrd->setLowDelayHrdFlag(i, 0); hrd->setCpbCntMinus1(i, 0); birateValue = bitRate; cpbSizeValue = bitRate; // 1 second ducpbSizeValue = bitRate / numDU; duBitRateValue = bitRate; for (j = 0; j < (hrd->getCpbCntMinus1(i) + 1); j++) { hrd->setBitRateValueMinus1(i, j, 0, (birateValue - 1)); hrd->setCpbSizeValueMinus1(i, j, 0, (cpbSizeValue - 1)); hrd->setDuCpbSizeValueMinus1(i, j, 0, (ducpbSizeValue - 1)); hrd->setCbrFlag(i, j, 0, (j == 0)); hrd->setBitRateValueMinus1(i, j, 1, (birateValue - 1)); hrd->setCpbSizeValueMinus1(i, j, 1, (cpbSizeValue - 1)); hrd->setDuCpbSizeValueMinus1(i, j, 1, (ducpbSizeValue - 1)); hrd->setDuBitRateValueMinus1(i, j, 1, (duBitRateValue - 1)); hrd->setCbrFlag(i, j, 1, (j == 0)); } } }