---
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