diff mbox series

[FFmpeg-devel] mxfenc.c: look for reel_name within streams as well

Message ID 8E129170-900A-4E57-990F-9FB6D1EF922A@cine.dev
State New
Headers show
Series [FFmpeg-devel] mxfenc.c: look for reel_name within streams as well | expand

Commit Message

Bartłomiej Styczeń Sept. 6, 2023, 10:16 a.m. UTC
If an MXF file has reel_name stored in a stream, while copying or remuxing file, some (most) of the stream metadata is lost.
Here’s the file: https://streams.videolan.org/ffmpeg/incoming/original.mxf
After running ffmpeg -i original.mxf -c copy output.mxf, and checking with ffprobe, 
the original file has the following stream metadata:
>       file_package_umid: 0x060A2B340101010501010D431300000064F640280FA57031060E2B347F7F2A80
>       file_package_name: B002C0006_230803_1932_000001 (0)
>       track_name      : B002C0006_230803_1932_000001 (0)_v1
>       reel_umid       : 0x060A2B340101010501010D431300000064F640280FA67031060E2B347F7F2A80
>       reel_name       : B002C0006_230803_1932_000001 (1)
>       timecode        : 00:06:15:21

And the copied file only these:
>       file_package_umid: 0x060A2B340101010501010D001339242252947134203924220052947134203901
>       file_package_name: B002C0006_230803_1932_000001 (0)


After applying the patch, copied file correctly shows reel metadata and the timecode:
>       file_package_umid: 0x060A2B340101010501010D001321CA09529471342721CA090052947134272101
>       file_package_name: B002C0006_230803_1932_000001 (0)
>       reel_umid       : 0x060A2B340101010501010D001321CA09529471342721CA090052947134272102
>       reel_name       : B002C0006_230803_1932_000001 (1)
>       timecode        : 00:06:15:21


The track_name is still missing though, so I will continue to investigate the issue. 

Signed-off-by: Bart Styczen <bart.styczen@cine.dev>
---
libavformat/mxfenc.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

Comments

Paul B Mahol Sept. 6, 2023, 10:27 a.m. UTC | #1
On Wed, Sep 6, 2023 at 12:16 PM Bart Styczen <bart.styczen@cine.dev> wrote:

