mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-12-16 03:50:05 +01:00
Move metadata API from lavf to lavu.
Rename it to AVDictionary, since it will be used as such. Tags documentation and metadata conversion API is lavf-specific, so remains there.
This commit is contained in:
@@ -21,107 +21,51 @@
|
||||
#include <strings.h>
|
||||
#include "avformat.h"
|
||||
#include "metadata.h"
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
#include "libavutil/dict.h"
|
||||
|
||||
#if FF_API_OLD_METADATA2
|
||||
AVDictionaryEntry *
|
||||
av_metadata_get(AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
|
||||
{
|
||||
return av_dict_get(m, key, prev, flags);
|
||||
}
|
||||
|
||||
int av_metadata_set2(AVDictionary **pm, const char *key, const char *value, int flags)
|
||||
{
|
||||
return av_dict_set(pm, key, value, flags);
|
||||
}
|
||||
|
||||
void av_metadata_conv(AVFormatContext *ctx, const AVMetadataConv *d_conv,
|
||||
const AVMetadataConv *s_conv)
|
||||
{
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
void av_metadata_free(AVMetadata **pm)
|
||||
void av_metadata_free(AVDictionary **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);
|
||||
av_dict_free(pm);
|
||||
}
|
||||
|
||||
void ff_metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
|
||||
void av_metadata_copy(AVDictionary **dst, AVDictionary *src, int flags)
|
||||
{
|
||||
av_dict_copy(dst, src, flags);
|
||||
}
|
||||
#endif
|
||||
|
||||
void ff_metadata_conv(AVDictionary **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;
|
||||
AVDictionaryEntry *mtag = NULL;
|
||||
AVDictionary *dst = NULL;
|
||||
const char *key;
|
||||
|
||||
if (d_conv == s_conv)
|
||||
return;
|
||||
|
||||
while((mtag=av_metadata_get(*pm, "", mtag, AV_METADATA_IGNORE_SUFFIX))) {
|
||||
while ((mtag = av_dict_get(*pm, "", mtag, AV_DICT_IGNORE_SUFFIX))) {
|
||||
key = mtag->key;
|
||||
if (s_conv)
|
||||
for (sc=s_conv; sc->native; sc++)
|
||||
@@ -135,9 +79,9 @@ void ff_metadata_conv(AVMetadata **pm, const AVMetadataConv *d_conv,
|
||||
key = dc->native;
|
||||
break;
|
||||
}
|
||||
av_metadata_set2(&dst, key, mtag->value, 0);
|
||||
av_dict_set(&dst, key, mtag->value, 0);
|
||||
}
|
||||
av_metadata_free(pm);
|
||||
av_dict_free(pm);
|
||||
*pm = dst;
|
||||
}
|
||||
|
||||
@@ -154,10 +98,3 @@ void ff_metadata_conv_ctx(AVFormatContext *ctx, const AVMetadataConv *d_conv,
|
||||
ff_metadata_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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user