diff options
Diffstat (limited to 'converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c')
-rw-r--r-- | converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c | 852 |
1 files changed, 426 insertions, 426 deletions
diff --git a/converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c b/converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c index f7d66b57..a5772c53 100644 --- a/converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c +++ b/converter/other/jpeg2000/libjasper/jpc/jpc_tsfb.c @@ -6,14 +6,14 @@ */ /* __START_OF_JASPER_LICENSE__ - * + * * JasPer Software License - * + * * IMAGE POWER JPEG-2000 PUBLIC LICENSE * ************************************ - * + * * GRANT: - * + * * Permission is hereby granted, free of charge, to any person (the "User") * obtaining a copy of this software and associated documentation, to deal * in the JasPer Software without restriction, including without limitation @@ -21,22 +21,22 @@ * and/or sell copies of the JasPer Software (in source and binary forms), * and to permit persons to whom the JasPer Software is furnished to do so, * provided further that the License Conditions below are met. - * + * * License Conditions * ****************** - * + * * A. Redistributions of source code must retain the above copyright notice, * and this list of conditions, and the following disclaimer. - * + * * B. Redistributions in binary form must reproduce the above copyright * notice, and this list of conditions, and the following disclaimer in * the documentation and/or other materials provided with the distribution. - * + * * C. Neither the name of Image Power, Inc. nor any other contributor * (including, but not limited to, the University of British Columbia and * Michael David Adams) may be used to endorse or promote products derived * from this software without specific prior written permission. - * + * * D. User agrees that it shall not commence any action against Image Power, * Inc., the University of British Columbia, Michael David Adams, or any * other contributors (collectively "Licensors") for infringement of any @@ -56,17 +56,17 @@ * trade dress, or service mark rights); and (v) divisions, continuations, * renewals, reissues and extensions of the foregoing (as and to the extent * applicable) now existing, hereafter filed, issued or acquired. - * + * * E. If User commences an infringement action against any Licensor(s) then * such Licensor(s) shall have the right to terminate User's license and * all sublicenses that have been granted hereunder by User to other parties. - * + * * F. This software is for use only in hardware or software products that * are compliant with ISO/IEC 15444-1 (i.e., JPEG-2000 Part 1). No license * or right to this Software is granted for products that do not comply * with ISO/IEC 15444-1. The JPEG-2000 Part 1 standard can be purchased * from the ISO. - * + * * THIS DISCLAIMER OF WARRANTY CONSTITUTES AN ESSENTIAL PART OF THIS LICENSE. * NO USE OF THE JASPER SOFTWARE IS AUTHORIZED HEREUNDER EXCEPT UNDER * THIS DISCLAIMER. THE JASPER SOFTWARE IS PROVIDED BY THE LICENSORS AND @@ -106,7 +106,7 @@ * TECHNOLOGY OR PRODUCTS FOR HIGH RISK ACTIVITIES AND WILL ENSURE THAT ITS * CUSTOMERS AND END-USERS OF ITS PRODUCTS ARE PROVIDED WITH A COPY OF THE * NOTICE SPECIFIED IN THIS SECTION. - * + * * __END_OF_JASPER_LICENSE__ */ @@ -134,8 +134,8 @@ * \******************************************************************************/ -#define bandnotovind(tsfbnode, x) ((x) / (tsfbnode)->numhchans) -#define bandnotohind(tsfbnode, x) ((x) % (tsfbnode)->numhchans) +#define bandnotovind(tsfbnode, x) ((x) / (tsfbnode)->numhchans) +#define bandnotohind(tsfbnode, x) ((x) % (tsfbnode)->numhchans) static jpc_tsfb_t *jpc_tsfb_create(void); static jpc_tsfbnode_t *jpc_tsfbnode_create(void); @@ -158,74 +158,74 @@ static int jpc_tsfbnode_getequivfilters(jpc_tsfbnode_t *tsfbnode, int cldind, jpc_tsfb_t *jpc_tsfb_wavelet(jpc_qmfb1d_t *hqmfb, jpc_qmfb1d_t *vqmfb, int numdlvls) { - jpc_tsfb_t *tsfb; - int dlvlno; - jpc_tsfbnode_t *curnode; - jpc_tsfbnode_t *prevnode; - int childno; - if (!(tsfb = jpc_tsfb_create())) { - return 0; - } - prevnode = 0; - for (dlvlno = 0; dlvlno < numdlvls; ++dlvlno) { - if (!(curnode = jpc_tsfbnode_create())) { - jpc_tsfb_destroy(tsfb); - return 0; - } - if (prevnode) { - prevnode->children[0] = curnode; - ++prevnode->numchildren; - curnode->parent = prevnode; - } else { - tsfb->root = curnode; - curnode->parent = 0; - } - if (hqmfb) { - curnode->numhchans = jpc_qmfb1d_getnumchans(hqmfb); - if (!(curnode->hqmfb = jpc_qmfb1d_copy(hqmfb))) { - jpc_tsfb_destroy(tsfb); - return 0; - } - } else { - curnode->hqmfb = 0; - curnode->numhchans = 1; - } - if (vqmfb) { - curnode->numvchans = jpc_qmfb1d_getnumchans(vqmfb); - if (!(curnode->vqmfb = jpc_qmfb1d_copy(vqmfb))) { - jpc_tsfb_destroy(tsfb); - return 0; - } - } else { - curnode->vqmfb = 0; - curnode->numvchans = 1; - } - curnode->maxchildren = curnode->numhchans * curnode->numvchans; - for (childno = 0; childno < curnode->maxchildren; - ++childno) { - curnode->children[childno] = 0; - } - prevnode = curnode; - } - return tsfb; + jpc_tsfb_t *tsfb; + int dlvlno; + jpc_tsfbnode_t *curnode; + jpc_tsfbnode_t *prevnode; + int childno; + if (!(tsfb = jpc_tsfb_create())) { + return 0; + } + prevnode = 0; + for (dlvlno = 0; dlvlno < numdlvls; ++dlvlno) { + if (!(curnode = jpc_tsfbnode_create())) { + jpc_tsfb_destroy(tsfb); + return 0; + } + if (prevnode) { + prevnode->children[0] = curnode; + ++prevnode->numchildren; + curnode->parent = prevnode; + } else { + tsfb->root = curnode; + curnode->parent = 0; + } + if (hqmfb) { + curnode->numhchans = jpc_qmfb1d_getnumchans(hqmfb); + if (!(curnode->hqmfb = jpc_qmfb1d_copy(hqmfb))) { + jpc_tsfb_destroy(tsfb); + return 0; + } + } else { + curnode->hqmfb = 0; + curnode->numhchans = 1; + } + if (vqmfb) { + curnode->numvchans = jpc_qmfb1d_getnumchans(vqmfb); + if (!(curnode->vqmfb = jpc_qmfb1d_copy(vqmfb))) { + jpc_tsfb_destroy(tsfb); + return 0; + } + } else { + curnode->vqmfb = 0; + curnode->numvchans = 1; + } + curnode->maxchildren = curnode->numhchans * curnode->numvchans; + for (childno = 0; childno < curnode->maxchildren; + ++childno) { + curnode->children[childno] = 0; + } + prevnode = curnode; + } + return tsfb; } static jpc_tsfb_t *jpc_tsfb_create() { - jpc_tsfb_t *tsfb; - if (!(tsfb = jas_malloc(sizeof(jpc_tsfb_t)))) { - return 0; - } - tsfb->root = 0; - return tsfb; + jpc_tsfb_t *tsfb; + if (!(tsfb = jas_malloc(sizeof(jpc_tsfb_t)))) { + return 0; + } + tsfb->root = 0; + return tsfb; } void jpc_tsfb_destroy(jpc_tsfb_t *tsfb) { - if (tsfb->root) { - jpc_tsfbnode_destroy(tsfb->root); - } - jas_free(tsfb); + if (tsfb->root) { + jpc_tsfbnode_destroy(tsfb->root); + } + jas_free(tsfb); } /******************************************************************************\ @@ -234,83 +234,83 @@ void jpc_tsfb_destroy(jpc_tsfb_t *tsfb) void jpc_tsfb_analyze(jpc_tsfb_t *tsfb, int flags, jas_seq2d_t *x) { - if (tsfb->root) { - jpc_tsfbnode_analyze(tsfb->root, flags, x); - } + if (tsfb->root) { + jpc_tsfbnode_analyze(tsfb->root, flags, x); + } } static void jpc_tsfbnode_analyze(jpc_tsfbnode_t *node, int flags, jas_seq2d_t *x) { - jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; - int numbands; - jas_seq2d_t *y; - int bandno; - jpc_tsfbnodeband_t *band; - - if (node->vqmfb) { - jpc_qmfb1d_analyze(node->vqmfb, flags | JPC_QMFB1D_VERT, x); - } - if (node->hqmfb) { - jpc_qmfb1d_analyze(node->hqmfb, flags, x); - } - if (node->numchildren > 0) { - qmfb2d_getbands(node->hqmfb, node->vqmfb, jas_seq2d_xstart(x), - jas_seq2d_ystart(x), jas_seq2d_xend(x), jas_seq2d_yend(x), - JPC_TSFB_MAXBANDSPERNODE, &numbands, nodebands); - y = jas_seq2d_create(0, 0, 0, 0); - assert(y); - for (bandno = 0, band = nodebands; bandno < numbands; ++bandno, ++band) { - if (node->children[bandno]) { - if (band->xstart != band->xend && band->ystart != band->yend) { - jas_seq2d_bindsub(y, x, band->locxstart, band->locystart, - band->locxend, band->locyend); - jas_seq2d_setshift(y, band->xstart, band->ystart); - jpc_tsfbnode_analyze(node->children[bandno], flags, y); - } - } - } - jas_matrix_destroy(y); - } + jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; + int numbands; + jas_seq2d_t *y; + int bandno; + jpc_tsfbnodeband_t *band; + + if (node->vqmfb) { + jpc_qmfb1d_analyze(node->vqmfb, flags | JPC_QMFB1D_VERT, x); + } + if (node->hqmfb) { + jpc_qmfb1d_analyze(node->hqmfb, flags, x); + } + if (node->numchildren > 0) { + qmfb2d_getbands(node->hqmfb, node->vqmfb, jas_seq2d_xstart(x), + jas_seq2d_ystart(x), jas_seq2d_xend(x), jas_seq2d_yend(x), + JPC_TSFB_MAXBANDSPERNODE, &numbands, nodebands); + y = jas_seq2d_create(0, 0, 0, 0); + assert(y); + for (bandno = 0, band = nodebands; bandno < numbands; ++bandno, ++band) { + if (node->children[bandno]) { + if (band->xstart != band->xend && band->ystart != band->yend) { + jas_seq2d_bindsub(y, x, band->locxstart, band->locystart, + band->locxend, band->locyend); + jas_seq2d_setshift(y, band->xstart, band->ystart); + jpc_tsfbnode_analyze(node->children[bandno], flags, y); + } + } + } + jas_matrix_destroy(y); + } } void jpc_tsfb_synthesize(jpc_tsfb_t *tsfb, int flags, jas_seq2d_t *x) { - if (tsfb->root) { - jpc_tsfbnode_synthesize(tsfb->root, flags, x); - } + if (tsfb->root) { + jpc_tsfbnode_synthesize(tsfb->root, flags, x); + } } static void jpc_tsfbnode_synthesize(jpc_tsfbnode_t *node, int flags, jas_seq2d_t *x) { - jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; - int numbands; - jas_seq2d_t *y; - int bandno; - jpc_tsfbnodeband_t *band; - - if (node->numchildren > 0) { - qmfb2d_getbands(node->hqmfb, node->vqmfb, jas_seq2d_xstart(x), - jas_seq2d_ystart(x), jas_seq2d_xend(x), jas_seq2d_yend(x), - JPC_TSFB_MAXBANDSPERNODE, &numbands, nodebands); - y = jas_seq2d_create(0, 0, 0, 0); - for (bandno = 0, band = nodebands; bandno < numbands; ++bandno, ++band) { - if (node->children[bandno]) { - if (band->xstart != band->xend && band->ystart != band->yend) { - jas_seq2d_bindsub(y, x, band->locxstart, band->locystart, - band->locxend, band->locyend); - jas_seq2d_setshift(y, band->xstart, band->ystart); - jpc_tsfbnode_synthesize(node->children[bandno], flags, y); - } - } - } - jas_seq2d_destroy(y); - } - if (node->hqmfb) { - jpc_qmfb1d_synthesize(node->hqmfb, flags, x); - } - if (node->vqmfb) { - jpc_qmfb1d_synthesize(node->vqmfb, flags | JPC_QMFB1D_VERT, x); - } + jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; + int numbands; + jas_seq2d_t *y; + int bandno; + jpc_tsfbnodeband_t *band; + + if (node->numchildren > 0) { + qmfb2d_getbands(node->hqmfb, node->vqmfb, jas_seq2d_xstart(x), + jas_seq2d_ystart(x), jas_seq2d_xend(x), jas_seq2d_yend(x), + JPC_TSFB_MAXBANDSPERNODE, &numbands, nodebands); + y = jas_seq2d_create(0, 0, 0, 0); + for (bandno = 0, band = nodebands; bandno < numbands; ++bandno, ++band) { + if (node->children[bandno]) { + if (band->xstart != band->xend && band->ystart != band->yend) { + jas_seq2d_bindsub(y, x, band->locxstart, band->locystart, + band->locxend, band->locyend); + jas_seq2d_setshift(y, band->xstart, band->ystart); + jpc_tsfbnode_synthesize(node->children[bandno], flags, y); + } + } + } + jas_seq2d_destroy(y); + } + if (node->hqmfb) { + jpc_qmfb1d_synthesize(node->hqmfb, flags, x); + } + if (node->vqmfb) { + jpc_qmfb1d_synthesize(node->vqmfb, flags | JPC_QMFB1D_VERT, x); + } } /******************************************************************************\ @@ -321,114 +321,114 @@ static void jpc_tsfbnode_synthesize(jpc_tsfbnode_t *node, int flags, jas_seq2d_t int jpc_tsfb_getbands(jpc_tsfb_t *tsfb, uint_fast32_t xstart, uint_fast32_t ystart, uint_fast32_t xend, uint_fast32_t yend, jpc_tsfb_band_t *bands) { - jpc_tsfb_band_t *savbands; - savbands = bands; - if (!tsfb->root) { - bands[0].xstart = xstart; - bands[0].ystart = ystart; - bands[0].xend = xend; - bands[0].yend = yend; - bands[0].locxstart = xstart; - bands[0].locystart = ystart; - bands[0].locxend = xend; - bands[0].locyend = yend; - bands[0].orient = JPC_TSFB_LL; - bands[0].synenergywt = JPC_FIX_ONE; - ++bands; - } else { - jpc_tsfbnode_getbandstree(tsfb->root, xstart, ystart, - xstart, ystart, xend, yend, &bands); - } - return bands - savbands; + jpc_tsfb_band_t *savbands; + savbands = bands; + if (!tsfb->root) { + bands[0].xstart = xstart; + bands[0].ystart = ystart; + bands[0].xend = xend; + bands[0].yend = yend; + bands[0].locxstart = xstart; + bands[0].locystart = ystart; + bands[0].locxend = xend; + bands[0].locyend = yend; + bands[0].orient = JPC_TSFB_LL; + bands[0].synenergywt = JPC_FIX_ONE; + ++bands; + } else { + jpc_tsfbnode_getbandstree(tsfb->root, xstart, ystart, + xstart, ystart, xend, yend, &bands); + } + return bands - savbands; } static void jpc_tsfbnode_getbandstree(jpc_tsfbnode_t *node, uint_fast32_t posxstart, uint_fast32_t posystart, uint_fast32_t xstart, uint_fast32_t ystart, uint_fast32_t xend, uint_fast32_t yend, jpc_tsfb_band_t **bands) { - jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; - jpc_tsfbnodeband_t *nodeband; - int nodebandno; - int numnodebands; - jpc_tsfb_band_t *band; - jas_seq_t *hfilter; - jas_seq_t *vfilter; - - qmfb2d_getbands(node->hqmfb, node->vqmfb, xstart, ystart, xend, yend, - JPC_TSFB_MAXBANDSPERNODE, &numnodebands, nodebands); - if (node->numchildren > 0) { - for (nodebandno = 0, nodeband = nodebands; - nodebandno < numnodebands; ++nodebandno, ++nodeband) { - if (node->children[nodebandno]) { - jpc_tsfbnode_getbandstree(node->children[ - nodebandno], posxstart + - nodeband->locxstart - xstart, posystart + - nodeband->locystart - ystart, nodeband->xstart, - nodeband->ystart, nodeband->xend, - nodeband->yend, bands); - - } - } - } + jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE]; + jpc_tsfbnodeband_t *nodeband; + int nodebandno; + int numnodebands; + jpc_tsfb_band_t *band; + jas_seq_t *hfilter; + jas_seq_t *vfilter; + + qmfb2d_getbands(node->hqmfb, node->vqmfb, xstart, ystart, xend, yend, + JPC_TSFB_MAXBANDSPERNODE, &numnodebands, nodebands); + if (node->numchildren > 0) { + for (nodebandno = 0, nodeband = nodebands; + nodebandno < numnodebands; ++nodebandno, ++nodeband) { + if (node->children[nodebandno]) { + jpc_tsfbnode_getbandstree(node->children[ + nodebandno], posxstart + + nodeband->locxstart - xstart, posystart + + nodeband->locystart - ystart, nodeband->xstart, + nodeband->ystart, nodeband->xend, + nodeband->yend, bands); + + } + } + } assert(numnodebands == 4 || numnodebands == 3); - for (nodebandno = 0, nodeband = nodebands; nodebandno < numnodebands; - ++nodebandno, ++nodeband) { - if (!node->children[nodebandno]) { - band = *bands; - band->xstart = nodeband->xstart; - band->ystart = nodeband->ystart; - band->xend = nodeband->xend; - band->yend = nodeband->yend; - band->locxstart = posxstart + nodeband->locxstart - - xstart; - band->locystart = posystart + nodeband->locystart - - ystart; - band->locxend = band->locxstart + band->xend - - band->xstart; - band->locyend = band->locystart + band->yend - - band->ystart; - if (numnodebands == 4) { - switch (nodebandno) { - case 0: - band->orient = JPC_TSFB_LL; - break; - case 1: - band->orient = JPC_TSFB_HL; - break; - case 2: - band->orient = JPC_TSFB_LH; - break; - case 3: - band->orient = JPC_TSFB_HH; - break; - default: - abort(); - break; - } - } else { - switch (nodebandno) { - case 0: - band->orient = JPC_TSFB_HL; - break; - case 1: - band->orient = JPC_TSFB_LH; - break; - case 2: - band->orient = JPC_TSFB_HH; - break; - default: - abort(); - break; - } - } - jpc_tsfbnode_getequivfilters(node, nodebandno, band->xend - band->xstart, band->yend - band->ystart, &hfilter, &vfilter); - band->synenergywt = jpc_fix_mul(jpc_seq_norm(hfilter), - jpc_seq_norm(vfilter)); - jas_seq_destroy(hfilter); - jas_seq_destroy(vfilter); - ++(*bands); - } - } + for (nodebandno = 0, nodeband = nodebands; nodebandno < numnodebands; + ++nodebandno, ++nodeband) { + if (!node->children[nodebandno]) { + band = *bands; + band->xstart = nodeband->xstart; + band->ystart = nodeband->ystart; + band->xend = nodeband->xend; + band->yend = nodeband->yend; + band->locxstart = posxstart + nodeband->locxstart - + xstart; + band->locystart = posystart + nodeband->locystart - + ystart; + band->locxend = band->locxstart + band->xend - + band->xstart; + band->locyend = band->locystart + band->yend - + band->ystart; + if (numnodebands == 4) { + switch (nodebandno) { + case 0: + band->orient = JPC_TSFB_LL; + break; + case 1: + band->orient = JPC_TSFB_HL; + break; + case 2: + band->orient = JPC_TSFB_LH; + break; + case 3: + band->orient = JPC_TSFB_HH; + break; + default: + abort(); + break; + } + } else { + switch (nodebandno) { + case 0: + band->orient = JPC_TSFB_HL; + break; + case 1: + band->orient = JPC_TSFB_LH; + break; + case 2: + band->orient = JPC_TSFB_HH; + break; + default: + abort(); + break; + } + } + jpc_tsfbnode_getequivfilters(node, nodebandno, band->xend - band->xstart, band->yend - band->ystart, &hfilter, &vfilter); + band->synenergywt = jpc_fix_mul(jpc_seq_norm(hfilter), + jpc_seq_norm(vfilter)); + jas_seq_destroy(hfilter); + jas_seq_destroy(vfilter); + ++(*bands); + } + } } /******************************************************************************\ @@ -437,37 +437,37 @@ assert(numnodebands == 4 || numnodebands == 3); static jpc_tsfbnode_t *jpc_tsfbnode_create() { - jpc_tsfbnode_t *node; - if (!(node = jas_malloc(sizeof(jpc_tsfbnode_t)))) { - return 0; - } - node->numhchans = 0; - node->numvchans = 0; - node->numchildren = 0; - node->maxchildren = 0; - node->hqmfb = 0; - node->vqmfb = 0; - node->parent = 0; - return node; + jpc_tsfbnode_t *node; + if (!(node = jas_malloc(sizeof(jpc_tsfbnode_t)))) { + return 0; + } + node->numhchans = 0; + node->numvchans = 0; + node->numchildren = 0; + node->maxchildren = 0; + node->hqmfb = 0; + node->vqmfb = 0; + node->parent = 0; + return node; } static void jpc_tsfbnode_destroy(jpc_tsfbnode_t *node) { - jpc_tsfbnode_t **child; - int childno; - for (childno = 0, child = node->children; childno < node->maxchildren; - ++childno, ++child) { - if (*child) { - jpc_tsfbnode_destroy(*child); - } - } - if (node->hqmfb) { - jpc_qmfb1d_destroy(node->hqmfb); - } - if (node->vqmfb) { - jpc_qmfb1d_destroy(node->vqmfb); - } - jas_free(node); + jpc_tsfbnode_t **child; + int childno; + for (childno = 0, child = node->children; childno < node->maxchildren; + ++childno, ++child) { + if (*child) { + jpc_tsfbnode_destroy(*child); + } + } + if (node->hqmfb) { + jpc_qmfb1d_destroy(node->hqmfb); + } + if (node->vqmfb) { + jpc_qmfb1d_destroy(node->vqmfb); + } + jas_free(node); } @@ -481,182 +481,182 @@ static void qmfb2d_getbands(jpc_qmfb1d_t *hqmfb, jpc_qmfb1d_t *vqmfb, uint_fast32_t xstart, uint_fast32_t ystart, uint_fast32_t xend, uint_fast32_t yend, int maxbands, int *numbandsptr, jpc_tsfbnodeband_t *bands) { - jpc_qmfb1dband_t hbands[JPC_QMFB1D_MAXCHANS]; - jpc_qmfb1dband_t vbands[JPC_QMFB1D_MAXCHANS]; - int numhbands; - int numvbands; - int numbands; - int bandno; - int hbandno; - int vbandno; - jpc_tsfbnodeband_t *band; - - if (hqmfb) { - jpc_qmfb1d_getbands(hqmfb, 0, xstart, ystart, xend, yend, - JPC_QMFB1D_MAXCHANS, &numhbands, hbands); - } else { - numhbands = 1; - hbands[0].start = xstart; - hbands[0].end = xend; - hbands[0].locstart = xstart; - hbands[0].locend = xend; - } - if (vqmfb) { - jpc_qmfb1d_getbands(vqmfb, JPC_QMFB1D_VERT, xstart, ystart, xend, - yend, JPC_QMFB1D_MAXCHANS, &numvbands, vbands); - } else { - numvbands = 1; - vbands[0].start = ystart; - vbands[0].end = yend; - vbands[0].locstart = ystart; - vbands[0].locend = yend; - } - numbands = numhbands * numvbands; - *numbandsptr = numbands; - for (bandno = 0, band = bands; bandno < numbands; ++bandno, ++band) { - hbandno = bandno % numhbands; - vbandno = bandno / numhbands; - band->xstart = hbands[hbandno].start; - band->ystart = vbands[vbandno].start; - band->xend = hbands[hbandno].end; - band->yend = vbands[vbandno].end; - band->locxstart = hbands[hbandno].locstart; - band->locystart = vbands[vbandno].locstart; - band->locxend = hbands[hbandno].locend; - band->locyend = vbands[vbandno].locend; - assert(band->xstart <= band->xend && - band->ystart <= band->yend); - if (band->xstart == band->xend) { - band->yend = band->ystart; - band->locyend = band->locystart; - } else if (band->ystart == band->yend) { - band->xend = band->xstart; - band->locxend = band->locxstart; - } - } + jpc_qmfb1dband_t hbands[JPC_QMFB1D_MAXCHANS]; + jpc_qmfb1dband_t vbands[JPC_QMFB1D_MAXCHANS]; + int numhbands; + int numvbands; + int numbands; + int bandno; + int hbandno; + int vbandno; + jpc_tsfbnodeband_t *band; + + if (hqmfb) { + jpc_qmfb1d_getbands(hqmfb, 0, xstart, ystart, xend, yend, + JPC_QMFB1D_MAXCHANS, &numhbands, hbands); + } else { + numhbands = 1; + hbands[0].start = xstart; + hbands[0].end = xend; + hbands[0].locstart = xstart; + hbands[0].locend = xend; + } + if (vqmfb) { + jpc_qmfb1d_getbands(vqmfb, JPC_QMFB1D_VERT, xstart, ystart, xend, + yend, JPC_QMFB1D_MAXCHANS, &numvbands, vbands); + } else { + numvbands = 1; + vbands[0].start = ystart; + vbands[0].end = yend; + vbands[0].locstart = ystart; + vbands[0].locend = yend; + } + numbands = numhbands * numvbands; + *numbandsptr = numbands; + for (bandno = 0, band = bands; bandno < numbands; ++bandno, ++band) { + hbandno = bandno % numhbands; + vbandno = bandno / numhbands; + band->xstart = hbands[hbandno].start; + band->ystart = vbands[vbandno].start; + band->xend = hbands[hbandno].end; + band->yend = vbands[vbandno].end; + band->locxstart = hbands[hbandno].locstart; + band->locystart = vbands[vbandno].locstart; + band->locxend = hbands[hbandno].locend; + band->locyend = vbands[vbandno].locend; + assert(band->xstart <= band->xend && + band->ystart <= band->yend); + if (band->xstart == band->xend) { + band->yend = band->ystart; + band->locyend = band->locystart; + } else if (band->ystart == band->yend) { + band->xend = band->xstart; + band->locxend = band->locxstart; + } + } } static int jpc_tsfbnode_getequivfilters(jpc_tsfbnode_t *tsfbnode, int cldind, int width, int height, jas_seq_t **hfilter, jas_seq_t **vfilter) { - jas_seq_t *hseq; - jas_seq_t *vseq; - jpc_tsfbnode_t *node; - jas_seq2d_t *hfilters[JPC_QMFB1D_MAXCHANS]; - jas_seq2d_t *vfilters[JPC_QMFB1D_MAXCHANS]; - int numhchans; - int numvchans; - jas_seq_t *tmpseq; - - hseq = 0; - vseq = 0; - - if (!(hseq = jas_seq_create(0, 1))) { - goto error; - } - jas_seq_set(hseq, 0, jpc_inttofix(1)); - if (!(vseq = jas_seq_create(0, 1))) { - goto error; - } - jas_seq_set(vseq, 0, jpc_inttofix(1)); - - node = tsfbnode; - while (node) { - if (node->hqmfb) { - numhchans = jpc_qmfb1d_getnumchans(node->hqmfb); - if (jpc_qmfb1d_getsynfilters(node->hqmfb, width, hfilters)) { - goto error; - } - if (!(tmpseq = jpc_seq_upsample(hseq, numhchans))) { - goto error; - } - jas_seq_destroy(hseq); - hseq = tmpseq; - if (!(tmpseq = jpc_seq_conv(hseq, hfilters[bandnotohind(node, cldind)]))) { - goto error; - } - jas_seq_destroy(hfilters[0]); - jas_seq_destroy(hfilters[1]); - jas_seq_destroy(hseq); - hseq = tmpseq; - } - if (node->vqmfb) { - numvchans = jpc_qmfb1d_getnumchans(node->vqmfb); - if (jpc_qmfb1d_getsynfilters(node->vqmfb, height, vfilters)) { - abort(); - } - if (!(tmpseq = jpc_seq_upsample(vseq, numvchans))) { - goto error; - } - jas_seq_destroy(vseq); - vseq = tmpseq; - if (!(tmpseq = jpc_seq_conv(vseq, vfilters[bandnotovind(node, cldind)]))) { - goto error; - } - jas_seq_destroy(vfilters[0]); - jas_seq_destroy(vfilters[1]); - jas_seq_destroy(vseq); - vseq = tmpseq; - } - if (node->parent) { - cldind = jpc_tsfbnode_findchild(node->parent, node); - } - node = node->parent; - } - - *hfilter = hseq; - *vfilter = vseq; - - return 0; + jas_seq_t *hseq; + jas_seq_t *vseq; + jpc_tsfbnode_t *node; + jas_seq2d_t *hfilters[JPC_QMFB1D_MAXCHANS]; + jas_seq2d_t *vfilters[JPC_QMFB1D_MAXCHANS]; + int numhchans; + int numvchans; + jas_seq_t *tmpseq; + + hseq = 0; + vseq = 0; + + if (!(hseq = jas_seq_create(0, 1))) { + goto error; + } + jas_seq_set(hseq, 0, jpc_inttofix(1)); + if (!(vseq = jas_seq_create(0, 1))) { + goto error; + } + jas_seq_set(vseq, 0, jpc_inttofix(1)); + + node = tsfbnode; + while (node) { + if (node->hqmfb) { + numhchans = jpc_qmfb1d_getnumchans(node->hqmfb); + if (jpc_qmfb1d_getsynfilters(node->hqmfb, width, hfilters)) { + goto error; + } + if (!(tmpseq = jpc_seq_upsample(hseq, numhchans))) { + goto error; + } + jas_seq_destroy(hseq); + hseq = tmpseq; + if (!(tmpseq = jpc_seq_conv(hseq, hfilters[bandnotohind(node, cldind)]))) { + goto error; + } + jas_seq_destroy(hfilters[0]); + jas_seq_destroy(hfilters[1]); + jas_seq_destroy(hseq); + hseq = tmpseq; + } + if (node->vqmfb) { + numvchans = jpc_qmfb1d_getnumchans(node->vqmfb); + if (jpc_qmfb1d_getsynfilters(node->vqmfb, height, vfilters)) { + abort(); + } + if (!(tmpseq = jpc_seq_upsample(vseq, numvchans))) { + goto error; + } + jas_seq_destroy(vseq); + vseq = tmpseq; + if (!(tmpseq = jpc_seq_conv(vseq, vfilters[bandnotovind(node, cldind)]))) { + goto error; + } + jas_seq_destroy(vfilters[0]); + jas_seq_destroy(vfilters[1]); + jas_seq_destroy(vseq); + vseq = tmpseq; + } + if (node->parent) { + cldind = jpc_tsfbnode_findchild(node->parent, node); + } + node = node->parent; + } + + *hfilter = hseq; + *vfilter = vseq; + + return 0; error: - if (hseq) { - jas_seq_destroy(hseq); - } - if (vseq) { - jas_seq_destroy(vseq); - } - return -1; + if (hseq) { + jas_seq_destroy(hseq); + } + if (vseq) { + jas_seq_destroy(vseq); + } + return -1; } static int jpc_tsfbnode_findchild(jpc_tsfbnode_t *parnode, jpc_tsfbnode_t *cldnode) { - int i; - - for (i = 0; i < parnode->maxchildren; i++) { - if (parnode->children[i] == cldnode) - return i; - } - assert(0); - return -1; + int i; + + for (i = 0; i < parnode->maxchildren; i++) { + if (parnode->children[i] == cldnode) + return i; + } + assert(0); + return -1; } jpc_tsfb_t *jpc_cod_gettsfb(int qmfbid, int numlevels) { - jpc_tsfb_t *tsfb; - - switch (qmfbid) { - case JPC_COX_RFT: - qmfbid = JPC_QMFB1D_FT; - break; - case JPC_COX_INS: - qmfbid = JPC_QMFB1D_NS; - break; - default: - assert(0); - qmfbid = 10; - break; - } + jpc_tsfb_t *tsfb; + + switch (qmfbid) { + case JPC_COX_RFT: + qmfbid = JPC_QMFB1D_FT; + break; + case JPC_COX_INS: + qmfbid = JPC_QMFB1D_NS; + break; + default: + assert(0); + qmfbid = 10; + break; + } { - jpc_qmfb1d_t *hqmfb; - hqmfb = jpc_qmfb1d_make(qmfbid); - assert(hqmfb); - tsfb = jpc_tsfb_wavelet(hqmfb, hqmfb, numlevels); - assert(tsfb); - jpc_qmfb1d_destroy(hqmfb); + jpc_qmfb1d_t *hqmfb; + hqmfb = jpc_qmfb1d_make(qmfbid); + assert(hqmfb); + tsfb = jpc_tsfb_wavelet(hqmfb, hqmfb, numlevels); + assert(tsfb); + jpc_qmfb1d_destroy(hqmfb); } - return tsfb; + return tsfb; } |