/src/jasper/src/libjasper/jpc/jpc_t1cod.c
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 | | * $Id$ |
66 | | */ |
67 | | |
68 | | /******************************************************************************\ |
69 | | * Includes. |
70 | | \******************************************************************************/ |
71 | | |
72 | | #include "jpc_t1cod.h" |
73 | | #include "jpc_cod.h" |
74 | | #include "jpc_cs.h" |
75 | | #include "jpc_mqcod.h" |
76 | | #include "jpc_tsfb.h" |
77 | | |
78 | | #include "jasper/jas_math.h" |
79 | | |
80 | | #include <stdlib.h> |
81 | | #include <assert.h> |
82 | | #include <math.h> |
83 | | |
84 | | JAS_ATTRIBUTE_CONST |
85 | | static double jpc_pow2i(int n); |
86 | | |
87 | | /******************************************************************************\ |
88 | | * Global data. |
89 | | \******************************************************************************/ |
90 | | |
91 | | uint_least8_t jpc_zcctxnolut[4 * 256]; |
92 | | bool jpc_spblut[256]; |
93 | | uint_least8_t jpc_scctxnolut[256]; |
94 | | uint_least8_t jpc_magctxnolut[4096]; |
95 | | |
96 | | jpc_fix_t jpc_signmsedec[1 << JPC_NMSEDEC_BITS]; |
97 | | jpc_fix_t jpc_refnmsedec[1 << JPC_NMSEDEC_BITS]; |
98 | | jpc_fix_t jpc_signmsedec0[1 << JPC_NMSEDEC_BITS]; |
99 | | jpc_fix_t jpc_refnmsedec0[1 << JPC_NMSEDEC_BITS]; |
100 | | |
101 | | jpc_mqctx_t jpc_mqctxs[JPC_NUMCTXS]; |
102 | | |
103 | | /******************************************************************************\ |
104 | | * |
105 | | \******************************************************************************/ |
106 | | |
107 | | JAS_ATTRIBUTE_CONST |
108 | | static uint_least8_t jpc_getzcctxno(unsigned f, enum jpc_tsfb_orient orient); |
109 | | |
110 | | JAS_ATTRIBUTE_CONST |
111 | | static bool jpc_getspb(unsigned f); |
112 | | |
113 | | JAS_ATTRIBUTE_CONST |
114 | | static uint_least8_t jpc_getscctxno(unsigned f); |
115 | | |
116 | | JAS_ATTRIBUTE_CONST |
117 | | static uint_least8_t jpc_getmagctxno(unsigned f); |
118 | | |
119 | | /******************************************************************************\ |
120 | | * Code. |
121 | | \******************************************************************************/ |
122 | | |
123 | | enum jpc_passtype JPC_PASSTYPE(unsigned passno) |
124 | 4.36M | { |
125 | 4.36M | unsigned passtype; |
126 | 4.36M | switch (passno % 3) { |
127 | 1.65M | case 0: |
128 | 1.65M | passtype = JPC_CLNPASS; |
129 | 1.65M | break; |
130 | 1.43M | case 1: |
131 | 1.43M | passtype = JPC_SIGPASS; |
132 | 1.43M | break; |
133 | 1.27M | case 2: |
134 | 1.27M | passtype = JPC_REFPASS; |
135 | 1.27M | break; |
136 | 0 | default: |
137 | 0 | assert(0); |
138 | 0 | JAS_UNREACHABLE(); |
139 | 4.36M | } |
140 | 4.36M | return passtype; |
141 | 4.36M | } |
142 | | |
143 | | unsigned JPC_NOMINALGAIN(unsigned qmfbid, unsigned numlvls, unsigned lvlno, enum jpc_tsfb_orient orient) |
144 | 339k | { |
145 | 339k | JAS_UNUSED(numlvls); |
146 | | |
147 | 339k | if (qmfbid == JPC_COX_INS) { |
148 | 170k | return 0; |
149 | 170k | } |
150 | 339k | assert(qmfbid == JPC_COX_RFT); |
151 | 168k | if (lvlno == 0) { |
152 | 11.3k | assert(orient == JPC_TSFB_LL); |
153 | 11.3k | return 0; |
154 | 157k | } else { |
155 | 157k | switch (orient) { |
156 | 52.4k | case JPC_TSFB_LH: |
157 | 104k | case JPC_TSFB_HL: |
158 | 104k | return 1; |
159 | 52.4k | case JPC_TSFB_HH: |
160 | 52.4k | return 2; |
161 | 0 | default: |
162 | 0 | assert(false); |
163 | 0 | JAS_UNREACHABLE(); |
164 | 157k | } |
165 | 157k | } |
166 | 0 | JAS_UNREACHABLE(); |
167 | 0 | } |
168 | | |
169 | | /******************************************************************************\ |
170 | | * Coding pass related functions. |
171 | | \******************************************************************************/ |
172 | | |
173 | | enum jpc_segtype JPC_SEGTYPE(unsigned passno, unsigned firstpassno, bool bypass) |
174 | 3.40M | { |
175 | 3.40M | if (bypass) { |
176 | 367k | enum jpc_passtype passtype = JPC_PASSTYPE(passno); |
177 | 367k | if (passtype == JPC_CLNPASS) { |
178 | 196k | return JPC_SEG_MQ; |
179 | 196k | } |
180 | 170k | return ((passno < firstpassno + 10) ? JPC_SEG_MQ : JPC_SEG_RAW); |
181 | 3.03M | } else { |
182 | 3.03M | return JPC_SEG_MQ; |
183 | 3.03M | } |
184 | 3.40M | } |
185 | | |
186 | | unsigned JPC_SEGPASSCNT(unsigned passno, unsigned firstpassno, unsigned numpasses, bool bypass, bool termall) |
187 | 3.55M | { |
188 | 3.55M | unsigned ret; |
189 | | |
190 | 3.55M | if (termall) { |
191 | 175k | ret = 1; |
192 | 3.37M | } else if (bypass) { |
193 | 281k | if (passno < firstpassno + 10) { |
194 | 87.2k | ret = 10 - (passno - firstpassno); |
195 | 194k | } else { |
196 | 194k | enum jpc_passtype passtype = JPC_PASSTYPE(passno); |
197 | 194k | switch (passtype) { |
198 | 85.3k | case JPC_SIGPASS: |
199 | 85.3k | ret = 2; |
200 | 85.3k | break; |
201 | 34.7k | case JPC_REFPASS: |
202 | 34.7k | ret = 1; |
203 | 34.7k | break; |
204 | 74.4k | case JPC_CLNPASS: |
205 | 74.4k | ret = 1; |
206 | 74.4k | break; |
207 | 0 | default: |
208 | 0 | assert(0); |
209 | 0 | JAS_UNREACHABLE(); |
210 | 194k | } |
211 | 194k | } |
212 | 3.09M | } else { |
213 | 3.09M | ret = JPC_PREC * 3 - 2; |
214 | 3.09M | } |
215 | 3.55M | ret = JAS_MIN(ret, numpasses - passno); |
216 | 3.55M | return ret; |
217 | 3.55M | } |
218 | | |
219 | | bool JPC_ISTERMINATED(unsigned passno, unsigned firstpassno, unsigned numpasses, bool termall, |
220 | | bool lazy) |
221 | 2.95M | { |
222 | 2.95M | if (passno - firstpassno == numpasses - 1) { |
223 | 111k | return true; |
224 | 2.84M | } else { |
225 | 2.84M | unsigned n = JPC_SEGPASSCNT(passno, firstpassno, numpasses, lazy, termall); |
226 | 2.84M | return n <= 1; |
227 | 2.84M | } |
228 | 2.95M | } |
229 | | |
230 | | /******************************************************************************\ |
231 | | * Lookup table code. |
232 | | \******************************************************************************/ |
233 | | |
234 | | void jpc_initluts() |
235 | 9 | { |
236 | 9 | float u; |
237 | 9 | float v; |
238 | 9 | float t; |
239 | | |
240 | 45 | for (unsigned orient = 0; orient < 4; ++orient) { |
241 | 9.25k | for (unsigned i = 0; i < 256; ++i) { |
242 | 9.21k | jpc_zcctxnolut[(orient << 8) | i] = jpc_getzcctxno(i, orient); |
243 | 9.21k | } |
244 | 36 | } |
245 | | |
246 | 2.31k | for (unsigned i = 0; i < 256; ++i) { |
247 | 2.30k | jpc_spblut[i] = jpc_getspb(i << 4); |
248 | 2.30k | } |
249 | | |
250 | 2.31k | for (unsigned i = 0; i < 256; ++i) { |
251 | 2.30k | jpc_scctxnolut[i] = jpc_getscctxno(i << 4); |
252 | 2.30k | } |
253 | | |
254 | 27 | for (unsigned refine = 0; refine < 2; ++refine) { |
255 | 36.8k | for (unsigned i = 0; i < 2048; ++i) { |
256 | 36.8k | jpc_magctxnolut[(refine << 11) + i] = jpc_getmagctxno((refine ? JPC_REFINE : 0) | i); |
257 | 36.8k | } |
258 | 18 | } |
259 | | |
260 | 1.16k | for (unsigned i = 0; i < (1 << JPC_NMSEDEC_BITS); ++i) { |
261 | 1.15k | t = i * jpc_pow2i(-JPC_NMSEDEC_FRACBITS); |
262 | 1.15k | u = t; |
263 | 1.15k | v = t - 1.5f; |
264 | 1.15k | jpc_signmsedec[i] = jpc_dbltofix(floor((u * u - v * v) * |
265 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) / |
266 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS)); |
267 | | /* XXX - this calc is not correct */ |
268 | 1.15k | jpc_signmsedec0[i] = jpc_dbltofix(floor((u * u) * |
269 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) / |
270 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS)); |
271 | 1.15k | u = t - 1.0f; |
272 | 1.15k | if (i & (1 << (JPC_NMSEDEC_BITS - 1))) { |
273 | 576 | v = t - 1.5f; |
274 | 576 | } else { |
275 | 576 | v = t - 0.5f; |
276 | 576 | } |
277 | 1.15k | jpc_refnmsedec[i] = jpc_dbltofix(floor((u * u - v * v) * |
278 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) / |
279 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS)); |
280 | | /* XXX - this calc is not correct */ |
281 | 1.15k | jpc_refnmsedec0[i] = jpc_dbltofix(floor((u * u) * |
282 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS) + 0.5) / |
283 | 1.15k | jpc_pow2i(JPC_NMSEDEC_FRACBITS)); |
284 | 1.15k | } |
285 | 9 | } |
286 | | |
287 | | static uint_least8_t jpc_getzcctxno(unsigned f, enum jpc_tsfb_orient orient) |
288 | 9.21k | { |
289 | 9.21k | assert(orient < 4); |
290 | | |
291 | 9.21k | unsigned n; |
292 | 9.21k | unsigned t; |
293 | 9.21k | unsigned hv; |
294 | | |
295 | 9.21k | unsigned h = ((f & JPC_WSIG) != 0) + ((f & JPC_ESIG) != 0); |
296 | 9.21k | unsigned v = ((f & JPC_NSIG) != 0) + ((f & JPC_SSIG) != 0); |
297 | 9.21k | const unsigned d = ((f & JPC_NWSIG) != 0) + ((f & JPC_NESIG) != 0) + ((f & JPC_SESIG) != 0) + ((f & JPC_SWSIG) != 0); |
298 | 9.21k | switch (orient) { |
299 | 2.30k | case JPC_TSFB_HL: |
300 | 2.30k | t = h; |
301 | 2.30k | h = v; |
302 | 2.30k | v = t; |
303 | | /* fall through */ |
304 | 4.60k | case JPC_TSFB_LL: |
305 | 6.91k | case JPC_TSFB_LH: |
306 | 6.91k | if (!h) { |
307 | 1.72k | if (!v) { |
308 | 432 | if (!d) { |
309 | 27 | n = 0; |
310 | 405 | } else if (d == 1) { |
311 | 108 | n = 1; |
312 | 297 | } else { |
313 | 297 | n = 2; |
314 | 297 | } |
315 | 1.29k | } else if (v == 1) { |
316 | 864 | n = 3; |
317 | 864 | } else { |
318 | 432 | n = 4; |
319 | 432 | } |
320 | 5.18k | } else if (h == 1) { |
321 | 3.45k | if (!v) { |
322 | 864 | if (!d) { |
323 | 54 | n = 5; |
324 | 810 | } else { |
325 | 810 | n = 6; |
326 | 810 | } |
327 | 2.59k | } else { |
328 | 2.59k | n = 7; |
329 | 2.59k | } |
330 | 3.45k | } else { |
331 | 1.72k | n = 8; |
332 | 1.72k | } |
333 | 6.91k | break; |
334 | 2.30k | case JPC_TSFB_HH: |
335 | 2.30k | hv = h + v; |
336 | 2.30k | if (!d) { |
337 | 144 | if (!hv) { |
338 | 9 | n = 0; |
339 | 135 | } else if (hv == 1) { |
340 | 36 | n = 1; |
341 | 99 | } else { |
342 | 99 | n = 2; |
343 | 99 | } |
344 | 2.16k | } else if (d == 1) { |
345 | 576 | if (!hv) { |
346 | 36 | n = 3; |
347 | 540 | } else if (hv == 1) { |
348 | 144 | n = 4; |
349 | 396 | } else { |
350 | 396 | n = 5; |
351 | 396 | } |
352 | 1.58k | } else if (d == 2) { |
353 | 864 | if (!hv) { |
354 | 54 | n = 6; |
355 | 810 | } else { |
356 | 810 | n = 7; |
357 | 810 | } |
358 | 864 | } else { |
359 | 720 | n = 8; |
360 | 720 | } |
361 | 2.30k | break; |
362 | | |
363 | 0 | default: |
364 | 0 | assert(false); |
365 | 0 | JAS_UNREACHABLE(); |
366 | 9.21k | } |
367 | 9.21k | assert(n < JPC_NUMZCCTXS); |
368 | 9.21k | return JPC_ZCCTXNO + n; |
369 | 9.21k | } |
370 | | |
371 | | static bool jpc_getspb(unsigned f) |
372 | 2.30k | { |
373 | 2.30k | int hc; |
374 | 2.30k | int vc; |
375 | 2.30k | bool n; |
376 | | |
377 | 2.30k | hc = JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == JPC_ESIG) + ((f & (JPC_WSIG | JPC_WSGN)) == JPC_WSIG), 1) - |
378 | 2.30k | JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == (JPC_ESIG | JPC_ESGN)) + ((f & (JPC_WSIG | JPC_WSGN)) == (JPC_WSIG | JPC_WSGN)), 1); |
379 | 2.30k | vc = JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == JPC_NSIG) + ((f & (JPC_SSIG | JPC_SSGN)) == JPC_SSIG), 1) - |
380 | 2.30k | JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == (JPC_NSIG | JPC_NSGN)) + ((f & (JPC_SSIG | JPC_SSGN)) == (JPC_SSIG | JPC_SSGN)), 1); |
381 | 2.30k | if (!hc && !vc) { |
382 | 324 | n = 0; |
383 | 1.98k | } else { |
384 | 1.98k | n = (!(hc > 0 || (!hc && vc > 0))); |
385 | 1.98k | } |
386 | 2.30k | return n; |
387 | 2.30k | } |
388 | | |
389 | | static uint_least8_t jpc_getscctxno(unsigned f) |
390 | 2.30k | { |
391 | 2.30k | int hc; |
392 | 2.30k | int vc; |
393 | | |
394 | 2.30k | hc = JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == JPC_ESIG) + ((f & (JPC_WSIG | JPC_WSGN)) == JPC_WSIG), |
395 | 2.30k | 1) - JAS_MIN(((f & (JPC_ESIG | JPC_ESGN)) == (JPC_ESIG | JPC_ESGN)) + |
396 | 2.30k | ((f & (JPC_WSIG | JPC_WSGN)) == (JPC_WSIG | JPC_WSGN)), 1); |
397 | 2.30k | vc = JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == JPC_NSIG) + ((f & (JPC_SSIG | JPC_SSGN)) == JPC_SSIG), |
398 | 2.30k | 1) - JAS_MIN(((f & (JPC_NSIG | JPC_NSGN)) == (JPC_NSIG | JPC_NSGN)) + |
399 | 2.30k | ((f & (JPC_SSIG | JPC_SSGN)) == (JPC_SSIG | JPC_SSGN)), 1); |
400 | 2.30k | assert(hc >= -1 && hc <= 1 && vc >= -1 && vc <= 1); |
401 | 2.30k | if (hc < 0) { |
402 | 720 | hc = -hc; |
403 | 720 | vc = -vc; |
404 | 720 | } |
405 | | |
406 | 2.30k | unsigned n; |
407 | 2.30k | if (!hc) { |
408 | 864 | if (vc == -1) { |
409 | 270 | n = 1; |
410 | 594 | } else if (!vc) { |
411 | 324 | n = 0; |
412 | 324 | } else { |
413 | 270 | n = 1; |
414 | 270 | } |
415 | 1.44k | } else { |
416 | 1.44k | assert(hc == 1); |
417 | | |
418 | 1.44k | if (vc == -1) { |
419 | 450 | n = 2; |
420 | 990 | } else if (!vc) { |
421 | 540 | n = 3; |
422 | 540 | } else { |
423 | 450 | n = 4; |
424 | 450 | } |
425 | 1.44k | } |
426 | 2.30k | assert(n < JPC_NUMSCCTXS); |
427 | 2.30k | return JPC_SCCTXNO + n; |
428 | 2.30k | } |
429 | | |
430 | | static uint_least8_t jpc_getmagctxno(unsigned f) |
431 | 36.8k | { |
432 | 36.8k | unsigned n; |
433 | | |
434 | 36.8k | if (!(f & JPC_REFINE)) { |
435 | 18.4k | n = (f & (JPC_OTHSIGMSK)) ? 1 : 0; |
436 | 18.4k | } else { |
437 | 18.4k | n = 2; |
438 | 18.4k | } |
439 | | |
440 | 36.8k | assert(n < JPC_NUMMAGCTXS); |
441 | 36.8k | return JPC_MAGCTXNO + n; |
442 | 36.8k | } |
443 | | |
444 | | static void jpc_initctxs(jpc_mqctx_t *ctxs) |
445 | 9 | { |
446 | 9 | jpc_mqctx_t *ctx; |
447 | | |
448 | 9 | ctx = ctxs; |
449 | 180 | for (unsigned i = 0; i < JPC_NUMCTXS; ++i) { |
450 | 171 | ctx->mps = 0; |
451 | 171 | switch (i) { |
452 | 9 | case JPC_UCTXNO: |
453 | 9 | ctx->ind = 46; |
454 | 9 | break; |
455 | 9 | case JPC_ZCCTXNO: |
456 | 9 | ctx->ind = 4; |
457 | 9 | break; |
458 | 9 | case JPC_AGGCTXNO: |
459 | 9 | ctx->ind = 3; |
460 | 9 | break; |
461 | 144 | default: |
462 | 144 | ctx->ind = 0; |
463 | 144 | break; |
464 | 171 | } |
465 | 171 | ++ctx; |
466 | 171 | } |
467 | 9 | } |
468 | | |
469 | | void jpc_initmqctxs() |
470 | 9 | { |
471 | 9 | jpc_initctxs(jpc_mqctxs); |
472 | 9 | } |
473 | | |
474 | | /* Calculate the real quantity exp2(n), where x is an integer. */ |
475 | | static double jpc_pow2i(int n) |
476 | 2.30k | { |
477 | 2.30k | double x; |
478 | 2.30k | double a; |
479 | | |
480 | 2.30k | x = 1.0; |
481 | 2.30k | if (n < 0) { |
482 | 1.15k | a = 0.5; |
483 | 1.15k | n = -n; |
484 | 1.15k | } else { |
485 | 1.15k | a = 2.0; |
486 | 1.15k | } |
487 | 16.1k | while (--n >= 0) { |
488 | 13.8k | x *= a; |
489 | 13.8k | } |
490 | 2.30k | return x; |
491 | 2.30k | } |