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