Coverage Report

Created: 2026-04-01 07:49

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/jasper/src/libjasper/jpc/jpc_mqdec.h
Line
Count
Source
1
/*
2
 * Copyright (c) 1999-2000 Image Power, Inc. and the University of
3
 *   British Columbia.
4
 * Copyright (c) 2001-2003 Michael David Adams.
5
 * All rights reserved.
6
 */
7
8
/* __START_OF_JASPER_LICENSE__
9
 * 
10
 * JasPer License Version 2.0
11
 * 
12
 * Copyright (c) 2001-2006 Michael David Adams
13
 * Copyright (c) 1999-2000 Image Power, Inc.
14
 * Copyright (c) 1999-2000 The University of British Columbia
15
 * 
16
 * All rights reserved.
17
 * 
18
 * Permission is hereby granted, free of charge, to any person (the
19
 * "User") obtaining a copy of this software and associated documentation
20
 * files (the "Software"), to deal in the Software without restriction,
21
 * including without limitation the rights to use, copy, modify, merge,
22
 * publish, distribute, and/or sell copies of the Software, and to permit
23
 * persons to whom the Software is furnished to do so, subject to the
24
 * following conditions:
25
 * 
26
 * 1.  The above copyright notices and this permission notice (which
27
 * includes the disclaimer below) shall be included in all copies or
28
 * substantial portions of the Software.
29
 * 
30
 * 2.  The name of a copyright holder shall not be used to endorse or
31
 * promote products derived from the Software without specific prior
32
 * written permission.
33
 * 
34
 * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS
35
 * LICENSE.  NO USE OF THE SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER
36
 * THIS DISCLAIMER.  THE SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS
37
 * "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
38
 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
39
 * PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.  IN NO
40
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
41
 * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
42
 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
43
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
44
 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.  NO ASSURANCES ARE
45
 * PROVIDED BY THE COPYRIGHT HOLDERS THAT THE SOFTWARE DOES NOT INFRINGE
46
 * THE PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF ANY OTHER ENTITY.
47
 * EACH COPYRIGHT HOLDER DISCLAIMS ANY LIABILITY TO THE USER FOR CLAIMS
48
 * BROUGHT BY ANY OTHER ENTITY BASED ON INFRINGEMENT OF INTELLECTUAL
49
 * PROPERTY RIGHTS OR OTHERWISE.  AS A CONDITION TO EXERCISING THE RIGHTS
50
 * GRANTED HEREUNDER, EACH USER HEREBY ASSUMES SOLE RESPONSIBILITY TO SECURE
51
 * ANY OTHER INTELLECTUAL PROPERTY RIGHTS NEEDED, IF ANY.  THE SOFTWARE
52
 * IS NOT FAULT-TOLERANT AND IS NOT INTENDED FOR USE IN MISSION-CRITICAL
53
 * SYSTEMS, SUCH AS THOSE USED IN THE OPERATION OF NUCLEAR FACILITIES,
54
 * AIRCRAFT NAVIGATION OR COMMUNICATION SYSTEMS, AIR TRAFFIC CONTROL
55
 * SYSTEMS, DIRECT LIFE SUPPORT MACHINES, OR WEAPONS SYSTEMS, IN WHICH
56
 * THE FAILURE OF THE SOFTWARE OR SYSTEM COULD LEAD DIRECTLY TO DEATH,
57
 * PERSONAL INJURY, OR SEVERE PHYSICAL OR ENVIRONMENTAL DAMAGE ("HIGH
58
 * RISK ACTIVITIES").  THE COPYRIGHT HOLDERS SPECIFICALLY DISCLAIM ANY
59
 * EXPRESS OR IMPLIED WARRANTY OF FITNESS FOR HIGH RISK ACTIVITIES.
60
 * 
61
 * __END_OF_JASPER_LICENSE__
62
 */
63
64
/*
65
 * MQ Arithmetic Decoder
66
 *
67
 * $Id$
68
 */
