annotate metadata.c @ 8520:a0164882aa38 libavcodec

Generic metadata API. avi is updated as example. No version bump, the API still might change slightly ... No update to ffmpeg.c as requested by aurel.
author michael
date Sun, 04 Jan 2009 18:48:37 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8520
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
1 /*
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
2 * copyright (c) 2009 Michael Niedermayer
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
3 *
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
4 * This file is part of FFmpeg.
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
5 *
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
6 * FFmpeg is free software; you can redistribute it and/or
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
7 * modify it under the terms of the GNU Lesser General Public
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
8 * License as published by the Free Software Foundation; either
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
9 * version 2.1 of the License, or (at your option) any later version.
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
10 *
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
11 * FFmpeg is distributed in the hope that it will be useful,
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
14 * Lesser General Public License for more details.
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
15 *
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
16 * You should have received a copy of the GNU Lesser General Public
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
17 * License along with FFmpeg; if not, write to the Free Software
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
19 */
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
20
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
21 #include "metadata.h"
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
22
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
23 AVMetaDataTag *
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
24 av_metadata_get(struct AVMetaData *m, const char *key, const AVMetaDataTag *prev, int flags)
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
25 {
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
26 unsigned int i, j;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
27
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
28 if(!m)
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
29 return NULL;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
30
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
31 if(prev) i= prev - m->elems + 1;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
32 else i= 0;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
33
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
34 for(; i<m->count; i++){
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
35 const char *s= m->elems[i].key;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
36 if(flags & AV_METADATA_IGNORE_CASE) for(j=0; toupper(s[j]) == toupper(key[j]) && key[j]; j++);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
37 else for(j=0; s[j] == key[j] && key[j]; j++);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
38 if(key[j])
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
39 continue;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
40 if(s[j] && !(flags & AV_METADATA_IGNORE_SUFFIX))
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
41 continue;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
42 return &m->elems[i];
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
43 }
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
44 return NULL;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
45 }
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
46
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
47 int av_metadata_set(struct AVMetaData **pm, AVMetaDataTag elem)
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
48 {
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
49 struct AVMetaData *m= *pm;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
50 AVMetaDataTag *tag= av_metadata_get(m, elem.key, NULL, 0);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
51
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
52 if(!m)
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
53 m=*pm= av_mallocz(sizeof(*m));
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
54
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
55 if(tag){
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
56 av_free(tag->value);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
57 av_free(tag->key);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
58 *tag= m->elems[--m->count];
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
59 }else{
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
60 AVMetaDataTag *tmp= av_realloc(m->elems, (m->count+1) * sizeof(*m->elems));
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
61 if(tmp){
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
62 m->elems= tmp;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
63 }else
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
64 return AVERROR(ENOMEM);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
65 }
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
66 if(elem.value){
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
67 elem.key = av_strdup(elem.key );
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
68 elem.value= av_strdup(elem.value);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
69 m->elems[m->count++]= elem;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
70 }
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
71 if(!m->count)
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
72 av_freep(pm);
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
73
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
74 return 0;
a0164882aa38 Generic metadata API.
michael
parents:
diff changeset
75 }