diff --git a/libs/aaf/AAFCore.c b/libs/aaf/AAFCore.c index 1b031b61f4..3c521f84bf 100644 --- a/libs/aaf/AAFCore.c +++ b/libs/aaf/AAFCore.c @@ -1951,8 +1951,8 @@ retrieveProperty (AAF_Data* aafd, aafObject* Obj, aafPropertyDef* Def, aafProper Prop->sf = p->_storedForm; /* - TODO Prop->len / Prop->val ---> retrieveStrongReference() retrieveStrongReferenceSet() retrieveStrongReferenceVector() - only used to retrieve node name ? There could be a better approach. + TODO Prop->len / Prop->val ---> retrieveStrongReference() retrieveStrongReferenceSet() retrieveStrongReferenceVector() + only used to retrieve node name ? There could be a better approach. */ Prop->len = p->_length; @@ -2127,18 +2127,18 @@ getNodeProperties (AAF_Data* aafd, cfbNode* Node) */ /* - uint32_t prop_sz = sizeof(aafPropertyIndexHeader_t); + uint32_t prop_sz = sizeof(aafPropertyIndexHeader_t); - uint32_t i = 0; + uint32_t i = 0; - for ( i = 0; i < ((aafPropertyIndexHeader_t*)stream)->_entryCount; i++ ) - prop_sz += (((aafPropertyIndexEntry_t*)(stream+((sizeof(aafPropertyIndexEntry_t)*i)+sizeof(aafPropertyIndexHeader_t))))->_length) + sizeof(aafPropertyIndexEntry_t); + for ( i = 0; i < ((aafPropertyIndexHeader_t*)stream)->_entryCount; i++ ) + prop_sz += (((aafPropertyIndexEntry_t*)(stream+((sizeof(aafPropertyIndexEntry_t)*i)+sizeof(aafPropertyIndexHeader_t))))->_length) + sizeof(aafPropertyIndexEntry_t); - if ( prop_sz != stream_sz ) - warning( L"Stream length (%lu Bytes) does not match property length (%u Bytes).", - stream_sz, - prop_sz ); -*/ + if ( prop_sz != stream_sz ) + warning( L"Stream length (%lu Bytes) does not match property length (%u Bytes).", + stream_sz, + prop_sz ); + */ return stream; } diff --git a/libs/aaf/AAFDump.c b/libs/aaf/AAFDump.c index 34a92ce88d..70084a0f7a 100644 --- a/libs/aaf/AAFDump.c +++ b/libs/aaf/AAFDump.c @@ -131,7 +131,7 @@ aaf_dump_TaggedValueSet (AAF_Data* aafd, aafObject* ObjCollection, const char* p ANSI_COLOR_DARKGREY (log), (name) ? name : "", ANSI_COLOR_RESET (log), - (name) ? (size_t) (34 - (int)strlen (name)) : (size_t) (34 - strlen ("")), " ", + (name) ? (size_t)(34 - (int)strlen (name)) : (size_t)(34 - strlen ("")), " ", ANSI_COLOR_DARKGREY (log), aaft_TypeIDToText (&indirect->TypeDef), ANSI_COLOR_RESET (log), diff --git a/libs/aaf/AAFIEssenceFile.c b/libs/aaf/AAFIEssenceFile.c index b52bd3ebc6..baa29af6f6 100644 --- a/libs/aaf/AAFIEssenceFile.c +++ b/libs/aaf/AAFIEssenceFile.c @@ -888,3 +888,44 @@ externalAudioDataReaderCallback (unsigned char* buf, size_t offset, size_t reqle return byteRead; } + +aafiAudioEssencePointer* +aafi_audioEssencePointer_exists_before (AAF_Iface* aafi, aafiAudioEssencePointer* audioEssencePointerList) +{ + aafiAudioTrack* at = NULL; + aafiTimelineItem* ai = NULL; + aafiAudioClip* ac = NULL; + + aafiAudioEssencePointer* aep1 = NULL; + aafiAudioEssencePointer* aep2 = NULL; + + AAFI_foreachAudioTrack (aafi, at) + { + AAFI_foreachTrackItem (at, ai) + { + if (ai->type != AAFI_AUDIO_CLIP) { + continue; + } + + ac = (aafiAudioClip*)ai->data; + aep1 = audioEssencePointerList; + + int found = 1; + + AAFI_foreachEssencePointer (ac->essencePointerList, aep2) + { + if (!aep1 || aep1->essenceFile != aep2->essenceFile || aep1->essenceChannel != aep2->essenceChannel) { + found = 0; + break; + } + aep1 = aep1->next; + } + + if (found && aep1 == NULL) { + return ac->essencePointerList; + } + } + } + + return NULL; +} diff --git a/libs/aaf/AAFIParser.c b/libs/aaf/AAFIParser.c index 07c92df314..38cfe06c6f 100644 --- a/libs/aaf/AAFIParser.c +++ b/libs/aaf/AAFIParser.c @@ -3166,12 +3166,23 @@ aafi_retrieveData (AAF_Iface* aafi) AAFI_foreachTrackItem (audioTrack, audioItem) { - if (audioItem->type == AAFI_TRANS) { + if (audioItem->type != AAFI_AUDIO_CLIP) { continue; } audioClip = (aafiAudioClip*)audioItem->data; audioClip->channels = aafi_getAudioEssencePointerChannelCount (audioClip->essencePointerList); + + /* + * we check if any previous clip is using the exact same essence pointer, + * to avoid duplication and allow to detect when multiple clips are using + * the same essence. + */ + aafiAudioEssencePointer* prev = aafi_audioEssencePointer_exists_before (aafi, audioClip->essencePointerList); + + if (prev) { + audioClip->essencePointerList = prev; + } } } diff --git a/libs/aaf/AAFIface.c b/libs/aaf/AAFIface.c index 24919fe339..31e0245c1e 100644 --- a/libs/aaf/AAFIface.c +++ b/libs/aaf/AAFIface.c @@ -214,6 +214,12 @@ aafi_release (AAF_Iface** aafi) aafi_freeAudioTracks (&(*aafi)->Audio->Tracks); aafi_freeAudioEssences (&(*aafi)->Audio->essenceFiles); + aafiAudioEssencePointer* essencePointer = (*aafi)->Audio->essencePointerList; + + while (essencePointer) { + essencePointer = aafi_freeAudioEssencePointer (essencePointer); + } + free ((*aafi)->Audio); } @@ -358,7 +364,7 @@ aafi_convertUnit (aafPosition_t value, aafRational_t* valueEditRate, aafRational return 0; } - return (aafPosition_t) ((double)value * (destEditRateFloat / valueEditRateFloat)); + return (aafPosition_t)((double)value * (destEditRateFloat / valueEditRateFloat)); } uint64_t @@ -391,7 +397,7 @@ aafi_convertUnitUint64 (aafPosition_t value, aafRational_t* valueEditRate, aafRa return 0; } - return (uint64_t) ((double)value * (destEditRateFloat / valueEditRateFloat)); + return (uint64_t)((double)value * (destEditRateFloat / valueEditRateFloat)); } int @@ -506,8 +512,8 @@ aafi_applyGainOffset (AAF_Iface* aafi, aafiAudioGain** gain, aafiAudioGain* offs * is the same accross all gains in file. Thus, we devide both gain numbers * by offset denominator, so we fit inside uint32_t. */ - (*gain)->value[i].numerator = (int32_t) (((int64_t) (*gain)->value[i].numerator * (int64_t)offset->value[0].numerator) / (int64_t)offset->value[0].denominator); - (*gain)->value[i].denominator = (int32_t) (((int64_t) (*gain)->value[i].denominator * (int64_t)offset->value[0].denominator) / (int64_t)offset->value[0].denominator); + (*gain)->value[i].numerator = (int32_t)(((int64_t)(*gain)->value[i].numerator * (int64_t)offset->value[0].numerator) / (int64_t)offset->value[0].denominator); + (*gain)->value[i].denominator = (int32_t)(((int64_t)(*gain)->value[i].denominator * (int64_t)offset->value[0].denominator) / (int64_t)offset->value[0].denominator); // debug( "Setting (*gain)->value[%i] = %i/%i * %i/%i", // i, // (*gain)->value[i].numerator, @@ -798,11 +804,11 @@ aafi_newAudioEssencePointer (AAF_Iface* aafi, aafiAudioEssencePointer** list, aa last->next = essencePointer; } else { *list = essencePointer; - - essencePointer->aafiNext = aafi->Audio->essencePointerList; - aafi->Audio->essencePointerList = essencePointer; } + essencePointer->aafiNext = aafi->Audio->essencePointerList; + aafi->Audio->essencePointerList = essencePointer; + return *list; } @@ -985,8 +991,6 @@ aafi_freeAudioClip (aafiAudioClip* audioClip) aafi_freeAudioGain (audioClip->automation); aafi_freeMetadata (&(audioClip->metadata)); - aafi_freeAudioEssencePointer (audioClip->essencePointerList); - free (audioClip); } @@ -1042,16 +1046,14 @@ aafi_freeMetadata (aafiMetaData** CommentList) *CommentList = NULL; } -void +aafiAudioEssencePointer* aafi_freeAudioEssencePointer (aafiAudioEssencePointer* essencePointer) { - aafiAudioEssencePointer* next = NULL; + aafiAudioEssencePointer* next = essencePointer->aafiNext; - while (essencePointer) { - next = essencePointer->next; - free (essencePointer); - essencePointer = next; - } + free (essencePointer); + + return next; } void diff --git a/libs/aaf/AAFToText.c b/libs/aaf/AAFToText.c index 454644aa46..6a335a47f9 100644 --- a/libs/aaf/AAFToText.c +++ b/libs/aaf/AAFToText.c @@ -1912,19 +1912,19 @@ aaft_PIDToText (AAF_Data* aafd, aafPID_t pid) return "PID_BWFImportDescriptor_UnknownBWFChunks"; /* the following is marked as "dynamic" in ref implementation : - * AAF/ref-impl/include/ref-api/AAFTypes.h - * - * case PID_MPEGVideoDescriptor_SingleSequence: - * case PID_MPEGVideoDescriptor_ConstantBPictureCount: - * case PID_MPEGVideoDescriptor_CodedContentScanning: - * case PID_MPEGVideoDescriptor_LowDelay: - * case PID_MPEGVideoDescriptor_ClosedGOP: - * case PID_MPEGVideoDescriptor_IdenticalGOP: - * case PID_MPEGVideoDescriptor_MaxGOP: - * case PID_MPEGVideoDescriptor_MaxBPictureCount: - * case PID_MPEGVideoDescriptor_BitRate: - * case PID_MPEGVideoDescriptor_ProfileAndLevel: - */ + * AAF/ref-impl/include/ref-api/AAFTypes.h + * + * case PID_MPEGVideoDescriptor_SingleSequence: + * case PID_MPEGVideoDescriptor_ConstantBPictureCount: + * case PID_MPEGVideoDescriptor_CodedContentScanning: + * case PID_MPEGVideoDescriptor_LowDelay: + * case PID_MPEGVideoDescriptor_ClosedGOP: + * case PID_MPEGVideoDescriptor_IdenticalGOP: + * case PID_MPEGVideoDescriptor_MaxGOP: + * case PID_MPEGVideoDescriptor_MaxBPictureCount: + * case PID_MPEGVideoDescriptor_BitRate: + * case PID_MPEGVideoDescriptor_ProfileAndLevel: + */ case PID_ClassDefinition_ParentClass: return "PID_ClassDefinition_ParentClass"; diff --git a/libs/aaf/LibCFB.c b/libs/aaf/LibCFB.c index 6d2130cc78..0e6351eea8 100644 --- a/libs/aaf/LibCFB.c +++ b/libs/aaf/LibCFB.c @@ -729,7 +729,7 @@ cfb_getStream (CFB_Data* cfbd, cfbNode* node, unsigned char** stream, uint64_t* return 0; } - cpy_sz = ((stream_len - offset) < (uint64_t) (1 << cfbd->hdr->_uMiniSectorShift)) ? (stream_len - offset) : (uint64_t) (1 << cfbd->hdr->_uMiniSectorShift); + cpy_sz = ((stream_len - offset) < (uint64_t)(1 << cfbd->hdr->_uMiniSectorShift)) ? (stream_len - offset) : (uint64_t)(1 << cfbd->hdr->_uMiniSectorShift); memcpy (*stream + offset, buf, cpy_sz); @@ -740,7 +740,7 @@ cfb_getStream (CFB_Data* cfbd, cfbNode* node, unsigned char** stream, uint64_t* } else { CFB_foreachSectorInChain (cfbd, buf, id) { - cpy_sz = ((stream_len - offset) < (uint64_t) (1 << cfbd->hdr->_uSectorShift)) ? (stream_len - offset) : (uint64_t) (1 << cfbd->hdr->_uSectorShift); + cpy_sz = ((stream_len - offset) < (uint64_t)(1 << cfbd->hdr->_uSectorShift)) ? (stream_len - offset) : (uint64_t)(1 << cfbd->hdr->_uSectorShift); memcpy (*stream + offset, buf, cpy_sz); @@ -1073,7 +1073,7 @@ cfb_retrieveMiniFAT (CFB_Data* cfbd) * its ID (a.k.a SID) : * * ``` - cfbNode *node = CFB_Data.nodes[ID]; + cfbNode *node = CFB_Data.nodes[ID]; * ``` * * @param cfbd Pointer to the CFB_Data structure. diff --git a/libs/aaf/URIParser.c b/libs/aaf/URIParser.c index e09ecf2ce0..75ac32d24c 100644 --- a/libs/aaf/URIParser.c +++ b/libs/aaf/URIParser.c @@ -92,16 +92,16 @@ typedef SSIZE_T ssize_t; (uri->scheme_t != URI_SCHEME_T_FILE && \ !(uri->opts & URI_OPT_IGNORE_FRAGMENT)) -#define URI_SET_STR(str, start, end) \ - \ - str = malloc (sizeof (char) * (uint32_t) ((end - start) + 1)); \ - \ - if (!str) { \ - error ("Out of memory"); \ - goto err; \ - } \ - \ - snprintf (str, (uint32_t) (end - start) + 1, "%s", start); +#define URI_SET_STR(str, start, end) \ + \ + str = malloc (sizeof (char) * (uint32_t)((end - start) + 1)); \ + \ + if (!str) { \ + error ("Out of memory"); \ + goto err; \ + } \ + \ + snprintf (str, (uint32_t)(end - start) + 1, "%s", start); static char* uriDecodeString (char* src, char* dst); @@ -787,7 +787,7 @@ uriIsIPv6 (const char* s, size_t size, char** err) if (!IS_DIGIT (*(s + i))) { loopback = -1; } else { - loopback += (*(s + i) - '0'); //atoi(*(s+i)); + loopback += (*(s + i) - '0'); // atoi(*(s+i)); } } diff --git a/libs/aaf/aaf/AAFCore.h b/libs/aaf/aaf/AAFCore.h index 2a50f7c90f..99daf3eb22 100644 --- a/libs/aaf/aaf/AAFCore.h +++ b/libs/aaf/aaf/AAFCore.h @@ -601,7 +601,7 @@ typedef struct _aafData { */ #define aafRationalToint64(r) \ - (((r).denominator == 0) ? 0 : (int64_t) ((r).numerator / (r).denominator)) + (((r).denominator == 0) ? 0 : (int64_t)((r).numerator / (r).denominator)) /** * Loops through each aafPropertyIndexEntry_t of a "properties" node stream. diff --git a/libs/aaf/aaf/AAFIEssenceFile.h b/libs/aaf/aaf/AAFIEssenceFile.h index a3b020f118..d87504e5a7 100644 --- a/libs/aaf/aaf/AAFIEssenceFile.h +++ b/libs/aaf/aaf/AAFIEssenceFile.h @@ -55,6 +55,9 @@ aafi_parse_audio_essence (AAF_Iface* aafi, aafiAudioEssenceFile* audioEssenceFil int aafi_build_unique_audio_essence_name (AAF_Iface* aafi, aafiAudioEssenceFile* audioEssenceFile); +aafiAudioEssencePointer* +aafi_audioEssencePointer_exists_before (AAF_Iface* aafi, aafiAudioEssencePointer* audioEssencePointerList); + /** * @} */ diff --git a/libs/aaf/aaf/AAFIface.h b/libs/aaf/aaf/AAFIface.h index 39979c2683..27eb60f3fa 100644 --- a/libs/aaf/aaf/AAFIface.h +++ b/libs/aaf/aaf/AAFIface.h @@ -468,11 +468,11 @@ typedef struct aafiAudioClip { */ /* - * set with CompoMob's SourceClip::StartTime. In the case of an OperationGroup(AudioChannelCombiner), - * There is one SourceClip per audio channel. So even though it's very unlikely, there could possibly - * be one essence_offset per channel. - * Value is in edit unit, edit rate definition is aafiAudioTrack->edit_rate - */ + * set with CompoMob's SourceClip::StartTime. In the case of an OperationGroup(AudioChannelCombiner), + * There is one SourceClip per audio channel. So even though it's very unlikely, there could possibly + * be one essence_offset per channel. + * Value is in edit unit, edit rate definition is aafiAudioTrack->edit_rate + */ aafPosition_t essence_offset; aafiMetaData* metadata; @@ -1060,7 +1060,7 @@ aafi_freeMarkers (aafiMarker** aafi); void aafi_freeMetadata (aafiMetaData** CommentList); -void +aafiAudioEssencePointer* aafi_freeAudioEssencePointer (aafiAudioEssencePointer* audioEssenceGroupEntry); void diff --git a/libs/aaf/aaf/AAFTypes.h b/libs/aaf/aaf/AAFTypes.h index c7c27d8b5e..ef7a0aee62 100644 --- a/libs/aaf/aaf/AAFTypes.h +++ b/libs/aaf/aaf/AAFTypes.h @@ -57,33 +57,33 @@ typedef enum aafStoredForm_e { typedef int32_t AAFTypeCategory_t; typedef enum _eAAFTypeCategory_e { - AAFTypeCatUnknown = 0, // can only occur in damaged files - AAFTypeCatInt = 1, // any integral type - AAFTypeCatCharacter = 2, // any character type - AAFTypeCatStrongObjRef = 3, // strong object reference - AAFTypeCatWeakObjRef = 4, // weak object reference - AAFTypeCatRename = 5, // renamed type - AAFTypeCatEnum = 6, // enumerated type - AAFTypeCatFixedArray = 7, // fixed-size array - AAFTypeCatVariableArray = 8, // variably-sized array - AAFTypeCatSet = 9, // set of strong object references or - // set of weak object references - AAFTypeCatRecord = 10, // a structured type - AAFTypeCatStream = 11, // potentially huge amount of data - AAFTypeCatString = 12, // null-terminated variably-sized - // array of characters - AAFTypeCatExtEnum = 13, // extendible enumerated type - AAFTypeCatIndirect = 14, // type must be determined at runtime - AAFTypeCatOpaque = 15, // type can be determined at runtime - AAFTypeCatEncrypted = 16 // type can be determined at runtime - // but bits are encrypted + AAFTypeCatUnknown = 0, // can only occur in damaged files + AAFTypeCatInt = 1, // any integral type + AAFTypeCatCharacter = 2, // any character type + AAFTypeCatStrongObjRef = 3, // strong object reference + AAFTypeCatWeakObjRef = 4, // weak object reference + AAFTypeCatRename = 5, // renamed type + AAFTypeCatEnum = 6, // enumerated type + AAFTypeCatFixedArray = 7, // fixed-size array + AAFTypeCatVariableArray = 8, // variably-sized array + AAFTypeCatSet = 9, // set of strong object references or + // set of weak object references + AAFTypeCatRecord = 10, // a structured type + AAFTypeCatStream = 11, // potentially huge amount of data + AAFTypeCatString = 12, // null-terminated variably-sized + // array of characters + AAFTypeCatExtEnum = 13, // extendible enumerated type + AAFTypeCatIndirect = 14, // type must be determined at runtime + AAFTypeCatOpaque = 15, // type can be determined at runtime + AAFTypeCatEncrypted = 16 // type can be determined at runtime + // but bits are encrypted } AAFTypeCategory_e; */ /* * :: Types Definition * see Git nevali/aaf/ref-impl/include/ref-api/AAFTypes.h -*/ + */ typedef unsigned char aafByte_t; @@ -369,7 +369,7 @@ typedef struct _aafRGBAComponent_t { } aafRGBAComponent_t; -//typedef aafRGBAComponent_t aafRGBALayout[8]; +// typedef aafRGBAComponent_t aafRGBALayout[8]; /** * This structure map the first bytes in a **properties** stream @@ -521,7 +521,7 @@ typedef struct aafStrongRefSetEntry_t { * of the first aafStrongRefSetEntry_t is used to * form the name of the first element in the set and so * on. The #_localKey is an insertion key. - */ + */ uint32_t _localKey; @@ -588,7 +588,7 @@ typedef struct aafStrongRefVectorEntry_t { * of the first aafStrongRefVectorEntry_t is used to * form the name of the first element in the vector and so * on. The #_localKey is an insertion key. - */ + */ uint32_t _localKey; @@ -679,15 +679,15 @@ typedef struct _WeakReferenceIndexHeader { /* typedef struct _aafIndirect_t { - int type; - size_t size; - aafByte_t *data; + int type; + size_t size; + aafByte_t *data; } aafIndirect_t; typedef struct _AAF_TaggedValueClass { - aafString_t Name; - aafIndirect_t Value; + aafString_t Name; + aafIndirect_t Value; } AAF_ObjTaggedValue; */ diff --git a/libs/aaf/aaf/LibCFB.h b/libs/aaf/aaf/LibCFB.h index 0271e8258a..c06de43edb 100644 --- a/libs/aaf/aaf/LibCFB.h +++ b/libs/aaf/aaf/LibCFB.h @@ -710,7 +710,7 @@ typedef struct CFB_Data { */ #define CFB_getNodeStreamLen(cfbd, node) \ - ((cfbd->hdr->_uSectorShift > 9) ? (uint64_t) (((uint64_t) (node->_ulSizeHigh) << 32) | (node->_ulSizeLow)) : node->_ulSizeLow) + ((cfbd->hdr->_uSectorShift > 9) ? (uint64_t)(((uint64_t)(node->_ulSizeHigh) << 32) | (node->_ulSizeLow)) : node->_ulSizeLow) #define CFB_getStreamSectorShift(cfbd, node) \ ((CFB_getNodeStreamLen (cfbd, node) < cfbd->hdr->_ulMiniSectorCutoff) ? cfbd->hdr->_uMiniSectorShift : cfbd->hdr->_uSectorShift) diff --git a/libs/aaf/aaf/RIFFParser.h b/libs/aaf/aaf/RIFFParser.h index 8358b64186..6f6a3e098f 100644 --- a/libs/aaf/aaf/RIFFParser.h +++ b/libs/aaf/aaf/RIFFParser.h @@ -103,7 +103,7 @@ PACK (struct wavBextChunk { unsigned char umid[64]; /* since bext v2 (2011) - * + * * If any loudness parameter is not * being used, its value shall be * set to 0x7fff. Any value outside @@ -118,11 +118,11 @@ PACK (struct wavBextChunk { char reserved[180]; /* - Because it is variable size, we - do not include coding history - in the bext structure. However, - we know it starts at the end - of bext structure when parsing. + Because it is variable size, we + do not include coding history + in the bext structure. However, + we know it starts at the end + of bext structure when parsing. */ }); diff --git a/libs/aaf/aaf/version.h b/libs/aaf/aaf/version.h index 042917adfd..7751018042 100644 --- a/libs/aaf/aaf/version.h +++ b/libs/aaf/aaf/version.h @@ -1,2 +1,2 @@ #pragma once -#define LIBAAF_VERSION "v1.0-10-g13f0b0a" +#define LIBAAF_VERSION "v1.0-11-gb04c547" diff --git a/libs/aaf/utils.c b/libs/aaf/utils.c index fd232186d0..5df26b19ba 100644 --- a/libs/aaf/utils.c +++ b/libs/aaf/utils.c @@ -263,7 +263,7 @@ laaf_util_build_path (const char* sep, const char* first, ...) int written = snprintf (str + offset, len - offset, "%s%.*s", ((element_count == 0 && has_leading_sep) || (element_count > 0)) ? sep : "", - (uint32_t) (arglen - argstart), + (uint32_t)(arglen - argstart), arg + argstart); if (written < 0 || (size_t)written >= (len - offset)) {