Grok 13.0.2
mqc.h File Reference
#include <t1_common.h>
#include "plugin_interface.h"
#include "mqc_inl.h"
#include "mqc_dec_inl.h"
#include "mqc_enc_inl.h"

Go to the source code of this file.

Classes

struct  grk::mqc_state
 
struct  grk::mqcoder
 

Namespaces

namespace  grk
 Copyright (C) 2016-2024 Grok Image Compression Inc.
 

Macros

#define MQC_NUMCTXS   19
 
#define BYPASS_CT_INIT   0xDEADBEEF
 
#define PUSH_MQC()
 
#define POP_MQC()
 
#define mqc_setcurctx(mqc, ctxno)
 
#define mpsexchange_dec_macro(d, curctx, a)
 
#define lpsexchange_dec_macro(d, curctx, a)
 
#define bytein_dec_macro(mqc, c, ct)
 
#define renorm_dec_macro(mqc, a, c, ct)
 
#define decompress_macro(d, mqc, curctx, a, c, ct)
 
#define mqc_renormd(mqc)
 
#define mqc_decode(d, mqc)
 
#define mqc_renorme_macro(mqc, a_, c_, ct_)
 
#define mqc_codemps_macro(mqc, curctx, a, c, ct)
 
#define mqc_codelps_macro(mqc, curctx, a, c, ct)
 
#define mqc_encode_macro(mqc, curctx, a, c, ct, d)
 
#define mqc_bypass_enc_macro(mqc, c, ct, d)
 

Functions

static INLINE uint32_t grk::mqc_raw_decode (mqcoder *mqc)
 Decompress a symbol using raw-decoder.
 
static INLINE void grk::mqc_bytein (mqcoder *const mqc)
 Input a byte.
 
void grk::mqc_byteout (mqcoder *mqc)
 Output a byte, doing bit-stuffing if necessary.
 
uint32_t grk::mqc_numbytes_enc (mqcoder *mqc)
 
void grk::mqc_resetstates (mqcoder *mqc)
 
void grk::mqc_init_enc (mqcoder *mqc, uint8_t *bp)
 
void grk::mqc_encode (mqcoder *mqc, uint32_t d)
 
void grk::mqc_flush_enc (mqcoder *mqc)
 
void grk::mqc_bypass_init_enc (mqcoder *mqc)
 
uint32_t grk::mqc_bypass_get_extra_bytes_enc (mqcoder *mqc, bool erterm)
 
void grk::mqc_bypass_enc (mqcoder *mqc, uint32_t d)
 
void grk::mqc_bypass_flush_enc (mqcoder *mqc, bool erterm)
 
void grk::mqc_restart_init_enc (mqcoder *mqc)
 
void grk::mqc_erterm_enc (mqcoder *mqc)
 
void grk::mqc_segmark_enc (mqcoder *mqc)
 
void grk::mqc_init_dec (mqcoder *mqc, uint8_t *bp, uint32_t len)
 Initialize the decoder for MQ decoding.
 
void grk::mqc_raw_init_dec (mqcoder *mqc, uint8_t *bp, uint32_t len)
 Initialize the decoder for RAW decoding.
 
void grk::mqc_finish_dec (mqcoder *mqc)
 Terminate RAW/MQC decoding.
 

Variables

const uint32_t grk::A_MIN = 0x8000
 

Macro Definition Documentation

◆ BYPASS_CT_INIT

#define BYPASS_CT_INIT   0xDEADBEEF

◆ bytein_dec_macro

#define bytein_dec_macro ( mqc,
c,
ct )
Value:
{ \
/* Given mqc_init_dec() we know that at some point we will */ \
/* have a 0xFF 0xFF artificial marker */ \
uint32_t l_c = *(mqc->bp + 1); \
if(*mqc->bp == 0xff) \
{ \
if(l_c > 0x8f) \
{ \
c += 0xff00; \
ct = 8; \
mqc->end_of_byte_stream_counter++; \
} \
else \
{ \
mqc->bp++; \
c += l_c << 9; \
ct = 7; \
} \
} \
else \
{ \
mqc->bp++; \
c += l_c << 8; \
ct = 8; \
} \
}

◆ decompress_macro

#define decompress_macro ( d,
mqc,
curctx,
a,
c,
ct )
Value:
{ \
/* Implements ISO 15444-1 C.3.2 Decompressing a decision (DECODE) */ \
a -= (*curctx)->qeval; \
uint32_t qeval_shift = (*curctx)->qeval << 16; \
if(c < qeval_shift) \
{ \
lpsexchange_dec_macro(d, curctx, a); \
renorm_dec_macro(mqc, a, c, ct); \
} \
else \
{ \
c -= qeval_shift; \
if(a < A_MIN) \
{ \
mpsexchange_dec_macro(d, curctx, a); \
renorm_dec_macro(mqc, a, c, ct); \
} \
else \
{ \
d = (*curctx)->mps; \
} \
} \
}

◆ lpsexchange_dec_macro

