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

📄 jpc_cs.c

📁 用C语言实现的JPEG编码
💻 C
📖 第 1 页 / 共 4 页
字号:
/* Create a marker segment of the specified type. */jpc_ms_t *jpc_ms_create(int type){	jpc_ms_t *ms;	jpc_mstabent_t *mstabent;	if (!(ms = jas_malloc(sizeof(jpc_ms_t)))) {		return 0;	}	ms->id = type;	ms->len = 0;	mstabent = jpc_mstab_lookup(ms->id);	ms->ops = &mstabent->ops;	memset(&ms->parms, 0, sizeof(jpc_msparms_t));	return ms;}/* Destroy a marker segment. */void jpc_ms_destroy(jpc_ms_t *ms){	if (ms->ops && ms->ops->destroyparms) {		(*ms->ops->destroyparms)(ms);	}	jas_free(ms);}/* Dump a marker segment to a stream for debugging. */void jpc_ms_dump(jpc_ms_t *ms, FILE *out){	jpc_mstabent_t *mstabent;	mstabent = jpc_mstab_lookup(ms->id);	fprintf(out, "type = 0x%04x (%s);", ms->id, mstabent->name);	if (JPC_MS_HASPARMS(ms->id)) {		fprintf(out, " len = %d;", ms->len + 2);		if (ms->ops->dumpparms) {			(*ms->ops->dumpparms)(ms, out);		} else {			fprintf(out, "\n");		}	} else {		fprintf(out, "\n");	}}/******************************************************************************\* SOT marker segment operations.\******************************************************************************/static int jpc_sot_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_sot_t *sot = &ms->parms.sot;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	if (jpc_getuint16(in, &sot->tileno) ||	  jpc_getuint32(in, &sot->len) ||	  jpc_getuint8(in, &sot->partno) ||	  jpc_getuint8(in, &sot->numparts)) {		return -1;	}	if (jas_stream_eof(in)) {		return -1;	}	return 0;}static int jpc_sot_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_sot_t *sot = &ms->parms.sot;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	if (jpc_putuint16(out, sot->tileno) ||	  jpc_putuint32(out, sot->len) ||	  jpc_putuint8(out, sot->partno) ||	  jpc_putuint8(out, sot->numparts)) {		return -1;	}	return 0;}static int jpc_sot_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_sot_t *sot = &ms->parms.sot;	fprintf(out, "tileno = %d; len = %d; partno = %d; numparts = %d\n",	  sot->tileno, sot->len, sot->partno, sot->numparts);	return 0;}/******************************************************************************\* SIZ marker segment operations.\******************************************************************************/static void jpc_siz_destroyparms(jpc_ms_t *ms){	jpc_siz_t *siz = &ms->parms.siz;	if (siz->comps) {		jas_free(siz->comps);	}}static int jpc_siz_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate,  jas_stream_t *in){	jpc_siz_t *siz = &ms->parms.siz;	unsigned int i;	uint_fast8_t tmp;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	if (jpc_getuint16(in, &siz->caps) ||	  jpc_getuint32(in, &siz->width) ||	  jpc_getuint32(in, &siz->height) ||	  jpc_getuint32(in, &siz->xoff) ||	  jpc_getuint32(in, &siz->yoff) ||	  jpc_getuint32(in, &siz->tilewidth) ||	  jpc_getuint32(in, &siz->tileheight) ||	  jpc_getuint32(in, &siz->tilexoff) ||	  jpc_getuint32(in, &siz->tileyoff) ||	  jpc_getuint16(in, &siz->numcomps)) {		return -1;	}	if (!siz->width || !siz->height || !siz->tilewidth ||	  !siz->tileheight || !siz->numcomps) {		return -1;	}	if (!(siz->comps = jas_malloc(siz->numcomps * sizeof(jpc_sizcomp_t)))) {		return -1;	}	for (i = 0; i < siz->numcomps; ++i) {		if (jpc_getuint8(in, &tmp) ||		  jpc_getuint8(in, &siz->comps[i].hsamp) ||		  jpc_getuint8(in, &siz->comps[i].vsamp)) {			jas_free(siz->comps);			return -1;		}		siz->comps[i].sgnd = (tmp >> 7) & 1;		siz->comps[i].prec = (tmp & 0x7f) + 1;	}	if (jas_stream_eof(in)) {		jas_free(siz->comps);		return -1;	}	return 0;}static int jpc_siz_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_siz_t *siz = &ms->parms.siz;	unsigned int i;	/* Eliminate compiler warning about unused variables. */	cstate = 0;	assert(siz->width && siz->height && siz->tilewidth &&	  siz->tileheight && siz->numcomps);	if (jpc_putuint16(out, siz->caps) ||	  jpc_putuint32(out, siz->width) ||	  jpc_putuint32(out, siz->height) ||	  jpc_putuint32(out, siz->xoff) ||	  jpc_putuint32(out, siz->yoff) ||	  jpc_putuint32(out, siz->tilewidth) ||	  jpc_putuint32(out, siz->tileheight) ||	  jpc_putuint32(out, siz->tilexoff) ||	  jpc_putuint32(out, siz->tileyoff) ||	  jpc_putuint16(out, siz->numcomps)) {		return -1;	}	for (i = 0; i < siz->numcomps; ++i) {		if (jpc_putuint8(out, ((siz->comps[i].sgnd & 1) << 7) |		  ((siz->comps[i].prec - 1) & 0x7f)) ||		  jpc_putuint8(out, siz->comps[i].hsamp) ||		  jpc_putuint8(out, siz->comps[i].vsamp)) {			return -1;		}	}	return 0;}static int jpc_siz_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_siz_t *siz = &ms->parms.siz;	unsigned int i;	fprintf(out, "caps = 0x%02x;\n", siz->caps);	fprintf(out, "width = %d; height = %d; xoff = %d; yoff = %d;\n",	  siz->width, siz->height, siz->xoff, siz->yoff);	fprintf(out, "tilewidth = %d; tileheight = %d; tilexoff = %d; "	  "tileyoff = %d;\n", siz->tilewidth, siz->tileheight, siz->tilexoff,	  siz->tileyoff);	for (i = 0; i < siz->numcomps; ++i) {		fprintf(out, "prec[%d] = %d; sgnd[%d] = %d; hsamp[%d] = %d; "		  "vsamp[%d] = %d\n", i, siz->comps[i].prec, i,		  siz->comps[i].sgnd, i, siz->comps[i].hsamp, i,		  siz->comps[i].vsamp);	}	return 0;}/******************************************************************************\* COD marker segment operations.\******************************************************************************/static void jpc_cod_destroyparms(jpc_ms_t *ms){	jpc_cod_t *cod = &ms->parms.cod;	jpc_cox_destroycompparms(&cod->compparms);}static int jpc_cod_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_cod_t *cod = &ms->parms.cod;	if (jpc_getuint8(in, &cod->csty)) {		return -1;	}	if (jpc_getuint8(in, &cod->prg) ||	  jpc_getuint16(in, &cod->numlyrs) ||	  jpc_getuint8(in, &cod->mctrans)) {		return -1;	}	if (jpc_cox_getcompparms(ms, cstate, in,	  (cod->csty & JPC_COX_PRT) != 0, &cod->compparms)) {		return -1;	}	if (jas_stream_eof(in)) {		jpc_cod_destroyparms(ms);		return -1;	}	return 0;}static int jpc_cod_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_cod_t *cod = &ms->parms.cod;	assert(cod->numlyrs > 0 && cod->compparms.numdlvls <= 32);	assert(cod->compparms.numdlvls == cod->compparms.numrlvls - 1);	if (jpc_putuint8(out, cod->compparms.csty) ||	  jpc_putuint8(out, cod->prg) ||	  jpc_putuint16(out, cod->numlyrs) ||	  jpc_putuint8(out, cod->mctrans)) {		return -1;	}	if (jpc_cox_putcompparms(ms, cstate, out,	  (cod->csty & JPC_COX_PRT) != 0, &cod->compparms)) {		return -1;	}	return 0;}static int jpc_cod_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_cod_t *cod = &ms->parms.cod;	int i;	fprintf(out, "csty = 0x%02x;\n", cod->compparms.csty);	fprintf(out, "numdlvls = %d; qmfbid = %d; mctrans = %d\n",	  cod->compparms.numdlvls, cod->compparms.qmfbid, cod->mctrans);	fprintf(out, "prg = %d; numlyrs = %d;\n",	  cod->prg, cod->numlyrs);	fprintf(out, "cblkwidthval = %d; cblkheightval = %d; "	  "cblksty = 0x%02x;\n", cod->compparms.cblkwidthval, cod->compparms.cblkheightval,	  cod->compparms.cblksty);	if (cod->csty & JPC_COX_PRT) {		for (i = 0; i < cod->compparms.numrlvls; ++i) {			fprintf(stderr, "prcwidth[%d] = %d, prcheight[%d] = %d\n",			  i, cod->compparms.rlvls[i].parwidthval,			  i, cod->compparms.rlvls[i].parheightval);		}	}	return 0;}/******************************************************************************\* COC marker segment operations.\******************************************************************************/static void jpc_coc_destroyparms(jpc_ms_t *ms){	jpc_coc_t *coc = &ms->parms.coc;	jpc_cox_destroycompparms(&coc->compparms);}static int jpc_coc_getparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *in){	jpc_coc_t *coc = &ms->parms.coc;	uint_fast8_t tmp;	if (cstate->numcomps <= 256) {		if (jpc_getuint8(in, &tmp)) {			return -1;		}		coc->compno = tmp;	} else {		if (jpc_getuint16(in, &coc->compno)) {			return -1;		}	}	if (jpc_getuint8(in, &coc->compparms.csty)) {		return -1;	}	if (jpc_cox_getcompparms(ms, cstate, in,	  (coc->compparms.csty & JPC_COX_PRT) != 0, &coc->compparms)) {		return -1;	}	if (jas_stream_eof(in)) {		return -1;	}	return 0;}static int jpc_coc_putparms(jpc_ms_t *ms, jpc_cstate_t *cstate, jas_stream_t *out){	jpc_coc_t *coc = &ms->parms.coc;	assert(coc->compparms.numdlvls <= 32);	if (cstate->numcomps <= 256) {		if (jpc_putuint8(out, coc->compno)) {			return -1;		}	} else {		if (jpc_putuint16(out, coc->compno)) {			return -1;		}	}	if (jpc_putuint8(out, coc->compparms.csty)) {		return -1;	}	if (jpc_cox_putcompparms(ms, cstate, out,	  (coc->compparms.csty & JPC_COX_PRT) != 0, &coc->compparms)) {		return -1;	}	return 0;}static int jpc_coc_dumpparms(jpc_ms_t *ms, FILE *out){	jpc_coc_t *coc = &ms->parms.coc;	fprintf(out, "compno = %d; csty = 0x%02x; numdlvls = %d;\n",	  coc->compno, coc->compparms.csty, coc->compparms.numdlvls);	fprintf(out, "cblkwidthval = %d; cblkheightval = %d; "	  "cblksty = 0x%02x; qmfbid = %d;\n", coc->compparms.cblkwidthval,	  coc->compparms.cblkheightval, coc->compparms.cblksty, coc->compparms.qmfbid);	return 0;}/******************************************************************************\* COD/COC marker segment operation helper functions.\******************************************************************************/static void jpc_cox_destroycompparms(jpc_coxcp_t *compparms){	/* Eliminate compiler warning about unused variables. */	compparms = 0;}static int jpc_cox_getcompparms(jpc_ms_t *ms, jpc_cstate_t *cstate,  jas_stream_t *in, int prtflag, jpc_coxcp_t *compparms){	uint_fast8_t tmp;	int i;	/* Eliminate compiler warning about unused variables. */	ms = 0;	cstate = 0;	if (jpc_getuint8(in, &compparms->numdlvls) ||	  jpc_getuint8(in, &compparms->cblkwidthval) ||	  jpc_getuint8(in, &compparms->cblkheightval) ||	  jpc_getuint8(in, &compparms->cblksty) ||	  jpc_getuint8(in, &compparms->qmfbid)) {		return -1;	}	compparms->numrlvls = compparms->numdlvls + 1;	if (prtflag) {		for (i = 0; i < compparms->numrlvls; ++i) {			if (jpc_getuint8(in, &tmp)) {				jpc_cox_destroycompparms(compparms);				return -1;			}			compparms->rlvls[i].parwidthval = tmp & 0xf;			compparms->rlvls[i].parheightval = (tmp >> 4) & 0xf;		}/* Sigh.  This bit should be in the same field in both COC and COD mrk segs. */compparms->csty |= JPC_COX_PRT;	} else {	}	if (jas_stream_eof(in)) {		jpc_cox_destroycompparms(compparms);		return -1;	}	return 0;}static int jpc_cox_putcompparms(jpc_ms_t *ms, jpc_cstate_t *cstate,  jas_stream_t *out, int prtflag, jpc_coxcp_t *compparms){	int i;	assert(compparms->numdlvls <= 32);	/* Eliminate compiler warning about unused variables. */	ms = 0;	cstate = 0;	if (jpc_putuint8(out, compparms->numdlvls) ||	  jpc_putuint8(out, compparms->cblkwidthval) ||	  jpc_putuint8(out, compparms->cblkheightval) ||	  jpc_putuint8(out, compparms->cblksty) ||	  jpc_putuint8(out, compparms->qmfbid)) {		return -1;	}	if (prtflag) {		for (i = 0; i < compparms->numrlvls; ++i) {			if (jpc_putuint8(out,			  ((compparms->rlvls[i].parheightval & 0xf) << 4) |			  (compparms->rlvls[i].parwidthval & 0xf))) {				return -1;			}		}	}	return 0;}/******************************************************************************\* RGN marker segment operations.\******************************************************************************/

⌨️ 快捷键说明

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