[FFmpeg-devel] [PATCH 4/5] metadata: deprecate old conversion API

Anton Khirnov anton
Sun Oct 3 21:14:25 CEST 2010


From: Anton Khirnov <wyskas at gmail.com>

also remove internal func metadata_conv() and replace it with
av_metadata_clone().
---
 doc/APIchanges            |    4 +++
 libavformat/asfdec.c      |    2 +
 libavformat/avformat.h    |   12 +++++++---
 libavformat/avidec.c      |    2 +
 libavformat/flacdec.c     |    2 +
 libavformat/matroskadec.c |    2 +
 libavformat/metadata.c    |   49 +++++++++++----------------------------------
 libavformat/metadata.h    |    3 --
 libavformat/mp3.c         |    2 +
 libavformat/nutdec.c      |    2 +
 libavformat/oggdec.c      |    2 +
 libavformat/oma.c         |    2 +
 libavformat/utils.c       |    5 +---
 13 files changed, 41 insertions(+), 48 deletions(-)

diff --git a/doc/APIchanges b/doc/APIchanges
index 81fd08d..fcb7f20 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,10 @@ libavutil:   2009-03-08
 
 API changes, most recent first:
 
+2010-10-xx - r25xxx - lavf 52.80.0 - metadata API
+  Add new metadata conversion API (av_metadata_clone()),
+  deprecate old API.
+
 2010-09-27 - r25236 - lavu 50.31.0 - av_set_options_string()
   Move av_set_options_string() from libavfilter/parseutils.h to
   libavutil/opt.h.
diff --git a/libavformat/asfdec.c b/libavformat/asfdec.c
index 59b075c..0bb7c79 100644
--- a/libavformat/asfdec.c
+++ b/libavformat/asfdec.c
@@ -1237,5 +1237,7 @@ AVInputFormat asf_demuxer = {
     asf_read_close,
     asf_read_seek,
     asf_read_pts,
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_asf_metadata_conv,
+#endif
 };
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index ab4cf05..e36ac05 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -22,7 +22,7 @@
 #define AVFORMAT_AVFORMAT_H
 
 #define LIBAVFORMAT_VERSION_MAJOR 52
-#define LIBAVFORMAT_VERSION_MINOR 79
+#define LIBAVFORMAT_VERSION_MINOR 80
 #define LIBAVFORMAT_VERSION_MICRO  0
 
 #define LIBAVFORMAT_VERSION_INT AV_VERSION_INT(LIBAVFORMAT_VERSION_MAJOR, \
@@ -186,6 +186,7 @@ attribute_deprecated int av_metadata_set(AVMetadata **pm, const char *key, const
  */
 int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int flags);
 
+#if FF_API_OLD_METADATA
 /**
  * Convert all the metadata sets from ctx according to the source and
  * destination conversion tables. If one of the tables is NULL, then
@@ -194,8 +195,9 @@ int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int fl
  * @param d_conv destination tags format conversion table
  * @param s_conv source tags format conversion table
  */
-void av_metadata_conv(struct AVFormatContext *ctx, const AVMetadataConv *d_conv,
-                                                   const AVMetadataConv *s_conv);
+attribute_deprecated void av_metadata_conv(struct AVFormatContext *ctx, const AVMetadataConv *d_conv,
+                                           const AVMetadataConv *s_conv);
+#endif // FF_API_OLD_METADATA
 
 /**
  * Copy metadata from src to dst, converting between their respective formats.
@@ -457,7 +459,9 @@ typedef struct AVInputFormat {
      */
     int (*read_seek2)(struct AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags);
 
-    const AVMetadataConv *metadata_conv;
+#if FF_API_OLD_METADATA
+    attribute_deprecated const AVMetadataConv *metadata_conv;
+#endif
 
     /* private fields */
     struct AVInputFormat *next;
