---
 doc/APIchanges         |    4 ++
 libavformat/avformat.h |   35 ++++++-------
 libavformat/metadata.c |  121 ++++-------------------------------------
 libavformat/metadata.h |   12 +----
 libavutil/Makefile     |    3 +
 libavutil/avutil.h     |    2 +-
 libavutil/meta.h       |   78 ++++++++++++++++++++++++++
 libavutil/metadata.c   |  142 ++++++++++++++++++++++++++++++++++++++++++++++++
 libavutil/metadata.h   |   44 +++++++++++++++
 9 files changed, 301 insertions(+), 140 deletions(-)
 create mode 100644 libavutil/meta.h
 create mode 100644 libavutil/metadata.c
 create mode 100644 libavutil/metadata.h

diff --git a/doc/APIchanges b/doc/APIchanges
index 853975e..d37b2fb 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,10 @@ libavutil:   2011-04-18
 
 API changes, most recent first:
 
+2011-05-xx - xxxxxxx - lavu 51.2.0 - AVMetadata
+  Move AVMetadata from lavf to lavu -- new installed headers
+  meta.h (accessing metadata) and metadata.h (internals).
+
 2011-05-18 - 64150ff - lavc 53.4.0 - AVCodecContext.request_sample_fmt
   Add request_sample_fmt field to AVCodecContext.
 
diff --git a/libavformat/avformat.h b/libavformat/avformat.h
index 81538e2..7e52f1e 100644
--- a/libavformat/avformat.h
+++ b/libavformat/avformat.h
@@ -106,21 +106,16 @@ struct AVFormatContext;
  * variant_bitrate -- the total bitrate of the bitrate variant that the 
current stream is part of
  */
 
-#define AV_METADATA_MATCH_CASE      1
-#define AV_METADATA_IGNORE_SUFFIX   2
-#define AV_METADATA_DONT_STRDUP_KEY 4
-#define AV_METADATA_DONT_STRDUP_VAL 8
-#define AV_METADATA_DONT_OVERWRITE 16   ///< Don't overwrite existing tags.
-
-typedef struct {
-    char *key;
-    char *value;
-}AVMetadataTag;
-
-typedef struct AVMetadata AVMetadata;
 #if FF_API_OLD_METADATA2
+/**
+ * @defgroup old_metadata Old metadata API
+ * The following functions are deprecated, use
+ * their equivalents from libavutil/meta.h instead.
+ * @{
+ */
+#include "libavutil/meta.h"
+
 typedef struct AVMetadataConv AVMetadataConv;
-#endif
 
 /**
  * Get a metadata element with matching key.
@@ -130,7 +125,7 @@ typedef struct AVMetadataConv AVMetadataConv;
  * @param flags Allows case as well as suffix-insensitive comparisons.
  * @return Found tag or NULL, changing key or value leads to undefined 
behavior.
  */
-AVMetadataTag *
+attribute_deprecated AVMetadataTag *
 av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int 
flags);
 
 /**
@@ -143,15 +138,13 @@ av_metadata_get(AVMetadata *m, const char *key, const 
AVMetadataTag *prev, int f
  *        Passing a NULL value will cause an existing tag to be deleted.
  * @return >= 0 on success otherwise an error code <0
  */
-int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int 
flags);
+attribute_deprecated int av_metadata_set2(AVMetadata **pm, const char *key, 
const char *value, int flags);
 
-#if FF_API_OLD_METADATA2
 /**
  * This function is provided for compatibility reason and currently does 
nothing.
  */
 attribute_deprecated void av_metadata_conv(struct AVFormatContext *ctx, const 
AVMetadataConv *d_conv,
                                                                         const 
AVMetadataConv *s_conv);
-#endif
 
 /**
  * Copy metadata from one AVMetadata struct into another.
@@ -161,12 +154,16 @@ attribute_deprecated void av_metadata_conv(struct 
AVFormatContext *ctx, const AV
  * @param flags flags to use when setting metadata in *dst
  * @note metadata is read using the AV_METADATA_IGNORE_SUFFIX flag
  */
-void av_metadata_copy(AVMetadata **dst, AVMetadata *src, int flags);
+attribute_deprecated void av_metadata_copy(AVMetadata **dst, AVMetadata *src, 
int flags);
 
 /**
  * Free all the memory allocated for an AVMetadata struct.
  */
-void av_metadata_free(AVMetadata **m);
+attribute_deprecated void av_metadata_free(AVMetadata **m);
+/**
+ * @}
+ */
+#endif
 
 
 /* packet functions */
