35#define DEC_PASS_LOCAL_VARIABLES(flagsStride) \
36 const int32_t one = 1 << bpno; \
37 const auto mqc = &coder; \
38 auto dataPtr = uncompressedData_; \
39 auto flagsPtr = flags_ + flagsStride + 1; \
40 grk_flag _flags = 0; \
41 uint16_t i = 0, j = 0, k = 0; \
42 bool approaching_red; \
43 (void)approaching_red; \
46#define DEC_PASS_LOCAL_VARIABLES_DIFF(flagsStride) \
47 const int32_t one = 1 << bpno; \
48 const auto mqc = &coder; \
49 auto dataPtr = uncompressedData_; \
50 auto flagsPtr = flags_ + flagsStride + 1; \
51 grk_flag _flags = 0; \
52 uint16_t i = 0, j = 0, k = 0; \
53 const mqc_state** curctx; \
56 bool approaching_red = (coder.backup_->i == BACKUP_DISABLED) && \
57 mqc->bp + red_zone >= mqc->end && \
58 ((coder.cur_buffer_index + 1 >= coder.num_buffers) || \
59 coder.buffer_lengths[coder.cur_buffer_index + 1] <= red_zone); \
60 (void)approaching_red;
66#define DEC_PASS_HAS_BACKUP_FOR_CURRENT_PASS(coder) \
67 (coder.backup_->i != BACKUP_DISABLED) && (passno == coder.backup_->passno_)
69#define DEC_PASS_MQC_BACKUP_LOCAL(coder) \
70 coder.backup_->a = a; \
71 coder.backup_->c = c; \
72 coder.backup_->ct = ct; \
73 coder.backup_->curctx_index_ = curctx - &coder.ctxs[0]; \
74 coder.backup_->curctx = &coder.backup_->ctxs[coder.backup_->curctx_index_];
76#define DEC_PASS_MQC_RESTORE_LOCAL(coder) \
77 a = coder.backup_->a; \
78 c = coder.backup_->c; \
79 ct = coder.backup_->ct; \
80 coder.curctx_index_ = coder.backup_->curctx_index_; \
81 curctx = &coder.ctxs[coder.curctx_index_]; \
82 coder.curctx = curctx; \
87#define DEC_PASS_DO_BACKUP(coder, p) \
89 DEC_PASS_MQC_BACKUP_LOCAL(coder); \
90 auto b = coder.backup_; \
95 b->flagsPtr_ = flagsPtr; \
97 b->dataPtr_ = dataPtr; \
98 b->passno_ = passno; \
99 b->passtype_ = passtype; \
100 b->numBpsToDecompress_ = (uint8_t)bpno; \
101 approaching_red = false; \
102 b->layer_ = (uint16_t)coder.cur_buffer_index;
104#define DEC_PASS_BACKUP(coder, p) \
105 if(approaching_red) \
107 DEC_PASS_DO_BACKUP(coder, p) \
110#define DEC_PASS_CLN_BACKUP(p) \
111 if(approaching_red) \
113 DEC_PASS_DO_BACKUP(coder, p); \
114 coder.backup_->runlen = runlen; \
115 coder.backup_->partial = partial; \
118#define DEC_PASS_RESTORE(coder) \
121 if(DEC_PASS_HAS_BACKUP_FOR_CURRENT_PASS(coder)) \
123 DEC_PASS_MQC_RESTORE_LOCAL(coder); \
124 auto b = coder.backup_; \
128 flagsPtr = b->flagsPtr_; \
129 _flags = b->_flags; \
130 dataPtr = b->dataPtr_; \
131 coder.cur_buffer_index = b->layer_; \
133 coder.buffers[coder.cur_buffer_index] + coder.buffer_lengths[coder.cur_buffer_index]; \
134 approaching_red = mqc->bp + red_zone >= mqc->end && \
135 ((coder.cur_buffer_index + 1 >= coder.num_buffers) || \
136 coder.buffer_lengths[coder.cur_buffer_index + 1] <= red_zone); \
137 b->i = BACKUP_DISABLED; \
138 assert(b->passno_ == passno); \
139 assert(b->passtype_ == passtype); \
140 assert(b->numBpsToDecompress_ == (uint8_t)bpno); \
141 switch(b->position) \
157 curctx = coder.curctx; \
164#define DEC_PASS_CLN_RESTORE(coder) \
167 if(DEC_PASS_HAS_BACKUP_FOR_CURRENT_PASS(coder)) \
169 DEC_PASS_MQC_RESTORE_LOCAL(coder); \
170 auto b = coder.backup_; \
174 runlen = coder.backup_->runlen; \
175 partial = coder.backup_->partial; \
176 flagsPtr = b->flagsPtr_; \
177 _flags = b->_flags; \
178 dataPtr = b->dataPtr_; \
179 coder.cur_buffer_index = b->layer_; \
181 coder.buffers[coder.cur_buffer_index] + coder.buffer_lengths[coder.cur_buffer_index]; \
182 approaching_red = mqc->bp + red_zone >= mqc->end && \
183 ((coder.cur_buffer_index + 1 >= coder.num_buffers) || \
184 coder.buffer_lengths[coder.cur_buffer_index + 1] <= red_zone); \
185 b->i = BACKUP_DISABLED; \
186 assert(b->passno_ == passno); \
187 assert(b->passtype_ == passtype); \
188 assert(b->numBpsToDecompress_ == (uint8_t)bpno); \
189 switch(b->position) \
219 curctx = coder.curctx; \
235#define DEC_BYTEIN(mqc, c, ct) \
237 uint8_t cur = 0xff; \
238 if(mqc->bp >= mqc->end) \
240 if(mqc->cur_buffer_index + 1 < mqc->num_buffers) \
243 mqc->cur_buffer_index++; \
244 mqc->bp = mqc->buffers[mqc->cur_buffer_index]; \
245 mqc->end = mqc->bp + mqc->buffer_lengths[mqc->cur_buffer_index]; \
247 approaching_red = mqc->backup_ && (mqc->backup_->i == BACKUP_DISABLED) && \
248 mqc->bp + red_zone >= mqc->end && \
249 ((mqc->cur_buffer_index + 1 >= mqc->num_buffers) || \
250 mqc->buffer_lengths[mqc->cur_buffer_index + 1] <= red_zone); \
257 uint8_t next = 0xff; \
258 if(mqc->bp + 1 >= mqc->end) \
260 if(mqc->cur_buffer_index + 1 < mqc->num_buffers) \
263 next = *mqc->buffers[mqc->cur_buffer_index + 1]; \
267 mqc->overflow_ = true; \
272 next = *(mqc->bp + 1); \
274 uint8_t curff = (cur == 0xff); \
275 uint8_t is_end = curff & (next > 0x8f); \
280 mqc->end_of_byte_stream_counter++; \
285 approaching_red = mqc->backup_ && (mqc->backup_->i == BACKUP_DISABLED) && \
286 mqc->bp + red_zone >= mqc->end && \
287 ((mqc->cur_buffer_index + 1 >= mqc->num_buffers) || \
288 mqc->buffer_lengths[mqc->cur_buffer_index + 1] <= red_zone); \
289 c += next << (8 + curff); \
294#define DEC_RENORM(mqc, a, c, ct) \
300 if(mqc->start == mqc->end) \
304 mqc->end_of_byte_stream_counter++; \
307 DEC_BYTEIN(mqc, c, ct); \
312 } while(a < A_MIN); \
324#define DEC_SYMBOL(d, mqc, curctx, a, c, ct) \
327 auto ctx = *(curctx); \
329 uint32_t qeval_shift = ctx->qeval << 16; \
330 if(c < qeval_shift) \
332 uint32_t mask = (uint32_t)-(a < ctx->qeval); \
334 d = ctx->mps ^ (~mask & 1); \
335 *curctx = mask ? ctx->nmps : ctx->nlps; \
336 DEC_RENORM(mqc, a, c, ct); \
343 uint32_t mask = (uint32_t)-(a < ctx->qeval); \
344 d = ctx->mps ^ (mask & 1); \
345 *curctx = mask ? ctx->nlps : ctx->nmps; \
346 DEC_RENORM(mqc, a, c, ct); \
359#define DEC_SYMBOL_RAW() \
363 uint8_t curr = 0xff; \
364 if(coder.bp >= coder.end) \
366 if(coder.cur_buffer_index + 1 < coder.num_buffers) \
368 coder.cur_buffer_index++; \
369 coder.bp = coder.buffers[coder.cur_buffer_index]; \
370 coder.end = coder.bp + coder.buffer_lengths[coder.cur_buffer_index]; \
378 if(coder.c == 0xff) \
400 v = ((uint8_t)coder.c >> coder.ct) & 0x1U; \
const uint8_t B12_POS
Definition mqc_dec_inl.h:33
const uint8_t B11_POS
Definition mqc_dec_inl.h:32
const uint8_t B4_POS
Definition mqc_dec_inl.h:25
const uint8_t B9_POS
Definition mqc_dec_inl.h:30
const uint32_t A_MIN
Definition mqc_dec_inl.h:20
const uint8_t B5_POS
Definition mqc_dec_inl.h:26
const uint8_t B8_POS
Definition mqc_dec_inl.h:29
const uint8_t B6_POS
Definition mqc_dec_inl.h:27
const uint8_t B7_POS
Definition mqc_dec_inl.h:28
const uint8_t red_zone
Definition mqc_dec_inl.h:64
const uint8_t B10_POS
Definition mqc_dec_inl.h:31
const uint8_t B1_POS
Definition mqc_dec_inl.h:22
const uint8_t B3_POS
Definition mqc_dec_inl.h:24
const uint8_t B2_POS
Definition mqc_dec_inl.h:23