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"
24 #include "libavutil/internal.h"
25 #include "libavutil/opt.h"
29 * Options definition for AVFormatContext.
32 FF_DISABLE_DEPRECATION_WARNINGS
33 #include "options_table.h"
34 FF_ENABLE_DEPRECATION_WARNINGS
36 static const char* format_to_name(void* ptr
)
38 AVFormatContext
* fc
= (AVFormatContext
*) ptr
;
39 if(fc
->iformat
) return fc
->iformat
->name
;
40 else if(fc
->oformat
) return fc
->oformat
->name
;
44 static void *format_child_next(void *obj
, void *prev
)
46 AVFormatContext
*s
= obj
;
47 if (!prev
&& s
->priv_data
&&
48 ((s
->iformat
&& s
->iformat
->priv_class
) ||
49 s
->oformat
&& s
->oformat
->priv_class
))
51 if (s
->pb
&& s
->pb
->av_class
&& prev
!= s
->pb
)
56 static const AVClass
*format_child_class_next(const AVClass
*prev
)
58 AVInputFormat
*ifmt
= NULL
;
59 AVOutputFormat
*ofmt
= NULL
;
62 return &ff_avio_class
;
64 while ((ifmt
= av_iformat_next(ifmt
)))
65 if (ifmt
->priv_class
== prev
)
69 while ((ofmt
= av_oformat_next(ofmt
)))
70 if (ofmt
->priv_class
== prev
)
73 while (ifmt
= av_iformat_next(ifmt
))
75 return ifmt
->priv_class
;
77 while (ofmt
= av_oformat_next(ofmt
))
79 return ofmt
->priv_class
;
84 static AVClassCategory
get_category(void *ptr
)
86 AVFormatContext
* s
= ptr
;
87 if(s
->iformat
) return AV_CLASS_CATEGORY_DEMUXER
;
88 else return AV_CLASS_CATEGORY_MUXER
;
91 static const AVClass av_format_context_class
= {
92 .class_name
= "AVFormatContext",
93 .item_name
= format_to_name
,
94 .option
= avformat_options
,
95 .version
= LIBAVUTIL_VERSION_INT
,
96 .child_next
= format_child_next
,
97 .child_class_next
= format_child_class_next
,
98 .category
= AV_CLASS_CATEGORY_MUXER
,
99 .get_category
= get_category
,
102 static int io_open_default(AVFormatContext
*s
, AVIOContext
**pb
,
103 const char *url
, int flags
, AVDictionary
**options
)
107 if (!strcmp(url
, s
->filename
) ||
108 s
->iformat
&& !strcmp(s
->iformat
->name
, "image2") ||
109 s
->oformat
&& !strcmp(s
->oformat
->name
, "image2")
111 loglevel
= AV_LOG_DEBUG
;
113 loglevel
= AV_LOG_INFO
;
115 av_log(s
, loglevel
, "Opening \'%s\' for %s\n", url
, flags
& AVIO_FLAG_WRITE
? "writing" : "reading");
117 #if FF_API_OLD_OPEN_CALLBACKS
118 FF_DISABLE_DEPRECATION_WARNINGS
120 return s
->open_cb(s
, pb
, url
, flags
, &s
->interrupt_callback
, options
);
121 FF_ENABLE_DEPRECATION_WARNINGS
124 return ffio_open_whitelist(pb
, url
, flags
, &s
->interrupt_callback
, options
, s
->protocol_whitelist
, s
->protocol_blacklist
);
127 static void io_close_default(AVFormatContext
*s
, AVIOContext
*pb
)
132 static void avformat_get_context_defaults(AVFormatContext
*s
)
134 memset(s
, 0, sizeof(AVFormatContext
));
136 s
->av_class
= &av_format_context_class
;
138 s
->io_open
= io_open_default
;
139 s
->io_close
= io_close_default
;
141 av_opt_set_defaults(s
);
144 AVFormatContext
*avformat_alloc_context(void)
147 ic
= av_malloc(sizeof(AVFormatContext
));
149 avformat_get_context_defaults(ic
);
151 ic
->internal
= av_mallocz(sizeof(*ic
->internal
));
153 avformat_free_context(ic
);
156 ic
->internal
->offset
= AV_NOPTS_VALUE
;
157 ic
->internal
->raw_packet_buffer_remaining_size
= RAW_PACKET_BUFFER_SIZE
;
158 ic
->internal
->shortest_end
= AV_NOPTS_VALUE
;
163 enum AVDurationEstimationMethod
av_fmt_ctx_get_duration_estimation_method(const AVFormatContext
* ctx
)
165 return ctx
->duration_estimation_method
;
168 const AVClass
*avformat_get_class(void)
170 return &av_format_context_class
;