j2k.c

来自「君正早期ucos系统(只有早期的才不没有打包成库),MPLAYER,文件系统,图」· C语言 代码 · 共 753 行 · 第 1/2 页

C
753
字号
void j2k_read_qcx(int compno, int len) {    int tmp;    j2k_tcp_t *tcp;    j2k_tccp_t *tccp;    int bandno, numbands;    tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;    tccp=&tcp->tccps[compno];    tmp=cio_read(1);    tccp->qntsty=tmp&0x1f;    tccp->numgbits=tmp>>5;    numbands=tccp->qntsty==J2K_CCP_QNTSTY_SIQNT?1:(tccp->qntsty==J2K_CCP_QNTSTY_NOQNT?len-1:(len-1)/2);    for (bandno=0; bandno<numbands; bandno++) {        int expn, mant;        if (tccp->qntsty==J2K_CCP_QNTSTY_NOQNT) { // WHY STEPSIZES WHEN NOQNT ?            expn=cio_read(1)>>3;            mant=0;        } else {            tmp=cio_read(2);            expn=tmp>>11;            mant=tmp&0x7ff;        }        tccp->stepsizes[bandno].expn=expn;        tccp->stepsizes[bandno].mant=mant;    }}void j2k_write_qcd() {    int lenp, len;    J2KDUMP("%.8x: QCD\n", cio_tell())    cio_write(J2K_MS_QCD, 2);    lenp=cio_tell();    cio_skip(2);    j2k_write_qcx(0);    len=cio_tell()-lenp;    cio_seek(lenp);    cio_write(len, 2);    cio_seek(lenp+len);}void j2k_read_qcd() {    int len, i, pos;    J2KDUMP("%.8x: QCD\n", cio_tell()-2)    len=cio_read(2);    pos=cio_tell();    for (i=0; i<j2k_img->numcomps; i++) {        cio_seek(pos);        j2k_read_qcx(i, len-2);    }}void j2k_write_qcc(int compno) {    int lenp, len;    J2KDUMP("%.8x: QCC\n", cio_tell())    cio_write(J2K_MS_QCC, 2);    lenp=cio_tell();    cio_skip(2);    cio_write(compno, j2k_img->numcomps<=256?1:2);    j2k_write_qcx(compno);    len=cio_tell()-lenp;    cio_seek(lenp);    cio_write(len, 2);    cio_seek(lenp+len);}void j2k_read_qcc() {    int len, compno;    J2KDUMP("%.8x: QCC\n", cio_tell()-2)    len=cio_read(2);    compno=cio_read(j2k_img->numcomps<=256?1:2);    j2k_read_qcx(compno, len-2-(j2k_img->numcomps<=256?1:2));}void j2k_read_poc() {    int len, numpchgs, i;    j2k_tcp_t *tcp;    J2KWARNING("WARNING: POC marker segment processing not fully implemented\n")    tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;    len=cio_read(2);    numpchgs=(len-2)/(5+2*(j2k_img->numcomps<=256?1:2));    for (i=0; i<numpchgs; i++) {        int resno0, compno0, layerno1, resno1, compno1, prg;        resno0=cio_read(1);        compno0=cio_read(j2k_img->numcomps<=256?1:2);        layerno1=cio_read(2);        resno1=cio_read(1);        compno1=cio_read(j2k_img->numcomps<=256?1:2);        prg=cio_read(1);        tcp->prg=prg;    }}void j2k_read_crg() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: CRG marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_read_tlm() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: TLM marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_read_plm() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: PLM marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_read_plt() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: PLT marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_read_ppm() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: PPM marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_read_ppt() {    int len;    len=cio_read(2);    J2KWARNING("WARNING: PPT marker segment processing not implemented\n")    cio_skip(len-2);}void j2k_write_sot() {    int lenp, len;    J2KDUMP("%.8x: SOT\n", cio_tell())    j2k_sot_start=cio_tell();    cio_write(J2K_MS_SOT, 2);    lenp=cio_tell();    cio_skip(2);    cio_write(j2k_curtileno, 2);    cio_skip(4);    cio_write(0, 1);    cio_write(1, 1);    len=cio_tell()-lenp;    cio_seek(lenp);    cio_write(len, 2);    cio_seek(lenp+len);}void j2k_read_sot() {    int len, tileno, totlen, partno, numparts, i;    j2k_tcp_t *tcp;    j2k_tccp_t *tmp;    J2KDUMP("%.8x: SOT\n", cio_tell()-2)    len=cio_read(2);    tileno=cio_read(2);    totlen=cio_read(4);    partno=cio_read(1);    numparts=cio_read(1);    j2k_curtileno=tileno;    j2k_eot=cio_getbp()-12+totlen;    j2k_state=J2K_STATE_TPH;    tcp=&j2k_cp->tcps[j2k_curtileno];    tmp=tcp->tccps;    *tcp=j2k_default_tcp;    tcp->tccps=tmp;    for (i=0; i<j2k_img->numcomps; i++) {        tcp->tccps[i]=j2k_default_tcp.tccps[i];    }}void j2k_write_sod() {    int l, layno;    int totlen;    j2k_tcp_t *tcp;    J2KDUMP("%.8x: SOD\n", cio_tell())    cio_write(J2K_MS_SOD, 2);    tcp=&j2k_cp->tcps[j2k_curtileno];    for (layno=0; layno<tcp->numlayers; layno++) {        tcp->rates[layno]-=cio_tell();        J2KDUMP2("tcp->rates[%d]=%d\n", layno, tcp->rates[layno])    }    J2KDUMP("cio_numbytesleft=%d\n", cio_numbytesleft())    tcd_init(j2k_img, j2k_cp);    l=tcd_encode_tile(j2k_curtileno, cio_getbp(), cio_numbytesleft()-2);    totlen=cio_tell()+l-j2k_sot_start;    cio_seek(j2k_sot_start+6);    cio_write(totlen, 4);    cio_seek(j2k_sot_start+totlen);}void j2k_read_sod() {    int len;    unsigned char *data;    J2KDUMP("%.8x: SOD\n", cio_tell()-2)    len=int_min(j2k_eot-cio_getbp(), cio_numbytesleft());    j2k_tile_len[j2k_curtileno]+=len;    data=(unsigned char*)realloc(j2k_tile_data[j2k_curtileno], j2k_tile_len[j2k_curtileno]);    memcpy(data, cio_getbp(), len);    j2k_tile_data[j2k_curtileno]=data;    cio_skip(len);    j2k_state=J2K_STATE_TPHSOT;}void j2k_read_rgn() {    int len, compno, roisty;    j2k_tcp_t *tcp;    J2KDUMP("%.8x: RGN\n", cio_tell()-2)    tcp=j2k_state==J2K_STATE_TPH?&j2k_cp->tcps[j2k_curtileno]:&j2k_default_tcp;    len=cio_read(2);    compno=cio_read(j2k_img->numcomps<=256?1:2);    roisty=cio_read(1);    tcp->tccps[compno].roishift=cio_read(1);}void j2k_write_eoc() {    J2KDUMP("%.8x: EOC\n", cio_tell())    cio_write(J2K_MS_EOC, 2);}void j2k_read_eoc() {    int tileno;#if J2K_DUMP_ENABLED
    J2KDUMP("%.8x: EOC\n", cio_tell()-2)    j2k_dump_image(j2k_img);    j2k_dump_cp(j2k_img, j2k_cp);#endif //J2K_DUMP_ENABLED
    tcd_init(j2k_img, j2k_cp);    for (tileno=0; tileno<j2k_cp->tw*j2k_cp->th; tileno++) {        tcd_decode_tile(j2k_tile_data[tileno], j2k_tile_len[tileno], tileno);    }
    j2k_state=J2K_STATE_MT;    longjmp(j2k_error, 1);}void j2k_read_unk() {    J2KWARNING("warning: unknown marker\n")}LIBJ2K_API int j2k_encode(j2k_image_t *img, j2k_cp_t *cp, unsigned char *dest, int len) {    int tileno, compno;    if (setjmp(j2k_error)) {        return 0;    }    cio_init(dest, len);    j2k_img=img;    j2k_cp=cp;#if J2K_DUMP_ENABLED
    j2k_dump_cp(j2k_img, j2k_cp);#endif //J2K_DUMP_ENABLED
    j2k_write_soc();    j2k_write_siz();    j2k_write_com();    for (tileno=0; tileno<cp->tw*cp->th; tileno++) {        j2k_curtileno=tileno;        j2k_write_sot();        j2k_write_cod();        j2k_write_qcd();        for (compno=1; compno<img->numcomps; compno++) {            j2k_write_coc(compno);            j2k_write_qcc(compno);        }        j2k_write_sod();    }    j2k_write_eoc();    return cio_tell();}typedef struct {    int id;    int states;    void (*handler)();} j2k_dec_mstabent_t;j2k_dec_mstabent_t j2k_dec_mstab[]={    {J2K_MS_SOC, J2K_STATE_MHSOC, j2k_read_soc},    {J2K_MS_SOT, J2K_STATE_MH|J2K_STATE_TPHSOT, j2k_read_sot},    {J2K_MS_SOD, J2K_STATE_TPH, j2k_read_sod},    {J2K_MS_EOC, J2K_STATE_TPHSOT, j2k_read_eoc},    {J2K_MS_SIZ, J2K_STATE_MHSIZ, j2k_read_siz},    {J2K_MS_COD, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_cod},    {J2K_MS_COC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_coc},    {J2K_MS_RGN, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_rgn},    {J2K_MS_QCD, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_qcd},    {J2K_MS_QCC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_qcc},    {J2K_MS_POC, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_poc},    {J2K_MS_TLM, J2K_STATE_MH, j2k_read_tlm},    {J2K_MS_PLM, J2K_STATE_MH, j2k_read_plm},    {J2K_MS_PLT, J2K_STATE_TPH, j2k_read_plt},    {J2K_MS_PPM, J2K_STATE_MH, j2k_read_ppm},    {J2K_MS_PPT, J2K_STATE_TPH, j2k_read_ppt},    {J2K_MS_SOP, 0, 0},    {J2K_MS_CRG, J2K_STATE_MH, j2k_read_crg},    {J2K_MS_COM, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_com},    {0, J2K_STATE_MH|J2K_STATE_TPH, j2k_read_unk}};j2k_dec_mstabent_t *j2k_dec_mstab_lookup(int id) {    j2k_dec_mstabent_t *e;    for (e=j2k_dec_mstab; e->id!=0; e++) {        if (e->id==id) {            break;        }    }    return e;}LIBJ2K_API int j2k_decode(unsigned char *src, int len, j2k_image_t **img, j2k_cp_t **cp) {    if (setjmp(j2k_error)) {        if (j2k_state!=J2K_STATE_MT) {            J2KWARNING("WARNING: incomplete bitstream\n")            return 0;        }        return cio_numbytes();    }    j2k_img=(j2k_image_t*)malloc(sizeof(j2k_image_t));    j2k_cp=(j2k_cp_t*)malloc(sizeof(j2k_cp_t));    *img=j2k_img;    *cp=j2k_cp;    j2k_state=J2K_STATE_MHSOC;    cio_init(src, len);    for (;;) {        j2k_dec_mstabent_t *e;        int id=cio_read(2);        if (id>>8!=0xff) {            J2KDUMP2("%.8x: expected a marker instead of %x\n", cio_tell()-2, id);            return 0;        }        e=j2k_dec_mstab_lookup(id);        if (!(j2k_state & e->states)) {            J2KDUMP2("%.8x: unexpected marker %x\n", cio_tell()-2, id);            return 0;        }        if (e->handler) {            (*e->handler)();        }    }}

LIBJ2K_API void j2k_destroy(j2k_image_t **img, j2k_cp_t **cp)
{
	int i;
    tcd_destroy(*img, *cp);
	free(j2k_tile_len); j2k_tile_len =0;
	if (j2k_tile_data) for(i=0;i<((*cp)->tw*(*cp)->th);i++) { free(j2k_tile_data[i]); j2k_tile_data[i]=0;}
	free(j2k_tile_data); j2k_tile_data=0;
	free(j2k_default_tcp.tccps); j2k_default_tcp.tccps = 0;
	if ((*cp)->tcps) for(i=0;i<((*cp)->tw*(*cp)->th);i++) {free((*cp)->tcps[i].tccps); (*cp)->tcps[i].tccps=0;}
	free((*cp)->tcps); (*cp)->tcps=0;

	if ((*img)->comps) for(i=0;i<(*img)->numcomps;i++) {free((*img)->comps[i].data); (*img)->comps[i].data=0;}
	free((*img)->comps); (*img)->comps = 0;

	free(*img); *img=0;
	free(*cp); *cp=0;
}
/*
#ifdef WIN32
#include <windows.h>BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {    switch (ul_reason_for_call) {		case DLL_PROCESS_ATTACH:		case DLL_THREAD_ATTACH:		case DLL_THREAD_DETACH:		case DLL_PROCESS_DETACH:			break;    }    return TRUE;}
#endif*/

⌨️ 快捷键说明

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