diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2017-06-13 12:09:52 +0200 |
|---|---|---|
| committer | Even Rouault <even.rouault@spatialys.com> | 2017-06-13 12:09:52 +0200 |
| commit | 9cbc9903c3034d1a101d0521402503ead0abcff0 (patch) | |
| tree | 3c133c5b3359e4e9218e5bd4afa6ef885df39f4f /src/lib/openjp2/mqc.c | |
| parent | 2609fb8077125b5b31f1bcc2f98c12ff1e6572d7 (diff) | |
| parent | 9a9b06911e164bdc854cf6b9c3bc5b6e751bf46d (diff) | |
Merge branch 't1_flag_optimizations'
Diffstat (limited to 'src/lib/openjp2/mqc.c')
| -rw-r--r-- | src/lib/openjp2/mqc.c | 58 |
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) |
