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 "config_components.h" 28 29#include "avcodec.h" 30#include "codec_internal.h" 31#include "libavutil/avassert.h" 32#include "libavutil/internal.h" 33#include "libavutil/mem.h" 34#include "libavutil/opt.h" 35#include <string.h> 36 37FF_DISABLE_DEPRECATION_WARNINGS 38#include "options_table.h" 39FF_ENABLE_DEPRECATION_WARNINGS 40 41static const char* context_to_name(void* ptr) { 42 AVCodecContext *avc= ptr; 43 44 if (avc && avc->codec) 45 return avc->codec->name; 46 else 47 return "NULL"; 48} 49 50static void *codec_child_next(void *obj, void *prev) 51{ 52 AVCodecContext *s = obj; 53 if (!prev && s->codec && s->codec->priv_class && s->priv_data) 54 return s->priv_data; 55 return NULL; 56} 57 58static const AVClass *codec_child_class_iterate(void **iter) 59{ 60 const AVCodec *c; 61 /* find next codec with priv options */ 62 while (c = av_codec_iterate(iter)) 63 if (c->priv_class) 64 return c->priv_class; 65 return NULL; 66} 67 68static AVClassCategory get_category(void *ptr) 69{ 70 AVCodecContext* avctx = ptr; 71 if (avctx->codec && av_codec_is_decoder(avctx->codec)) 72 return AV_CLASS_CATEGORY_DECODER; 73 else 74 return AV_CLASS_CATEGORY_ENCODER; 75} 76 77static const AVClass av_codec_context_class = { 78 .class_name = "AVCodecContext", 79 .item_name = context_to_name, 80 .option = avcodec_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_iterate = codec_child_class_iterate, 85 .category = AV_CLASS_CATEGORY_ENCODER, 86 .get_category = get_category, 87}; 88 89static int init_context_defaults(AVCodecContext *s, const AVCodec *codec) 90{ 91 const FFCodec *const codec2 = ffcodec(codec); 92 int flags=0; 93 memset(s, 0, sizeof(AVCodecContext)); 94 95 s->av_class = &av_codec_context_class; 96 97 s->codec_type = codec ? codec->type : AVMEDIA_TYPE_UNKNOWN; 98 if (codec) { 99 s->codec = codec; 100 s->codec_id = codec->id; 101 } 102 103 if(s->codec_type == AVMEDIA_TYPE_AUDIO) 104 flags= AV_OPT_FLAG_AUDIO_PARAM; 105 else if(s->codec_type == AVMEDIA_TYPE_VIDEO) 106 flags= AV_OPT_FLAG_VIDEO_PARAM; 107 else if(s->codec_type == AVMEDIA_TYPE_SUBTITLE) 108 flags= AV_OPT_FLAG_SUBTITLE_PARAM; 109 av_opt_set_defaults2(s, flags, flags); 110 111 av_channel_layout_uninit(&s->ch_layout); 112 113 s->time_base = (AVRational){0,1}; 114 s->framerate = (AVRational){ 0, 1 }; 115 s->pkt_timebase = (AVRational){ 0, 1 }; 116 s->get_buffer2 = avcodec_default_get_buffer2; 117 s->get_format = avcodec_default_get_format; 118 s->get_encode_buffer = avcodec_default_get_encode_buffer; 119 s->execute = avcodec_default_execute; 120 s->execute2 = avcodec_default_execute2; 121 s->sample_aspect_ratio = (AVRational){0,1}; 122 s->ch_layout.order = AV_CHANNEL_ORDER_UNSPEC; 123 s->pix_fmt = AV_PIX_FMT_NONE; 124 s->sw_pix_fmt = AV_PIX_FMT_NONE; 125 s->sample_fmt = AV_SAMPLE_FMT_NONE; 126 127 s->reordered_opaque = AV_NOPTS_VALUE; 128 if(codec && codec2->priv_data_size){ 129 s->priv_data = av_mallocz(codec2->priv_data_size); 130 if (!s->priv_data) 131 return AVERROR(ENOMEM); 132 if(codec->priv_class){ 133 *(const AVClass**)s->priv_data = codec->priv_class; 134 av_opt_set_defaults(s->priv_data); 135 } 136 } 137 if (codec && codec2->defaults) { 138 int ret; 139 const FFCodecDefault *d = codec2->defaults; 140 while (d->key) { 141 ret = av_opt_set(s, d->key, d->value, 0); 142 av_assert0(ret >= 0); 143 d++; 144 } 145 } 146 return 0; 147} 148 149AVCodecContext *avcodec_alloc_context3(const AVCodec *codec) 150{ 151 AVCodecContext *avctx= av_malloc(sizeof(AVCodecContext)); 152 153 if (!avctx) 154 return NULL; 155 156 if (init_context_defaults(avctx, codec) < 0) { 157 av_free(avctx); 158 return NULL; 159 } 160 161 return avctx; 162} 163 164void avcodec_free_context(AVCodecContext **pavctx) 165{ 166 AVCodecContext *avctx = *pavctx; 167 168 if (!avctx) 169 return; 170 171 avcodec_close(avctx); 172 173 av_freep(&avctx->extradata); 174 av_freep(&avctx->subtitle_header); 175 av_freep(&avctx->intra_matrix); 176 av_freep(&avctx->inter_matrix); 177 av_freep(&avctx->rc_override); 178 av_channel_layout_uninit(&avctx->ch_layout); 179 180 av_freep(pavctx); 181} 182 183const AVClass *avcodec_get_class(void) 184{ 185 return &av_codec_context_class; 186} 187 188#if FF_API_GET_FRAME_CLASS 189FF_DISABLE_DEPRECATION_WARNINGS 190#define FOFFSET(x) offsetof(AVFrame,x) 191 192static const AVOption frame_options[]={ 193{"best_effort_timestamp", "", FOFFSET(best_effort_timestamp), AV_OPT_TYPE_INT64, {.i64 = AV_NOPTS_VALUE }, INT64_MIN, INT64_MAX, 0}, 194{"pkt_pos", "", FOFFSET(pkt_pos), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0}, 195{"pkt_size", "", FOFFSET(pkt_size), AV_OPT_TYPE_INT64, {.i64 = -1 }, INT64_MIN, INT64_MAX, 0}, 196{"sample_aspect_ratio", "", FOFFSET(sample_aspect_ratio), AV_OPT_TYPE_RATIONAL, {.dbl = 0 }, 0, INT_MAX, 0}, 197{"width", "", FOFFSET(width), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 198{"height", "", FOFFSET(height), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 199{"format", "", FOFFSET(format), AV_OPT_TYPE_INT, {.i64 = -1 }, 0, INT_MAX, 0}, 200#if FF_API_OLD_CHANNEL_LAYOUT 201{"channel_layout", "", FOFFSET(channel_layout), AV_OPT_TYPE_INT64, {.i64 = 0 }, 0, INT64_MAX, 0}, 202#endif 203{"sample_rate", "", FOFFSET(sample_rate), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 204{NULL}, 205}; 206 207static const AVClass av_frame_class = { 208 .class_name = "AVFrame", 209 .item_name = NULL, 210 .option = frame_options, 211 .version = LIBAVUTIL_VERSION_INT, 212}; 213 214const AVClass *avcodec_get_frame_class(void) 215{ 216 return &av_frame_class; 217} 218FF_ENABLE_DEPRECATION_WARNINGS 219#endif 220 221#define SROFFSET(x) offsetof(AVSubtitleRect,x) 222 223static const AVOption subtitle_rect_options[]={ 224{"x", "", SROFFSET(x), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 225{"y", "", SROFFSET(y), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 226{"w", "", SROFFSET(w), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 227{"h", "", SROFFSET(h), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 228{"type", "", SROFFSET(type), AV_OPT_TYPE_INT, {.i64 = 0 }, 0, INT_MAX, 0}, 229{"flags", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0, "flags"}, 230{"forced", "", SROFFSET(flags), AV_OPT_TYPE_FLAGS, {.i64 = 0}, 0, 1, 0}, 231{NULL}, 232}; 233 234static const AVClass av_subtitle_rect_class = { 235 .class_name = "AVSubtitleRect", 236 .item_name = NULL, 237 .option = subtitle_rect_options, 238 .version = LIBAVUTIL_VERSION_INT, 239}; 240 241const AVClass *avcodec_get_subtitle_rect_class(void) 242{ 243 return &av_subtitle_rect_class; 244} 245