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

📄 jpc_dec.c

📁 在x86平台上运行不可信任代码的sandbox。
💻 C
📖 第 1 页 / 共 4 页
字号:
	return 1;}static int jpc_dec_process_siz(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_siz_t *siz = &ms->parms.siz;	int compno;	int tileno;	jpc_dec_tile_t *tile;	jpc_dec_tcomp_t *tcomp;	int htileno;	int vtileno;	jpc_dec_cmpt_t *cmpt;	dec->xstart = siz->xoff;	dec->ystart = siz->yoff;	dec->xend = siz->width;	dec->yend = siz->height;	dec->tilewidth = siz->tilewidth;	dec->tileheight = siz->tileheight;	dec->tilexoff = siz->tilexoff;	dec->tileyoff = siz->tileyoff;	dec->numcomps = siz->numcomps;	if (!(dec->cp = jpc_dec_cp_create(dec->numcomps))) {		return -1;	}	if (!(dec->cmpts = jas_malloc(dec->numcomps * sizeof(jpc_dec_cmpt_t)))) {		return -1;	}	for (compno = 0, cmpt = dec->cmpts; compno < dec->numcomps; ++compno,	  ++cmpt) {		cmpt->prec = siz->comps[compno].prec;		cmpt->sgnd = siz->comps[compno].sgnd;		cmpt->hstep = siz->comps[compno].hsamp;		cmpt->vstep = siz->comps[compno].vsamp;		cmpt->width = JPC_CEILDIV(dec->xend, cmpt->hstep) -		  JPC_CEILDIV(dec->xstart, cmpt->hstep);		cmpt->height = JPC_CEILDIV(dec->yend, cmpt->vstep) -		  JPC_CEILDIV(dec->ystart, cmpt->vstep);		cmpt->hsubstep = 0;		cmpt->vsubstep = 0;	}	dec->image = 0;	dec->numhtiles = JPC_CEILDIV(dec->xend - dec->tilexoff, dec->tilewidth);	dec->numvtiles = JPC_CEILDIV(dec->yend - dec->tileyoff, dec->tileheight);	dec->numtiles = dec->numhtiles * dec->numvtiles;	if (!(dec->tiles = jas_malloc(dec->numtiles * sizeof(jpc_dec_tile_t)))) {		return -1;	}	for (tileno = 0, tile = dec->tiles; tileno < dec->numtiles; ++tileno,	  ++tile) {		htileno = tileno % dec->numhtiles;		vtileno = tileno / dec->numhtiles;		tile->realmode = 0;		tile->state = JPC_TILE_INIT;		tile->xstart = JAS_MAX(dec->tilexoff + htileno * dec->tilewidth,		  dec->xstart);		tile->ystart = JAS_MAX(dec->tileyoff + vtileno * dec->tileheight,		  dec->ystart);		tile->xend = JAS_MIN(dec->tilexoff + (htileno + 1) *		  dec->tilewidth, dec->xend);		tile->yend = JAS_MIN(dec->tileyoff + (vtileno + 1) *		  dec->tileheight, dec->yend);		tile->numparts = 0;		tile->partno = 0;		tile->pkthdrstream = 0;		tile->pkthdrstreampos = 0;		tile->pptstab = 0;		tile->cp = 0;		if (!(tile->tcomps = jas_malloc(dec->numcomps *		  sizeof(jpc_dec_tcomp_t)))) {			return -1;		}		for (compno = 0, cmpt = dec->cmpts, tcomp = tile->tcomps;		  compno < dec->numcomps; ++compno, ++cmpt, ++tcomp) {			tcomp->rlvls = 0;			tcomp->data = 0;			tcomp->xstart = JPC_CEILDIV(tile->xstart, cmpt->hstep);			tcomp->ystart = JPC_CEILDIV(tile->ystart, cmpt->vstep);			tcomp->xend = JPC_CEILDIV(tile->xend, cmpt->hstep);			tcomp->yend = JPC_CEILDIV(tile->yend, cmpt->vstep);			tcomp->tsfb = 0;		}	}	dec->pkthdrstreams = 0;	/* We should expect to encounter other main header marker segments	  or an SOT marker segment next. */	dec->state = JPC_MH;	return 0;}static int jpc_dec_process_cod(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_cod_t *cod = &ms->parms.cod;	jpc_dec_tile_t *tile;	switch (dec->state) {	case JPC_MH:		jpc_dec_cp_setfromcod(dec->cp, cod);		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (tile->partno != 0) {			return -1;		}		jpc_dec_cp_setfromcod(tile->cp, cod);		break;	}	return 0;}static int jpc_dec_process_coc(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_coc_t *coc = &ms->parms.coc;	jpc_dec_tile_t *tile;	if (JAS_CAST(int, coc->compno) > dec->numcomps) {		fprintf(stderr,		  "invalid component number in COC marker segment\n");		return -1;	}	switch (dec->state) {	case JPC_MH:		jpc_dec_cp_setfromcoc(dec->cp, coc);		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (tile->partno > 0) {			return -1;		}		jpc_dec_cp_setfromcoc(tile->cp, coc);		break;	}	return 0;}static int jpc_dec_process_rgn(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_rgn_t *rgn = &ms->parms.rgn;	jpc_dec_tile_t *tile;	if (JAS_CAST(int, rgn->compno) > dec->numcomps) {		fprintf(stderr,		  "invalid component number in RGN marker segment\n");		return -1;	}	switch (dec->state) {	case JPC_MH:		jpc_dec_cp_setfromrgn(dec->cp, rgn);		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (tile->partno > 0) {			return -1;		}		jpc_dec_cp_setfromrgn(tile->cp, rgn);		break;	}	return 0;}static int jpc_dec_process_qcd(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_qcd_t *qcd = &ms->parms.qcd;	jpc_dec_tile_t *tile;	switch (dec->state) {	case JPC_MH:		jpc_dec_cp_setfromqcd(dec->cp, qcd);		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (tile->partno > 0) {			return -1;		}		jpc_dec_cp_setfromqcd(tile->cp, qcd);		break;	}	return 0;}static int jpc_dec_process_qcc(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_qcc_t *qcc = &ms->parms.qcc;	jpc_dec_tile_t *tile;	if (JAS_CAST(int, qcc->compno) > dec->numcomps) {		fprintf(stderr,		  "invalid component number in QCC marker segment\n");		return -1;	}	switch (dec->state) {	case JPC_MH:		jpc_dec_cp_setfromqcc(dec->cp, qcc);		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (tile->partno > 0) {			return -1;		}		jpc_dec_cp_setfromqcc(tile->cp, qcc);		break;	}	return 0;}static int jpc_dec_process_poc(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_poc_t *poc = &ms->parms.poc;	jpc_dec_tile_t *tile;	switch (dec->state) {	case JPC_MH:		if (jpc_dec_cp_setfrompoc(dec->cp, poc, 1)) {			return -1;		}		break;	case JPC_TPH:		if (!(tile = dec->curtile)) {			return -1;		}		if (!tile->partno) {			if (jpc_dec_cp_setfrompoc(tile->cp, poc, (!tile->partno))) {				return -1;			}		} else {			jpc_pi_addpchgfrompoc(tile->pi, poc);		}		break;	}	return 0;}static int jpc_dec_process_ppm(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_ppm_t *ppm = &ms->parms.ppm;	jpc_ppxstabent_t *ppmstabent;	if (!dec->ppmstab) {		if (!(dec->ppmstab = jpc_ppxstab_create())) {			return -1;		}	}	if (!(ppmstabent = jpc_ppxstabent_create())) {		return -1;	}	ppmstabent->ind = ppm->ind;	ppmstabent->data = ppm->data;	ppm->data = 0;	ppmstabent->len = ppm->len;	if (jpc_ppxstab_insert(dec->ppmstab, ppmstabent)) {		return -1;	}	return 0;}static int jpc_dec_process_ppt(jpc_dec_t *dec, jpc_ms_t *ms){	jpc_ppt_t *ppt = &ms->parms.ppt;	jpc_dec_tile_t *tile;	jpc_ppxstabent_t *pptstabent;	tile = dec->curtile;	if (!tile->pptstab) {		if (!(tile->pptstab = jpc_ppxstab_create())) {			return -1;		}	}	if (!(pptstabent = jpc_ppxstabent_create())) {		return -1;	}	pptstabent->ind = ppt->ind;	pptstabent->data = ppt->data;	ppt->data = 0;	pptstabent->len = ppt->len;	if (jpc_ppxstab_insert(tile->pptstab, pptstabent)) {		return -1;	}	return 0;}static int jpc_dec_process_com(jpc_dec_t *dec, jpc_ms_t *ms){	/* Eliminate compiler warnings about unused variables. */	dec = 0;	ms = 0;	return 0;}static int jpc_dec_process_unk(jpc_dec_t *dec, jpc_ms_t *ms){	/* Eliminate compiler warnings about unused variables. */	dec = 0;	fprintf(stderr, "warning: ignoring unknown marker segment\n");	jpc_ms_dump(ms, stderr);	return 0;}/******************************************************************************\*\******************************************************************************/static jpc_dec_cp_t *jpc_dec_cp_create(uint_fast16_t numcomps){	jpc_dec_cp_t *cp;	jpc_dec_ccp_t *ccp;	int compno;	if (!(cp = jas_malloc(sizeof(jpc_dec_cp_t)))) {		return 0;	}	cp->flags = 0;	cp->numcomps = numcomps;	cp->prgord = 0;	cp->numlyrs = 0;	cp->mctid = 0;	cp->csty = 0;	if (!(cp->ccps = jas_malloc(cp->numcomps * sizeof(jpc_dec_ccp_t)))) {		return 0;	}	if (!(cp->pchglist = jpc_pchglist_create())) {		jas_free(cp->ccps);		return 0;	}	for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;	  ++compno, ++ccp) {		ccp->flags = 0;		ccp->numrlvls = 0;		ccp->cblkwidthexpn = 0;		ccp->cblkheightexpn = 0;		ccp->qmfbid = 0;		ccp->numstepsizes = 0;		ccp->numguardbits = 0;		ccp->roishift = 0;		ccp->cblkctx = 0;	}	return cp;}static jpc_dec_cp_t *jpc_dec_cp_copy(jpc_dec_cp_t *cp){	jpc_dec_cp_t *newcp;	jpc_dec_ccp_t *newccp;	jpc_dec_ccp_t *ccp;	int compno;	if (!(newcp = jpc_dec_cp_create(cp->numcomps))) {		return 0;	}	newcp->flags = cp->flags;	newcp->prgord = cp->prgord;	newcp->numlyrs = cp->numlyrs;	newcp->mctid = cp->mctid;	newcp->csty = cp->csty;	jpc_pchglist_destroy(newcp->pchglist);	newcp->pchglist = 0;	if (!(newcp->pchglist = jpc_pchglist_copy(cp->pchglist))) {		jas_free(newcp);		return 0;	}	for (compno = 0, newccp = newcp->ccps, ccp = cp->ccps;	  compno < cp->numcomps;	  ++compno, ++newccp, ++ccp) {		*newccp = *ccp;	}	return newcp;}static void jpc_dec_cp_resetflags(jpc_dec_cp_t *cp){	int compno;	jpc_dec_ccp_t *ccp;	cp->flags &= (JPC_CSET | JPC_QSET);	for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;	  ++compno, ++ccp) {		ccp->flags = 0;	}}static void jpc_dec_cp_destroy(jpc_dec_cp_t *cp){	if (cp->ccps) {		jas_free(cp->ccps);	}	if (cp->pchglist) {		jpc_pchglist_destroy(cp->pchglist);	}	jas_free(cp);}static int jpc_dec_cp_isvalid(jpc_dec_cp_t *cp){	uint_fast16_t compcnt;	jpc_dec_ccp_t *ccp;	if (!(cp->flags & JPC_CSET) || !(cp->flags & JPC_QSET)) {		return 0;	}	for (compcnt = cp->numcomps, ccp = cp->ccps; compcnt > 0; --compcnt,	  ++ccp) {		/* Is there enough step sizes for the number of bands? */		if ((ccp->qsty != JPC_QCX_SIQNT && JAS_CAST(int, ccp->numstepsizes) < 3 *		  ccp->numrlvls - 2) || (ccp->qsty == JPC_QCX_SIQNT &&		  ccp->numstepsizes != 1)) {			return 0;		}	}	return 1;}static void calcstepsizes(uint_fast16_t refstepsize, int numrlvls,  uint_fast16_t *stepsizes){	int bandno;	int numbands;	uint_fast16_t expn;	uint_fast16_t mant;	expn = JPC_QCX_GETEXPN(refstepsize);	mant = JPC_QCX_GETMANT(refstepsize);	numbands = 3 * numrlvls - 2;	for (bandno = 0; bandno < numbands; ++bandno) {		stepsizes[bandno] = JPC_QCX_MANT(mant) | JPC_QCX_EXPN(expn +		  (numrlvls - 1) - (numrlvls - 1 - ((bandno > 0) ? ((bandno + 2) / 3) : (0))));	}}static int jpc_dec_cp_prepare(jpc_dec_cp_t *cp){	jpc_dec_ccp_t *ccp;	int compno;	int i;	for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;	  ++compno, ++ccp) {		if (!(ccp->csty & JPC_COX_PRT)) {			for (i = 0; i < JPC_MAXRLVLS; ++i) {				ccp->prcwidthexpns[i] = 15;				ccp->prcheightexpns[i] = 15;			}		}		if (ccp->qsty == JPC_QCX_SIQNT) {			calcstepsizes(ccp->stepsizes[0], ccp->numrlvls, ccp->stepsizes);		}	}	return 0;}static int jpc_dec_cp_setfromcod(jpc_dec_cp_t *cp, jpc_cod_t *cod){	jpc_dec_ccp_t *ccp;	int compno;	cp->flags |= JPC_CSET;	cp->prgord = cod->prg;	if (cod->mctrans) {		cp->mctid = (cod->compparms.qmfbid == JPC_COX_INS) ? (JPC_MCT_ICT) : (JPC_MCT_RCT);	} else {		cp->mctid = JPC_MCT_NONE;	}	cp->numlyrs = cod->numlyrs;	cp->csty = cod->csty & (JPC_COD_SOP | JPC_COD_EPH);	for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;	  ++compno, ++ccp) {		jpc_dec_cp_setfromcox(cp, ccp, &cod->compparms, 0);	}	cp->flags |= JPC_CSET;	return 0;}static int jpc_dec_cp_setfromcoc(jpc_dec_cp_t *cp, jpc_coc_t *coc){	jpc_dec_cp_setfromcox(cp, &cp->ccps[coc->compno], &coc->compparms, JPC_COC);	return 0;}static int jpc_dec_cp_setfromcox(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,  jpc_coxcp_t *compparms, int flags){	int rlvlno;	/* Eliminate compiler warnings about unused variables. */	cp = 0;	if ((flags & JPC_COC) || !(ccp->flags & JPC_COC)) {		ccp->numrlvls = compparms->numdlvls + 1;		ccp->cblkwidthexpn = JPC_COX_GETCBLKSIZEEXPN(		  compparms->cblkwidthval);		ccp->cblkheightexpn = JPC_COX_GETCBLKSIZEEXPN(		  compparms->cblkheightval);		ccp->qmfbid = compparms->qmfbid;		ccp->cblkctx = compparms->cblksty;		ccp->csty = compparms->csty & JPC_COX_PRT;		for (rlvlno = 0; rlvlno < compparms->numrlvls; ++rlvlno) {			ccp->prcwidthexpns[rlvlno] =			  compparms->rlvls[rlvlno].parwidthval;			ccp->prcheightexpns[rlvlno] =			  compparms->rlvls[rlvlno].parheightval;		}		ccp->flags |= flags | JPC_CSET;	}	return 0;}static int jpc_dec_cp_setfromqcd(jpc_dec_cp_t *cp, jpc_qcd_t *qcd){	int compno;	jpc_dec_ccp_t *ccp;	for (compno = 0, ccp = cp->ccps; compno < cp->numcomps;	  ++compno, ++ccp) {		jpc_dec_cp_setfromqcx(cp, ccp, &qcd->compparms, 0);	}	cp->flags |= JPC_QSET;	return 0;}static int jpc_dec_cp_setfromqcc(jpc_dec_cp_t *cp, jpc_qcc_t *qcc){	return jpc_dec_cp_setfromqcx(cp, &cp->ccps[qcc->compno], &qcc->compparms, JPC_QCC);}static int jpc_dec_cp_setfromqcx(jpc_dec_cp_t *cp, jpc_dec_ccp_t *ccp,  jpc_qcxcp_t *compparms, int flags){	int bandno;	/* Eliminate compiler warnings about unused variables. */	cp = 0;	if ((flags & JPC_QCC) || !(ccp->flags & JPC_QCC)) {		ccp->flags |= flags | JPC_QSET;		for (bandno = 0; bandno < compparms->numstepsizes; ++bandno) {			ccp->stepsizes[bandno] = compparms->stepsizes[bandno];		}		ccp->numstepsizes = compparms->numstepsizes;		ccp->numguardbits = compparms->numguard;		ccp->qsty = compparms->qntsty;	}	return 0;}static int jpc_dec_cp_setfromrgn(jpc_dec_cp_t *cp, jpc_rgn_t *rgn){	jpc_dec_ccp_t *ccp;	ccp = &cp->ccps[rgn->compno];	ccp->roishift = rgn->roishift;	return 0;}static int jpc_pi_addpchgfrompoc(jpc_pi_t *pi, jpc_poc_t *poc){	int pchgno;	jpc_pchg_t *pchg;	for (pchgno = 0; pchgno < poc->numpchgs; ++pchgno) {		if (!(pchg = jpc_pchg_copy(&poc->pchgs[pchgno]))) {			return -1;		}		if (jpc_pchglist_insert(pi->pchglist, -1, pchg)) {			return -1;		}

⌨️ 快捷键说明

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