From a1c11c0e800ddeb63d40ef460cddb56dc7acfe75 Mon Sep 17 00:00:00 2001 From: Karsten Suehring <karsten.suehring@hhi.fraunhofer.de> Date: Fri, 15 May 2020 17:09:50 +0200 Subject: [PATCH] BitstreamExtractor: fix re-encapsulation of input NAL units getting written back to the bitstream --- .../BitstreamExtractorApp/BitstreamExtractorApp.cpp | 8 ++++++-- source/Lib/EncoderLib/NALwrite.cpp | 10 ++++++++-- source/Lib/EncoderLib/NALwrite.h | 5 +++-- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp index 7f1313ab3..1d3bb3556 100644 --- a/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp +++ b/source/App/BitstreamExtractorApp/BitstreamExtractorApp.cpp @@ -642,8 +642,12 @@ uint32_t BitstreamExtractorApp::decode() } ch = 1; bitstreamFileOut.write( &ch, 1 ); - // write input NAL unit - bitstreamFileOut.write( (const char*)nalu.getBitstream().getFifo().data(), nalu.getBitstream().getFifo().size() ); + + // create output NAL unit + OutputNALUnit out (nalu.m_nalUnitType, nalu.m_nuhLayerId, nalu.m_temporalId); + out.m_Bitstream.getFIFO() = nalu.getBitstream().getFifo(); + // write with start code emulation prevention + writeNaluContent (bitstreamFileOut, out); } } } diff --git a/source/Lib/EncoderLib/NALwrite.cpp b/source/Lib/EncoderLib/NALwrite.cpp index 4764029a5..49cc9aa6d 100644 --- a/source/Lib/EncoderLib/NALwrite.cpp +++ b/source/Lib/EncoderLib/NALwrite.cpp @@ -60,13 +60,13 @@ OutputBitstream bsNALUHeader; out.write(reinterpret_cast<const char*>(bsNALUHeader.getByteStream()), bsNALUHeader.getByteStreamLength()); } + /** * write nalu to bytestream out, performing RBSP anti startcode * emulation as required. nalu.m_RBSPayload must be byte aligned. */ -void write(ostream& out, OutputNALUnit& nalu) +void writeNaluContent(ostream& out, OutputNALUnit& nalu) { - writeNalUnitHeader(out, nalu); /* write out rsbp_byte's, inserting any required * emulation_prevention_three_byte's */ /* 7.4.1 ... @@ -125,4 +125,10 @@ void write(ostream& out, OutputNALUnit& nalu) out.write(reinterpret_cast<const char*>(&(*outputBuffer.begin())), outputAmount); } +void writeNaluWithHeader(ostream& out, OutputNALUnit& nalu) +{ + writeNalUnitHeader(out, nalu); + writeNaluContent(out, nalu); +} + //! \} diff --git a/source/Lib/EncoderLib/NALwrite.h b/source/Lib/EncoderLib/NALwrite.h index 34a787d40..d70242926 100644 --- a/source/Lib/EncoderLib/NALwrite.h +++ b/source/Lib/EncoderLib/NALwrite.h @@ -75,12 +75,13 @@ struct OutputNALUnit : public NALUnit OutputBitstream m_Bitstream; }; -void write(std::ostream& out, OutputNALUnit& nalu); +void writeNaluWithHeader(std::ostream& out, OutputNALUnit& nalu); +void writeNaluContent(std::ostream& out, OutputNALUnit& nalu); inline NALUnitEBSP::NALUnitEBSP(OutputNALUnit& nalu) : NALUnit(nalu) { - write(m_nalUnitData, nalu); + writeNaluWithHeader(m_nalUnitData, nalu); } //! \} -- GitLab