diff options
| author | Yannick Verschueren <unknown@unknown> | 2004-02-13 09:47:40 +0000 |
|---|---|---|
| committer | Yannick Verschueren <unknown@unknown> | 2004-02-13 09:47:40 +0000 |
| commit | bb349b2ceee6027ab19f9fe20ed6d8c6a18a15a2 (patch) | |
| tree | 5771c73a3198f3d5f9276f67d8a31028ef27c95a /libopenjpeg/tcd.c | |
| parent | 4be829988a6423a4ca9582e0ec6948837b529a1b (diff) | |
Update for version 0.8
Diffstat (limited to 'libopenjpeg/tcd.c')
| -rw-r--r-- | libopenjpeg/tcd.c | 834 |
1 files changed, 242 insertions, 592 deletions
diff --git a/libopenjpeg/tcd.c b/libopenjpeg/tcd.c index 8b53da0d..84b3a172 100644 --- a/libopenjpeg/tcd.c +++ b/libopenjpeg/tcd.c @@ -1,7 +1,7 @@ /* * Copyright (c) 2001-2002, David Janssens - * Copyright (c) 2002-2003, Yannick Verschueren - * Copyright (c) 2002-2003, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium + * Copyright (c) 2002-2004, Yannick Verschueren + * Copyright (c) 2002-2004, Communications and remote sensing Laboratory, Universite catholique de Louvain, Belgium * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -129,12 +129,7 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) /* tile->PPT=img->PPT; */ /* Modification of the RATE >> */ for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = - ceil(tile->numcomps * (tile->x1 - tile->x0) * - (tile->y1 - - tile->y0) * img->comps[0].prec / (tcp->rates[j] * 8 * - img->comps[0].dx * - img->comps[0].dy)); + tcp->rates[j] = ceil(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec / (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)); if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { tcp->rates[j] = tcp->rates[j - 1] + 20; } else { @@ -144,8 +139,7 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) } /* << Modification of the RATE */ - tile->comps = - (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); + tile->comps = (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); for (compno = 0; compno < tile->numcomps; compno++) { j2k_tccp_t *tccp = &tcp->tccps[compno]; /* tcd_tilecomp_t *tilec=&tile->comps[compno]; */ @@ -157,18 +151,10 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - /* Special DWT (always this case) */ - tilec->previous_row = 0; - tilec->previous_col = 0; - - tilec->data = - (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0)); + tilec->data = (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)); tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = - (tcd_resolution_t *) malloc(tilec->numresolutions * - sizeof(tcd_resolution_t)); + tilec->resolutions = (tcd_resolution_t *) malloc(tilec->numresolutions * sizeof(tcd_resolution_t)); for (resno = 0; resno < tilec->numresolutions; resno++) { int pdx, pdy; @@ -187,14 +173,6 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) res->x1 = int_ceildivpow2(tilec->x1, levelno); res->y1 = int_ceildivpow2(tilec->y1, levelno); - /* Special DWT (always this case) */ - res->previous_x0 = 0; - res->previous_y0 = 0; - res->previous_x1 = 0; - res->previous_y1 = 0; - res->cas_row = 0; - res->cas_col = 0; - /* << DWT */ res->numbands = resno == 0 ? 1 : 3; /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ if (tccp->csty & J2K_CCP_CSTY_PRT) { @@ -249,36 +227,20 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) band->y1 = int_ceildivpow2(tilec->y1, levelno); } else { /* band border (global) */ - band->x0 = - int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, - levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, - levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, - levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, - levelno + 1); + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); } - ss = - &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); numbps = img->comps[compno].prec + gain; - band->stepsize = - (int) floor((1.0 + ss->mant / 2048.0) * - pow(2.0, numbps - ss->expn) * 8192.0); + band->stepsize = (int) floor((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn) * 8192.0); band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - band->precincts = - (tcd_precinct_t *) malloc(3 * res->pw * res->ph * - sizeof(tcd_precinct_t)); + band->precincts = (tcd_precinct_t *) malloc(3 * res->pw * res->ph * sizeof(tcd_precinct_t)); for (i = 0; i < res->pw * res->ph * 3; i++) { band->precincts[i].imsbtree = NULL; @@ -301,28 +263,20 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) prc->x1 = int_min(cbgxend, band->x1); prc->y1 = int_min(cbgyend, band->y1); - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - prc->cblks = - (tcd_cblk_t *) malloc((prc->cw * prc->ch) * - sizeof(tcd_cblk_t)); + prc->cblks = (tcd_cblk_t *) malloc((prc->cw * prc->ch) * sizeof(tcd_cblk_t)); prc->incltree = tgt_create(prc->cw, prc->ch); prc->imsbtree = tgt_create(prc->cw, prc->ch); for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); int cblkxend = cblkxstart + (1 << cblkwidthexpn); int cblkyend = cblkystart + (1 << cblkheightexpn); @@ -332,7 +286,6 @@ void tcd_malloc_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) cblk->y0 = int_max(cblkystart, prc->y0); cblk->x1 = int_min(cblkxend, prc->x1); cblk->y1 = int_min(cblkyend, prc->y1); - } } } @@ -366,14 +319,14 @@ void tcd_free_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) if (prc->imsbtree != NULL) tgt_destroy(prc->imsbtree); free(prc->cblks); - } /* for (precno */ + } /* for (precno */ free(band->precincts); - } /* for (bandno */ - } /* for (resno */ + } /* for (bandno */ + } /* for (resno */ free(tilec->resolutions); - } /* for (compno */ + } /* for (compno */ free(tile->comps); - } /* for (tileno */ + } /* for (tileno */ free(tcd_image.tiles); } @@ -384,7 +337,7 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) for (tileno = 0; tileno < 1; tileno++) { j2k_tcp_t *tcp = &cp->tcps[curtileno]; int j; - int previous_x0, previous_x1, previous_y0, previous_y1; + // int previous_x0, previous_x1, previous_y0, previous_y1; /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ int p = curtileno % cp->tw; int q = curtileno / cp->tw; @@ -395,34 +348,13 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0); tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - /* Special DWT */ - if (p) { - previous_x0 = int_max(cp->tx0 + (p - 1) * cp->tdx, img->x0); - previous_x1 = int_min(cp->tx0 + p * cp->tdx, img->x1); - } else { - previous_x0 = 0; - previous_x1 = 0; - } - - if (q) { - previous_y0 = int_max(cp->ty0 + (q - 1) * cp->tdy, img->y0); - previous_y1 = int_min(cp->ty0 + q * cp->tdy, img->y1); - } else { - previous_y0 = 0; - previous_y1 = 0; - } - /* << DWT */ tile->numcomps = img->numcomps; /* tile->PPT=img->PPT; */ /* Modification of the RATE >> */ for (j = 0; j < tcp->numlayers; j++) { - tcp->rates[j] = - ceil(tile->numcomps * (tile->x1 - tile->x0) * - (tile->y1 - - tile->y0) * img->comps[0].prec / (tcp->rates[j] * 8 * - img->comps[0].dx * - img->comps[0].dy)); + tcp->rates[j] = ceil(tile->numcomps * (tile->x1 - tile->x0) * (tile->y1 - tile->y0) * img->comps[0].prec + / (tcp->rates[j] * 8 * img->comps[0].dx * img->comps[0].dy)); if (j && tcp->rates[j] < tcp->rates[j - 1] + 10) { tcp->rates[j] = tcp->rates[j - 1] + 20; } else { @@ -443,31 +375,7 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - /* special for DWT */ - if (p) { - previous_x0 = int_ceildiv(previous_x0, img->comps[compno].dx); - previous_x1 = int_ceildiv(previous_x1, img->comps[compno].dx); - - tilec->previous_row = 1; - } else { - previous_x0 = 0; - previous_x1 = 0; - tilec->previous_row = 0; - } - - if (q) { - previous_y0 = int_ceildiv(previous_y0, img->comps[compno].dx); - previous_y1 = int_ceildiv(previous_y1, img->comps[compno].dx); - tilec->previous_col = 1; - } else { - previous_y0 = 0; - previous_y1 = 0; - tilec->previous_col = 0; - } - /* << DWT */ - tilec->data = - (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0)); + tilec->data = (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)); tilec->numresolutions = tccp->numresolutions; /* tilec->resolutions=(tcd_resolution_t*)realloc(tilec->resolutions,tilec->numresolutions*sizeof(tcd_resolution_t)); */ for (resno = 0; resno < tilec->numresolutions; resno++) { @@ -485,12 +393,6 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) res->x1 = int_ceildivpow2(tilec->x1, levelno); res->y1 = int_ceildivpow2(tilec->y1, levelno); - /* special for DWT */ - res->previous_x0 = int_ceildivpow2(previous_x0, levelno); - res->previous_y0 = int_ceildivpow2(previous_y0, levelno); - res->previous_x1 = int_ceildivpow2(previous_x1, levelno); - res->previous_y1 = int_ceildivpow2(previous_y1, levelno); - res->numbands = resno == 0 ? 1 : 3; /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ if (tccp->csty & J2K_CCP_CSTY_PRT) { @@ -544,30 +446,16 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) band->x1 = int_ceildivpow2(tilec->x1, levelno); band->y1 = int_ceildivpow2(tilec->y1, levelno); } else { - band->x0 = - int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, - levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, - levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, - levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, - levelno + 1); + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); } - ss = - &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); numbps = img->comps[compno].prec + gain; - band->stepsize = - (int) floor((1.0 + ss->mant / 2048.0) * - pow(2.0, numbps - ss->expn) * 8192.0); + band->stepsize = (int) floor((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn) * 8192.0); band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ for (precno = 0; precno < res->pw * res->ph; precno++) { @@ -586,21 +474,15 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) prc->x1 = int_min(cbgxend, band->x1); prc->y1 = int_min(cbgyend, band->y1); - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; free(prc->cblks); - prc->cblks = - (tcd_cblk_t *) malloc(prc->cw * prc->ch * - sizeof(tcd_cblk_t)); + prc->cblks = (tcd_cblk_t *) malloc(prc->cw * prc->ch * sizeof(tcd_cblk_t)); if (prc->incltree != NULL) tgt_destroy(prc->incltree); @@ -611,10 +493,8 @@ void tcd_init_encode(j2k_image_t * img, j2k_cp_t * cp, int curtileno) prc->imsbtree = tgt_create(prc->cw, prc->ch); for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); int cblkxend = cblkxstart + (1 << cblkwidthexpn); int cblkyend = cblkystart + (1 << cblkheightexpn); cblk = &prc->cblks[cblkno]; @@ -641,12 +521,11 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) tcd_cp = cp; tcd_image.tw = cp->tw; tcd_image.th = cp->th; - tcd_image.tiles = - (tcd_tile_t *) malloc(cp->tw * cp->th * sizeof(tcd_tile_t)); + tcd_image.tiles = (tcd_tile_t *) malloc(cp->tw * cp->th * sizeof(tcd_tile_t)); for (tileno = 0; tileno < cp->tw * cp->th; tileno++) { j2k_tcp_t *tcp = &cp->tcps[tileno]; tcd_tile_t *tile = &tcd_image.tiles[tileno]; - int previous_x0, previous_x1, previous_y0, previous_y1; + // int previous_x0, previous_x1, previous_y0, previous_y1; /* cfr p59 ISO/IEC FDIS15444-1 : 2000 (18 august 2000) */ int p = tileno % cp->tw; /* si numerotation matricielle .. */ int q = tileno / cp->tw; /* .. coordonnees de la tile (q,p) q pour ligne et p pour colonne */ @@ -656,27 +535,9 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) tile->y0 = int_max(cp->ty0 + q * cp->tdy, img->y0); tile->x1 = int_min(cp->tx0 + (p + 1) * cp->tdx, img->x1); tile->y1 = int_min(cp->ty0 + (q + 1) * cp->tdy, img->y1); - /* Special DWT */ - if (p) { - previous_x0 = int_max(cp->tx0 + (p - 1) * cp->tdx, img->x0); - previous_x1 = int_min(cp->tx0 + p * cp->tdx, img->x1); - } else { - previous_x0 = 0; - previous_x1 = 0; - } - - if (q) { - previous_y0 = int_max(cp->ty0 + (q - 1) * cp->tdy, img->y0); - previous_y1 = int_min(cp->ty0 + q * cp->tdy, img->y1); - } else { - previous_y0 = 0; - previous_y1 = 0; - } - /* << DWT */ tile->numcomps = img->numcomps; - tile->comps = - (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); + tile->comps = (tcd_tilecomp_t *) malloc(img->numcomps * sizeof(tcd_tilecomp_t)); for (compno = 0; compno < tile->numcomps; compno++) { j2k_tccp_t *tccp = &tcp->tccps[compno]; tcd_tilecomp_t *tilec = &tile->comps[compno]; @@ -685,35 +546,10 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) tilec->y0 = int_ceildiv(tile->y0, img->comps[compno].dy); tilec->x1 = int_ceildiv(tile->x1, img->comps[compno].dx); tilec->y1 = int_ceildiv(tile->y1, img->comps[compno].dy); - /* special for DWT */ - if (p) { - previous_x0 = int_ceildiv(previous_x0, img->comps[compno].dx); - previous_x1 = int_ceildiv(previous_x1, img->comps[compno].dx); - - tilec->previous_row = 1; - } else { - previous_x0 = 0; - previous_x1 = 0; - tilec->previous_row = 0; - } - if (q) { - previous_y0 = int_ceildiv(previous_y0, img->comps[compno].dx); - previous_y1 = int_ceildiv(previous_y1, img->comps[compno].dx); - tilec->previous_col = 1; - } else { - previous_y0 = 0; - previous_y1 = 0; - tilec->previous_col = 0; - } - /* << DWT */ - tilec->data = - (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * - (tilec->y1 - tilec->y0)); + tilec->data = (int *) malloc(sizeof(int) * (tilec->x1 - tilec->x0) * (tilec->y1 - tilec->y0)); tilec->numresolutions = tccp->numresolutions; - tilec->resolutions = - (tcd_resolution_t *) malloc(tilec->numresolutions * - sizeof(tcd_resolution_t)); + tilec->resolutions = (tcd_resolution_t *) malloc(tilec->numresolutions * sizeof(tcd_resolution_t)); for (resno = 0; resno < tilec->numresolutions; resno++) { int pdx, pdy; int levelno = tilec->numresolutions - 1 - resno; @@ -728,15 +564,6 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) res->y0 = int_ceildivpow2(tilec->y0, levelno); res->x1 = int_ceildivpow2(tilec->x1, levelno); res->y1 = int_ceildivpow2(tilec->y1, levelno); - /* special for DWT */ - res->previous_x0 = int_ceildivpow2(previous_x0, levelno); - res->previous_y0 = int_ceildivpow2(previous_y0, levelno); - res->previous_x1 = int_ceildivpow2(previous_x1, levelno); - res->previous_y1 = int_ceildivpow2(previous_y1, levelno); - if (!p) - res->cas_row = 0; - if (!q) - res->cas_col = 0; res->numbands = resno == 0 ? 1 : 3; /* p. 35, table A-23, ISO/IEC FDIS154444-1 : 2000 (18 august 2000) */ @@ -791,42 +618,24 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) band->y1 = int_ceildivpow2(tilec->y1, levelno); } else { /* band border (global) */ - band->x0 = - int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, - levelno + 1); - band->y0 = - int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, - levelno + 1); - band->x1 = - int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, - levelno + 1); - band->y1 = - int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, - levelno + 1); + band->x0 = int_ceildivpow2(tilec->x0 - (1 << levelno) * x0b, levelno + 1); + band->y0 = int_ceildivpow2(tilec->y0 - (1 << levelno) * y0b, levelno + 1); + band->x1 = int_ceildivpow2(tilec->x1 - (1 << levelno) * x0b, levelno + 1); + band->y1 = int_ceildivpow2(tilec->y1 - (1 << levelno) * y0b, levelno + 1); } - ss = - &tccp->stepsizes[resno == - 0 ? 0 : 3 * (resno - 1) + bandno + 1]; - gain = - tccp->qmfbid == - 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); + ss = &tccp->stepsizes[resno == 0 ? 0 : 3 * (resno - 1) + bandno + 1]; + gain = tccp->qmfbid == 0 ? dwt_getgain_real(band->bandno) : dwt_getgain(band->bandno); numbps = img->comps[compno].prec + gain; - band->stepsize = - (int) floor((1.0 + ss->mant / 2048.0) * - pow(2.0, numbps - ss->expn) * 8192.0); + band->stepsize = (int) floor((1.0 + ss->mant / 2048.0) * pow(2.0, numbps - ss->expn) * 8192.0); band->numbps = ss->expn + tccp->numgbits - 1; /* WHY -1 ? */ - band->precincts = - (tcd_precinct_t *) malloc(res->pw * res->ph * - sizeof(tcd_precinct_t)); + band->precincts = (tcd_precinct_t *) malloc(res->pw * res->ph * sizeof(tcd_precinct_t)); for (precno = 0; precno < res->pw * res->ph; precno++) { int tlcblkxstart, tlcblkystart, brcblkxend, brcblkyend; - int cbgxstart = - tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); - int cbgystart = - tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); + int cbgxstart = tlcbgxstart + (precno % res->pw) * (1 << cbgwidthexpn); + int cbgystart = tlcbgystart + (precno / res->pw) * (1 << cbgheightexpn); int cbgxend = cbgxstart + (1 << cbgwidthexpn); int cbgyend = cbgystart + (1 << cbgheightexpn); tcd_precinct_t *prc = &band->precincts[precno]; @@ -836,29 +645,21 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) prc->x1 = int_min(cbgxend, band->x1); prc->y1 = int_min(cbgyend, band->y1); - tlcblkxstart = - int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; - tlcblkystart = - int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; - brcblkxend = - int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; - brcblkyend = - int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; + tlcblkxstart = int_floordivpow2(prc->x0, cblkwidthexpn) << cblkwidthexpn; + tlcblkystart = int_floordivpow2(prc->y0, cblkheightexpn) << cblkheightexpn; + brcblkxend = int_ceildivpow2(prc->x1, cblkwidthexpn) << cblkwidthexpn; + brcblkyend = int_ceildivpow2(prc->y1, cblkheightexpn) << cblkheightexpn; prc->cw = (brcblkxend - tlcblkxstart) >> cblkwidthexpn; prc->ch = (brcblkyend - tlcblkystart) >> cblkheightexpn; - prc->cblks = - (tcd_cblk_t *) malloc(prc->cw * prc->ch * - sizeof(tcd_cblk_t)); + prc->cblks = (tcd_cblk_t *) malloc(prc->cw * prc->ch * sizeof(tcd_cblk_t)); prc->incltree = tgt_create(prc->cw, prc->ch); prc->imsbtree = tgt_create(prc->cw, prc->ch); for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - int cblkxstart = - tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); - int cblkystart = - tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); + int cblkxstart = tlcblkxstart + (cblkno % prc->cw) * (1 << cblkwidthexpn); + int cblkystart = tlcblkystart + (cblkno / prc->cw) * (1 << cblkheightexpn); int cblkxend = cblkxstart + (1 << cblkwidthexpn); int cblkyend = cblkystart + (1 << cblkheightexpn); tcd_cblk_t *cblk = &prc->cblks[cblkno]; @@ -876,119 +677,95 @@ void tcd_init(j2k_image_t * img, j2k_cp_t * cp) /* tcd_dump(&tcd_image,0); */ } -void tcd_makelayer_fixed(int layno, int matrice_data[2][5][3], int final) -{ - int compno, resno, bandno, precno, cblkno; - int vector[3], matrice[2][5][3]; - int sum_mat, i, j, k; - for (compno = 0; compno < tcd_tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tcd_tile->comps[compno]; - for (i = 0; i < 2; i++) { - for (j = 0; j < 5; j++) { - for (k = 0; k < 3; k++) { - matrice[i][j][k] = - (int) (matrice_data[i][j][k] * - (float) (tcd_img->comps[compno].prec / 16.0)); - } - } - } - for (resno = 0; resno < tilec->numresolutions; resno++) { - tcd_resolution_t *res = &tilec->resolutions[resno]; - for (bandno = 0; bandno < res->numbands; bandno++) { - tcd_band_t *band = &res->bands[bandno]; - for (precno = 0; precno < res->pw * res->ph; precno++) { - tcd_precinct_t *prc = &band->precincts[precno]; - for (cblkno = 0; cblkno < prc->cw * prc->ch; cblkno++) { - tcd_cblk_t *cblk = &prc->cblks[cblkno]; - tcd_layer_t *layer = &cblk->layers[layno]; - int i, n; - int imsb = tcd_img->comps[compno].prec - cblk->numbps; /* number of bit-plan equal to zero */ - /* Correction of the matrix of coefficient to include the IMSB information */ - sum_mat = 0; - - for (i = 0; i < layno + 1; i++) { - int mat_old; - if (i != tcd_tcp->numlayers) { /* -1 must add to have a lossless last quality layer */ - /* different quality (layer) */ - vector[bandno] = matrice[i][resno][bandno]; - sum_mat += vector[bandno]; - } else { - /* Full quality (layer) */ - vector[bandno] = tcd_img->comps[compno].prec - sum_mat; - } - - mat_old = vector[bandno]; - if (imsb > 0) { - if (imsb >= vector[bandno]) { - vector[bandno] = 0; - } else { - vector[bandno] -= imsb; - } - imsb -= mat_old; - } - } - if (layno == 0) { - cblk->numpassesinlayers = 0; - } - n = cblk->numpassesinlayers; - if (cblk->numpassesinlayers == 0) { - if (vector[bandno] != 0) { - n = 3 * vector[bandno] - 2 + cblk->numpassesinlayers; - } else { - n = cblk->numpassesinlayers; - } - - } else { - n = 3 * vector[bandno] + cblk->numpassesinlayers; - } - - layer->numpasses = n - cblk->numpassesinlayers; - - if (!layer->numpasses) { - continue; - } - if (cblk->numpassesinlayers == 0) { - layer->len = cblk->passes[n - 1].rate; - layer->data = cblk->data; - } else { - layer->len = - cblk->passes[n - 1].rate - - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = - cblk->data + cblk->passes[cblk->numpassesinlayers - - 1].rate; - } - if (final) { - cblk->numpassesinlayers = n; - } - } - } - } - } +void tcd_makelayer_fixed(int layno, int final) { + int compno, resno, bandno, precno, cblkno; + int value; //, matrice[tcd_tcp->numlayers][tcd_tile->comps[0].numresolutions][3]; + int matrice[10][10][3]; + int i,j,k; + + /*matrice=(int*)malloc(tcd_tcp->numlayers*tcd_tile->comps[0].numresolutions*3*sizeof(int));*/ + + for (compno=0; compno<tcd_tile->numcomps; compno++) + { + tcd_tilecomp_t *tilec=&tcd_tile->comps[compno]; + for (i=0;i<tcd_tcp->numlayers;i++) { + for (j=0;j<tilec->numresolutions;j++) { + for (k=0;k<3;k++) { + matrice[i][j][k]=(int)(tcd_cp->matrice[i*tilec->numresolutions*3+j*3+k]*(float)(tcd_img->comps[compno].prec/16.0));}}} + + for (resno=0; resno<tilec->numresolutions; resno++) { + tcd_resolution_t *res=&tilec->resolutions[resno]; + for (bandno=0; bandno<res->numbands; bandno++) { + tcd_band_t *band=&res->bands[bandno]; + for (precno=0; precno<res->pw*res->ph; precno++) { + tcd_precinct_t *prc=&band->precincts[precno]; + for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) { + tcd_cblk_t *cblk=&prc->cblks[cblkno]; + tcd_layer_t *layer=&cblk->layers[layno]; + int n; + int imsb=tcd_img->comps[compno].prec-cblk->numbps; /* number of bit-plan equal to zero */ + /* Correction of the matrix of coefficient to include the IMSB information */ + + if (layno==0) + { + value=matrice[layno][resno][bandno]; + if (imsb>=value) + value=0; + else + value-=imsb; + } else + { + value=matrice[layno][resno][bandno]-matrice[layno-1][resno][bandno]; + if (imsb>=matrice[layno-1][resno][bandno]) + { + value-=(imsb-matrice[layno-1][resno][bandno]); + if (value<0) value=0; + } + } + + if (layno==0) + cblk->numpassesinlayers=0; + + n=cblk->numpassesinlayers; + if (cblk->numpassesinlayers==0) + { + if (value!=0) + n=3*value-2+cblk->numpassesinlayers; + else + n=cblk->numpassesinlayers; + } else + n=3*value+cblk->numpassesinlayers; + + layer->numpasses=n-cblk->numpassesinlayers; + + if (!layer->numpasses) + continue; + + if (cblk->numpassesinlayers==0) + { + layer->len=cblk->passes[n-1].rate; + layer->data=cblk->data; + } else + { + layer->len=cblk->passes[n-1].rate-cblk->passes[cblk->numpassesinlayers-1].rate; + layer->data=cblk->data+cblk->passes[cblk->numpassesinlayers-1].rate; + } + if (final) + cblk->numpassesinlayers=n; + } + } } - + } + } } -void tcd_rateallocate_fixed(unsigned char *dest, int len, - info_image * info_IM) -{ - int layno; - int matrice[2][5][3] = { {{16, 0, 0}, - {16, 16, 16}, - {16, 16, 16}, - {0, 0, 0}, - {0, 0, 0}}, - - {{1, 0, 0}, - {1, 1, 1}, - {1, 1, 1}, - {1, 1, 1}, - {0, 0, 0}} - }; +void tcd_rateallocate_fixed() { + int layno; - for (layno = 0; layno < tcd_tcp->numlayers; layno++) { - tcd_makelayer_fixed(layno, matrice, 1); - } + for (layno=0; layno<tcd_tcp->numlayers; layno++) + { + tcd_makelayer_fixed(layno, 1); + } } void tcd_makelayer(int layno, double thresh, int final) @@ -1021,8 +798,7 @@ void tcd_makelayer(int layno, double thresh, int final) dd = pass->distortiondec; } else { dr = pass->rate - cblk->passes[n - 1].rate; - dd = - pass->distortiondec - cblk->passes[n - 1].distortiondec; + dd = pass->distortiondec - cblk->passes[n - 1].distortiondec; } if (dr == 0) { if (dd != 0) @@ -1040,15 +816,11 @@ void tcd_makelayer(int layno, double thresh, int final) layer->data = cblk->data; layer->disto = cblk->passes[n - 1].distortiondec; } else { - layer->len = - cblk->passes[n - 1].rate - - cblk->passes[cblk->numpassesinlayers - 1].rate; - layer->data = - cblk->data + cblk->passes[cblk->numpassesinlayers - - 1].rate; - layer->disto = - cblk->passes[n - 1].distortiondec - - cblk->passes[cblk->numpassesinlayers - 1].distortiondec; + layer->len = cblk->passes[n - 1].rate - + cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->data = cblk->data + cblk->passes[cblk->numpassesinlayers - 1].rate; + layer->disto = cblk->passes[n - 1].distortiondec - + cblk->passes[cblk->numpassesinlayers - 1].distortiondec; } if (final) @@ -1086,9 +858,7 @@ void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM) dd = pass->distortiondec; } else { dr = pass->rate - cblk->passes[passno - 1].rate; - dd = - pass->distortiondec - cblk->passes[passno - - 1].distortiondec; + dd = pass->distortiondec - cblk->passes[passno - 1].distortiondec; } if (dr == 0) { continue; @@ -1100,13 +870,15 @@ void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM) if (rdslope > max) { max = rdslope; } - } /* passno */ - } /* cbklno */ - } /* precno */ - } /* bandno */ - } /* resno */ - } /* compno */ - + } /* passno */ + } /* cbklno */ + } /* precno */ + } /* bandno */ + } /* resno */ + } /* compno */ + if (info_IM->index_on) { /* Threshold for Marcela Index */ + info_IM->tile[tcd_tileno].thresh=(double*)malloc(tcd_tcp->numlayers*sizeof(double)); + } for (layno = 0; layno < tcd_tcp->numlayers; layno++) { volatile double lo = min; volatile double hi = max; @@ -1122,9 +894,7 @@ void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM) tcd_makelayer(layno, thresh, 0); - l = - t2_encode_packets(tcd_img, tcd_cp, tcd_tileno, tcd_tile, layno + 1, - dest, maxlen, info_IM); + l = t2_encode_packets(tcd_img, tcd_cp, tcd_tileno, tcd_tile, layno + 1, dest, maxlen, info_IM); /* fprintf(stderr, "rate alloc: len=%d, max=%d\n", l, maxlen); */ if (l == -999) { lo = thresh; @@ -1140,16 +910,19 @@ void tcd_rateallocate(unsigned char *dest, int len, info_image * info_IM) if (!success) { longjmp(j2k_error, 1); } + + if (info_IM->index_on) { /* Threshold for Marcela Index */ + info_IM->tile[tcd_tileno].thresh[layno]=goodthresh; + } tcd_makelayer(layno, goodthresh, 1); } } -int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, - info_image * info_IM) +int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, info_image * info_IM) { int compno; int l; - clock_t time7; /* , time2, time3, time4, time5, time6, time1; */ + clock_t time7; tcd_tile_t *tile; j2k_tcp_t *tcp = &tcd_cp->tcps[0]; j2k_tccp_t *tccp = &tcp->tccps[0]; @@ -1176,7 +949,6 @@ int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, /*---------------TILE-------------------*/ time7 = clock(); - /* time1=clock(); */ for (compno = 0; compno < tile->numcomps; compno++) { FILE *src; @@ -1186,9 +958,7 @@ int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, int i, j; int tw, w; tcd_tilecomp_t *tilec = &tile->comps[compno]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - - 1); + int adjust = tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - 1); int offset_x, offset_y; offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx); @@ -1204,110 +974,71 @@ int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, /* read the Compo file to extract data of the tile */ k = 0; - fseek(src, (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w, - SEEK_SET); + fseek(src, (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w, SEEK_SET); k = (tilec->x0 - offset_x) + (tilec->y0 - offset_y) * w; for (j = tilec->y0; j < tilec->y1; j++) { for (i = tilec->x0; i < tilec->x1; i++) { if (tcd_tcp->tccps[compno].qmfbid == 1) { elmt = fgetc(src); - tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = - elmt - adjust; + tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = elmt - adjust; k++; } else if (tcd_tcp->tccps[compno].qmfbid == 0) { elmt = fgetc(src); - tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = - (elmt - adjust) << 13; + tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] = (elmt - adjust) << 13; k++; } } - fseek(src, (tilec->x0 - offset_x) + (j + 1 - offset_y) * w - k, - SEEK_CUR); + fseek(src, (tilec->x0 - offset_x) + (j + 1 - offset_y) * w - k, SEEK_CUR); k = tilec->x0 - offset_x + (j + 1 - offset_y) * w; } fclose(src); } - /* time1=clock()-time1; */ - /* printf("tile encoding times:\n"); */ - /* printf("img->tile: %d.%.3d s\n", time1/CLOCKS_PER_SEC, (time1%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - /*----------------MCT-------------------*/ - /* time2=clock(); */ if (tcd_tcp->mct) { if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_encode_real(tile->comps[0].data, tile->comps[1].data,tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } } - /* time2=clock()-time2; */ - /* printf("mct: %ld.%.3ld s\n", time2/CLOCKS_PER_SEC, (time2%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - /*----------------DWT---------------------*/ /* time3=clock(); */ for (compno = 0; compno < tile->numcomps; compno++) { tcd_tilecomp_t *tilec = &tile->comps[compno]; if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, - tilec, tilec->numresolutions - 1); + dwt_encode(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1); + dwt_encode_real(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); } } - /* time3=clock()-time3; */ - /* printf("dwt: %ld.%.3ld s\n", time3/CLOCKS_PER_SEC, (time3%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - /*------------------TIER1-----------------*/ - /* time4=clock(); */ t1_init_luts(); t1_encode_cblks(tile, tcd_tcp); - /* time4=clock()-time4; */ - /* printf("tier 1: %ld.%.3ld s\n", time4/CLOCKS_PER_SEC, (time4%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ /*-----------RATE-ALLOCATE------------------*/ - info_IM->index_write = 0; /* INDEX */ - /* time5=clock(); */ + if (tcd_cp->disto_alloc) - /* Normal Rate/distortion allocation */ - tcd_rateallocate(dest, len, info_IM); + /* Normal Rate/distortion allocation */ + tcd_rateallocate(dest, len, info_IM); else - /* Fixed layer allocation */ - tcd_rateallocate_fixed(dest, len, info_IM); - - /* time5=clock()-time5; */ - /* printf("ratealloc: %ld.%.3ld s\n", time5/CLOCKS_PER_SEC, (time5%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - + /* Fixed layer allocation */ + tcd_rateallocate_fixed(); + /*--------------TIER2------------------*/ - info_IM->index_write = 1; /* INDEX */ - /* time6=clock(); */ - l = - t2_encode_packets(tcd_img, tcd_cp, tileno, tile, tcd_tcp->numlayers, - dest, len, info_IM); - /* time6=clock()-time6; */ - /* printf("tier 2: %ld.%.3ld s\n", time6/CLOCKS_PER_SEC, (time6%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - + l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile, tcd_tcp->numlayers, dest, len, info_IM); /*---------------CLEAN-------------------*/ time7 = clock() - time7; - printf("total: %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC, - (time7 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); + printf("total: %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC, (time7 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); /* cleaning memory */ for (compno = 0; compno < tile->numcomps; compno++) { @@ -1318,12 +1049,11 @@ int tcd_encode_tile_pxm(int tileno, unsigned char *dest, int len, return l; } -int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, - info_image * info_IM) +int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, info_image * info_IM) { int compno; int l; - clock_t time7; /* , time2, time3, time4, time5, time6, time1; */ + clock_t time7; tcd_tile_t *tile; j2k_tcp_t *tcp = &tcd_cp->tcps[0]; j2k_tccp_t *tccp = &tcp->tccps[0]; @@ -1346,7 +1076,7 @@ int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, /* << INDEX */ /*---------------TILE-------------------*/ time7 = clock(); - /* time1=clock(); */ + for (compno = 0; compno < tile->numcomps; compno++) { FILE *src; char tmp[256]; @@ -1355,9 +1085,7 @@ int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, int i, j; int tw, w; tcd_tilecomp_t *tilec = &tile->comps[compno]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - - 1); + int adjust = tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - 1); int offset_x, offset_y; offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx); @@ -1397,75 +1125,54 @@ int tcd_encode_tile_pgx(int tileno, unsigned char *dest, int len, fclose(src); } - /* time1=clock()-time1; */ - /* printf("tile encoding times:\n"); */ - /* printf("img->tile: %d.%.3d s\n", time1/CLOCKS_PER_SEC, (time1%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ /*----------------MCT-------------------*/ - /* time2=clock(); */ + if (tcd_tcp->mct) { if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_encode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_encode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } else { - mct_encode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_encode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } } - /* time2=clock()-time2; */ - /* printf("mct: %d.%.3d s\n", time2/CLOCKS_PER_SEC, (time2%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ - /*----------------DWT---------------------*/ - /* time3=clock(); */ + for (compno = 0; compno < tile->numcomps; compno++) { tcd_tilecomp_t *tilec = &tile->comps[compno]; if (tcd_tcp->tccps[compno].qmfbid == 1) { - dwt_encode(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, - tilec, tilec->numresolutions - 1); + dwt_encode(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - dwt_encode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1); + dwt_encode_real(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); } } - /* time3=clock()-time3; */ - /* printf("dwt: %d.%.3d s\n", time3/CLOCKS_PER_SEC, (time3%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ /*------------------TIER1-----------------*/ - /* time4=clock(); */ + t1_init_luts(); t1_encode_cblks(tile, tcd_tcp); - /* time4=clock()-time4; */ - /* printf("tier 1: %d.%.3d s\n", time4/CLOCKS_PER_SEC, (time4%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ /*-----------RATE-ALLOCATE------------------*/ info_IM->index_write = 0; /* INDEX */ - /* time5=clock(); */ - tcd_rateallocate(dest, len, info_IM); - /* time5=clock()-time5; */ - /* printf("ratealloc: %d.%.3d s\n", time5/CLOCKS_PER_SEC, (time5%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ + info_IM->index_write=0; /* INDEX */ + + if (tcd_cp->disto_alloc) + /* Normal Rate/distortion allocation */ + tcd_rateallocate(dest, len, info_IM); + else + /* Fixed layer allocation */ + tcd_rateallocate_fixed(); /*--------------TIER2------------------*/ info_IM->index_write = 1; /* INDEX */ - /* time6=clock(); */ - l = - t2_encode_packets(tcd_img, tcd_cp, tileno, tile, tcd_tcp->numlayers, - dest, len, info_IM); - /* time6=clock()-time6; */ - /* printf("tier 2: %d.%.3d s\n", time6/CLOCKS_PER_SEC, (time6%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ + l = t2_encode_packets(tcd_img, tcd_cp, tileno, tile, tcd_tcp->numlayers, dest, len, info_IM); /*---------------CLEAN-------------------*/ time7 = clock() - time7; - printf("total: %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC, - (time7 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); + printf("total: %ld.%.3ld s\n", time7 / CLOCKS_PER_SEC, (time7 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); for (compno = 0; compno < tile->numcomps; compno++) { tilec = &tile->comps[compno]; @@ -1482,8 +1189,8 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) int compno; int eof = 0; clock_t time1, time2, time3, time4, time5, time6; - tcd_tile_t *tile; + tcd_tileno = tileno; tcd_tile = &tcd_image.tiles[tileno]; tcd_tcp = &tcd_cp->tcps[tileno]; @@ -1492,15 +1199,16 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) time6 = clock(); time1 = clock(); + printf("tile decoding time %d/%d:\n", tileno + 1, tcd_cp->tw * tcd_cp->th); l = t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile); + if (l == -999) { eof = 1; fprintf(stderr, "tcd_decode: incomplete bistream\n"); } time1 = clock() - time1; - printf("tile decoding time %d/%d:\n", tileno + 1, - tcd_cp->tw * tcd_cp->th); + /* printf("tier 2: %ld.%.3ld s\n", time1/CLOCKS_PER_SEC, (time1%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ time2 = clock(); @@ -1510,79 +1218,29 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) /* printf("tier 1: %ld.%.3ld s\n", time2/CLOCKS_PER_SEC, (time2%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ time3 = clock(); - for (compno = 0; compno < tile->numcomps; compno++) { - tcd_tilecomp_t *tilec = &tile->comps[compno]; - if (tcd_tcp->tccps[compno].qmfbid == 1) { - if (tileno % tcd_cp->tw) { - tcd_tile_t *tile_row = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_row = &tile_row->comps[compno]; - if (tileno / tcd_cp->tw) { - tcd_tile_t *tile_col = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_col = &tile_col->comps[compno]; - dwt_decode(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec_row, tilec_col); - } else - dwt_decode(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec_row, tilec); - } else { - if (tileno / tcd_cp->tw) { - tcd_tile_t *tile_col = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_col = &tile_col->comps[compno]; - dwt_decode(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec, tilec_col); - } else - dwt_decode(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec, tilec); - } - } else if (tcd_tcp->tccps[compno].qmfbid == 0) { - if (tileno % tcd_cp->tw) { - tcd_tile_t *tile_row = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_row = &tile_row->comps[compno]; - if (tileno / tcd_cp->tw) { - tcd_tile_t *tile_col = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_col = &tile_col->comps[compno]; - dwt_decode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec_row, tilec_col); - } else - dwt_decode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec_row, tilec); - } else { - if (tileno / tcd_cp->tw) { - tcd_tile_t *tile_col = &tcd_image.tiles[tileno - 1]; - tcd_tilecomp_t *tilec_col = &tile_col->comps[compno]; - dwt_decode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec, tilec_col); - } else - dwt_decode_real(tilec->data, tilec->x1 - tilec->x0, - tilec->y1 - tilec->y0, tilec, - tilec->numresolutions - 1, tilec, tilec); - } - } - } + for (compno = 0; compno < tile->numcomps; compno++) + { + tcd_tilecomp_t *tilec = &tile->comps[compno]; + if (tcd_tcp->tccps[compno].qmfbid == 1) + { + dwt_decode(tilec->data, tilec->x1 - tilec->x0,tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); + } else + { /*if (tcd_tcp->tccps[compno].qmfbid == 0) {*/ + dwt_decode_real(tilec->data, tilec->x1 - tilec->x0, tilec->y1 - tilec->y0, tilec, tilec->numresolutions - 1); + } + } + time3 = clock() - time3; /* printf("dwt: %ld.%.3ld s\n", time3/CLOCKS_PER_SEC, (time3%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ time4 = clock(); if (tcd_tcp->mct) { if (tcd_tcp->tccps[0].qmfbid == 0) { - mct_decode_real(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_decode_real(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } else { - mct_decode(tile->comps[0].data, tile->comps[1].data, - tile->comps[2].data, - (tile->comps[0].x1 - - tile->comps[0].x0) * (tile->comps[0].y1 - - tile->comps[0].y0)); + mct_decode(tile->comps[0].data, tile->comps[1].data, tile->comps[2].data, + (tile->comps[0].x1 - tile->comps[0].x0) * (tile->comps[0].y1 - tile->comps[0].y0)); } } time4 = clock() - time4; @@ -1591,19 +1249,11 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) time5 = clock(); for (compno = 0; compno < tile->numcomps; compno++) { tcd_tilecomp_t *tilec = &tile->comps[compno]; - int adjust = - tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - - 1); - int min = - tcd_img->comps[compno]. - sgnd ? -(1 << (tcd_img->comps[compno].prec - 1)) : 0; - int max = - tcd_img->comps[compno]. - sgnd ? (1 << (tcd_img->comps[compno].prec - 1)) - 1 - : (1 << tcd_img->comps[compno].prec) - 1; + int adjust = tcd_img->comps[compno].sgnd ? 0 : 1 << (tcd_img->comps[compno].prec - 1); + int min = tcd_img->comps[compno].sgnd ? -(1 << (tcd_img->comps[compno].prec - 1)) : 0; + int max = tcd_img->comps[compno].sgnd ? (1 << (tcd_img->comps[compno].prec - 1)) - 1 : (1 << tcd_img->comps[compno].prec) - 1; int tw = tilec->x1 - tilec->x0; - int w = - int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx); + int w = int_ceildiv(tcd_img->x1 - tcd_img->x0, tcd_img->comps[compno].dx); int i, j; int offset_x = int_ceildiv(tcd_img->x0, tcd_img->comps[compno].dx); int offset_y = int_ceildiv(tcd_img->y0, tcd_img->comps[compno].dy); @@ -1617,6 +1267,7 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) v = tilec->data[i - tilec->x0 + (j - tilec->y0) * tw] >> 13; } v += adjust; + /* tcd_img->comps[compno].data[i+j*w]=int_clamp(v, min, max); */ tcd_img->comps[compno].data[(i - offset_x) + (j - offset_y) * w] = int_clamp(v, min, max); /* change ! */ } @@ -1626,8 +1277,7 @@ int tcd_decode_tile(unsigned char *src, int len, int tileno) /* printf("tile->img: %ld.%.3ld s\n", time5/CLOCKS_PER_SEC, (time5%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); */ time6 = clock() - time6; - printf("total: %ld.%.3ld s\n\n", time6 / CLOCKS_PER_SEC, - (time6 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); + printf("total: %ld.%.3ld s\n\n", time6 / CLOCKS_PER_SEC, (time6 % CLOCKS_PER_SEC) * 1000 / CLOCKS_PER_SEC); if (eof) { longjmp(j2k_error, 1); |
