Home | History | Annotate | Download | only in libjasper
      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: jpc_mqdec.h,v 1.2 2008-05-26 09:40:52 vp153 Exp $
     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
    272