⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 t1.c

📁 关于JPEG2000压缩标准的模板程序的内容,是我们导师给的,据说是国外的版本.
💻 C
📖 第 1 页 / 共 2 页
字号:
}

void t1_dec_clnpass(int w, int h, int bpno, int orient, int segsym) {
    int i, j, k, one, half, oneplushalf, agg, runlen;
    one=1<<bpno;
    half=one>>1;
    oneplushalf=one|half;
    for (k=0; k<h; k+=4) {
        for (i=0; i<w; i++) {
            if (k+3<h) {
                agg=!(t1_flags[1+k][1+i]&(T1_SIG|T1_VISIT|T1_SIG_OTH) ||
                        t1_flags[1+k+1][1+i]&(T1_SIG|T1_VISIT|T1_SIG_OTH) ||
                        t1_flags[1+k+2][1+i]&(T1_SIG|T1_VISIT|T1_SIG_OTH) ||
                        t1_flags[1+k+3][1+i]&(T1_SIG|T1_VISIT|T1_SIG_OTH));
            } else {
                agg=0;
            }
            if (agg) {
                mqc_setcurctx(T1_CTXNO_AGG);
                if (!mqc_decode()) {
                    continue;
                }
                mqc_setcurctx(T1_CTXNO_UNI);
                runlen=mqc_decode();
                runlen=(runlen<<1)|mqc_decode();
            } else {
                runlen=0;
            }
            for (j=k+runlen; j<k+4 && j<h; j++) {
                t1_dec_clnpass_step(&t1_flags[1+j][1+i], &t1_data[j][i], orient, oneplushalf, agg && (j==k+runlen));
            }
        }
    }
    if (segsym) {
        int v=0;
        mqc_setcurctx(T1_CTXNO_UNI);
        v=mqc_decode();
        v=(v<<1)|mqc_decode();
        v=(v<<1)|mqc_decode();
        v=(v<<1)|mqc_decode();
        if (v!=0xa) {
            fprintf(stderr, "warning: bad segmentation symbol\n");
        }
    }
}

double t1_getwmsedec(int nmsedec, int compno, int level, int orient, int bpno, int qmfbid, double stepsize) {
    double w1, w2, wmsedec;
    if (qmfbid==1) {
        w1=mct_getnorm(compno);
        w2=dwt_getnorm(level, orient);
    } else if (qmfbid==0) {
        w1=mct_getnorm_real(compno);
        w2=dwt_getnorm_real(level, orient);
    }
    wmsedec=w1*w2*stepsize*(1<<bpno);
    wmsedec*=wmsedec*nmsedec/8192.0;
    return wmsedec;
}

void t1_encode_cblk(tcd_cblk_t *cblk, int orient, int compno, int level, int qmfbid, double stepsize) {
    int i, j;
    int w, h;
    int passno;
    int bpno, passtype;
    int max;
    int nmsedec;
    double cumwmsedec=0;

    w=cblk->x1-cblk->x0;
    h=cblk->y1-cblk->y0;

    max=0;
    for (j=0; j<h; j++) {
        for (i=0; i<w; i++) {
            max=int_max(max, int_abs(t1_data[j][i]));
        }
    }
    cblk->numbps=max?(int_floorlog2(max)+1)-T1_NMSEDEC_FRACBITS:0;

    for (i=0; i<sizeof(t1_flags)/sizeof(int); i++) ((int*)t1_flags)[i]=0;

    bpno=cblk->numbps-1;
    passtype=2;

    mqc_resetstates();
    mqc_setstate(T1_CTXNO_UNI, 0, 46);
    mqc_setstate(T1_CTXNO_AGG, 0, 3);
    mqc_setstate(T1_CTXNO_ZC, 0, 4);
    mqc_init_enc(cblk->data);

    for (passno=0; bpno>=0; passno++) {
        tcd_pass_t *pass=&cblk->passes[passno];
        switch (passtype) {
            case 0:
                t1_enc_sigpass(w, h, bpno, orient, &nmsedec);
                break;
            case 1:
                t1_enc_refpass(w, h, bpno, &nmsedec);
                break;
            case 2:
                t1_enc_clnpass(w, h, bpno, orient, &nmsedec);
                break;
        }
        cumwmsedec+=t1_getwmsedec(nmsedec, compno, level, orient, bpno, qmfbid, stepsize);
        pass->distortiondec=cumwmsedec;
        pass->rate=mqc_numbytes()+3; // FIXME
        if (++passtype==3) {
            passtype=0;
            bpno--;
        }
    }
    mqc_flush();

    cblk->totalpasses=passno;
}

