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

📄 jpc_tsfb.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 2 页
字号:
		bands[0].locxend = xend;		bands[0].locyend = yend;		bands[0].orient = JPC_TSFB_LL;		bands[0].synenergywt = JPC_FIX_ONE;		++bands;	} else {		jpc_tsfbnode_getbandstree(tsfb->root, xstart, ystart,		  xstart, ystart, xend, yend, &bands);	}	return bands - savbands;}static void jpc_tsfbnode_getbandstree(jpc_tsfbnode_t *node, uint_fast32_t posxstart,  uint_fast32_t posystart, uint_fast32_t xstart, uint_fast32_t ystart,  uint_fast32_t xend, uint_fast32_t yend, jpc_tsfb_band_t **bands){	jpc_tsfbnodeband_t nodebands[JPC_TSFB_MAXBANDSPERNODE];	jpc_tsfbnodeband_t *nodeband;	int nodebandno;	int numnodebands;	jpc_tsfb_band_t *band;	jas_seq_t *hfilter;	jas_seq_t *vfilter;	qmfb2d_getbands(node->hqmfb, node->vqmfb, xstart, ystart, xend, yend,	  JPC_TSFB_MAXBANDSPERNODE, &numnodebands, nodebands);	if (node->numchildren > 0) {		for (nodebandno = 0, nodeband = nodebands;		  nodebandno < numnodebands; ++nodebandno, ++nodeband) {			if (node->children[nodebandno]) {				jpc_tsfbnode_getbandstree(node->children[				  nodebandno], posxstart +				  nodeband->locxstart - xstart, posystart +				  nodeband->locystart - ystart, nodeband->xstart,				  nodeband->ystart, nodeband->xend,				  nodeband->yend, bands);			}		}	}assert(numnodebands == 4 || numnodebands == 3);	for (nodebandno = 0, nodeband = nodebands; nodebandno < numnodebands;	  ++nodebandno, ++nodeband) {		if (!node->children[nodebandno]) {			band = *bands;			band->xstart = nodeband->xstart;			band->ystart = nodeband->ystart;			band->xend = nodeband->xend;			band->yend = nodeband->yend;			band->locxstart = posxstart + nodeband->locxstart -			  xstart;			band->locystart = posystart + nodeband->locystart -			  ystart;			band->locxend = band->locxstart + band->xend -			  band->xstart;			band->locyend = band->locystart + band->yend -			  band->ystart;			if (numnodebands == 4) {				switch (nodebandno) {				case 0:					band->orient = JPC_TSFB_LL;					break;				case 1:					band->orient = JPC_TSFB_HL;					break;				case 2:					band->orient = JPC_TSFB_LH;					break;				case 3:					band->orient = JPC_TSFB_HH;					break;				default:					abort();					break;				}			} else {				switch (nodebandno) {				case 0:					band->orient = JPC_TSFB_HL;					break;				case 1:					band->orient = JPC_TSFB_LH;					break;				case 2:					band->orient = JPC_TSFB_HH;					break;				default:					abort();					break;				}			}			jpc_tsfbnode_getequivfilters(node, nodebandno, band->xend - band->xstart, band->yend - band->ystart, &hfilter, &vfilter);			band->synenergywt = jpc_fix_mul(jpc_seq_norm(hfilter),			  jpc_seq_norm(vfilter));			jas_seq_destroy(hfilter);			jas_seq_destroy(vfilter);			++(*bands);		}	}}/******************************************************************************\*\******************************************************************************/static jpc_tsfbnode_t *jpc_tsfbnode_create(){	jpc_tsfbnode_t *node;	if (!(node = jas_malloc(sizeof(jpc_tsfbnode_t)))) {		return 0;	}	node->numhchans = 0;	node->numvchans = 0;	node->numchildren = 0;	node->maxchildren = 0;	node->hqmfb = 0;	node->vqmfb = 0;	node->parent = 0;	return node;}static void jpc_tsfbnode_destroy(jpc_tsfbnode_t *node){	jpc_tsfbnode_t **child;	int childno;	for (childno = 0, child = node->children; childno < node->maxchildren;	  ++childno, ++child) {		if (*child) {			jpc_tsfbnode_destroy(*child);		}	}	if (node->hqmfb) {		jpc_qmfb1d_destroy(node->hqmfb);	}	if (node->vqmfb) {		jpc_qmfb1d_destroy(node->vqmfb);	}	jas_free(node);}static void qmfb2d_getbands(jpc_qmfb1d_t *hqmfb, jpc_qmfb1d_t *vqmfb,  uint_fast32_t xstart, uint_fast32_t ystart, uint_fast32_t xend,  uint_fast32_t yend, int maxbands, int *numbandsptr, jpc_tsfbnodeband_t *bands){	jpc_qmfb1dband_t hbands[JPC_QMFB1D_MAXCHANS];	jpc_qmfb1dband_t vbands[JPC_QMFB1D_MAXCHANS];	int numhbands;	int numvbands;	int numbands;	int bandno;	int hbandno;	int vbandno;	jpc_tsfbnodeband_t *band;	if (hqmfb) {		jpc_qmfb1d_getbands(hqmfb, 0, xstart, ystart, xend, yend,		  JPC_QMFB1D_MAXCHANS, &numhbands, hbands);	} else {		numhbands = 1;		hbands[0].start = xstart;		hbands[0].end = xend;		hbands[0].locstart = xstart;		hbands[0].locend = xend;	}	if (vqmfb) {		jpc_qmfb1d_getbands(vqmfb, JPC_QMFB1D_VERT, xstart, ystart, xend,		  yend, JPC_QMFB1D_MAXCHANS, &numvbands, vbands);	} else {		numvbands = 1;		vbands[0].start = ystart;		vbands[0].end = yend;		vbands[0].locstart = ystart;		vbands[0].locend = yend;	}	numbands = numhbands * numvbands;	assert(numbands <= maxbands);	*numbandsptr = numbands;	for (bandno = 0, band = bands; bandno < numbands; ++bandno, ++band) {		hbandno = bandno % numhbands;		vbandno = bandno / numhbands;		band->xstart = hbands[hbandno].start;		band->ystart = vbands[vbandno].start;		band->xend = hbands[hbandno].end;		band->yend = vbands[vbandno].end;		band->locxstart = hbands[hbandno].locstart;		band->locystart = vbands[vbandno].locstart;		band->locxend = hbands[hbandno].locend;		band->locyend = vbands[vbandno].locend;		assert(band->xstart <= band->xend &&		  band->ystart <= band->yend);		if (band->xstart == band->xend) {			band->yend = band->ystart;			band->locyend = band->locystart;		} else if (band->ystart == band->yend) {			band->xend = band->xstart;			band->locxend = band->locxstart;		}	}}static int jpc_tsfbnode_getequivfilters(jpc_tsfbnode_t *tsfbnode, int cldind,  int width, int height, jas_seq_t **hfilter, jas_seq_t **vfilter){	jas_seq_t *hseq;	jas_seq_t *vseq;	jpc_tsfbnode_t *node;	jas_seq2d_t *hfilters[JPC_QMFB1D_MAXCHANS];	jas_seq2d_t *vfilters[JPC_QMFB1D_MAXCHANS];	int numhchans;	int numvchans;	jas_seq_t *tmpseq;	hseq = 0;	vseq = 0;	if (!(hseq = jas_seq_create(0, 1))) {		goto error;	}	jas_seq_set(hseq, 0, jpc_inttofix(1));	if (!(vseq = jas_seq_create(0, 1))) {		goto error;	}	jas_seq_set(vseq, 0, jpc_inttofix(1));	node = tsfbnode;	while (node) {		if (node->hqmfb) {			numhchans = jpc_qmfb1d_getnumchans(node->hqmfb);			if (jpc_qmfb1d_getsynfilters(node->hqmfb, width, hfilters)) {				goto error;			}			if (!(tmpseq = jpc_seq_upsample(hseq, numhchans))) {				goto error;			}			jas_seq_destroy(hseq);			hseq = tmpseq;			if (!(tmpseq = jpc_seq_conv(hseq, hfilters[bandnotohind(node, cldind)]))) {				goto error;			}			jas_seq_destroy(hfilters[0]);			jas_seq_destroy(hfilters[1]);			jas_seq_destroy(hseq);			hseq = tmpseq;		}		if (node->vqmfb) {			numvchans = jpc_qmfb1d_getnumchans(node->vqmfb);			if (jpc_qmfb1d_getsynfilters(node->vqmfb, height, vfilters)) {				abort();			}			if (!(tmpseq = jpc_seq_upsample(vseq, numvchans))) {				goto error;			}			jas_seq_destroy(vseq);			vseq = tmpseq;			if (!(tmpseq = jpc_seq_conv(vseq, vfilters[bandnotovind(node, cldind)]))) {				goto error;			}			jas_seq_destroy(vfilters[0]);			jas_seq_destroy(vfilters[1]);			jas_seq_destroy(vseq);			vseq = tmpseq;		}		if (node->parent) {			cldind = jpc_tsfbnode_findchild(node->parent, node);		}		node = node->parent;	}	*hfilter = hseq;	*vfilter = vseq;	return 0;error:	if (hseq) {		jas_seq_destroy(hseq);	}	if (vseq) {		jas_seq_destroy(vseq);	}	return -1;}static int jpc_tsfbnode_findchild(jpc_tsfbnode_t *parnode, jpc_tsfbnode_t *cldnode){	int i;	for (i = 0; i < parnode->maxchildren; i++) {		if (parnode->children[i] == cldnode)			return i;	}	assert(0);	return -1;}jpc_tsfb_t *jpc_cod_gettsfb(int qmfbid, int numlevels){	jpc_tsfb_t *tsfb;	switch (qmfbid) {	case JPC_COX_RFT:		qmfbid = JPC_QMFB1D_FT;		break;	case JPC_COX_INS:		qmfbid = JPC_QMFB1D_NS;		break;	default:		assert(0);		qmfbid = 10;		break;	}{	jpc_qmfb1d_t *hqmfb;	hqmfb = jpc_qmfb1d_make(qmfbid);	assert(hqmfb);	tsfb = jpc_tsfb_wavelet(hqmfb, hqmfb, numlevels);	assert(tsfb);	jpc_qmfb1d_destroy(hqmfb);}	return tsfb;}

⌨️ 快捷键说明

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