summaryrefslogtreecommitdiff
path: root/openjpeg/src/lib/openjp2/mqc.h
diff options
context:
space:
mode:
authorChris Liddell <chris.liddell@artifex.com>2017-08-25 10:54:42 +0100
committerChris Liddell <chris.liddell@artifex.com>2017-08-31 14:36:24 +0100
commitff70cedd80fd037414abb8a17cd1988d92da2ad6 (patch)
treef00988ec16ad538f68dbea45beafd44a3135ae66 /openjpeg/src/lib/openjp2/mqc.h
parentd1dbe825e2fefed1156d0f5e02e6b4d5f20a7781 (diff)
downloadghostpdl-ff70cedd80fd037414abb8a17cd1988d92da2ad6.tar.gz
This is a combination of 7 commits.
from the openjpeg-2.2.0-update branch 1) OpenJPEG 2.2.0 initial commit 0b5fc7368721af148d85ef8dac2e018de10cfe91 2) Zap the openjpeg stuff we don't need e90bbccd19cb266b55de28ebfd16d024b6e67373 3) Add predefined openjpeg headers. 71242c9a04bb76b8b17fc489d62a91d04c1ad60c 4) Import patches from Sumatra's tree. 8b89e4b5750069172522ecf85e69d094b5e567e7 5) update makefiles, interface and vcproj files for new openjpeg version 456cbe1c76659b0ab022f6ca3f67cc63b253b05f 6) Avoid getenv call in openjpeg 202a0318a7b3a397fcd5d015dcad4293474f464c 7) Bug 698135: Import security fix for OpenJPEG 8057698a5f7833499fdf8d2529162841920e354a
Diffstat (limited to 'openjpeg/src/lib/openjp2/mqc.h')
-rw-r--r--openjpeg/src/lib/openjp2/mqc.h163
1 files changed, 112 insertions, 51 deletions
diff --git a/openjpeg/src/lib/openjp2/mqc.h b/openjpeg/src/lib/openjp2/mqc.h
index 491ee50ee..ac3aff108 100644
--- a/openjpeg/src/lib/openjp2/mqc.h
+++ b/openjpeg/src/lib/openjp2/mqc.h
@@ -1,6 +1,6 @@
/*
- * The copyright in this software is being made available under the 2-clauses
- * BSD License, included below. This software may be subject to other third
+ * The copyright in this software is being made available under the 2-clauses
+ * BSD License, included below. This software may be subject to other third
* party and contributor rights, including patent rights, and no such rights
* are granted under this license.
*
@@ -8,7 +8,7 @@
* Copyright (c) 2002-2014, Professor Benoit Macq
* Copyright (c) 2001-2003, David Janssens
* Copyright (c) 2002-2003, Yannick Verschueren
- * Copyright (c) 2003-2007, Francois-Olivier Devaux
+ * Copyright (c) 2003-2007, Francois-Olivier Devaux
* Copyright (c) 2003-2014, Antonin Descampe
* Copyright (c) 2005, Herve Drolon, FreeImage Team
* Copyright (c) 2008, Jerome Fimes, Communications & Systemes <jerome.fimes@c-s.fr>
@@ -36,8 +36,11 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef __MQC_H
-#define __MQC_H
+#ifndef OPJ_MQC_H
+#define OPJ_MQC_H
+
+#include "opj_common.h"
+
/**
@file mqc.h
@brief Implementation of an MQ-Coder (MQC)
@@ -53,14 +56,14 @@ in MQC.C are used by some function in T1.C.
This struct defines the state of a context.
*/
typedef struct opj_mqc_state {
- /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
- OPJ_UINT32 qeval;
- /** the Most Probable Symbol (0 or 1) */
- OPJ_UINT32 mps;
- /** next state if the next encoded symbol is the MPS */
- struct opj_mqc_state *nmps;
- /** next state if the next encoded symbol is the LPS */
- struct opj_mqc_state *nlps;
+ /** the probability of the Least Probable Symbol (0.75->0x8000, 1.5->0xffff) */
+ OPJ_UINT32 qeval;
+ /** the Most Probable Symbol (0 or 1) */
+ OPJ_UINT32 mps;
+ /** next state if the next encoded symbol is the MPS */
+ struct opj_mqc_state *nmps;
+ /** next state if the next encoded symbol is the LPS */
+ struct opj_mqc_state *nlps;
} opj_mqc_state_t;
#define MQC_NUMCTXS 19
@@ -69,18 +72,28 @@ typedef struct opj_mqc_state {
MQ coder
*/
typedef struct opj_mqc {
- OPJ_UINT32 c;
- OPJ_UINT32 a;
- OPJ_UINT32 ct;
- OPJ_BYTE *bp;
- OPJ_BYTE *start;
- OPJ_BYTE *end;
- opj_mqc_state_t *ctxs[MQC_NUMCTXS];
- opj_mqc_state_t **curctx;
- const OPJ_BYTE *lut_ctxno_zc_orient; /* lut_ctxno_zc shifted by 256 * bandno */
-#ifdef MQC_PERF_OPT
- unsigned char *buffer;
-#endif
+ /** temporary buffer where bits are coded or decoded */
+ OPJ_UINT32 c;
+ /** only used by MQ decoder */
+ OPJ_UINT32 a;
+ /** number of bits already read or free to write */
+ OPJ_UINT32 ct;
+ /* only used by decoder, to count the number of times a terminating 0xFF >0x8F marker is read */
+ OPJ_UINT32 end_of_byte_stream_counter;
+ /** pointer to the current position in the buffer */
+ OPJ_BYTE *bp;
+ /** pointer to the start of the buffer */
+ OPJ_BYTE *start;
+ /** pointer to the end of the buffer */
+ OPJ_BYTE *end;
+ /** Array of contexts */
+ opj_mqc_state_t *ctxs[MQC_NUMCTXS];
+ /** Active context */
+ opj_mqc_state_t **curctx;
+ /* lut_ctxno_zc shifted by (1 << 9) * bandno */
+ const OPJ_BYTE* lut_ctxno_zc_orient;
+ /** Original value of the 2 bytes at end[0] and end[1] */
+ OPJ_BYTE backup[OPJ_COMMON_CBLK_DATA_EXTRA];
} opj_mqc_t;
#include "mqc_inl.h"
@@ -88,16 +101,7 @@ typedef struct opj_mqc {
/** @name Exported functions */
/*@{*/
/* ----------------------------------------------------------------------- */
-/**
-Create a new MQC handle
-@return Returns a new MQC handle if successful, returns NULL otherwise
-*/
-opj_mqc_t* opj_mqc_create(void);
-/**
-Destroy a previously created MQC handle
-@param mqc MQC handle to destroy
-*/
-void opj_mqc_destroy(opj_mqc_t *mqc);
+
/**
Return the number of bytes written/read since initialisation
@param mqc MQC handle
@@ -105,7 +109,7 @@ Return the number of bytes written/read since initialisation
*/
OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc);
/**
-Reset the states of all the context of the coder/decoder
+Reset the states of all the context of the coder/decoder
(each context is set to a state where 0 and 1 are more or less equiprobable)
@param mqc MQC handle
*/
@@ -117,7 +121,8 @@ Set the state of a particular context
@param msb The MSB of the new state of the context
@param prob Number that identifies the probability of the symbols for the new state of the context
*/
-void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb, OPJ_INT32 prob);
+void opj_mqc_setstate(opj_mqc_t *mqc, OPJ_UINT32 ctxno, OPJ_UINT32 msb,
+ OPJ_INT32 prob);
/**
Initialize the encoder
@param mqc MQC handle
@@ -129,7 +134,7 @@ Set the current context used for coding/decoding
@param mqc MQC handle
@param ctxno Number that identifies the context
*/
-#define opj_mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
+#define opj_mqc_setcurctx(mqc, ctxno) (mqc)->curctx = &(mqc)->ctxs[(OPJ_UINT32)(ctxno)]
/**
Encode a symbol using the MQ-coder
@param mqc MQC handle
@@ -142,38 +147,47 @@ Flush the encoder, so that all remaining data is written
*/
void opj_mqc_flush(opj_mqc_t *mqc);
/**
-BYPASS mode switch, initialization operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
+BYPASS mode switch, initialization operation.
+JPEG 2000 p 505.
@param mqc MQC handle
*/
void opj_mqc_bypass_init_enc(opj_mqc_t *mqc);
+
+/** Return number of extra bytes to add to opj_mqc_numbytes() for theĀ²
+ size of a non-terminating BYPASS pass
+@param mqc MQC handle
+@param erterm 1 if ERTERM is enabled, 0 otherwise
+*/
+OPJ_UINT32 opj_mqc_bypass_get_extra_bytes(opj_mqc_t *mqc, OPJ_BOOL erterm);
+
/**
-BYPASS mode switch, coding operation.
-JPEG 2000 p 505.
-<h2>Not fully implemented and tested !!</h2>
+BYPASS mode switch, coding operation.
+JPEG 2000 p 505.
@param mqc MQC handle
@param d The symbol to be encoded (0 or 1)
*/
void opj_mqc_bypass_enc(opj_mqc_t *mqc, OPJ_UINT32 d);
/**
BYPASS mode switch, flush operation
-<h2>Not fully implemented and tested !!</h2>
@param mqc MQC handle
-@return Returns 1 (always)
+@param erterm 1 if ERTERM is enabled, 0 otherwise
*/
-OPJ_UINT32 opj_mqc_bypass_flush_enc(opj_mqc_t *mqc);
+void opj_mqc_bypass_flush_enc(opj_mqc_t *mqc, OPJ_BOOL erterm);
/**
RESET mode switch
@param mqc MQC handle
*/
void opj_mqc_reset_enc(opj_mqc_t *mqc);
+
+#ifdef notdef
/**
RESTART mode switch (TERMALL)
@param mqc MQC handle
@return Returns 1 (always)
*/
OPJ_UINT32 opj_mqc_restart_enc(opj_mqc_t *mqc);
+#endif
+
/**
RESTART mode switch (TERMALL) reinitialisation
@param mqc MQC handle
@@ -189,22 +203,69 @@ SEGMARK mode switch (SEGSYM)
@param mqc MQC handle
*/
void opj_mqc_segmark_enc(opj_mqc_t *mqc);
+
/**
-Initialize the decoder
+Initialize the decoder for MQ decoding.
+
+opj_mqc_finish_dec() must be absolutely called after finishing the decoding
+passes, so as to restore the bytes temporarily overwritten.
+
+@param mqc MQC handle
+@param bp Pointer to the start of the buffer from which the bytes will be read
+ Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
+ will be temporarily overwritten with an artificial 0xFF 0xFF marker.
+ (they will be backuped in the mqc structure to be restored later)
+ So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
+ writable.
+@param len Length of the input buffer
+@param extra_writable_bytes Indicate how many bytes after len are writable.
+ This is to indicate your consent that bp must be
+ large enough.
+*/
+void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+ OPJ_UINT32 extra_writable_bytes);
+
+/**
+Initialize the decoder for RAW decoding.
+
+opj_mqc_finish_dec() must be absolutely called after finishing the decoding
+passes, so as to restore the bytes temporarily overwritten.
+
@param mqc MQC handle
@param bp Pointer to the start of the buffer from which the bytes will be read
+ Note that OPJ_COMMON_CBLK_DATA_EXTRA bytes at the end of the buffer
+ will be temporarily overwritten with an artificial 0xFF 0xFF marker.
+ (they will be backuped in the mqc structure to be restored later)
+ So bp must be at least len + OPJ_COMMON_CBLK_DATA_EXTRA large, and
+ writable.
@param len Length of the input buffer
+@param extra_writable_bytes Indicate how many bytes after len are writable.
+ This is to indicate your consent that bp must be
+ large enough.
*/
-OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);
+void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+ OPJ_UINT32 extra_writable_bytes);
+
+
+/**
+Terminate RAW/MQC decoding
+
+This restores the bytes temporarily overwritten by opj_mqc_init_dec()/
+opj_mqc_raw_init_dec()
+
+@param mqc MQC handle
+*/
+void opq_mqc_finish_dec(opj_mqc_t *mqc);
+
/**
Decode a symbol
@param mqc MQC handle
@return Returns the decoded symbol (0 or 1)
*/
-static INLINE OPJ_INT32 opj_mqc_decode(opj_mqc_t * const mqc);
+/*static INLINE OPJ_UINT32 opj_mqc_decode(opj_mqc_t * const mqc);*/
/* ----------------------------------------------------------------------- */
/*@}*/
/*@}*/
-#endif /* __MQC_H */
+#endif /* OPJ_MQC_H */