Home | History | Annotate | Download | only in libopenjpeg20
      1 /*
      2  * The copyright in this software is being made available under the 2-clauses
      3  * BSD License, included below. This software may be subject to other third
      4  * party and contributor rights, including patent rights, and no such rights
      5  * are granted under this license.
      6  *
      7  * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
      8  * Copyright (c) 2002-2014, Professor Benoit Macq
      9  * Copyright (c) 2001-2003, David Janssens
     10  * Copyright (c) 2002-2003, Yannick Verschueren
     11  * Copyright (c) 2003-2007, Francois-Olivier Devaux
     12  * Copyright (c) 2003-2014, Antonin Descampe
     13  * Copyright (c) 2005, Herve Drolon, FreeImage Team
     14  * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes (at) c-s.fr>
     15  * All rights reserved.
     16  *
     17  * Redistribution and use in source and binary forms, with or without
     18  * modification, are permitted provided that the following conditions
     19  * are met:
     20  * 1. Redistributions of source code must retain the above copyright
     21  *    notice, this list of conditions and the following disclaimer.
     22  * 2. Redistributions in binary form must reproduce the above copyright
     23  *    notice, this list of conditions and the following disclaimer in the
     24  *    documentation and/or other materials provided with the distribution.
     25  *
     26  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
     27  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
     30  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
     31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
     34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
     35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     36  * POSSIBILITY OF SUCH DAMAGE.
     37  */
     38 
     39 #ifndef OPJ_MQC_H
     40 #define OPJ_MQC_H
     41 
     42 #include "opj_common.h"
     43 
     44 /**
     45 @file mqc.h
     46 @brief Implementation of an MQ-Coder (MQC)
     47 
     48 The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
     49 in MQC.C are used by some function in T1.C.
     50 */
     51 
     52 /** @defgroup MQC MQC - Implementation of an MQ-Coder */
     53 /*@{*/
     54 
     55 /**
     56 This struct defines the state of a context.
     57 */
     58 typedef struct opj_mqc_state {
     59     /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
     60     OPJ_UINT32 qeval;
     61     /** the Most Probable Symbol (0 or 1) */
     62     OPJ_UINT32 mps;
     63     /** next state if the next encoded symbol is the MPS */
     64     const struct opj_mqc_state *nmps;
     65     /** next state if the next encoded symbol is the LPS */
     66     const struct opj_mqc_state *nlps;
     67 } opj_mqc_state_t;
     68 
     69 #define MQC_NUMCTXS 19
     70 
     71 /**
     72 MQ coder
     73 */
     74 typedef struct opj_mqc {
     75     /** temporary buffer where bits are coded or decoded */
     76     OPJ_UINT32 c;
     77     /** only used by MQ decoder */
     78     OPJ_UINT32 a;
     79     /** number of bits already read or free to write */
     80     OPJ_UINT32 ct;
     81     /* only used by decoder, to count the number of times a terminating 0xFF >0x8F marker is read */
     82     OPJ_UINT32 end_of_byte_stream_counter;
     83     /** pointer to the current position in the buffer */
     84     OPJ_BYTE *bp;
     85     /** pointer to the start of the buffer */
     86     OPJ_BYTE *start;
     87     /** pointer to the end of the buffer */
     88     OPJ_BYTE *end;
     89     /** Array of contexts */
     90     const opj_mqc_state_t *ctxs[MQC_NUMCTXS];
     91     /** Active context */
     92     const opj_mqc_state_t **curctx;
     93     /* lut_ctxno_zc shifted by (1 << 9) * bandno */
     94     const OPJ_BYTE* lut_ctxno_zc_orient;
     95     /** Original value of the 2 bytes at end[0] and end[1] */
     96     OPJ_BYTE backup[OPJ_COMMON_CBLK_DATA_EXTRA];
     97 } opj_mqc_t;
     98 
     99 #include "mqc_inl.h"
    100 
    101 /** @name Exported functions */
    102 /*@{*/
    103 /* ----------------------------------------------------------------------- */
    104 
    105 /**
    106 Return the number of bytes written/read since initialisation
    107 @param mqc MQC handle
    108 @return Returns the number of bytes already encoded
    109 */
    110 OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
    111 /**
    112 Reset the states of all the context of the coder/decoder
    113 (each context is set to a state where 0 and 1 are more or less equiprobable)
    114 @param mqc MQC handle
    115 */
    116 void opj_mqc_resetstates(opj_mqc_t *mqc);
    117 /**
    118 Set the state of a particular context
    119 @param mqc MQC handle
    120 @param ctxno Number that identifies the context
    121 @param msb The MSB of the new state of the context
    122 @param prob Number that identifies the probability of the symbols for the new state of the context
    123 */
    124 void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb,
    125                       OPJ_INT32 prob);
    126 /**
    127 Initialize the encoder
    128 @param mqc MQC handle
    129 @param bp Pointer to the start of the buffer where the bytes will be written
    130 */
    131 void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp);
    132 /**
    133 Set the current context used for coding/decoding
    134 @param mqc MQC handle
    135 @param ctxno Number that identifies the context
    136 */
    137 #define opj_mqc_setcurctx(mqc, ctxno)   (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
    138 /**
    139 Encode a symbol using the MQ-coder
    140 @param mqc MQC handle
    141 @param d The symbol to be encoded (0 or 1)
    142 */
    143 void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d);
    144 /**
    145 Flush the encoder, so that all remaining data is written
    146 @param mqc MQC handle
    147 */
    148 void opj_mqc_flush(opj_mqc_t *mqc);
    149 /**
    150 BYPASS mode switch, initialization operation.
    151 JPEG 2000 p 505.
    152 @param mqc MQC handle
    153 */
    154 void opj_mqc_bypass_init_enc(opj_mqc_t *mqc);
    155 
    156 /** Return number of extra bytes to add to opj_mqc_numbytes() for the
    157     size of a non-terminating BYPASS pass
    158 @param mqc MQC handle
    159 @param erterm 1 if ERTERM is enabled, 0 otherwise
    160 */
    161 OPJ_UINT32 opj_mqc_bypass_get_extra_bytes(opj_mqc_t *mqc, OPJ_BOOL erterm);
    162 
    163 /**
    164 BYPASS mode switch, coding operation.
    165 JPEG 2000 p 505.
    166 @param mqc MQC handle
    167 @param d The symbol to be encoded (0 or 1)
    168 */
    169 void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
    170 /**
    171 BYPASS mode switch, flush operation
    172 @param mqc MQC handle
    173 @param erterm 1 if ERTERM is enabled, 0 otherwise
    174 */
    175 void opj_mqc_bypass_flush_enc(opj_mqc_t *mqc, OPJ_BOOL erterm);
    176 /**
    177 RESET mode switch
    178 @param mqc MQC handle
    179 */
    180 void opj_mqc_reset_enc(opj_mqc_t *mqc);
    181 
    182 #ifdef notdef
    183 /**
    184 RESTART mode switch (TERMALL)
    185 @param mqc MQC handle
    186 @return Returns 1 (always)
    187 */
    188 OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
    189 #endif
    190 
    191 /**
    192 RESTART mode switch (TERMALL) reinitialisation
    193 @param mqc MQC handle
    194 */
    195 void opj_mqc_restart_init_enc(opj_mqc_t *mqc);
    196 /**
    197 ERTERM mode switch (PTERM)
    198 @param mqc MQC handle
    199 */
    200 void opj_mqc_erterm_enc(opj_mqc_t *mqc);
    201 /**
    202 SEGMARK mode switch (SEGSYM)
    203 @param mqc MQC handle
    204 */
    205 void opj_mqc_segmark_enc(opj_mqc_t *mqc);
    206 
    207 /**
    208 Initialize the decoder for MQ decoding.
    209 
    210 opj_mqc_finish_dec() must be absolutely called after finishing the decoding
    211 passes, so as to restore the bytes temporarily overwritten.
    212 
    213 @param mqc MQC handle
    214 @param bp Pointer to the start of the buffer from which the bytes will be read
    215           Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
    216           will be temporarily overwritten with an artificial 0xFF 0xFF marker.
    217           (they will be backuped in the mqc structure to be restored later)
    218           So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
    219           writable.
    220 @param len Length of the input buffer
    221 @param extra_writable_bytes Indicate how many bytes after len are writable.
    222                             This is to indicate your consent that bp must be
    223                             large enough.
    224 */
    225 void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
    226                       OPJ_UINT32 extra_writable_bytes);
    227 
    228 /**
    229 Initialize the decoder for RAW decoding.
    230 
    231 opj_mqc_finish_dec() must be absolutely called after finishing the decoding
    232 passes, so as to restore the bytes temporarily overwritten.
    233 
    234 @param mqc MQC handle
    235 @param bp Pointer to the start of the buffer from which the bytes will be read
    236           Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
    237           will be temporarily overwritten with an artificial 0xFF 0xFF marker.
    238           (they will be backuped in the mqc structure to be restored later)
    239           So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
    240           writable.
    241 @param len Length of the input buffer
    242 @param extra_writable_bytes Indicate how many bytes after len are writable.
    243                             This is to indicate your consent that bp must be
    244                             large enough.
    245 */
    246 void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
    247                           OPJ_UINT32 extra_writable_bytes);
    248 
    249 
    250 /**
    251 Terminate RAW/MQC decoding
    252 
    253 This restores the bytes temporarily overwritten by opj_mqc_init_dec()/
    254 opj_mqc_raw_init_dec()
    255 
    256 @param mqc MQC handle
    257 */
    258 void opq_mqc_finish_dec(opj_mqc_t *mqc);
    259 
    260 /**
    261 Decode a symbol
    262 @param mqc MQC handle
    263 @return Returns the decoded symbol (0 or 1)
    264 */
    265 /*static INLINE OPJ_UINT32 opj_mqc_decode(opj_mqc_t * const mqc);*/
    266 /* ----------------------------------------------------------------------- */
    267 /*@}*/
    268 
    269 /*@}*/
    270 
    271 #endif /* OPJ_MQC_H */
    272