diff mbox series

[FFmpeg-devel] avformat/concat: fix missing metadata

Message ID CAA38peYh3C=QDuRR2y1O+nFUKvRn5tqd-5XwJoBSDzgT9HznjA@mail.gmail.com
State New
Headers show
Series [FFmpeg-devel] avformat/concat: fix missing metadata | expand

Checks

Context Check Description
andriy/configure_x86 warning Failed to apply patch
andriy/configure_armv7_RPi4 warning Failed to apply patch

Commit Message

Steven Hartland June 12, 2022, 7:48 p.m. UTC
Remove return after copying extradata as this prevents metadata
being duplicated correctly.

Signed-off-by: Steven Hartland <stevenmhartland@gmail.com>
---
 libavformat/concatdec.c                       | 1 -
 tests/ref/fate/concat-demuxer-simple2-lavf-ts | 2 +-
 2 files changed, 1 insertion(+), 2 deletions(-)


-0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
is stream 0
+0|mp2|unknown|audio|[3][0][0][0]|0x0003|fltp|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
is stream 0
 1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
is stream 1|CPB properties|0|0|0|49152|-1

Comments

Marton Balint June 19, 2022, 8:18 p.m. UTC | #1
On Sun, 12 Jun 2022, Steven Hartland wrote:

> Remove return after copying extradata as this prevents metadata
> being duplicated correctly.

The return there originated from commit 
b24d6c53037aaaa20fbd59cbd25c392229450660 and seems very much intentional 
to not overwrite stream parameters after every packet.

So what is the issue you are trying to fix? Some parameters change after 
the avformat_find_stream_info() returned?

Regards,
Marton

>
> Signed-off-by: Steven Hartland <stevenmhartland@gmail.com>
> ---
> libavformat/concatdec.c                       | 1 -
> tests/ref/fate/concat-demuxer-simple2-lavf-ts | 2 +-
> 2 files changed, 1 insertion(+), 2 deletions(-)
>
> diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
> index e57da59e04..11ed2bd4c3 100644
> --- a/libavformat/concatdec.c
> +++ b/libavformat/concatdec.c
> @@ -182,7 +182,6 @@ static int copy_stream_props(AVStream *st, AVStream
> *source_st)
>         }
>         memcpy(st->codecpar->extradata, source_st->codecpar->extradata,
>                source_st->codecpar->extradata_size);
> -        return 0;
>     }
>     if ((ret = avcodec_parameters_copy(st->codecpar, source_st->codecpar))
> < 0)
>         return ret;
> diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> index 9603ca21d0..d98e8b71e1 100644
> --- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> +++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> @@ -211,5 +211,5 @@
> video|1|171982|1.910911|168382|1.870911|3600|0.040000|17440|206988|__|MPEGTS
> Str
>
> video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|__|MPEGTS
> Stream ID|224
>
> -0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> is stream 0
> +0|mp2|unknown|audio|[3][0][0][0]|0x0003|fltp|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> is stream 0
> 1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> is stream 1|CPB properties|0|0|0|49152|-1
> -- 
> 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-request@ffmpeg.org with subject "unsubscribe".
>
Steven Hartland July 2, 2022, 10:44 a.m. UTC | #2
I'm using concat to join multiple files from a GoPro camera including the
three metadata streams, with the early return it fails as the metadata
stream information is missing so map fails.

Example of the command line is:
ffmpeg \
        -y \
        -safe 0 \
        -f concat \
        -i list.txt \
        -c copy \
        -c:v libx264 \
        -vf scale=1920:1080 \
        -crf 24 \
        -copy_unknown \
        -map_metadata 0 \
        -movflags use_metadata_tags \
        -map 0:v \
        -map 0:a \
        -map 0:m:handler_name:" GoPro TCD" \
        -map 0:m:handler_name:" GoPro MET" \
        -map 0:m:handler_name:" GoPro SOS" \
        test/concat.mp4

Here is the error without the change:

