diff --git a/source/App/DecoderApp/DecApp.cpp b/source/App/DecoderApp/DecApp.cpp index 72eb2ffe940e5e19a2b7dd3dcc6779596395ed82..7735309afc36ac6d4e62a2e33522f93f757c0f1a 100644 --- a/source/App/DecoderApp/DecApp.cpp +++ b/source/App/DecoderApp/DecApp.cpp @@ -233,11 +233,16 @@ uint32_t DecApp::decode() m_cDecLib.setNoOutputPriorPicsFlag (false); } if ( bNewPicture && +#if !JVET_M0101_HLS ( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_N_LP || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP ) ) +#else + ( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP) ) +#endif { xFlushOutput( pcListPic ); } @@ -247,7 +252,11 @@ uint32_t DecApp::decode() m_cDecLib.setFirstSliceInPicture (false); } // write reconstruction to file -- for additional bumping as defined in C.5.2.3 +#if !JVET_M0101_HLS if(!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL_N && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL31) +#else + if (!bNewPicture && nalu.m_nalUnitType >= NAL_UNIT_CODED_SLICE_TRAIL && nalu.m_nalUnitType <= NAL_UNIT_RESERVED_VCL15) +#endif { xWriteOutput( pcListPic, nalu.m_temporalId ); } diff --git a/source/App/EncoderApp/EncApp.cpp b/source/App/EncoderApp/EncApp.cpp index 366267598e9c2d4543f2e2c3d8cd9d1fed4e1883..2e7dacc9650cf8574e9550b08e517ea33c607cc6 100644 --- a/source/App/EncoderApp/EncApp.cpp +++ b/source/App/EncoderApp/EncApp.cpp @@ -888,6 +888,7 @@ void EncApp::rateStatsAccum(const AccessUnit& au, const std::vector<uint32_t>& a { switch ((*it_au)->m_nalUnitType) { +#if !JVET_M0101_HLS case NAL_UNIT_CODED_SLICE_TRAIL_R: case NAL_UNIT_CODED_SLICE_TRAIL_N: case NAL_UNIT_CODED_SLICE_TSA_R: @@ -904,6 +905,15 @@ void EncApp::rateStatsAccum(const AccessUnit& au, const std::vector<uint32_t>& a case NAL_UNIT_CODED_SLICE_RADL_R: case NAL_UNIT_CODED_SLICE_RASL_N: case NAL_UNIT_CODED_SLICE_RASL_R: +#else + case NAL_UNIT_CODED_SLICE_TRAIL: + case NAL_UNIT_CODED_SLICE_STSA: + case NAL_UNIT_CODED_SLICE_IDR_W_RADL: + case NAL_UNIT_CODED_SLICE_IDR_N_LP: + case NAL_UNIT_CODED_SLICE_CRA: + case NAL_UNIT_CODED_SLICE_RADL: + case NAL_UNIT_CODED_SLICE_RASL: +#endif #if HEVC_VPS case NAL_UNIT_VPS: #endif diff --git a/source/App/Parcat/parcat.cpp b/source/App/Parcat/parcat.cpp index a0cc878819a3d593043580ff8577f149713d9d5b..9c72ed425708efd9e43577ed7cf8555f125b3424 100644 --- a/source/App/Parcat/parcat.cpp +++ b/source/App/Parcat/parcat.cpp @@ -102,6 +102,7 @@ const bool verbose = false; const char * NALU_TYPE[] = { +#if !JVET_M0101_HLS "TRAIL_N", "TRAIL_R", "TSA_N", @@ -150,6 +151,53 @@ const char * NALU_TYPE[] = "FD_NUT", "PREFIX_SEI_NUT", "SUFFIX_SEI_NUT", +#else + "NAL_UNIT_CODED_SLICE_TRAIL", + "NAL_UNIT_CODED_SLICE_STSA", + "NAL_UNIT_CODED_SLICE_RADL", + "NAL_UNIT_CODED_SLICE_RASL", + "NAL_UNIT_RESERVED_VCL_4", + "NAL_UNIT_RESERVED_VCL_5", + "NAL_UNIT_RESERVED_VCL_6", + "NAL_UNIT_RESERVED_VCL_7", + + "NAL_UNIT_CODED_SLICE_IDR_W_RADL", + "NAL_UNIT_CODED_SLICE_IDR_N_LP", + "NAL_UNIT_CODED_SLICE_CRA", + + "NAL_UNIT_RESERVED_IRAP_VCL11", + "NAL_UNIT_RESERVED_IRAP_VCL12", + "NAL_UNIT_RESERVED_IRAP_VCL13", + + "NAL_UNIT_RESERVED_VCL14", + +#if HEVC_VPS + "NAL_UNIT_VPS", +#else + "NAL_UNIT_RESERVED_VCL15", +#endif + + "NAL_UNIT_RESERVED_NVCL16", + + "NAL_UNIT_SPS", + "NAL_UNIT_PPS", +#if JVET_M0132_APS + "NAL_UNIT_APS", +#endif + "NAL_UNIT_ACCESS_UNIT_DELIMITER", + "NAL_UNIT_EOS", + "NAL_UNIT_EOB", + "NAL_UNIT_PREFIX_SEI", + "NAL_UNIT_SUFFIX_SEI", + "NAL_UNIT_FILLER_DATA", + + "NAL_UNIT_RESERVED_NVCL26", + "NAL_UNIT_RESERVED_NVCL27", + "NAL_UNIT_UNSPECIFIED_28", + "NAL_UNIT_UNSPECIFIED_29", + "NAL_UNIT_UNSPECIFIED_30", + "NAL_UNIT_UNSPECIFIED_31" +#endif }; int calc_poc(int iPOClsb, int prevTid0POC, int getBitsForPOC, int nalu_type) @@ -171,6 +219,7 @@ int calc_poc(int iPOClsb, int prevTid0POC, int getBitsForPOC, int nalu_type) { iPOCmsb = iPrevPOCmsb; } +#if !JVET_M0101_HLS if ( nalu_type == NAL_UNIT_CODED_SLICE_BLA_W_LP || nalu_type == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalu_type == NAL_UNIT_CODED_SLICE_BLA_N_LP ) @@ -178,6 +227,7 @@ int calc_poc(int iPOClsb, int prevTid0POC, int getBitsForPOC, int nalu_type) // For BLA picture types, POCmsb is set to 0. iPOCmsb = 0; } +#endif return iPOCmsb + iPOClsb; } @@ -228,7 +278,11 @@ std::vector<uint8_t> filter_segment(const std::vector<uint8_t> & v, int idx, int int offset = 16; offset += 1; //first_slice_segment_in_pic_flag +#if !JVET_M0101_HLS if (nalu_type >= NAL_UNIT_CODED_SLICE_BLA_W_LP && nalu_type <= NAL_UNIT_RESERVED_IRAP_VCL23) +#else + if (nalu_type >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && nalu_type <= NAL_UNIT_RESERVED_IRAP_VCL13) +#endif { offset += 1; //no_output_of_prior_pics_flag } diff --git a/source/Lib/CommonLib/NAL.h b/source/Lib/CommonLib/NAL.h index f8185efb8e53a9d3f7d86cc72ef8d84310eab83c..57f98f7812e751f783c99c28c97d7bfbebfa5374 100644 --- a/source/Lib/CommonLib/NAL.h +++ b/source/Lib/CommonLib/NAL.h @@ -74,6 +74,15 @@ struct NALUnit /** returns true if the NALunit is a slice NALunit */ bool isSlice() { +#if JVET_M0101_HLS + return m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL + || m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA + || m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP + || m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA + || m_nalUnitType == NAL_UNIT_CODED_SLICE_RADL + || m_nalUnitType == NAL_UNIT_CODED_SLICE_RASL; +#else return m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_R || m_nalUnitType == NAL_UNIT_CODED_SLICE_TRAIL_N || m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_R @@ -90,6 +99,7 @@ struct NALUnit || m_nalUnitType == NAL_UNIT_CODED_SLICE_RADL_R || m_nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || m_nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R; +#endif } bool isSei() { diff --git a/source/Lib/CommonLib/Picture.cpp b/source/Lib/CommonLib/Picture.cpp index d5ee0c4956c2bf31bacb5887aadbe87f0b7d3ecf..01380ecb7323c1f5bec26daf1ae163e489a0dcaa 100644 --- a/source/Lib/CommonLib/Picture.cpp +++ b/source/Lib/CommonLib/Picture.cpp @@ -553,7 +553,11 @@ void TileMap::initTileMap( const SPS& sps, const PPS& pps ) // Tile size check int minWidth = 1; int minHeight = 1; +#if !JVET_M0101_HLS const int profileIdc = sps.getPTL()->getGeneralPTL()->getProfileIdc(); +#else + const int profileIdc = sps.getProfileTierLevel()->getProfileIdc(); +#endif if ( profileIdc == Profile::MAIN || profileIdc == Profile::MAIN10) { if (pps.getTilesEnabledFlag()) diff --git a/source/Lib/CommonLib/Rom.cpp b/source/Lib/CommonLib/Rom.cpp index bd80c62f3abc27b031814d7f26af0c84c76c8179..e2ffe15e5ea4a61deeefc70e98ae86c5a5ada561 100644 --- a/source/Lib/CommonLib/Rom.cpp +++ b/source/Lib/CommonLib/Rom.cpp @@ -65,6 +65,30 @@ const char* nalUnitTypeToString(NalUnitType type) { switch (type) { +#if JVET_M0101_HLS + case NAL_UNIT_CODED_SLICE_TRAIL: return "TRAIL"; + case NAL_UNIT_CODED_SLICE_STSA: return "STSA"; + case NAL_UNIT_CODED_SLICE_IDR_W_RADL: return "IDR_W_RADL"; + case NAL_UNIT_CODED_SLICE_IDR_N_LP: return "IDR_N_LP"; + case NAL_UNIT_CODED_SLICE_CRA: return "CRA"; + case NAL_UNIT_CODED_SLICE_RADL: return "RADL"; + case NAL_UNIT_CODED_SLICE_RASL: return "RASL"; +#if HEVC_VPS + case NAL_UNIT_VPS: return "VPS"; +#endif + case NAL_UNIT_SPS: return "SPS"; + case NAL_UNIT_PPS: return "PPS"; +#if JVET_M0132_APS + case NAL_UNIT_APS: return "APS"; +#endif + case NAL_UNIT_ACCESS_UNIT_DELIMITER: return "AUD"; + case NAL_UNIT_EOS: return "EOS"; + case NAL_UNIT_EOB: return "EOB"; + case NAL_UNIT_FILLER_DATA: return "FILLER"; + case NAL_UNIT_PREFIX_SEI: return "Prefix SEI"; + case NAL_UNIT_SUFFIX_SEI: return "Suffix SEI"; + default: return "UNK"; +#else case NAL_UNIT_CODED_SLICE_TRAIL_R: return "TRAIL_R"; case NAL_UNIT_CODED_SLICE_TRAIL_N: return "TRAIL_N"; case NAL_UNIT_CODED_SLICE_TSA_R: return "TSA_R"; @@ -96,6 +120,7 @@ const char* nalUnitTypeToString(NalUnitType type) case NAL_UNIT_PREFIX_SEI: return "Prefix SEI"; case NAL_UNIT_SUFFIX_SEI: return "Suffix SEI"; default: return "UNK"; +#endif } } diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index ec8b4f899bd77d7eaba188523c055a187cef0acf..a0f5c64e02e42cdbdd58013d9d4a9fd01257cf59 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -88,7 +88,7 @@ Slice::Slice() , m_colFromL0Flag ( true ) , m_noOutputPriorPicsFlag ( false ) , m_noRaslOutputFlag ( false ) -, m_handleCraAsBlaFlag ( false ) +, m_handleCraAsCvsStartFlag ( false ) , m_colRefIdx ( 0 ) , m_maxNumMergeCand ( 0 ) , m_maxNumAffineMergeCand ( 0 ) @@ -123,7 +123,9 @@ Slice::Slice() , m_substreamSizes ( ) , m_cabacInitFlag ( false ) , m_bLMvdL1Zero ( false ) +#if !JVET_M0101_HLS , m_temporalLayerNonReferenceFlag ( false ) +#endif , m_LFCrossSliceBoundaryFlag ( false ) , m_enableTMVPFlag ( true ) , m_encCABACTableIdx (I_SLICE) @@ -247,10 +249,12 @@ bool Slice::getRapPicFlag() const { return getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP +#if !JVET_M0101_HLS || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP - || getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA; +#endif + || getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA; } @@ -660,6 +664,7 @@ void Slice::checkCRA(const ReferencePictureSet *pReferencePictureSet, int& pocCR pocCRA = getPOC(); associatedIRAPType = getNalUnitType(); } +#if !JVET_M0101_HLS else if ( getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP ) // BLA picture found @@ -667,6 +672,7 @@ void Slice::checkCRA(const ReferencePictureSet *pReferencePictureSet, int& pocCR pocCRA = getPOC(); associatedIRAPType = getNalUnitType(); } +#endif } /** Function for marking the reference pictures when an IDR/CRA/CRANT/BLA/BLANT is encountered. @@ -692,11 +698,16 @@ void Slice::decodingRefreshMarking(int& pocCRA, bool& bRefreshPending, PicList& Picture* rpcPic; int pocCurr = getPOC(); +#if !JVET_M0101_HLS if ( getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP ) // IDR or BLA picture +#else + if ( getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP) // IDR picture +#endif { // mark all pictures as not used for reference PicList::iterator iterPic = rcListPic.begin(); @@ -712,12 +723,14 @@ void Slice::decodingRefreshMarking(int& pocCRA, bool& bRefreshPending, PicList& } iterPic++; } +#if !JVET_M0101_HLS if ( getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP ) { pocCRA = pocCurr; } +#endif if (bEfficientFieldIRAPEnabled) { bRefreshPending = true; @@ -960,25 +973,41 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const if(this->getAssociatedIRAPPOC() > this->getPOC()) { // Do not check IRAP pictures since they may get a POC lower than their associated IRAP +#if !JVET_M0101_HLS if(nalUnitType < NAL_UNIT_CODED_SLICE_BLA_W_LP || nalUnitType > NAL_UNIT_RESERVED_IRAP_VCL23) +#else + if (nalUnitType < NAL_UNIT_CODED_SLICE_IDR_W_RADL || + nalUnitType > NAL_UNIT_RESERVED_IRAP_VCL13) +#endif { +#if !JVET_M0101_HLS CHECK( nalUnitType != NAL_UNIT_CODED_SLICE_RASL_N && nalUnitType != NAL_UNIT_CODED_SLICE_RASL_R && nalUnitType != NAL_UNIT_CODED_SLICE_RADL_N && nalUnitType != NAL_UNIT_CODED_SLICE_RADL_R, "Invalid NAL unit type"); +#else + CHECK(nalUnitType != NAL_UNIT_CODED_SLICE_RASL && + nalUnitType != NAL_UNIT_CODED_SLICE_RADL, "Invalid NAL unit type"); +#endif } } // When a picture is a trailing picture, it shall not be a RADL or RASL picture. if(this->getAssociatedIRAPPOC() < this->getPOC()) { +#if !JVET_M0101_HLS CHECK( nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_R, "Invalid NAL unit type" ); +#else + CHECK(nalUnitType == NAL_UNIT_CODED_SLICE_RASL || + nalUnitType == NAL_UNIT_CODED_SLICE_RADL, "Invalid NAL unit type"); +#endif } +#if !JVET_M0101_HLS // No RASL pictures shall be present in the bitstream that are associated // with a BLA picture having nal_unit_type equal to BLA_W_RADL or BLA_N_LP. if(nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || @@ -987,11 +1016,16 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const CHECK (this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_N_LP, "Invalid NAL unit type"); } +#endif // No RASL pictures shall be present in the bitstream that are associated with // an IDR picture. +#if !JVET_M0101_HLS if(nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RASL) +#endif { CHECK( this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL, "Invalid NAL unit type"); @@ -1000,11 +1034,19 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // No RADL pictures shall be present in the bitstream that are associated with // a BLA picture having nal_unit_type equal to BLA_N_LP or that are associated // with an IDR picture having nal_unit_type equal to IDR_N_LP. +#if !JVET_M0101_HLS if(nalUnitType == NAL_UNIT_CODED_SLICE_RADL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_R) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RADL) +#endif { +#if !JVET_M0101_HLS CHECK (this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_IDR_N_LP, "Invalid NAL unit type"); +#else + CHECK (this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_IDR_N_LP, "Invalid NAL unit type"); +#endif } // loop through all pictures in the reference picture buffer @@ -1027,12 +1069,18 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // (Note that any picture following in output order would be present in the DPB) if(pcSlice->getPicOutputFlag() == 1 && !this->getNoOutputPriorPicsFlag()) { +#if !JVET_M0101_HLS if(nalUnitType == NAL_UNIT_CODED_SLICE_BLA_N_LP || nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP || nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalUnitType == NAL_UNIT_CODED_SLICE_CRA || nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP || nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_CRA || + nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP || + nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL) +#endif { CHECK(pcPic->poc >= this->getPOC(), "Invalid POC"); } @@ -1043,8 +1091,12 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // picture in output order. if(pcSlice->getPicOutputFlag() == 1) { +#if !JVET_M0101_HLS if((nalUnitType == NAL_UNIT_CODED_SLICE_RADL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_R)) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RADL) +#endif { // rpcPic precedes the IRAP in decoding order if(this->getAssociatedIRAPPOC() > pcSlice->getAssociatedIRAPPOC()) @@ -1060,10 +1112,15 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // When a picture is a leading picture, it shall precede, in decoding order, // all trailing pictures that are associated with the same IRAP picture. - if(nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || +#if !JVET_M0101_HLS + if (nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RADL_R) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RASL || + nalUnitType == NAL_UNIT_CODED_SLICE_RADL ) +#endif { if(pcSlice->getAssociatedIRAPPOC() == this->getAssociatedIRAPPOC()) { @@ -1075,17 +1132,29 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // Any RASL picture associated with a CRA or BLA picture shall precede any // RADL picture associated with the CRA or BLA picture in output order +#if !JVET_M0101_HLS if(nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RASL) +#endif { +#if !JVET_M0101_HLS if((this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || - this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_CRA) && + this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_CRA) && +#else + if ((this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_CRA) && +#endif this->getAssociatedIRAPPOC() == pcSlice->getAssociatedIRAPPOC()) { +#if !JVET_M0101_HLS if(pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_N || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_R) +#else + if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL) +#endif { CHECK( pcPic->poc <= this->getPOC(), "Invalid POC"); } @@ -1094,15 +1163,22 @@ void Slice::checkLeadingPictureRestrictions(PicList& rcListPic) const // Any RASL picture associated with a CRA picture shall follow, in output // order, any IRAP picture that precedes the CRA picture in decoding order. +#if !JVET_M0101_HLS if(nalUnitType == NAL_UNIT_CODED_SLICE_RASL_N || nalUnitType == NAL_UNIT_CODED_SLICE_RASL_R) +#else + if (nalUnitType == NAL_UNIT_CODED_SLICE_RASL) +#endif { if(this->getAssociatedIRAPType() == NAL_UNIT_CODED_SLICE_CRA) { - if(pcSlice->getPOC() < this->getAssociatedIRAPPOC() && - (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || + if(pcSlice->getPOC() < this->getAssociatedIRAPPOC() && + ( +#if !JVET_M0101_HLS + pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || +#endif pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA)) @@ -1187,15 +1263,19 @@ void Slice::applyReferencePictureSet( PicList& rcListPic, const ReferencePicture //check that pictures of higher temporal layers are not used CHECK( pcPic->usedByCurr && !(pcPic->layer<=this->getTLayer()), "Invalid state"); //check that pictures of higher or equal temporal layer are not in the RPS if the current picture is a TSA picture +#if !JVET_M0101_HLS if( this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_R || this->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N) { CHECK( !(pcPic->layer<this->getTLayer()), "Invalid state"); } +#endif +#if !JVET_M0101_HLS //check that pictures marked as temporal layer non-reference pictures are not used for reference if( pcPic->poc != this->getPOC() && (pcPic->layer == this->getTLayer())) { CHECK( pcPic->usedByCurr && pcPic->slices[0]->getTemporalLayerNonReferenceFlag(), "Invalid state"); } +#endif } } } @@ -1726,6 +1806,7 @@ SPSRExt::SPSRExt() SPS::SPS() : m_SPSId ( 0) +#if !JVET_M0101_HLS , m_bIntraOnlyConstraintFlag (false) , m_maxBitDepthConstraintIdc ( 0) , m_maxChromaFormatConstraintIdc(CHROMA_420) @@ -1758,6 +1839,7 @@ SPS::SPS() #endif , m_bNoDepQuantConstraintFlag (false) , m_bNoSignDataHidingConstraintFlag(false) +#endif #if JVET_M0246_AFFINE_AMVR , m_affineAmvrEnabledFlag ( false ) #endif @@ -2579,6 +2661,7 @@ void ParameterSetMap<SPS>::setID(SPS* parameterSet, const int psId) parameterSet->setSPSId(psId); } +#if !JVET_M0101_HLS ProfileTierLevel::ProfileTierLevel() : m_profileSpace (0) , m_tierFlag (Level::MAIN) @@ -2597,6 +2680,16 @@ PTL::PTL() ::memset(m_subLayerProfilePresentFlag, 0, sizeof(m_subLayerProfilePresentFlag)); ::memset(m_subLayerLevelPresentFlag, 0, sizeof(m_subLayerLevelPresentFlag )); } +#else +ProfileTierLevel::ProfileTierLevel() + : m_tierFlag (Level::MAIN) + , m_profileIdc (Profile::NONE) + , m_levelIdc (Level::NONE) +{ + ::memset(m_subLayerLevelPresentFlag, 0, sizeof(m_subLayerLevelPresentFlag )); + ::memset(m_subLayerLevelIdc, Level::NONE, sizeof(m_subLayerLevelIdc )); +} +#endif void calculateParameterSetChangedFlag(bool &bChanged, const std::vector<uint8_t> *pOldData, const std::vector<uint8_t> *pNewData) { diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index 8b36e52d1b4ce37c115820aea2a87189336b001d..98ea2df2f904d5c6bf01883b4542e1255a98341d 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -191,14 +191,178 @@ private: }; #endif +#if JVET_M0101_HLS +class ConstraintInfo +{ + bool m_progressiveSourceFlag; + bool m_interlacedSourceFlag; + bool m_nonPackedConstraintFlag; + bool m_frameOnlyConstraintFlag; + bool m_intraOnlyConstraintFlag; + uint32_t m_maxBitDepthConstraintIdc; + ChromaFormat m_maxChromaFormatConstraintIdc; + bool m_onePictureOnlyConstraintFlag; + bool m_lowerBitRateConstraintFlag; + + bool m_noQtbttDualTreeIntraConstraintFlag; + bool m_noSaoConstraintFlag; + bool m_noAlfConstraintFlag; + bool m_noPcmConstraintFlag; +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool m_noRefWraparoundConstraintFlag; +#endif + bool m_noTemporalMvpConstraintFlag; + bool m_noSbtmvpConstraintFlag; + bool m_noAmvrConstraintFlag; +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool m_noBdofConstraintFlag; +#endif + bool m_noCclmConstraintFlag; + bool m_noMtsConstraintFlag; + bool m_noAffineMotionConstraintFlag; +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool m_noGbiConstraintFlag; + bool m_noMhIntraConstraintFlag; + bool m_noTriangleConstraintFlag; +#endif + bool m_noLadfConstraintFlag; +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool m_noCurrPicRefConstraintFlag; + bool m_noQpDeltaConstraintFlag; +#endif + bool m_noDepQuantConstraintFlag; + bool m_noSignDataHidingConstraintFlag; + +public: + ConstraintInfo() + : m_progressiveSourceFlag (false) + , m_interlacedSourceFlag (false) + , m_nonPackedConstraintFlag (false) + , m_frameOnlyConstraintFlag (false) + , m_intraOnlyConstraintFlag (false) + , m_maxBitDepthConstraintIdc ( 0) + , m_maxChromaFormatConstraintIdc(CHROMA_420) + , m_noQtbttDualTreeIntraConstraintFlag(false) + , m_noSaoConstraintFlag (false) + , m_noAlfConstraintFlag (false) + , m_noPcmConstraintFlag (false) +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + , m_noRefWraparoundConstraintFlag(false) +#endif + , m_noTemporalMvpConstraintFlag(false) + , m_noSbtmvpConstraintFlag (false) + , m_noAmvrConstraintFlag (false) +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + , m_noBdofConstraintFlag (false) +#endif + , m_noCclmConstraintFlag (false) + , m_noMtsConstraintFlag (false) + , m_noAffineMotionConstraintFlag(false) +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + , m_noGbiConstraintFlag (false) + , m_noMhIntraConstraintFlag (false) + , m_noTriangleConstraintFlag (false) +#endif + , m_noLadfConstraintFlag (false) +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + , m_noCurrPicRefConstraintFlag(false) + , m_noQpDeltaConstraintFlag (false) +#endif + , m_noDepQuantConstraintFlag (false) + , m_noSignDataHidingConstraintFlag(false) + {} + + bool getProgressiveSourceFlag() const { return m_progressiveSourceFlag; } + void setProgressiveSourceFlag(bool b) { m_progressiveSourceFlag = b; } + + bool getInterlacedSourceFlag() const { return m_interlacedSourceFlag; } + void setInterlacedSourceFlag(bool b) { m_interlacedSourceFlag = b; } + + bool getNonPackedConstraintFlag() const { return m_nonPackedConstraintFlag; } + void setNonPackedConstraintFlag(bool b) { m_nonPackedConstraintFlag = b; } + + bool getFrameOnlyConstraintFlag() const { return m_frameOnlyConstraintFlag; } + void setFrameOnlyConstraintFlag(bool b) { m_frameOnlyConstraintFlag = b; } + + uint32_t getMaxBitDepthConstraintIdc() const { return m_maxBitDepthConstraintIdc; } + void setMaxBitDepthConstraintIdc(uint32_t bitDepth) { m_maxBitDepthConstraintIdc = bitDepth; } + + ChromaFormat getMaxChromaFormatConstraintIdc() const { return m_maxChromaFormatConstraintIdc; } + void setMaxChromaFormatConstraintIdc(ChromaFormat fmt) { m_maxChromaFormatConstraintIdc = fmt; } + + bool getIntraOnlyConstraintFlag() const { return m_intraOnlyConstraintFlag; } + void setIntraOnlyConstraintFlag(bool b) { m_intraOnlyConstraintFlag = b; } + + bool getOnePictureOnlyConstraintFlag() const { return m_onePictureOnlyConstraintFlag; } + void setOnePictureOnlyConstraintFlag(bool b) { m_onePictureOnlyConstraintFlag = b; } + + bool getLowerBitRateConstraintFlag() const { return m_lowerBitRateConstraintFlag; } + void setLowerBitRateConstraintFlag(bool b) { m_lowerBitRateConstraintFlag = b; } + + bool getNoQtbttDualTreeIntraConstraintFlag() const { return m_noQtbttDualTreeIntraConstraintFlag; } + void setNoQtbttDualTreeIntraConstraintFlag(bool bVal) { m_noQtbttDualTreeIntraConstraintFlag = bVal; } + bool getNoSaoConstraintFlag() const { return m_noSaoConstraintFlag; } + void setNoSaoConstraintFlag(bool bVal) { m_noSaoConstraintFlag = bVal; } + bool getNoAlfConstraintFlag() const { return m_noAlfConstraintFlag; } + void setNoAlfConstraintFlag(bool bVal) { m_noAlfConstraintFlag = bVal; } + bool getNoPcmConstraintFlag() const { return m_noPcmConstraintFlag; } + void setNoPcmConstraintFlag(bool bVal) { m_noPcmConstraintFlag = bVal; } +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool getNoRefWraparoundConstraintFlag() const { return m_noRefWraparoundConstraintFlag; } + void setNoRefWraparoundConstraintFlag(bool bVal) { m_noRefWraparoundConstraintFlag = bVal; } +#endif + bool getNoTemporalMvpConstraintFlag() const { return m_noTemporalMvpConstraintFlag; } + void setNoTemporalMvpConstraintFlag(bool bVal) { m_noTemporalMvpConstraintFlag = bVal; } + bool getNoSbtmvpConstraintFlag() const { return m_noSbtmvpConstraintFlag; } + void setNoSbtmvpConstraintFlag(bool bVal) { m_noSbtmvpConstraintFlag = bVal; } + bool getNoAmvrConstraintFlag() const { return m_noAmvrConstraintFlag; } + void setNoAmvrConstraintFlag(bool bVal) { m_noAmvrConstraintFlag = bVal; } +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool getNoBdofConstraintFlag() const { return m_noBdofConstraintFlag; } + void setNoBdofConstraintFlag(bool bVal) { m_noBdofConstraintFlag = bVal; } +#endif + bool getNoCclmConstraintFlag() const { return m_noCclmConstraintFlag; } + void setNoCclmConstraintFlag(bool bVal) { m_noCclmConstraintFlag = bVal; } + bool getNoMtsConstraintFlag() const { return m_noMtsConstraintFlag; } + void setNoMtsConstraintFlag(bool bVal) { m_noMtsConstraintFlag = bVal; } + bool getNoAffineMotionConstraintFlag() const { return m_noAffineMotionConstraintFlag; } + void setNoAffineMotionConstraintFlag(bool bVal) { m_noAffineMotionConstraintFlag = bVal; } +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool getNoGbiConstraintFlag() const { return m_noGbiConstraintFlag; } + void setNoGbiConstraintFlag(bool bVal) { m_noGbiConstraintFlag = bVal; } + bool getNoMhIntraConstraintFlag() const { return m_noMhIntraConstraintFlag; } + void setNoMhIntraConstraintFlag(bool bVal) { m_noMhIntraConstraintFlag = bVal; } + bool getNoTriangleConstraintFlag() const { return m_noTriangleConstraintFlag; } + void setNoTriangleConstraintFlag(bool bVal) { m_noTriangleConstraintFlag = bVal; } +#endif + bool getNoLadfConstraintFlag() const { return m_noLadfConstraintFlag; } + void setNoLadfConstraintFlag(bool bVal) { m_noLadfConstraintFlag = bVal; } +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + bool getNoCurrPicRefConstraintFlag() const { return m_noCurrPicRefConstraintFlag; } + void setNoCurrPicRefConstraintFlag(bool bVal) { m_noCurrPicRefConstraintFlag = bVal; } + bool getNoQpDeltaConstraintFlag() const { return m_noQpDeltaConstraintFlag; } + void setNoQpDeltaConstraintFlag(bool bVal) { m_noQpDeltaConstraintFlag = bVal; } +#endif + bool getNoDepQuantConstraintFlag() const { return m_noDepQuantConstraintFlag; } + void setNoDepQuantConstraintFlag(bool bVal) { m_noDepQuantConstraintFlag = bVal; } + bool getNoSignDataHidingConstraintFlag() const { return m_noSignDataHidingConstraintFlag; } + void setNoSignDataHidingConstraintFlag(bool bVal) { m_noSignDataHidingConstraintFlag = bVal; } +}; +#endif + class ProfileTierLevel { +#if !JVET_M0101_HLS int m_profileSpace; +#endif Level::Tier m_tierFlag; Profile::Name m_profileIdc; +#if !JVET_M0101_HLS bool m_profileCompatibilityFlag[32]; +#endif Level::Name m_levelIdc; +#if !JVET_M0101_HLS bool m_progressiveSourceFlag; bool m_interlacedSourceFlag; bool m_nonPackedConstraintFlag; @@ -208,12 +372,18 @@ class ProfileTierLevel bool m_intraConstraintFlag; bool m_onePictureOnlyConstraintFlag; bool m_lowerBitRateConstraintFlag; +#else + ConstraintInfo m_constraintInfo; + bool m_subLayerLevelPresentFlag[MAX_TLAYER - 1]; + Level::Name m_subLayerLevelIdc[MAX_TLAYER - 1]; +#endif public: ProfileTierLevel(); - +#if !JVET_M0101_HLS int getProfileSpace() const { return m_profileSpace; } void setProfileSpace(int x) { m_profileSpace = x; } +#endif Level::Tier getTierFlag() const { return m_tierFlag; } void setTierFlag(Level::Tier x) { m_tierFlag = x; } @@ -221,12 +391,15 @@ public: Profile::Name getProfileIdc() const { return m_profileIdc; } void setProfileIdc(Profile::Name x) { m_profileIdc = x; } +#if !JVET_M0101_HLS bool getProfileCompatibilityFlag(int i) const { return m_profileCompatibilityFlag[i]; } void setProfileCompatibilityFlag(int i, bool x) { m_profileCompatibilityFlag[i] = x; } +#endif Level::Name getLevelIdc() const { return m_levelIdc; } void setLevelIdc(Level::Name x) { m_levelIdc = x; } +#if !JVET_M0101_HLS bool getProgressiveSourceFlag() const { return m_progressiveSourceFlag; } void setProgressiveSourceFlag(bool b) { m_progressiveSourceFlag = b; } @@ -253,9 +426,23 @@ public: bool getLowerBitRateConstraintFlag() const { return m_lowerBitRateConstraintFlag; } void setLowerBitRateConstraintFlag(bool b) { m_lowerBitRateConstraintFlag = b; } +#endif + +#if JVET_M0101_HLS + ConstraintInfo* getConstraintInfo() { return &m_constraintInfo; } + const ConstraintInfo* getConstraintInfo() const { return &m_constraintInfo; } + + bool getSubLayerLevelPresentFlag(int i) const { return m_subLayerLevelPresentFlag[i]; } + void setSubLayerLevelPresentFlag(int i, bool x) { m_subLayerLevelPresentFlag[i] = x; } + + Level::Name getSubLayerLevelIdc(int i) const { return m_subLayerLevelIdc[i]; } + void setSubLayerLevelIdc(int i, Level::Name x) { m_subLayerLevelIdc[i] = x; } +#endif + }; +#if !JVET_M0101_HLS class PTL { ProfileTierLevel m_generalPTL; @@ -276,6 +463,7 @@ public: ProfileTierLevel* getSubLayerPTL(int i) { return &m_subLayerPTL[i]; } const ProfileTierLevel* getSubLayerPTL(int i) const { return &m_subLayerPTL[i]; } }; +#endif struct HrdSubLayerInfo { @@ -827,6 +1015,7 @@ class SPS { private: int m_SPSId; +#if !JVET_M0101_HLS bool m_bIntraOnlyConstraintFlag; uint32_t m_maxBitDepthConstraintIdc; uint32_t m_maxChromaFormatConstraintIdc; @@ -859,6 +1048,7 @@ private: #endif bool m_bNoDepQuantConstraintFlag; bool m_bNoSignDataHidingConstraintFlag; +#endif #if JVET_M0246_AFFINE_AMVR bool m_affineAmvrEnabledFlag; @@ -948,7 +1138,11 @@ private: static const int m_winUnitX[NUM_CHROMA_FORMAT]; static const int m_winUnitY[NUM_CHROMA_FORMAT]; +#if !JVET_M0101_HLS PTL m_pcPTL; +#else + ProfileTierLevel m_profileTierLevel; +#endif bool m_alfEnabledFlag; @@ -1001,6 +1195,7 @@ public: int getVPSId() const { return m_VPSId; } void setVPSId(int i) { m_VPSId = i; } #endif +#if !JVET_M0101_HLS bool getIntraOnlyConstraintFlag() const { return m_bIntraOnlyConstraintFlag; } void setIntraOnlyConstraintFlag(bool bVal) { m_bIntraOnlyConstraintFlag = bVal; } uint32_t getMaxBitDepthConstraintIdc() const { return m_maxBitDepthConstraintIdc; } @@ -1057,6 +1252,7 @@ public: void setNoDepQuantConstraintFlag(bool bVal) { m_bNoDepQuantConstraintFlag = bVal; } bool getNoSignDataHidingConstraintFlag() const { return m_bNoSignDataHidingConstraintFlag; } void setNoSignDataHidingConstraintFlag(bool bVal) { m_bNoSignDataHidingConstraintFlag = bVal; } +#endif int getSPSId() const { return m_SPSId; } void setSPSId(int i) { m_SPSId = i; } ChromaFormat getChromaFormatIdc () const { return m_chromaFormatIdc; } @@ -1215,8 +1411,13 @@ public: void setVuiParametersPresentFlag(bool b) { m_vuiParametersPresentFlag = b; } VUI* getVuiParameters() { return &m_vuiParameters; } const VUI* getVuiParameters() const { return &m_vuiParameters; } +#if !JVET_M0101_HLS const PTL* getPTL() const { return &m_pcPTL; } PTL* getPTL() { return &m_pcPTL; } +#else + const ProfileTierLevel* getProfileTierLevel() const { return &m_profileTierLevel; } + ProfileTierLevel* getProfileTierLevel() { return &m_profileTierLevel; } +#endif const SPSRExt& getSpsRangeExtension() const { return m_spsRangeExtension; } SPSRExt& getSpsRangeExtension() { return m_spsRangeExtension; } @@ -1688,7 +1889,7 @@ private: bool m_noOutputPriorPicsFlag; bool m_noRaslOutputFlag; - bool m_handleCraAsBlaFlag; + bool m_handleCraAsCvsStartFlag; uint32_t m_colRefIdx; uint32_t m_maxNumMergeCand; @@ -1734,7 +1935,9 @@ private: bool m_cabacInitFlag; bool m_bLMvdL1Zero; +#if !JVET_M0101_HLS bool m_temporalLayerNonReferenceFlag; +#endif bool m_LFCrossSliceBoundaryFlag; bool m_enableTMVPFlag; @@ -1840,14 +2043,21 @@ public: bool getMvdL1ZeroFlag() const { return m_bLMvdL1Zero; } int getNumRpsCurrTempList() const; int getList1IdxToList0Idx( int list1Idx ) const { return m_list1IdxToList0Idx[list1Idx]; } +#if !JVET_M0101_HLS bool isReferenceNalu() const { return ((getNalUnitType() <= NAL_UNIT_RESERVED_VCL_R15) && (getNalUnitType()%2 != 0)) || ((getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP) && (getNalUnitType() <= NAL_UNIT_RESERVED_IRAP_VCL23) ); } +#endif void setPOC( int i ) { m_iPOC = i; } void setNalUnitType( NalUnitType e ) { m_eNalUnitType = e; } NalUnitType getNalUnitType() const { return m_eNalUnitType; } bool getRapPicFlag() const; bool getIdrPicFlag() const { return getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP; } +#if !JVET_M0101_HLS bool isIRAP() const { return (getNalUnitType() >= 16) && (getNalUnitType() <= 23); } bool isIDRorBLA() const { return (getNalUnitType() >= 16) && (getNalUnitType() <= 20); } +#else + bool isIRAP() const { return (getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL) && (getNalUnitType() <= NAL_UNIT_RESERVED_IRAP_VCL13); } + bool isIDRorBLA() const { return (getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL) && (getNalUnitType() <= NAL_UNIT_CODED_SLICE_IDR_N_LP); } +#endif void checkCRA(const ReferencePictureSet *pReferencePictureSet, int& pocCRA, NalUnitType& associatedIRAPType, PicList& rcListPic); void decodingRefreshMarking(int& pocCRA, bool& bRefreshPending, PicList& rcListPic, const bool bEfficientFieldIRAPEnabled); void setSliceType( SliceType e ) { m_eSliceType = e; } @@ -1960,8 +2170,8 @@ public: void setNoRaslOutputFlag( bool val ) { m_noRaslOutputFlag = val; } bool getNoRaslOutputFlag() const { return m_noRaslOutputFlag; } - void setHandleCraAsBlaFlag( bool val ) { m_handleCraAsBlaFlag = val; } - bool getHandleCraAsBlaFlag() const { return m_handleCraAsBlaFlag; } + void setHandleCraAsCvsStartFlag( bool val ) { m_handleCraAsCvsStartFlag = val; } + bool getHandleCraAsCvsStartFlag() const { return m_handleCraAsCvsStartFlag; } void setSliceMode( SliceConstraint mode ) { m_sliceMode = mode; } SliceConstraint getSliceMode() const { return m_sliceMode; } @@ -2024,8 +2234,10 @@ public: void setCabacInitFlag( bool val ) { m_cabacInitFlag = val; } //!< set CABAC initial flag bool getCabacInitFlag() const { return m_cabacInitFlag; } //!< get CABAC initial flag +#if !JVET_M0101_HLS bool getTemporalLayerNonReferenceFlag() const { return m_temporalLayerNonReferenceFlag; } void setTemporalLayerNonReferenceFlag(bool x) { m_temporalLayerNonReferenceFlag = x; } +#endif void setLFCrossSliceBoundaryFlag( bool val ) { m_LFCrossSliceBoundaryFlag = val; } bool getLFCrossSliceBoundaryFlag() const { return m_LFCrossSliceBoundaryFlag; } diff --git a/source/Lib/CommonLib/TypeDef.h b/source/Lib/CommonLib/TypeDef.h index 32b3fc7177e49ea1eef0c555967dcbd79a74b3d7..04de41c875df11c5ede678b82888df1f84fa3304 100644 --- a/source/Lib/CommonLib/TypeDef.h +++ b/source/Lib/CommonLib/TypeDef.h @@ -282,6 +282,8 @@ typedef std::pair<int, int> TrCost; #define JVET_M0132_APS 1 // APS +#define JVET_M0101_HLS 1 // joint HLS syntax + #define KEEP_PRED_AND_RESI_SIGNALS 0 @@ -935,6 +937,57 @@ enum PPSExtensionFlagIndex // effort can be done without use of macros to alter the names used to indicate the different NAL unit types. enum NalUnitType { +#if JVET_M0101_HLS + NAL_UNIT_CODED_SLICE_TRAIL = 0, // 0 + NAL_UNIT_CODED_SLICE_STSA, // 1 + + //KJS: keep RADL/RASL since there is no real decision on these types yet + NAL_UNIT_CODED_SLICE_RADL, // 2 should be NAL_UNIT_RESERVED_VCL_2, + NAL_UNIT_CODED_SLICE_RASL, // 3 should be NAL_UNIT_RESERVED_VCL_3, + + NAL_UNIT_RESERVED_VCL_4, + NAL_UNIT_RESERVED_VCL_5, + NAL_UNIT_RESERVED_VCL_6, + NAL_UNIT_RESERVED_VCL_7, + + NAL_UNIT_CODED_SLICE_IDR_W_RADL, // 8 + NAL_UNIT_CODED_SLICE_IDR_N_LP, // 9 + NAL_UNIT_CODED_SLICE_CRA, // 10 + + NAL_UNIT_RESERVED_IRAP_VCL11, + NAL_UNIT_RESERVED_IRAP_VCL12, + NAL_UNIT_RESERVED_IRAP_VCL13, + + NAL_UNIT_RESERVED_VCL14, + +#if HEVC_VPS + NAL_UNIT_VPS, // probably not coming back +#else + NAL_UNIT_RESERVED_VCL15, +#endif + + NAL_UNIT_RESERVED_NVCL16, // probably DPS + + NAL_UNIT_SPS, // 17 + NAL_UNIT_PPS, // 18 +#if JVET_M0132_APS + NAL_UNIT_APS, // 19 NAL unit type number needs to be reaaranged. +#endif + NAL_UNIT_ACCESS_UNIT_DELIMITER, // 20 + NAL_UNIT_EOS, // 21 + NAL_UNIT_EOB, // 22 + NAL_UNIT_PREFIX_SEI, // 23 + NAL_UNIT_SUFFIX_SEI, // 24 + NAL_UNIT_FILLER_DATA, // 25 keep: may be added with HRD + + NAL_UNIT_RESERVED_NVCL26, + NAL_UNIT_RESERVED_NVCL27, + NAL_UNIT_UNSPECIFIED_28, + NAL_UNIT_UNSPECIFIED_29, + NAL_UNIT_UNSPECIFIED_30, + NAL_UNIT_UNSPECIFIED_31, + NAL_UNIT_INVALID, +#else NAL_UNIT_CODED_SLICE_TRAIL_N = 0, // 0 NAL_UNIT_CODED_SLICE_TRAIL_R, // 1 @@ -1016,6 +1069,7 @@ enum NalUnitType NAL_UNIT_UNSPECIFIED_62, NAL_UNIT_UNSPECIFIED_63, NAL_UNIT_INVALID, +#endif }; #if SHARP_LUMA_DELTA_QP diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 4e08b972379c6fa3880efa7092e980347649be49..6970b7752711758cbefb5e3cf618a4dcab98b5f2 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -1001,12 +1001,14 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl #endif m_apcSlicePilot->setNalUnitType(nalu.m_nalUnitType); +#if !JVET_M0101_HLS bool nonReferenceFlag = (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TRAIL_N || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_TSA_N || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_STSA_N || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_N || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N); m_apcSlicePilot->setTemporalLayerNonReferenceFlag(nonReferenceFlag); +#endif m_apcSlicePilot->setTLayer(nalu.m_temporalId); m_HLSReader.setBitstream( &nalu.getBitstream() ); @@ -1055,9 +1057,14 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl //For inference of NoOutputOfPriorPicsFlag if (m_apcSlicePilot->getRapPicFlag()) { +#if !JVET_M0101_HLS if ((m_apcSlicePilot->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && m_apcSlicePilot->getNalUnitType() <= NAL_UNIT_CODED_SLICE_IDR_N_LP) || (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_bFirstSliceInSequence) || - (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsBlaFlag())) + (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsCvsStartFlag())) +#else + if ((m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_bFirstSliceInSequence) || + (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA && m_apcSlicePilot->getHandleCraAsCvsStartFlag())) +#endif { m_apcSlicePilot->setNoRaslOutputFlag(true); } @@ -1090,7 +1097,11 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl } //For inference of PicOutputFlag +#if !JVET_M0101_HLS if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_R) +#else + if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL) +#endif { if ( m_craNoRaslOutputFlag ) { @@ -1125,12 +1136,14 @@ bool DecLib::xDecodeSlice(InputNALUnit &nalu, int &iSkipFrame, int iPOCLastDispl return false; } // Skip TFD pictures associated with BLA/BLANT pictures +#if !JVET_M0101_HLS if (isSkipPictureForBLA(iPOCLastDisplay)) { m_prevSliceSkipped = true; m_skippedPOC = m_apcSlicePilot->getPOC(); return false; } +#endif // clear previous slice skipped flag m_prevSliceSkipped = false; @@ -1524,6 +1537,7 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) } return false; +#if !JVET_M0101_HLS case NAL_UNIT_CODED_SLICE_TRAIL_R: case NAL_UNIT_CODED_SLICE_TRAIL_N: case NAL_UNIT_CODED_SLICE_TSA_R: @@ -1540,6 +1554,15 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) case NAL_UNIT_CODED_SLICE_RADL_R: case NAL_UNIT_CODED_SLICE_RASL_N: case NAL_UNIT_CODED_SLICE_RASL_R: +#else + case NAL_UNIT_CODED_SLICE_TRAIL: + case NAL_UNIT_CODED_SLICE_STSA: + case NAL_UNIT_CODED_SLICE_IDR_W_RADL: + case NAL_UNIT_CODED_SLICE_IDR_N_LP: + case NAL_UNIT_CODED_SLICE_CRA: + case NAL_UNIT_CODED_SLICE_RADL: + case NAL_UNIT_CODED_SLICE_RASL: +#endif ret = xDecodeSlice(nalu, iSkipFrame, iPOCLastDisplay); #if JVET_J0090_MEMORY_BANDWITH_MEASURE if ( ret ) @@ -1580,7 +1603,7 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) msg( NOTICE, "Note: found NAL_UNIT_FILLER_DATA with %u bytes payload.\n", size); return false; } - +#if !JVET_M0101_HLS case NAL_UNIT_RESERVED_VCL_N10: case NAL_UNIT_RESERVED_VCL_R11: case NAL_UNIT_RESERVED_VCL_N12: @@ -1601,11 +1624,26 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) case NAL_UNIT_RESERVED_VCL31: #if !HEVC_VPS case NAL_UNIT_RESERVED_32: +#endif +#else + case NAL_UNIT_RESERVED_VCL_4: + case NAL_UNIT_RESERVED_VCL_5: + case NAL_UNIT_RESERVED_VCL_6: + case NAL_UNIT_RESERVED_VCL_7: + + case NAL_UNIT_RESERVED_IRAP_VCL11: + case NAL_UNIT_RESERVED_IRAP_VCL12: + case NAL_UNIT_RESERVED_IRAP_VCL13: + + case NAL_UNIT_RESERVED_VCL14: +#if !HEVC_VPS + case NAL_UNIT_RESERVED_VCL15: +#endif #endif msg( NOTICE, "Note: found reserved VCL NAL unit.\n"); xParsePrefixSEIsForUnknownVCLNal(); return false; - +#if !JVET_M0101_HLS case NAL_UNIT_RESERVED_NVCL41: case NAL_UNIT_RESERVED_NVCL42: case NAL_UNIT_RESERVED_NVCL43: @@ -1613,8 +1651,14 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) case NAL_UNIT_RESERVED_NVCL45: case NAL_UNIT_RESERVED_NVCL46: case NAL_UNIT_RESERVED_NVCL47: +#else + case NAL_UNIT_RESERVED_NVCL16: + case NAL_UNIT_RESERVED_NVCL26: + case NAL_UNIT_RESERVED_NVCL27: +#endif msg( NOTICE, "Note: found reserved NAL unit.\n"); return false; +#if !JVET_M0101_HLS case NAL_UNIT_UNSPECIFIED_48: case NAL_UNIT_UNSPECIFIED_49: case NAL_UNIT_UNSPECIFIED_50: @@ -1631,6 +1675,12 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) case NAL_UNIT_UNSPECIFIED_61: case NAL_UNIT_UNSPECIFIED_62: case NAL_UNIT_UNSPECIFIED_63: +#else + case NAL_UNIT_UNSPECIFIED_28: + case NAL_UNIT_UNSPECIFIED_29: + case NAL_UNIT_UNSPECIFIED_30: + case NAL_UNIT_UNSPECIFIED_31: +#endif msg( NOTICE, "Note: found unspecified NAL unit.\n"); return false; default: @@ -1641,6 +1691,7 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay) return false; } +#if !JVET_M0101_HLS /** Function for checking if picture should be skipped because of association with a previous BLA picture * This function skips all TFD pictures that follow a BLA picture in decoding order and precede it in output order. */ @@ -1654,6 +1705,7 @@ bool DecLib::isSkipPictureForBLA( int& iPOCLastDisplay ) } return false; } +#endif /** Function for checking if picture should be skipped because of random access. This function checks the skipping of pictures in the case of -s option random access. * All pictures prior to the random access point indicated by the counter iSkipFrame are skipped. @@ -1673,10 +1725,14 @@ bool DecLib::isRandomAccessSkipPicture( int& iSkipFrame, int& iPOCLastDisplay ) } else if (m_pocRandomAccess == MAX_INT) // start of random access point, m_pocRandomAccess has not been set yet. { +#if !JVET_M0101_HLS if ( m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL ) +#else + if (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) +#endif { // set the POC random access since we need to skip the reordered pictures in the case of CRA/CRANT/BLA/BLANT. m_pocRandomAccess = m_apcSlicePilot->getPOC(); @@ -1696,7 +1752,11 @@ bool DecLib::isRandomAccessSkipPicture( int& iSkipFrame, int& iPOCLastDisplay ) } } // skip the reordered pictures, if necessary +#if !JVET_M0101_HLS else if (m_apcSlicePilot->getPOC() < m_pocRandomAccess && (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_R || m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N)) +#else + else if (m_apcSlicePilot->getPOC() < m_pocRandomAccess && (m_apcSlicePilot->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL)) +#endif { iPOCLastDisplay++; return true; diff --git a/source/Lib/DecoderLib/DecLib.h b/source/Lib/DecoderLib/DecLib.h index d64b2f48f3df8392ebde4589c88dc872ee3cf7eb..89a4acc8f2fe1b65691363d09e21016936095e45 100644 --- a/source/Lib/DecoderLib/DecLib.h +++ b/source/Lib/DecoderLib/DecLib.h @@ -108,8 +108,9 @@ private: #if JVET_J0090_MEMORY_BANDWITH_MEASURE CacheModel m_cacheModel; #endif - +#if !JVET_M0101_HLS bool isSkipPictureForBLA(int& iPOCLastDisplay); +#endif bool isRandomAccessSkipPicture(int& iSkipFrame, int& iPOCLastDisplay); Picture* m_pcPic; uint32_t m_uiSliceSegmentIdx; @@ -187,7 +188,11 @@ protected: #if JVET_M0132_APS void xDecodeAPS(InputNALUnit& nalu); #endif +#if !JVET_M0101_HLS void xUpdatePreviousTid0POC( Slice *pSlice ) { if ((pSlice->getTLayer()==0) && (pSlice->isReferenceNalu() && (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RASL_R)&& (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RADL_R))) { m_prevTid0POC=pSlice->getPOC(); } } +#else + void xUpdatePreviousTid0POC(Slice *pSlice) { if ((pSlice->getTLayer() == 0) && (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RASL) && (pSlice->getNalUnitType()!=NAL_UNIT_CODED_SLICE_RADL)) { m_prevTid0POC = pSlice->getPOC(); } } +#endif void xParsePrefixSEImessages(); void xParsePrefixSEIsForUnknownVCLNal(); diff --git a/source/Lib/DecoderLib/NALread.cpp b/source/Lib/DecoderLib/NALread.cpp index 2d676be22f669499b7dcf625ee151b07a0fc6f94..7b507b99fbe67d13581ea4bdcf2b7bc48f749907 100644 --- a/source/Lib/DecoderLib/NALread.cpp +++ b/source/Lib/DecoderLib/NALread.cpp @@ -141,6 +141,7 @@ void readNalUnitHeader(InputNALUnit& nalu) if ( nalu.m_temporalId ) { #if HEVC_VPS +#if !JVET_M0101_HLS CHECK( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_N_LP @@ -153,6 +154,17 @@ void readNalUnitHeader(InputNALUnit& nalu) || nalu.m_nalUnitType == NAL_UNIT_EOB , "Invalid NAL type" ); #else + CHECK( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP + || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA + || nalu.m_nalUnitType == NAL_UNIT_VPS + || nalu.m_nalUnitType == NAL_UNIT_SPS + || nalu.m_nalUnitType == NAL_UNIT_EOS + || nalu.m_nalUnitType == NAL_UNIT_EOB + , "Invalid NAL type" ); +#endif +#else +#if !JVET_M0101_HLS CHECK(nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_LP || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_W_RADL || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_BLA_N_LP @@ -163,15 +175,30 @@ void readNalUnitHeader(InputNALUnit& nalu) || nalu.m_nalUnitType == NAL_UNIT_EOS || nalu.m_nalUnitType == NAL_UNIT_EOB , "Invalid NAL type"); +#else + CHECK(nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_IDR_N_LP + || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_CRA + || nalu.m_nalUnitType == NAL_UNIT_SPS + || nalu.m_nalUnitType == NAL_UNIT_EOS + || nalu.m_nalUnitType == NAL_UNIT_EOB + , "Invalid NAL type"); +#endif #endif + } else { +#if !JVET_M0101_HLS CHECK( nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_R || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_TSA_N || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA_R || nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA_N , "Invalid NAL type" ); +#else + CHECK(nalu.m_nalUnitType == NAL_UNIT_CODED_SLICE_STSA + , "Invalid NAL type"); +#endif } } } diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index 945b6ad19f5dcc79290c24cc427c28d5ef5fce87..5bcd4e35bb7f4496e55d0976d247efe92ac506ea 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -893,6 +893,7 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) #if HEVC_VPS READ_CODE( 4, uiCode, "sps_video_parameter_set_id"); pcSPS->setVPSId ( uiCode ); #endif +#if !JVET_M0101_HLS READ_UVLC( uiCode, "sps_seq_parameter_set_id" ); pcSPS->setSPSId( uiCode ); CHECK(uiCode > 15, "Invalid SPS id signalled"); @@ -938,7 +939,17 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) // sps_temporal_id_nesting_flag must be 1 when sps_max_sub_layers_minus1 is 0 CHECK( uiCode != 1, "Invalid maximum number of T-layers" ); } - parsePTL(pcSPS->getPTL(), 1, pcSPS->getMaxTLayers() - 1); + parsePTL(pcSPS->getPTL(), true, pcSPS->getMaxTLayers() - 1); +#else + READ_CODE(3, uiCode, "sps_max_sub_layers_minus1"); pcSPS->setMaxTLayers (uiCode + 1); + CHECK(uiCode > 6, "Invalid maximum number of T-layer signalled"); + READ_CODE(5, uiCode, "sps_reserved_zero_5bits"); + CHECK(uiCode != 0, "sps_reserved_zero_5bits not equal to zero"); + + parseProfileTierLevel(pcSPS->getProfileTierLevel(), pcSPS->getMaxTLayers() - 1); + + READ_UVLC(uiCode, "sps_seq_parameter_set_id"); pcSPS->setSPSId(uiCode); +#endif READ_UVLC( uiCode, "chroma_format_idc" ); pcSPS->setChromaFormatIdc( ChromaFormat(uiCode) ); CHECK(uiCode > 3, "Invalid chroma format signalled"); @@ -1058,10 +1069,12 @@ void HLSyntaxReader::parseSPS(SPS* pcSPS) pcSPS->setMaxBTSize(maxBTSize[1], maxBTSize[0], maxBTSize[2]); pcSPS->setMaxTTSize(maxTTSize[1], maxTTSize[0], maxTTSize[2]); +#if !JVET_M0101_HLS if (pcSPS->getPTL()->getGeneralPTL()->getLevelIdc() >= Level::LEVEL5) { CHECK(log2MinCUSize + pcSPS->getLog2DiffMaxMinCodingBlockSize() < 5, "Invalid code"); } +#endif #if MAX_TB_SIZE_SIGNALLING // KJS: Not in syntax @@ -1511,6 +1524,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para { iPOCmsb = iPrevPOCmsb; } +#if !JVET_M0101_HLS if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP ) @@ -1518,6 +1532,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para // For BLA picture types, POCmsb is set to 0. iPOCmsb = 0; } +#endif pcSlice->setPOC (iPOCmsb+iPOClsb); ReferencePictureSet* rps; @@ -1633,6 +1648,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para offset += rps->getNumberOfLongtermPictures(); rps->setNumberOfPictures(offset); } +#if !JVET_M0101_HLS if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP ) @@ -1642,6 +1658,7 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para (*rps)=ReferencePictureSet(); pcSlice->setRPS(rps); } +#endif if (sps->getSPSTemporalMVPEnabledFlag()) { READ_FLAG( uiCode, "slice_temporal_mvp_enabled_flag" ); @@ -2119,8 +2136,81 @@ void HLSyntaxReader::parseSliceHeader (Slice* pcSlice, ParameterSetManager *para return; } +#if JVET_M0101_HLS +void HLSyntaxReader::parseConstraintInfo(ConstraintInfo *cinfo) +{ + uint32_t symbol; + READ_FLAG(symbol, "general_progressive_source_flag" ); cinfo->setProgressiveSourceFlag(symbol ? true : false); + READ_FLAG(symbol, "general_interlaced_source_flag" ); cinfo->setInterlacedSourceFlag(symbol ? true : false); + READ_FLAG(symbol, "general_non_packed_constraint_flag" ); cinfo->setNonPackedConstraintFlag(symbol ? true : false); + READ_FLAG(symbol, "general_frame_only_constraint_flag" ); cinfo->setFrameOnlyConstraintFlag(symbol ? true : false); + READ_FLAG(symbol, "intra_only_constraint_flag" ); cinfo->setIntraOnlyConstraintFlag(symbol ? true : false); + + READ_CODE(4, symbol, "max_bitdepth_constraint_idc" ); cinfo->setMaxBitDepthConstraintIdc(symbol); + READ_CODE(2, symbol, "max_chroma_format_constraint_idc" ); cinfo->setMaxChromaFormatConstraintIdc((ChromaFormat)symbol); + + READ_FLAG(symbol, "no_qtbtt_dual_tree_intra_constraint_flag" ); cinfo->setNoQtbttDualTreeIntraConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_sao_constraint_flag"); cinfo->setNoSaoConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_alf_constraint_flag"); cinfo->setNoAlfConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_pcm_constraint_flag"); cinfo->setNoPcmConstraintFlag(symbol > 0 ? true : false); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + READ_FLAG(symbol, "no_ref_wraparound_constraint_flag"); cinfo->setNoRefWraparoundConstraintFlag(symbol > 0 ? true : false); +#endif + READ_FLAG(symbol, "no_temporal_mvp_constraint_flag"); cinfo->setNoTemporalMvpConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_sbtmvp_constraint_flag"); cinfo->setNoSbtmvpConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_amvr_constraint_flag"); cinfo->setNoAmvrConstraintFlag(symbol > 0 ? true : false); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + READ_FLAG(symbol, "no_bdof_constraint_flag"); cinfo->setNoBdofConstraintFlag(symbol > 0 ? true : false); +#endif + READ_FLAG(symbol, "no_cclm_constraint_flag"); cinfo->setNoCclmConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_mts_constraint_flag"); cinfo->setNoMtsConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_affine_motion_constraint_flag"); cinfo->setNoAffineMotionConstraintFlag(symbol > 0 ? true : false); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + READ_FLAG(symbol, "no_gbi_constraint_flag"); cinfo->setNoGbiConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_mh_intra_constraint_flag"); cinfo->setNoMhIntraConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_triangle_constraint_flag"); cinfo->setNoTriangleConstraintFlag(symbol > 0 ? true : false); +#endif + READ_FLAG(symbol, "no_ladf_constraint_flag"); cinfo->setNoLadfConstraintFlag(symbol > 0 ? true : false); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + READ_FLAG(symbol, "no_curr_pic_ref_constraint_flag"); cinfo->setNoCurrPicRefConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_qp_delta_constraint_flag"); cinfo->setNoQpDeltaConstraintFlag(symbol > 0 ? true : false); +#endif + READ_FLAG(symbol, "no_dep_quant_constraint_flag"); cinfo->setNoDepQuantConstraintFlag(symbol > 0 ? true : false); + READ_FLAG(symbol, "no_sign_data_hiding_constraint_flag"); cinfo->setNoSignDataHidingConstraintFlag(symbol > 0 ? true : false); +} + +void HLSyntaxReader::parseProfileTierLevel(ProfileTierLevel *ptl, int maxNumSubLayersMinus1) +{ + uint32_t symbol; + READ_CODE(7 , symbol, "general_profile_idc" ); ptl->setProfileIdc (Profile::Name(symbol)); + READ_FLAG( symbol, "general_tier_flag" ); ptl->setTierFlag (symbol ? Level::HIGH : Level::MAIN); + parseConstraintInfo( ptl->getConstraintInfo() ); + + READ_CODE(8 , symbol, "general_level_idc" ); ptl->setLevelIdc (Level::Name(symbol)); + + for (int i = 0; i < maxNumSubLayersMinus1; i++) + { + READ_FLAG( symbol, "sub_layer_level_present_flag[i]" ); ptl->setSubLayerLevelPresentFlag (i, symbol); + } + + while (!isByteAligned()) + { + READ_FLAG( symbol, "ptl_alignment_zero_bit" ); CHECK (symbol != 0, "ptl_alignment_zero_bit not equal to zero"); + } + + for (int i = 0; i < maxNumSubLayersMinus1; i++) + { + if (ptl->getSubLayerLevelPresentFlag(i)) + { + READ_CODE(8 , symbol, "sub_layer_level_idc" ); ptl->setSubLayerLevelIdc (i, Level::Name(symbol)); + } + } +} + + +#else void HLSyntaxReader::parsePTL( PTL *rpcPTL, bool profilePresentFlag, int maxNumSubLayersMinus1 ) { uint32_t uiCode; @@ -2228,6 +2318,7 @@ void HLSyntaxReader::parseProfileTier(ProfileTierLevel *ptl, const bool /*bIsSub } #undef PTL_TRACE_TEXT } +#endif void HLSyntaxReader::parseTerminatingBit( uint32_t& ruiBit ) { diff --git a/source/Lib/DecoderLib/VLCReader.h b/source/Lib/DecoderLib/VLCReader.h index ac4a6bed11a401db99f75ca525dd9fbac4fb2471..db9070a7079ef73c0bbfaf6710c5d54de126e737 100644 --- a/source/Lib/DecoderLib/VLCReader.h +++ b/source/Lib/DecoderLib/VLCReader.h @@ -109,6 +109,9 @@ public: protected: void xReadRbspTrailingBits(); +#if JVET_M0101_HLS + bool isByteAligned() { return (m_pcBitstream->getNumBitsUntilByteAligned() != 0 ); } +#endif }; @@ -153,8 +156,13 @@ public: void parseAPS ( APS* pcAPS); #endif void parseVUI ( VUI* pcVUI, SPS* pcSPS ); +#if !JVET_M0101_HLS void parsePTL ( PTL *rpcPTL, bool profilePresentFlag, int maxNumSubLayersMinus1 ); void parseProfileTier ( ProfileTierLevel *ptl, const bool bIsSubLayer ); +#else + void parseConstraintInfo (ConstraintInfo *cinfo); + void parseProfileTierLevel ( ProfileTierLevel *ptl, int maxNumSubLayersMinus1); +#endif void parseHrdParameters ( HRD *hrd, bool cprms_present_flag, uint32_t tempLevelHigh ); void parseSliceHeader ( Slice* pcSlice, ParameterSetManager *parameterSetManager, const int prevTid0POC ); void parseTerminatingBit ( uint32_t& ruiBit ); diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index ff610aa75635439f9cbd1441841bc69f8419d9f6..7d687a17e4d7ea3b6058065e154ff038e0dbcfa0 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -995,7 +995,11 @@ void EfficientFieldIRAPMapping::initialize(const bool isField, const int gopSize // check if POC corresponds to IRAP NalUnitType tmpUnitType = pEncGop->getNalUnitType(pocCurr, lastIDR, isField); +#if !JVET_M0101_HLS if(tmpUnitType >= NAL_UNIT_CODED_SLICE_BLA_W_LP && tmpUnitType <= NAL_UNIT_CODED_SLICE_CRA) // if picture is an IRAP +#else + if (tmpUnitType >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && tmpUnitType <= NAL_UNIT_CODED_SLICE_CRA) // if picture is an IRAP +#endif { if(pocCurr%2 == 0 && iGOPid < gopSize-1 && pCfg->getGOPEntry(iGOPid).m_POC == pCfg->getGOPEntry(iGOPid+1).m_POC-1) { // if top field and following picture in enc order is associated bottom field @@ -1517,6 +1521,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, #endif // Set the nal unit type pcSlice->setNalUnitType(getNalUnitType(pocCurr, m_iLastIDR, isField)); +#if !JVET_M0101_HLS if(pcSlice->getTemporalLayerNonReferenceFlag()) { if (pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_TRAIL_R && @@ -1534,15 +1539,22 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_RASL_N); } } +#endif if (m_pcCfg->getEfficientFieldIRAPEnabled()) { +#if !JVET_M0101_HLS if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) // IRAP picture +#else + if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP + || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) // IRAP picture +#endif { m_associatedIRAPType = pcSlice->getNalUnitType(); m_associatedIRAPPOC = pocCurr; @@ -1578,12 +1590,18 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } if (!m_pcCfg->getEfficientFieldIRAPEnabled()) { +#if !JVET_M0101_HLS if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_BLA_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA ) // IRAP picture +#else + if ( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_W_RADL + || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_IDR_N_LP + || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_CRA) // IRAP picture +#endif { m_associatedIRAPType = pcSlice->getNalUnitType(); m_associatedIRAPPOC = pocCurr; @@ -1593,7 +1611,11 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } if ((pcSlice->checkThatAllRefPicsAreAvailable(rcListPic, pcSlice->getRPS(), false, m_iLastRecoveryPicPOC, m_pcCfg->getDecodingRefreshType() == 3) != 0) || (pcSlice->isIRAP()) +#if !JVET_M0101_HLS || (m_pcCfg->getEfficientFieldIRAPEnabled() && isField && pcSlice->getAssociatedIRAPType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && pcSlice->getAssociatedIRAPType() <= NAL_UNIT_CODED_SLICE_CRA && pcSlice->getAssociatedIRAPPOC() == pcSlice->getPOC()+1) +#else + || (m_pcCfg->getEfficientFieldIRAPEnabled() && isField && pcSlice->getAssociatedIRAPType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && pcSlice->getAssociatedIRAPType() <= NAL_UNIT_CODED_SLICE_CRA && pcSlice->getAssociatedIRAPPOC() == pcSlice->getPOC() + 1) +#endif ) { pcSlice->createExplicitReferencePictureSetFromReference(rcListPic, pcSlice->getRPS(), pcSlice->isIRAP(), m_iLastRecoveryPicPOC, m_pcCfg->getDecodingRefreshType() == 3, m_pcCfg->getEfficientFieldIRAPEnabled() @@ -1604,12 +1626,18 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, pcSlice->applyReferencePictureSet(rcListPic, pcSlice->getRPS()); if(pcSlice->getTLayer() > 0 +#if !JVET_M0101_HLS && !( pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_N // Check if not a leading picture || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL_R || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_N || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL_R ) +#else + && !(pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RADL // Check if not a leading picture + || pcSlice->getNalUnitType() == NAL_UNIT_CODED_SLICE_RASL) +#endif ) { +#if !JVET_M0101_HLS if(pcSlice->isTemporalLayerSwitchingPoint(rcListPic) || pcSlice->getSPS()->getTemporalIdNestingFlag()) { if(pcSlice->getTemporalLayerNonReferenceFlag()) @@ -1622,6 +1650,9 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } } else if(pcSlice->isStepwiseTemporalLayerSwitchingPointCandidate(rcListPic)) +#else + if (pcSlice->isStepwiseTemporalLayerSwitchingPointCandidate(rcListPic)) +#endif { bool isSTSA=true; for(int ii=iGOPid+1;(ii<m_pcCfg->getGOPSize() && isSTSA==true);ii++) @@ -1655,6 +1686,7 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, } if(isSTSA==true) { +#if !JVET_M0101_HLS if(pcSlice->getTemporalLayerNonReferenceFlag()) { pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_N); @@ -1663,6 +1695,9 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, { pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA_R); } +#else + pcSlice->setNalUnitType(NAL_UNIT_CODED_SLICE_STSA); +#endif } } } @@ -2615,7 +2650,11 @@ void EncGOP::compressGOP( int iPOCLast, int iNumPicRcvd, PicList& rcListPic, pcSlice->setNoRaslOutputFlag(false); if (pcSlice->isIRAP()) { +#if !JVET_M0101_HLS if (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_BLA_W_LP && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_IDR_N_LP) +#else + if (pcSlice->getNalUnitType() >= NAL_UNIT_CODED_SLICE_IDR_W_RADL && pcSlice->getNalUnitType() <= NAL_UNIT_CODED_SLICE_IDR_N_LP) +#endif { pcSlice->setNoRaslOutputFlag(true); } @@ -3634,7 +3673,11 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField) if (m_pcCfg->getEfficientFieldIRAPEnabled() && isField && pocCurr == (m_pcCfg->getUseCompositeRef() ? 2: 1)) { // to avoid the picture becoming an IRAP +#if !JVET_M0101_HLS return NAL_UNIT_CODED_SLICE_TRAIL_R; +#else + return NAL_UNIT_CODED_SLICE_TRAIL; +#endif } if (m_pcCfg->getDecodingRefreshType() != 3 && (pocCurr - isField) % (m_pcCfg->getIntraPeriod() * (m_pcCfg->getUseCompositeRef() ? 2 : 1)) == 0) @@ -3657,17 +3700,29 @@ NalUnitType EncGOP::getNalUnitType(int pocCurr, int lastIDR, bool isField) // picture can be still decodable when random accessing to a CRA/CRANT/BLA/BLANT picture by // controlling the reference pictures used for encoding that leading picture. Such a leading // picture need not be marked as a TFD picture. +#if !JVET_M0101_HLS return NAL_UNIT_CODED_SLICE_RASL_R; +#else + return NAL_UNIT_CODED_SLICE_RASL; +#endif } } if (lastIDR>0) { if (pocCurr < lastIDR) { +#if !JVET_M0101_HLS return NAL_UNIT_CODED_SLICE_RADL_R; +#else + return NAL_UNIT_CODED_SLICE_RADL; +#endif } } +#if !JVET_M0101_HLS return NAL_UNIT_CODED_SLICE_TRAIL_R; +#else + return NAL_UNIT_CODED_SLICE_TRAIL; +#endif } void EncGOP::xUpdateRasInit(Slice* slice) diff --git a/source/Lib/EncoderLib/EncLib.cpp b/source/Lib/EncoderLib/EncLib.cpp index b767e5d97dd4184fa041ca9f911b529241bdfc84..d402c7be9296321cba9ebe03e09168e54e534703 100644 --- a/source/Lib/EncoderLib/EncLib.cpp +++ b/source/Lib/EncoderLib/EncLib.cpp @@ -855,6 +855,7 @@ void EncLib::xInitVPS(VPS &vps, const SPS &sps) void EncLib::xInitSPS(SPS &sps) { +#if !JVET_M0101_HLS sps.setIntraOnlyConstraintFlag(m_bIntraOnlyConstraintFlag); sps.setMaxBitDepthConstraintIdc(m_maxBitDepthConstraintIdc); sps.setMaxChromaFormatConstraintIdc(m_maxChromaFormatConstraintIdc); @@ -913,7 +914,50 @@ void EncLib::xInitSPS(SPS &sps) /* A Profile::MAIN10 decoder can always decode Profile::MAIN */ profileTierLevel.setProfileCompatibilityFlag( Profile::MAIN10, 1 ); } +#else + ProfileTierLevel* profileTierLevel = sps.getProfileTierLevel(); + ConstraintInfo* cinfo = profileTierLevel->getConstraintInfo(); + cinfo->setProgressiveSourceFlag (m_progressiveSourceFlag); + cinfo->setInterlacedSourceFlag (m_interlacedSourceFlag); + cinfo->setNonPackedConstraintFlag (m_nonPackedConstraintFlag); + cinfo->setFrameOnlyConstraintFlag (m_frameOnlyConstraintFlag); + cinfo->setIntraOnlyConstraintFlag (m_intraConstraintFlag); + cinfo->setMaxBitDepthConstraintIdc (m_maxBitDepthConstraintIdc); + cinfo->setMaxChromaFormatConstraintIdc((ChromaFormat)m_maxChromaFormatConstraintIdc); + cinfo->setNoQtbttDualTreeIntraConstraintFlag(m_bNoQtbttDualTreeIntraConstraintFlag); + cinfo->setNoSaoConstraintFlag(m_bNoSaoConstraintFlag); + cinfo->setNoAlfConstraintFlag(m_bNoAlfConstraintFlag); + cinfo->setNoPcmConstraintFlag(m_bNoPcmConstraintFlag); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + cinfo->setNoRefWraparoundConstraintFlag(m_bNoRefWraparoundConstraintFlag); +#endif + cinfo->setNoTemporalMvpConstraintFlag(m_bNoTemporalMvpConstraintFlag); + cinfo->setNoSbtmvpConstraintFlag(m_bNoSbtmvpConstraintFlag); + cinfo->setNoAmvrConstraintFlag(m_bNoAmvrConstraintFlag); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + cinfo->setNoBdofConstraintFlag(m_bNoBdofConstraintFlag); +#endif + cinfo->setNoCclmConstraintFlag(m_bNoCclmConstraintFlag); + cinfo->setNoMtsConstraintFlag(m_bNoMtsConstraintFlag); + cinfo->setNoAffineMotionConstraintFlag(m_bNoAffineMotionConstraintFlag); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + cinfo->setNoGbiConstraintFlag(m_bNoGbiConstraintFlag); + cinfo->setNoMhIntraConstraintFlag(m_bNoMhIntraConstraintFlag); + cinfo->setNoTriangleConstraintFlag(m_bNoTriangleConstraintFlag); +#endif + cinfo->setNoLadfConstraintFlag(m_bNoLadfConstraintFlag); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + cinfo->setNoCurrPicRefConstraintFlag(m_bNoCurrPicRefConstraintFlag); + cinfo->setNoQpDeltaConstraintFlag(m_bNoQpDeltaConstraintFlag); +#endif + cinfo->setNoDepQuantConstraintFlag(m_bNoDepQuantConstraintFlag); + cinfo->setNoSignDataHidingConstraintFlag(m_bNoSignDataHidingConstraintFlag); + profileTierLevel->setLevelIdc (m_level); + profileTierLevel->setTierFlag (m_levelTier); + profileTierLevel->setProfileIdc (m_profile); + +#endif /* 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 */ diff --git a/source/Lib/EncoderLib/EncSlice.cpp b/source/Lib/EncoderLib/EncSlice.cpp index dca7ba1edd2e2c70bd5a03dd868561a525cc2e48..674e3a10fcd56ed7b6d9b1a04fcb264ac87b6b4e 100644 --- a/source/Lib/EncoderLib/EncSlice.cpp +++ b/source/Lib/EncoderLib/EncSlice.cpp @@ -426,6 +426,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr // Non-referenced frame marking // ------------------------------------------------------------------------------------------------------------------ +#if !JVET_M0101_HLS if(pocLast == 0) { rpcSlice->setTemporalLayerNonReferenceFlag(false); @@ -434,6 +435,7 @@ void EncSlice::initEncSlice(Picture* pcPic, const int pocLast, const int pocCurr { rpcSlice->setTemporalLayerNonReferenceFlag(!m_pcCfg->getGOPEntry(iGOPid).m_refPic); } +#endif pcPic->referenced = true; // ------------------------------------------------------------------------------------------------------------------ diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index bd7a238bbe7320abb4c77b8b2c1179d248c3721a..93af6cb2f61d43abb429520b590e70c9b1d58573 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -605,6 +605,7 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) #if HEVC_VPS WRITE_CODE( pcSPS->getVPSId (), 4, "sps_video_parameter_set_id" ); #endif +#if !JVET_M0101_HLS WRITE_UVLC( pcSPS->getSPSId (), "sps_seq_parameter_set_id" ); WRITE_FLAG(pcSPS->getIntraOnlyConstraintFlag() ? 1 : 0, "intra_only_constraint_flag"); @@ -640,12 +641,21 @@ void HLSWriter::codeSPS( const SPS* pcSPS ) WRITE_FLAG(pcSPS->getNoDepQuantConstraintFlag() ? 1 : 0, "no_dep_quant_constraint_flag"); WRITE_FLAG(pcSPS->getNoSignDataHidingConstraintFlag() ? 1 : 0, "no_sign_data_hiding_constraint_flag"); - // KJS: Marakech decision: sub-layers added back CHECK( pcSPS->getMaxTLayers() == 0, "Maximum number of temporal sub-layers is '0'" ); WRITE_CODE( pcSPS->getMaxTLayers() - 1, 3, "sps_max_sub_layers_minus1" ); WRITE_FLAG( pcSPS->getTemporalIdNestingFlag() ? 1 : 0, "sps_temporal_id_nesting_flag" ); codePTL( pcSPS->getPTL(), true, pcSPS->getMaxTLayers() - 1 ); +#else + CHECK(pcSPS->getMaxTLayers() == 0, "Maximum number of temporal sub-layers is '0'"); + + WRITE_CODE(pcSPS->getMaxTLayers() - 1, 3, "sps_max_sub_layers_minus1"); + WRITE_CODE(0, 5, "sps_reserved_zero_5bits"); + + codeProfileTierLevel( pcSPS->getProfileTierLevel(), pcSPS->getMaxTLayers() - 1 ); + + WRITE_UVLC(pcSPS->getSPSId (), "sps_seq_parameter_set_id"); +#endif WRITE_UVLC( int(pcSPS->getChromaFormatIdc ()), "chroma_format_idc" ); @@ -1478,7 +1488,79 @@ void HLSWriter::codeSliceHeader ( Slice* pcSlice ) } +#if JVET_M0101_HLS +void HLSWriter::codeConstraintInfo ( const ConstraintInfo* cinfo ) +{ + WRITE_FLAG(cinfo->getProgressiveSourceFlag(), "general_progressive_source_flag" ); + WRITE_FLAG(cinfo->getInterlacedSourceFlag(), "general_interlaced_source_flag" ); + WRITE_FLAG(cinfo->getNonPackedConstraintFlag(), "general_non_packed_constraint_flag" ); + WRITE_FLAG(cinfo->getFrameOnlyConstraintFlag(), "general_frame_only_constraint_flag" ); + WRITE_FLAG(cinfo->getIntraOnlyConstraintFlag(), "intra_only_constraint_flag" ); + + WRITE_CODE(cinfo->getMaxBitDepthConstraintIdc(), 4, "max_bitdepth_constraint_idc" ); + WRITE_CODE(cinfo->getMaxChromaFormatConstraintIdc(), 2, "max_chroma_format_constraint_idc" ); + + WRITE_FLAG(cinfo->getNoQtbttDualTreeIntraConstraintFlag() ? 1 : 0, "no_qtbtt_dual_tree_intra_constraint_flag"); + WRITE_FLAG(cinfo->getNoSaoConstraintFlag() ? 1 : 0, "no_sao_constraint_flag"); + WRITE_FLAG(cinfo->getNoAlfConstraintFlag() ? 1 : 0, "no_alf_constraint_flag"); + WRITE_FLAG(cinfo->getNoPcmConstraintFlag() ? 1 : 0, "no_pcm_constraint_flag"); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + WRITE_FLAG(cinfo->getNoRefWraparoundConstraintFlag() ? 1 : 0, "no_ref_wraparound_constraint_flag"); +#endif + WRITE_FLAG(cinfo->getNoTemporalMvpConstraintFlag() ? 1 : 0, "no_temporal_mvp_constraint_flag"); + WRITE_FLAG(cinfo->getNoSbtmvpConstraintFlag() ? 1 : 0, "no_sbtmvp_constraint_flag"); + WRITE_FLAG(cinfo->getNoAmvrConstraintFlag() ? 1 : 0, "no_amvr_constraint_flag"); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + WRITE_FLAG(cinfo->getNoBdofConstraintFlag() ? 1 : 0, "no_bdof_constraint_flag"); +#endif + WRITE_FLAG(cinfo->getNoCclmConstraintFlag() ? 1 : 0, "no_cclm_constraint_flag"); + WRITE_FLAG(cinfo->getNoMtsConstraintFlag() ? 1 : 0, "no_mts_constraint_flag"); + WRITE_FLAG(cinfo->getNoAffineMotionConstraintFlag() ? 1 : 0, "no_affine_motion_constraint_flag"); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + WRITE_FLAG(cinfo->getNoGbiConstraintFlag() ? 1 : 0, "no_gbi_constraint_flag"); + WRITE_FLAG(cinfo->getNoMhIntraConstraintFlag() ? 1 : 0, "no_mh_intra_constraint_flag"); + WRITE_FLAG(cinfo->getNoTriangleConstraintFlag() ? 1 : 0, "no_triangle_constraint_flag"); +#endif + WRITE_FLAG(cinfo->getNoLadfConstraintFlag() ? 1 : 0, "no_ladf_constraint_flag"); +#if JVET_M0451_INTEROPERABILITY_POINT_SYNTAX + WRITE_FLAG(cinfo->getNoCurrPicRefConstraintFlag() ? 1 : 0, "no_curr_pic_ref_constraint_flag"); + WRITE_FLAG(cinfo->getNoQpDeltaConstraintFlag() ? 1 : 0, "no_qp_delta_constraint_flag"); +#endif + WRITE_FLAG(cinfo->getNoDepQuantConstraintFlag() ? 1 : 0, "no_dep_quant_constraint_flag"); + WRITE_FLAG(cinfo->getNoSignDataHidingConstraintFlag() ? 1 : 0, "no_sign_data_hiding_constraint_flag"); +} + + +void HLSWriter::codeProfileTierLevel ( const ProfileTierLevel* ptl, int maxNumSubLayersMinus1 ) +{ + WRITE_CODE( int(ptl->getProfileIdc()), 7 , "general_profile_idc" ); + WRITE_FLAG( ptl->getTierFlag()==Level::HIGH, "general_tier_flag" ); + + codeConstraintInfo(ptl->getConstraintInfo()); + + WRITE_CODE( int(ptl->getLevelIdc()), 8 , "general_level_idc" ); + + for (int i = 0; i < maxNumSubLayersMinus1; i++) + { + WRITE_FLAG( ptl->getSubLayerLevelPresentFlag(i), "sub_layer_level_present_flag[i]" ); + } + + while (!xIsByteAligned()) + { + WRITE_FLAG(0, "ptl_alignment_zero_bit"); + } + for(int i = 0; i < maxNumSubLayersMinus1; i++) + { + if( ptl->getSubLayerLevelPresentFlag(i) ) + { + WRITE_CODE( int(ptl->getSubLayerLevelIdc(i)), 8, "sub_layer_level_idc[i]" ); + } + } + +} + +#else void HLSWriter::codePTL( const PTL* pcPTL, bool profilePresentFlag, int maxNumSubLayersMinus1) { if(profilePresentFlag) @@ -1561,6 +1643,7 @@ void HLSWriter::codeProfileTier( const ProfileTierLevel* ptl, const bool /*bIsSu WRITE_FLAG(false, PTL_TRACE_TEXT("reserved_zero_bit" )); #undef PTL_TRACE_TEXT } +#endif #if HEVC_TILES_WPP /** diff --git a/source/Lib/EncoderLib/VLCWriter.h b/source/Lib/EncoderLib/VLCWriter.h index 5470e805d1fa86e0b6675781616b2b28cdfdfac2..b69da6629f1152c306b9baadb53712751d43fb16 100644 --- a/source/Lib/EncoderLib/VLCWriter.h +++ b/source/Lib/EncoderLib/VLCWriter.h @@ -88,6 +88,9 @@ protected: void xWriteFlagTr ( uint32_t value, const char *pSymbolName); #endif void xWriteRbspTrailingBits(); +#if JVET_M0101_HLS + bool xIsByteAligned() {return (m_pcBitIf->getNumBitsUntilByteAligned() != 0); } ; +#endif }; @@ -129,8 +132,13 @@ public: void codeVPS ( const VPS* pcVPS ); #endif void codeSliceHeader ( Slice* pcSlice ); +#if !JVET_M0101_HLS void codePTL ( const PTL* pcPTL, bool profilePresentFlag, int maxNumSubLayersMinus1); void codeProfileTier ( const ProfileTierLevel* ptl, const bool bIsSubLayer ); +#else + void codeConstraintInfo ( const ConstraintInfo* cinfo ); + void codeProfileTierLevel ( const ProfileTierLevel* ptl, int maxNumSubLayersMinus1 ); +#endif void codeHrdParameters ( const HRD *hrd, bool commonInfPresentFlag, uint32_t maxNumSubLayersMinus1 ); #if HEVC_TILES_WPP void codeTilesWPPEntryPoint ( Slice* pSlice );