Libav
Main Page
Related Pages
Modules
Data Structures
Files
Examples
File List
Globals
libavcodec
options.c
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2001 Fabrice Bellard
3
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
4
*
5
* This file is part of Libav.
6
*
7
* Libav is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* Libav is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with Libav; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
27
#include "
avcodec.h
"
28
#include "
internal.h
"
29
#include "
libavutil/avassert.h
"
30
#include "
libavutil/mem.h
"
31
#include "
libavutil/opt.h
"
32
#include <float.h>
/* FLT_MIN, FLT_MAX */
33
#include <string.h>
34
35
#include "
options_table.h
"
36
37
static
const
char
*
context_to_name
(
void
* ptr) {
38
AVCodecContext
*avc= ptr;
39
40
if
(avc && avc->
codec
&& avc->
codec
->
name
)
41
return
avc->
codec
->
name
;
42
else
43
return
"NULL"
;
44
}
45
46
static
void
*
codec_child_next
(
void
*obj,
void
*prev)
47
{
48
AVCodecContext
*s = obj;
49
if
(!prev && s->
codec
&& s->
codec
->
priv_class
&& s->
priv_data
)
50
return
s->
priv_data
;
51
return
NULL
;
52
}
53
54
static
const
AVClass
*
codec_child_class_next
(
const
AVClass
*prev)
55
{
56
AVCodec
*c =
NULL
;
57
58
/* find the codec that corresponds to prev */
59
while
(prev && (c =
av_codec_next
(c)))
60
if
(c->
priv_class
== prev)
61
break
;
62
63
/* find next codec with priv options */
64
while
(c =
av_codec_next
(c))
65
if
(c->
priv_class
)
66
return
c->
priv_class
;
67
return
NULL
;
68
}
69
70
static
const
AVClass
av_codec_context_class
= {
71
.
class_name
=
"AVCodecContext"
,
72
.item_name =
context_to_name
,
73
.option =
avcodec_options
,
74
.version =
LIBAVUTIL_VERSION_INT
,
75
.log_level_offset_offset = offsetof(
AVCodecContext
, log_level_offset),
76
.child_next =
codec_child_next
,
77
.child_class_next =
codec_child_class_next
,
78
};
79
80
int
avcodec_get_context_defaults3
(
AVCodecContext
*s,
const
AVCodec
*codec)
81
{
82
memset(s, 0,
sizeof
(
AVCodecContext
));
83
84
s->
av_class
= &
av_codec_context_class
;
85
86
s->
codec_type
= codec ? codec->
type
:
AVMEDIA_TYPE_UNKNOWN
;
87
s->
codec
= codec;
88
av_opt_set_defaults
(s);
89
90
s->
time_base
= (
AVRational
){0,1};
91
s->
get_buffer2
=
avcodec_default_get_buffer2
;
92
s->
get_format
=
avcodec_default_get_format
;
93
s->
execute
=
avcodec_default_execute
;
94
s->
execute2
=
avcodec_default_execute2
;
95
s->
sample_aspect_ratio
= (
AVRational
){0,1};
96
s->
pix_fmt
=
AV_PIX_FMT_NONE
;
97
s->
sample_fmt
=
AV_SAMPLE_FMT_NONE
;
98
99
s->
reordered_opaque
=
AV_NOPTS_VALUE
;
100
if
(codec && codec->
priv_data_size
){
101
if
(!s->
priv_data
){
102
s->
priv_data
=
av_mallocz
(codec->
priv_data_size
);
103
if
(!s->
priv_data
) {
104
return
AVERROR
(ENOMEM);
105
}
106
}
107
if
(codec->
priv_class
){
108
*(
const
AVClass
**)s->
priv_data
= codec->
priv_class
;
109
av_opt_set_defaults
(s->
priv_data
);
110
}
111
}
112
if
(codec && codec->
defaults
) {
113
int
ret;
114
const
AVCodecDefault
*d = codec->
defaults
;
115
while
(d->
key
) {
116
ret =
av_opt_set
(s, d->
key
, d->
value
, 0);
117
av_assert0
(ret >= 0);
118
d++;
119
}
120
}
121
return
0;
122
}
123
124
AVCodecContext
*
avcodec_alloc_context3
(
const
AVCodec
*codec)
125
{
126
AVCodecContext
*avctx=
av_malloc
(
sizeof
(
AVCodecContext
));
127
128
if
(avctx==
NULL
)
return
NULL
;
129
130
if
(
avcodec_get_context_defaults3
(avctx, codec) < 0){
131
av_free
(avctx);
132
return
NULL
;
133
}
134
135
return
avctx;
136
}
137
138
int
avcodec_copy_context
(
AVCodecContext
*dest,
const
AVCodecContext
*src)
139
{
140
if
(
avcodec_is_open
(dest)) {
// check that the dest context is uninitialized
141
av_log
(dest,
AV_LOG_ERROR
,
142
"Tried to copy AVCodecContext %p into already-initialized %p\n"
,
143
src, dest);
144
return
AVERROR
(EINVAL);
145
}
146
memcpy(dest, src,
sizeof
(*dest));
147
148
/* set values specific to opened codecs back to their default state */
149
dest->
priv_data
=
NULL
;
150
dest->
codec
=
NULL
;
151
dest->
slice_offset
=
NULL
;
152
dest->
hwaccel
=
NULL
;
153
dest->
internal
=
NULL
;
154
155
/* reallocate values that should be allocated separately */
156
dest->
rc_eq
=
NULL
;
157
dest->
extradata
=
NULL
;
158
dest->
intra_matrix
=
NULL
;
159
dest->
inter_matrix
=
NULL
;
160
dest->
rc_override
=
NULL
;
161
if
(src->
rc_eq
) {
162
dest->
rc_eq
=
av_strdup
(src->
rc_eq
);
163
if
(!dest->
rc_eq
)
164
return
AVERROR
(ENOMEM);
165
}
166
167
#define alloc_and_copy_or_fail(obj, size, pad) \
168
if (src->obj && size > 0) { \
169
dest->obj = av_malloc(size + pad); \
170
if (!dest->obj) \
171
goto fail; \
172
memcpy(dest->obj, src->obj, size); \
173
if (pad) \
174
memset(((uint8_t *) dest->obj) + size, 0, pad); \
175
}
176
alloc_and_copy_or_fail
(extradata, src->
extradata_size
,
177
FF_INPUT_BUFFER_PADDING_SIZE
);
178
alloc_and_copy_or_fail
(intra_matrix, 64 *
sizeof
(int16_t), 0);
179
alloc_and_copy_or_fail
(inter_matrix, 64 *
sizeof
(int16_t), 0);
180
alloc_and_copy_or_fail
(rc_override, src->
rc_override_count
*
sizeof
(*src->
rc_override
), 0);
181
#undef alloc_and_copy_or_fail
182
183
return
0;
184
185
fail:
186
av_freep
(&dest->
rc_override
);
187
av_freep
(&dest->
intra_matrix
);
188
av_freep
(&dest->
inter_matrix
);
189
av_freep
(&dest->
extradata
);
190
av_freep
(&dest->
rc_eq
);
191
return
AVERROR
(ENOMEM);
192
}
193
194
const
AVClass
*
avcodec_get_class
(
void
)
195
{
196
return
&
av_codec_context_class
;
197
}
Generated on Sun Jun 1 2014 17:55:32 for Libav by
1.8.1.2