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

📄 field_encode.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
/* *			GPAC - Multimedia Framework C SDK * *			Copyright (c) Jean Le Feuvre 2000-2005  *					All rights reserved * *  This file is part of GPAC / BIFS codec sub-project * *  GPAC is free software; you can redistribute it and/or modify *  it under the terms of the GNU Lesser General Public License as published by *  the Free Software Foundation; either version 2, or (at your option) *  any later version. *    *  GPAC is distributed in the hope that it will be useful, *  but WITHOUT ANY WARRANTY; without even the implied warranty of *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the *  GNU Lesser General Public License for more details. *    *  You should have received a copy of the GNU Lesser General Public *  License along with this library; see the file COPYING.  If not, write to *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  * */#include <gpac/internal/bifs_dev.h>#include <gpac/internal/scenegraph_dev.h>#include <gpac/internal/bifs_tables.h>#include "quant.h" #include "script.h" GF_Err gf_bifs_field_index_by_mode(GF_Node *node, u32 all_ind, u8 indexMode, u32 *outField){	GF_Err e;	u32 i, count, temp;	count = gf_node_get_num_fields_in_mode(node, indexMode);	for (i=0; i<count; i++) {		e = gf_bifs_get_field_index(node, i, indexMode, &temp);		if (e) return e;		if (temp==all_ind) {			*outField = i;			return GF_OK;		}	}	return GF_BAD_PARAM;}void BE_WriteSFFloat(GF_BifsEncoder *codec, Fixed val, GF_BitStream *bs, char *com){	if (codec->ActiveQP && codec->ActiveQP->useEfficientCoding) {		gf_bifs_enc_mantissa_float(codec, val, bs);	} else {		gf_bs_write_float(bs, FIX2FLT(val));		GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] SFFloat\t\t32\t\t%g\t\t%s\n", FIX2FLT(val), com ? com : "") );		}}GF_Err gf_bifs_enc_sf_field(GF_BifsEncoder *codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field){	GF_Err e;	if (node) {		e = gf_bifs_enc_quant_field(codec, bs, node, field);		if (e != GF_EOS) return e;	}	switch (field->fieldType) {	case GF_SG_VRML_SFBOOL:		GF_BIFS_WRITE_INT(codec, bs, * ((SFBool *)field->far_ptr), 1, "SFBool", NULL);		break;	case GF_SG_VRML_SFCOLOR:		BE_WriteSFFloat(codec, ((SFColor *)field->far_ptr)->red, bs, "color.red");		BE_WriteSFFloat(codec, ((SFColor *)field->far_ptr)->green, bs, "color.green");		BE_WriteSFFloat(codec, ((SFColor *)field->far_ptr)->blue, bs, "color.blue");		break;	case GF_SG_VRML_SFFLOAT:		BE_WriteSFFloat(codec, * ((SFFloat *)field->far_ptr), bs, NULL);		break;	case GF_SG_VRML_SFINT32:		GF_BIFS_WRITE_INT(codec, bs, * ((SFInt32 *)field->far_ptr), 32, "SFInt32", NULL);		break;	case GF_SG_VRML_SFROTATION:		BE_WriteSFFloat(codec, ((SFRotation  *)field->far_ptr)->x, bs, "rot.x");		BE_WriteSFFloat(codec, ((SFRotation  *)field->far_ptr)->y, bs, "rot.y");		BE_WriteSFFloat(codec, ((SFRotation  *)field->far_ptr)->z, bs, "rot.z");		BE_WriteSFFloat(codec, ((SFRotation  *)field->far_ptr)->q, bs, "rot.theta");		break;	case GF_SG_VRML_SFSTRING:	{		u32 i;		char *str = (char *) ((SFString*)field->far_ptr)->buffer;		u32 len = str ? strlen(str) : 0;		u32 val = gf_get_bit_size(len);		GF_BIFS_WRITE_INT(codec, bs, val, 5, "nbBits", NULL);		GF_BIFS_WRITE_INT(codec, bs, len, val, "length", NULL);		for (i=0; i<len; i++) gf_bs_write_int(bs, str[i], 8);		GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] string\t\t%d\t\t%s\n", 8*len, str) );	}		break;	case GF_SG_VRML_SFTIME:		gf_bs_write_double(bs, *((SFTime *)field->far_ptr));		GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] SFTime\t\t%d\t\t%g\n", 64, *((SFTime *)field->far_ptr)));		break;	case GF_SG_VRML_SFVEC2F:		BE_WriteSFFloat(codec, ((SFVec2f *)field->far_ptr)->x, bs, "vec2f.x");		BE_WriteSFFloat(codec, ((SFVec2f *)field->far_ptr)->y, bs, "vec2f.y");		break;		case GF_SG_VRML_SFVEC3F:		BE_WriteSFFloat(codec, ((SFVec3f *)field->far_ptr)->x, bs, "vec3f.x");		BE_WriteSFFloat(codec, ((SFVec3f *)field->far_ptr)->y, bs, "vec3f.y");		BE_WriteSFFloat(codec, ((SFVec3f *)field->far_ptr)->z, bs, "vec3f.z");		break;	case GF_SG_VRML_SFURL:	{		SFURL *url = (SFURL *) field->far_ptr;		GF_BIFS_WRITE_INT(codec, bs, (url->OD_ID>0) ? 1 : 0, 1, "hasODID", "SFURL");		if (url->OD_ID>0) {			GF_BIFS_WRITE_INT(codec, bs, url->OD_ID, 10, "ODID", "SFURL");		} else {			u32 i;			u32 len = url->url ? strlen(url->url) : 0;			u32 val = gf_get_bit_size(len);			GF_BIFS_WRITE_INT(codec, bs, val, 5, "nbBits", NULL);			GF_BIFS_WRITE_INT(codec, bs, len, val, "length", NULL);			for (i=0; i<len; i++) gf_bs_write_int(bs, url->url[i], 8);			GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] string\t\t%d\t\t%s\t\t//SFURL\n", 8*len, url->url));		}	}		break;	case GF_SG_VRML_SFIMAGE:	{		u32 size, i;		SFImage *img = (SFImage *)field->far_ptr;		GF_BIFS_WRITE_INT(codec, bs, img->width, 12, "width", "SFImage");		GF_BIFS_WRITE_INT(codec, bs, img->height, 12, "height", "SFImage");		GF_BIFS_WRITE_INT(codec, bs, img->numComponents - 1, 2, "nbComp", "SFImage");		size = img->width * img->height * img->numComponents;		for (i=0; i<size; i++) gf_bs_write_int(bs, img->pixels[i], 8);		GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] pixels\t\t%d\t\tnot dumped\t\t//SFImage\n", 8*size));	}		break;	case GF_SG_VRML_SFCOMMANDBUFFER:	{		SFCommandBuffer *cb = (SFCommandBuffer *) field->far_ptr;		if (cb->buffer) free(cb->buffer);		cb->buffer = NULL;		cb->bufferSize = 0;		if (gf_list_count(cb->commandList)) {			u32 i, nbBits;			GF_BitStream *bs_cond = gf_bs_new(NULL, 0, GF_BITSTREAM_WRITE);			GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] /*SFCommandBuffer*/\n" ));			e = gf_bifs_enc_commands(codec, cb->commandList, bs_cond);			if (!e) gf_bs_get_content(bs_cond, (char**)&cb->buffer, &cb->bufferSize);			gf_bs_del(bs_cond);			if (e) return e;			GF_LOG(GF_LOG_DEBUG, GF_LOG_CODING, ("[BIFS] /*End SFCommandBuffer*/\n"));			nbBits = gf_get_bit_size(cb->bufferSize);			GF_BIFS_WRITE_INT(codec, bs, nbBits, 5, "NbBits", NULL);			GF_BIFS_WRITE_INT(codec, bs, cb->bufferSize, nbBits, "BufferSize", NULL);			for (i=0; i<cb->bufferSize; i++) GF_BIFS_WRITE_INT(codec, bs, cb->buffer[i], 8, "buffer byte", NULL);		}		/*empty command buffer*/		else {			GF_BIFS_WRITE_INT(codec, bs, 0, 5, "NbBits", NULL);		}	}		break;	case GF_SG_VRML_SFNODE:		return gf_bifs_enc_node(codec, *((GF_Node **)field->far_ptr), field->NDTtype, bs);	case GF_SG_VRML_SFSCRIPT:		codec->LastError = SFScript_Encode(codec, (SFScript *)field->far_ptr, bs, node);		break;	default:		return GF_NON_COMPLIANT_BITSTREAM;	}	return codec->LastError;}GF_Err gf_bifs_enc_mf_field(GF_BifsEncoder *codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field){	GF_ChildNodeItem *list = NULL;	GF_Err e;	u32 nbBits;	Bool use_list;	Bool qp_local, qp_on, initial_qp;	u32 nbF, i;	GF_FieldInfo sffield;			nbF = 0;	if (field->fieldType != GF_SG_VRML_MFNODE) {		nbF = field->far_ptr ? ((GenMFField *)field->far_ptr)->count : 0;		if (!nbF && (field->fieldType == GF_SG_VRML_MFSCRIPT))			nbF = 1;	} else if (field->far_ptr) {		list = *((GF_ChildNodeItem **)field->far_ptr);		nbF = gf_node_list_get_count(list);	}	/*reserved*/	GF_BIFS_WRITE_INT(codec, bs, 0, 1, "reserved", NULL);	if (!nbF) {		/*is list*/		GF_BIFS_WRITE_INT(codec, bs, 1, 1, "isList", NULL);		/*end flag*/		GF_BIFS_WRITE_INT(codec, bs, 1, 1, "end", NULL);		return GF_OK;	}	/*do we work in list or vector*/	use_list = 0;	nbBits = gf_get_bit_size(nbF);	if (nbBits + 5 > nbF + 1) use_list = 1;	GF_BIFS_WRITE_INT(codec, bs, use_list, 1, "isList", NULL);	if (!use_list) {		GF_BIFS_WRITE_INT(codec, bs, nbBits, 5, "nbBits", NULL);		GF_BIFS_WRITE_INT(codec, bs, nbF, nbBits, "length", NULL);	}	memset(&sffield, 0, sizeof(GF_FieldInfo));	sffield.fieldIndex = field->fieldIndex;	sffield.fieldType = gf_sg_vrml_get_sf_type(field->fieldType);	sffield.NDTtype = field->NDTtype;	initial_qp = qp_on = qp_local = 0;	initial_qp = codec->ActiveQP ? 1 : 0;	for (i=0; i<nbF; i++) {		if (use_list) GF_BIFS_WRITE_INT(codec, bs, 0, 1, "end", NULL);		if (field->fieldType != GF_SG_VRML_MFNODE) {			gf_sg_vrml_mf_get_item(field->far_ptr, field->fieldType, &sffield.far_ptr, i);			e = gf_bifs_enc_sf_field(codec, bs, node, &sffield);		} else {			assert(list);			e = gf_bifs_enc_node(codec, list->node, field->NDTtype, bs);			/*activate QP*/			if (list->node->sgprivate->tag == TAG_MPEG4_QuantizationParameter) {				qp_local = ((M_QuantizationParameter *)list->node)->isLocal;				if (qp_on) gf_bifs_enc_qp_remove(codec, 0);				e = gf_bifs_enc_qp_set(codec, list->node);				if (e) return e;				qp_on = 1;				if (qp_local) qp_local = 2;			}			list = list->next;		}				if (e) return e;		if (qp_on && qp_local) {			if (qp_local == 2) qp_local -= 1;			else {				gf_bifs_enc_qp_remove(codec, initial_qp);				qp_local = qp_on = 0;			}		}	}	if (use_list) GF_BIFS_WRITE_INT(codec, bs, 1, 1, "end", NULL);	if (qp_on) gf_bifs_enc_qp_remove(codec, initial_qp);	/*for QP14*/	gf_bifs_enc_qp14_set_length(codec, nbF);	return GF_OK;}GF_Err gf_bifs_enc_field(GF_BifsEncoder * codec, GF_BitStream *bs, GF_Node *node, GF_FieldInfo *field){	assert(node);	if (field->fieldType == GF_SG_VRML_UNKNOWN) 		return GF_NON_COMPLIANT_BITSTREAM;		if (gf_sg_vrml_is_sf_field(field->fieldType)) {		return gf_bifs_enc_sf_field(codec, bs, node, field);	}	/*TO DO : PMF support*/	if (codec->info->config.UsePredictiveMFField) {		GF_BIFS_WRITE_INT(codec, bs, 0, 1, "usePredictive", NULL);	}	return gf_bifs_enc_mf_field(codec, bs, node, field);}/*we assume a node field is not ISed several times (that's stated as "undefined behaviour" in VRML*/GF_Route *gf_bifs_enc_is_field_ised(GF_BifsEncoder *codec, GF_Node *node, u32 fieldIndex){	GF_Route *r;	u32 i;

⌨️ 快捷键说明

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