mirror of
https://gitlab.com/ecodis/exhale.git
synced 2025-06-05 21:59:32 +02:00
80 lines
3.6 KiB
C++
80 lines
3.6 KiB
C++
/* entropyCoding.h - header file for class with lossless entropy coding capability
|
|
* written by C. R. Helmrich, last modified in 2019 - see License.htm for legal notices
|
|
*
|
|
* The copyright in this software is being made available under a Modified BSD-Style License
|
|
* 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.
|
|
*
|
|
* Copyright (c) 2018-2020 Christian R. Helmrich, project ecodis. All rights reserved.
|
|
*/
|
|
|
|
#ifndef _ENTROPY_CODING_H_
|
|
#define _ENTROPY_CODING_H_
|
|
|
|
#include "exhaleLibPch.h"
|
|
|
|
// constants, experimental macro
|
|
#define ARITH_ESCAPE 16
|
|
#define ARITH_SIZE 742
|
|
#define INDEX_OFFSET 60
|
|
#define INDEX_SIZE 121
|
|
#define EC_TRELLIS_OPT_CODING 1
|
|
|
|
// lossless entropy coding class
|
|
class EntropyCoder
|
|
{
|
|
private:
|
|
|
|
// member variables
|
|
uint8_t* m_qcCurr; // curr. window's quantized context q[1]
|
|
uint8_t* m_qcPrev; // prev. window's quantized context q[0]
|
|
|
|
uint16_t m_acBits; // bits_to_follow in arith_encode, 0..31
|
|
uint16_t m_acHigh; // high in arith_encode as in Annex B.25
|
|
uint16_t m_acLow; // low in arith_encode, as in Annex B.25
|
|
uint16_t m_acSize; // context window size (N/4 in Scl. 7.4)
|
|
uint32_t m_csCurr; // context state, see initWindowCoding()
|
|
unsigned m_maxTupleLength; // maximum half-transform length (<4096)
|
|
bool m_shortTrafoCurr; // used to derive N in Scl. 7.4 and B.25
|
|
bool m_shortTrafoPrev; // used to derive previous_N in Scl. 7.4
|
|
|
|
// helper functions
|
|
unsigned arithCodeSymbol (const uint16_t symbol, const uint16_t* table, OutputStream* const stream = nullptr);
|
|
unsigned arithGetContext (const unsigned ctx, const unsigned idx);
|
|
unsigned arithMapContext (const bool arithResetFlag);
|
|
#if EC_TRELLIS_OPT_CODING
|
|
void arithSetContext (const unsigned newCtxState, const uint16_t sigEnd);
|
|
#endif
|
|
|
|
public:
|
|
|
|
// constructor
|
|
EntropyCoder ();
|
|
// destructor
|
|
~EntropyCoder ();
|
|
// public functions
|
|
unsigned arithCodeSigMagn (const uint8_t* const magn, const uint16_t sigOffset, const uint16_t sigLength,
|
|
const bool arithFinish = false, OutputStream* const stream = nullptr);
|
|
unsigned arithGetCodState () const { return ((unsigned) m_acHigh << 16) | (unsigned) m_acLow; }
|
|
unsigned arithGetCtxState () const { return m_csCurr; }
|
|
unsigned arithGetResetBit (const uint8_t* const magn, const uint16_t sigOffset, const uint16_t sigLength);
|
|
char* arithGetTuplePtr () const { return (char*) m_qcCurr; }
|
|
void arithResetMemory () { memset (m_qcPrev, 0, (m_maxTupleLength + 1) * sizeof (uint8_t)); m_acBits = 0; }
|
|
void arithSetCodState (const unsigned newCodState) { m_acHigh = newCodState >> 16; m_acLow = newCodState & USHRT_MAX; }
|
|
#if EC_TRELLIS_OPT_CODING
|
|
void arithSetCtxState (const unsigned newCtxState, const uint16_t sigOffset = 0) { arithSetContext (newCtxState, sigOffset >> 1); }
|
|
#else
|
|
void arithSetCtxState (const unsigned newCtxState) { m_csCurr = newCtxState; }
|
|
#endif
|
|
unsigned indexGetBitCount (const int scaleFactorDelta) const;
|
|
unsigned indexGetHuffCode (const int scaleFactorDelta) const;
|
|
|
|
unsigned initCodingMemory (const unsigned maxTransfLength);
|
|
unsigned initWindowCoding (const bool forceArithReset, const bool shortWin = false);
|
|
|
|
bool getIsShortWindow () const { return m_shortTrafoCurr; }
|
|
void setIsShortWindow (const bool shortWin) { m_shortTrafoCurr = shortWin; }
|
|
}; // EntropyCoder
|
|
|
|
#endif // _ENTROPY_CODING_H_
|