📄 tcd.c
字号:
/* * Copyright (c) 2001-2002, David Janssens * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS' * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */#define TIME_H_NOT_AVAILABLE#include "tcd.h"#include "int.h"#include "t1.h"#include "t2.h"#include "dwt.h"#include "mct.h"#include <setjmp.h>#include <float.h>#include <stdio.h>#ifndef TIME_H_NOT_AVAILABLE#include <time.h>#endif#include <math.h>#include <stdlib.h>#include <string.h>tcd_image_t tcd_image;j2k_image_t *tcd_img;j2k_cp_t *tcd_cp;tcd_tile_t *tcd_tile;j2k_tcp_t *tcd_tcp;int tcd_tileno;extern jmp_buf j2k_error;extern void * matlab_ex_data;extern void * matlab_in_data;extern void * taille_x_e;extern void * taille_y_e;void tcd_dump(tcd_image_t *img) { int tileno, compno, resno, bandno, precno, cblkno; fprintf(stderr, "image {\n"); fprintf(stderr, " tw=%d, th=%d\n", img->tw, img->th); for (tileno=0; tileno<img->tw*img->th; tileno++) { tcd_tile_t *tile=&tcd_image.tiles[tileno]; fprintf(stderr, " tile {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, numcomps=%d\n", tile->x0, tile->y0, tile->x1, tile->y1, tile->numcomps); for (compno=0; compno<tile->numcomps; compno++) { tcd_tilecomp_t *tilec=&tile->comps[compno]; fprintf(stderr, " tilec {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, numresolutions=%d\n", tilec->x0, tilec->y0, tilec->x1, tilec->y1, tilec->numresolutions); for (resno=0; resno<tilec->numresolutions; resno++) { tcd_resolution_t *res=&tilec->resolutions[resno]; fprintf(stderr, " res {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, pw=%d, ph=%d, numbands=%d\n", res->x0, res->y0, res->x1, res->y1, res->pw, res->ph, res->numbands); for (bandno=0; bandno<res->numbands; bandno++) { tcd_band_t *band=&res->bands[bandno]; fprintf(stderr, " band {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, stepsize=%d, numbps=%d\n", band->x0, band->y0, band->x1, band->y1, band->stepsize, band->numbps); for (precno=0; precno<res->pw*res->ph; precno++) { tcd_precinct_t *prec=&band->precincts[precno]; fprintf(stderr, " prec {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d, cw=%d, ch=%d\n", prec->x0, prec->y0, prec->x1, prec->y1, prec->cw, prec->ch); for (cblkno=0; cblkno<prec->cw*prec->ch; cblkno++) { tcd_cblk_t *cblk=&prec->cblks[cblkno]; fprintf(stderr, " cblk {\n"); fprintf(stderr, " x0=%d, y0=%d, x1=%d, y1=%d\n", cblk->x0, cblk->y0, cblk->x1, cblk->y1); fprintf(stderr, " }\n"); } fprintf(stderr, " }\n"); } fprintf(stderr, " }\n"); } fprintf(stderr, " }\n"); } fprintf(stderr, " }\n"); } fprintf(stderr, " }\n"); } fprintf(stderr, "}\n");}void tcd_init(j2k_image_t *img, j2k_cp_t *cp) { int tileno, compno, resno, bandno, precno, cblkno; tcd_img=img; 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)); 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 p=tileno%cp->tw; int q=tileno/cp->tw; tile->x0=int_max(cp->tx0+p*cp->tdx, img->x0); 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); tile->numcomps=img->numcomps; 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]; tilec->x0=int_ceildiv(tile->x0, img->comps[compno].dx); 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); 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)); for (resno=0; resno<tilec->numresolutions; resno++) { int pdx, pdy; int levelno=tilec->numresolutions-1-resno; int tlprcxstart, tlprcystart, brprcxend, brprcyend; int tlcbgxstart, tlcbgystart, brcbgxend, brcbgyend; int cbgwidthexpn, cbgheightexpn; int cblkwidthexpn, cblkheightexpn; tcd_resolution_t *res=&tilec->resolutions[resno]; res->x0=int_ceildivpow2(tilec->x0, levelno); res->y0=int_ceildivpow2(tilec->y0, levelno); res->x1=int_ceildivpow2(tilec->x1, levelno); res->y1=int_ceildivpow2(tilec->y1, levelno); res->numbands=resno==0?1:3; if (tccp->csty&J2K_CCP_CSTY_PRT) { pdx=tccp->prcw[resno]; pdy=tccp->prch[resno]; } else { pdx=15; pdy=15; } tlprcxstart=int_floordivpow2(res->x0, pdx)<<pdx; tlprcystart=int_floordivpow2(res->y0, pdy)<<pdy; brprcxend=int_ceildivpow2(res->x1, pdx)<<pdx; brprcyend=int_ceildivpow2(res->y1, pdy)<<pdy; res->pw=(brprcxend-tlprcxstart)>>pdx; res->ph=(brprcyend-tlprcystart)>>pdy; if (resno==0) { tlcbgxstart=tlprcxstart; tlcbgystart=tlprcystart; brcbgxend=brprcxend; brcbgyend=brprcyend; cbgwidthexpn=pdx; cbgheightexpn=pdy; } else { tlcbgxstart=int_ceildivpow2(tlprcxstart, 1); tlcbgystart=int_ceildivpow2(tlprcystart, 1); brcbgxend=int_ceildivpow2(brprcxend, 1); brcbgyend=int_ceildivpow2(brprcyend, 1); cbgwidthexpn=pdx-1; cbgheightexpn=pdy-1; } cblkwidthexpn=int_min(tccp->cblkw, cbgwidthexpn); cblkheightexpn=int_min(tccp->cblkh, cbgheightexpn); for (bandno=0; bandno<res->numbands; bandno++) { int x0b, y0b; int gain, numbps; j2k_stepsize_t *ss; tcd_band_t *band=&res->bands[bandno]; band->bandno=resno==0?0:bandno+1; x0b=(band->bandno==1)||(band->bandno==3)?1:0; y0b=(band->bandno==2)||(band->bandno==3)?1:0; if (band->bandno==0) { band->x0=int_ceildivpow2(tilec->x0, levelno); band->y0=int_ceildivpow2(tilec->y0, levelno); 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); } 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->numbps=ss->expn+tccp->numgbits-1; /* WHY -1 ? */ 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 cbgxend=cbgxstart+(1<<cbgwidthexpn); int cbgyend=cbgystart+(1<<cbgheightexpn); tcd_precinct_t *prc=&band->precincts[precno]; prc->x0=int_max(cbgxstart, band->x0); prc->y0=int_max(cbgystart, band->y0); 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; 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->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 cblkxend=cblkxstart+(1<<cblkwidthexpn); int cblkyend=cblkystart+(1<<cblkheightexpn); tcd_cblk_t *cblk=&prc->cblks[cblkno]; cblk->x0=int_max(cblkxstart, prc->x0); cblk->y0=int_max(cblkystart, prc->y0); cblk->x1=int_min(cblkxend, prc->x1); cblk->y1=int_min(cblkyend, prc->y1); } } } } } } /* tcd_dump(&tcd_image); */}void tcd_makelayer(int layno, double thresh, int final) { int compno, resno, bandno, precno, cblkno, passno; for (compno=0; compno<tcd_tile->numcomps; compno++) { tcd_tilecomp_t *tilec=&tcd_tile->comps[compno]; 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; if (layno==0) { cblk->numpassesinlayers=0; } n=cblk->numpassesinlayers; for (passno=cblk->numpassesinlayers; passno<cblk->totalpasses; passno++) { int dr; double dd; tcd_pass_t *pass=&cblk->passes[passno]; if (n==0) { dr=pass->rate; dd=pass->distortiondec; } else { dr=pass->rate-cblk->passes[n-1].rate; dd=pass->distortiondec-cblk->passes[n-1].distortiondec; } if (dr==0) { if (dd!=0) { n=passno+1; } continue; } if (dd/dr>thresh) { n=passno+1; } } 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(unsigned char *dest, int len) { int compno, resno, bandno, precno, cblkno, passno, layno; double min, max; min=DBL_MAX;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -