diff --git a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp index c04a57939d6fc79ae394daec434ee62430f0f50e..fbbce3d2386f52fc781918f195024e589e7d0bc7 100644 --- a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp +++ b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp @@ -187,12 +187,9 @@ uint32_t BitstreamExtractorApp::decode() bool writeInpuNalUnitToStream = true; -#if JVET_P0118_OLS_EXTRACTION // Remove NAL units with TemporalId greater than tIdTarget. - writeInpuNalUnitToStream &= (nalu.m_temporalId <= m_maxTemporalLayer); -#else writeInpuNalUnitToStream &= ( m_maxTemporalLayer < 0 ) || ( nalu.m_temporalId <= m_maxTemporalLayer ); -#endif + if( nalu.m_nalUnitType == NAL_UNIT_VPS ) { VPS* vps = new VPS(); @@ -213,27 +210,30 @@ uint32_t BitstreamExtractorApp::decode() } } -#if JVET_P0118_OLS_EXTRACTION +#if JVET_P0118_OLS_EXTRACTION VPS *vps = nullptr; - // if there is no VPS nal unit, there shall be one OLS and one layer. - if (m_vpsId == -1) + if (m_targetOlsIdx >= 0) { - CHECK(m_targetOlsIdx != 0, "only one OLS and one layer exist, but target olsIdx is not equal to zero"); - vps = new VPS(); - vps->setNumLayersInOls(0, 1); - vps->setLayerIdInOls(0, 0, nalu.m_nuhLayerId); - } - else - { - // Remove NAL units with nal_unit_type not equal to any of VPS_NUT, DPS_NUT, and EOB_NUT and with nuh_layer_id not included in the list LayerIdInOls[targetOlsIdx]. - NalUnitType t = nalu.m_nalUnitType; - bool isSpecialNalTypes = t == NAL_UNIT_VPS || t == NAL_UNIT_DCI || t == NAL_UNIT_EOB; - vps = m_parameterSetManager.getVPS(m_vpsId); - uint32_t numOlss = vps->getNumOutputLayerSets(); - CHECK(m_targetOlsIdx <0 || m_targetOlsIdx >= numOlss, "target Ols shall be in the range of OLSs specified by the VPS"); - std::vector<int> LayerIdInOls = vps->getLayerIdsInOls(m_targetOlsIdx); - bool isIncludedInTargetOls = std::find(LayerIdInOls.begin(), LayerIdInOls.end(), nalu.m_nuhLayerId) != LayerIdInOls.end(); - writeInpuNalUnitToStream &= (isSpecialNalTypes || isIncludedInTargetOls); + // if there is no VPS nal unit, there shall be one OLS and one layer. + if (m_vpsId == -1) + { + CHECK(m_targetOlsIdx != 0, "only one OLS and one layer exist, but target olsIdx is not equal to zero"); + vps = new VPS(); + vps->setNumLayersInOls(0, 1); + vps->setLayerIdInOls(0, 0, nalu.m_nuhLayerId); + } + else + { + // Remove NAL units with nal_unit_type not equal to any of VPS_NUT, DPS_NUT, and EOB_NUT and with nuh_layer_id not included in the list LayerIdInOls[targetOlsIdx]. + NalUnitType t = nalu.m_nalUnitType; + bool isSpecialNalTypes = t == NAL_UNIT_VPS || t == NAL_UNIT_DCI || t == NAL_UNIT_EOB; + vps = m_parameterSetManager.getVPS(m_vpsId); + uint32_t numOlss = vps->getNumOutputLayerSets(); + CHECK(m_targetOlsIdx <0 || m_targetOlsIdx >= numOlss, "target Ols shall be in the range of OLSs specified by the VPS"); + std::vector<int> LayerIdInOls = vps->getLayerIdsInOls(m_targetOlsIdx); + bool isIncludedInTargetOls = std::find(LayerIdInOls.begin(), LayerIdInOls.end(), nalu.m_nuhLayerId) != LayerIdInOls.end(); + writeInpuNalUnitToStream &= (isSpecialNalTypes || isIncludedInTargetOls); + } } #endif if( nalu.m_nalUnitType == NAL_UNIT_SPS ) @@ -272,42 +272,47 @@ uint32_t BitstreamExtractorApp::decode() } } #if JVET_P0118_OLS_EXTRACTION - if (nalu.m_nalUnitType == NAL_UNIT_PREFIX_SEI) + if (m_targetOlsIdx>=0) { - // decoding a SEI - SEIMessages SEIs; - HRD hrd; - m_seiReader.parseSEImessage(&(nalu.getBitstream()), SEIs, nalu.m_nalUnitType, nalu.m_nuhLayerId, nalu.m_temporalId, vps, m_parameterSetManager.getActiveSPS(), hrd, &std::cout); - for (auto sei : SEIs) + if (nalu.m_nalUnitType == NAL_UNIT_PREFIX_SEI) { - // remove unqualiified scalable nesting SEI - if (sei->payloadType() == SEI::SCALABLE_NESTING) + // decoding a SEI + SEIMessages SEIs; + HRD hrd; + m_seiReader.parseSEImessage(&(nalu.getBitstream()), SEIs, nalu.m_nalUnitType, nalu.m_nuhLayerId, nalu.m_temporalId, vps, m_parameterSetManager.getActiveSPS(), hrd, &std::cout); + for (auto sei : SEIs) { - SEIScalableNesting *seiNesting = (SEIScalableNesting *)sei; - if (seiNesting->m_nestingOlsFlag == 1) + // remove unqualiified scalable nesting SEI + if (sei->payloadType() == SEI::SCALABLE_NESTING) { - bool targetOlsIdxInNestingAppliedOls = false; - for (uint32_t i = 0; i <= seiNesting->m_nestingNumOlssMinus1; i++) + SEIScalableNesting *seiNesting = (SEIScalableNesting *)sei; + if (seiNesting->m_nestingOlsFlag == 1) { - if (seiNesting->m_nestingOlsIdx[i] == m_targetOlsIdx) + bool targetOlsIdxInNestingAppliedOls = false; + for (uint32_t i = 0; i <= seiNesting->m_nestingNumOlssMinus1; i++) { - targetOlsIdxInNestingAppliedOls = true; - break; + if (seiNesting->m_nestingOlsIdx[i] == m_targetOlsIdx) + { + targetOlsIdxInNestingAppliedOls = true; + break; + } } + writeInpuNalUnitToStream &= targetOlsIdxInNestingAppliedOls; } - writeInpuNalUnitToStream &= targetOlsIdxInNestingAppliedOls; + } + // remove unqualified timing related SEI + if (sei->payloadType() == SEI::BUFFERING_PERIOD || sei->payloadType() == SEI::PICTURE_TIMING || sei->payloadType() == SEI::DECODING_UNIT_INFO) + { + bool targetOlsIdxGreaterThanZero = m_targetOlsIdx > 0; + writeInpuNalUnitToStream &= !targetOlsIdxGreaterThanZero; } } - // remove unqualified timing related SEI - if (sei->payloadType() == SEI::BUFFERING_PERIOD || sei->payloadType() == SEI::PICTURE_TIMING || sei->payloadType() == SEI::DECODING_UNIT_INFO) - { - bool targetOlsIdxGreaterThanZero = m_targetOlsIdx > 0; - writeInpuNalUnitToStream &= !targetOlsIdxGreaterThanZero; - } + } + if (m_vpsId == -1) + { + delete vps; } } - if (m_vpsId == -1) - delete vps; #endif unitCnt++; diff --git a/source/App/BitstreamExtractorApp/BitstreamExtractorAppCfg.cpp b/source/App/BitstreamExtractorApp/BitstreamExtractorAppCfg.cpp index 2ce41bd2868ea402d537671e3d23fd8368cd0507..e91b3b17b26294e8e1d38706a7eb7e721fef2455 100644 --- a/source/App/BitstreamExtractorApp/BitstreamExtractorAppCfg.cpp +++ b/source/App/BitstreamExtractorApp/BitstreamExtractorAppCfg.cpp @@ -70,14 +70,9 @@ namespace po = df::program_options_lite; ("help", printHelp, false, "This help text") ("BitstreamFileIn,b", m_bitstreamFileNameIn, string(""), "Bitstream input file name") ("BitstreamFileOut,o", m_bitstreamFileNameOut, string(""), "bitstream output file name") -#if JVET_P0118_OLS_EXTRACTION - ("MaxTemporalLayer,t", m_maxTemporalLayer, 0, "Maximum Temporal Layer to be decoded, shall be in range of 0 to 6, inclusive") - ("TargetOutputLayerSet,s", m_targetOlsIdx, 0, "Target output layer set index") -#else ("MaxTemporalLayer,t", m_maxTemporalLayer, -1, "Maximum Temporal Layer to be decoded. -1 to decode all layers") ("TargetOutputLayerSet,p", m_targetOlsIdx, -1, "Target output layer set index") -#endif - ("SubPicId,p", m_subPicId, -1, "Target subpic ID") + ("SubPicId,s", m_subPicId, -1, "Target subpic ID") #if ENABLE_TRACING ("TraceChannelsList", printTracingChannelsList, false, "List all available tracing channels" ) @@ -126,7 +121,7 @@ namespace po = df::program_options_lite; } } #if JVET_P0118_OLS_EXTRACTION - CHECK(m_maxTemporalLayer < 0 || m_maxTemporalLayer > 6, "tIdTarget shall equal to any value in the range of 0 to 6, inclusive"); + CHECK(m_maxTemporalLayer < -1 || m_maxTemporalLayer > 6, "MaxTemporalLayer shall either be equal -1 (for diabled) or in the range of 0 to 6, inclusive"); #else if (m_targetOlsIdx != -1) {