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 FFmpeg.
6  *
7  * FFmpeg 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  * FFmpeg 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 FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * Options definition for AVCodecContext.
25  */
26 
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 AVClassCategory get_category(void *ptr)
71 {
72  AVCodecContext* avctx = ptr;
73  if(avctx->codec && avctx->codec->decode) return AV_CLASS_CATEGORY_DECODER;
74  else return AV_CLASS_CATEGORY_ENCODER;
75 }
76 
78  .class_name = "AVCodecContext",
79  .item_name = context_to_name,
80  .option = options,
81  .version = LIBAVUTIL_VERSION_INT,
82  .log_level_offset_offset = offsetof(AVCodecContext, log_level_offset),
83  .child_next = codec_child_next,
84  .child_class_next = codec_child_class_next,
86  .get_category = get_category,
87 };
88 
89 #if FF_API_ALLOC_CONTEXT
90 void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType codec_type){
91  AVCodec c= {0};
92  c.type= codec_type;
94 }
95 #endif
96 
98 {
99  int flags=0;
100  memset(s, 0, sizeof(AVCodecContext));
101 
103 
104  s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN;
107  else if(s->codec_type == AVMEDIA_TYPE_VIDEO)
109  else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE)
111  av_opt_set_defaults2(s, flags, flags);
112 
113  s->time_base = (AVRational){0,1};
118  s->sample_aspect_ratio = (AVRational){0,1};
121  s->timecode_frame_start = -1;
122 
124  if(codec && codec->priv_data_size){
125  if(!s->priv_data){
126  s->priv_data= av_mallocz(codec->priv_data_size);
127  if (!s->priv_data) {
128  return AVERROR(ENOMEM);
129  }
130  }
131  if(codec->priv_class){
132  *(const AVClass**)s->priv_data = codec->priv_class;
134  }
135  }
136  if (codec && codec->defaults) {
137  int ret;
138  const AVCodecDefault *d = codec->defaults;
139  while (d->key) {
140  ret = av_opt_set(s, d->key, d->value, 0);
141  av_assert0(ret >= 0);
142  d++;
143  }
144  }
145  return 0;
146 }
147 
149 {
150  AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
151 
152  if(avctx==NULL) return NULL;
153 
154  if(avcodec_get_context_defaults3(avctx, codec) < 0){
155  av_free(avctx);
156  return NULL;
157  }
158 
159  return avctx;
160 }
161 
162 #if FF_API_ALLOC_CONTEXT
163 AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){
164  AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
165 
166  if(avctx==NULL) return NULL;
167 
168  avcodec_get_context_defaults2(avctx, codec_type);
169 
170  return avctx;
171 }
172 
173 void avcodec_get_context_defaults(AVCodecContext *s){
174  avcodec_get_context_defaults2(s, AVMEDIA_TYPE_UNKNOWN);
175 }
176 
177 AVCodecContext *avcodec_alloc_context(void){
178  return avcodec_alloc_context2(AVMEDIA_TYPE_UNKNOWN);
179 }
180 #endif
181 
183 {
184  if (avcodec_is_open(dest)) { // check that the dest context is uninitialized
185  av_log(dest, AV_LOG_ERROR,
186  "Tried to copy AVCodecContext %p into already-initialized %p\n",
187  src, dest);
188  return AVERROR(EINVAL);
189  }
190  memcpy(dest, src, sizeof(*dest));
191 
192  /* set values specific to opened codecs back to their default state */
193  dest->priv_data = NULL;
194  dest->codec = NULL;
195  dest->slice_offset = NULL;
196  dest->hwaccel = NULL;
197  dest->thread_opaque = NULL;
198  dest->internal = NULL;
199 
200  /* reallocate values that should be allocated separately */
201  dest->rc_eq = NULL;
202  dest->extradata = NULL;
203  dest->intra_matrix = NULL;
204  dest->inter_matrix = NULL;
205  dest->rc_override = NULL;
206  if (src->rc_eq) {
207  dest->rc_eq = av_strdup(src->rc_eq);
208  if (!dest->rc_eq)
209  return AVERROR(ENOMEM);
210  }
211 
212 #define alloc_and_copy_or_fail(obj, size, pad) \
213  if (src->obj && size > 0) { \
214  dest->obj = av_malloc(size + pad); \
215  if (!dest->obj) \
216  goto fail; \
217  memcpy(dest->obj, src->obj, size); \
218  if (pad) \
219  memset(((uint8_t *) dest->obj) + size, 0, pad); \
220  }
221  alloc_and_copy_or_fail(extradata, src->extradata_size,
223  alloc_and_copy_or_fail(intra_matrix, 64 * sizeof(int16_t), 0);
224  alloc_and_copy_or_fail(inter_matrix, 64 * sizeof(int16_t), 0);
225  alloc_and_copy_or_fail(rc_override, src->rc_override_count * sizeof(*src->rc_override), 0);
226 #undef alloc_and_copy_or_fail
227 
228  return 0;
229 
230 fail:
231  av_freep(&dest->rc_override);
232  av_freep(&dest->intra_matrix);
233  av_freep(&dest->inter_matrix);
234  av_freep(&dest->extradata);
235  av_freep(&dest->rc_eq);
236  return AVERROR(ENOMEM);
237 }
238 
240 {
241  return &av_codec_context_class;
242 }
243 
244 #define FOFFSET(x) offsetof(AVFrame,x)
245 
246 static const AVOption frame_options[]={
247 {"best_effort_timestamp", "", FOFFSET(best_effort_timestamp), AV_OPT_TYPE_INT64, {.i64 = AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, 0},
248 {"pkt_pos", "", FOFFSET(pkt_pos), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
249 {"pkt_size", "", FOFFSET(pkt_size), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0},
250 {"sample_aspect_ratio", "", FOFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0},
251 {"width", "", FOFFSET(width), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
252 {"height", "", FOFFSET(height), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
253 {"format", "", FOFFSET(format), AV_OPT_TYPE_INT, {.i64 = -1 }, 0, INT_MAX, 0},
254 {"channel_layout", "", FOFFSET(channel_layout), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, 0},
255 {"sample_rate", "", FOFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
256 {NULL},
257 };
258 
259 static const AVClass av_frame_class = {
260  .class_name = "AVFrame",
261  .item_name = NULL,
262  .option = frame_options,
263  .version = LIBAVUTIL_VERSION_INT,
264 };
265 
267 {
268  return &av_frame_class;
269 }
270 
271 #define SROFFSET(x) offsetof(AVSubtitleRect,x)
272 
274 {"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
275 {"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
276 {"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
277 {"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
278 {"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
279 {"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, "flags"},
280 {"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0},
281 {NULL},
282 };
283 
285  .class_name = "AVSubtitleRect",
286  .item_name = NULL,
287  .option = subtitle_rect_options,
288  .version = LIBAVUTIL_VERSION_INT,
289 };
290 
292 {
293  return &av_subtitle_rect_class;
294 }
enum AVPixelFormat(* get_format)(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
callback to negotiate the pixelFormat
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const struct AVCodec * codec
const char * s
Definition: avisynth_c.h:668
int avcodec_default_execute2(AVCodecContext *c, int(*func)(AVCodecContext *c2, void *arg2, int, int), void *arg, int *ret, int count)
AVOption.
Definition: opt.h:251
#define AV_OPT_FLAG_SUBTITLE_PARAM
Definition: opt.h:286
memory handling functions
void av_opt_set_defaults(void *s)
Set the values of all AVOption fields to their default values.
Definition: opt.c:942
#define AV_OPT_FLAG_AUDIO_PARAM
Definition: opt.h:284
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
enum AVMediaType codec_type
Definition: rtp.c:36
enum AVPixelFormat pix_fmt
Pixel format, see AV_PIX_FMT_xxx.
enum AVMediaType type
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
Copy the settings of the source AVCodecContext into the destination AVCodecContext.
output residual component w
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
set threshold d
const AVClass * avcodec_get_class(void)
Get the AVClass for AVCodecContext.
static const AVClass av_codec_context_class
struct AVHWAccel * hwaccel
Hardware accelerator in use.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
enum AVPixelFormat avcodec_default_get_format(struct AVCodecContext *s, const enum AVPixelFormat *fmt)
enum AVSampleFormat sample_fmt
audio sample format
static const AVOption subtitle_rect_options[]
AVOptions.
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
const AVClass * av_class
information on struct for av_log
static const AVClass av_subtitle_rect_class
const AVClass * avcodec_get_frame_class(void)
Get the AVClass for AVFrame.
const OptionDef options[]
Definition: ffserver.c:4697
Discrete Time axis x
const AVCodecDefault * defaults
Private codec-specific defaults.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
AVCodec * av_codec_next(const AVCodec *c)
If c is NULL, returns the first registered codec, if c is non-NULL, returns the next registered codec...
int avcodec_is_open(AVCodecContext *s)
static void * codec_child_next(void *obj, void *prev)
simple assert() macros that are a bit more flexible than ISO C assert().
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
AVClassCategory category
Category used for visualization (like color) This is only set if the category is equal for all object...
Definition: log.h:113
const char * rc_eq
rate control equation
void * thread_opaque
thread opaque Can be used by execute() to store some per AVCodecContext stuff.
external API header
static const char * context_to_name(void *ptr)
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
struct AVRational AVRational
rational number numerator/denominator
int rc_override_count
ratecontrol override, see RcOverride
int64_t timecode_frame_start
GOP timecode frame start number.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
ret
Definition: avfilter.c:821
static const AVClass * codec_child_class_next(const AVClass *prev)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
const AVClass * avcodec_get_subtitle_rect_class(void)
Get the AVClass for AVSubtitleRect.
int64_t reordered_opaque
opaque 64bit number (generally a PTS) that will be reordered and output in AVFrame.reordered_opaque
Usually treated as AVMEDIA_TYPE_DATA.
Definition: avutil.h:142
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
RcOverride * rc_override
int(* execute2)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg, int jobnr, int threadnr), void *arg2, int *ret, int count)
The codec may call this to execute several independent things.
NULL
Definition: eval.c:55
static int width
Definition: tests/utils.c:158
sample_rate
dest
Definition: start.py:60
AVS_Value src
Definition: avisynth_c.h:523
int avcodec_default_get_buffer2(AVCodecContext *s, AVFrame *frame, int flags)
The default callback for AVCodecContext.get_buffer2().
#define SROFFSET(x)
enum AVMediaType codec_type
char * av_strdup(const char *s)
Duplicate the string s.
Definition: mem.c:220
#define AV_OPT_FLAG_VIDEO_PARAM
Definition: opt.h:285
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
uint16_t * intra_matrix
custom intra quantization matrix
BYTE int const BYTE int int int height
Definition: avisynth_c.h:713
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
int(* get_buffer2)(struct AVCodecContext *s, AVFrame *frame, int flags)
This callback is called at the beginning of each frame to get data buffer(s) for it.
AVMediaType
Definition: avutil.h:141
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define type
uint16_t * inter_matrix
custom inter quantization matrix
static int flags
Definition: cpu.c:23
const AVClass * priv_class
AVClass for the private context.
const uint8_t * key
const uint8_t * value
static const AVOption frame_options[]
int(* decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt)
common internal api header.
static double c[64]
static AVClassCategory get_category(void *ptr)
static const AVClass av_frame_class
int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec)
Set the fields of the given AVCodecContext to default values corresponding to the given codec (defaul...
function y
Definition: D.m:1
AVClassCategory
Definition: log.h:28
#define alloc_and_copy_or_fail(obj, size, pad)
struct AVCodecInternal * internal
Private context used for internal data.
int * slice_offset
slice offsets in the frame in bytes
int(* execute)(struct AVCodecContext *c, int(*func)(struct AVCodecContext *c2, void *arg), void *arg2, int *ret, int count, int size)
The codec may call this to execute several independent things.
void av_opt_set_defaults2(void *s, int mask, int flags)
Definition: opt.c:948
int av_opt_set(void *obj, const char *name, const char *val, int search_flags)
Definition: opt.c:252
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
#define FOFFSET(x)
int avcodec_default_execute(AVCodecContext *c, int(*func)(AVCodecContext *c2, void *arg2), void *arg, int *ret, int count, int size)