diff --git a/source/Lib/CommonLib/Slice.cpp b/source/Lib/CommonLib/Slice.cpp index 2c671b5cc58a9f70a4c79b09a03eeefa2d258e39..1ddace57f163aabdd17a1db0b46db717588c8da6 100644 --- a/source/Lib/CommonLib/Slice.cpp +++ b/source/Lib/CommonLib/Slice.cpp @@ -4787,4 +4787,9 @@ void xTraceAccessUnitDelimiter() { DTRACE( g_trace_ctx, D_HEADER, "=========== Access Unit Delimiter ===========\n" ); } + +void xTraceFillerData () +{ + DTRACE( g_trace_ctx, D_HEADER, "=========== Filler Data ===========\n" ); +} #endif diff --git a/source/Lib/CommonLib/Slice.h b/source/Lib/CommonLib/Slice.h index adb09fdd2148ec8175753d4e3c3477e6e52592e4..b64534c3d68dd69398f73ac1a67197c4a4528c78 100644 --- a/source/Lib/CommonLib/Slice.h +++ b/source/Lib/CommonLib/Slice.h @@ -3288,6 +3288,7 @@ void xTraceAPSHeader(); void xTracePictureHeader(); void xTraceSliceHeader(); void xTraceAccessUnitDelimiter(); +void xTraceFillerData(); #endif #endif // __SLICE__ diff --git a/source/Lib/DecoderLib/DecLib.cpp b/source/Lib/DecoderLib/DecLib.cpp index 6bbdd11d7661ce6a43e2b6d0467cfc9b3846b9f9..2f3b8d538018b3ad6a360eb9e77340bc572d94f7 100644 --- a/source/Lib/DecoderLib/DecLib.cpp +++ b/source/Lib/DecoderLib/DecLib.cpp @@ -3049,6 +3049,15 @@ bool DecLib::decode(InputNALUnit& nalu, int& iSkipFrame, int& iPOCLastDisplay, i case NAL_UNIT_EOB: return false; + case NAL_UNIT_FD: + { + FDReader fdReader; + uint32_t fdSize; + fdReader.parseFillerData(&(nalu.getBitstream()), fdSize); + msg( NOTICE, "Note: found NAL_UNIT_FD with %u bytes payload.\n", fdSize); + return false; + } + case NAL_UNIT_RESERVED_IRAP_VCL_11: case NAL_UNIT_RESERVED_IRAP_VCL_12: msg( NOTICE, "Note: found reserved VCL NAL unit.\n"); diff --git a/source/Lib/DecoderLib/VLCReader.cpp b/source/Lib/DecoderLib/VLCReader.cpp index f1747d3d7ae7a2a01d0b3097ac43ae2c615876c0..63a09ad3adbda53182345fd8f7738c1630eccba5 100644 --- a/source/Lib/DecoderLib/VLCReader.cpp +++ b/source/Lib/DecoderLib/VLCReader.cpp @@ -96,11 +96,6 @@ void VLCReader::xReadFlagTr(uint32_t& rValue, const char *pSymbolName) DTRACE( g_trace_ctx, D_HEADER, "%-50s u(1) : %d\n", pSymbolName, rValue ); } -void xTraceFillerData () -{ - DTRACE( g_trace_ctx, D_HEADER, "=========== Filler Data ===========\n"); -} - #endif #if RExt__DECODER_DEBUG_BIT_STATISTICS || ENABLE_TRACING diff --git a/source/Lib/EncoderLib/EncGOP.cpp b/source/Lib/EncoderLib/EncGOP.cpp index 91a453c49f3842df08dce7431e5803945b113966..61e596116892fa689c206089eb3dfca495fc27d5 100644 --- a/source/Lib/EncoderLib/EncGOP.cpp +++ b/source/Lib/EncoderLib/EncGOP.cpp @@ -428,6 +428,25 @@ void EncGOP::xWriteAccessUnitDelimiter (AccessUnit &accessUnit, Slice *slice) accessUnit.push_front(new NALUnitEBSP(nalu)); } +void EncGOP::xWriteFillerData (AccessUnit &accessUnit, Slice *slice, uint32_t &fdSize) +{ + FDWriter fdWriter; + OutputNALUnit nalu(NAL_UNIT_FD); + nalu.m_temporalId = slice->getTLayer(); + int vpsId = slice->getSPS()->getVPSId(); + if (vpsId == 0) + { + nalu.m_nuhLayerId = 0; + } + else + { + nalu.m_nuhLayerId = slice->getVPS()->getLayerId(0); + } + CHECK( nalu.m_temporalId != accessUnit.temporalId, "TemporalId shall be equal to the TemporalId of the AU containing the NAL unit" ); + fdWriter.codeFD(nalu.m_Bitstream, fdSize); + accessUnit.push_back(new NALUnitEBSP(nalu)); +} + // write SEI list into one NAL unit and add it to the Access unit at auPos void EncGOP::xWriteSEI (NalUnitType naluType, SEIMessages& seiMessages, AccessUnit &accessUnit, AccessUnit::iterator &auPos, int temporalId) { diff --git a/source/Lib/EncoderLib/EncGOP.h b/source/Lib/EncoderLib/EncGOP.h index d514474e3be6f20bb761dcd3a41b286ec624b3b2..50c1339e4e2e13f48061c8950159ccf84f068c5d 100644 --- a/source/Lib/EncoderLib/EncGOP.h +++ b/source/Lib/EncoderLib/EncGOP.h @@ -300,6 +300,8 @@ protected: void xWriteAccessUnitDelimiter (AccessUnit &accessUnit, Slice *slice); + void xWriteFillerData (AccessUnit &accessUnit, Slice *slice, uint32_t &fdSize); + void xCreateIRAPLeadingSEIMessages (SEIMessages& seiMessages, const SPS *sps, const PPS *pps); void xCreatePerPictureSEIMessages (int picInGOP, SEIMessages& seiMessages, SEIMessages& nestedSeiMessages, Slice *slice); void xCreateFrameFieldInfoSEI (SEIMessages& seiMessages, Slice *slice, bool isField); diff --git a/source/Lib/EncoderLib/VLCWriter.cpp b/source/Lib/EncoderLib/VLCWriter.cpp index 30e06f6f348590d022eb751fadaa3c6e4ce1158c..6bba61eb1dcde92f82932705cc83153c84ce373a 100644 --- a/source/Lib/EncoderLib/VLCWriter.cpp +++ b/source/Lib/EncoderLib/VLCWriter.cpp @@ -180,6 +180,21 @@ void AUDWriter::codeAUD(OutputBitstream& bs, const bool audIrapOrGdrAuFlag, cons xWriteRbspTrailingBits(); } +void FDWriter::codeFD(OutputBitstream& bs, uint32_t &fdSize) +{ +#if ENABLE_TRACING + xTraceFillerData(); +#endif + setBitstream(&bs); + uint32_t ffByte = 0xff; + while( fdSize ) + { + WRITE_CODE (ffByte, 8, "ff_byte"); + fdSize--; + } + xWriteRbspTrailingBits(); +} + void HLSWriter::xCodeRefPicList( const ReferencePictureList* rpl, bool isLongTermPresent, uint32_t ltLsbBitsCount, const bool isForbiddenZeroDeltaPoc, int rplIdx) { uint32_t numRefPic = rpl->getNumberOfShorttermPictures() + rpl->getNumberOfLongtermPictures() + rpl->getNumberOfInterLayerPictures(); diff --git a/source/Lib/EncoderLib/VLCWriter.h b/source/Lib/EncoderLib/VLCWriter.h index 45e7cb2010b0fb711266789e22f5d95c036c68af..20ed36ffeb24d11a1e7b8ed3b5351ec275048778 100644 --- a/source/Lib/EncoderLib/VLCWriter.h +++ b/source/Lib/EncoderLib/VLCWriter.h @@ -107,6 +107,14 @@ public: void codeAUD(OutputBitstream& bs, const bool audIrapOrGdrAuFlag, const int pictureType); }; +class FDWriter : public VLCWriter +{ +public: + FDWriter() {}; + virtual ~FDWriter() {}; + + void codeFD(OutputBitstream& bs, uint32_t &fdSize); +}; class HLSWriter : public VLCWriter