summaryrefslogtreecommitdiff
path: root/src/lib/openjp2/mqc.c
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2017-06-13 12:09:52 +0200
committerEven Rouault <even.rouault@spatialys.com>2017-06-13 12:09:52 +0200
commit9cbc9903c3034d1a101d0521402503ead0abcff0 (patch)
tree3c133c5b3359e4e9218e5bd4afa6ef885df39f4f /src/lib/openjp2/mqc.c
parent2609fb8077125b5b31f1bcc2f98c12ff1e6572d7 (diff)
parent9a9b06911e164bdc854cf6b9c3bc5b6e751bf46d (diff)
Merge branch 't1_flag_optimizations'
Diffstat (limited to 'src/lib/openjp2/mqc.c')
-rw-r--r--src/lib/openjp2/mqc.c58
1 files changed, 40 insertions, 18 deletions
diff --git a/src/lib/openjp2/mqc.c b/src/lib/openjp2/mqc.c
index 92a0d318..5c1fe799 100644
--- a/src/lib/openjp2/mqc.c
+++ b/src/lib/openjp2/mqc.c
@@ -38,6 +38,8 @@
#include "opj_includes.h"
+#include <assert.h>
+
/** @defgroup MQC MQC - Implementation of an MQ-Coder */
/*@{*/
@@ -269,19 +271,6 @@ static void opj_mqc_setbits(opj_mqc_t *mqc)
==========================================================
*/
-opj_mqc_t* opj_mqc_create(void)
-{
- opj_mqc_t *mqc = (opj_mqc_t*)opj_malloc(sizeof(opj_mqc_t));
- return mqc;
-}
-
-void opj_mqc_destroy(opj_mqc_t *mqc)
-{
- if (mqc) {
- opj_free(mqc);
- }
-}
-
OPJ_UINT32 opj_mqc_numbytes(opj_mqc_t *mqc)
{
const ptrdiff_t diff = mqc->bp - mqc->start;
@@ -495,17 +484,35 @@ void opj_mqc_segmark_enc(opj_mqc_t *mqc)
}
}
-OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len)
+static void opj_mqc_init_dec_common(opj_mqc_t *mqc,
+ OPJ_BYTE *bp,
+ OPJ_UINT32 len,
+ OPJ_UINT32 extra_writable_bytes)
+{
+ (void)extra_writable_bytes;
+
+ assert(extra_writable_bytes >= OPJ_COMMON_CBLK_DATA_EXTRA);
+ mqc->start = bp;
+ mqc->end = bp + len;
+ /* Insert an artificial 0xFF 0xFF marker at end of the code block */
+ /* data so that the bytein routines stop on it. This saves us comparing */
+ /* the bp and end pointers */
+ /* But before inserting it, backup th bytes we will overwrite */
+ memcpy(mqc->backup, mqc->end, OPJ_COMMON_CBLK_DATA_EXTRA);
+ mqc->end[0] = 0xFF;
+ mqc->end[1] = 0xFF;
+ mqc->bp = bp;
+}
+void opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+ OPJ_UINT32 extra_writable_bytes)
{
/* Implements ISO 15444-1 C.3.5 Initialization of the decoder (INITDEC) */
/* Note: alternate "J.1 - Initialization of the software-conventions */
/* decoder" has been tried, but does */
/* not bring any improvement. */
/* See https://github.com/uclouvain/openjpeg/issues/921 */
+ opj_mqc_init_dec_common(mqc, bp, len, extra_writable_bytes);
opj_mqc_setcurctx(mqc, 0);
- mqc->start = bp;
- mqc->end = bp + len;
- mqc->bp = bp;
if (len == 0) {
mqc->c = 0xff << 16;
} else {
@@ -516,7 +523,22 @@ OPJ_BOOL opj_mqc_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len)
mqc->c <<= 7;
mqc->ct -= 7;
mqc->a = 0x8000;
- return OPJ_TRUE;
+}
+
+
+void opj_mqc_raw_init_dec(opj_mqc_t *mqc, OPJ_BYTE *bp, OPJ_UINT32 len,
+ OPJ_UINT32 extra_writable_bytes)
+{
+ opj_mqc_init_dec_common(mqc, bp, len, extra_writable_bytes);
+ mqc->c = 0;
+ mqc->ct = 0;
+}
+
+
+void opq_mqc_finish_dec(opj_mqc_t *mqc)
+{
+ /* Restore the bytes overwritten by opj_mqc_init_dec_common() */
+ memcpy(mqc->end, mqc->backup, OPJ_COMMON_CBLK_DATA_EXTRA);
}
void opj_mqc_resetstates(opj_mqc_t *mqc)