ffmpeg version N-107034-g77b529fbd2 Copyright (c) 2000-2022 the FFmpeg
developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/home/steveh/ffmpeg_build
--pkg-config-flags=--static
--extra-cflags=-I/home/steveh/ffmpeg_build/include
--extra-ldflags=-L/home/steveh/ffmpeg_build/lib --extra-libs='-lpthread
-lm' --ld=g++ --bindir=/home/steveh/bin --enable-gpl --enable-gnutls
--enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype
--enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d
--enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
--enable-nonfree
  libavutil      57. 25.100 / 57. 25.100
  libavcodec     59. 32.102 / 59. 32.102
  libavformat    59. 24.100 / 59. 24.100
  libavdevice    59.  6.100 / 59.  6.100
  libavfilter     8. 40.100 /  8. 40.100
  libswscale      6.  6.100 /  6.  6.100
  libswresample   4.  6.100 /  4.  6.100
  libpostproc    56.  5.100 / 56.  5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x55be9e9aac00] Auto-inserting h264_mp4toannexb
bitstream filter
[concat @ 0x55be9e9a1140] Could not find codec parameters for stream 2
(Unknown: none): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 'probesize'
(5000000) options
[concat @ 0x55be9e9a1140] Could not find codec parameters for stream 4
(Unknown: none): unknown codec
Consider increasing the value for the 'analyzeduration' (0) and 'probesize'
(5000000) options
Input #0, concat, from 'list.txt':
  Duration: N/A, start: 0.000000, bitrate: 60098 kb/s
  Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 59932 kb/s, 23.98 fps,
23.98 tbr, 24k tbn
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AVC
      vendor_id       : [0][0][0][0]
      encoder         : GoPro AVC encoder
      timecode        : 15:38:07:03
  Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
fltp, 128 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AAC
      vendor_id       : [0][0][0][0]
      timecode        : 15:38:07:03
  Stream #0:2: Unknown: none
  Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro MET
  Stream #0:4: Unknown: none
Stream map '0:m:handler_name:   GoPro TCD' matches no streams.
To ignore this, add a trailing '?' to the map.

With this change it works as expected:
ffmpeg version N-107034-g77b529fbd2 Copyright (c) 2000-2022 the FFmpeg
developers
  built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
  configuration: --prefix=/home/steveh/ffmpeg_build
--pkg-config-flags=--static
--extra-cflags=-I/home/steveh/ffmpeg_build/include
--extra-ldflags=-L/home/steveh/ffmpeg_build/lib --extra-libs='-lpthread
-lm' --ld=g++ --bindir=/home/steveh/bin --enable-gpl --enable-gnutls
--enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype
--enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d
--enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
--enable-nonfree
  libavutil      57. 25.100 / 57. 25.100
  libavcodec     59. 32.102 / 59. 32.102
  libavformat    59. 24.100 / 59. 24.100
  libavdevice    59.  6.100 / 59.  6.100
  libavfilter     8. 40.100 /  8. 40.100
  libswscale      6.  6.100 /  6.  6.100
  libswresample   4.  6.100 /  4.  6.100
  libpostproc    56.  5.100 / 56.  5.100
[mov,mp4,m4a,3gp,3g2,mj2 @ 0x557f730b3c00] Auto-inserting h264_mp4toannexb
bitstream filter
Input #0, concat, from 'list.txt':
  Duration: N/A, start: 0.000000, bitrate: 60108 kb/s
  Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 59932 kb/s, 23.98 fps,
23.98 tbr, 24k tbn
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AVC
      vendor_id       : [0][0][0][0]
      encoder         : GoPro AVC encoder
      timecode        : 15:38:07:03
  Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
fltp, 128 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AAC
      vendor_id       : [0][0][0][0]
      timecode        : 15:38:07:03
  Stream #0:2(eng): Data: none (tmcd / 0x64636D74)
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro TCD
      timecode        : 15:38:07:03
  Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro MET
  Stream #0:4(eng): Data: none (fdsc / 0x63736466), 9 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro SOS
[mp4 @ 0x557f732f6240] You requested a copy of the original timecode track
so timecode metadata are now ignored
Output #0, mp4, to 'test/concat.mp4':
  Metadata:
    encoder         : Lavf59.24.100
  Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 59932 kb/s,