diff --git a/libavformat/avidec.c b/libavformat/avidec.c
index 6bd4fd9..521f48d 100644
--- a/libavformat/avidec.c
+++ b/libavformat/avidec.c
@@ -1333,5 +1333,7 @@ AVInputFormat avi_demuxer = {
     avi_read_packet,
     avi_read_close,
     avi_read_seek,
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_avi_metadata_conv,
+#endif
 };
diff --git a/libavformat/flacdec.c b/libavformat/flacdec.c
index e54fb39..63761ee 100644
--- a/libavformat/flacdec.c
+++ b/libavformat/flacdec.c
@@ -147,5 +147,7 @@ AVInputFormat flac_demuxer = {
     .flags= AVFMT_GENERIC_INDEX,
     .extensions = "flac",
     .value = CODEC_ID_FLAC,
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_vorbiscomment_metadata_conv,
+#endif
 };
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c
index 964ed8c..74c9eba 100644
--- a/libavformat/matroskadec.c
+++ b/libavformat/matroskadec.c
@@ -1925,5 +1925,7 @@ AVInputFormat matroska_demuxer = {
     matroska_read_packet,
     matroska_read_close,
     matroska_read_seek,
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_mkv_metadata_conv,
+#endif
 };
diff --git a/libavformat/metadata.c b/libavformat/metadata.c
index 16ddb34..0ce78e6 100644
--- a/libavformat/metadata.c
+++ b/libavformat/metadata.c
@@ -107,51 +107,26 @@ void av_metadata_free(AVMetadata **pm)
     av_freep(pm);
 }
 
-void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
-                                           const AVMetadataConv *s_conv)
-{
-    /* TODO: use binary search to look up the two conversion tables
-       if the tables are getting big enough that it would matter speed wise */
-    const AVMetadataConv *sc, *dc;
-    AVMetadataTag *mtag = NULL;
-    AVMetadata *dst = NULL;
-    const char *key;
-
-    if (d_conv == s_conv)
-        return;
-
-    while((mtag=av_metadata_get(*pm, "", mtag, AV_METADATA_IGNORE_SUFFIX))) {
-        key = mtag->key;
-        if (s_conv)
-            for (sc=s_conv; sc->native; sc++)
-                if (!strcasecmp(key, sc->native)) {
-                    key = sc->generic;
-                    break;
-                }
-        if (d_conv)
-            for (dc=d_conv; dc->native; dc++)
-                if (!strcasecmp(key, dc->generic)) {
-                    key = dc->native;
-                    break;
-                }
-        av_metadata_set2(&dst, key, mtag->value, 0);
-    }
-    av_metadata_free(pm);
-    *pm = dst;
-}
-
+#if FF_API_OLD_METADATA
 void av_metadata_conv(AVFormatContext *ctx, const AVMetadataConv *d_conv,
                                             const AVMetadataConv *s_conv)
 {
     int i;
-    metadata_conv(&ctx->metadata, d_conv, s_conv);
+    if (ctx->metadata)
+        ctx->metadata->cur_fmt = s_conv;
     for (i=0; i<ctx->nb_streams ; i++)
-        metadata_conv(&ctx->streams [i]->metadata, d_conv, s_conv);
+        if (ctx->streams[i]->metadata)
+            ctx->streams[i]->metadata->cur_fmt = s_conv;
     for (i=0; i<ctx->nb_chapters; i++)
-        metadata_conv(&ctx->chapters[i]->metadata, d_conv, s_conv);
+        if (ctx->chapters[i]->metadata)
+            ctx->chapters[i]->metadata->cur_fmt = s_conv;
     for (i=0; i<ctx->nb_programs; i++)
-        metadata_conv(&ctx->programs[i]->metadata, d_conv, s_conv);
+        if (ctx->programs[i]->metadata)
+            ctx->programs[i]->metadata->cur_fmt = s_conv;
+
+    av_metadata_clone_ctx(ctx, ctx, d_conv, NULL, 0);
 }
