diff options
author | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2020-09-06 03:15:27 +0000 |
---|---|---|
committer | giraffedata <giraffedata@9d0c8265-081b-0410-96cb-a4ca84ce46f8> | 2020-09-06 03:15:27 +0000 |
commit | 9772cdac86222754259a32b7862093a3eeb5cc4c (patch) | |
tree | 8a9207c2c28df2d1db14f1e10ae82b7f66d9e057 /converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c | |
parent | b65b6cba1ed3d79f91897c912176955515b601a6 (diff) | |
download | netpbm-mirror-9772cdac86222754259a32b7862093a3eeb5cc4c.tar.gz netpbm-mirror-9772cdac86222754259a32b7862093a3eeb5cc4c.tar.xz netpbm-mirror-9772cdac86222754259a32b7862093a3eeb5cc4c.zip |
cleanup
git-svn-id: http://svn.code.sf.net/p/netpbm/code/trunk@3944 9d0c8265-081b-0410-96cb-a4ca84ce46f8
Diffstat (limited to 'converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c')
-rw-r--r-- | converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c | 492 |
1 files changed, 252 insertions, 240 deletions
diff --git a/converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c b/converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c index 0dca9ec8..6518c37e 100644 --- a/converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c +++ b/converter/other/jpeg2000/libjasper/jpc/jpc_t1dec.c @@ -138,19 +138,6 @@ * \******************************************************************************/ -static int jpc_dec_decodecblk(jpc_dec_t *dec, jpc_dec_tile_t *tile, jpc_dec_tcomp_t *tcomp, jpc_dec_band_t *band, - jpc_dec_cblk_t *cblk, int dopartial, int maxlyrs); -static int dec_sigpass(jpc_dec_t *dec, jpc_mqdec_t *mqdec, int bitpos, int orient, - int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data); -static int dec_rawsigpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, - int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data); -static int dec_refpass(jpc_dec_t *dec, jpc_mqdec_t *mqdec, int bitpos, int vcausalflag, - jas_matrix_t *flags, jas_matrix_t *data); -static int dec_rawrefpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, - int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data); -static int dec_clnpass(jpc_dec_t *dec, jpc_mqdec_t *mqdec, int bitpos, int orient, - int vcausalflag, int segsymflag, jas_matrix_t *flags, jas_matrix_t *data); - #if defined(DEBUG) static long t1dec_cnt = 0; #endif @@ -185,203 +172,7 @@ static long t1dec_cnt = 0; } #endif -/******************************************************************************\ -* Code. -\******************************************************************************/ - -int jpc_dec_decodecblks(jpc_dec_t *dec, jpc_dec_tile_t *tile) -{ - jpc_dec_tcomp_t *tcomp; - int compcnt; - jpc_dec_rlvl_t *rlvl; - int rlvlcnt; - jpc_dec_band_t *band; - int bandcnt; - jpc_dec_prc_t *prc; - int prccnt; - jpc_dec_cblk_t *cblk; - int cblkcnt; - - for (compcnt = dec->numcomps, tcomp = tile->tcomps; compcnt > 0; - --compcnt, ++tcomp) { - for (rlvlcnt = tcomp->numrlvls, rlvl = tcomp->rlvls; - rlvlcnt > 0; --rlvlcnt, ++rlvl) { - if (!rlvl->bands) { - continue; - } - for (bandcnt = rlvl->numbands, band = rlvl->bands; - bandcnt > 0; --bandcnt, ++band) { - if (!band->data) { - continue; - } - for (prccnt = rlvl->numprcs, prc = band->prcs; - prccnt > 0; --prccnt, ++prc) { - if (!prc->cblks) { - continue; - } - for (cblkcnt = prc->numcblks, - cblk = prc->cblks; cblkcnt > 0; - --cblkcnt, ++cblk) { - if (jpc_dec_decodecblk(dec, tile, tcomp, - band, cblk, 1, JPC_MAXLYRS)) { - return -1; - } - } - } - - } - } - } - - return 0; -} - -static int jpc_dec_decodecblk(jpc_dec_t *dec, jpc_dec_tile_t *tile, jpc_dec_tcomp_t *tcomp, jpc_dec_band_t *band, - jpc_dec_cblk_t *cblk, int dopartial, int maxlyrs) -{ - jpc_dec_seg_t *seg; - int i; - int bpno; - int passtype; - int ret; - int compno; - int filldata; - int fillmask; - jpc_dec_ccp_t *ccp; - - compno = tcomp - tile->tcomps; - - if (!cblk->flags) { - /* Note: matrix is assumed to be zeroed */ - if (!(cblk->flags = jas_matrix_create(jas_matrix_numrows(cblk->data) + - 2, jas_matrix_numcols(cblk->data) + 2))) { - return -1; - } - } - - seg = cblk->segs.head; - while (seg && (seg != cblk->curseg || dopartial) && (maxlyrs < 0 || - seg->lyrno < maxlyrs)) { - assert(seg->numpasses >= seg->maxpasses || dopartial); - assert(seg->stream); - jas_stream_rewind(seg->stream); - jas_stream_setrwcount(seg->stream, 0); - if (seg->type == JPC_SEG_MQ) { - if (!cblk->mqdec) { - if (!(cblk->mqdec = jpc_mqdec_create(JPC_NUMCTXS, 0))) { - return -1; - } - jpc_mqdec_setctxs(cblk->mqdec, JPC_NUMCTXS, jpc_mqctxs); - } - jpc_mqdec_setinput(cblk->mqdec, seg->stream); - jpc_mqdec_init(cblk->mqdec); - } else { - assert(seg->type == JPC_SEG_RAW); - if (!cblk->nulldec) { - if (!(cblk->nulldec = jpc_bitstream_sopen(seg->stream, "r"))) { - assert(0); - } - } - } - - - for (i = 0; i < seg->numpasses; ++i) { - if (cblk->numimsbs > band->numbps) { - ccp = &tile->cp->ccps[compno]; - if (ccp->roishift <= 0) { - fprintf(stderr, "warning: corrupt code stream\n"); - } else { - if (cblk->numimsbs < ccp->roishift - band->numbps) { - fprintf(stderr, "warning: corrupt code stream\n"); - } - } - } - bpno = band->roishift + band->numbps - 1 - (cblk->numimsbs + - (seg->passno + i - cblk->firstpassno + 2) / 3); -if (bpno < 0) { - goto premature_exit; -} -#if 1 - passtype = (seg->passno + i + 2) % 3; -#else - passtype = JPC_PASSTYPE(seg->passno + i + 2); -#endif - assert(bpno >= 0 && bpno < 31); - switch (passtype) { - case JPC_SIGPASS: - ret = (seg->type == JPC_SEG_MQ) ? dec_sigpass(dec, - cblk->mqdec, bpno, band->orient, - (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, - cblk->flags, cblk->data) : - dec_rawsigpass(dec, cblk->nulldec, bpno, - (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, - cblk->flags, cblk->data); - break; - case JPC_REFPASS: - ret = (seg->type == JPC_SEG_MQ) ? - dec_refpass(dec, cblk->mqdec, bpno, - (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, - cblk->flags, cblk->data) : - dec_rawrefpass(dec, cblk->nulldec, bpno, - (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, - cblk->flags, cblk->data); - break; - case JPC_CLNPASS: - assert(seg->type == JPC_SEG_MQ); - ret = dec_clnpass(dec, cblk->mqdec, bpno, - band->orient, (tile->cp->ccps[compno].cblkctx & - JPC_COX_VSC) != 0, (tile->cp->ccps[compno].cblkctx & - JPC_COX_SEGSYM) != 0, cblk->flags, - cblk->data); - break; - default: - ret = -1; - break; - } - /* Do we need to reset after each coding pass? */ - if (tile->cp->ccps[compno].cblkctx & JPC_COX_RESET) { - jpc_mqdec_setctxs(cblk->mqdec, JPC_NUMCTXS, jpc_mqctxs); - } - - if (ret) { - fprintf(stderr, "coding pass failed passtype=%d segtype=%d\n", passtype, seg->type); - return -1; - } - } - - if (seg->type == JPC_SEG_MQ) { -/* Note: dont destroy mq decoder because context info will be lost */ - } else { - assert(seg->type == JPC_SEG_RAW); - if (tile->cp->ccps[compno].cblkctx & JPC_COX_PTERM) { - fillmask = 0x7f; - filldata = 0x2a; - } else { - fillmask = 0; - filldata = 0; - } - if ((ret = jpc_bitstream_inalign(cblk->nulldec, fillmask, - filldata)) < 0) { - return -1; - } else if (ret > 0) { - fprintf(stderr, "warning: bad termination pattern detected\n"); - } - jpc_bitstream_close(cblk->nulldec); - cblk->nulldec = 0; - } - - cblk->curseg = seg->next; - jpc_seglist_remove(&cblk->segs, seg); - jpc_seg_destroy(seg); - seg = cblk->curseg; - } - - assert(dopartial ? (!cblk->curseg) : 1); - -premature_exit: - return 0; -} /******************************************************************************\ * Code for significance pass. @@ -407,8 +198,34 @@ premature_exit: } \ } -static int dec_sigpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, int orient, - int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data) +#define jpc_rawsigpass_step(fp, frowstep, dp, oneplushalf, in, vcausalflag) \ +{ \ + jpc_fix_t f = *(fp); \ + jpc_fix_t v; \ + if ((f & JPC_OTHSIGMSK) && !(f & (JPC_SIG | JPC_VISIT))) { \ + JPC_T1D_RAWGETBIT(in, v, "SIG", "ZC"); \ + if (v < 0) { \ + return -1; \ + } \ + if (v) { \ + JPC_T1D_RAWGETBIT(in, v, "SIG", "SC"); \ + if (v < 0) { \ + return -1; \ + } \ + JPC_UPDATEFLAGS4((fp), (frowstep), v, (vcausalflag)); \ + *(fp) |= JPC_SIG; \ + *(dp) = v ? (-oneplushalf) : (oneplushalf); \ + } \ + *(fp) |= JPC_VISIT; \ + } \ +} + + + +static int +dec_sigpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, + int orient, + int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data) { int i; int j; @@ -488,30 +305,12 @@ static int dec_sigpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, return 0; } -#define jpc_rawsigpass_step(fp, frowstep, dp, oneplushalf, in, vcausalflag) \ -{ \ - jpc_fix_t f = *(fp); \ - jpc_fix_t v; \ - if ((f & JPC_OTHSIGMSK) && !(f & (JPC_SIG | JPC_VISIT))) { \ - JPC_T1D_RAWGETBIT(in, v, "SIG", "ZC"); \ - if (v < 0) { \ - return -1; \ - } \ - if (v) { \ - JPC_T1D_RAWGETBIT(in, v, "SIG", "SC"); \ - if (v < 0) { \ - return -1; \ - } \ - JPC_UPDATEFLAGS4((fp), (frowstep), v, (vcausalflag)); \ - *(fp) |= JPC_SIG; \ - *(dp) = v ? (-oneplushalf) : (oneplushalf); \ - } \ - *(fp) |= JPC_VISIT; \ - } \ -} -static int dec_rawsigpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, int vcausalflag, - jas_matrix_t *flags, jas_matrix_t *data) + +static int +dec_rawsigpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, + int vcausalflag, + jas_matrix_t *flags, jas_matrix_t *data) { int i; int j; @@ -592,6 +391,8 @@ static int dec_rawsigpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, int v return 0; } + + /******************************************************************************\ * Code for refinement pass. \******************************************************************************/ @@ -609,8 +410,11 @@ static int dec_rawsigpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, int v } \ } -static int dec_refpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, - int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data) + + +static int +dec_refpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, + int vcausalflag, jas_matrix_t *flags, jas_matrix_t *data) { int i; int j; @@ -703,8 +507,12 @@ static int dec_refpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, } \ } -static int dec_rawrefpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, int vcausalflag, - jas_matrix_t *flags, jas_matrix_t *data) + + +static int +dec_rawrefpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, + int vcausalflag, + jas_matrix_t *flags, jas_matrix_t *data) { int i; int j; @@ -781,6 +589,8 @@ static int dec_rawrefpass(jpc_dec_t *dec, jpc_bitstream_t *in, int bitpos, int v return 0; } + + /******************************************************************************\ * Code for cleanup pass. \******************************************************************************/ @@ -807,8 +617,10 @@ plabel \ *(fp) &= ~JPC_VISIT; \ } -static int dec_clnpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, int orient, - int vcausalflag, int segsymflag, jas_matrix_t *flags, jas_matrix_t *data) +static int +dec_clnpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, + int orient, int vcausalflag, int segsymflag, jas_matrix_t *flags, + jas_matrix_t *data) { int i; int j; @@ -952,3 +764,203 @@ static int dec_clnpass(jpc_dec_t *dec, register jpc_mqdec_t *mqdec, int bitpos, return 0; } + + + +static int +jpc_dec_decodecblk(jpc_dec_t *dec, jpc_dec_tile_t *tile, + jpc_dec_tcomp_t *tcomp, jpc_dec_band_t *band, + jpc_dec_cblk_t *cblk, int dopartial, int maxlyrs) +{ + jpc_dec_seg_t *seg; + int i; + int bpno; + int passtype; + int ret; + int compno; + int filldata; + int fillmask; + jpc_dec_ccp_t *ccp; + + compno = tcomp - tile->tcomps; + + if (!cblk->flags) { + /* Note: matrix is assumed to be zeroed */ + if (!(cblk->flags = jas_matrix_create(jas_matrix_numrows(cblk->data) + + 2, jas_matrix_numcols(cblk->data) + 2))) { + return -1; + } + } + + seg = cblk->segs.head; + while (seg && (seg != cblk->curseg || dopartial) && (maxlyrs < 0 || + seg->lyrno < maxlyrs)) { + assert(seg->numpasses >= seg->maxpasses || dopartial); + assert(seg->stream); + jas_stream_rewind(seg->stream); + jas_stream_setrwcount(seg->stream, 0); + if (seg->type == JPC_SEG_MQ) { + if (!cblk->mqdec) { + if (!(cblk->mqdec = jpc_mqdec_create(JPC_NUMCTXS, 0))) { + return -1; + } + jpc_mqdec_setctxs(cblk->mqdec, JPC_NUMCTXS, jpc_mqctxs); + } + jpc_mqdec_setinput(cblk->mqdec, seg->stream); + jpc_mqdec_init(cblk->mqdec); + } else { + assert(seg->type == JPC_SEG_RAW); + if (!cblk->nulldec) { + if (!(cblk->nulldec = jpc_bitstream_sopen(seg->stream, "r"))) { + assert(0); + } + } + } + + + for (i = 0; i < seg->numpasses; ++i) { + if (cblk->numimsbs > band->numbps) { + ccp = &tile->cp->ccps[compno]; + if (ccp->roishift <= 0) { + fprintf(stderr, "warning: corrupt code stream\n"); + } else { + if (cblk->numimsbs < ccp->roishift - band->numbps) { + fprintf(stderr, "warning: corrupt code stream\n"); + } + } + } + bpno = band->roishift + band->numbps - 1 - (cblk->numimsbs + + (seg->passno + i - cblk->firstpassno + 2) / 3); +if (bpno < 0) { + goto premature_exit; +} +#if 1 + passtype = (seg->passno + i + 2) % 3; +#else + passtype = JPC_PASSTYPE(seg->passno + i + 2); +#endif + assert(bpno >= 0 && bpno < 31); + switch (passtype) { + case JPC_SIGPASS: + ret = (seg->type == JPC_SEG_MQ) ? dec_sigpass(dec, + cblk->mqdec, bpno, band->orient, + (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, + cblk->flags, cblk->data) : + dec_rawsigpass(dec, cblk->nulldec, bpno, + (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, + cblk->flags, cblk->data); + break; + case JPC_REFPASS: + ret = (seg->type == JPC_SEG_MQ) ? + dec_refpass(dec, cblk->mqdec, bpno, + (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, + cblk->flags, cblk->data) : + dec_rawrefpass(dec, cblk->nulldec, bpno, + (tile->cp->ccps[compno].cblkctx & JPC_COX_VSC) != 0, + cblk->flags, cblk->data); + break; + case JPC_CLNPASS: + assert(seg->type == JPC_SEG_MQ); + ret = dec_clnpass(dec, cblk->mqdec, bpno, + band->orient, (tile->cp->ccps[compno].cblkctx & + JPC_COX_VSC) != 0, (tile->cp->ccps[compno].cblkctx & + JPC_COX_SEGSYM) != 0, cblk->flags, + cblk->data); + break; + default: + ret = -1; + break; + } + /* Do we need to reset after each coding pass? */ + if (tile->cp->ccps[compno].cblkctx & JPC_COX_RESET) { + jpc_mqdec_setctxs(cblk->mqdec, JPC_NUMCTXS, jpc_mqctxs); + } + + if (ret) { + fprintf(stderr, "coding pass failed passtype=%d segtype=%d\n", passtype, seg->type); + return -1; + } + + } + + if (seg->type == JPC_SEG_MQ) { +/* Note: dont destroy mq decoder because context info will be lost */ + } else { + assert(seg->type == JPC_SEG_RAW); + if (tile->cp->ccps[compno].cblkctx & JPC_COX_PTERM) { + fillmask = 0x7f; + filldata = 0x2a; + } else { + fillmask = 0; + filldata = 0; + } + if ((ret = jpc_bitstream_inalign(cblk->nulldec, fillmask, + filldata)) < 0) { + return -1; + } else if (ret > 0) { + fprintf(stderr, "warning: bad termination pattern detected\n"); + } + jpc_bitstream_close(cblk->nulldec); + cblk->nulldec = 0; + } + + cblk->curseg = seg->next; + jpc_seglist_remove(&cblk->segs, seg); + jpc_seg_destroy(seg); + seg = cblk->curseg; + } + + assert(dopartial ? (!cblk->curseg) : 1); + +premature_exit: + return 0; +} + +int +jpc_dec_decodecblks(jpc_dec_t *dec, jpc_dec_tile_t *tile) +{ + jpc_dec_tcomp_t *tcomp; + int compcnt; + jpc_dec_rlvl_t *rlvl; + int rlvlcnt; + jpc_dec_band_t *band; + int bandcnt; + jpc_dec_prc_t *prc; + int prccnt; + jpc_dec_cblk_t *cblk; + int cblkcnt; + + for (compcnt = dec->numcomps, tcomp = tile->tcomps; compcnt > 0; + --compcnt, ++tcomp) { + for (rlvlcnt = tcomp->numrlvls, rlvl = tcomp->rlvls; + rlvlcnt > 0; --rlvlcnt, ++rlvl) { + if (!rlvl->bands) { + continue; + } + for (bandcnt = rlvl->numbands, band = rlvl->bands; + bandcnt > 0; --bandcnt, ++band) { + if (!band->data) { + continue; + } + for (prccnt = rlvl->numprcs, prc = band->prcs; + prccnt > 0; --prccnt, ++prc) { + if (!prc->cblks) { + continue; + } + for (cblkcnt = prc->numcblks, + cblk = prc->cblks; cblkcnt > 0; + --cblkcnt, ++cblk) { + if (jpc_dec_decodecblk(dec, tile, tcomp, + band, cblk, 1, JPC_MAXLYRS)) { + return -1; + } + } + } + + } + } + } + + return 0; +} + |