diff --git a/libavformat/metadata.c b/libavformat/metadata.c
index f027546..be4e847 100644
--- a/libavformat/metadata.c
+++ b/libavformat/metadata.c
@@ -18,146 +18,49 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
-#include <strings.h>
 #include "avformat.h"
 #include "metadata.h"
+#include "libavutil/metadata.h"
 
+#if FF_API_OLD_METADATA2
 AVMetadataTag *
 av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int 
flags)
 {
-    unsigned int i, j;
-
-    if(!m)
-        return NULL;
-
-    if(prev) i= prev - m->elems + 1;
-    else     i= 0;
-
-    for(; i<m->count; i++){
-        const char *s= m->elems[i].key;
-        if(flags & AV_METADATA_MATCH_CASE) for(j=0;         s[j]  ==         
key[j]  && key[j]; j++);
-        else                               for(j=0; toupper(s[j]) == 
toupper(key[j]) && key[j]; j++);
-        if(key[j])
-            continue;
-        if(s[j] && !(flags & AV_METADATA_IGNORE_SUFFIX))
-            continue;
-        return &m->elems[i];
-    }
-    return NULL;
+    return avmeta_get(m, key, prev, flags);
 }
 
 int av_metadata_set2(AVMetadata **pm, const char *key, const char *value, int 
flags)
 {
-    AVMetadata *m= *pm;
-    AVMetadataTag *tag= av_metadata_get(m, key, NULL, flags);
-
-    if(!m)
-        m=*pm= av_mallocz(sizeof(*m));
-
-    if(tag){
-        if (flags & AV_METADATA_DONT_OVERWRITE)
-            return 0;
-        av_free(tag->value);
-        av_free(tag->key);
-        *tag= m->elems[--m->count];
-    }else{
-        AVMetadataTag *tmp= av_realloc(m->elems, (m->count+1) * 
sizeof(*m->elems));
-        if(tmp){
-            m->elems= tmp;
-        }else
-            return AVERROR(ENOMEM);
-    }
-    if(value){
-        if(flags & AV_METADATA_DONT_STRDUP_KEY){
-            m->elems[m->count].key  = key;
-        }else
-        m->elems[m->count].key  = av_strdup(key  );
-        if(flags & AV_METADATA_DONT_STRDUP_VAL){
-            m->elems[m->count].value= value;
-        }else
-        m->elems[m->count].value= av_strdup(value);
-        m->count++;
-    }
-    if(!m->count) {
-        av_free(m->elems);
-        av_freep(pm);
-    }
-
-    return 0;
+    return avmeta_set(pm, key, value, flags);
 }
 
-#if FF_API_OLD_METADATA2
 void av_metadata_conv(AVFormatContext *ctx, const AVMetadataConv *d_conv,
                                             const AVMetadataConv *s_conv)
 {
     return;
 }
-#endif
 
 void av_metadata_free(AVMetadata **pm)
 {
-    AVMetadata *m= *pm;
-
-    if(m){
-        while(m->count--){
-            av_free(m->elems[m->count].key);
-            av_free(m->elems[m->count].value);
-        }
-        av_free(m->elems);
-    }
-    av_freep(pm);
+    return avmeta_free(pm);
 }
 