+#endif
 
 int av_metadata_clone(AVMetadata **src, AVMetadata **dst, const AVMetadataConv *dst_fmt,
                       const char *pattern, int flags)
diff --git a/libavformat/metadata.h b/libavformat/metadata.h
index 4e54904..48825a0 100644
--- a/libavformat/metadata.h
+++ b/libavformat/metadata.h
@@ -46,7 +46,4 @@ void ff_metadata_demux_compat(AVFormatContext *s);
 void ff_metadata_mux_compat(AVFormatContext *s);
 #endif
 
-void metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
-                                    const AVMetadataConv *s_conv);
-
 #endif /* AVFORMAT_METADATA_H */
diff --git a/libavformat/mp3.c b/libavformat/mp3.c
index c1622a3..1a9e590 100644
--- a/libavformat/mp3.c
+++ b/libavformat/mp3.c
@@ -199,7 +199,9 @@ AVInputFormat mp3_demuxer = {
     mp3_read_packet,
     .flags= AVFMT_GENERIC_INDEX,
     .extensions = "mp2,mp3,m2a", /* XXX: use probe */
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_id3v2_metadata_conv,
+#endif
 };
 #endif
 
diff --git a/libavformat/nutdec.c b/libavformat/nutdec.c
index 3dc608f..4fc2c9d 100644
--- a/libavformat/nutdec.c
+++ b/libavformat/nutdec.c
@@ -936,7 +936,9 @@ AVInputFormat nut_demuxer = {
     nut_read_close,
     read_seek,
     .extensions = "nut",
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_nut_metadata_conv,
+#endif
     .codec_tag = (const AVCodecTag * const []) { ff_codec_bmp_tags, ff_nut_video_tags, ff_codec_wav_tags, ff_nut_subtitle_tags, 0 },
 };
 #endif
diff --git a/libavformat/oggdec.c b/libavformat/oggdec.c
index 4c9a43a..b20fe8d 100644
--- a/libavformat/oggdec.c
+++ b/libavformat/oggdec.c
@@ -641,6 +641,8 @@ AVInputFormat ogg_demuxer = {
     ogg_read_seek,
     ogg_read_timestamp,
     .extensions = "ogg",
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_vorbiscomment_metadata_conv,
+#endif
     .flags = AVFMT_GENERIC_INDEX,
 };
diff --git a/libavformat/oma.c b/libavformat/oma.c
index cdf1106..51f3410 100644
--- a/libavformat/oma.c
+++ b/libavformat/oma.c
@@ -201,6 +201,8 @@ AVInputFormat oma_demuxer = {
     .flags= AVFMT_GENERIC_INDEX,
     .extensions = "oma,aa3",
     .codec_tag= (const AVCodecTag* const []){codec_oma_tags, 0},
+#if FF_API_OLD_METADATA
     .metadata_conv = ff_id3v2_metadata_conv,
+#endif
 };
 
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 5985511..995b8ba 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -2727,14 +2727,11 @@ int av_write_header(AVFormatContext *s)
     /* set muxer identification string */
     if (!(s->streams[0]->codec->flags & CODEC_FLAG_BITEXACT)) {
         AVMetadata *m;
-        AVMetadataTag *t;
 
         if (!(m = av_mallocz(sizeof(AVMetadata))))
             return AVERROR(ENOMEM);
         av_metadata_set2(&m, "encoder", LIBAVFORMAT_IDENT, 0);
-        metadata_conv(&m, s->oformat->metadata_conv, NULL);
-        if ((t = av_metadata_get(m, "", NULL, AV_METADATA_IGNORE_SUFFIX)))
-            av_metadata_set2(&s->metadata, t->key, t->value, 0);
+        av_metadata_clone(&m, &s->metadata, s->oformat->metadata_conv, NULL, AV_METADATA_IGNORE_SUFFIX);
         av_metadata_free(&m);
     }
 
-- 
1.7.1




More information about the ffmpeg-devel mailing list