Added support for reading Start Timecode from Footer (if any). 
Specifically targets Omneon 6.4.3.0 but also works on other Versions and 
Vendors, e.g. when Header is OpenIncomplete.
Function mxf_resolve_strong_ref_reverse can potentially be re-used for getting 
other values like Duration and 
Origin from Footer.
---
 libavformat/mxfdec.c | 20 ++++++++++++++++++++
 1 file changed, 20 insertions(+)

diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
index 3bf480a3a6..557e01f8ed 100644
--- a/libavformat/mxfdec.c
+++ b/libavformat/mxfdec.c
@@ -1396,6 +1396,19 @@ static const MXFCodecUL *mxf_get_codec_ul(const 
MXFCodecUL *uls, UID *uid)
     return uls;
 }
 
+static void *mxf_resolve_strong_ref_reverse(MXFContext *mxf, UID *strong_ref, 
enum MXFMetadataSetType type)
+{
+    int i;
+    if (!strong_ref)
+        return NULL;
+    for (i = mxf->metadata_sets_count-1; i >= 0 ; i--) {
+        if (!memcmp(*strong_ref, mxf->metadata_sets[i]->uid, 16) &&
+            (type == AnyType || mxf->metadata_sets[i]->type == type)) {
+            return mxf->metadata_sets[i];
+        }
+    }
+    return NULL;
+}
 static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum 
MXFMetadataSetType type)
 {
     int i;
@@ -2328,8 +2341,15 @@ static int mxf_parse_structural_metadata(MXFContext *mxf)
                 continue;
 
             mxf_tc = (MXFTimecodeComponent*)component;
+            if (mxf_tc->start_frame <= 0) {
+                    av_log(mxf->fc, AV_LOG_TRACE, "Header Start Timecode was 
%d, trying reversed parsing\n",mxf_tc->start_frame);
+                    component = mxf_resolve_strong_ref_reverse(mxf, 
&material_track->sequence->structural_components_refs[j], TimecodeComponent);
+                    mxf_tc = (MXFTimecodeComponent*)component;
+            }
+
             flags = mxf_tc->drop_frame == 1 ? AV_TIMECODE_FLAG_DROPFRAME : 0;
             if (av_timecode_init(&tc, mxf_tc->rate, flags, 
mxf_tc->start_frame, mxf->fc) == 0) {
+                av_log(mxf->fc, AV_LOG_TRACE, "Setting Start Timecode: %d 
\n",mxf_tc->start_frame);
                 mxf_add_timecode_metadata(&mxf->fc->metadata, "timecode", &tc);
                 break;
             }
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to