mirror of
https://gitlab.com/ecodis/exhale.git
synced 2025-06-05 21:59:32 +02:00
add source code
This commit is contained in:
79
src/lib/entropyCoding.h
Normal file
79
src/lib/entropyCoding.h
Normal file
@ -0,0 +1,79 @@
|
||||
/* 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_
|
Reference in New Issue
Block a user