exhale/src/lib/bitStreamWriter.h

87 lines
4.0 KiB
C
Raw Normal View History

2020-01-02 02:05:09 +01:00
/* bitStreamWriter.h - header file for class with basic bit-stream writing capability
2021-01-23 02:00:00 +01:00
* written by C. R. Helmrich, last modified in 2021 - see License.htm for legal notices
2020-01-02 02:05:09 +01:00
*
2020-10-24 02:00:00 +02:00
* The copyright in this software is being made available under the exhale Copyright License
2020-01-02 02:05:09 +01:00
* and comes with ABSOLUTELY NO WARRANTY. This software may be subject to other third-
* party rights, including patent rights. No such rights are granted under this License.
*
2021-01-17 19:00:10 +01:00
* Copyright (c) 2018-2021 Christian R. Helmrich, project ecodis. All rights reserved.
2020-01-02 02:05:09 +01:00
*/
#ifndef _BIT_STREAM_WRITER_H_
#define _BIT_STREAM_WRITER_H_
#include "exhaleLibPch.h"
#include "entropyCoding.h"
// constants, experimental macros
#define CORE_MODE_FD 0
#define SFB_PER_PRED_BAND 2
// output bit-stream writer class
class BitStreamWriter
{
private:
// member variables
OutputStream m_auBitStream; // access unit bit-stream to write
2021-06-28 23:00:00 +02:00
uint64_t m_auByteCount;
2020-01-02 02:05:09 +01:00
uint8_t m_numSwbShort; // max. SFB count in short windows
uint8_t* m_uCharBuffer; // temporary buffer for ungrouping
2021-02-28 19:00:03 +01:00
#ifndef NO_PREROLL_DATA
uint8_t m_usacConfig[20]; // buffer for UsacConfig in IPF
2021-03-12 22:00:00 +01:00
uint16_t m_usacConfigLen;
2021-04-24 11:00:00 +02:00
#endif
#if !RESTRICT_TO_AAC
uint8_t m_usacIpfState[6];
2021-02-28 19:00:03 +01:00
#endif
2020-01-02 02:05:09 +01:00
// helper functions
void writeByteAlignment (); // write 0s for byte alignment
2021-06-28 23:00:00 +02:00
unsigned writeChannelWiseIcsInfo (const IcsInfo& icsInfo);
2020-11-10 20:00:02 +01:00
unsigned writeChannelWiseSbrData (const int32_t* const sbrDataCh0, const int32_t* const sbrDataCh1,
const bool indepFlag = false);
2020-01-02 02:05:09 +01:00
unsigned writeChannelWiseTnsData (const TnsData& tnsData, const bool eightShorts);
unsigned writeFDChannelStream (const CoreCoderData& elData, EntropyCoder& entrCoder, const unsigned ch,
const int32_t* const mdctSignal, const uint8_t* const mdctQuantMag,
#if !RESTRICT_TO_AAC
2021-04-24 11:00:00 +02:00
const bool timeWarping, const bool noiseFilling, uint8_t* ipfAuState,
2020-01-02 02:05:09 +01:00
#endif
const bool indepFlag = false);
2020-03-29 01:00:24 +01:00
unsigned writeStereoCoreToolInfo (const CoreCoderData& elData, EntropyCoder& entrCoder,
2020-01-02 02:05:09 +01:00
#if !RESTRICT_TO_AAC
2020-05-30 18:00:00 +02:00
const bool timeWarping, bool* const commonTnsFlag,
2020-01-02 02:05:09 +01:00
#endif
const bool indepFlag = false);
public:
// constructor
2021-06-28 23:00:00 +02:00
BitStreamWriter () { m_auBitStream.reset (); m_auByteCount = m_numSwbShort = 0; m_uCharBuffer = nullptr;
2021-03-12 22:00:00 +01:00
#ifndef NO_PREROLL_DATA
2021-04-24 11:00:00 +02:00
memset (m_usacConfig, 0, 20); m_usacConfigLen = 0; memset (m_usacIpfState, 0, 4);
2021-03-12 22:00:00 +01:00
#endif
}
2020-01-02 02:05:09 +01:00
// destructor
~BitStreamWriter() { m_auBitStream.reset (); }
// public functions
unsigned createAudioConfig (const char samplingFrequencyIndex, const bool shortFrameLength,
const uint8_t chConfigurationIndex, const uint8_t numElements,
2020-02-15 17:00:54 +01:00
const ELEM_TYPE* const elementType, const uint32_t loudnessInfo,
2020-01-02 02:05:09 +01:00
#if !RESTRICT_TO_AAC
const bool* const tw_mdct /*N/A*/, const bool* const noiseFilling,
#endif
2020-11-10 20:00:02 +01:00
const uint8_t sbrRatioShiftValue, unsigned char* const audioConfig);
2020-01-02 02:05:09 +01:00
unsigned createAudioFrame (CoreCoderData** const elementData, EntropyCoder* const entropyCoder,
int32_t** const mdctSignals, uint8_t** const mdctQuantMag,
const bool usacIndependencyFlag, const uint8_t numElements,
const uint8_t numSwbShort, uint8_t* const tempBuffer,
#if !RESTRICT_TO_AAC
2021-01-23 02:00:00 +01:00
const bool* const tw_mdct /*N/A*/, const bool* const noiseFilling,
2021-06-28 23:00:00 +02:00
const uint32_t frameCount, const uint32_t indepPeriod, uint32_t* rate,
2020-01-02 02:05:09 +01:00
#endif
2020-11-10 20:00:02 +01:00
const uint8_t sbrRatioShiftValue, int32_t** const sbrInfoAndData,
2021-04-24 11:00:00 +02:00
unsigned char* const accessUnit, const unsigned nSamplesInFrame);
2020-01-02 02:05:09 +01:00
}; // BitStreamWriter
#endif // _BIT_STREAM_WRITER_H_