23.98 fps, 23.98 tbr, 24k tbn
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AVC
      vendor_id       : [0][0][0][0]
      encoder         : GoPro AVC encoder
      timecode        : 15:38:07:03
  Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
fltp, 128 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro AAC
      vendor_id       : [0][0][0][0]
      timecode        : 15:38:07:03
  Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default)
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro TCD
      timecode        : 15:38:07:03
  Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro MET
  Stream #0:4(eng): Data: none (fdsc / 0x63736466), 9 kb/s
    Metadata:
      creation_time   : 2022-05-31T15:39:02.000000Z
      handler_name    :         GoPro SOS
Stream mapping:
  Stream #0:0 -> #0:0 (copy)
  Stream #0:1 -> #0:1 (copy)
  Stream #0:2 -> #0:2 (copy)
  Stream #0:3 -> #0:3 (copy)
  Stream #0:4 -> #0:4 (copy)
Press [q] to stop, [?] for help
frame=   24 fps= 16 q=-1.0 size=     768kB time=00:00:01.00
bitrate=6275.1kbits/s speed=0.668x
...

I believe the reason for the failure is that this early return prevents the
metadata from being preserved.


On Sun, 19 Jun 2022 at 21:18, Marton Balint <cus@passwd.hu> wrote:

>
>
> On Sun, 12 Jun 2022, Steven Hartland wrote:
>
> > Remove return after copying extradata as this prevents metadata
> > being duplicated correctly.
>
> The return there originated from commit
> b24d6c53037aaaa20fbd59cbd25c392229450660 and seems very much intentional
> to not overwrite stream parameters after every packet.
>
> So what is the issue you are trying to fix? Some parameters change after
> the avformat_find_stream_info() returned?
>
> Regards,
> Marton
>
> >
> > Signed-off-by: Steven Hartland <stevenmhartland@gmail.com>
> > ---
> > libavformat/concatdec.c                       | 1 -
> > tests/ref/fate/concat-demuxer-simple2-lavf-ts | 2 +-
> > 2 files changed, 1 insertion(+), 2 deletions(-)
> >
> > diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
> > index e57da59e04..11ed2bd4c3 100644
> > --- a/libavformat/concatdec.c
> > +++ b/libavformat/concatdec.c
> > @@ -182,7 +182,6 @@ static int copy_stream_props(AVStream *st, AVStream
> > *source_st)
> >         }
> >         memcpy(st->codecpar->extradata, source_st->codecpar->extradata,
> >                source_st->codecpar->extradata_size);
> > -        return 0;
> >     }
> >     if ((ret = avcodec_parameters_copy(st->codecpar,
> source_st->codecpar))
> > < 0)
> >         return ret;
> > diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> > b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> > index 9603ca21d0..d98e8b71e1 100644
> > --- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> > +++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> > @@ -211,5 +211,5 @@
> >
> video|1|171982|1.910911|168382|1.870911|3600|0.040000|17440|206988|__|MPEGTS
> > Str
> >
> >
> video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|__|MPEGTS
> > Stream ID|224
> >
> >
> -0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> > is stream 0
> >
> +0|mp2|unknown|audio|[3][0][0][0]|0x0003|fltp|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> > is stream 0
> >
> 1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
> > is stream 1|CPB properties|0|0|0|49152|-1
> > --
> > 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-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".
>
Steven Hartland July 2, 2022, 10:47 a.m. UTC | #3
I should mention that this one of a few fixes needed to enable successful
copying of GoPro metadata when using concat to join files, but wanted to
start with from its size was the simplest one :)

On Sat, 2 Jul 2022 at 11:44, Steven Hartland <stevenmhartland@gmail.com>
wrote:

