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

📄 jpc_qmfb.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 3 页
字号:
		ptr = &startptr[((llen - 1) << 1) * step];		n = llen >> 1;		tmpptr = buf;		while (n-- > 0) {			*tmpptr = *ptr;			*ptr = *lptr;			++tmpptr;			ptr -= twostep;			lptr -= step;		}		n = llen - (llen >> 1);		while (n-- > 0) {			*ptr = *lptr;			ptr -= twostep;			lptr -= step;		}		/* Copy the appropriate samples into the second phase of		  the output signal (corresponding to odd indexed		  samples). */		ptr = &startptr[step];		hptr = hstartptr;		state = !(llen & 1);		n = hlen;		while (n-- > 0) {			if (state) {				--tmpptr;				*ptr = *tmpptr;			} else {				*ptr = *hptr;			}			hptr += step;			ptr += twostep;			state ^= 1;		}	}#if defined(WIN32)	/* If the join buffer was allocated on the heap, free this memory. */	if (buf != joinbuf) {		jas_free(buf);	}#endif}/******************************************************************************\* Code for 5/3 transform.\******************************************************************************/static int jpc_ft_getnumchans(jpc_qmfb1d_t *qmfb){	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	return 2;}static int jpc_ft_getanalfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	len = 0;	filters = 0;	abort();	return -1;}static int jpc_ft_getsynfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){	jas_seq_t *lf;	jas_seq_t *hf;	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	lf = 0;	hf = 0;	if (len > 1 || (!len)) {		if (!(lf = jas_seq_create(-1, 2))) {			goto error;		}		jas_seq_set(lf, -1, jpc_dbltofix(0.5));		jas_seq_set(lf, 0, jpc_dbltofix(1.0));		jas_seq_set(lf, 1, jpc_dbltofix(0.5));		if (!(hf = jas_seq_create(-1, 4))) {			goto error;		}		jas_seq_set(hf, -1, jpc_dbltofix(-0.125));		jas_seq_set(hf, 0, jpc_dbltofix(-0.25));		jas_seq_set(hf, 1, jpc_dbltofix(0.75));		jas_seq_set(hf, 2, jpc_dbltofix(-0.25));		jas_seq_set(hf, 3, jpc_dbltofix(-0.125));	} else if (len == 1) {		if (!(lf = jas_seq_create(0, 1))) {			goto error;		}		jas_seq_set(lf, 0, jpc_dbltofix(1.0));		if (!(hf = jas_seq_create(0, 1))) {			goto error;		}		jas_seq_set(hf, 0, jpc_dbltofix(2.0));	} else {		abort();	}	filters[0] = lf;	filters[1] = hf;	return 0;error:	if (lf) {		jas_seq_destroy(lf);	}	if (hf) {		jas_seq_destroy(hf);	}	return -1;}#define	NFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pluseq) \{ \	register jpc_fix_t *lptr = (lstartptr); \	register jpc_fix_t *hptr = (hstartptr); \	register int n = (hendind) - (hstartind); \	if ((hstartind) < (lstartind)) { \		pluseq(*hptr, *lptr); \		hptr += (step); \		--n; \	} \	if ((hendind) >= (lendind)) { \		--n; \	} \	while (n-- > 0) { \		pluseq(*hptr, jpc_fix_asr(jpc_fix_add(*lptr, lptr[(step)]), 1)); \		hptr += (step); \		lptr += (step); \	} \	if ((hendind) >= (lendind)) { \		pluseq(*hptr, *lptr); \	} \}#define	NFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pluseq) \{ \	register jpc_fix_t *lptr = (lstartptr); \	register jpc_fix_t *hptr = (hstartptr); \	register int n = (lendind) - (lstartind); \	if ((hstartind) >= (lstartind)) { \		pluseq(*lptr, *hptr); \		lptr += (step); \		--n; \	} \	if ((lendind) > (hendind)) { \		--n; \	} \	while (n-- > 0) { \		pluseq(*lptr, jpc_fix_asr(jpc_fix_add(*hptr, hptr[(step)]), 2)); \		lptr += (step); \		hptr += (step); \	} \	if ((lendind) > (hendind)) { \		pluseq(*lptr, *hptr); \	} \}#define	RFT_LIFT0(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pmeqop) \{ \	register jpc_fix_t *lptr = (lstartptr); \	register jpc_fix_t *hptr = (hstartptr); \	register int n = (hendind) - (hstartind); \	if ((hstartind) < (lstartind)) { \		*hptr pmeqop *lptr; \		hptr += (step); \		--n; \	} \	if ((hendind) >= (lendind)) { \		--n; \	} \	while (n-- > 0) { \		*hptr pmeqop (*lptr + lptr[(step)]) >> 1; \		hptr += (step); \		lptr += (step); \	} \	if ((hendind) >= (lendind)) { \		*hptr pmeqop *lptr; \	} \}#define	RFT_LIFT1(lstartptr, lstartind, lendind, hstartptr, hstartind, hendind, step, pmeqop) \{ \	register jpc_fix_t *lptr = (lstartptr); \	register jpc_fix_t *hptr = (hstartptr); \	register int n = (lendind) - (lstartind); \	if ((hstartind) >= (lstartind)) { \		*lptr pmeqop ((*hptr << 1) + 2) >> 2; \		lptr += (step); \		--n; \	} \	if ((lendind) > (hendind)) { \		--n; \	} \	while (n-- > 0) { \		*lptr pmeqop ((*hptr + hptr[(step)]) + 2) >> 2; \		lptr += (step); \		hptr += (step); \	} \	if ((lendind) > (hendind)) { \		*lptr pmeqop ((*hptr << 1) + 2) >> 2; \	} \}static void jpc_ft_analyze(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x){	jpc_fix_t *startptr;	int startind;	int endind;	jpc_fix_t *  lstartptr;	int   lstartind;	int   lendind;	jpc_fix_t *  hstartptr;	int   hstartind;	int   hendind;	int interstep;	int intrastep;	int numseq;	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	if (flags & JPC_QMFB1D_VERT) {		interstep = 1;		intrastep = jas_seq2d_rowstep(x);		numseq = jas_seq2d_width(x);		startind = jas_seq2d_ystart(x);		endind = jas_seq2d_yend(x);	} else {		interstep = jas_seq2d_rowstep(x);		intrastep = 1;		numseq = jas_seq2d_height(x);		startind = jas_seq2d_xstart(x);		endind = jas_seq2d_xend(x);	}	assert(startind < endind);	startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));	if (flags & JPC_QMFB1D_RITIMODE) {		while (numseq-- > 0) {			jpc_qmfb1d_setup(startptr, startind, endind, intrastep,			  &lstartptr, &lstartind, &lendind, &hstartptr,			  &hstartind, &hendind);			if (endind - startind > 1) {				jpc_qmfb1d_split(startptr, startind, endind,				  intrastep, lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind);				RFT_LIFT0(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep, -=);				RFT_LIFT1(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep, +=);			} else {				if (lstartind == lendind) {					*startptr <<= 1;				}			}			startptr += interstep;		}	} else {		while (numseq-- > 0) {			jpc_qmfb1d_setup(startptr, startind, endind, intrastep,			  &lstartptr, &lstartind, &lendind, &hstartptr,			  &hstartind, &hendind);			if (endind - startind > 1) {				jpc_qmfb1d_split(startptr, startind, endind,				  intrastep, lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind);				NFT_LIFT0(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep,				  jpc_fix_minuseq);				NFT_LIFT1(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep,				  jpc_fix_pluseq);			} else {				if (lstartind == lendind) {					*startptr = jpc_fix_asl(*startptr, 1);				}			}			startptr += interstep;		}	}}static void jpc_ft_synthesize(jpc_qmfb1d_t *qmfb, int flags, jas_seq2d_t *x){	jpc_fix_t *startptr;	int startind;	int endind;	jpc_fix_t *lstartptr;	int lstartind;	int lendind;	jpc_fix_t *hstartptr;	int hstartind;	int hendind;	int interstep;	int intrastep;	int numseq;	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	if (flags & JPC_QMFB1D_VERT) {		interstep = 1;		intrastep = jas_seq2d_rowstep(x);		numseq = jas_seq2d_width(x);		startind = jas_seq2d_ystart(x);		endind = jas_seq2d_yend(x);	} else {		interstep = jas_seq2d_rowstep(x);		intrastep = 1;		numseq = jas_seq2d_height(x);		startind = jas_seq2d_xstart(x);		endind = jas_seq2d_xend(x);	}	assert(startind < endind);	startptr = jas_seq2d_getref(x, jas_seq2d_xstart(x), jas_seq2d_ystart(x));	if (flags & JPC_QMFB1D_RITIMODE) {		while (numseq-- > 0) {			jpc_qmfb1d_setup(startptr, startind, endind, intrastep,			  &lstartptr, &lstartind, &lendind, &hstartptr,			  &hstartind, &hendind);			if (endind - startind > 1) {				RFT_LIFT1(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep, -=);				RFT_LIFT0(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep, +=);				jpc_qmfb1d_join(startptr, startind, endind,				  intrastep, lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind);			} else {				if (lstartind == lendind) {					*startptr >>= 1;				}			}			startptr += interstep;		}	} else {		while (numseq-- > 0) {			jpc_qmfb1d_setup(startptr, startind, endind, intrastep,			  &lstartptr, &lstartind, &lendind, &hstartptr,			  &hstartind, &hendind);			if (endind - startind > 1) {				NFT_LIFT1(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep,				  jpc_fix_minuseq);				NFT_LIFT0(lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind, intrastep,				  jpc_fix_pluseq);				jpc_qmfb1d_join(startptr, startind, endind,				  intrastep, lstartptr, lstartind, lendind,				  hstartptr, hstartind, hendind);			} else {				if (lstartind == lendind) {					*startptr = jpc_fix_asr(*startptr, 1);				}			}			startptr += interstep;		}	}}/******************************************************************************\* Code for 9/7 transform.\******************************************************************************/static int jpc_ns_getnumchans(jpc_qmfb1d_t *qmfb){	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	return 2;}static int jpc_ns_getanalfilters(jpc_qmfb1d_t *qmfb, int len, jas_seq2d_t **filters){	/* Avoid compiler warnings about unused parameters. */	qmfb = 0;	len = 0;	filters = 0;

⌨️ 快捷键说明

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