[FFmpeg-devel] [PATCH] libavformat: add side_data copy in concat demuxer

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Wed Dec 15 21:15:19 EET 2021


Gerard Sole:
> Adds support for concat demuxer to copy the side data information
> from the input file to the resulting file. It will behave like the
> metadata copy, where the metadata of the first file is kept in the
> the output file.
> 
> Extract the current code that already performs the stream side_data
> copy into a separate method and reuse the method in the concat demuxer.
> 
> Signed-off-by: Gerard Sole <g.sole.ca at gmail.com>
> ---
>  libavformat/concatdec.c                             | 1 +
>  libavformat/internal.h                              | 9 +++++++++
>  libavformat/utils.c                                 | 9 +++++++++
>  tests/ref/fate/concat-demuxer-extended-lavf-mxf     | 2 +-
>  tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10 | 2 +-
>  tests/ref/fate/concat-demuxer-simple1-lavf-mxf      | 1 +
>  tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10  | 1 +
>  tests/ref/fate/concat-demuxer-simple2-lavf-ts       | 1 +
>  8 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/libavformat/concatdec.c b/libavformat/concatdec.c
> index 8d80e536d1..0603c6e254 100644
> --- a/libavformat/concatdec.c
> +++ b/libavformat/concatdec.c
> @@ -191,6 +191,7 @@ static int copy_stream_props(AVStream *st, AVStream *source_st)
>      avpriv_set_pts_info(st, 64, source_st->time_base.num, source_st->time_base.den);
>  
>      av_dict_copy(&st->metadata, source_st->metadata, 0);
> +    ff_stream_side_data_copy(st, source_st);
>      return 0;
>  }
>  
> diff --git a/libavformat/internal.h b/libavformat/internal.h
> index eb8239cd3f..0e08dc832e 100644
> --- a/libavformat/internal.h
> +++ b/libavformat/internal.h
> @@ -840,6 +840,15 @@ int ff_stream_add_bitstream_filter(AVStream *st, const char *name, const char *a
>   */
>  int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src);
>  
> +/**
> + * Copy side data from source to destination stream
> + *
> + * @param dst pointer to destination AVStream
> + * @param src pointer to source AVStream
> + * @return >=0 on success, AVERROR code on error
> + */
> +int ff_stream_side_data_copy(AVStream *dst, const AVStream *src);
> +
>  /**
>   * Wrap ffurl_move() and log if error happens.
>   *
> diff --git a/libavformat/utils.c b/libavformat/utils.c
> index b5a4a09ae8..332ba534d2 100644
> --- a/libavformat/utils.c
> +++ b/libavformat/utils.c
> @@ -605,6 +605,15 @@ int ff_stream_encode_params_copy(AVStream *dst, const AVStream *src)
>      if (ret < 0)
>          return ret;
>  
> +    ret = ff_stream_side_data_copy(dst, src);
> +    if (ret < 0)
> +        return ret;
> +
> +    return 0;
> +}
> +
> +int ff_stream_side_data_copy(AVStream *dst, const AVStream *src)
> +{
>      /* Free existing side data*/
>      for (int i = 0; i < dst->nb_side_data; i++)
>          av_free(dst->side_data[i].data);
> diff --git a/tests/ref/fate/concat-demuxer-extended-lavf-mxf b/tests/ref/fate/concat-demuxer-extended-lavf-mxf
> index 4b2a8624db..543c7d6a8c 100644
> --- a/tests/ref/fate/concat-demuxer-extended-lavf-mxf
> +++ b/tests/ref/fate/concat-demuxer-extended-lavf-mxf
> @@ -1 +1 @@
> -29e4e502a912b6d863e75d44e156ed31 *tests/data/fate/concat-demuxer-extended-lavf-mxf.ffprobe
> +d367d7f6df7292cbf454c6d07fca9b04 *tests/data/fate/concat-demuxer-extended-lavf-mxf.ffprobe
> diff --git a/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10 b/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
> index 1dedc6bf43..57b22848b9 100644
> --- a/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
> +++ b/tests/ref/fate/concat-demuxer-extended-lavf-mxf_d10
> @@ -1 +1 @@
> -8de04a786521677a593283c44a53572e *tests/data/fate/concat-demuxer-extended-lavf-mxf_d10.ffprobe
> +1fac6962d4c5f1070d0d2db5ab7d86aa *tests/data/fate/concat-demuxer-extended-lavf-mxf_d10.ffprobe
> diff --git a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
> index 2fe703e2a6..589dbb73b6 100644
> --- a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
> +++ b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf
> @@ -121,4 +121,5 @@ Strings Metadata
>  video|0|37|1.480000|34|1.360000|1|0.040000|24786|212480|K_|1
>  Strings Metadata
>  0|mpeg2video|4|video|[0][0][0][0]|0x0000|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/25|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|N/A|51|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
> +CPB properties|0|0|0|49152|-1
>  1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|1|unknown|16|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|768000|N/A|N/A|N/A|N/A|50|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
> diff --git a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10 b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
> index 0a3af658f6..7fb6ba2c9c 100644
> --- a/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
> +++ b/tests/ref/fate/concat-demuxer-simple1-lavf-mxf_d10
> @@ -79,4 +79,5 @@ Strings Metadata
>  audio|1|65280|1.360000|65280|1.360000|1920|0.040000|7680|2074624|K_|1
>  Strings Metadata
>  0|mpeg2video|0|video|[0][0][0][0]|0x0000|720|608|0|0|0|0|0|1:1|45:38|yuv422p|5|tv|unknown|unknown|unknown|topleft|tb|1|N/A|25/1|25/1|1/25|0|0.000000|N/A|N/A|30000000|N/A|N/A|N/A|N/A|35|22|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
> +CPB properties|30000000|0|0|1212416|-1
>  1|pcm_s16le|unknown|audio|[0][0][0][0]|0x0000|s16|48000|2|unknown|16|N/A|0/0|0/0|1/48000|0|0.000000|N/A|N/A|1536000|N/A|N/A|N/A|N/A|35|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0|0x060A2B340101010501010D001300000000000000000000000000000000000001
> diff --git a/tests/ref/fate/concat-demuxer-simple2-lavf-ts b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> index 76dde3b873..7c6079e2b1 100644
> --- a/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> +++ b/tests/ref/fate/concat-demuxer-simple2-lavf-ts
> @@ -213,3 +213,4 @@ video|1|175582|1.950911|171982|1.910911|3600|0.040000|15019|224848|__MPEGTS Stre
>  
>  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
>  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
> 

The documentation of AVStream.side_data contains: "demuxing: Set by
libavformat when the stream is created". Does your patch guarantee this?
copy_stream_props() seems reachable from concat_read_packet().
(Actually, a similar question can be asked about extradata and other
AVCodecParameters fields.)

- Andreas


More information about the ffmpeg-devel mailing list