#define lpsexchange_dec_macro ( d,
curctx,
a )
Value:
{ \
if(a < (*curctx)->qeval) \
{ \
a = (*curctx)->qeval; \
d = (*curctx)->mps; \
*curctx = (*curctx)->nmps; \
} \
else \
{ \
a = (*curctx)->qeval; \
d = (*curctx)->mps ^ 1; \
*curctx = (*curctx)->nlps; \
} \
}

◆ mpsexchange_dec_macro

#define mpsexchange_dec_macro ( d,
curctx,
a )
Value:
{ \
if(a < (*curctx)->qeval) \
{ \
d = (*curctx)->mps ^ 1; \
*curctx = (*curctx)->nlps; \
} \
else \
{ \
d = (*curctx)->mps; \
*curctx = (*curctx)->nmps; \
} \
}

◆ mqc_bypass_enc_macro

#define mqc_bypass_enc_macro ( mqc,
c,
ct,
d )
Value:
{ \
if(ct == BYPASS_CT_INIT) \
ct = 8; \
ct--; \
c = c + ((d) << ct); \
if(ct == 0) \
{ \
*mqc->bp = (uint8_t)c; \
ct = 8; \
/* If the previous byte was 0xff, make sure that the next msb is 0 */ \
if(*mqc->bp == 0xff) \
ct = 7; \
mqc->bp++; \
c = 0; \
} \
}
#define BYPASS_CT_INIT

◆ mqc_codelps_macro

#define mqc_codelps_macro ( mqc,
curctx,
a,
c,
ct )
Value:
{ \
a -= (*curctx)->qeval; \
if(a < (*curctx)->qeval) \
c += (*curctx)->qeval; \
else \
a = (*curctx)->qeval; \
*curctx = (*curctx)->nlps; \
mqc_renorme_macro(mqc, a, c, ct); \
}

◆ mqc_codemps_macro

#define mqc_codemps_macro ( mqc,
curctx,
a,
c,
ct )
Value:
{ \
a -= (*curctx)->qeval; \
if((a & 0x8000) == 0) \
{ \
if(a < (*curctx)->qeval) \
a = (*curctx)->qeval; \
else \
c += (*curctx)->qeval; \
*curctx = (*curctx)->nmps; \
mqc_renorme_macro(mqc, a, c, ct); \
} \
else \
{ \
c += (*curctx)->qeval; \
} \
}

◆ mqc_decode

#define mqc_decode ( d,
mqc )
Value:
decompress_macro(d, mqc, mqc->curctx, mqc->a, mqc->c, mqc->ct)
#define decompress_macro(d, mqc, curctx, a, c, ct)

Referenced by grk::T1::dec_clnpass_check_segsym().

◆ mqc_encode_macro

#define mqc_encode_macro ( mqc,
curctx,
a,
c,
ct,
d )
Value:
{ \
if((*curctx)->mps == (d)) \
mqc_codemps_macro(mqc, curctx, a, c, ct) else mqc_codelps_macro(mqc, curctx, a, c, ct) \
}
#define mqc_codelps_macro(mqc, curctx, a, c, ct)

Referenced by grk::T1::enc_clnpass().

◆ MQC_NUMCTXS

#define MQC_NUMCTXS   19

Referenced by grk::mqc_resetstates().

◆ mqc_renormd

#define mqc_renormd ( mqc)
Value:
renorm_dec_macro(mqc, mqc->a, mqc->c, mqc->ct)
#define renorm_dec_macro(mqc, a, c, ct)

◆ mqc_renorme_macro

#define mqc_renorme_macro ( mqc,
a_,
c_,
ct_ )
Value:
{ \
do \
{ \
a_ <<= 1; \
c_ <<= 1; \
ct_--; \
if(ct_ == 0) \
{ \
mqc->c = c_; \
mqc_byteout(mqc); \
c_ = mqc->c; \
ct_ = mqc->ct; \
} \
} while((a_ & 0x8000) == 0); \
}

◆ mqc_setcurctx

#define mqc_setcurctx ( mqc,
ctxno )
Value:
(mqc)->curctx = (mqc)->ctxs + (uint32_t)(ctxno)

Referenced by grk::T1::dec_clnpass_check_segsym(), grk::mqc_init_dec(), grk::mqc_init_enc(), and grk::mqc_segmark_enc().

◆ POP_MQC

#define POP_MQC ( )
Value:
mqc->curctx = curctx; \
mqc->c = c; \
mqc->a = a; \
mqc->ct = ct;

Referenced by grk::T1::enc_clnpass(), grk::T1::enc_refpass(), and grk::T1::enc_sigpass().

◆ PUSH_MQC

#define PUSH_MQC ( )
Value:
const mqc_state** curctx = mqc->curctx; \
uint32_t c = mqc->c; \
uint32_t a = mqc->a; \
uint32_t ct = mqc->ct

Referenced by grk::T1::enc_clnpass(), grk::T1::enc_refpass(), and grk::T1::enc_sigpass().

◆ renorm_dec_macro

#define renorm_dec_macro ( mqc,
a,
c,
ct )
Value:
{ \
do \
{ \
if(ct == 0) \
bytein_dec_macro(mqc, c, ct); \
a <<= 1; \
c <<= 1; \
ct--; \
} while(a < A_MIN); \
}