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 + -
显示快捷键?