> I'm using concat to join multiple files from a GoPro camera including the
> three metadata streams, with the early return it fails as the metadata
> stream information is missing so map fails.
>
> Example of the command line is:
> ffmpeg \
>         -y \
>         -safe 0 \
>         -f concat \
>         -i list.txt \
>         -c copy \
>         -c:v libx264 \
>         -vf scale=1920:1080 \
>         -crf 24 \
>         -copy_unknown \
>         -map_metadata 0 \
>         -movflags use_metadata_tags \
>         -map 0:v \
>         -map 0:a \
>         -map 0:m:handler_name:" GoPro TCD" \
>         -map 0:m:handler_name:" GoPro MET" \
>         -map 0:m:handler_name:" GoPro SOS" \
>         test/concat.mp4
>
> Here is the error without the change:
>
> ffmpeg version N-107034-g77b529fbd2 Copyright (c) 2000-2022 the FFmpeg
> developers
>   built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
>   configuration: --prefix=/home/steveh/ffmpeg_build
> --pkg-config-flags=--static
> --extra-cflags=-I/home/steveh/ffmpeg_build/include
> --extra-ldflags=-L/home/steveh/ffmpeg_build/lib --extra-libs='-lpthread
> -lm' --ld=g++ --bindir=/home/steveh/bin --enable-gpl --enable-gnutls
> --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype
> --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d
> --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
> --enable-nonfree
>   libavutil      57. 25.100 / 57. 25.100
>   libavcodec     59. 32.102 / 59. 32.102
>   libavformat    59. 24.100 / 59. 24.100
>   libavdevice    59.  6.100 / 59.  6.100
>   libavfilter     8. 40.100 /  8. 40.100
>   libswscale      6.  6.100 /  6.  6.100
>   libswresample   4.  6.100 /  4.  6.100
>   libpostproc    56.  5.100 / 56.  5.100
> [mov,mp4,m4a,3gp,3g2,mj2 @ 0x55be9e9aac00] Auto-inserting h264_mp4toannexb
> bitstream filter
> [concat @ 0x55be9e9a1140] Could not find codec parameters for stream 2
> (Unknown: none): unknown codec
> Consider increasing the value for the 'analyzeduration' (0) and
> 'probesize' (5000000) options
> [concat @ 0x55be9e9a1140] Could not find codec parameters for stream 4
> (Unknown: none): unknown codec
> Consider increasing the value for the 'analyzeduration' (0) and
> 'probesize' (5000000) options
> Input #0, concat, from 'list.txt':
>   Duration: N/A, start: 0.000000, bitrate: 60098 kb/s
>   Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
> bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 59932 kb/s, 23.98 fps,
> 23.98 tbr, 24k tbn
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AVC
>       vendor_id       : [0][0][0][0]
>       encoder         : GoPro AVC encoder
>       timecode        : 15:38:07:03
>   Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
> fltp, 128 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AAC
>       vendor_id       : [0][0][0][0]
>       timecode        : 15:38:07:03
>   Stream #0:2: Unknown: none
>   Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro MET
>   Stream #0:4: Unknown: none
> Stream map '0:m:handler_name:   GoPro TCD' matches no streams.
> To ignore this, add a trailing '?' to the map.
>
> With this change it works as expected:
> ffmpeg version N-107034-g77b529fbd2 Copyright (c) 2000-2022 the FFmpeg
> developers
>   built with gcc 9 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
>   configuration: --prefix=/home/steveh/ffmpeg_build
> --pkg-config-flags=--static
> --extra-cflags=-I/home/steveh/ffmpeg_build/include
> --extra-ldflags=-L/home/steveh/ffmpeg_build/lib --extra-libs='-lpthread
> -lm' --ld=g++ --bindir=/home/steveh/bin --enable-gpl --enable-gnutls
> --enable-libaom --enable-libass --enable-libfdk-aac --enable-libfreetype
> --enable-libmp3lame --enable-libopus --enable-libsvtav1 --enable-libdav1d
> --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265
> --enable-nonfree
>   libavutil      57. 25.100 / 57. 25.100
>   libavcodec     59. 32.102 / 59. 32.102
>   libavformat    59. 24.100 / 59. 24.100
>   libavdevice    59.  6.100 / 59.  6.100
>   libavfilter     8. 40.100 /  8. 40.100
>   libswscale      6.  6.100 /  6.  6.100
>   libswresample   4.  6.100 /  4.  6.100
>   libpostproc    56.  5.100 / 56.  5.100
> [mov,mp4,m4a,3gp,3g2,mj2 @ 0x557f730b3c00] Auto-inserting h264_mp4toannexb
> bitstream filter
> Input #0, concat, from 'list.txt':
>   Duration: N/A, start: 0.000000, bitrate: 60108 kb/s
>   Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
> bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 59932 kb/s, 23.98 fps,
> 23.98 tbr, 24k tbn
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AVC
>       vendor_id       : [0][0][0][0]
>       encoder         : GoPro AVC encoder
>       timecode        : 15:38:07:03
>   Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
> fltp, 128 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AAC
>       vendor_id       : [0][0][0][0]
>       timecode        : 15:38:07:03
>   Stream #0:2(eng): Data: none (tmcd / 0x64636D74)
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro TCD
>       timecode        : 15:38:07:03
>   Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro MET
>   Stream #0:4(eng): Data: none (fdsc / 0x63736466), 9 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro SOS
> [mp4 @ 0x557f732f6240] You requested a copy of the original timecode track
> so timecode metadata are now ignored
> Output #0, mp4, to 'test/concat.mp4':
>   Metadata:
>     encoder         : Lavf59.24.100
>   Stream #0:0(eng): Video: h264 (High) (avc1 / 0x31637661), yuvj420p(pc,
> bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], q=2-31, 59932 kb/s,
> 23.98 fps, 23.98 tbr, 24k tbn
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AVC
>       vendor_id       : [0][0][0][0]
>       encoder         : GoPro AVC encoder
>       timecode        : 15:38:07:03
>   Stream #0:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo,
> fltp, 128 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro AAC
>       vendor_id       : [0][0][0][0]
>       timecode        : 15:38:07:03
>   Stream #0:2(eng): Data: none (tmcd / 0x64636D74) (default)
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro TCD
>       timecode        : 15:38:07:03
>   Stream #0:3(eng): Data: bin_data (gpmd / 0x646D7067), 38 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro MET
>   Stream #0:4(eng): Data: none (fdsc / 0x63736466), 9 kb/s
>     Metadata:
>       creation_time   : 2022-05-31T15:39:02.000000Z
>       handler_name    :         GoPro SOS
> Stream mapping:
>   Stream #0:0 -> #0:0 (copy)
>   Stream #0:1 -> #0:1 (copy)
>   Stream #0:2 -> #0:2 (copy)
>   Stream #0:3 -> #0:3 (copy)
>   Stream #0:4 -> #0:4 (copy)
> Press [q] to stop, [?] for help
> frame=   24 fps= 16 q=-1.0 size=     768kB time=00:00:01.00
> bitrate=6275.1kbits/s speed=0.668x
> ...
>
> I believe the reason for the failure is that this early return prevents
> the metadata from being preserved.
>
>
> On Sun, 19 Jun 2022 at 21:18, Marton Balint <cus@passwd.hu> wrote:
>
>>
>>
>> On Sun, 12 Jun 2022, Steven Hartland wrote:
>>
>> > Remove return after copying extradata as this prevents metadata
>> > being duplicated correctly.
>>
>> The return there originated from commit
>> b24d6c53037aaaa20fbd59cbd25c392229450660 and seems very much intentional
>> to not overwrite stream parameters after every packet.
>>
>> So what is the issue you are trying to fix? Some parameters change after
>> the avformat_find_stream_info() returned?
>>
>> Regards,
>> Marton
>>
>> >
>> > Signed-off-by: Steven Hartland <stevenmhartland@gmail.com>
>> > ---
>> > libavformat/concatdec.c                       | 1 -
>> > tests/ref/fate/concat-demuxer-simple2-lavf-ts | 2 +-
>> > 2 files changed, 1 insertion(+), 2 deletions(-)
>> >
>> > diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
>> > index e57da59e04..11ed2bd4c3 100644
>> > --- a/libavformat/concatdec.c
>> > +++ b/libavformat/concatdec.c
>> > @@ -182,7 +182,6 @@ static int copy_stream_props(AVStream *st, AVStream
>> > *source_st)
>> >         }
>> >         memcpy(st->codecpar->extradata, source_st->codecpar->extradata,
>> >                source_st->codecpar->extradata_size);
>> > -        return 0;
>> >     }
>> >     if ((ret = avcodec_parameters_copy(st->codecpar,
>> source_st->codecpar))
>> > < 0)
>> >         return ret;
>> > diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
>> > b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
>> > index 9603ca21d0..d98e8b71e1 100644
>> > --- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
>> > +++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
>> > @@ -211,5 +211,5 @@
>> >
>> video|1|171982|1.910911|168382|1.870911|3600|0.040000|17440|206988|__|MPEGTS
>> > Str
>> >
>> >
>> video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|__|MPEGTS
>> > Stream ID|224
>> >
>> >
>> -0|mp2|unknown|audio|[3][0][0][0]|0x0003|s16p|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
>> > is stream 0
>> >
>> +0|mp2|unknown|audio|[3][0][0][0]|0x0003|fltp|44100|1|mono|0|N/A|0/0|0/0|1/90000|0|0.000000|N/A|N/A|64000|N/A|N/A|N/A|N/A|89|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
>> > is stream 0
>> >
>> 1|mpeg2video|4|video|[2][0][0][0]|0x0002|352|288|0|0|0|0|1|1:1|11:9|yuv420p|8|tv|unknown|unknown|unknown|left|progressive|1|N/A|25/1|25/1|1/90000|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|60|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|this
>> > is stream 1|CPB properties|0|0|0|49152|-1
>> > --
>> > 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-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".
>>
>
Nicolas George July 3, 2022, 1:42 p.m. UTC | #4
Steven Hartland (12022-07-02):
> I'm using concat to join multiple files from a GoPro camera including the
> three metadata streams, with the early return it fails as the metadata
> stream information is missing so map fails.

