Commit | Line | Data |
---|---|---|
2ba45a60 DM |
1 | /* |
2 | * Copyright (c) 2000, 2001, 2002 Fabrice Bellard | |
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 | #include "avformat.h" | |
21 | #include "avio_internal.h" | |
22 | #include "internal.h" | |
23 | #include "libavutil/opt.h" | |
24 | ||
25 | /** | |
26 | * @file | |
27 | * Options definition for AVFormatContext. | |
28 | */ | |
29 | ||
30 | #include "options_table.h" | |
31 | ||
32 | static const char* format_to_name(void* ptr) | |
33 | { | |
34 | AVFormatContext* fc = (AVFormatContext*) ptr; | |
35 | if(fc->iformat) return fc->iformat->name; | |
36 | else if(fc->oformat) return fc->oformat->name; | |
37 | else return "NULL"; | |
38 | } | |
39 | ||
40 | static void *format_child_next(void *obj, void *prev) | |
41 | { | |
42 | AVFormatContext *s = obj; | |
43 | if (!prev && s->priv_data && | |
44 | ((s->iformat && s->iformat->priv_class) || | |
45 | s->oformat && s->oformat->priv_class)) | |
46 | return s->priv_data; | |
47 | if (s->pb && s->pb->av_class && prev != s->pb) | |
48 | return s->pb; | |
49 | return NULL; | |
50 | } | |
51 | ||
52 | static const AVClass *format_child_class_next(const AVClass *prev) | |
53 | { | |
54 | AVInputFormat *ifmt = NULL; | |
55 | AVOutputFormat *ofmt = NULL; | |
56 | ||
57 | if (!prev) | |
58 | return &ffio_url_class; | |
59 | ||
60 | while ((ifmt = av_iformat_next(ifmt))) | |
61 | if (ifmt->priv_class == prev) | |
62 | break; | |
63 | ||
64 | if (!ifmt) | |
65 | while ((ofmt = av_oformat_next(ofmt))) | |
66 | if (ofmt->priv_class == prev) | |
67 | break; | |
68 | if (!ofmt) | |
69 | while (ifmt = av_iformat_next(ifmt)) | |
70 | if (ifmt->priv_class) | |
71 | return ifmt->priv_class; | |
72 | ||
73 | while (ofmt = av_oformat_next(ofmt)) | |
74 | if (ofmt->priv_class) | |
75 | return ofmt->priv_class; | |
76 | ||
77 | return NULL; | |
78 | } | |
79 | ||
80 | static AVClassCategory get_category(void *ptr) | |
81 | { | |
82 | AVFormatContext* s = ptr; | |
83 | if(s->iformat) return AV_CLASS_CATEGORY_DEMUXER; | |
84 | else return AV_CLASS_CATEGORY_MUXER; | |
85 | } | |
86 | ||
87 | static const AVClass av_format_context_class = { | |
88 | .class_name = "AVFormatContext", | |
89 | .item_name = format_to_name, | |
90 | .option = avformat_options, | |
91 | .version = LIBAVUTIL_VERSION_INT, | |
92 | .child_next = format_child_next, | |
93 | .child_class_next = format_child_class_next, | |
94 | .category = AV_CLASS_CATEGORY_MUXER, | |
95 | .get_category = get_category, | |
96 | }; | |
97 | ||
98 | static void avformat_get_context_defaults(AVFormatContext *s) | |
99 | { | |
100 | memset(s, 0, sizeof(AVFormatContext)); | |
101 | ||
102 | s->av_class = &av_format_context_class; | |
103 | ||
104 | av_opt_set_defaults(s); | |
105 | } | |
106 | ||
107 | AVFormatContext *avformat_alloc_context(void) | |
108 | { | |
109 | AVFormatContext *ic; | |
110 | ic = av_malloc(sizeof(AVFormatContext)); | |
111 | if (!ic) return ic; | |
112 | avformat_get_context_defaults(ic); | |
f6fa7814 | 113 | ic->offset = AV_NOPTS_VALUE; |
2ba45a60 DM |
114 | |
115 | ic->internal = av_mallocz(sizeof(*ic->internal)); | |
116 | if (!ic->internal) { | |
117 | avformat_free_context(ic); | |
118 | return NULL; | |
119 | } | |
120 | ||
121 | return ic; | |
122 | } | |
123 | ||
124 | enum AVDurationEstimationMethod av_fmt_ctx_get_duration_estimation_method(const AVFormatContext* ctx) | |
125 | { | |
126 | return ctx->duration_estimation_method; | |
127 | } | |
128 | ||
129 | const AVClass *avformat_get_class(void) | |
130 | { | |
131 | return &av_format_context_class; | |
132 | } |