69
70
#ifndef JPC_MQDEC_H
71
#define JPC_MQDEC_H
72
73
/******************************************************************************\
74
* Includes.
75
\******************************************************************************/
76
77
#include "jasper/jas_types.h"
78
#include "jasper/jas_stream.h"
79
80
#include "jpc_mqcod.h"
81
82
#include <stdio.h>
83
84
/******************************************************************************\
85
* Types.
86
\******************************************************************************/
87
88
/* MQ arithmetic decoder. */
89
90
typedef struct {
91
92
  /* The C register. */
93
  uint_least32_t creg;
94
95
  /* The A register. */
96
  uint_least32_t areg;
97
98
  /* The CT register. */
99
  uint_least32_t ctreg;
100
101
  /* The current context. */
102
  const jpc_mqstate_t **curctx;
103
104
  /* The per-context information. */
105
  const jpc_mqstate_t **ctxs;
106
107
  /* The maximum number of contexts. */
108
  unsigned maxctxs;
109
110
  /* The stream from which to read data. */
111
  jas_stream_t *in;
112
113
  /* The last character read. */
114
  jas_uchar inbuffer;
115
116
  /* The EOF indicator. */
117
  bool eof;
118
119
} jpc_mqdec_t;
120
121
/******************************************************************************\
122
* Functions/macros for construction and destruction.
123
\******************************************************************************/
124
125
/* Create a MQ decoder. */
126
jpc_mqdec_t *jpc_mqdec_create(unsigned maxctxs, jas_stream_t *in);
127
128
/* Destroy a MQ decoder. */
129
void jpc_mqdec_destroy(jpc_mqdec_t *dec);
130
131
/******************************************************************************\
132
* Functions/macros for initialization.
133
\******************************************************************************/
134
135
/* Set the input stream associated with a MQ decoder. */
136
void jpc_mqdec_setinput(jpc_mqdec_t *dec, jas_stream_t *in);
137
138
/* Initialize a MQ decoder. */
139
void jpc_mqdec_init(jpc_mqdec_t *dec);
140
141
/******************************************************************************\
142
* Functions/macros for manipulating contexts.
143
\******************************************************************************/
144
145
/* Set the current context for a MQ decoder. */
146
static inline void jpc_mqdec_setcurctx(jpc_mqdec_t *dec, unsigned ctxno)
147
603M
{
148
603M
  dec->curctx = &dec->ctxs[ctxno];
149
603M
}
jpc_t1dec.c:jpc_mqdec_setcurctx
Line
Count
Source
147
603M
{
148
603M
  dec->curctx = &dec->ctxs[ctxno];
149
603M
}
Unexecuted instantiation: jpc_mqdec.c:jpc_mqdec_setcurctx
150
151
/* Set the state information for all contexts of a MQ decoder. */
152
void jpc_mqdec_setctxs(const jpc_mqdec_t *dec, unsigned numctxs, const jpc_mqctx_t *ctxs);
153
154
/******************************************************************************\
155
* Functions/macros for decoding bits.
156
\******************************************************************************/
157
158
/* Decode a symbol. */
159
#ifdef NDEBUG
160
#define jpc_mqdec_getbit(dec) \
161
  jpc_mqdec_getbit_macro(dec)
162
#else
163
#define jpc_mqdec_getbit(dec) \
164
607M
  jpc_mqdec_getbit_func(dec)
165
#endif
166
167
/* Decode a symbol (assuming an unskewed probability distribution). */
168
#ifdef NDEBUG
169
#define jpc_mqdec_getbitnoskew(dec) \
170
  jpc_mqdec_getbit_macro(dec)
171
#else
172
#define jpc_mqdec_getbitnoskew(dec) \
173
  jpc_mqdec_getbit_func(dec)
