From: Philip de N. <ph...@us...> - 2010-06-25 13:59:10
|
Update of /cvsroot/ingex/ingex/libMXF/lib/mxf In directory sfp-cvsdas-4.v30.ch3.sourceforge.com:/tmp/cvs-serv29117/lib/mxf Modified Files: mxf_data_model.c mxf_header_metadata.c mxf_labels_and_keys.c Log Message: Replace %lld with %PFi64 format macro in test_mxf_reader.c Added mxf_header_metadata::mxf_clone_set and mxf_data_model::mxf_clone_set_def to allow metadata to be cloned from one file to another (e.g. cloning the packages). Cloning weak refs not supported. Added OP-1B label for AS-02 writer Index: mxf_header_metadata.c =================================================================== RCS file: /cvsroot/ingex/ingex/libMXF/lib/mxf/mxf_header_metadata.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** mxf_header_metadata.c 2 Jun 2010 10:59:20 -0000 1.4 --- mxf_header_metadata.c 25 Jun 2010 13:59:02 -0000 1.5 *************** *** 414,417 **** --- 414,493 ---- + int mxf_clone_set(MXFMetadataSet* fromSet, MXFHeaderMetadata* toHeaderMetadata, MXFMetadataSet** toSet) + { + MXFMetadataSet* clonedSet = NULL; + MXFSetDef* fromSetDef; + MXFSetDef* toSetDef; + MXFListIterator fromItemIter; + MXFMetadataItem* toItem = NULL; + MXFItemDef* toItemDef = NULL; + MXFMetadataSet* fromRefSet = NULL; + MXFMetadataSet* toRefSet = NULL; + MXFArrayItemIterator fromArrayIter; + uint32_t count; + uint8_t* toUUIDElement; + uint8_t* fromUUIDElement; + uint32_t fromUUIDElementLen; + MXFListIterator fromSetsIter; + + CHK_ORET(mxf_find_set_def(fromSet->headerMetadata->dataModel, &fromSet->key, &fromSetDef)); + CHK_ORET(mxf_clone_set_def(fromSet->headerMetadata->dataModel, fromSetDef, + toHeaderMetadata->dataModel, &toSetDef)); + CHK_ORET(mxf_create_set(toHeaderMetadata, &fromSet->key, &clonedSet)); + + mxf_initialise_list_iter(&fromSetsIter, &fromSet->headerMetadata->sets); + + mxf_initialise_list_iter(&fromItemIter, &fromSet->items); + while (mxf_next_list_iter_element(&fromItemIter)) + { + MXFMetadataItem* fromItem = (MXFMetadataItem*)mxf_get_iter_element(&fromItemIter); + + CHK_OFAIL(mxf_find_item_def_in_set_def(&fromItem->key, toSetDef, &toItemDef)); + + if (toItemDef->typeId == MXF_WEAKREFARRAY_TYPE || + toItemDef->typeId == MXF_WEAKREFBATCH_TYPE || + toItemDef->typeId == MXF_WEAKREF_TYPE) + { + mxf_log_error("Not cloning item because weak reference clones are not yet supported" LOG_LOC_FORMAT, LOG_LOC_PARAMS); + continue; + } + else if (toItemDef->typeId == MXF_STRONGREFARRAY_TYPE || + toItemDef->typeId == MXF_STRONGREFBATCH_TYPE) + { + CHK_OFAIL(mxf_get_array_item_count(fromSet, &fromItem->key, &count)); + CHK_OFAIL(mxf_alloc_array_item_elements(clonedSet, &fromItem->key, mxfUUID_extlen, count, &toUUIDElement)); + + CHK_OFAIL(mxf_initialise_array_item_iterator(fromSet, &fromItem->key, &fromArrayIter)); + while (mxf_next_array_item_element(&fromArrayIter, &fromUUIDElement, &fromUUIDElementLen)) + { + CHK_OFAIL(mxf_get_strongref_s(fromSet->headerMetadata, &fromSetsIter, fromUUIDElement, &fromRefSet)); + CHK_OFAIL(mxf_clone_set(fromRefSet, toHeaderMetadata, &toRefSet)); + mxf_set_strongref(toRefSet, toUUIDElement); + + toUUIDElement += mxfUUID_extlen; + } + } + else if (toItemDef->typeId == MXF_STRONGREF_TYPE) + { + CHK_OFAIL(mxf_get_strongref_s(fromSet->headerMetadata, &fromSetsIter, fromItem->value, &fromRefSet)); + CHK_OFAIL(mxf_clone_set(fromRefSet, toHeaderMetadata, &toRefSet)); + CHK_OFAIL(mxf_set_strongref_item(clonedSet, &fromItem->key, toRefSet)); + } + else if (!mxf_equals_key(&toItemDef->key, &MXF_ITEM_K(InterchangeObject, InstanceUID)) && + !mxf_equals_key(&toItemDef->key, &MXF_ITEM_K(InterchangeObject, GenerationUID))) + { + CHK_OFAIL(get_or_create_set_item(toHeaderMetadata, clonedSet, &fromItem->key, &toItem)); + CHK_OFAIL(mxf_set_item_value(toItem, fromItem->value, fromItem->length)); + } + } + + *toSet = clonedSet; + return 1; + + fail: + mxf_remove_set(toHeaderMetadata, clonedSet); + return 0; + } + int mxf_read_header_metadata(MXFFile* mxfFile, MXFHeaderMetadata* headerMetadata, Index: mxf_labels_and_keys.c =================================================================== RCS file: /cvsroot/ingex/ingex/libMXF/lib/mxf/mxf_labels_and_keys.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** mxf_labels_and_keys.c 11 Sep 2007 13:24:55 -0000 1.2 --- mxf_labels_and_keys.c 25 Jun 2010 13:59:02 -0000 1.3 *************** *** 30,33 **** --- 30,34 ---- static const mxfUL g_opAtomPrefix = MXF_ATOM_OP_L(0); static const mxfUL g_op1APrefix = MXF_1A_OP_L(0); + static const mxfUL g_op1BPrefix = MXF_1B_OP_L(0); *************** *** 88,90 **** --- 89,95 ---- } + int is_op_1b(const mxfUL* label) + { + return memcmp(&g_op1BPrefix, label, 13) == 0; + } Index: mxf_data_model.c =================================================================== RCS file: /cvsroot/ingex/ingex/libMXF/lib/mxf/mxf_data_model.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** mxf_data_model.c 2 Jun 2010 10:59:20 -0000 1.7 --- mxf_data_model.c 25 Jun 2010 13:59:02 -0000 1.8 *************** *** 176,179 **** --- 176,254 ---- } + static int clone_item_type(MXFDataModel* fromDataModel, unsigned int fromItemTypeId, + MXFDataModel* toDataModel, MXFItemType** toItemType) + { + MXFItemType* clonedItemType = NULL; + MXFItemType* fromItemType; + MXFItemType* toRefItemType; + int i; + + clonedItemType = mxf_get_item_def_type(toDataModel, fromItemTypeId); + if (clonedItemType) + { + *toItemType = clonedItemType; + return 1; + } + + CHK_ORET((fromItemType = mxf_get_item_def_type(fromDataModel, fromItemTypeId)) != NULL); + + switch (fromItemType->category) + { + case MXF_BASIC_TYPE_CAT: + clonedItemType = mxf_register_basic_type(toDataModel, fromItemType->name, fromItemType->typeId, + fromItemType->info.basic.size); + CHK_ORET(clonedItemType); + break; + case MXF_ARRAY_TYPE_CAT: + CHK_ORET(clone_item_type(fromDataModel, fromItemType->info.array.elementTypeId, toDataModel, &toRefItemType)); + clonedItemType = mxf_register_array_type(toDataModel, fromItemType->name, fromItemType->typeId, + fromItemType->info.array.elementTypeId, + fromItemType->info.array.fixedSize); + CHK_ORET(clonedItemType); + break; + case MXF_COMPOUND_TYPE_CAT: + clonedItemType = mxf_register_compound_type(toDataModel, fromItemType->name, fromItemType->typeId); + CHK_ORET(clonedItemType); + + i = 0; + while (fromItemType->info.compound.members[i].typeId) + { + CHK_ORET(clone_item_type(fromDataModel, fromItemType->info.compound.members[i].typeId, + toDataModel, &toRefItemType)); + CHK_ORET(mxf_register_compound_type_member(clonedItemType, fromItemType->info.compound.members[i].name, + fromItemType->info.compound.members[i].typeId)); + i++; + } + break; + case MXF_INTERPRET_TYPE_CAT: + CHK_ORET(clone_item_type(fromDataModel, fromItemType->info.interpret.typeId, + toDataModel, &toRefItemType)); + clonedItemType = mxf_register_interpret_type(toDataModel, fromItemType->name, fromItemType->typeId, + fromItemType->info.interpret.typeId, + fromItemType->info.interpret.fixedArraySize); + CHK_ORET(clonedItemType); + break; + } + + *toItemType = clonedItemType; + return 1; + } + + static int clone_item_def(MXFDataModel* fromDataModel, MXFItemDef* fromItemDef, + MXFDataModel* toDataModel, MXFItemDef** toItemDef) + { + MXFItemType* toItemType; + + CHK_ORET(clone_item_type(fromDataModel, fromItemDef->typeId, toDataModel, &toItemType)); + + CHK_ORET(mxf_register_item_def(toDataModel, fromItemDef->name, &fromItemDef->setDefKey, &fromItemDef->key, + fromItemDef->localTag, fromItemDef->typeId, fromItemDef->isRequired)); + + *toItemDef = (MXFItemDef*)mxf_get_last_list_element(&toDataModel->itemDefs); + return 1; + } + + + #if defined(_MSC_VER) #pragma warning(push) *************** *** 685,686 **** --- 760,800 ---- + int mxf_clone_set_def(MXFDataModel* fromDataModel, MXFSetDef* fromSetDef, + MXFDataModel* toDataModel, MXFSetDef** toSetDef) + { + MXFSetDef* clonedSetDef = NULL; + MXFSetDef* toParentSetDef = NULL; + MXFListIterator iter; + MXFItemDef* fromItemDef; + MXFItemDef* toItemDef = NULL; + + if (!mxf_find_set_def(toDataModel, &fromSetDef->key, &clonedSetDef)) + { + if (fromSetDef->parentSetDef) + { + CHK_ORET(mxf_clone_set_def(fromDataModel, fromSetDef->parentSetDef, toDataModel, &toParentSetDef)); + } + + CHK_ORET(mxf_register_set_def(toDataModel, fromSetDef->name, &fromSetDef->parentSetDefKey, &fromSetDef->key)); + clonedSetDef = (MXFSetDef*)mxf_get_last_list_element(&toDataModel->setDefs); + clonedSetDef->parentSetDef = toParentSetDef; + } + + mxf_initialise_list_iter(&iter, &fromSetDef->itemDefs); + while (mxf_next_list_iter_element(&iter)) + { + fromItemDef = (MXFItemDef*)mxf_get_iter_element(&iter); + + if (mxf_find_item_def_in_set_def(&fromItemDef->key, clonedSetDef, &toItemDef)) + { + continue; + } + + CHK_ORET(clone_item_def(fromDataModel, fromItemDef, toDataModel, &toItemDef)); + CHK_ORET(mxf_append_list_element(&clonedSetDef->itemDefs, (void*)toItemDef)); + } + + *toSetDef = clonedSetDef; + return 1; + } + |