> If an MXF file has reel_name stored in a stream, while copying or remuxing
> file, some (most) of the stream metadata is lost.
> Here’s the file: https://streams.videolan.org/ffmpeg/incoming/original.mxf
> After running ffmpeg -i original.mxf -c copy output.mxf, and checking with
> ffprobe,
> the original file has the following stream metadata:
> >       file_package_umid:
> 0x060A2B340101010501010D431300000064F640280FA57031060E2B347F7F2A80
> >       file_package_name: B002C0006_230803_1932_000001 (0)
> >       track_name      : B002C0006_230803_1932_000001 (0)_v1
> >       reel_umid       :
> 0x060A2B340101010501010D431300000064F640280FA67031060E2B347F7F2A80
> >       reel_name       : B002C0006_230803_1932_000001 (1)
> >       timecode        : 00:06:15:21
>
> And the copied file only these:
> >       file_package_umid:
> 0x060A2B340101010501010D001339242252947134203924220052947134203901
> >       file_package_name: B002C0006_230803_1932_000001 (0)
>
>
> After applying the patch, copied file correctly shows reel metadata and
> the timecode:
> >       file_package_umid:
> 0x060A2B340101010501010D001321CA09529471342721CA090052947134272101
> >       file_package_name: B002C0006_230803_1932_000001 (0)
> >       reel_umid       :
> 0x060A2B340101010501010D001321CA09529471342721CA090052947134272102
> >       reel_name       : B002C0006_230803_1932_000001 (1)
> >       timecode        : 00:06:15:21
>
>
> The track_name is still missing though, so I will continue to investigate
> the issue.
>
> Signed-off-by: Bart Styczen <bart.styczen@cine.dev>
> ---
> libavformat/mxfenc.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
> index d8252ed68f..d3ae83a9fb 100644
> --- a/libavformat/mxfenc.c
> +++ b/libavformat/mxfenc.c
> @@ -1817,7 +1817,17 @@ static int
> mxf_write_header_metadata_sets(AVFormatContext *s)
>     }
>
>     entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
> -    if (entry) {
> +    if (!entry) {
> +        /* check if any of the streams contain a reel_name */
> +        for (i = 0; i < s->nb_streams; i++) {
> +            st = s->streams[i];
> +            if (entry = av_dict_get(st->metadata, "reel_name", NULL, 0)) {
> +                break;
> +            }
> +        }
> +    }
> +
> +    if(entry) {
>

Space missing: if (entry) {

        packages[2].name = entry->value;
>         packages[2].type = SourcePackage;
>         packages[2].instance = 2;
> --
> 2.37.1 (Apple Git-137.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-request@ffmpeg.org with subject "unsubscribe".
>
Bartłomiej Styczeń Sept. 6, 2023, 10:55 a.m. UTC | #2
Signed-off-by: Bart Styczen <bart.styczen@cine.dev>
---
libavformat/mxfenc.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index d8252ed68f..d3ae83a9fb 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1817,7 +1817,17 @@ static int
mxf_write_header_metadata_sets(AVFormatContext *s)
    }

    entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
-    if (entry) {
+    if (!entry) {
+        /* check if any of the streams contain a reel_name */
+        for (i = 0; i < s->nb_streams; i++) {
+            st = s->streams[i];
+            if (entry = av_dict_get(st->metadata, "reel_name", NULL, 0)) {
+                break;
+            }
+        }
+    }
+
+    if (entry) {
        packages[2].name = entry->value;
        packages[2].type = SourcePackage;
        packages[2].instance = 2;
--
2.37.1 (Apple Git-137.1)

On Wed, 6 Sept 2023 at 12:19, Paul B Mahol <onemda@gmail.com> wrote:

> On Wed, Sep 6, 2023 at 12:16 PM Bart Styczen <bart.styczen@cine.dev>
> wrote:
>
> > If an MXF file has reel_name stored in a stream, while copying or
> remuxing
> > file, some (most) of the stream metadata is lost.
> > Here’s the file:
> https://streams.videolan.org/ffmpeg/incoming/original.mxf
> > After running ffmpeg -i original.mxf -c copy output.mxf, and checking
> with
> > ffprobe,
> > the original file has the following stream metadata:
> > >       file_package_umid:
> > 0x060A2B340101010501010D431300000064F640280FA57031060E2B347F7F2A80
> > >       file_package_name: B002C0006_230803_1932_000001 (0)
> > >       track_name      : B002C0006_230803_1932_000001 (0)_v1
> > >       reel_umid       :
> > 0x060A2B340101010501010D431300000064F640280FA67031060E2B347F7F2A80
> > >       reel_name       : B002C0006_230803_1932_000001 (1)
> > >       timecode        : 00:06:15:21
> >
> > And the copied file only these:
> > >       file_package_umid:
> > 0x060A2B340101010501010D001339242252947134203924220052947134203901
> > >       file_package_name: B002C0006_230803_1932_000001 (0)
> >
> >
> > After applying the patch, copied file correctly shows reel metadata and
> > the timecode:
> > >       file_package_umid:
> > 0x060A2B340101010501010D001321CA09529471342721CA090052947134272101
> > >       file_package_name: B002C0006_230803_1932_000001 (0)
> > >       reel_umid       :
> > 0x060A2B340101010501010D001321CA09529471342721CA090052947134272102
> > >       reel_name       : B002C0006_230803_1932_000001 (1)
> > >       timecode        : 00:06:15:21
> >
> >
> > The track_name is still missing though, so I will continue to investigate
> > the issue.
> >
> > Signed-off-by: Bart Styczen <bart.styczen@cine.dev>
> > ---
> > libavformat/mxfenc.c | 12 +++++++++++-
> > 1 file changed, 11 insertions(+), 1 deletion(-)
> >
> > diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
> > index d8252ed68f..d3ae83a9fb 100644
> > --- a/libavformat/mxfenc.c
> > +++ b/libavformat/mxfenc.c
> > @@ -1817,7 +1817,17 @@ static int
> > mxf_write_header_metadata_sets(AVFormatContext *s)
> >     }
> >
> >     entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
> > -    if (entry) {
> > +    if (!entry) {
> > +        /* check if any of the streams contain a reel_name */
> > +        for (i = 0; i < s->nb_streams; i++) {
> > +            st = s->streams[i];
> > +            if (entry = av_dict_get(st->metadata, "reel_name", NULL,
> 0)) {
> > +                break;
> > +            }
> > +        }
> > +    }
> > +
> > +    if(entry) {
> >
>
> Space missing: if (entry) {
>
>         packages[2].name = entry->value;
> >         packages[2].type = SourcePackage;
> >         packages[2].instance = 2;
> > --
> > 2.37.1 (Apple Git-137.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-request@ffmpeg.org with subject "unsubscribe".
> >
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".
>
Tomas Härdin Sept. 6, 2023, 6:29 p.m. UTC | #3
ons 2023-09-06 klockan 12:16 +0200 skrev Bart Styczen:
> If an MXF file has reel_name stored in a stream, while copying or
> remuxing file, some (most) of the stream metadata is lost.
> Here’s the file:
> https://streams.videolan.org/ffmpeg/incoming/original.mxf
> After running ffmpeg -i original.mxf -c copy output.mxf, and checking
> with ffprobe, 
> the original file has the following stream metadata:
> >       file_package_umid:
> > 0x060A2B340101010501010D431300000064F640280FA57031060E2B347F7F2A80
> >       file_package_name: B002C0006_230803_1932_000001 (0)
> >       track_name      : B002C0006_230803_1932_000001 (0)_v1
> >       reel_umid       :
> > 0x060A2B340101010501010D431300000064F640280FA67031060E2B347F7F2A80
> >       reel_name       : B002C0006_230803_1932_000001 (1)
> >       timecode        : 00:06:15:21
> 
> And the copied file only these:
> >       file_package_umid:
> > 0x060A2B340101010501010D001339242252947134203924220052947134203901
> >       file_package_name: B002C0006_230803_1932_000001 (0)
> 
> 
> After applying the patch, copied file correctly shows reel metadata
> and the timecode:
> >       file_package_umid:
> > 0x060A2B340101010501010D001321CA09529471342721CA090052947134272101
> >       file_package_name: B002C0006_230803_1932_000001 (0)
> >       reel_umid       :
> > 0x060A2B340101010501010D001321CA09529471342721CA090052947134272102
> >       reel_name       : B002C0006_230803_1932_000001 (1)
> >       timecode        : 00:06:15:21
> 
> 
> The track_name is still missing though, so I will continue to
> investigate the issue. 

Sounds like a mismatch in behavior between mxfdec and mxfenc. Timecode
etc going missing suggests a deeper issue to which this patch is likely
the wrong fix..

You should report this on trac if you haven't already

/Tomas
Bartłomiej Styczeń Sept. 6, 2023, 7:35 p.m. UTC | #4
I will report it right away. 

Timecode does not really go missing, it is written into the general metadata of the file instead of the video stream metadata.

Funny behaviour is that the patch in question, despite only fixing the reel_name, brings back the other remaining metadata into the video stream. I know next to nothing about MXF, this is also my first encounter with FFMPEG, but this smells like a broken linked list with a middle item not being written properly, hence the remaining ones disappear as well.

> On 6 Sep 2023, at 20:29, Tomas Härdin <git@haerdin.se> wrote:
> 
> ons 2023-09-06 klockan 12:16 +0200 skrev Bart Styczen:
>> If an MXF file has reel_name stored in a stream, while copying or
>> remuxing file, some (most) of the stream metadata is lost.
>> Here’s the file:
>> https://streams.videolan.org/ffmpeg/incoming/original.mxf
>> After running ffmpeg -i original.mxf -c copy output.mxf, and checking
>> with ffprobe, 
>> the original file has the following stream metadata:
>>>       file_package_umid:
>>> 0x060A2B340101010501010D431300000064F640280FA57031060E2B347F7F2A80
>>>       file_package_name: B002C0006_230803_1932_000001 (0)
>>>       track_name      : B002C0006_230803_1932_000001 (0)_v1
>>>       reel_umid       :
>>> 0x060A2B340101010501010D431300000064F640280FA67031060E2B347F7F2A80
>>>       reel_name       : B002C0006_230803_1932_000001 (1)
>>>       timecode        : 00:06:15:21
>> 
>> And the copied file only these:
>>>       file_package_umid:
>>> 0x060A2B340101010501010D001339242252947134203924220052947134203901
>>>       file_package_name: B002C0006_230803_1932_000001 (0)
>> 
>> 
>> After applying the patch, copied file correctly shows reel metadata
>> and the timecode:
>>>       file_package_umid:
>>> 0x060A2B340101010501010D001321CA09529471342721CA090052947134272101
>>>       file_package_name: B002C0006_230803_1932_000001 (0)
>>>       reel_umid       :
>>> 0x060A2B340101010501010D001321CA09529471342721CA090052947134272102
>>>       reel_name       : B002C0006_230803_1932_000001 (1)
>>>       timecode        : 00:06:15:21
>> 
>> 
>> The track_name is still missing though, so I will continue to
>> investigate the issue. 
> 
> Sounds like a mismatch in behavior between mxfdec and mxfenc. Timecode
> etc going missing suggests a deeper issue to which this patch is likely
> the wrong fix..
> 
> You should report this on trac if you haven't already
> 
> /Tomas
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org <mailto:ffmpeg-devel@ffmpeg.org>
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
> 
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request@ffmpeg.org <mailto:ffmpeg-devel-request@ffmpeg.org> with subject "unsubscribe".
diff mbox series

Patch

diff --git a/libavformat/mxfenc.c b/libavformat/mxfenc.c
index d8252ed68f..d3ae83a9fb 100644
--- a/libavformat/mxfenc.c
+++ b/libavformat/mxfenc.c
@@ -1817,7 +1817,17 @@  static int mxf_write_header_metadata_sets(AVFormatContext *s)
    }

    entry = av_dict_get(s->metadata, "reel_name", NULL, 0);
-    if (entry) {
+    if (!entry) {
+        /* check if any of the streams contain a reel_name */
+        for (i = 0; i < s->nb_streams; i++) {
+            st = s->streams[i];
+            if (entry = av_dict_get(st->metadata, "reel_name", NULL, 0)) {
+                break;
+            }
+        }
+    }
+    
+    if(entry) {
        packages[2].name = entry->value;
        packages[2].type = SourcePackage;
        packages[2].instance = 2;