78acb9e7 |
/* |
406792e7 |
* Copyright (c) 2001 Fabrice Bellard |
78acb9e7 |
* Copyright (c) 2002-2004 Michael Niedermayer <michaelni@gmx.at>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/** |
ba87f080 |
* @file |
78acb9e7 |
* Options definition for AVCodecContext.
*/
#include "avcodec.h" |
84626b36 |
#include "internal.h"
#include "libavutil/avassert.h" |
1d9c2dc8 |
#include "libavutil/mem.h" |
6ed04040 |
#include "libavutil/opt.h" |
78acb9e7 |
#include <float.h> /* FLT_MIN, FLT_MAX */ |
1d9c2dc8 |
#include <string.h> |
78acb9e7 |
|
56266971 |
#include "options_table.h"
|
78acb9e7 |
static const char* context_to_name(void* ptr) {
AVCodecContext *avc= ptr;
if(avc && avc->codec && avc->codec->name)
return avc->codec->name;
else
return "NULL";
}
|
641c7afe |
static void *codec_child_next(void *obj, void *prev) |
78440c00 |
{
AVCodecContext *s = obj; |
641c7afe |
if (!prev && s->codec && s->codec->priv_class && s->priv_data)
return s->priv_data;
return NULL;
}
static const AVClass *codec_child_class_next(const AVClass *prev)
{
AVCodec *c = NULL; |
78440c00 |
|
641c7afe |
/* find the codec that corresponds to prev */
while (prev && (c = av_codec_next(c)))
if (c->priv_class == prev)
break; |
78440c00 |
|
641c7afe |
/* find next codec with priv options */
while (c = av_codec_next(c))
if (c->priv_class)
return c->priv_class; |
78440c00 |
return NULL;
}
|
938e4470 |
static AVClassCategory get_category(void *ptr) |
6fb7d03d |
{ |
938e4470 |
AVCodecContext* avctx = ptr; |
6fb7d03d |
if(avctx->codec && avctx->codec->decode) return AV_CLASS_CATEGORY_DECODER;
else return AV_CLASS_CATEGORY_ENCODER;
}
|
0ba1e197 |
static const AVClass av_codec_context_class = {
.class_name = "AVCodecContext",
.item_name = context_to_name,
.option = options,
.version = LIBAVUTIL_VERSION_INT, |
56266971 |
.log_level_offset_offset = offsetof(AVCodecContext, log_level_offset), |
641c7afe |
.child_next = codec_child_next,
.child_class_next = codec_child_class_next, |
a5c7525b |
.category = AV_CLASS_CATEGORY_ENCODER, |
938e4470 |
.get_category = get_category, |
0ba1e197 |
}; |
78acb9e7 |
|
f0eeff70 |
#if FF_API_ALLOC_CONTEXT |
72415b2a |
void avcodec_get_context_defaults2(AVCodecContext *s, enum AVMediaType codec_type){ |
d0492578 |
AVCodec c= {0};
c.type= codec_type;
avcodec_get_context_defaults3(s, &c); |
f0eeff70 |
}
#endif
|
0a0f19b5 |
int avcodec_get_context_defaults3(AVCodecContext *s, const AVCodec *codec)
{ |
78acb9e7 |
int flags=0;
memset(s, 0, sizeof(AVCodecContext));
|
f0eeff70 |
s->av_class = &av_codec_context_class; |
78acb9e7 |
|
f0eeff70 |
s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN; |
d0492578 |
if(s->codec_type == AVMEDIA_TYPE_AUDIO) |
78acb9e7 |
flags= AV_OPT_FLAG_AUDIO_PARAM; |
d0492578 |
else if(s->codec_type == AVMEDIA_TYPE_VIDEO) |
78acb9e7 |
flags= AV_OPT_FLAG_VIDEO_PARAM; |
d0492578 |
else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE) |
78acb9e7 |
flags= AV_OPT_FLAG_SUBTITLE_PARAM;
av_opt_set_defaults2(s, flags, flags);
|
f0eeff70 |
s->time_base = (AVRational){0,1};
s->get_buffer = avcodec_default_get_buffer;
s->release_buffer = avcodec_default_release_buffer;
s->get_format = avcodec_default_get_format;
s->execute = avcodec_default_execute;
s->execute2 = avcodec_default_execute2;
s->sample_aspect_ratio = (AVRational){0,1}; |
716d413c |
s->pix_fmt = AV_PIX_FMT_NONE; |
f0eeff70 |
s->sample_fmt = AV_SAMPLE_FMT_NONE; |
b1ca5634 |
s->timecode_frame_start = -1; |
78acb9e7 |
|
f0eeff70 |
s->reget_buffer = avcodec_default_reget_buffer;
s->reordered_opaque = AV_NOPTS_VALUE; |
dc51a72b |
if(codec && codec->priv_data_size){
if(!s->priv_data){
s->priv_data= av_mallocz(codec->priv_data_size);
if (!s->priv_data) {
return AVERROR(ENOMEM);
}
}
if(codec->priv_class){ |
fa9aeb82 |
*(const AVClass**)s->priv_data = codec->priv_class; |
dc51a72b |
av_opt_set_defaults(s->priv_data);
}
} |
84626b36 |
if (codec && codec->defaults) {
int ret; |
fa9aeb82 |
const AVCodecDefault *d = codec->defaults; |
84626b36 |
while (d->key) { |
513b6919 |
ret = av_opt_set(s, d->key, d->value, 0); |
84626b36 |
av_assert0(ret >= 0);
d++;
}
} |
dc51a72b |
return 0;
}
|
0a0f19b5 |
AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
{ |
dc51a72b |
AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
if(avctx==NULL) return NULL;
if(avcodec_get_context_defaults3(avctx, codec) < 0){
av_free(avctx);
return NULL;
}
return avctx;
}
|
71a861cf |
#if FF_API_ALLOC_CONTEXT |
72415b2a |
AVCodecContext *avcodec_alloc_context2(enum AVMediaType codec_type){ |
78acb9e7 |
AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext));
if(avctx==NULL) return NULL;
avcodec_get_context_defaults2(avctx, codec_type);
return avctx;
}
void avcodec_get_context_defaults(AVCodecContext *s){ |
72415b2a |
avcodec_get_context_defaults2(s, AVMEDIA_TYPE_UNKNOWN); |
78acb9e7 |
}
AVCodecContext *avcodec_alloc_context(void){ |
72415b2a |
return avcodec_alloc_context2(AVMEDIA_TYPE_UNKNOWN); |
78acb9e7 |
} |
71a861cf |
#endif |
78acb9e7 |
|
d1032180 |
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
{ |
af08d9ae |
if (avcodec_is_open(dest)) { // check that the dest context is uninitialized |
d1032180 |
av_log(dest, AV_LOG_ERROR,
"Tried to copy AVCodecContext %p into already-initialized %p\n",
src, dest);
return AVERROR(EINVAL);
}
memcpy(dest, src, sizeof(*dest));
/* set values specific to opened codecs back to their default state */
dest->priv_data = NULL;
dest->codec = NULL;
dest->slice_offset = NULL;
dest->hwaccel = NULL;
dest->thread_opaque = NULL; |
f3a29b75 |
dest->internal = NULL; |
d1032180 |
/* reallocate values that should be allocated separately */
dest->rc_eq = NULL;
dest->extradata = NULL;
dest->intra_matrix = NULL;
dest->inter_matrix = NULL;
dest->rc_override = NULL;
if (src->rc_eq) {
dest->rc_eq = av_strdup(src->rc_eq);
if (!dest->rc_eq)
return AVERROR(ENOMEM);
}
#define alloc_and_copy_or_fail(obj, size, pad) \
if (src->obj && size > 0) { \
dest->obj = av_malloc(size + pad); \
if (!dest->obj) \
goto fail; \
memcpy(dest->obj, src->obj, size); \
if (pad) \
memset(((uint8_t *) dest->obj) + size, 0, pad); \
}
alloc_and_copy_or_fail(extradata, src->extradata_size,
FF_INPUT_BUFFER_PADDING_SIZE);
alloc_and_copy_or_fail(intra_matrix, 64 * sizeof(int16_t), 0);
alloc_and_copy_or_fail(inter_matrix, 64 * sizeof(int16_t), 0);
alloc_and_copy_or_fail(rc_override, src->rc_override_count * sizeof(*src->rc_override), 0);
#undef alloc_and_copy_or_fail
return 0;
fail:
av_freep(&dest->rc_override);
av_freep(&dest->intra_matrix);
av_freep(&dest->inter_matrix);
av_freep(&dest->extradata);
av_freep(&dest->rc_eq);
return AVERROR(ENOMEM);
} |
fb4ca26b |
const AVClass *avcodec_get_class(void)
{
return &av_codec_context_class;
} |
fef411ef |
#define FOFFSET(x) offsetof(AVFrame,x)
static const AVOption frame_options[]={ |
15a0fb58 |
{"best_effort_timestamp", "", FOFFSET(best_effort_timestamp), AV_OPT_TYPE_INT64, {.i64 = AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, 0},
{"pkt_pos", "", FOFFSET(pkt_pos), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0}, |
96d815fc |
{"pkt_size", "", FOFFSET(pkt_size), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0}, |
fef411ef |
{"sample_aspect_ratio", "", FOFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0}, |
d46c1c72 |
{"width", "", FOFFSET(width), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"height", "", FOFFSET(height), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"format", "", FOFFSET(format), AV_OPT_TYPE_INT, {.i64 = -1 }, 0, INT_MAX, 0}, |
15a0fb58 |
{"channel_layout", "", FOFFSET(channel_layout), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, 0}, |
d46c1c72 |
{"sample_rate", "", FOFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, |
fef411ef |
{NULL},
};
static const AVClass av_frame_class = {
.class_name = "AVFrame",
.item_name = NULL,
.option = frame_options,
.version = LIBAVUTIL_VERSION_INT,
};
const AVClass *avcodec_get_frame_class(void)
{
return &av_frame_class;
} |
1f46b50a |
#define SROFFSET(x) offsetof(AVSubtitleRect,x)
static const AVOption subtitle_rect_options[]={ |
d46c1c72 |
{"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0},
{"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, |
1885ffb0 |
{"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, "flags"},
{"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0}, |
1f46b50a |
{NULL},
};
static const AVClass av_subtitle_rect_class = {
.class_name = "AVSubtitleRect",
.item_name = NULL,
.option = subtitle_rect_options,
.version = LIBAVUTIL_VERSION_INT,
};
const AVClass *avcodec_get_subtitle_rect_class(void)
{
return &av_subtitle_rect_class;
} |