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