Void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, TComSPS *sps) { Int i; TComVUI *vui = sps->getVuiParameters(); TComHRD *hrd = vui->getHrdParameters(); if( vui->getFrameFieldInfoPresentFlag() ) { WRITE_CODE( sei.m_picStruct, 4, "pic_struct" ); WRITE_CODE( sei.m_sourceScanType, 2, "source_scan_type" ); WRITE_FLAG( sei.m_duplicateFlag ? 1 : 0, "duplicate_flag" ); } if( hrd->getCpbDpbDelaysPresentFlag() ) { WRITE_CODE( sei.m_auCpbRemovalDelay - 1, ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), "au_cpb_removal_delay_minus1" ); WRITE_CODE( sei.m_picDpbOutputDelay, ( hrd->getDpbOutputDelayLengthMinus1() + 1 ), "pic_dpb_output_delay" ); if(hrd->getSubPicCpbParamsPresentFlag()) { WRITE_CODE(sei.m_picDpbOutputDuDelay, hrd->getDpbOutputDelayDuLengthMinus1()+1, "pic_dpb_output_du_delay" ); } if( hrd->getSubPicCpbParamsPresentFlag() && hrd->getSubPicCpbParamsInPicTimingSEIFlag() ) { WRITE_UVLC( sei.m_numDecodingUnitsMinus1, "num_decoding_units_minus1" ); WRITE_FLAG( sei.m_duCommonCpbRemovalDelayFlag, "du_common_cpb_removal_delay_flag" ); if( sei.m_duCommonCpbRemovalDelayFlag ) { WRITE_CODE( sei.m_duCommonCpbRemovalDelayMinus1, ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), "du_common_cpb_removal_delay_minus1" ); } for( i = 0; i <= sei.m_numDecodingUnitsMinus1; i ++ ) { WRITE_UVLC( sei.m_numNalusInDuMinus1[ i ], "num_nalus_in_du_minus1"); if( ( !sei.m_duCommonCpbRemovalDelayFlag ) && ( i < sei.m_numDecodingUnitsMinus1 ) ) { WRITE_CODE( sei.m_duCpbRemovalDelayMinus1[ i ], ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), "du_cpb_removal_delay_minus1" ); } } } } xWriteByteAlign(); }
Void SEIWriter::xWriteSEIPictureTiming(const SEIPictureTiming& sei, TComSPS *sps) { Int i; TComVUI *vui = sps->getVuiParameters(); TComHRD *hrd = vui->getHrdParameters(); #if !L0045_CONDITION_SIGNALLING // This condition was probably OK before the pic_struct, progressive_source_idc, duplicate_flag were added if( !hrd->getNalHrdParametersPresentFlag() && !hrd->getVclHrdParametersPresentFlag() ) return; #endif if( vui->getFrameFieldInfoPresentFlag() ) { WRITE_CODE( sei.m_picStruct, 4, "pic_struct" ); #if L0046_RENAME_PROG_SRC_IDC WRITE_CODE( sei.m_sourceScanType, 2, "source_scan_type" ); #else WRITE_CODE( sei.m_progressiveSourceIdc, 2, "progressive_source_idc" ); #endif WRITE_FLAG( sei.m_duplicateFlag ? 1 : 0, "duplicate_flag" ); } #if L0045_CONDITION_SIGNALLING if( hrd->getCpbDpbDelaysPresentFlag() ) { #endif WRITE_CODE( sei.m_auCpbRemovalDelay - 1, ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), "au_cpb_removal_delay_minus1" ); WRITE_CODE( sei.m_picDpbOutputDelay, ( hrd->getDpbOutputDelayLengthMinus1() + 1 ), "pic_dpb_output_delay" ); #if L0044_DU_DPB_OUTPUT_DELAY_HRD if(hrd->getSubPicCpbParamsPresentFlag()) { WRITE_CODE(sei.m_picDpbOutputDuDelay, hrd->getDpbOutputDelayDuLengthMinus1()+1, "pic_dpb_output_du_delay" ); } #endif if( hrd->getSubPicCpbParamsPresentFlag() && hrd->getSubPicCpbParamsInPicTimingSEIFlag() ) { WRITE_UVLC( sei.m_numDecodingUnitsMinus1, "num_decoding_units_minus1" ); WRITE_FLAG( sei.m_duCommonCpbRemovalDelayFlag, "du_common_cpb_removal_delay_flag" ); if( sei.m_duCommonCpbRemovalDelayFlag ) { WRITE_CODE( sei.m_duCommonCpbRemovalDelayMinus1, ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), "du_common_cpb_removal_delay_minus1" ); } for( i = 0; i <= sei.m_numDecodingUnitsMinus1; i ++ ) { WRITE_UVLC( sei.m_numNalusInDuMinus1[ i ], "num_nalus_in_du_minus1"); if( ( !sei.m_duCommonCpbRemovalDelayFlag ) && ( i < sei.m_numDecodingUnitsMinus1 ) ) { WRITE_CODE( sei.m_duCpbRemovalDelayMinus1[ i ], ( hrd->getDuCpbRemovalDelayLengthMinus1() + 1 ), "du_cpb_removal_delay_minus1" ); } } } #if L0045_CONDITION_SIGNALLING } #endif xWriteByteAlign(); }
Void SEIWriter::xWriteSEIBufferingPeriod(const SEIBufferingPeriod& sei, TComSPS *sps) { Int i, nalOrVcl; TComVUI *vui = sps->getVuiParameters(); TComHRD *hrd = vui->getHrdParameters(); WRITE_UVLC( sei.m_bpSeqParameterSetId, "bp_seq_parameter_set_id" ); if( !hrd->getSubPicCpbParamsPresentFlag() ) { WRITE_FLAG( sei.m_rapCpbParamsPresentFlag, "irap_cpb_params_present_flag" ); } if( sei.m_rapCpbParamsPresentFlag ) { WRITE_CODE( sei.m_cpbDelayOffset, hrd->getCpbRemovalDelayLengthMinus1() + 1, "cpb_delay_offset" ); WRITE_CODE( sei.m_dpbDelayOffset, hrd->getDpbOutputDelayLengthMinus1() + 1, "dpb_delay_offset" ); } WRITE_FLAG( sei.m_concatenationFlag, "concatenation_flag"); WRITE_CODE( sei.m_auCpbRemovalDelayDelta - 1, ( hrd->getCpbRemovalDelayLengthMinus1() + 1 ), "au_cpb_removal_delay_delta_minus1" ); for( nalOrVcl = 0; nalOrVcl < 2; nalOrVcl ++ ) { if( ( ( nalOrVcl == 0 ) && ( hrd->getNalHrdParametersPresentFlag() ) ) || ( ( nalOrVcl == 1 ) && ( hrd->getVclHrdParametersPresentFlag() ) ) ) { for( i = 0; i < ( hrd->getCpbCntMinus1( 0 ) + 1 ); i ++ ) { WRITE_CODE( sei.m_initialCpbRemovalDelay[i][nalOrVcl],( hrd->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , "initial_cpb_removal_delay" ); WRITE_CODE( sei.m_initialCpbRemovalDelayOffset[i][nalOrVcl],( hrd->getInitialCpbRemovalDelayLengthMinus1() + 1 ), "initial_cpb_removal_delay_offset" ); if( hrd->getSubPicCpbParamsPresentFlag() || sei.m_rapCpbParamsPresentFlag ) { WRITE_CODE( sei.m_initialAltCpbRemovalDelay[i][nalOrVcl], ( hrd->getInitialCpbRemovalDelayLengthMinus1() + 1 ) , "initial_alt_cpb_removal_delay" ); WRITE_CODE( sei.m_initialAltCpbRemovalDelayOffset[i][nalOrVcl], ( hrd->getInitialCpbRemovalDelayLengthMinus1() + 1 ),"initial_alt_cpb_removal_delay_offset" ); } } } } xWriteByteAlign(); }
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)); } } }