vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

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