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 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
48The functions in MQC.C have for goal to realize the MQ-coder operations. The functions
49in MQC.C are used by some function in T1.C.
50*/
51
52/** @defgroup MQC MQC - Implementation of an MQ-Coder */
53/*@{*/
54
55/**
56This struct defines the state of a context.
57*/
58typedef 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/**
72MQ coder
73*/
74typedef 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/**
106Return the number of bytes written/read since initialisation
107@param mqc MQC handle
108@return Returns the number of bytes already encoded
109*/
110OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
111/**
112Reset 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*/
116void opj_mqc_resetstates(opj_mqc_t *mqc);
117/**
118Set 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*/
124void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb,
125 OPJ_INT32 prob);
126/**
127Initialize the encoder
128@param mqc MQC handle
129@param bp Pointer to the start of the buffer where the bytes will be written
130*/
131void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp);
132/**
133Set 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/**
139Encode a symbol using the MQ-coder
140@param mqc MQC handle
141@param d The symbol to be encoded (0 or 1)
142*/
143void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d);
144/**
145Flush the encoder, so that all remaining data is written
146@param mqc MQC handle
147*/
148void opj_mqc_flush(opj_mqc_t *mqc);
149/**
150BYPASS mode switch, initialization operation.
151JPEG 2000 p 505.
152@param mqc MQC handle
153*/
154void 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*/
161OPJ_UINT32 opj_mqc_bypass_get_extra_bytes(opj_mqc_t *mqc, OPJ_BOOL erterm);
162
163/**
164BYPASS mode switch, coding operation.
165JPEG 2000 p 505.
166@param mqc MQC handle
167@param d The symbol to be encoded (0 or 1)
168*/
169void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
170/**
171BYPASS mode switch, flush operation
172@param mqc MQC handle
173@param erterm 1 if ERTERM is enabled, 0 otherwise
174*/
175void opj_mqc_bypass_flush_enc(opj_mqc_t *mqc, OPJ_BOOL erterm);
176/**
177RESET mode switch
178@param mqc MQC handle
179*/
180void opj_mqc_reset_enc(opj_mqc_t *mqc);
181
182#ifdef notdef
183/**
184RESTART mode switch (TERMALL)
185@param mqc MQC handle
186@return Returns 1 (always)
187*/
188OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
189#endif
190
191/**
192RESTART mode switch (TERMALL) reinitialisation
193@param mqc MQC handle
194*/
195void opj_mqc_restart_init_enc(opj_mqc_t *mqc);
196/**
197ERTERM mode switch (PTERM)
198@param mqc MQC handle
199*/
200void opj_mqc_erterm_enc(opj_mqc_t *mqc);
201/**
202SEGMARK mode switch (SEGSYM)
203@param mqc MQC handle
204*/
205void opj_mqc_segmark_enc(opj_mqc_t *mqc);
206
207/**
208Initialize the decoder for MQ decoding.
209
210opj_mqc_finish_dec() must be absolutely called after finishing the decoding
211passes, 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*/
225void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
226 OPJ_UINT32 extra_writable_bytes);
227
228/**
229Initialize the decoder for RAW decoding.
230
231opj_mqc_finish_dec() must be absolutely called after finishing the decoding
232passes, 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*/
246void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
247 OPJ_UINT32 extra_writable_bytes);
248
249
250/**
251Terminate RAW/MQC decoding
252
253This restores the bytes temporarily overwritten by opj_mqc_init_dec()/
254opj_mqc_raw_init_dec()
255
256@param mqc MQC handle
257*/
258void opq_mqc_finish_dec(opj_mqc_t *mqc);
259
260/**
261Decode 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