2 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
4 * This file is part of FFmpeg.
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.
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.
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
21 #include "avio_internal.h"
23 #include "libavutil/opt.h"
27 * Options definition for AVFormatContext.
30 #include "options_table.h"
32 static const char* format_to_name(void* ptr
)
34 AVFormatContext
* fc
= (AVFormatContext
*) ptr
;
35 if(fc
->iformat
) return fc
->iformat
->name
;
36 else if(fc
->oformat
) return fc
->oformat
->name
;
40 static void *format_child_next(void *obj
, void *prev
)
42 AVFormatContext
*s
= obj
;
43 if (!prev
&& s
->priv_data
&&
44 ((s
->iformat
&& s
->iformat
->priv_class
) ||
45 s
->oformat
&& s
->oformat
->priv_class
))
47 if (s
->pb
&& s
->pb
->av_class
&& prev
!= s
->pb
)
52 static const AVClass
*format_child_class_next(const AVClass
*prev
)
54 AVInputFormat
*ifmt
= NULL
;
55 AVOutputFormat
*ofmt
= NULL
;
58 return &ffio_url_class
;
60 while ((ifmt
= av_iformat_next(ifmt
)))
61 if (ifmt
->priv_class
== prev
)
65 while ((ofmt
= av_oformat_next(ofmt
)))
66 if (ofmt
->priv_class
== prev
)
69 while (ifmt
= av_iformat_next(ifmt
))
71 return ifmt
->priv_class
;
73 while (ofmt
= av_oformat_next(ofmt
))
75 return ofmt
->priv_class
;
80 static AVClassCategory
get_category(void *ptr
)
82 AVFormatContext
* s
= ptr
;
83 if(s
->iformat
) return AV_CLASS_CATEGORY_DEMUXER
;
84 else return AV_CLASS_CATEGORY_MUXER
;
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
,
98 static void avformat_get_context_defaults(AVFormatContext
*s
)
100 memset(s
, 0, sizeof(AVFormatContext
));
102 s
->av_class
= &av_format_context_class
;
104 av_opt_set_defaults(s
);
107 AVFormatContext
*avformat_alloc_context(void)
110 ic
= av_malloc(sizeof(AVFormatContext
));
112 avformat_get_context_defaults(ic
);
113 ic
->offset
= AV_NOPTS_VALUE
;
115 ic
->internal
= av_mallocz(sizeof(*ic
->internal
));
117 avformat_free_context(ic
);
124 enum AVDurationEstimationMethod
av_fmt_ctx_get_duration_estimation_method(const AVFormatContext
* ctx
)
126 return ctx
->duration_estimation_method
;
129 const AVClass
*avformat_get_class(void)
131 return &av_format_context_class
;