mqc.h revision ac3d58cff7c80b0ef56bf55130d91da17cbaa3c4
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 __MQC_H 40#define __MQC_H 41/** 42@file mqc.h 43@brief Implementation of an MQ-Coder (MQC) 44 45The functions in MQC.C have for goal to realize the MQ-coder operations. The functions 46in MQC.C are used by some function in T1.C. 47*/ 48 49/** @defgroup MQC MQC - Implementation of an MQ-Coder */ 50/*@{*/ 51 52/** 53This struct defines the state of a context. 54*/ 55typedef struct opj_mqc_state { 56 /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */ 57 OPJ_UINT32 qeval; 58 /** the Most Probable Symbol (0 or 1) */ 59 OPJ_UINT32 mps; 60 /** next state if the next encoded symbol is the MPS */ 61 struct opj_mqc_state *nmps; 62 /** next state if the next encoded symbol is the LPS */ 63 struct opj_mqc_state *nlps; 64} opj_mqc_state_t; 65 66#define MQC_NUMCTXS 19 67 68/** 69MQ coder 70*/ 71typedef struct opj_mqc { 72 OPJ_UINT32 c; 73 OPJ_UINT32 a; 74 OPJ_UINT32 ct; 75 OPJ_BYTE *bp; 76 OPJ_BYTE *start; 77 OPJ_BYTE *end; 78 opj_mqc_state_t *ctxs[MQC_NUMCTXS]; 79 opj_mqc_state_t **curctx; 80#ifdef MQC_PERF_OPT 81 unsigned char *buffer; 82#endif 83} opj_mqc_t; 84 85/** @name Exported functions */ 86/*@{*/ 87/* ----------------------------------------------------------------------- */ 88/** 89Create a new MQC handle 90@return Returns a new MQC handle if successful, returns NULL otherwise 91*/ 92opj_mqc_t* opj_mqc_create(void); 93/** 94Destroy a previously created MQC handle 95@param mqc MQC handle to destroy 96*/ 97void opj_mqc_destroy(opj_mqc_t *mqc); 98/** 99Return the number of bytes written/read since initialisation 100@param mqc MQC handle 101@return Returns the number of bytes already encoded 102*/ 103OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc); 104/** 105Reset the states of all the context of the coder/decoder 106(each context is set to a state where 0 and 1 are more or less equiprobable) 107@param mqc MQC handle 108*/ 109void opj_mqc_resetstates(opj_mqc_t *mqc); 110/** 111Set the state of a particular context 112@param mqc MQC handle 113@param ctxno Number that identifies the context 114@param msb The MSB of the new state of the context 115@param prob Number that identifies the probability of the symbols for the new state of the context 116*/ 117void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob); 118/** 119Initialize the encoder 120@param mqc MQC handle 121@param bp Pointer to the start of the buffer where the bytes will be written 122*/ 123void opj_mqc_init_enc(opj_mqc_t *mqc, OPJ_BYTE *bp); 124/** 125Set the current context used for coding/decoding 126@param mqc MQC handle 127@param ctxno Number that identifies the context 128*/ 129#define opj_mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)] 130/** 131Encode a symbol using the MQ-coder 132@param mqc MQC handle 133@param d The symbol to be encoded (0 or 1) 134*/ 135void opj_mqc_encode(opj_mqc_t *mqc, OPJ_UINT32 d); 136/** 137Flush the encoder, so that all remaining data is written 138@param mqc MQC handle 139*/ 140void opj_mqc_flush(opj_mqc_t *mqc); 141/** 142BYPASS mode switch, initialization operation. 143JPEG 2000 p 505. 144<h2>Not fully implemented and tested !!</h2> 145@param mqc MQC handle 146*/ 147void opj_mqc_bypass_init_enc(opj_mqc_t *mqc); 148/** 149BYPASS mode switch, coding operation. 150JPEG 2000 p 505. 151<h2>Not fully implemented and tested !!</h2> 152@param mqc MQC handle 153@param d The symbol to be encoded (0 or 1) 154*/ 155void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d); 156/** 157BYPASS mode switch, flush operation 158<h2>Not fully implemented and tested !!</h2> 159@param mqc MQC handle 160@return Returns 1 (always) 161*/ 162OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc); 163/** 164RESET mode switch 165@param mqc MQC handle 166*/ 167void opj_mqc_reset_enc(opj_mqc_t *mqc); 168/** 169RESTART mode switch (TERMALL) 170@param mqc MQC handle 171@return Returns 1 (always) 172*/ 173OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc); 174/** 175RESTART mode switch (TERMALL) reinitialisation 176@param mqc MQC handle 177*/ 178void opj_mqc_restart_init_enc(opj_mqc_t *mqc); 179/** 180ERTERM mode switch (PTERM) 181@param mqc MQC handle 182*/ 183void opj_mqc_erterm_enc(opj_mqc_t *mqc); 184/** 185SEGMARK mode switch (SEGSYM) 186@param mqc MQC handle 187*/ 188void opj_mqc_segmark_enc(opj_mqc_t *mqc); 189/** 190Initialize the decoder 191@param mqc MQC handle 192@param bp Pointer to the start of the buffer from which the bytes will be read 193@param len Length of the input buffer 194*/ 195OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len); 196/** 197Decode a symbol 198@param mqc MQC handle 199@return Returns the decoded symbol (0 or 1) 200*/ 201OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc); 202/* ----------------------------------------------------------------------- */ 203/*@}*/ 204 205/*@}*/ 206 207#endif /* __MQC_H */ 208