> I believe the reason for the failure is that this early return prevents the
> metadata from being preserved.

You are trying to trick concat into merging files with different streams
and match streams between them. It is not how concat is designed to
work, it might work in your particular test case but will not work in
more complex cases and will break other use cases.

For example, with your change, if you concatenate a file with metadata
"start_time=12:00" and another with "start_time=12:01", it will generate
a file with both metadata entries instead of just the first one as would
be desirable.

Implementing your feature is not completely trivial: look how it is done
for subtitles streams in DVD structures. The concat stream defines all
the streams it expects to find in the file and specifies a condition to
match them, "exact_stream_id".

> On Sun, 19 Jun 2022 at 21:18, Marton Balint <cus@passwd.hu> wrote:

Please remember that top-posting is forbidden on this mailing-list. If
you do not know what it mean, look it up.

Regards,
Andreas Rheinhardt July 3, 2022, 1:47 p.m. UTC | #5
Nicolas George:
> Steven Hartland (12022-07-02):
>> I'm using concat to join multiple files from a GoPro camera including the
>> three metadata streams, with the early return it fails as the metadata
>> stream information is missing so map fails.
> 
>> I believe the reason for the failure is that this early return prevents the
>> metadata from being preserved.
> 
> You are trying to trick concat into merging files with different streams
> and match streams between them. It is not how concat is designed to
> work, it might work in your particular test case but will not work in
> more complex cases and will break other use cases.
> 
> For example, with your change, if you concatenate a file with metadata
> "start_time=12:00" and another with "start_time=12:01", it will generate
> a file with both metadata entries instead of just the first one as would
> be desirable.
> 

