jpc_mqdec.h (8800B)
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) 1999-2000 Image Power, Inc. 13 * Copyright (c) 1999-2000 The University of British Columbia 14 * Copyright (c) 2001-2003 Michael David Adams 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: jpc_mqdec.h 1918 2005-07-24 14:12:08Z baford $ 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 /******************************************************************************\ 83 * Types. 84 \******************************************************************************/ 85 86 /* MQ arithmetic decoder. */ 87 88 typedef struct { 89 90 /* The C register. */ 91 uint_fast32_t creg; 92 93 /* The A register. */ 94 uint_fast32_t areg; 95 96 /* The CT register. */ 97 uint_fast32_t ctreg; 98 99 /* The current context. */ 100 jpc_mqstate_t **curctx; 101 102 /* The per-context information. */ 103 jpc_mqstate_t **ctxs; 104 105 /* The maximum number of contexts. */ 106 int maxctxs; 107 108 /* The stream from which to read data. */ 109 jas_stream_t *in; 110 111 /* The last character read. */ 112 uchar inbuffer; 113 114 /* The EOF indicator. */ 115 int eof; 116 117 } jpc_mqdec_t; 118 119 /******************************************************************************\ 120 * Functions/macros for construction and destruction. 121 \******************************************************************************/ 122 123 /* Create a MQ decoder. */ 124 jpc_mqdec_t *jpc_mqdec_create(int maxctxs, jas_stream_t *in); 125 126 /* Destroy a MQ decoder. */ 127 void jpc_mqdec_destroy(jpc_mqdec_t *dec); 128 129 /******************************************************************************\ 130 * Functions/macros for initialization. 131 \******************************************************************************/ 132 133 /* Set the input stream associated with a MQ decoder. */ 134 void jpc_mqdec_setinput(jpc_mqdec_t *dec, jas_stream_t *in); 135 136 /* Initialize a MQ decoder. */ 137 void jpc_mqdec_init(jpc_mqdec_t *dec); 138 139 /******************************************************************************\ 140 * Functions/macros for manipulating contexts. 141 \******************************************************************************/ 142 143 /* Set the current context for a MQ decoder. */ 144 #define jpc_mqdec_setcurctx(dec, ctxno) \ 145 ((mqdec)->curctx = &(mqdec)->ctxs[ctxno]); 146 147 /* Set the state information for a particular context of a MQ decoder. */ 148 void jpc_mqdec_setctx(jpc_mqdec_t *dec, int ctxno, jpc_mqctx_t *ctx); 149 150 /* Set the state information for all contexts of a MQ decoder. */ 151 void jpc_mqdec_setctxs(jpc_mqdec_t *dec, int numctxs, jpc_mqctx_t *ctxs); 152 153 /******************************************************************************\ 154 * Functions/macros for decoding bits. 155 \******************************************************************************/ 156 157 /* Decode a symbol. */ 158 #if !defined(DEBUG) 159 #define jpc_mqdec_getbit(dec) \ 160 jpc_mqdec_getbit_macro(dec) 161 #else 162 #define jpc_mqdec_getbit(dec) \ 163 jpc_mqdec_getbit_func(dec) 164 #endif 165 166 /* Decode a symbol (assuming an unskewed probability distribution). */ 167 #if !defined(DEBUG) 168 #define jpc_mqdec_getbitnoskew(dec) \ 169 jpc_mqdec_getbit_macro(dec) 170 #else 171 #define jpc_mqdec_getbitnoskew(dec) \ 172 jpc_mqdec_getbit_func(dec) 173 #endif 174 175 /******************************************************************************\ 176 * Functions/macros for debugging. 177 \******************************************************************************/ 178 179 /* Dump the MQ decoder state for debugging. */ 180 void jpc_mqdec_dump(jpc_mqdec_t *dec, FILE *out); 181 182 /******************************************************************************\ 183 * EVERYTHING BELOW THIS POINT IS IMPLEMENTATION SPECIFIC AND NOT PART OF THE 184 * APPLICATION INTERFACE. DO NOT RELY ON ANY OF THE INTERNAL FUNCTIONS/MACROS 185 * GIVEN BELOW. 186 \******************************************************************************/ 187 188 #define jpc_mqdec_getbit_macro(dec) \ 189 ((((dec)->areg -= (*(dec)->curctx)->qeval), \ 190 (dec)->creg >> 16 >= (*(dec)->curctx)->qeval) ? \ 191 ((((dec)->creg -= (*(dec)->curctx)->qeval << 16), \ 192 (dec)->areg & 0x8000) ? (*(dec)->curctx)->mps : \ 193 jpc_mqdec_mpsexchrenormd(dec)) : \ 194 jpc_mqdec_lpsexchrenormd(dec)) 195 196 #define jpc_mqdec_mpsexchange(areg, delta, curctx, bit) \ 197 { \ 198 if ((areg) < (delta)) { \ 199 register jpc_mqstate_t *state = *(curctx); \ 200 /* LPS decoded. */ \ 201 (bit) = state->mps ^ 1; \ 202 *(curctx) = state->nlps; \ 203 } else { \ 204 register jpc_mqstate_t *state = *(curctx); \ 205 /* MPS decoded. */ \ 206 (bit) = state->mps; \ 207 *(curctx) = state->nmps; \ 208 } \ 209 } 210 211 #define jpc_mqdec_lpsexchange(areg, delta, curctx, bit) \ 212 { \ 213 if ((areg) >= (delta)) { \ 214 register jpc_mqstate_t *state = *(curctx); \ 215 (areg) = (delta); \ 216 (bit) = state->mps ^ 1; \ 217 *(curctx) = state->nlps; \ 218 } else { \ 219 register jpc_mqstate_t *state = *(curctx); \ 220 (areg) = (delta); \ 221 (bit) = state->mps; \ 222 *(curctx) = state->nmps; \ 223 } \ 224 } 225 226 #define jpc_mqdec_renormd(areg, creg, ctreg, in, eof, inbuf) \ 227 { \ 228 do { \ 229 if (!(ctreg)) { \ 230 jpc_mqdec_bytein2(creg, ctreg, in, eof, inbuf); \ 231 } \ 232 (areg) <<= 1; \ 233 (creg) <<= 1; \ 234 --(ctreg); \ 235 } while (!((areg) & 0x8000)); \ 236 } 237 238 #define jpc_mqdec_bytein2(creg, ctreg, in, eof, inbuf) \ 239 { \ 240 int c; \ 241 unsigned char prevbuf; \ 242 if (!(eof)) { \ 243 if ((c = jas_stream_getc(in)) == EOF) { \ 244 (eof) = 1; \ 245 c = 0xff; \ 246 } \ 247 prevbuf = (inbuf); \ 248 (inbuf) = c; \ 249 if (prevbuf == 0xff) { \ 250 if (c > 0x8f) { \ 251 (creg) += 0xff00; \ 252 (ctreg) = 8; \ 253 } else { \ 254 (creg) += c << 9; \ 255 (ctreg) = 7; \ 256 } \ 257 } else { \ 258 (creg) += c << 8; \ 259 (ctreg) = 8; \ 260 } \ 261 } else { \ 262 (creg) += 0xff00; \ 263 (ctreg) = 8; \ 264 } \ 265 } 266 267 int jpc_mqdec_getbit_func(jpc_mqdec_t *dec); 268 int jpc_mqdec_mpsexchrenormd(jpc_mqdec_t *dec); 269 int jpc_mqdec_lpsexchrenormd(jpc_mqdec_t *dec); 270 271 #endif