[FFmpeg-cvslog] avformat/mxfdec: do not use AnyType when resolving Descriptors and MultipleDescriptors

Marton Balint git at videolan.org
Tue Mar 19 22:17:42 EET 2024


ffmpeg | branch: release/5.1 | Marton Balint <cus at passwd.hu> | Fri Feb 16 21:53:16 2024 +0100| [68f0e9645d6804015a5e0c2c0560fdfe0425e902] | committer: Marton Balint

avformat/mxfdec: do not use AnyType when resolving Descriptors and MultipleDescriptors

By using AnyType for resolving a strong reference we searched among all types,
not just the ones which can be the target of the reference, which in some cases
caused to find the wrong type, if the metadata set UUIDs were not unique.

UUIDs do not have to be unique if their type sets them apart, SMPTE 377M says:

> StrongRef: 'One to One’ relationship between sets and implemented in MXF
> with UUIDs. Strong References are typed which means that the definition
> identifies the kind of set which is the target of the reference.

Fixes ticket #10865.

Signed-off-by: Marton Balint <cus at passwd.hu>
(cherry picked from commit 68f2b32ef2b29aa95488531b007adde92ca82165)

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=68f0e9645d6804015a5e0c2c0560fdfe0425e902
---

 libavformat/mxfdec.c | 19 ++++++++-----------
 1 file changed, 8 insertions(+), 11 deletions(-)

diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index bbcc5643c5..d6a0200ad9 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -2203,16 +2203,14 @@ static MXFPackage* mxf_resolve_source_package(MXFContext *mxf, UID package_ul, U
 
 static MXFDescriptor* mxf_resolve_descriptor(MXFContext *mxf, UID *strong_ref, int track_id)
 {
-    MXFDescriptor *descriptor, *file_descriptor = NULL;
-    int i;
-
-    descriptor = mxf_resolve_strong_ref(mxf, strong_ref, AnyType);
-    if (!descriptor)
-        return NULL;
+    MXFDescriptor *descriptor = mxf_resolve_strong_ref(mxf, strong_ref, Descriptor);
+    if (descriptor)
+        return descriptor;
 
-    if (descriptor->meta.type == MultipleDescriptor) {
-        for (i = 0; i < descriptor->file_descriptors_count; i++) {
-            file_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->file_descriptors_refs[i], Descriptor);
+    descriptor = mxf_resolve_strong_ref(mxf, strong_ref, MultipleDescriptor);
+    if (descriptor) {
+        for (int i = 0; i < descriptor->file_descriptors_count; i++) {
+            MXFDescriptor *file_descriptor = mxf_resolve_strong_ref(mxf, &descriptor->file_descriptors_refs[i], Descriptor);
 
             if (!file_descriptor) {
                 av_log(mxf->fc, AV_LOG_ERROR, "could not resolve file descriptor strong ref\n");
@@ -2222,8 +2220,7 @@ static MXFDescriptor* mxf_resolve_descriptor(MXFContext *mxf, UID *strong_ref, i
                 return file_descriptor;
             }
         }
-    } else if (descriptor->meta.type == Descriptor)
-        return descriptor;
+    }
 
     return NULL;
 }



More information about the ffmpeg-cvslog mailing list