void t1_decode_cblk(tcd_cblk_t *cblk, int orient, int roishift, int cblksty) {
    int i;
    int w, h;
    int bpno, passtype;
    int segno, passno;

    for (i=0; i<sizeof(t1_data)/sizeof(int); i++) ((int*)t1_data)[i]=0;
    for (i=0; i<sizeof(t1_flags)/sizeof(int); i++) ((int*)t1_flags)[i]=0;

    w=cblk->x1-cblk->x0;
    h=cblk->y1-cblk->y0;
    bpno=roishift+cblk->numbps-1;
    passtype=2;

    mqc_resetstates();
    mqc_setstate(T1_CTXNO_UNI, 0, 46);
    mqc_setstate(T1_CTXNO_AGG, 0, 3);
    mqc_setstate(T1_CTXNO_ZC, 0, 4);

    for (segno=0; segno<cblk->numsegs; segno++) {
        tcd_seg_t *seg=&cblk->segs[segno];
        //fprintf(stderr, "t1_decode_cblk: segno=%d, seg->len=%d, seg->numpasses=%d\n", segno, seg->len, seg->numpasses);
        mqc_init_dec(seg->data, seg->len);
        for (passno=0; passno<seg->numpasses; passno++) {
            switch (passtype) {
                case 0:
                    t1_dec_sigpass(w, h, bpno, orient);
                    break;
                case 1:
                    t1_dec_refpass(w, h, bpno);
                    break;
                case 2:
                    t1_dec_clnpass(w, h, bpno, orient, cblksty&J2K_CCP_CBLKSTY_SEGSYM);
                    break;
            }
            if (++passtype==3) {
                passtype=0;
                bpno--;
            }
        }
    }
}

void t1_encode_cblks(tcd_tile_t *tile, j2k_tcp_t *tcp) {
    int compno, resno, bandno, precno, cblkno;
    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 *prc=&band->precincts[precno];
                    for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
                        int x, y, i, j, orient;
                        tcd_cblk_t *cblk=&prc->cblks[cblkno];
                        if (band->bandno==0) {
                            x=res->x0+cblk->x0;
                            y=res->y0+cblk->y0;
                        } else if (band->bandno==1) {
                            x=res->x1-(band->x1-band->x0)+cblk->x0;
                            y=res->y0+cblk->y0;
                        } else if (band->bandno==2) {
                            x=res->x0+cblk->x0;
                            y=res->y1-(band->y1-band->y0)+cblk->y0;
                        } else if (band->bandno==3) {
                            x=res->x1-(band->x1-band->x0)+cblk->x0;
                            y=res->y1-(band->y1-band->y0)+cblk->y0;
                        }
                        if (tcp->tccps[compno].qmfbid==1) {
                            for (j=0; j<cblk->y1-cblk->y0; j++) {
                                for (i=0; i<cblk->x1-cblk->x0; i++) {
                                    t1_data[j][i]=tilec->data[x+i+(y+j)*(tilec->x1-tilec->x0)]<<T1_NMSEDEC_FRACBITS;
                                }
                            }
                        } else if (tcp->tccps[compno].qmfbid==0) {
                            for (j=0; j<cblk->y1-cblk->y0; j++) {
                                for (i=0; i<cblk->x1-cblk->x0; i++) {
                                    t1_data[j][i]=fix_mul(tilec->data[x+i+(y+j)*(tilec->x1-tilec->x0)], 8192*8192/band->stepsize)>>(13-T1_NMSEDEC_FRACBITS);
                                }
                            }
                        }
                        orient=band->bandno; // FIXME
                        if (orient==2) orient=1;
                        else if (orient==1) orient=2;
                        t1_encode_cblk(cblk, orient, compno, tilec->numresolutions-1-resno, tcp->tccps[compno].qmfbid, band->stepsize);
                    }
                }
            }
        }
    }
}

