Am 2021-05-24 17:31, schrieb Tomas Härdin:
mån 2021-05-24 klockan 12:30 +0200 skrev emcodem:
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.

This needs a sample and a test
Sure, Will add.


---
 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)

This and mxf_resolve_strong_ref() could maybe be merged to one function
with an "int dir" option, and mxf_resolve_strong_ref() just calling it
with the value 1.


Will delete the revers function and alter the mxf_resolve_strong_ref as suggested.

+{
+    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;
+}

Missing newline, but I can add that locally

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) {

I feel like this should trigger on OpenIncomplete instead. I wouldn't
be surprised if start_frame < 0 is perfectly valid.

OK thats an interesting discussion, from my perspective there is a little gray area here and what i did should deliver the best effort. My thoughts are: *) openincomplete may or may not carry the correct value, it is not guaranteed to carry the wrong value
*) there may not be a footer (file truncated, file growing)
*) if a footer is there, it may or may not repeat the header metadata
*) all 377m versions say "if values are unknonwn (open/incomplete), one must use the "distinguished value", but none of the 377m up to 2011 define such a value for the start timecode - BUT my guess was that this distinguished value shall be a valid TC, instead of e.g. "-1" (FFFF...) because the value -1 would potentially fail in the TC parsing code (thinking globally here, not only for libav*) *) if the Start TC is actually 0 AND there is a Footer Metadata repetition, my code still works because it will take the value 0 from the footer

So after all i believe checking for "openincomplete" would be kind of superfluous for this usecase. Checking if there is another value than 0 in the footer does not really hurt and as the footer is guaranteed to carry the correct timecode, it should never return a really wrong value. The really correct solution i believe would be to parse ALL metadata from footer (if any) first but i don't want to change the mxfdec.c fundamentally just for this sidecase.



+            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;

Wrong indent. I was also going to comment that mxf_tc might end up NULL
here but it can't since it's non-NULL when resolving in the forward
direction.

Yeah, in worst case the reverse parsing should return exactly the same value as the forward parsing did, so i guess we are safe here. My intention was to be backward compatible as far as possible.


/Tomas


Hi Tomas, thanks for the quick reply.
OK i'll try to get hold of a short example file, upload to the fate suite and add a test. If i cannot get a very short sample (XDCAM, ~1-2 GOP's), i'll make some up by altering values using hex editor if thats ok for you. Other comments inline, please let me know your thougts - AND as i am pretty new to sending patches here, please also let me know if you like me to send ONE patch with the new code for mxfdec.c AND the test or you want me to send it separately?

Thanks,
-emcodem
_______________________________________________
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