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