free all allocated metadata structures
[ffmpeg.git] / libavformat / metadata.c
index d223d7c..70bfa3d 100644 (file)
@@ -20,8 +20,8 @@
 
 #include "metadata.h"
 
-AVMetaDataTag *
-av_metadata_get(struct AVMetaData *m, const char *key, const AVMetaDataTag *prev, int flags)
+AVMetadataTag *
+av_metadata_get(AVMetadata *m, const char *key, const AVMetadataTag *prev, int flags)
 {
     unsigned int i, j;
 
@@ -44,10 +44,10 @@ av_metadata_get(struct AVMetaData *m, const char *key, const AVMetaDataTag *prev
     return NULL;
 }
 
-int av_metadata_set(struct AVMetaData **pm, AVMetaDataTag elem)
+int av_metadata_set(AVMetadata **pm, AVMetadataTag elem)
 {
-    struct AVMetaData *m= *pm;
-    AVMetaDataTag *tag= av_metadata_get(m, elem.key, NULL, 0);
+    AVMetadata *m= *pm;
+    AVMetadataTag *tag= av_metadata_get(m, elem.key, NULL, 0);
 
     if(!m)
         m=*pm= av_mallocz(sizeof(*m));
@@ -57,7 +57,7 @@ int av_metadata_set(struct AVMetaData **pm, AVMetaDataTag elem)
         av_free(tag->key);
         *tag= m->elems[--m->count];
     }else{
-        AVMetaDataTag *tmp= av_realloc(m->elems, (m->count+1) * sizeof(*m->elems));
+        AVMetadataTag *tmp= av_realloc(m->elems, (m->count+1) * sizeof(*m->elems));
         if(tmp){
             m->elems= tmp;
         }else
@@ -73,3 +73,54 @@ int av_metadata_set(struct AVMetaData **pm, AVMetaDataTag elem)
 
     return 0;
 }
+
+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);
+}
+
+#if LIBAVFORMAT_VERSION_MAJOR < 53
+#define FILL_METADATA(s, key, value) {                                        \
+    if (value && *value &&                                                    \
+        !av_metadata_get(s->metadata, #key, NULL, AV_METADATA_IGNORE_CASE))   \
+        av_metadata_set(&s->metadata, (const AVMetadataTag){#key, value});    \
+    }
+#define FILL_METADATA_STR(s, key)  FILL_METADATA(s, key, s->key)
+#define FILL_METADATA_INT(s, key) {                                           \
+    char number[10];                                                          \
+    snprintf(number, sizeof(number), "%d", s->key);                           \
+    if(s->key)  FILL_METADATA(s, key, number) }
+
+void ff_metadata_sync_compat(AVFormatContext *ctx)
+{
+    int i;
+
+    FILL_METADATA_STR(ctx, title);
+    FILL_METADATA_STR(ctx, author);
+    FILL_METADATA_STR(ctx, copyright);
+    FILL_METADATA_STR(ctx, comment);
+    FILL_METADATA_STR(ctx, album);
+    FILL_METADATA_INT(ctx, year);
+    FILL_METADATA_INT(ctx, track);
+    FILL_METADATA_STR(ctx, genre);
+    for (i=0; i<ctx->nb_chapters; i++)
+        FILL_METADATA_STR(ctx->chapters[i], title);
+    for (i=0; i<ctx->nb_programs; i++) {
+        FILL_METADATA_STR(ctx->programs[i], name);
+        FILL_METADATA_STR(ctx->programs[i], provider_name);
+    }
+    for (i=0; i<ctx->nb_streams; i++) {
+        FILL_METADATA_STR(ctx->streams[i], language);
+        FILL_METADATA_STR(ctx->streams[i], filename);
+    }
+}
+#endif