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

📄 field_encode.c

📁 一个用于智能手机的多媒体库适合S60 WinCE的跨平台开发库
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (!codec->encoding_proto) return NULL;	if (node->sgprivate->interact && node->sgprivate->interact->events) {		i=0;		while ((r = (GF_Route*)gf_list_enum(node->sgprivate->interact->events, &i))) {			if (!r->IS_route) continue;			if ((r->ToNode == node) && (r->ToField.fieldIndex==fieldIndex)) return r;			else if ((r->FromNode == node) && (r->FromField.fieldIndex==fieldIndex)) return r;		}	}	i=0;	while ((r = (GF_Route*)gf_list_enum(codec->encoding_proto->sub_graph->Routes, &i))) {		if (!r->IS_route) continue;		if ((r->ToNode == node) && (r->ToField.fieldIndex==fieldIndex)) return r;		else if ((r->FromNode == node) && (r->FromField.fieldIndex==fieldIndex)) return r;	}	return NULL;}/**/GF_Err EncNodeFields(GF_BifsEncoder * codec, GF_BitStream *bs, GF_Node *node){	u8 mode;	GF_Route *isedField;	GF_Node *clone;	GF_Err e;	s32 *enc_fields;	u32 numBitsALL, numBitsDEF, allInd, count, i, nbBitsProto, nbFinal;	Bool use_list, nodeIsFDP = 0;	GF_FieldInfo field, clone_field;	e = GF_OK;	if (codec->encoding_proto) {		mode = GF_SG_FIELD_CODING_ALL;		nbBitsProto = gf_get_bit_size(gf_sg_proto_get_field_count(codec->encoding_proto) - 1);		numBitsALL = gf_get_bit_size(gf_node_get_num_fields_in_mode(node, GF_SG_FIELD_CODING_ALL) - 1);	} else {		mode = GF_SG_FIELD_CODING_DEF;		nbBitsProto = 0;		numBitsALL = 0;	}	count = gf_node_get_num_fields_in_mode(node, mode);	if (node->sgprivate->tag==TAG_MPEG4_Script) count = 3;	if (!count) {		GF_BIFS_WRITE_INT(codec, bs, 0, 1, "isMask", NULL);		GF_BIFS_WRITE_INT(codec, bs, 1, 1, "end", NULL);		return GF_OK;	}	if (node->sgprivate->tag == TAG_ProtoNode) {		clone = gf_sg_proto_create_instance(node->sgprivate->scenegraph, ((GF_ProtoInstance *)node)->proto_interface);;	} else {		clone = gf_node_new(node->sgprivate->scenegraph, node->sgprivate->tag);	}	if (clone) gf_node_register(clone, NULL);		numBitsDEF = gf_get_bit_size(gf_node_get_num_fields_in_mode(node, GF_SG_FIELD_CODING_DEF) - 1);	enc_fields = (s32*)malloc(sizeof(s32) * count);	nbFinal = 0;	for (i=0; i<count; i++) {		enc_fields[i] = -1;		/*get field in ALL mode*/		if (mode == GF_SG_FIELD_CODING_ALL) {			allInd = i;		} else {			gf_bifs_get_field_index(node, i, GF_SG_FIELD_CODING_DEF, &allInd);		}		/*encode proto code*/		if (codec->encoding_proto) {			isedField = gf_bifs_enc_is_field_ised(codec, node, allInd);			if (isedField) {				enc_fields[i] = allInd;				nbFinal ++;				continue;			}		}		/*common case*/		gf_node_get_field(node, allInd, &field);		/*if event don't encode (happens when encoding protos)*/		if ((field.eventType == GF_SG_EVENT_IN) || (field.eventType == GF_SG_EVENT_OUT)) continue;		/*if field is default skip*/		switch (field.fieldType) {		case GF_SG_VRML_SFNODE:			if (* (GF_Node **) field.far_ptr) { enc_fields[i] = allInd; nbFinal++; }			break;		case GF_SG_VRML_MFNODE:			if (* (GF_ChildNodeItem **) field.far_ptr) { enc_fields[i] = allInd; nbFinal++; }			break;		case GF_SG_VRML_SFCOMMANDBUFFER:		{			SFCommandBuffer *cb = (SFCommandBuffer *)field.far_ptr;			if (gf_list_count(cb->commandList)) { enc_fields[i] = allInd; nbFinal++; }		}			break;		case GF_SG_VRML_MFSCRIPT:			enc_fields[i] = allInd; nbFinal++;			break;		default:			gf_node_get_field(clone, allInd, &clone_field);			if (!gf_sg_vrml_field_equal(clone_field.far_ptr, field.far_ptr, field.fieldType)) { enc_fields[i] = allInd; nbFinal++; }			break;		}	}	if (clone) gf_node_unregister(clone, NULL);	use_list = 1;	/* patch for FDP node : */	/* cannot use default field sorting due to spec "mistake", so use list to imply inversion between field 2 and field 3 of FDP*/	if (node->sgprivate->tag == TAG_MPEG4_FDP) {		s32 s4SwapValue = enc_fields[2];		enc_fields[2] = enc_fields[3];		enc_fields[3] = s4SwapValue;		nodeIsFDP = 1;		use_list = 1;	}	/*number of bits in mask node is count*1, in list node is 1+nbFinal*(1+numBitsDEF) */	else if (count < 1+nbFinal*(1+numBitsDEF)) 		use_list = 0;	GF_BIFS_WRITE_INT(codec, bs, use_list ? 0 : 1, 1, "isMask", NULL);	for (i=0; i<count; i++) {		if (enc_fields[i] == -1) {			if (!use_list) GF_BIFS_WRITE_INT(codec, bs, 0, 1, "Mask", NULL);			continue;		}		allInd = (u32) enc_fields[i];		/*encode proto code*/		if (codec->encoding_proto) {			isedField = gf_bifs_enc_is_field_ised(codec, node, allInd);			if (isedField) {				if (use_list) {					GF_BIFS_WRITE_INT(codec, bs, 0, 1, "end", NULL);				} else {					GF_BIFS_WRITE_INT(codec, bs, 1, 1, "Mask", NULL);				}				GF_BIFS_WRITE_INT(codec, bs, 1, 1, "isedField", NULL);				if (use_list) GF_BIFS_WRITE_INT(codec, bs, allInd, numBitsALL, "nodeField", NULL);				if (isedField->ToNode == node) {					GF_BIFS_WRITE_INT(codec, bs, isedField->FromField.fieldIndex, nbBitsProto, "protoField", NULL);				} else {					GF_BIFS_WRITE_INT(codec, bs, isedField->ToField.fieldIndex, nbBitsProto, "protoField", NULL);				}				continue;			}		}		/*common case*/		gf_node_get_field(node, allInd, &field);		if (use_list) {			/*not end flag*/			GF_BIFS_WRITE_INT(codec, bs, 0, 1, "end", NULL);		} else {			/*mask flag*/			GF_BIFS_WRITE_INT(codec, bs, 1, 1, "Mask", NULL);		}		/*not ISed field*/		if (codec->encoding_proto) GF_BIFS_WRITE_INT(codec, bs, 0, 1, "isedField", NULL);		if (use_list) {			if (codec->encoding_proto || nodeIsFDP) {				u32 ind=0;				/*for proto, we're in ALL mode and we need DEF mode*/				/*for FDP, encoding requires to get def id from all id as fields 2 and 3 are reversed*/				gf_bifs_field_index_by_mode(node, allInd, GF_SG_FIELD_CODING_DEF, &ind);				GF_BIFS_WRITE_INT(codec, bs, ind, numBitsDEF, "field", (char*)field.name);			} else {				GF_BIFS_WRITE_INT(codec, bs, i, numBitsDEF, "field", (char*)field.name);			}		}		e = gf_bifs_enc_field(codec, bs, node, &field);		if (e) goto exit;	}	/*end flag*/	if (use_list) GF_BIFS_WRITE_INT(codec, bs, 1, 1, "end", NULL);exit:	free(enc_fields);	return e;}Bool BE_NodeIsUSE(GF_BifsEncoder * codec, GF_Node *node){	u32 i, count;	if (!node || !gf_node_get_id(node) ) return 0;	count = gf_list_count(codec->encoded_nodes);	for (i=0; i<count; i++) {		if (gf_list_get(codec->encoded_nodes, i) == node) return 1;	}	gf_list_add(codec->encoded_nodes, node);	return 0;}GF_Err gf_bifs_enc_node(GF_BifsEncoder * codec, GF_Node *node, u32 NDT_Tag, GF_BitStream *bs){	u32 NDTBits, node_type, node_tag, BVersion, node_id;	const char *node_name;	Bool flag;	GF_Node *new_node;	GF_Err e;	assert(codec->info);	/*NULL node is a USE of maxID*/	if (!node) {		GF_BIFS_WRITE_INT(codec, bs, 1, 1, "USE", NULL);		GF_BIFS_WRITE_INT(codec, bs, (1<<codec->info->config.NodeIDBits) - 1 , codec->info->config.NodeIDBits, "NodeID", "NULL");		return GF_OK;	}	flag = BE_NodeIsUSE(codec, node);	GF_BIFS_WRITE_INT(codec, bs, flag ? 1 : 0, 1, "USE", (char*)gf_node_get_class_name(node));	if (flag) {		gf_bs_write_int(bs, gf_node_get_id(node) - 1, codec->info->config.NodeIDBits);		new_node = gf_bifs_enc_find_node(codec, gf_node_get_id(node) );		if (!new_node) return codec->LastError = GF_SG_UNKNOWN_NODE;				/*restore QP14 length*/		switch (gf_node_get_tag(new_node)) {		case TAG_MPEG4_Coordinate:		{			u32 nbCoord = ((M_Coordinate *)new_node)->point.count;			gf_bifs_enc_qp14_enter(codec, 1);			gf_bifs_enc_qp14_set_length(codec, nbCoord);			gf_bifs_enc_qp14_enter(codec, 0);		}			break;		case TAG_MPEG4_Coordinate2D:		{			u32 nbCoord = ((M_Coordinate2D *)new_node)->point.count;			gf_bifs_enc_qp14_enter(codec, 1);			gf_bifs_enc_qp14_set_length(codec, nbCoord);			gf_bifs_enc_qp14_enter(codec, 0);		}			break;		}		return GF_OK;	}	BVersion = GF_BIFS_V1;	node_tag = node->sgprivate->tag;	while (1) {		node_type = gf_bifs_get_node_type(NDT_Tag, node_tag, BVersion);		NDTBits = gf_bifs_get_ndt_bits(NDT_Tag, BVersion);		if (BVersion==2 && (node_tag==TAG_ProtoNode)) node_type = 1;		GF_BIFS_WRITE_INT(codec, bs, node_type, NDTBits, "ndt", NULL);		if (node_type) break;		BVersion += 1;		if (BVersion > GF_BIFS_NUM_VERSION) return codec->LastError = GF_BIFS_UNKNOWN_VERSION;	}	if (BVersion==2 && node_type==1) {		GF_Proto *proto = ((GF_ProtoInstance *)node)->proto_interface;		GF_BIFS_WRITE_INT(codec, bs, proto->ID, codec->info->config.ProtoIDBits, "protoID", NULL);	}	/*special handling of 3D mesh*/	/*DEF'd node*/	node_name = gf_node_get_name_and_id(node, &node_id);	GF_BIFS_WRITE_INT(codec, bs, node_id ? 1 : 0, 1, "DEF", NULL);	if (node_id) {		GF_BIFS_WRITE_INT(codec, bs, node_id - 1, codec->info->config.NodeIDBits, "NodeID", NULL);		if (codec->info->UseName) gf_bifs_enc_name(codec, bs, (char*) node_name );	}	/*no updates of time fields for now - NEEDED FOR A LIVE ENCODER*/	/*QP14 case*/	switch (node_tag) {	case TAG_MPEG4_Coordinate:	case TAG_MPEG4_Coordinate2D:		gf_bifs_enc_qp14_enter(codec, 1);	}	e = EncNodeFields(codec, bs, node);	if (e) return e;	switch (node_tag) {	case TAG_MPEG4_IndexedFaceSet:	case TAG_MPEG4_IndexedFaceSet2D:	case TAG_MPEG4_IndexedLineSet:	case TAG_MPEG4_IndexedLineSet2D:		gf_bifs_enc_qp14_reset(codec);		break;	case TAG_MPEG4_Coordinate:	case TAG_MPEG4_Coordinate2D:		gf_bifs_enc_qp14_enter(codec, 0);		break;	}	return GF_OK;}

⌨️ 快捷键说明

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