summaryrefslogtreecommitdiff
path: root/src/lib/openjp2/mqc.h
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-06-02 16:49:26 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-06-02 18:24:07 +0200
commit532243f1fd9997db63ea7f6b199d21138ccf58a3 (patch)
tree3e204ebb64f2a1ceb5c73af30c3ff377dde55b9a /src/lib/openjp2/mqc.h
parent9b39fc4bccb3e9e4e9a9f61c4dc672fb7f05d865 (diff)
MQC/RAW decoder: use an artificial 0xFF 0xFF terminating marker.
This saves comparing the current pointer with the end of buffer pointer. This results at least in tiny speed improvement for raw decoding, and smaller code size for MQC as well. This kills the remains of the raw.h/.c files that were only used for decoding. Encoding using the mqc structure already.
Diffstat (limited to 'src/lib/openjp2/mqc.h')
-rw-r--r--src/lib/openjp2/mqc.h64
1 files changed, 62 insertions, 2 deletions
diff --git a/src/lib/openjp2/mqc.h b/src/lib/openjp2/mqc.h
index 1c0d848b..a29ecb67 100644
--- a/src/lib/openjp2/mqc.h
+++ b/src/lib/openjp2/mqc.h
@@ -38,6 +38,9 @@
#ifndef __MQC_H
#define __MQC_H
+
+#include "opj_common.h"
+
/**
@file mqc.h
@brief Implementation of an MQ-Coder (MQC)
@@ -69,16 +72,26 @@ typedef struct opj_mqc_state {
MQ coder
*/
typedef struct opj_mqc {
+ /** 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;
+ /** 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"
@@ -179,13 +192,60 @@ 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.
*/
-OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len);
+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.
+*/
+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