FFmpeg
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
dict.c
Go to the documentation of this file.
1
/*
2
* copyright (c) 2009 Michael Niedermayer
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include <ctype.h>
22
#include <string.h>
23
24
#include "
avstring.h
"
25
#include "
dict.h
"
26
#include "
internal.h
"
27
#include "
mem.h
"
28
29
struct
AVDictionary
{
30
int
count
;
31
AVDictionaryEntry
*
elems
;
32
};
33
34
int
av_dict_count
(
const
AVDictionary
*
m
)
35
{
36
return
m ? m->
count
: 0;
37
}
38
39
AVDictionaryEntry
*
40
av_dict_get
(
AVDictionary
*
m
,
const
char
*key,
const
AVDictionaryEntry
*prev,
int
flags
)
41
{
42
unsigned
int
i, j;
43
44
if
(!m)
45
return
NULL
;
46
47
if
(prev) i= prev - m->
elems
+ 1;
48
else
i= 0;
49
50
for
(; i<m->
count
; i++){
51
const
char
*s= m->
elems
[i].
key
;
52
if
(flags &
AV_DICT_MATCH_CASE
)
for
(j=0; s[j] == key[j] && key[j]; j++);
53
else
for
(j=0; toupper(s[j]) == toupper(key[j]) && key[j]; j++);
54
if
(key[j])
55
continue
;
56
if
(s[j] && !(flags &
AV_DICT_IGNORE_SUFFIX
))
57
continue
;
58
return
&m->
elems
[i];
59
}
60
return
NULL
;
61
}
62
63
int
av_dict_set
(
AVDictionary
**pm,
const
char
*key,
const
char
*
value
,
int
flags
)
64
{
65
AVDictionary
*
m
= *pm;
66
AVDictionaryEntry
*
tag
=
av_dict_get
(m, key,
NULL
, flags);
67
char
*oldval =
NULL
;
68
69
if
(!m)
70
m = *pm =
av_mallocz
(
sizeof
(*m));
71
72
if
(tag) {
73
if
(flags &
AV_DICT_DONT_OVERWRITE
)
74
return
0;
75
if
(flags &
AV_DICT_APPEND
)
76
oldval = tag->
value
;
77
else
78
av_free
(tag->
value
);
79
av_free
(tag->
key
);
80
*tag = m->
elems
[--m->
count
];
81
}
else
{
82
AVDictionaryEntry
*tmp =
av_realloc
(m->
elems
, (m->
count
+1) *
sizeof
(*m->
elems
));
83
if
(tmp) {
84
m->
elems
= tmp;
85
}
else
86
return
AVERROR
(ENOMEM);
87
}
88
if
(value) {
89
if
(flags &
AV_DICT_DONT_STRDUP_KEY
) {
90
m->
elems
[m->
count
].
key
= (
char
*)(intptr_t)key;
91
}
else
92
m->
elems
[m->
count
].
key
=
av_strdup
(key );
93
if
(flags &
AV_DICT_DONT_STRDUP_VAL
) {
94
m->
elems
[m->
count
].
value
= (
char
*)(intptr_t)
value
;
95
}
else
if
(oldval && flags &
AV_DICT_APPEND
) {
96
int
len
= strlen(oldval) + strlen(value) + 1;
97
if
(!(oldval =
av_realloc
(oldval, len)))
98
return
AVERROR
(ENOMEM);
99
av_strlcat
(oldval, value, len);
100
m->
elems
[m->
count
].
value
= oldval;
101
}
else
102
m->
elems
[m->
count
].
value
=
av_strdup
(value);
103
m->
count
++;
104
}
105
if
(!m->
count
) {
106
av_free
(m->
elems
);
107
av_freep
(pm);
108
}
109
110
return
0;
111
}
112
113
void
av_dict_free
(
AVDictionary
**pm)
114
{
115
AVDictionary
*
m
= *pm;
116
117
if
(m) {
118
while
(m->
count
--) {
119
av_free
(m->
elems
[m->
count
].
key
);
120
av_free
(m->
elems
[m->
count
].
value
);
121
}
122
av_free
(m->
elems
);
123
}
124
av_freep
(pm);
125
}
126
127
void
av_dict_copy
(
AVDictionary
**
dst
,
AVDictionary
*src,
int
flags
)
128
{
129
AVDictionaryEntry
*
t
=
NULL
;
130
131
while
((t =
av_dict_get
(src,
""
, t,
AV_DICT_IGNORE_SUFFIX
)))
132
av_dict_set
(dst, t->
key
, t->
value
, flags);
133
}
Generated on Sat May 25 2013 03:58:50 for FFmpeg by
1.8.2