1 /* bitStreamWriter.h - header file for class with basic bit-stream writing capability
2  * written by C. R. Helmrich, last modified in 2021 - see License.htm for legal notices
3  *
4  * The copyright in this software is being made available under the exhale Copyright License
5  * and comes with ABSOLUTELY NO WARRANTY. This software may be subject to other third-
6  * party rights, including patent rights. No such rights are granted under this License.
7  *
8  * Copyright (c) 2018-2021 Christian R. Helmrich, project ecodis. All rights reserved.
9  */
10 
11 #ifndef _BIT_STREAM_WRITER_H_
12 #define _BIT_STREAM_WRITER_H_
13 
14 #include "exhaleLibPch.h"
15 #include "entropyCoding.h"
16 
17 // constants, experimental macros
18 #define CORE_MODE_FD            0
19 #define SFB_PER_PRED_BAND       2
20 
21 // output bit-stream writer class
22 class BitStreamWriter
23 {
24 private:
25 
26   // member variables
27   OutputStream m_auBitStream; // access unit bit-stream to write
28   uint64_t     m_auByteCount;
29   uint8_t      m_numSwbShort; // max. SFB count in short windows
30   uint8_t*     m_uCharBuffer; // temporary buffer for ungrouping
31 #ifndef NO_PREROLL_DATA
32   uint8_t      m_usacConfig[20]; // buffer for UsacConfig in IPF
33   uint16_t     m_usacConfigLen;
34 #endif
35 #if !RESTRICT_TO_AAC
36   uint8_t      m_usacIpfState[6];
37 #endif
38   // helper functions
39   void     writeByteAlignment (); // write 0s for byte alignment
40   unsigned writeChannelWiseIcsInfo (const IcsInfo& icsInfo);
41   unsigned writeChannelWiseSbrData (const int32_t* const sbrDataCh0, const int32_t* const sbrDataCh1,
42                                     const bool indepFlag = false);
43   unsigned writeChannelWiseTnsData (const TnsData& tnsData, const bool eightShorts);
44   unsigned writeFDChannelStream    (const CoreCoderData& elData, EntropyCoder& entrCoder, const unsigned ch,
45                                     const int32_t* const mdctSignal, const uint8_t* const mdctQuantMag,
46 #if !RESTRICT_TO_AAC
47                                     const bool timeWarping, const bool noiseFilling, uint8_t* ipfAuState,
48 #endif
49                                     const bool indepFlag = false);
50   unsigned writeStereoCoreToolInfo (const CoreCoderData& elData, EntropyCoder& entrCoder,
51 #if !RESTRICT_TO_AAC
52                                     const bool timeWarping, bool* const commonTnsFlag,
53 #endif
54                                     const bool indepFlag = false);
55 
56 public:
57 
58   // constructor
BitStreamWriter()59   BitStreamWriter () { m_auBitStream.reset (); m_auByteCount = m_numSwbShort = 0; m_uCharBuffer = nullptr;
60 #ifndef NO_PREROLL_DATA
61                        memset (m_usacConfig, 0, 20); m_usacConfigLen = 0; memset (m_usacIpfState, 0, 4);
62 #endif
63     }
64   // destructor
~BitStreamWriter()65   ~BitStreamWriter() { m_auBitStream.reset (); }
66   // public functions
67   unsigned createAudioConfig (const char samplingFrequencyIndex,  const bool shortFrameLength,
68                               const uint8_t chConfigurationIndex, const uint8_t numElements,
69                               const ELEM_TYPE* const elementType, const uint32_t loudnessInfo,
70 #if !RESTRICT_TO_AAC
71                               const bool* const tw_mdct /*N/A*/,  const bool* const noiseFilling,
72 #endif
73                               const uint8_t sbrRatioShiftValue,   unsigned char* const audioConfig);
74   unsigned createAudioFrame  (CoreCoderData** const elementData,  EntropyCoder* const entropyCoder,
75                               int32_t** const mdctSignals,        uint8_t** const mdctQuantMag,
76                               const bool usacIndependencyFlag,    const uint8_t numElements,
77                               const uint8_t numSwbShort,          uint8_t* const tempBuffer,
78 #if !RESTRICT_TO_AAC
79                               const bool* const tw_mdct /*N/A*/,  const bool* const noiseFilling,
80                               const uint32_t frameCount,          const uint32_t indepPeriod,  uint32_t* rate,
81 #endif
82                               const uint8_t sbrRatioShiftValue,   int32_t** const sbrInfoAndData,
83                               unsigned char* const accessUnit,    const unsigned nSamplesInFrame);
84 }; // BitStreamWriter
85 
86 #endif // _BIT_STREAM_WRITER_H_
87