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@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 __MQC_H 40 #define __MQC_H 41 /** 42 @file mqc.h 43 @brief Implementation of an MQ-Coder (MQC) 44 45 The functions in MQC.C have for goal to realize the MQ-coder operations. The functions 46 in MQC.C are used by some function in T1.C. 47 */ 48 49 /** @defgroup MQC MQC - Implementation of an MQ-Coder */ 50 /*@{*/ 51 52 /** 53 This struct defines the state of a context. 54 */ 55 typedef struct opj_mqc_state { 56 /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ 57 OPJ_UINT32 qeval; 58 /** the Most Probable Symbol (0 or 1) */ 59 OPJ_UINT32 mps; 60 /** next state if the next encoded symbol is the MPS */ 61 struct opj_mqc_state *nmps; 62 /** next state if the next encoded symbol is the LPS */ 63 struct opj_mqc_state *nlps; 64 } opj_mqc_state_t; 65 66 #define MQC_NUMCTXS 19 67 68 /** 69 MQ coder 70 */ 71 typedef struct opj_mqc { 72 OPJ_UINT32 c; 73 OPJ_UINT32 a; 74 OPJ_UINT32 ct; 75 OPJ_BYTE *bp; 76 OPJ_BYTE *start; 77 OPJ_BYTE *end; 78 opj_mqc_state_t *ctxs[MQC_NUMCTXS]; 79 opj_mqc_state_t **curctx; 80 #ifdef MQC_PERF_OPT 81 unsigned char *buffer; 82 #endif 83 } opj_mqc_t; 84 85 /** @name Exported functions */ 86 /*@{*/ 87 /* ----------------------------------------------------------------------- */ 88 /** 89 Create a new MQC handle 90 @return Returns a new MQC handle if successful, returns NULL otherwise 91 */ 92 opj_mqc_t* opj_mqc_create(void); 93 /** 94 Destroy a previously created MQC handle 95 @param mqc MQC handle to destroy 96 */ 97 void opj_mqc_destroy(opj_mqc_t *mqc); 98 /** 99 Return the number of bytes written/read since initialisation 100 @param mqc MQC handle 101 @return Returns the number of bytes already encoded 102 */ 103 OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc); 104 /** 105 Reset the states of all the context of the coder/decoder 106 (each context is set to a state where 0 and 1 are more or less equiprobable) 107 @param mqc MQC handle 108 */ 109 void opj_mqc_resetstates(opj_mqc_t *mqc); 110 /** 111 Set the state of a particular context 112 @param mqc MQC handle 113 @param ctxno Number that identifies the context 114 @param msb The MSB of the new state of the context 115 @param prob Number that identifies the probability of the symbols for the new state of the context 116 */ 117 void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob); 118 /** 119 Initialize the encoder 120 @param mqc MQC handle 121 @param bp Pointer to the start of the buffer where the bytes will be written 122 */ 123 void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp); 124 /** 125 Set the current context used for coding/decoding 126 @param mqc MQC handle 127 @param ctxno Number that identifies the context 128 */ 129 #define opj_mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)] 130 /** 131 Encode a symbol using the MQ-coder 132 @param mqc MQC handle 133 @param d The symbol to be encoded (0 or 1) 134 */ 135 void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d); 136 /** 137 Flush the encoder, so that all remaining data is written 138 @param mqc MQC handle 139 */ 140 void opj_mqc_flush(opj_mqc_t *mqc); 141 /** 142 BYPASS mode switch, initialization operation. 143 JPEG 2000 p 505. 144 <h2>Not fully implemented and tested !!</h2> 145 @param mqc MQC handle 146 */ 147 void opj_mqc_bypass_init_enc(opj_mqc_t *mqc); 148 /** 149 BYPASS mode switch, coding operation. 150 JPEG 2000 p 505. 151 <h2>Not fully implemented and tested !!</h2> 152 @param mqc MQC handle 153 @param d The symbol to be encoded (0 or 1) 154 */ 155 void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d); 156 /** 157 BYPASS mode switch, flush operation 158 <h2>Not fully implemented and tested !!</h2> 159 @param mqc MQC handle 160 @return Returns 1 (always) 161 */ 162 OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc); 163 /** 164 RESET mode switch 165 @param mqc MQC handle 166 */ 167 void opj_mqc_reset_enc(opj_mqc_t *mqc); 168 /** 169 RESTART mode switch (TERMALL) 170 @param mqc MQC handle 171 @return Returns 1 (always) 172 */ 173 OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc); 174 /** 175 RESTART mode switch (TERMALL) reinitialisation 176 @param mqc MQC handle 177 */ 178 void opj_mqc_restart_init_enc(opj_mqc_t *mqc); 179 /** 180 ERTERM mode switch (PTERM) 181 @param mqc MQC handle 182 */ 183 void opj_mqc_erterm_enc(opj_mqc_t *mqc); 184 /** 185 SEGMARK mode switch (SEGSYM) 186 @param mqc MQC handle 187 */ 188 void opj_mqc_segmark_enc(opj_mqc_t *mqc); 189 /** 190 Initialize the decoder 191 @param mqc MQC handle 192 @param bp Pointer to the start of the buffer from which the bytes will be read 193 @param len Length of the input buffer 194 */ 195 OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len); 196 /** 197 Decode a symbol 198 @param mqc MQC handle 199 @return Returns the decoded symbol (0 or 1) 200 */ 201 OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc); 202 /* ----------------------------------------------------------------------- */ 203 /*@}*/ 204 205 /*@}*/ 206 207 #endif /* __MQC_H */ 208