📄 j2k.c
字号:
for (bandno=0; bandno<numbands; bandno++) {
int expn, mant;
expn=tccp->stepsizes[bandno].expn;
mant=tccp->stepsizes[bandno].mant;
if (tccp->qntsty==J2K_CCP_QNTSTY_NOQNT) {
cio_write(expn<<3, 1);
} else {
cio_write((expn<<11)+mant, 2);
}
}
}
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;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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;
fprintf(stderr, "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);
fprintf(stderr, "WARNING: CRG marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_read_tlm() {
int len;
len=cio_read(2);
fprintf(stderr, "WARNING: TLM marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_read_plm() {
int len;
len=cio_read(2);
fprintf(stderr, "WARNING: PLM marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_read_plt() {
int len;
len=cio_read(2);
fprintf(stderr, "WARNING: PLT marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_read_ppm() {
int len;
len=cio_read(2);
fprintf(stderr, "WARNING: PPM marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_read_ppt() {
int len;
len=cio_read(2);
fprintf(stderr, "WARNING: PPT marker segment processing not implemented\n");
cio_skip(len-2);
}
void j2k_write_sot() {
int lenp, len;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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();
fprintf(stderr, "tcp->rates[%d]=%d\n", layno, tcp->rates[layno]);
}
fprintf(stderr, "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;
fprintf(stderr, "%.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;
fprintf(stderr, "%.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() {
fprintf(stderr, "%.8x: EOC\n", cio_tell());
cio_write(J2K_MS_EOC, 2);
}
void j2k_read_eoc() {
int tileno;
fprintf(stderr, "%.8x: EOC\n", cio_tell()-2);
j2k_dump_image(j2k_img);
j2k_dump_cp(j2k_img, j2k_cp);
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() {
fprintf(stderr, "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;
j2k_dump_cp(j2k_img, j2k_cp);
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) {
fprintf(stderr, "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) {
fprintf(stderr, "%.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)) {
fprintf(stderr, "%.8x: unexpected marker %x\n", cio_tell()-2, id);
return 0;
}
if (e->handler) {
(*e->handler)();
}
}
}
#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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -