[FFmpeg-devel] [PATCH] avformat/metadata: Implement AVFMT_FLAG_NO_META_CONV

wm4 nfxjfg at googlemail.com
Sat Aug 16 20:30:59 CEST 2014


On Mon, 11 Aug 2014 15:15:45 +0300
Mohammad Alsaleh <ce.mohammad.alsaleh at gmail.com> wrote:

>  Decoders/parsers run ff_metadata_conv() unconditionally. This makes
>  it impossible to retrieve or keep original metadata field names.
> 
>  If one wishes to skip ff_metadata_conv() calls at the decoding/parsing
>  stage. This patch implements AVFMT_FLAG_NO_META_CONV which is set by
>  the decoding fflag opt parameter 'nometaconv'.

Would it make more sense to add a new field to AVFormatContext, that
strictly contains the "original" metadata as stored in the file?

I have no strong feelings about it; just that the metadata replacement
is not always very helpful for some formats.

> Signed-off-by: Mohammad Alsaleh <CE.Mohammad.AlSaleh at gmail.com>
> ---
>  doc/APIchanges               |  3 +++
>  doc/formats.texi             |  2 ++
>  libavformat/asfdec.c         |  3 ++-
>  libavformat/avformat.h       |  1 +
>  libavformat/id3v2.c          | 17 ++++++++++++-----
>  libavformat/matroskadec.c    |  4 +++-
>  libavformat/metadata.c       |  4 ++++
>  libavformat/oggparsevorbis.c |  3 ++-
>  libavformat/options_table.h  |  1 +
>  libavformat/version.h        |  2 +-
>  libavformat/wtvdec.c         |  3 ++-
>  11 files changed, 33 insertions(+), 10 deletions(-)
> 
> diff --git a/doc/APIchanges b/doc/APIchanges
> index b7961ae..854563a 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2014-08-09
>  
>  API changes, most recent first:
>  
> +2014-08-xx - xxxxxxx - lavf 56.1.100 - avformat.h
> +  Add AVFMT_FLAG_NO_META_CONV.
> +
>  2014-04-xx - xxxxxxx - lavr 2.1.0 - avresample.h
>    Add avresample_convert_frame() and avresample_config().
>  
> diff --git a/doc/formats.texi b/doc/formats.texi
> index 027510e..92c079d 100644
> --- a/doc/formats.texi
> +++ b/doc/formats.texi
> @@ -51,6 +51,8 @@ Discard corrupted frames.
>  Try to interleave output packets by DTS.
>  @item keepside
>  Do not merge side data.
> + at item nometaconv
> +Skip conversion of metadata field names.
>  @item latm
>  Enable RTP MP4A-LATM payload.
>  @item nobuffer
> diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
> index 5fc293e..13c7806 100644
> --- a/libavformat/asfdec.c
> +++ b/libavformat/asfdec.c
> @@ -862,7 +862,8 @@ static int asf_read_header(AVFormatContext *s)
>          }
>      }
>  
> -    ff_metadata_conv(&s->metadata, NULL, ff_asf_metadata_conv);
> +    if (!(s->flags & AVFMT_FLAG_NO_META_CONV))
> +        ff_metadata_conv(&s->metadata, NULL, ff_asf_metadata_conv);
>  
>      return 0;
>  }
> diff --git a/libavformat/avformat.h b/libavformat/avformat.h
> index a4f7ed7..12fba94 100644
> --- a/libavformat/avformat.h
> +++ b/libavformat/avformat.h
> @@ -1287,6 +1287,7 @@ typedef struct AVFormatContext {
>  #define AVFMT_FLAG_SORT_DTS    0x10000 ///< try to interleave outputted packets by dts (using this flag can slow demuxing down)
>  #define AVFMT_FLAG_PRIV_OPT    0x20000 ///< Enable use of private options by delaying codec open (this could be made default once all code is converted)
>  #define AVFMT_FLAG_KEEP_SIDE_DATA 0x40000 ///< Don't merge side data but keep it separate.
> +#define AVFMT_FLAG_NO_META_CONV 0x80000 ///< Skip conversion of metadata field names.
>  
>      /**
>       * @deprecated deprecated in favor of probesize2
> diff --git a/libavformat/id3v2.c b/libavformat/id3v2.c
> index fb89e83..c2bcbe0 100644
> --- a/libavformat/id3v2.c
> +++ b/libavformat/id3v2.c
> @@ -574,8 +574,11 @@ static void read_chapter(AVFormatContext *s, AVIOContext *pb, int len, char *tta
>          len -= taglen;
>      }
>  
> -    ff_metadata_conv(&chapter->metadata, NULL, ff_id3v2_34_metadata_conv);
> -    ff_metadata_conv(&chapter->metadata, NULL, ff_id3v2_4_metadata_conv);
> +    if (!(s->flags & AVFMT_FLAG_NO_META_CONV)) {
> +        ff_metadata_conv(&chapter->metadata, NULL, ff_id3v2_34_metadata_conv);
> +        ff_metadata_conv(&chapter->metadata, NULL, ff_id3v2_4_metadata_conv);
> +    }
> +
>  end:
>      av_free(dst);
>  }
> @@ -916,9 +919,13 @@ static void id3v2_read_internal(AVIOContext *pb, AVDictionary **metadata,
>              avio_seek(pb, off, SEEK_SET);
>          }
>      } while (found_header);
> -    ff_metadata_conv(metadata, NULL, ff_id3v2_34_metadata_conv);
> -    ff_metadata_conv(metadata, NULL, id3v2_2_metadata_conv);
> -    ff_metadata_conv(metadata, NULL, ff_id3v2_4_metadata_conv);
> +
> +    if (!(s->flags & AVFMT_FLAG_NO_META_CONV)) {
> +        ff_metadata_conv(metadata, NULL, ff_id3v2_34_metadata_conv);
> +        ff_metadata_conv(metadata, NULL, id3v2_2_metadata_conv);
> +        ff_metadata_conv(metadata, NULL, ff_id3v2_4_metadata_conv);
> +    }
> +
>      merge_date(metadata);
>  }
>  
> diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
> index 31ee456..347dbcd 100644
> --- a/libavformat/matroskadec.c
> +++ b/libavformat/matroskadec.c
> @@ -1377,7 +1377,9 @@ static void matroska_convert_tag(AVFormatContext *s, EbmlList *list,
>                  matroska_convert_tag(s, &tags[i].sub, metadata, key);
>          }
>      }
> -    ff_metadata_conv(metadata, NULL, ff_mkv_metadata_conv);
> +
> +    if (!(s->flags & AVFMT_FLAG_NO_META_CONV))
> +        ff_metadata_conv(metadata, NULL, ff_mkv_metadata_conv);
>  }
>  
>  static void matroska_convert_tags(AVFormatContext *s)
> diff --git a/libavformat/metadata.c b/libavformat/metadata.c
> index b9b6de7..bba7af7 100644
> --- a/libavformat/metadata.c
> +++ b/libavformat/metadata.c
> @@ -60,6 +60,10 @@ void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv,
>                                                  const AVMetadataConv *s_conv)
>  {
>      int i;
> +
> +    if (s_conv && (ctx->flags & AVFMT_FLAG_NO_META_CONV))
> +        return;
> +
>      ff_metadata_conv(&ctx->metadata, d_conv, s_conv);
>      for (i=0; i<ctx->nb_streams ; i++)
>          ff_metadata_conv(&ctx->streams [i]->metadata, d_conv, s_conv);
> diff --git a/libavformat/oggparsevorbis.c b/libavformat/oggparsevorbis.c
> index 8103d9d..17f0dd2 100644
> --- a/libavformat/oggparsevorbis.c
> +++ b/libavformat/oggparsevorbis.c
> @@ -176,7 +176,8 @@ int ff_vorbis_comment(AVFormatContext *as, AVDictionary **m,
>          av_log(as, AV_LOG_INFO,
>                 "truncated comment header, %i comments not found\n", n);
>  
> -    ff_metadata_conv(m, NULL, ff_vorbiscomment_metadata_conv);
> +    if (!(as->flags & AVFMT_FLAG_NO_META_CONV))
> +        ff_metadata_conv(m, NULL, ff_vorbiscomment_metadata_conv);
>  
>      return 0;
>  }
> diff --git a/libavformat/options_table.h b/libavformat/options_table.h
> index 94cd65c..24ec130 100644
> --- a/libavformat/options_table.h
> +++ b/libavformat/options_table.h
> @@ -49,6 +49,7 @@ static const AVOption avformat_options[] = {
>  {"discardcorrupt", "discard corrupted frames", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_DISCARD_CORRUPT }, INT_MIN, INT_MAX, D, "fflags"},
>  {"sortdts", "try to interleave outputted packets by dts", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_SORT_DTS }, INT_MIN, INT_MAX, D, "fflags"},
>  {"keepside", "don't merge side data", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_KEEP_SIDE_DATA }, INT_MIN, INT_MAX, D, "fflags"},
> +{"nometaconv", "skip conversion of metadata field names", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_NO_META_CONV }, INT_MIN, INT_MAX, D, "fflags"},
>  {"latm", "enable RTP MP4A-LATM payload", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_MP4A_LATM }, INT_MIN, INT_MAX, E, "fflags"},
>  {"nobuffer", "reduce the latency introduced by optional buffering", 0, AV_OPT_TYPE_CONST, {.i64 = AVFMT_FLAG_NOBUFFER }, 0, INT_MAX, D, "fflags"},
>  {"seek2any", "allow seeking to non-keyframes on demuxer level when supported", OFFSET(seek2any), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, 1, D},
> diff --git a/libavformat/version.h b/libavformat/version.h
> index 1cbb889..c09bd88 100644
> --- a/libavformat/version.h
> +++ b/libavformat/version.h
> @@ -30,7 +30,7 @@
>  #include "libavutil/version.h"
>  
>  #define LIBAVFORMAT_VERSION_MAJOR 56
> -#define LIBAVFORMAT_VERSION_MINOR  0
> +#define LIBAVFORMAT_VERSION_MINOR  1
>  #define LIBAVFORMAT_VERSION_MICRO 100
>  
>  #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
> diff --git a/libavformat/wtvdec.c b/libavformat/wtvdec.c
> index c70057c..644f0a2 100644
> --- a/libavformat/wtvdec.c
> +++ b/libavformat/wtvdec.c
> @@ -549,7 +549,8 @@ static void parse_legacy_attrib(AVFormatContext *s, AVIOContext *pb)
>          get_tag(s, pb, key, type, length);
>      }
>  
> -    ff_metadata_conv(&s->metadata, NULL, ff_asf_metadata_conv);
> +    if (!(s->flags & AVFMT_FLAG_NO_META_CONV))
> +        ff_metadata_conv(&s->metadata, NULL, ff_asf_metadata_conv);
>  }
>  
>  /**



More information about the ffmpeg-devel mailing list