174
#endif
175
176
/******************************************************************************\
177
* Functions/macros for debugging.
178
\******************************************************************************/
179
180
/* Dump the MQ decoder state for debugging. */
181
void jpc_mqdec_dump(const jpc_mqdec_t *dec);
182
183
/******************************************************************************\
184
* EVERYTHING BELOW THIS POINT IS IMPLEMENTATION SPECIFIC AND NOT PART OF THE
185
* APPLICATION INTERFACE.  DO NOT RELY ON ANY OF THE INTERNAL FUNCTIONS/MACROS
186
* GIVEN BELOW.
187
\******************************************************************************/
188
189
bool jpc_mqdec_mpsexchrenormd(jpc_mqdec_t *dec);
190
bool jpc_mqdec_lpsexchrenormd(jpc_mqdec_t *dec);
191
192
JAS_FORCE_INLINE
193
static bool jpc_mqdec_getbit_macro(jpc_mqdec_t *dec)
194
607M
{
195
607M
  const jpc_mqstate_t *const state = *dec->curctx;
196
197
607M
  dec->areg -= state->qeval;
198
199
607M
  if (dec->creg >= (uint_least32_t)state->qeval << 16) {
200
578M
    dec->creg -= (uint_least32_t)state->qeval << 16;
201
578M
    return dec->areg & 0x8000
202
578M
      ? state->mps
203
578M
      : jpc_mqdec_mpsexchrenormd(dec);
204
578M
  } else {
205
29.3M
    return jpc_mqdec_lpsexchrenormd(dec);
206
29.3M
  }
207
607M
}
Unexecuted instantiation: jpc_t1dec.c:jpc_mqdec_getbit_macro
jpc_mqdec.c:jpc_mqdec_getbit_macro
Line
Count
Source
194
607M
{
195
607M
  const jpc_mqstate_t *const state = *dec->curctx;
196
197
607M
  dec->areg -= state->qeval;
198
199
607M
  if (dec->creg >= (uint_least32_t)state->qeval << 16) {
200
578M
    dec->creg -= (uint_least32_t)state->qeval << 16;
201
578M
    return dec->areg & 0x8000
202
578M
      ? state->mps
203
578M
      : jpc_mqdec_mpsexchrenormd(dec);
204
578M
  } else {
205
29.3M
    return jpc_mqdec_lpsexchrenormd(dec);
206
29.3M
  }
207
607M
}
208
209
JAS_FORCE_INLINE
210
static bool jpc_mqdec_mpsexchange(uint_least32_t areg, uint_least32_t delta, const jpc_mqstate_t **curctx)
211
35.0M
{
212
35.0M
  if (areg < delta) {
213
8.78M
    const jpc_mqstate_t *state = *curctx;
214
    /* LPS decoded. */
215
8.78M
    *curctx = state->nlps;
216
8.78M
    return !state->mps;
217
26.2M
  } else {
218
26.2M
    const jpc_mqstate_t *state = *curctx;
219
    /* MPS decoded. */
220
26.2M
    *curctx = state->nmps;
221
26.2M
    return state->mps;
222
26.2M
  }
223
35.0M
}
Unexecuted instantiation: jpc_t1dec.c:jpc_mqdec_mpsexchange
jpc_mqdec.c:jpc_mqdec_mpsexchange
Line
Count
Source
211
35.0M
{
212
35.0M
  if (areg < delta) {
213
8.78M
    const jpc_mqstate_t *state = *curctx;
214
    /* LPS decoded. */
215
8.78M
    *curctx = state->nlps;
216
8.78M
    return !state->mps;
217
26.2M
  } else {
218
26.2M
    const jpc_mqstate_t *state = *curctx;
219
    /* MPS decoded. */
220
26.2M
    *curctx = state->nmps;
221
26.2M
    return state->mps;
222
26.2M
  }
223
35.0M
}
224
225
JAS_FORCE_INLINE
226
static bool jpc_mqdec_lpsexchange(uint_least32_t *areg_p, uint_least32_t delta, const jpc_mqstate_t **curctx)
227
29.3M
{
228
29.3M
  if (*areg_p >= delta) {
229
23.0M
    const jpc_mqstate_t *state = *curctx;
230
23.0M
    *areg_p = delta;
231
23.0M
    *curctx = state->nlps;
232
23.0M
    return !state->mps;
233
23.0M
  } else {
234
6.33M
    const jpc_mqstate_t *state = *curctx;
235
6.33M
    *areg_p = delta;
236
6.33M
    *curctx = state->nmps;
237
6.33M
    return state->mps;
238
6.33M
  }
239
29.3M
}
Unexecuted instantiation: jpc_t1dec.c:jpc_mqdec_lpsexchange
jpc_mqdec.c:jpc_mqdec_lpsexchange
Line
Count
Source
227
29.3M
{
228
29.3M
  if (*areg_p >= delta) {
229
23.0M
    const jpc_mqstate_t *state = *curctx;
230
23.0M
    *areg_p = delta;
231
23.0M
    *curctx = state->nlps;
232
23.0M
    return !state->mps;
233
23.0M
  } else {
234
6.33M
    const jpc_mqstate_t *state = *curctx;
235
6.33M
    *areg_p = delta;
236
6.33M
    *curctx = state->nmps;
237
6.33M
    return state->mps;
238
6.33M
  }
239
29.3M
}
240
241
bool jpc_mqdec_getbit_func(jpc_mqdec_t *dec);
242
243
#endif