Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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. <h2>Not fully implemented and tested !!</h2>
  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. <h2>Not fully implemented and tested !!</h2>
  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. <h2>Not fully implemented and tested !!</h2>
  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 */
  201.