/* this will be faster is we de-reference multiple sets in the same order as they were written */ int mxf_dereference_s(MXFHeaderMetadata* headerMetadata, MXFListIterator* setsIter, const mxfUUID* uuid, MXFMetadataSet** set) { MXFMetadataSet* setInList; long startIndex = mxf_get_list_iter_index(setsIter); /* try find it at the previous position in the list */ if (startIndex >= 0) { setInList = (MXFMetadataSet*)mxf_get_iter_element(setsIter); if (mxf_equals_uuid(uuid, &setInList->instanceUID)) { *set = setInList; return 1; } } /* try find it starting from the previous position in the list */ while (mxf_next_list_iter_element(setsIter)) { setInList = (MXFMetadataSet*)mxf_get_iter_element(setsIter); if (mxf_equals_uuid(uuid, &setInList->instanceUID)) { *set = setInList; return 1; } } /* go back to beginning and try find it before the previous position in the list */ initialise_sets_iter(headerMetadata, setsIter); while (mxf_next_list_iter_element(setsIter) && mxf_get_list_iter_index(setsIter) < startIndex) { setInList = (MXFMetadataSet*)mxf_get_iter_element(setsIter); if (mxf_equals_uuid(uuid, &setInList->instanceUID)) { *set = setInList; return 1; } } return 0; }
static int archive_mxf_get_package_timecode_breaks(MXFHeaderMetadata* headerMetadata, MXFMetadataSet* packageSet, TimecodeBreak** timecodeBreaks, long* numTimecodeBreaks) { MXFArrayItemIterator arrayIter; MXFArrayItemIterator arrayIter2; uint8_t* arrayElement; uint32_t arrayElementLen; mxfUL dataDef; uint32_t count; MXFMetadataSet* packageTrackSet; MXFMetadataSet* sequenceSet; MXFMetadataSet* dmSet; MXFMetadataSet* dmFrameworkSet; MXFListIterator setsIter; TimecodeBreak* newTimecodeBreaks = NULL; long totalBreaks = 0; TimecodeBreak* tmp; CHK_OFAIL(mxf_uu_get_package_tracks(packageSet, &arrayIter)); while (mxf_uu_next_track(headerMetadata, &arrayIter, &packageTrackSet)) { CHK_OFAIL(mxf_uu_get_track_datadef(packageTrackSet, &dataDef)); if (mxf_is_descriptive_metadata(&dataDef)) { /* get to the sequence */ CHK_OFAIL(mxf_get_strongref_item(packageTrackSet, &MXF_ITEM_K(GenericTrack, Sequence), &sequenceSet)); if (mxf_is_subclass_of(headerMetadata->dataModel, &sequenceSet->key, &MXF_SET_K(Sequence))) { CHK_OFAIL(mxf_get_array_item_count(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &count)); if (count == 0) { continue; } CHK_OFAIL(mxf_get_array_item_element(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), 0, &arrayElement)); CHK_OFAIL(mxf_get_strongref(headerMetadata, arrayElement, &dmSet)); } else { dmSet = sequenceSet; } /* if it is a DMSegment with a DMFramework reference then we have the DMS track */ if (mxf_is_subclass_of(headerMetadata->dataModel, &dmSet->key, &MXF_SET_K(DMSegment))) { if (mxf_have_item(dmSet, &MXF_ITEM_K(DMSegment, DMFramework))) { CHK_OFAIL(mxf_get_strongref_item(dmSet, &MXF_ITEM_K(DMSegment, DMFramework), &dmFrameworkSet)); /* check whether the DMFrameworkSet is a APP_TimecodeBreakFramework */ if (mxf_is_subclass_of(headerMetadata->dataModel, &dmFrameworkSet->key, &MXF_SET_K(APP_TimecodeBreakFramework))) { /* go back to the sequence and extract the timecode breaks */ CHK_OFAIL(mxf_get_array_item_count(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &count)); if (newTimecodeBreaks == NULL) { CHK_OFAIL((tmp = malloc(sizeof(TimecodeBreak) * (totalBreaks + count))) != NULL); } else { /* multiple tracks with timecode breaks - reallocate the array */ CHK_OFAIL((tmp = realloc(newTimecodeBreaks, sizeof(TimecodeBreak) * (totalBreaks + count))) != NULL); } newTimecodeBreaks = tmp; /* extract the digibeta dropouts */ initialise_sets_iter(headerMetadata, &setsIter); mxf_initialise_array_item_iterator(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &arrayIter2); while (mxf_next_array_item_element(&arrayIter2, &arrayElement, &arrayElementLen)) { TimecodeBreak* timecodeBreak = &newTimecodeBreaks[totalBreaks]; CHK_OFAIL(mxf_get_strongref_s(headerMetadata, &setsIter, arrayElement, &dmSet)); CHK_OFAIL(mxf_get_position_item(dmSet, &MXF_ITEM_K(DMSegment, EventStartPosition), &timecodeBreak->position)); CHK_OFAIL(mxf_get_strongref_item_s(&setsIter, dmSet, &MXF_ITEM_K(DMSegment, DMFramework), &dmFrameworkSet)); CHK_OFAIL(mxf_get_uint16_item(dmFrameworkSet, &MXF_ITEM_K(APP_TimecodeBreakFramework, APP_TimecodeType), &timecodeBreak->timecodeType)); totalBreaks++; } } } } } } *timecodeBreaks = newTimecodeBreaks; *numTimecodeBreaks = totalBreaks; return 1; fail: SAFE_FREE(&newTimecodeBreaks); return 0; }
static int archive_mxf_get_package_pse_failures(MXFHeaderMetadata* headerMetadata, MXFMetadataSet* packageSet, PSEFailure** failures, long* numFailures) { MXFArrayItemIterator arrayIter; MXFArrayItemIterator arrayIter2; uint8_t* arrayElement; uint32_t arrayElementLen; mxfUL dataDef; uint32_t count; MXFMetadataSet* packageTrackSet; MXFMetadataSet* sequenceSet; MXFMetadataSet* dmSet; MXFMetadataSet* dmFrameworkSet; MXFListIterator setsIter; PSEFailure* newFailures = NULL; long countedPSEFailures = 0; PSEFailure* tmp; int32_t i; CHK_OFAIL(mxf_uu_get_package_tracks(packageSet, &arrayIter)); while (mxf_uu_next_track(headerMetadata, &arrayIter, &packageTrackSet)) { CHK_OFAIL(mxf_uu_get_track_datadef(packageTrackSet, &dataDef)); if (mxf_is_descriptive_metadata(&dataDef)) { /* get to the sequence */ CHK_OFAIL(mxf_get_strongref_item(packageTrackSet, &MXF_ITEM_K(GenericTrack, Sequence), &sequenceSet)); if (mxf_is_subclass_of(headerMetadata->dataModel, &sequenceSet->key, &MXF_SET_K(Sequence))) { CHK_OFAIL(mxf_get_array_item_count(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &count)); if (count == 0) { continue; } CHK_OFAIL(mxf_get_array_item_element(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), 0, &arrayElement)); CHK_OFAIL(mxf_get_strongref(headerMetadata, arrayElement, &dmSet)); } else { dmSet = sequenceSet; } /* if it is a DMSegment with a DMFramework reference then we have the DMS track */ if (mxf_is_subclass_of(headerMetadata->dataModel, &dmSet->key, &MXF_SET_K(DMSegment))) { if (mxf_have_item(dmSet, &MXF_ITEM_K(DMSegment, DMFramework))) { CHK_OFAIL(mxf_get_strongref_item(dmSet, &MXF_ITEM_K(DMSegment, DMFramework), &dmFrameworkSet)); /* check whether the DMFrameworkSet is a APP_PSEAnalysisFramework */ if (mxf_is_subclass_of(headerMetadata->dataModel, &dmFrameworkSet->key, &MXF_SET_K(APP_PSEAnalysisFramework))) { /* go back to the sequence and extract the PSE failures */ CHK_OFAIL(mxf_get_array_item_count(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &count)); countedPSEFailures += count; if (newFailures == NULL) { CHK_OFAIL((tmp = malloc(sizeof(PSEFailure) * countedPSEFailures)) != NULL); } else { /* multiple tracks with PSE failures - reallocate the array */ CHK_OFAIL((tmp = realloc(newFailures, sizeof(PSEFailure) * countedPSEFailures)) != NULL); } newFailures = tmp; /* extract the PSE failures */ initialise_sets_iter(headerMetadata, &setsIter); i = 0; mxf_initialise_array_item_iterator(sequenceSet, &MXF_ITEM_K(Sequence, StructuralComponents), &arrayIter2); while (mxf_next_array_item_element(&arrayIter2, &arrayElement, &arrayElementLen)) { PSEFailure* pseFailure = &newFailures[i]; CHK_OFAIL(mxf_get_strongref_s(headerMetadata, &setsIter, arrayElement, &dmSet)); CHK_OFAIL(mxf_get_position_item(dmSet, &MXF_ITEM_K(DMSegment, EventStartPosition), &pseFailure->position)); CHK_OFAIL(mxf_get_strongref_item_s(&setsIter, dmSet, &MXF_ITEM_K(DMSegment, DMFramework), &dmFrameworkSet)); CHK_OFAIL(mxf_get_int16_item(dmFrameworkSet, &MXF_ITEM_K(APP_PSEAnalysisFramework, APP_RedFlash), &pseFailure->redFlash)); CHK_OFAIL(mxf_get_int16_item(dmFrameworkSet, &MXF_ITEM_K(APP_PSEAnalysisFramework, APP_SpatialPattern), &pseFailure->spatialPattern)); CHK_OFAIL(mxf_get_int16_item(dmFrameworkSet, &MXF_ITEM_K(APP_PSEAnalysisFramework, APP_LuminanceFlash), &pseFailure->luminanceFlash)); CHK_OFAIL(mxf_get_boolean_item(dmFrameworkSet, &MXF_ITEM_K(APP_PSEAnalysisFramework, APP_ExtendedFailure), &pseFailure->extendedFailure)); i++; } break; } } } } } *failures = newFailures; *numFailures = countedPSEFailures; return 1; fail: SAFE_FREE(&newFailures); return 0; }