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