1 /* 2 * Copyright (c) 2002-2007, Communications and Remote Sensing Laboratory, Universite catholique de Louvain (UCL), Belgium 3 * Copyright (c) 2002-2007, Professor Benoit Macq 4 * Copyright (c) 2001-2003, David Janssens 5 * Copyright (c) 2002-2003, Yannick Verschueren 6 * Copyright (c) 2003-2007, Francois-Olivier Devaux and Antonin Descampe 7 * Copyright (c) 2005, Herve Drolon, FreeImage Team 8 * Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr> 9 * All rights reserved. 10 * 11 * Redistribution and use in source and binary forms, with or without 12 * modification, are permitted provided that the following conditions 13 * are met: 14 * 1. Redistributions of source code must retain the above copyright 15 * notice, this list of conditions and the following disclaimer. 16 * 2. Redistributions in binary form must reproduce the above copyright 17 * notice, this list of conditions and the following disclaimer in the 18 * documentation and/or other materials provided with the distribution. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 #ifndef __MQC_H 34 #define __MQC_H 35 /** 36 @file mqc.h 37 @brief Implementation of an MQ-Coder (MQC) 38 39 The functions in MQC.C have for goal to realize the MQ-coder operations. The functions 40 in MQC.C are used by some function in T1.C. 41 */ 42 #include "openjpeg.h" 43 /** @defgroup MQC MQC - Implementation of an MQ-Coder */ 44 /*@{*/ 45 46 /** 47 This struct defines the state of a context. 48 */ 49 typedef struct opj_mqc_state { 50 /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ 51 OPJ_UINT32 qeval; 52 /** the Most Probable Symbol (0 or 1) */ 53 OPJ_UINT32 mps; 54 /** next state if the next encoded symbol is the MPS */ 55 struct opj_mqc_state *nmps; 56 /** next state if the next encoded symbol is the LPS */ 57 struct opj_mqc_state *nlps; 58 } opj_mqc_state_t; 59 60 #define MQC_NUMCTXS 32 61 62 /** 63 MQ coder 64 */ 65 typedef struct opj_mqc { 66 OPJ_UINT32 c; 67 OPJ_UINT32 a; 68 OPJ_UINT32 ct; 69 OPJ_BYTE *bp; 70 OPJ_BYTE *start; 71 OPJ_BYTE *end; 72 opj_mqc_state_t *ctxs[MQC_NUMCTXS]; 73 opj_mqc_state_t **curctx; 74 } opj_mqc_t; 75 76 /** @name Exported functions */ 77 /*@{*/ 78 /* ----------------------------------------------------------------------- */ 79 /** 80 Create a new MQC handle 81 @return Returns a new MQC handle if successful, returns NULL otherwise 82 */ 83 opj_mqc_t* mqc_create(void); 84 /** 85 Destroy a previously created MQC handle 86 @param mqc MQC handle to destroy 87 */ 88 void mqc_destroy(opj_mqc_t *mqc); 89 /** 90 Return the number of bytes written/read since initialisation 91 @param mqc MQC handle 92 @return Returns the number of bytes already encoded 93 */ 94 OPJ_UINT32 mqc_numbytes(opj_mqc_t *mqc); 95 /** 96 Reset the states of all the context of the coder/decoder 97 (each context is set to a state where 0 and 1 are more or less equiprobable) 98 @param mqc MQC handle 99 */ 100 void mqc_resetstates(opj_mqc_t *mqc); 101 /** 102 Set the state of a particular context 103 @param mqc MQC handle 104 @param ctxno Number that identifies the context 105 @param msb The MSB of the new state of the context 106 @param prob Number that identifies the probability of the symbols for the new state of the context 107 */ 108 void mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob); 109 /** 110 Initialize the encoder 111 @param mqc MQC handle 112 @param bp Pointer to the start of the buffer where the bytes will be written 113 */ 114 void mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp); 115 /** 116 Set the current context used for coding/decoding 117 @param mqc MQC handle 118 @param ctxno Number that identifies the context 119 */ 120 #define mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)] 121 /** 122 Encode a symbol using the MQ-coder 123 @param mqc MQC handle 124 @param d The symbol to be encoded (0 or 1) 125 */ 126 void mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d); 127 /** 128 Flush the encoder, so that all remaining data is written 129 @param mqc MQC handle 130 */ 131 void mqc_flush(opj_mqc_t *mqc); 132 /** 133 BYPASS mode switch, initialization operation. 134 JPEG 2000 p 505. 135 <h2>Not fully implemented and tested !!</h2> 136 @param mqc MQC handle 137 */ 138 void mqc_bypass_init_enc(opj_mqc_t *mqc); 139 /** 140 BYPASS mode switch, coding operation. 141 JPEG 2000 p 505. 142 <h2>Not fully implemented and tested !!</h2> 143 @param mqc MQC handle 144 @param d The symbol to be encoded (0 or 1) 145 */ 146 void mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d); 147 /** 148 BYPASS mode switch, flush operation 149 <h2>Not fully implemented and tested !!</h2> 150 @param mqc MQC handle 151 @return Returns 1 (always) 152 */ 153 OPJ_UINT32 mqc_bypass_flush_enc(opj_mqc_t *mqc); 154 /** 155 RESET mode switch 156 @param mqc MQC handle 157 */ 158 void mqc_reset_enc(opj_mqc_t *mqc); 159 /** 160 RESTART mode switch (TERMALL) 161 @param mqc MQC handle 162 @return Returns 1 (always) 163 */ 164 OPJ_UINT32 mqc_restart_enc(opj_mqc_t *mqc); 165 /** 166 RESTART mode switch (TERMALL) reinitialisation 167 @param mqc MQC handle 168 */ 169 void mqc_restart_init_enc(opj_mqc_t *mqc); 170 /** 171 ERTERM mode switch (PTERM) 172 @param mqc MQC handle 173 */ 174 void mqc_erterm_enc(opj_mqc_t *mqc); 175 /** 176 SEGMARK mode switch (SEGSYM) 177 @param mqc MQC handle 178 */ 179 void mqc_segmark_enc(opj_mqc_t *mqc); 180 /** 181 Initialize the decoder 182 @param mqc MQC handle 183 @param bp Pointer to the start of the buffer from which the bytes will be read 184 @param len Length of the input buffer 185 */ 186 void mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len); 187 /** 188 Decode a symbol 189 @param mqc MQC handle 190 @return Returns the decoded symbol (0 or 1) 191 */ 192 OPJ_UINT32 mqc_decode(opj_mqc_t *mqc); 193 /* ----------------------------------------------------------------------- */ 194 /*@}*/ 195 196 /*@}*/ 197 198 #endif /* __MQC_H */ 199