ErrVal VUI::write( HeaderSymbolWriteIf* pcWriteIf ) const { RNOK( pcWriteIf->writeFlag( m_bVuiParametersPresentFlag, "SPS: vui_parameters_present_flag" ) ); if (!m_bVuiParametersPresentFlag) return Err::m_nOK; RNOK( m_cAspectRatioInfo.write( pcWriteIf ) ); RNOK( pcWriteIf->writeFlag( getOverscanInfoPresentFlag(), "VUI: overscan_info_present_flag")); if( getOverscanInfoPresentFlag() ) { RNOK( pcWriteIf->writeFlag( getOverscanAppropriateFlag(), "VUI: overscan_appropriate_flag")); } RNOK( m_cVideoSignalType.write( pcWriteIf ) ); RNOK( m_cChromaLocationInfo.write( pcWriteIf ) ); if( m_eProfileIdc == SCALABLE_BASELINE_PROFILE || m_eProfileIdc == SCALABLE_HIGH_PROFILE ) { RNOK( pcWriteIf->writeFlag( false, "VUI: timing_info_present_flag" ) ); RNOK( pcWriteIf->writeFlag( false, "HRD: hdr_parameters_present_flag" ) ); RNOK( pcWriteIf->writeFlag( false, "HRD: hdr_parameters_present_flag" ) ); RNOK( pcWriteIf->writeFlag( false, "VUI: pic_struct_present_flag" ) ); } else { ROT( m_uiDefaultIdx == MSYS_UINT_MAX ); RNOK( m_acTimingInfo.get(m_uiDefaultIdx).write( pcWriteIf ) ); RNOK( m_acNalHrd.get(m_uiDefaultIdx).write( pcWriteIf ) ); RNOK( m_acVclHrd.get(m_uiDefaultIdx).write( pcWriteIf ) ); if( m_acNalHrd.get(m_uiDefaultIdx).getHrdParametersPresentFlag() || m_acVclHrd.get(m_uiDefaultIdx).getHrdParametersPresentFlag() ) { RNOK( pcWriteIf->writeFlag( m_abLowDelayHrdFlag.get(m_uiDefaultIdx), "VUI: low_delay_hrd_flag")); } RNOK( pcWriteIf->writeFlag( m_abPicStructPresentFlag.get(m_uiDefaultIdx), "VUI: pic_struct_present_flag")); } RNOK( m_cBitstreamRestriction.write( pcWriteIf ) ); return Err::m_nOK; }
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 ); } }