X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;f=src%2Fgdcmopenjpeg%2Flibopenjpeg%2Ftgt.c;h=aaaa09b9628f6768bf60232820044d0c42038a1e;hb=7eb2c6a1c2b6d33ac2b9dd5e23304679c185f70b;hp=66d4d82b817aa09e2782d390b3f9bf6402935a76;hpb=7452f3039ff4dd2574fcbf3343b530a2f20f9623;p=gdcm.git diff --git a/src/gdcmopenjpeg/libopenjpeg/tgt.c b/src/gdcmopenjpeg/libopenjpeg/tgt.c index 66d4d82b..aaaa09b9 100644 --- a/src/gdcmopenjpeg/libopenjpeg/tgt.c +++ b/src/gdcmopenjpeg/libopenjpeg/tgt.c @@ -1,5 +1,9 @@ /* - * Copyright (c) 2001-2002, David Janssens + * Copyright (c) 2001-2003, David Janssens + * Copyright (c) 2002-2003, Yannick Verschueren + * Copyright (c) 2003-2005, Francois Devaux and Antonin Descampe + * Copyright (c) 2005, Hervé Drolon, FreeImage Team + * Copyright (c) 2002-2005, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,44 +28,27 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include "tgt.h" -#include "bio.h" -#include -#include +#include "opj_includes.h" -/* */ -/* Reset tag-tree. */ -/* */ -void tgt_reset(tgt_tree_t * tree) -{ - int i; - /* new */ - if (!tree || tree == NULL) - return; - - for (i = 0; i < tree->numnodes; i++) { - tree->nodes[i].value = 999; - tree->nodes[i].low = 0; - tree->nodes[i].known = 0; - } -} +/* +========================================================== + Tag-tree coder interface +========================================================== +*/ -/* */ -/* Create tag-tree. */ -/* */ -tgt_tree_t *tgt_create(int numleafsh, int numleafsv) -{ +opj_tgt_tree_t *tgt_create(int numleafsh, int numleafsv) { int nplh[32]; int nplv[32]; - tgt_node_t *node; - tgt_node_t *parentnode; - tgt_node_t *parentnode0; - tgt_tree_t *tree; + opj_tgt_node_t *node = NULL; + opj_tgt_node_t *parentnode = NULL; + opj_tgt_node_t *parentnode0 = NULL; + opj_tgt_tree_t *tree = NULL; int i, j, k; int numlvls; int n; - tree = (tgt_tree_t *) malloc(sizeof(tgt_tree_t)); + tree = (opj_tgt_tree_t *) opj_malloc(sizeof(opj_tgt_tree_t)); + if(!tree) return NULL; tree->numleafsh = numleafsh; tree->numleafsv = numleafsv; @@ -76,61 +63,70 @@ tgt_tree_t *tgt_create(int numleafsh, int numleafsv) tree->numnodes += n; ++numlvls; } while (n > 1); - + /* ADD */ if (tree->numnodes == 0) { - free(tree); + opj_free(tree); return NULL; } - tree->nodes = (tgt_node_t *) malloc(tree->numnodes * sizeof(tgt_node_t)); + tree->nodes = (opj_tgt_node_t *) opj_malloc(tree->numnodes * sizeof(opj_tgt_node_t)); + if(!tree->nodes) { + opj_free(tree); + return NULL; + } node = tree->nodes; parentnode = &tree->nodes[tree->numleafsh * tree->numleafsv]; parentnode0 = parentnode; - + for (i = 0; i < numlvls - 1; ++i) { for (j = 0; j < nplv[i]; ++j) { k = nplh[i]; while (--k >= 0) { - node->parent = parentnode; - ++node; - if (--k >= 0) { - node->parent = parentnode; - ++node; - } - ++parentnode; + node->parent = parentnode; + ++node; + if (--k >= 0) { + node->parent = parentnode; + ++node; + } + ++parentnode; } if ((j & 1) || j == nplv[i] - 1) { - parentnode0 = parentnode; + parentnode0 = parentnode; } else { - parentnode = parentnode0; - parentnode0 += nplh[i]; + parentnode = parentnode0; + parentnode0 += nplh[i]; } } } node->parent = 0; - + tgt_reset(tree); - + return tree; } -/* */ -/* Destroy tag-tree. */ -/* */ -void tgt_destroy(tgt_tree_t * t) -{ - free(t->nodes); - free(t); +void tgt_destroy(opj_tgt_tree_t *tree) { + opj_free(tree->nodes); + opj_free(tree); } -/* */ -/* Set the value of a leaf of the tag-tree. */ -/* */ -void tgt_setvalue(tgt_tree_t * tree, int leafno, int value) -{ - tgt_node_t *node; +void tgt_reset(opj_tgt_tree_t *tree) { + int i; + + if (NULL == tree) + return; + + for (i = 0; i < tree->numnodes; i++) { + tree->nodes[i].value = 999; + tree->nodes[i].low = 0; + tree->nodes[i].known = 0; + } +} + +void tgt_setvalue(opj_tgt_tree_t *tree, int leafno, int value) { + opj_tgt_node_t *node; node = &tree->nodes[leafno]; while (node && node->value > value) { node->value = value; @@ -138,14 +134,10 @@ void tgt_setvalue(tgt_tree_t * tree, int leafno, int value) } } -/* */ -/* Encode the value of a leaf of the tag-tree. */ -/* */ -void tgt_encode(tgt_tree_t * tree, int leafno, int threshold) -{ - tgt_node_t *stk[31]; - tgt_node_t **stkptr; - tgt_node_t *node; +void tgt_encode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; int low; stkptr = stk; @@ -154,7 +146,7 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold) *stkptr++ = node; node = node->parent; } - + low = 0; for (;;) { if (low > node->low) { @@ -162,35 +154,30 @@ void tgt_encode(tgt_tree_t * tree, int leafno, int threshold) } else { low = node->low; } - + while (low < threshold) { if (low >= node->value) { - if (!node->known) { - bio_write(1, 1); - node->known = 1; - } - break; + if (!node->known) { + bio_write(bio, 1, 1); + node->known = 1; + } + break; } - bio_write(0, 1); + bio_write(bio, 0, 1); ++low; } - + node->low = low; if (stkptr == stk) break; node = *--stkptr; } - } -/* */ -/* Decode the value of a leaf of the tag-tree. */ -/* */ -int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) -{ - tgt_node_t *stk[31]; - tgt_node_t **stkptr; - tgt_node_t *node; +int tgt_decode(opj_bio_t *bio, opj_tgt_tree_t *tree, int leafno, int threshold) { + opj_tgt_node_t *stk[31]; + opj_tgt_node_t **stkptr; + opj_tgt_node_t *node; int low; stkptr = stk; @@ -199,7 +186,7 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) *stkptr++ = node; node = node->parent; } - + low = 0; for (;;) { if (low > node->low) { @@ -208,10 +195,10 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) low = node->low; } while (low < threshold && low < node->value) { - if (bio_read(1)) { - node->value = low; + if (bio_read(bio, 1)) { + node->value = low; } else { - ++low; + ++low; } } node->low = low; @@ -220,6 +207,6 @@ int tgt_decode(tgt_tree_t * tree, int leafno, int threshold) } node = *--stkptr; } - + return (node->value < threshold) ? 1 : 0; }