Grok  7.6.2
T1.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2016-2020 Grok Image Compression Inc.
3  *
4  * This source code is free software: you can redistribute it and/or modify
5  * it under the terms of the GNU Affero General Public License, version 3,
6  * as published by the Free Software Foundation.
7  *
8  * This source code is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU Affero General Public License for more details.
12  *
13  * You should have received a copy of the GNU Affero General Public License
14  * along with this program. If not, see <http://www.gnu.org/licenses/>.
15  *
16  *
17  * This source code incorporates work covered by the BSD 2-clause license.
18  * Please see the LICENSE file in the root directory for details.
19  *
20  */
21 
22 #pragma once
23 
24 
25 #include "grk_includes.h"
26 
27 
28 namespace grk {
29 
31 typedef uint32_t grk_flag;
32 
33 struct T1 {
34 
35  T1(bool isCompressor, uint32_t maxCblkW, uint32_t maxCblkH);
36  ~T1();
37 
38  bool decompress_cblk(cblk_dec *cblk,
39  uint8_t orientation,
40  uint32_t cblksty);
41  void code_block_enc_deallocate(cblk_enc *p_code_block);
42  bool allocate_buffers(uint32_t w, uint32_t h);
43  double compress_cblk(cblk_enc *cblk,
44  uint32_t max,
45  uint8_t orientation,
46  uint32_t compno,
47  uint32_t level,
48  uint32_t qmfbid,
49  double stepsize,
50  uint32_t cblksty,
51  const double *mct_norms,
52  uint32_t mct_numcomps,
53  bool doRateControl);
54 
57 
58  int32_t *data;
59  uint32_t w;
60  uint32_t h;
61  uint32_t data_stride;
62  /* Temporary buffer to concatenate all chunks of a codebock */
63  uint8_t *cblkdatabuffer;
64  /* Maximum size available in cblkdatabuffer */
66 
67 
68 private:
69 
76 
77  uint32_t datasize;
78  uint32_t flagssize;
79  bool compressor;
80 
81  template <uint32_t w, uint32_t h, bool vsc> void dec_clnpass(int32_t bpno);
82  void dec_clnpass_step(grk_flag *flagsp,
83  int32_t *datap,
84  int32_t oneplushalf,
85  uint32_t ciorig,
86  uint32_t ci,
87  uint32_t vsc);
88  void dec_clnpass(int32_t bpno, int32_t cblksty);
89  void dec_clnpass_check_segsym(int32_t cblksty);
90  void dec_sigpass_raw(int32_t bpno, int32_t cblksty);
91  void dec_refpass_raw(int32_t bpno);
92  void dec_sigpass_mqc(int32_t bpno, int32_t cblksty);
93  void dec_refpass_mqc(int32_t bpno);
94  inline void dec_refpass_step_raw(grk_flag *flagsp,
95  int32_t *datap,
96  int32_t poshalf,
97  uint32_t ci);
98  inline void dec_refpass_step_mqc(mqcoder *mqc,
99  grk_flag *flagsp,
100  int32_t *datap,
101  int32_t poshalf,
102  uint32_t ci);
103  inline void dec_sigpass_step_raw(grk_flag *flagsp,
104  int32_t *datap,
105  int32_t oneplushalf,
106  uint32_t vsc,
107  uint32_t ci);
108  inline void dec_sigpass_step_mqc( grk_flag *flagsp,
109  int32_t *datap,
110  int32_t oneplushalf,
111  uint32_t ci,
112  uint32_t flags_stride,
113  uint32_t vsc);
114  void enc_clnpass(int32_t bpno,
115  int32_t *nmsedec,
116  uint32_t cblksty);
117  void enc_sigpass(int32_t bpno,
118  int32_t *nmsedec,
119  uint8_t type,
120  uint32_t cblksty);
121  void enc_refpass(int32_t bpno,
122  int32_t *nmsedec,
123  uint8_t type);
124  int enc_is_term_pass(cblk_enc *cblk,
125  uint32_t cblksty,
126  int32_t bpno,
127  uint32_t passtype);
128  bool code_block_enc_allocate(cblk_enc *p_code_block);
129 
130 
137  double getnorm_53(uint32_t level, uint8_t orientation);
144  double getnorm_97(uint32_t level, uint8_t orientation);
145 
146  double getnorm(uint32_t level, uint8_t orientation, bool reversible);
147 
148  double getwmsedec(int32_t nmsedec, uint32_t compno, uint32_t level,
149  uint8_t orientation, int32_t bpno,
150  uint32_t qmfbid, double stepsize,
151  const double *mct_norms,
152  uint32_t mct_numcomps);
153 
154 };
155 
156 }
grk::mqc_bypass_get_extra_bytes_enc
uint32_t mqc_bypass_get_extra_bytes_enc(mqcoder *mqc, bool erterm)
Definition: mqc_enc.cpp:273
grk::T1::dec_clnpass_check_segsym
void dec_clnpass_check_segsym(int32_t cblksty)
Definition: T1.cpp:1009
T1_CHI_0_I
#define T1_CHI_0_I
Definition: T1.cpp:67
grk::T1::dec_refpass_raw
void dec_refpass_raw(int32_t bpno)
Definition: T1.cpp:1230
grk::grk_aligned_free
void grk_aligned_free(void *ptr)
Definition: MemManager.cpp:123
grk::T1::h
uint32_t h
Definition: T1.h:60
grk::T1::getnorm_53
double getnorm_53(uint32_t level, uint8_t orientation)
Get the norm of a wavelet function of a subband at a specified level for the reversible 5-3 DWT.
Definition: T1.cpp:268
grk::mqc_init_dec
void mqc_init_dec(mqcoder *mqc, uint8_t *bp, uint32_t len)
Initialize the decoder for MQ decoding.
Definition: mqc_dec.cpp:140
grk::mqc_erterm_enc
void mqc_erterm_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:331
T1_CTXNO_UNI
#define T1_CTXNO_UNI
Definition: t1_common.h:63
grk::T1::dec_refpass_step_raw
void dec_refpass_step_raw(grk_flag *flagsp, int32_t *datap, int32_t poshalf, uint32_t ci)
Definition: T1.cpp:1198
mqc_encode_macro
#define mqc_encode_macro(mqc, curctx, a, c, ct, d)
Definition: mqc_enc_inl.h:83
grk::getctxno_sc
static INLINE uint8_t getctxno_sc(uint32_t lu)
Definition: T1.cpp:186
grk::T1::getwmsedec
double getwmsedec(int32_t nmsedec, uint32_t compno, uint32_t level, uint8_t orientation, int32_t bpno, uint32_t qmfbid, double stepsize, const double *mct_norms, uint32_t mct_numcomps)
Definition: T1.cpp:408
grk::cblk_enc::passes
pass_enc * passes
Definition: t1_common.h:81
T1_CTXNO_AGG
#define T1_CTXNO_AGG
Definition: t1_common.h:62
grk::T1::enc_clnpass
void enc_clnpass(int32_t bpno, int32_t *nmsedec, uint32_t cblksty)
Definition: T1.cpp:596
t1_common.h
logger.h
grk::cblk_enc
Definition: t1_common.h:79
grk::mqc_raw_init_dec
void mqc_raw_init_dec(mqcoder *mqc, uint8_t *bp, uint32_t len)
Initialize the decoder for RAW decoding.
Definition: mqc_dec.cpp:156
grk::cblk_dec::y1
uint32_t y1
Definition: t1_common.h:100
GRK_CBLKSTY_VSC
#define GRK_CBLKSTY_VSC
Vertically stripe causal context.
Definition: grok.h:98
grk::getctxno_mag
static INLINE uint32_t getctxno_mag(uint32_t f)
Definition: T1.cpp:190
mqc_decode
#define mqc_decode(d, mqc)
Decompress a symbol.
Definition: mqc_dec_inl.h:153
grk::cblk_dec::seg_buffers
seg_data_chunk * seg_buffers
Definition: t1_common.h:99
T1_SIGMA_NEIGHBOURS
#define T1_SIGMA_NEIGHBOURS
Definition: T1.cpp:118
grk::T1::allocate_buffers
bool allocate_buffers(uint32_t w, uint32_t h)
Definition: T1.cpp:280
UPLOAD_MQC_VARIABLES
#define UPLOAD_MQC_VARIABLES(mqc, curctx)
Definition: mqc_inl.h:32
T1_TYPE_MQ
#define T1_TYPE_MQ
Definition: T1.cpp:135
grk::GRK_WARN
void GRK_WARN(const char *fmt,...)
Definition: logger.cpp:49
grk::getnmsedec_ref
static int16_t getnmsedec_ref(uint32_t x, uint32_t bitpos)
Definition: T1.cpp:205
grk::grk_calloc
void * grk_calloc(size_t num, size_t size)
Allocate a memory block with elements initialized to 0.
Definition: MemManager.cpp:111
grk::T1::flagssize
uint32_t flagssize
Definition: T1.h:78
grk::mqc_init_enc
void mqc_init_enc(mqcoder *mqc, uint8_t *bp)
Definition: mqc_enc.cpp:210
grk::T1::dec_sigpass_raw
void dec_sigpass_raw(int32_t bpno, int32_t cblksty)
Definition: T1.cpp:1098
T1_SIGMA_3
#define T1_SIGMA_3
Definition: T1.cpp:51
dec_sigpass_mqc_internal
#define dec_sigpass_mqc_internal(bpno, vsc, w, h, flags_stride)
Definition: T1.cpp:1139
grk::cblk_dec::numbps
uint32_t numbps
Definition: t1_common.h:101
grk::cblk_dec::numSegments
uint32_t numSegments
Definition: t1_common.h:102
grk::mqc_resetstates
void mqc_resetstates(mqcoder *mqc)
Definition: mqc_dec.cpp:167
grk::grk_free
void grk_free(void *ptr)
Deallocates or frees a memory block.
Definition: MemManager.cpp:141
grk::T1::cblkdatabuffersize
uint32_t cblkdatabuffersize
Definition: T1.h:65
lut_nmsedec_ref0
static const int16_t lut_nmsedec_ref0[1U<< T1_NMSEDEC_BITS]
Definition: t1_luts.h:157
grk::seg
Definition: t1_common.h:92
T1_CHI_2_I
#define T1_CHI_2_I
Definition: T1.cpp:73
T1_CHI_1_I
#define T1_CHI_1_I
Definition: T1.cpp:69
T1_MU_0
#define T1_MU_0
Definition: T1.cpp:70
grk::getctxno_zc
static INLINE uint8_t getctxno_zc(mqcoder *mqc, uint32_t f)
Definition: T1.cpp:155
T1_SIGMA_10
#define T1_SIGMA_10
Definition: T1.cpp:58
grk::getspb
static INLINE uint8_t getspb(uint32_t lu)
Definition: T1.cpp:196
GRK_CBLKSTY_PTERM
#define GRK_CBLKSTY_PTERM
Predictable termination.
Definition: grok.h:99
T1_CTXNO_MAG
#define T1_CTXNO_MAG
Definition: t1_common.h:61
T1_NMSEDEC_FRACBITS
#define T1_NMSEDEC_FRACBITS
Definition: t1_common.h:51
T1_SIGMA_13
#define T1_SIGMA_13
Definition: T1.cpp:61
T1_SIGMA_1
#define T1_SIGMA_1
Definition: T1.cpp:49
grk::T1::code_block_enc_allocate
bool code_block_enc_allocate(cblk_enc *p_code_block)
Definition: T1.cpp:397
T1_PI_1
#define T1_PI_1
Definition: T1.cpp:76
lut_nmsedec_ref
static const int16_t lut_nmsedec_ref[1U<< T1_NMSEDEC_BITS]
Definition: t1_luts.h:138
enc_sigpass_step_macro
#define enc_sigpass_step_macro(datap, ci, vsc)
Definition: T1.cpp:452
grk::T1::~T1
~T1()
Definition: T1.cpp:376
lut_nmsedec_sig
static const int16_t lut_nmsedec_sig[1U<< T1_NMSEDEC_BITS]
Definition: t1_luts.h:100
GRK_CBLKSTY_RESET
#define GRK_CBLKSTY_RESET
Reset context probabilities on coding pass boundaries.
Definition: grok.h:96
grk::T1::data_stride
uint32_t data_stride
Definition: T1.h:61
grk::pass_enc::rate
uint32_t rate
Definition: t1_common.h:73
grk::pass_enc
Definition: t1_common.h:72
grk::T1::dec_sigpass_step_raw
void dec_sigpass_step_raw(grk_flag *flagsp, int32_t *datap, int32_t oneplushalf, uint32_t vsc, uint32_t ci)
Definition: T1.cpp:1045
T1_PI_0
#define T1_PI_0
Definition: T1.cpp:71
grk::grk_aligned_malloc
void * grk_aligned_malloc(size_t size)
Allocate memory aligned to a 16 byte boundary.
Definition: MemManager.cpp:119
smr_abs
#define smr_abs(x)
Definition: t1_common.h:107
grk::T1::getnorm_97
double getnorm_97(uint32_t level, uint8_t orientation)
Get the norm of a wavelet function of a subband at a specified level for the irreversible 9-7 DWT.
Definition: T1.cpp:275
grk::T1::datasize
uint32_t datasize
Definition: T1.h:77
grk::getctxtno_sc_or_spb_index
static INLINE uint32_t getctxtno_sc_or_spb_index(uint32_t fX, uint32_t pfX, uint32_t nfX, uint32_t ci)
Definition: T1.cpp:159
grk::update_flags
static INLINE void update_flags(grk_flag *flagsp, uint32_t ci, uint32_t s, uint32_t stride, uint32_t vsc)
Definition: T1.cpp:236
dec_clnpass_step_macro
#define dec_clnpass_step_macro(check_flags, partial, flags, flagsp, flags_stride, data, data_stride, ciorig, ci, mqc, curctx, v, a, c, ct, oneplushalf, vsc)
Definition: T1.cpp:883
T1_SIGMA_5
#define T1_SIGMA_5
Definition: T1.cpp:53
grk::T1::dec_clnpass
void dec_clnpass(int32_t bpno)
Definition: T1.cpp:1028
grk::cblk_dec::x1
uint32_t x1
Definition: t1_common.h:100
grk::T1::enc_is_term_pass
int enc_is_term_pass(cblk_enc *cblk, uint32_t cblksty, int32_t bpno, uint32_t passtype)
Definition: T1.cpp:430
dec_sigpass_step_mqc_macro
#define dec_sigpass_step_mqc_macro(flags, flagsp, flags_stride, data, data_stride, ciorig, ci, mqc, curctx, v, a, c, ct, oneplushalf, vsc)
Definition: T1.cpp:1061
T1_MU_THIS
#define T1_MU_THIS
Definition: T1.cpp:122
grk::grk_flag
uint32_t grk_flag
Flags for 4 consecutive rows of a column.
Definition: T1.h:31
lut_nmsedec_sig0
static const int16_t lut_nmsedec_sig0[1U<< T1_NMSEDEC_BITS]
Definition: t1_luts.h:119
dec_refpass_step_mqc_macro
#define dec_refpass_step_mqc_macro(flags, data, data_stride, ciorig, ci, mqc, curctx, v, a, c, ct, poshalf)
Definition: T1.cpp:1210
grk::T1::enc_sigpass
void enc_sigpass(int32_t bpno, int32_t *nmsedec, uint8_t type, uint32_t cblksty)
Definition: T1.cpp:485
mqc_setcurctx
#define mqc_setcurctx(mqc, ctxno)
Definition: mqc_inl.h:38
DOWNLOAD_MQC_VARIABLES
#define DOWNLOAD_MQC_VARIABLES(mqc)
Definition: mqc_inl.h:26
grk::T1::dec_refpass_step_mqc
void dec_refpass_step_mqc(mqcoder *mqc, grk_flag *flagsp, int32_t *datap, int32_t poshalf, uint32_t ci)
Definition: T1.cpp:1223
grk::mqcoder::ct
uint32_t ct
number of bits already read or free to write
Definition: mqc.h:48
grk::mqc_restart_init_enc
void mqc_restart_init_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:314
GRK_CBLKSTY_SEGSYM
#define GRK_CBLKSTY_SEGSYM
Segmentation symbols are used.
Definition: grok.h:100
grk::mqcoder::curctx
const mqc_state ** curctx
Active context.
Definition: mqc.h:60
grk::T1::dec_clnpass_step
void dec_clnpass_step(grk_flag *flagsp, int32_t *datap, int32_t oneplushalf, uint32_t ciorig, uint32_t ci, uint32_t vsc)
Definition: T1.cpp:911
T1_CHI_THIS_I
#define T1_CHI_THIS_I
Definition: T1.cpp:121
grk
Copyright (C) 2016-2020 Grok Image Compression Inc.
Definition: BitIO.cpp:23
grk::mqcoder::c
uint32_t c
temporary buffer where bits are coded or decoded
Definition: mqc.h:44
T1_NMSEDEC_BITS
#define T1_NMSEDEC_BITS
Definition: t1_common.h:50
grk::T1::compressor
bool compressor
Definition: T1.h:79
grk::cblk_enc::numbps
uint32_t numbps
Definition: t1_common.h:83
grk::cblk_dec::segs
seg * segs
Definition: t1_common.h:98
grk::T1::dec_sigpass_step_mqc
void dec_sigpass_step_mqc(grk_flag *flagsp, int32_t *datap, int32_t oneplushalf, uint32_t ci, uint32_t flags_stride, uint32_t vsc)
Definition: T1.cpp:1087
grk::grk_malloc
void * grk_malloc(size_t size)
Allocate an uninitialized memory block.
Definition: MemManager.cpp:105
grk_includes.h
grk::mqc_segmark_enc
void mqc_segmark_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:344
grk::cblk_dec::y0
uint32_t y0
Definition: t1_common.h:100
mqc_raw_decode
static INLINE uint32_t mqc_raw_decode(mqcoder *mqc)
Decompress a symbol using raw-decoder.
Definition: mqc_dec_inl.h:55
T1_PI_3
#define T1_PI_3
Definition: T1.cpp:83
grk::cblk_dec
Definition: t1_common.h:97
INLINE
#define INLINE
Definition: t1_common.h:28
grk::T1::getnorm
double getnorm(uint32_t level, uint8_t orientation, bool reversible)
Definition: T1.cpp:242
grk::T1::data
int32_t * data
Definition: T1.h:58
T1_PI_2
#define T1_PI_2
Definition: T1.cpp:80
grk::cblk_enc::data
uint8_t * data
Definition: t1_common.h:80
grk::T1::dec_refpass_mqc
void dec_refpass_mqc(int32_t bpno)
Definition: T1.cpp:1303
grk::seg_data_chunk::buf
uint8_t * buf
Definition: t1_common.h:88
GRK_CBLKSTY_LAZY
#define GRK_CBLKSTY_LAZY
Selective arithmetic coding bypass.
Definition: grok.h:95
grk::T1::decompress_cblk
bool decompress_cblk(cblk_dec *cblk, uint8_t orientation, uint32_t cblksty)
Definition: T1.cpp:1311
grk::T1::coder
mqcoder coder
MQC component.
Definition: T1.h:56
T1_SIGMA_4
#define T1_SIGMA_4
Definition: T1.cpp:52
grk::mqc_finish_dec
void mqc_finish_dec(mqcoder *mqc)
Terminate RAW/MQC decoding.
Definition: mqc_dec.cpp:162
grk::T1
Definition: T1.h:33
grk::mqcoder::lut_ctxno_zc_orient
const uint8_t * lut_ctxno_zc_orient
Definition: mqc.h:62
grk::T1::dec_sigpass_mqc
void dec_sigpass_mqc(int32_t bpno, int32_t cblksty)
Definition: T1.cpp:1184
T1_PI_THIS
#define T1_PI_THIS
Definition: T1.cpp:123
T1_SIGMA_THIS
#define T1_SIGMA_THIS
Definition: T1.cpp:113
dec_clnpass_internal
#define dec_clnpass_internal(t1, bpno, vsc, w, h, flags_stride)
Definition: T1.cpp:921
T1_TYPE_RAW
#define T1_TYPE_RAW
Definition: T1.cpp:136
grk::mqc_numbytes_enc
uint32_t mqc_numbytes_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:206
enc_refpass_step_macro
#define enc_refpass_step_macro(datap, ci)
Definition: T1.cpp:532
update_flags_macro
#define update_flags_macro(flags, flagsp, ci, s, stride, vsc)
Definition: T1.cpp:212
grk::T1::compress_cblk
double compress_cblk(cblk_enc *cblk, uint32_t max, uint8_t orientation, uint32_t compno, uint32_t level, uint32_t qmfbid, double stepsize, uint32_t cblksty, const double *mct_norms, uint32_t mct_numcomps, bool doRateControl)
Definition: T1.cpp:739
grk::T1::cblkdatabuffer
uint8_t * cblkdatabuffer
Definition: T1.h:63
lut_spb
static const uint8_t lut_spb[256]
Definition: t1_luts.h:89
grk::getnmsedec_sig
static int16_t getnmsedec_sig(uint32_t x, uint32_t bitpos)
Definition: T1.cpp:199
grk::T1::T1
T1(bool isCompressor, uint32_t maxCblkW, uint32_t maxCblkH)
Definition: T1.cpp:358
grk::seg::len
uint32_t len
Definition: t1_common.h:93
grk::seg::numpasses
uint32_t numpasses
Definition: t1_common.h:94
grk::T1::code_block_enc_deallocate
void code_block_enc_deallocate(cblk_enc *p_code_block)
ENCODE ////////////////////////////////////////////////////.
Definition: T1.cpp:393
GRK_CBLKSTY_TERMALL
#define GRK_CBLKSTY_TERMALL
Termination on each coding pass.
Definition: grok.h:97
dec_refpass_mqc_internal
#define dec_refpass_mqc_internal(bpno, w, h, flags_stride)
Definition: T1.cpp:1260
lut_ctxno_zc
static const uint8_t lut_ctxno_zc[2048]
Definition: t1_luts.h:3
grk::pass_enc::term
bool term
Definition: t1_common.h:76
smr_sign
#define smr_sign(x)
Definition: t1_common.h:108
grk::T1::enc_refpass
void enc_refpass(int32_t bpno, int32_t *nmsedec, uint8_t type)
Definition: T1.cpp:551
grk::mqcoder::a
uint32_t a
only used by MQ decoder
Definition: mqc.h:46
grk::mqc_bypass_flush_enc
void mqc_bypass_flush_enc(mqcoder *mqc, bool erterm)
Definition: mqc_enc.cpp:278
grk::cblk_enc::numPassesTotal
uint32_t numPassesTotal
Definition: t1_common.h:84
grk::mqcoder
Definition: mqc.h:42
grk::T1::flags
grk_flag * flags
Flags used by decompressor and compressor.
Definition: T1.h:75
grk::mqc_flush_enc
void mqc_flush_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:239
grk::k_max_bit_planes
const uint32_t k_max_bit_planes
Definition: t1_common.h:70
lut_ctxno_sc
static const uint8_t lut_ctxno_sc[256]
Definition: t1_luts.h:70
grk::cblk_dec::x0
uint32_t x0
Definition: t1_common.h:100
grk::GRK_ERROR
void GRK_ERROR(const char *fmt,...)
Definition: logger.cpp:57
grk::mqc_bypass_init_enc
void mqc_bypass_init_enc(mqcoder *mqc)
Definition: mqc_enc.cpp:256
T1_SIGMA_7
#define T1_SIGMA_7
Definition: T1.cpp:55
grk::T1::w
uint32_t w
Definition: T1.h:59