Actually, the newer entry will overwrite the older entry; if you want
multiple keys with the same value, you have to use the AV_DICT_MULTIKEY
flag.

- Andreas
Nicolas George July 3, 2022, 1:49 p.m. UTC | #6
Andreas Rheinhardt (12022-07-03):
> > For example, with your change, if you concatenate a file with metadata
> > "start_time=12:00" and another with "start_time=12:01", it will generate
> > a file with both metadata entries instead of just the first one as would
> > be desirable.

> Actually, the newer entry will overwrite the older entry; if you want
> multiple keys with the same value, you have to use the AV_DICT_MULTIKEY
> flag.

I stand corrected, thanks. This is still not the most logical behavior,
though.

Regards,
Steven Hartland July 4, 2022, 10:33 p.m. UTC | #7
I'm not sure we're on the same page, so let me try and clarify.

The files have multiple tracks, the standard audio and video and 3 metadata
tracks. I'm using the command line option -map 0:m:handler_name:"<name>" to
identify the tracks to copy. Given a single file this works as expected,
but as soon as concat has multiple files the track metadata is lost and the
handler_name match fails due to this early return.

Each of the tracks I'm selected are able to be concatenated just fine, much
like the a/v tracks. It's not about the file metadata, it's the track
metadata which is needed for track identification which I'm looking to
preserve.