void t1_decode_cblks(tcd_tile_t *tile, j2k_tcp_t *tcp) {
    int compno, resno, bandno, precno, cblkno;
    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 *prc=&band->precincts[precno];
                    for (cblkno=0; cblkno<prc->cw*prc->ch; cblkno++) {
                        int x, y, i, j, orient;
                        tcd_cblk_t *cblk=&prc->cblks[cblkno];
                        orient=band->bandno; // FIXME
                        if (orient==2) orient=1;
                        else if (orient==1) orient=2;
                        t1_decode_cblk(cblk, orient, tcp->tccps[compno].roishift, tcp->tccps[compno].cblksty);
                        if (band->bandno==0) {
                            x=cblk->x0-band->x0;
                            y=cblk->y0-band->y0;
                        } else if (band->bandno==1) {
                            tcd_resolution_t *pres=&tilec->resolutions[resno-1];
                            x=pres->x1-pres->x0+cblk->x0-band->x0;
                            y=cblk->y0-band->y0;
                        } else if (band->bandno==2) {
                            tcd_resolution_t *pres=&tilec->resolutions[resno-1];
                            x=cblk->x0-band->x0;
                            y=pres->y1-pres->y0+cblk->y0-band->y0;
                        } else if (band->bandno==3) {
                            tcd_resolution_t *pres=&tilec->resolutions[resno-1];
                            x=pres->x1-pres->x0+cblk->x0-band->x0;
                            y=pres->y1-pres->y0+cblk->y0-band->y0;
                        }
                        if (tcp->tccps[compno].roishift) {
                            int thresh, val, mag;
                            thresh=1<<tcp->tccps[compno].roishift;
                            for (j=0; j<cblk->y1-cblk->y0; j++) {
                                for (i=0; i<cblk->x1-cblk->x0; i++) {
                                    val=t1_data[j][i];
                                    mag=int_abs(val);
                                    if (mag>=thresh) {
                                        mag>>=tcp->tccps[compno].roishift;
                                        t1_data[j][i]=val<0?-mag:mag;
                                    }
                                }
                            }
                        }
                        if (tcp->tccps[compno].qmfbid==1) {
                            for (j=0; j<cblk->y1-cblk->y0; j++) {
                                for (i=0; i<cblk->x1-cblk->x0; i++) {
                                    tilec->data[x+i+(y+j)*(tilec->x1-tilec->x0)]=t1_data[j][i];
                                }
                            }
                        } else if (tcp->tccps[compno].qmfbid==0) {
                            for (j=0; j<cblk->y1-cblk->y0; j++) {
                                for (i=0; i<cblk->x1-cblk->x0; i++) {
                                    if (t1_data[j][i]==0) {
                                        tilec->data[x+i+(y+j)*(tilec->x1-tilec->x0)]=0;
                                    } else {
                                        tilec->data[x+i+(y+j)*(tilec->x1-tilec->x0)]=fix_mul(t1_data[j][i]<<13, band->stepsize);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

int t1_init_ctxno_zc(int f, int orient) {
    int h,v,d,n,t,hv;n=0;h=((f&T1_SIG_W)!=0)+((f&T1_SIG_E)!=0);v=((f&T1_SIG_N)!=0)+((f&T1_SIG_S)!=0);d=((f&T1_SIG_NW)!=0)+((f&T1_SIG_NE)!=0)+((f&T1_SIG_SE)!=0)+((f&T1_SIG_SW)!=0);switch(orient){case 2:t=h;h=v;v=t;case 0:case 1:if(!h){if(!v){if(!d){n=0;}else if(d==1){n=1;}else{n=2;}}else if(v==1){n=3;}else{n=4;}}else if(h==1){if(!v){if(!d){n=5;}else{n=6;}}else{n=7;}}else{n=8;}break;case 3:hv=h+v;if(!d){if(!hv){n=0;}else if(hv==1){n=1;}else{n=2;}}else if(d==1){if(!hv){n=3;}else if(hv==1){ n=4;}else{n=5;}}else if(d==2){if(!hv){n=6;}else{n=7;}}else{n=8;}break;}return T1_CTXNO_ZC+n;
}

int t1_init_ctxno_sc(int f) {
    int hc,vc,n;n=0;hc=int_min(((f&(T1_SIG_E|T1_SGN_E))==T1_SIG_E)+((f&(T1_SIG_W|T1_SGN_W))==T1_SIG_W),1)-int_min(((f&(T1_SIG_E|T1_SGN_E))==(T1_SIG_E|T1_SGN_E))+((f&(T1_SIG_W|T1_SGN_W))==(T1_SIG_W|T1_SGN_W)),1);vc=int_min(((f&(T1_SIG_N|T1_SGN_N))==T1_SIG_N)+((f&(T1_SIG_S|T1_SGN_S))==T1_SIG_S),1)-int_min(((f&(T1_SIG_N|T1_SGN_N))==(T1_SIG_N|T1_SGN_N))+((f&(T1_SIG_S|T1_SGN_S))==(T1_SIG_S|T1_SGN_S)),1);if(hc<0){hc=-hc;vc=-vc;}if(!hc){if(vc==-1){n=1;}else if(!vc){n=0;}else{n=1;}}else if(hc==1){if(vc==-1){n=2;}else if(!vc){n=3;}else{n=4;}}return T1_CTXNO_SC+n;
}

int t1_init_ctxno_mag(int f) {
    int n;if(!(f&T1_REFINE)){n=(f&(T1_SIG_OTH))?1:0;}else{n=2;}return T1_CTXNO_MAG+n;
}

int t1_init_spb(int f) {
    int hc,vc,n;hc=int_min(((f&(T1_SIG_E|T1_SGN_E))==T1_SIG_E)+((f&(T1_SIG_W|T1_SGN_W))==T1_SIG_W),1)-int_min(((f&(T1_SIG_E|T1_SGN_E))==(T1_SIG_E|T1_SGN_E))+((f&(T1_SIG_W|T1_SGN_W))==(T1_SIG_W|T1_SGN_W)),1);vc=int_min(((f&(T1_SIG_N|T1_SGN_N))==T1_SIG_N)+((f&(T1_SIG_S|T1_SGN_S))==T1_SIG_S),1)-int_min(((f&(T1_SIG_N|T1_SGN_N))==(T1_SIG_N|T1_SGN_N))+((f&(T1_SIG_S|T1_SGN_S))==(T1_SIG_S|T1_SGN_S)),1);if(!hc&&!vc){n=0;}else{n=(!(hc>0||(!hc&&vc>0)));}return n;
}

void t1_init_luts() {
    int i,j;double u,v,t;for(j=0;j<4;j++){for(i=0;i<256;++i){t1_lut_ctxno_zc[(j<<8)|i]=t1_init_ctxno_zc(i,j);}}for(i=0;i<256;i++){t1_lut_ctxno_sc[i]=t1_init_ctxno_sc(i<<4);}for(j=0;j<2;j++){for(i=0;i<2048;++i){t1_lut_ctxno_mag[(j<<11)+i]=t1_init_ctxno_mag((j?T1_REFINE:0)|i);}}for(i=0;i<256;++i){t1_lut_spb[i]=t1_init_spb(i<<4);}
    // FIXME FIXME FIXME
    //printf("nmsedec luts:\n");
    for (i=0; i<(1<<T1_NMSEDEC_BITS); i++) {
        t=i/pow(2,T1_NMSEDEC_FRACBITS);
        u=t;
        v=t-1.5;
        t1_lut_nmsedec_sig[i]=int_max(0,(int)(floor((u*u-v*v)*pow(2,T1_NMSEDEC_FRACBITS)+ 0.5)/pow(2,T1_NMSEDEC_FRACBITS)*8192.0));
        t1_lut_nmsedec_sig0[i]=int_max(0,(int)(floor((u*u)*pow(2,T1_NMSEDEC_FRACBITS)+0.5)/pow(2,T1_NMSEDEC_FRACBITS)*8192.0));
        u=t-1.0;
        if (i&(1<<(T1_NMSEDEC_BITS-1))) {
            v=t-1.5;
        } else {
            v=t-0.5;
        }
        t1_lut_nmsedec_ref[i]=int_max(0,(int)(floor((u*u-v*v)*pow(2,T1_NMSEDEC_FRACBITS)+0.5)/pow(2,T1_NMSEDEC_FRACBITS)*8192.0));
        t1_lut_nmsedec_ref0[i]=int_max(0,(int)(floor((u*u)*pow(2,T1_NMSEDEC_FRACBITS)+0.5)/pow(2,T1_NMSEDEC_FRACBITS)*8192.0));
        //printf("%d: %d %d %d %d\n", i, t1_lut_nmsedec_sig[i], t1_lut_nmsedec_sig0[i], t1_lut_nmsedec_ref[i], t1_lut_nmsedec_ref0[i]);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -