[FFmpeg-devel] [PATCH] mxfdec.c: prefer metadata from Footer

Tomas Härdin tjoppen at acc.umu.se
Sun Jun 27 13:39:05 EEST 2021


sön 2021-06-27 klockan 12:03 +0200 skrev Marton Balint:
> 
> On Sat, 26 Jun 2021, emcodem wrote:
> 
> > In case there is a Footer, regarding to SMPTE 377 all versions, the metadata in Footer shall be correct (where in Header it can be incomplete)..
> > If there is no footer (stream, truncated...) it will still work as usual.
> > Tested with a huge set of files and compared old/new ffprobes, it will not change lots of metadata, mainly duration and in some cases start timecode.
> > Without this change, especially Duration would be often inaccurate because it is unknown in header and calculated from bitrate.
> > 
> > The new sample files should be added to \fate-suite\mxf, as i do not have an account to upload the files, i shared them on wetransfer:
> > 
> > https://we.tl/t-MVmyG2mZHq
> > 
> > omneon_6.4.1.0.1_xdcam_truncated.mxf
> > An original Omneon File from an older Version, file is truncated. It shall prove that Metadata is being parsed even when there is no Footer.
> > 
> > omneon_8.3.0.0_xdcam_startc_footer.mxf
> > An original Omneon File from a recent Version with "better" Metadata in Footer than in Header. I needed to hexedit this file and set the MP and SP start timecode in header to 0.
> > This test is for proving that metadata from Footer is preferred.
> > 
> > ---
> > libavformat/mxfdec.c                      |   2 +-
> > tests/fate/mxf.mak                        |  10 +
> > tests/ref/fate/mxf-probe-xdcamhd-oit      | 442 ++++++++++++++++++++++
> > tests/ref/fate/mxf-probe-xdcamhd-tcfooter | 442 ++++++++++++++++++++++
> > 4 files changed, 895 insertions(+), 1 deletion(-)
> > create mode 100644 tests/ref/fate/mxf-probe-xdcamhd-oit
> > create mode 100644 tests/ref/fate/mxf-probe-xdcamhd-tcfooter
> > 
> > diff --git a/libavformat/mxfdec.c b/libavformat/mxfdec.c
> > index 7b40076fb4..a7f552c753 100644
> > --- a/libavformat/mxfdec.c
> > +++ b/libavformat/mxfdec.c
> > @@ -1402,7 +1402,7 @@ static void *mxf_resolve_strong_ref(MXFContext *mxf, UID *strong_ref, enum MXFMe
> > 
> >     if (!strong_ref)
> >         return NULL;
> > -    for (i = 0; i < mxf->metadata_sets_count; i++) {
> > +    for (i = mxf->metadata_sets_count-1; i >= 0; i--) {
> 
> Do we have to store all metadata in the first place? Why not do the 
> decision which one is better when adding the metadata set?

This could be done, but it entails rewriting much of the demuxer

> Order of 
> parsing depends on the file, we usually do header, footer and then 
> backwards the partitions. So after your patch metadata in the second 
> partition will have priority over footer, which is also against spec I 
> believe.

I was going to say this is not right because mxf_read_partition_pack()
will reverse the order in which partitions are added when parsing
backwards, so everything ends up in the correct order. But this doesn't
apply to mxf->metadata_sets, only mxf->partitions..

We've had a similar discussion on here roughly a month ago. There's a
bit of finessing around the order in which to prefer any one metadata
set. IIRC something like: FooterPartition, then any Complete non-footer 
Partition, then the latest OpenPartition

/Tomas



More information about the ffmpeg-devel mailing list