Does that make sense?

   Regards
   Steve

On Sun, 3 Jul 2022 at 14:50, Nicolas George <george@nsup.org> wrote:

> Andreas Rheinhardt (12022-07-03):
> > > For example, with your change, if you concatenate a file with metadata
> > > "start_time=12:00" and another with "start_time=12:01", it will
> generate
> > > a file with both metadata entries instead of just the first one as
> would
> > > be desirable.
>
> > Actually, the newer entry will overwrite the older entry; if you want
> > multiple keys with the same value, you have to use the AV_DICT_MULTIKEY
> > flag.
>
> I stand corrected, thanks. This is still not the most logical behavior,
> though.
>
> Regards,
>
> --
>   Nicolas George
> _______________________________________________
> 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".
>
Steven Hartland July 14, 2022, 9:46 p.m. UTC | #8
Any thoughts on my previous reply?

On Mon, 4 Jul 2022 at 23:33, Steven Hartland <stevenmhartland@gmail.com>
wrote:

> I'm not sure we're on the same page, so let me try and clarify.
>
> The files have multiple tracks, the standard audio and video and 3
> metadata tracks. I'm using the command line option -map
> 0:m:handler_name:"<name>" to identify the tracks to copy. Given a single
> file this works as expected, but as soon as concat has multiple files the
> track metadata is lost and the handler_name match fails due to this early
> return.
>
> Each of the tracks I'm selected are able to be concatenated just fine,
> much like the a/v tracks. It's not about the file metadata, it's the track
> metadata which is needed for track identification which I'm looking to
> preserve.
>
> Does that make sense?
>
>    Regards
>    Steve
>
> On Sun, 3 Jul 2022 at 14:50, Nicolas George <george@nsup.org> wrote:
>
>> Andreas Rheinhardt (12022-07-03):
>> > > For example, with your change, if you concatenate a file with metadata
>> > > "start_time=12:00" and another with "start_time=12:01", it will
>> generate
>> > > a file with both metadata entries instead of just the first one as
>> would
>> > > be desirable.
>>
>> > Actually, the newer entry will overwrite the older entry; if you want
>> > multiple keys with the same value, you have to use the AV_DICT_MULTIKEY
>> > flag.
>>
>> I stand corrected, thanks. This is still not the most logical behavior,
>> though.
>>
>> Regards,
>>
>> --
>>   Nicolas George
>> _______________________________________________
>> 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".
>>
>
diff mbox series

Patch

diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
index e57da59e04..11ed2bd4c3 100644
--- a/libavformat/concatdec.c
+++ b/libavformat/concatdec.c
@@ -182,7 +182,6 @@  static int copy_stream_props(AVStream *st, AVStream
*source_st)
         }
         memcpy(st->codecpar->extradata, source_st->codecpar->extradata,
                source_st->codecpar->extradata_size);
-        return 0;
     }
     if ((ret = avcodec_parameters_copy(st->codecpar, source_st->codecpar))
< 0)
         return ret;
diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
index 9603ca21d0..d98e8b71e1 100644
--- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
+++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
@@ -211,5 +211,5 @@ 
video|1|171982|1.910911|168382|1.870911|3600|0.040000|17440|206988|__|MPEGTS
Str

 video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|__|MPEGTS
Stream ID|224