tcd.c
来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 587 行 · 第 1/2 页
C
587 行
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; max=0; 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]; for (passno=0; passno<cblk->totalpasses; passno++) { tcd_pass_t *pass=&cblk->passes[passno]; int dr; double dd, rdslope; if (passno==0) { dr=pass->rate; dd=pass->distortiondec; } else { dr=pass->rate-cblk->passes[passno-1].rate; dd=pass->distortiondec-cblk->passes[passno-1].distortiondec; } if (dr==0) { continue; } rdslope=dd/dr; if (rdslope<min) { min=rdslope; } if (rdslope>max) { max=rdslope; } } } } } } } for (layno=0; layno<tcd_tcp->numlayers; layno++) { volatile double lo=min; volatile double hi=max; volatile int success=0; volatile int maxlen=int_min(tcd_tcp->rates[layno], len); volatile double goodthresh; volatile int goodlen; volatile jmp_buf oldenv; volatile int i; memcpy((void*)oldenv, j2k_error, sizeof(jmp_buf)); for (i=0; i<32; i++) { volatile double thresh=(lo+hi)/2; int l; tcd_makelayer(layno, thresh, 0); if (setjmp(j2k_error)) { lo=thresh; continue; } l=t2_encode_packets(tcd_img, tcd_cp, tcd_tileno, tcd_tile, layno+1, dest, maxlen); J2KDUMP2("rate alloc: len=%d, max=%d\n", l, maxlen); hi=thresh; success=1; goodthresh=thresh; goodlen=l; } memcpy(j2k_error, (void*)oldenv, sizeof(jmp_buf)); if (!success) { longjmp(j2k_error, 1); } tcd_makelayer(layno, goodthresh, 1); }}int tcd_encode_tile(int tileno, unsigned char *dest, int len) { int compno; int l; clock_t time1, time2, time3, time4, time5, time6, time7; tcd_tile_t *tile; tcd_tileno=tileno; tcd_tile=&tcd_image.tiles[tileno]; tcd_tcp=&tcd_cp->tcps[tileno]; tile=tcd_tile; time7=clock(); time1=clock(); for (compno=0; compno<tile->numcomps; compno++) { 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); tw=tilec->x1-tilec->x0; w=int_ceildiv(tcd_img->x1-tcd_img->x0, tcd_img->comps[compno].dx); for (j=tilec->y0; j<tilec->y1; j++) { for (i=tilec->x0; i<tilec->x1; i++) { if (tcd_tcp->tccps[compno].qmfbid==1) { tilec->data[i-tilec->x0+(j-tilec->y0)*tw]=tcd_img->comps[compno].data[i+j*w]-adjust; } else if (tcd_tcp->tccps[compno].qmfbid==0) { tilec->data[i-tilec->x0+(j-tilec->y0)*tw]=(tcd_img->comps[compno].data[i+j*w]-adjust)<<13; } } } } time1=clock()-time1; 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)); } 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)); } } time2=clock()-time2; 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->numresolutions-1); } else if (tcd_tcp->tccps[compno].qmfbid==0) { dwt_encode_real(tilec->data, tilec->x1-tilec->x0, tilec->y1-tilec->y0, tilec->numresolutions-1); } } time3=clock()-time3; time4=clock(); t1_init_luts(); t1_encode_cblks(tile, tcd_tcp); time4=clock()-time4; time5=clock(); tcd_rateallocate(dest, len); time5=clock()-time5; time6=clock(); l=t2_encode_packets(tcd_img, tcd_cp, tileno, tile, tcd_tcp->numlayers, dest, len); time6=clock()-time6; time7=clock()-time7;#if J2K_DUMP_ENABLED printf("tile encoding times:\n"); printf("img->tile: %d.%.3d s\n", time1/CLOCKS_PER_SEC, (time1%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("mct: %d.%.3d s\n", time2/CLOCKS_PER_SEC, (time2%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("dwt: %d.%.3d s\n", time3/CLOCKS_PER_SEC, (time3%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("tier 1: %d.%.3d s\n", time4/CLOCKS_PER_SEC, (time4%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("ratealloc: %d.%.3d s\n", time5/CLOCKS_PER_SEC, (time5%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("tier 2: %d.%.3d s\n", time6/CLOCKS_PER_SEC, (time6%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("total: %d.%.3d s\n", time7/CLOCKS_PER_SEC, (time7%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC);#endif //J2K_DUMP_ENABLED
return l;}int tcd_decode_tile(unsigned char *src, int len, int tileno) { int l; int compno; int eof=0; jmp_buf oldenv; 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]; tile=tcd_tile; time6=clock(); time1=clock(); memcpy(oldenv, j2k_error, sizeof(jmp_buf)); if (setjmp(j2k_error)) { eof=1; J2KWARNING("tcd_decode: incomplete bistream\n") } else { l=t2_decode_packets(src, len, tcd_img, tcd_cp, tileno, tile); } memcpy(j2k_error, oldenv, sizeof(jmp_buf)); time1=clock()-time1; time2=clock(); t1_init_luts(); t1_decode_cblks(tile, tcd_tcp); time2=clock()-time2; time3=clock(); 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->numresolutions-1); } else if (tcd_tcp->tccps[compno].qmfbid==0) { dwt_decode_real(tilec->data, tilec->x1-tilec->x0, tilec->y1-tilec->y0, tilec->numresolutions-1); } } time3=clock()-time3; 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)); } 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)); } } time4=clock()-time4; 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 tw=tilec->x1-tilec->x0; int w=int_ceildiv(tcd_img->x1-tcd_img->x0, tcd_img->comps[compno].dx); int i, j; for (j=tilec->y0; j<tilec->y1; j++) { for (i=tilec->x0; i<tilec->x1; i++) { int v; if (tcd_tcp->tccps[compno].qmfbid==1) { v=tilec->data[i-tilec->x0+(j-tilec->y0)*tw]; } else if (tcd_tcp->tccps[compno].qmfbid==0) { 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); } } } time5=clock()-time5; time6=clock()-time6;#if J2K_DUMP_ENABLED
printf("tile decoding times:\n"); printf("tier 2: %d.%.3d s\n", time1/CLOCKS_PER_SEC, (time1%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("tier 1: %d.%.3d s\n", time2/CLOCKS_PER_SEC, (time2%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("dwt: %d.%.3d s\n", time3/CLOCKS_PER_SEC, (time3%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("mct: %d.%.3d s\n", time4/CLOCKS_PER_SEC, (time4%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("tile->img: %d.%.3d s\n", time5/CLOCKS_PER_SEC, (time5%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC); printf("total: %d.%.3d s\n", time6/CLOCKS_PER_SEC, (time6%CLOCKS_PER_SEC)*1000/CLOCKS_PER_SEC);#endif //J2K_DUMP_ENABLED
if (eof) { longjmp(j2k_error, 1); } return l;}
void tcd_destroy(j2k_image_t *img, j2k_cp_t *cp)
{
int tileno, compno, resno, bandno, precno;
for (tileno=0; tileno<cp->tw*cp->th; tileno++) {
tcd_tile_t *tile=&tcd_image.tiles[tileno];
for (compno=0; compno<tile->numcomps; compno++) {
tcd_tilecomp_t *tilec=&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 *prec=&band->precincts[precno];
if (prec[precno].incltree) {tgt_destroy(prec[precno].incltree); prec[precno].incltree=0;}
if (prec[precno].imsbtree) {tgt_destroy(prec[precno].imsbtree); prec[precno].imsbtree=0;}
if (prec[precno].cblks) {free(prec[precno].cblks); prec[precno].cblks=0;}
}
if(band->precincts) {free(band->precincts); band->precincts=0;}
}
}
if (tilec->data) {free(tilec->data); tilec->data=0;}
if (tilec->resolutions) {free(tilec->resolutions); tilec->resolutions=0;}
}
if (tile->comps) {free(tile->comps); tile->comps=0;}
}
if (tcd_image.tiles) {free(tcd_image.tiles); tcd_image.tiles=0;}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?