-void ff_metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
-                                       const AVMetadataConv *s_conv)
+void av_metadata_copy(AVMetadata **dst, AVMetadata *src, int flags)
 {
-    /* 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;
+    avmeta_copy(dst, src, flags);
 }
+#endif
 
 void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv,
                                                 const AVMetadataConv *s_conv)
 {
     int i;
-    ff_metadata_conv(&ctx->metadata, d_conv, s_conv);
+    avmeta_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);
+        avmeta_conv(&ctx->streams [i]->metadata, d_conv, s_conv);
     for (i=0; i<ctx->nb_chapters; i++)
-        ff_metadata_conv(&ctx->chapters[i]->metadata, d_conv, s_conv);
+        avmeta_conv(&ctx->chapters[i]->metadata, d_conv, s_conv);
     for (i=0; i<ctx->nb_programs; i++)
-        ff_metadata_conv(&ctx->programs[i]->metadata, d_conv, s_conv);
+        avmeta_conv(&ctx->programs[i]->metadata, d_conv, s_conv);
 }
 
-void av_metadata_copy(AVMetadata **dst, AVMetadata *src, int flags)
-{
-    AVMetadataTag *t = NULL;
-
-    while ((t = av_metadata_get(src, "", t, AV_METADATA_IGNORE_SUFFIX)))
-        av_metadata_set2(dst, t->key, t->value, flags);
-}
diff --git a/libavformat/metadata.h b/libavformat/metadata.h
index 09066b8..e4820eb 100644
--- a/libavformat/metadata.h
+++ b/libavformat/metadata.h
@@ -29,22 +29,12 @@
 
 
 #include "avformat.h"
+#include "libavutil/metadata.h"
 
-struct AVMetadata{
-    int count;
-    AVMetadataTag *elems;
-};
-
-struct AVMetadataConv{
-    const char *native;
-    const char *generic;
-};
 #if !FF_API_OLD_METADATA2
 typedef struct AVMetadataConv AVMetadataConv;
 #endif
 
-void ff_metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
-                                       const AVMetadataConv *s_conv);
 void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv,
                                                 const AVMetadataConv *s_conv);
 
diff --git a/libavutil/Makefile b/libavutil/Makefile
index 1386ebb..3220b42 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -27,6 +27,8 @@ HEADERS = adler32.h                                           
          \
           mathematics.h                                                 \
           md5.h                                                         \
           mem.h                                                         \
+          meta.h                                                        \
+          metadata.h                                                    \
           opt.h                                                         \
           parseutils.h                                                  \
           pixdesc.h                                                     \
@@ -60,6 +62,7 @@ OBJS = adler32.o                                              
          \
        mathematics.o                                                    \
        md5.o                                                            \
        mem.o                                                            \
+       metadata.o                                                       \
        opt.o                                                            \
        parseutils.o                                                     \
        pixdesc.o                                                        \
diff --git a/libavutil/avutil.h b/libavutil/avutil.h
index 43f0815..8b8ca40 100644
--- a/libavutil/avutil.h
+++ b/libavutil/avutil.h
@@ -40,7 +40,7 @@
 #define AV_VERSION(a, b, c) AV_VERSION_DOT(a, b, c)
 
 #define LIBAVUTIL_VERSION_MAJOR 51
-#define LIBAVUTIL_VERSION_MINOR  1
+#define LIBAVUTIL_VERSION_MINOR  2
 #define LIBAVUTIL_VERSION_MICRO  0
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/libavutil/meta.h b/libavutil/meta.h
new file mode 100644
index 0000000..60e1ca9
--- /dev/null
+++ b/libavutil/meta.h
@@ -0,0 +1,78 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file Public metadata API.
+ */
+
+#ifndef AVUTIL_META_H
+#define AVUTIL_META_H
+
+#define AV_METADATA_MATCH_CASE      1
+#define AV_METADATA_IGNORE_SUFFIX   2
+#define AV_METADATA_DONT_STRDUP_KEY 4
+#define AV_METADATA_DONT_STRDUP_VAL 8
+#define AV_METADATA_DONT_OVERWRITE 16   ///< Don't overwrite existing tags.
+
+typedef struct {
+    char *key;
+    char *value;
+} AVMetadataTag;
+
+typedef struct AVMetadata AVMetadata;
+
+/**
+ * Get a metadata element with matching key.
+ *
+ * @param prev Set to the previous matching element to find the next.
+ *             If set to NULL the first matching element is returned.
+ * @param flags Allows case as well as suffix-insensitive comparisons.
+ * @return Found tag or NULL, changing key or value leads to undefined 
behavior.
+ */
+AVMetadataTag *
+avmeta_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int 
flags);
+
+/**
+ * Set the given tag in *pm, overwriting an existing tag.
+ *
+ * @param pm pointer to a pointer to a metadata struct. If *pm is NULL
+ * a metadata struct is allocated and put in *pm.
+ * @param key tag key to add to *pm (will be av_strduped depending on flags)
+ * @param value tag value to add to *pm (will be av_strduped depending on 
flags).
+ *        Passing a NULL value will cause an existing tag to be deleted.
+ * @return >= 0 on success otherwise an error code <0
+ */
+int avmeta_set(AVMetadata **pm, const char *key, const char *value, int flags);
+
+/**
+ * Copy metadata from one AVMetadata struct into another.
+ * @param dst pointer to a pointer to a AVMetadata struct. If *dst is NULL,
+ *            this function will allocate a struct for you and put it in *dst
+ * @param src pointer to source AVMetadata struct
+ * @param flags flags to use when setting metadata in *dst
+ * @note metadata is read using the AV_METADATA_IGNORE_SUFFIX flag
+ */
+void avmeta_copy(AVMetadata **dst, AVMetadata *src, int flags);
+
+/**
+ * Free all the memory allocated for an AVMetadata struct.
+ */
+void avmeta_free(AVMetadata **m);
+
+#endif // AVUTIL_META_H
diff --git a/libavutil/metadata.c b/libavutil/metadata.c
new file mode 100644
index 0000000..02bc79d
--- /dev/null
+++ b/libavutil/metadata.c
@@ -0,0 +1,142 @@
+/*
+ * copyright (c) 2009 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include <strings.h>
+#include "metadata.h"
+#include "mem.h"
+
+AVMetadataTag *
+avmeta_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int 
flags)
+{
+    unsigned int i, j;
+
+    if(!m)
+        return NULL;
+
+    if(prev) i= prev - m->elems + 1;
+    else     i= 0;
+
+    for(; i<m->count; i++){
+        const char *s= m->elems[i].key;
+        if(flags & AV_METADATA_MATCH_CASE) for(j=0;         s[j]  ==         
key[j]  && key[j]; j++);
+        else                               for(j=0; toupper(s[j]) == 
toupper(key[j]) && key[j]; j++);
+        if(key[j])
+            continue;
+        if(s[j] && !(flags & AV_METADATA_IGNORE_SUFFIX))
+            continue;
+        return &m->elems[i];
+    }
+    return NULL;
+}
+
+int avmeta_set(AVMetadata **pm, const char *key, const char *value, int flags)
+{
+    AVMetadata      *m = *pm;
+    AVMetadataTag *tag = avmeta_get(m, key, NULL, flags);
+
+    if(!m)
+        m = *pm = av_mallocz(sizeof(*m));
+
+    if(tag) {
+        if (flags & AV_METADATA_DONT_OVERWRITE)
+            return 0;
+        av_free(tag->value);
+        av_free(tag->key);
+        *tag = m->elems[--m->count];
+    } else {
+        AVMetadataTag *tmp = av_realloc(m->elems, (m->count+1) * 
sizeof(*m->elems));
+        if(tmp) {
+            m->elems = tmp;
+        } else
+            return AVERROR(ENOMEM);
+    }
+    if (value) {
+        if (flags & AV_METADATA_DONT_STRDUP_KEY) {
+            m->elems[m->count].key  = key;
+        } else
+        m->elems[m->count].key  = av_strdup(key  );
+        if (flags & AV_METADATA_DONT_STRDUP_VAL) {
+            m->elems[m->count].value = value;
+        } else
+            m->elems[m->count].value = av_strdup(value);
+        m->count++;
+    }
+    if (!m->count) {
+        av_free(m->elems);
+        av_freep(pm);
+    }
+
+    return 0;
+}
+
+void avmeta_free(AVMetadata **pm)
+{
+    AVMetadata *m = *pm;
+
+    if (m) {
+        while(m->count--) {
+            av_free(m->elems[m->count].key);
+            av_free(m->elems[m->count].value);
+        }
+        av_free(m->elems);
+    }
+    av_freep(pm);
+}
+
+void avmeta_copy(AVMetadata **dst, AVMetadata *src, int flags)
+{
+    AVMetadataTag *t = NULL;
+
+    while ((t = avmeta_get(src, "", t, AV_METADATA_IGNORE_SUFFIX)))
+        avmeta_set(dst, t->key, t->value, flags);
+}
+
+void avmeta_conv(AVMetadata **pm, const struct AVMetadataConv *d_conv,
+                                  const struct 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 struct AVMetadataConv *sc, *dc;
+    AVMetadataTag *mtag = NULL;
+    AVMetadata *dst = NULL;
+    const char *key;
+
+    if (d_conv == s_conv)
+        return;
+
+    while ((mtag = avmeta_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;
+                }
+        avmeta_set(&dst, key, mtag->value, 0);
+    }
+    avmeta_free(pm);
+    *pm = dst;
+}
diff --git a/libavutil/metadata.h b/libavutil/metadata.h
new file mode 100644
index 0000000..2840030
--- /dev/null
+++ b/libavutil/metadata.h
@@ -0,0 +1,44 @@
+/*
+ * copyright (c) 2009 Michael Niedermayer
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+/**
+ * @file Private part of metadata API.
+ * see meta.h for the public API.
+ */
+
+#ifndef AVUTIL_METADATA_H
+#define AVUTIL_METADATA_H
+
+#include "meta.h"
+
+struct AVMetadata {
+    int count;
+    AVMetadataTag *elems;
+};
+
+struct AVMetadataConv {
+    const char *native;
+    const char *generic;
+};
+
+void avmeta_conv(AVMetadata **pm, const struct AVMetadataConv *d_conv,
+                                  const struct AVMetadataConv *s_conv);
+
+#endif // AVUTIL_METADATA_H
-- 
1.7.5.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to