2 * Format register and lookup
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
5 * This file is part of FFmpeg.
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.
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.
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
22 #include "config_components.h"
24 #include "libavutil/avstring.h"
25 #include "libavutil/mem.h"
26 #include "libavutil/opt.h"
28 #include "avio_internal.h"
38 * Format register and lookup
41 int av_match_ext(const char *filename
, const char *extensions
)
48 ext
= strrchr(filename
, '.');
50 return av_match_name(ext
+ 1, extensions
);
54 int ff_match_url_ext(const char *url
, const char *extensions
)
64 ret
= ff_url_decompose(&uc
, url
, NULL
);
65 if (ret
< 0 || !URL_COMPONENT_HAVE(uc
, scheme
))
67 for (ext
= uc
.query
; *ext
!= '.' && ext
> uc
.path
; ext
--)
72 if (uc
.query
- ext
> sizeof(scratchpad
))
73 return AVERROR(ENOMEM
); //not enough memory in our scratchpad
74 av_strlcpy(scratchpad
, ext
+ 1, uc
.query
- ext
);
76 return av_match_name(scratchpad
, extensions
);
79 const AVOutputFormat
*av_guess_format(const char *short_name
, const char *filename
,
80 const char *mime_type
)
82 const AVOutputFormat
*fmt
= NULL
;
83 const AVOutputFormat
*fmt_found
= NULL
;
87 /* specific test for image sequences */
88 #if CONFIG_IMAGE2_MUXER
89 if (!short_name
&& filename
&&
90 av_filename_number_test(filename
) &&
91 ff_guess_image2_codec(filename
) != AV_CODEC_ID_NONE
) {
92 return av_guess_format("image2", NULL
, NULL
);
95 /* Find the proper file type. */
97 while ((fmt
= av_muxer_iterate(&i
))) {
98 if (fmt
->flags
& AVFMT_EXPERIMENTAL
&& !short_name
)
101 if (fmt
->name
&& short_name
&& av_match_name(short_name
, fmt
->name
))
103 if (fmt
->mime_type
&& mime_type
&& !strcmp(fmt
->mime_type
, mime_type
))
105 if (filename
&& fmt
->extensions
&&
106 av_match_ext(filename
, fmt
->extensions
)) {
109 if (score
> score_max
) {
117 enum AVCodecID
av_guess_codec(const AVOutputFormat
*fmt
, const char *short_name
,
118 const char *filename
, const char *mime_type
,
119 enum AVMediaType type
)
121 if (av_match_name("segment", fmt
->name
) || av_match_name("ssegment", fmt
->name
)) {
122 const AVOutputFormat
*fmt2
= av_guess_format(NULL
, filename
, NULL
);
127 if (type
== AVMEDIA_TYPE_VIDEO
) {
128 enum AVCodecID codec_id
= AV_CODEC_ID_NONE
;
130 #if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER
131 if (!strcmp(fmt
->name
, "image2") || !strcmp(fmt
->name
, "image2pipe")) {
132 codec_id
= ff_guess_image2_codec(filename
);
135 if (codec_id
== AV_CODEC_ID_NONE
)
136 codec_id
= fmt
->video_codec
;
138 } else if (type
== AVMEDIA_TYPE_AUDIO
)
139 return fmt
->audio_codec
;
140 else if (type
== AVMEDIA_TYPE_SUBTITLE
)
141 return fmt
->subtitle_codec
;
143 return AV_CODEC_ID_NONE
;
146 const AVInputFormat
*av_find_input_format(const char *short_name
)
148 const AVInputFormat
*fmt
= NULL
;
150 while ((fmt
= av_demuxer_iterate(&i
)))
151 if (av_match_name(short_name
, fmt
->name
))
156 const AVInputFormat
*av_probe_input_format3(const AVProbeData
*pd
,
157 int is_opened
, int *score_ret
)
159 AVProbeData lpd
= *pd
;
160 const AVInputFormat
*fmt1
= NULL
;
161 const AVInputFormat
*fmt
= NULL
;
162 int score
, score_max
= 0;
164 const static uint8_t zerobuffer
[AVPROBE_PADDING_SIZE
];
167 ID3_ALMOST_GREATER_PROBE
,
169 ID3_GREATER_MAX_PROBE
,
173 lpd
.buf
= (unsigned char *) zerobuffer
;
175 if (lpd
.buf_size
> 10 && ff_id3v2_match(lpd
.buf
, ID3v2_DEFAULT_MAGIC
)) {
176 int id3len
= ff_id3v2_tag_len(lpd
.buf
);
177 if (lpd
.buf_size
> id3len
+ 16) {
178 if (lpd
.buf_size
< 2LL*id3len
+ 16)
179 nodat
= ID3_ALMOST_GREATER_PROBE
;
181 lpd
.buf_size
-= id3len
;
182 } else if (id3len
>= PROBE_BUF_MAX
) {
183 nodat
= ID3_GREATER_MAX_PROBE
;
185 nodat
= ID3_GREATER_PROBE
;
188 while ((fmt1
= av_demuxer_iterate(&i
))) {
189 if (fmt1
->flags
& AVFMT_EXPERIMENTAL
)
191 if (!is_opened
== !(fmt1
->flags
& AVFMT_NOFILE
) && strcmp(fmt1
->name
, "image2"))
194 if (ffifmt(fmt1
)->read_probe
) {
195 score
= ffifmt(fmt1
)->read_probe(&lpd
);
197 av_log(NULL
, AV_LOG_TRACE
, "Probing %s score:%d size:%d\n", fmt1
->name
, score
, lpd
.buf_size
);
198 if (fmt1
->extensions
&& av_match_ext(lpd
.filename
, fmt1
->extensions
)) {
201 score
= FFMAX(score
, 1);
203 case ID3_GREATER_PROBE
:
204 case ID3_ALMOST_GREATER_PROBE
:
205 score
= FFMAX(score
, AVPROBE_SCORE_EXTENSION
/ 2 - 1);
207 case ID3_GREATER_MAX_PROBE
:
208 score
= FFMAX(score
, AVPROBE_SCORE_EXTENSION
);
212 } else if (fmt1
->extensions
) {
213 if (av_match_ext(lpd
.filename
, fmt1
->extensions
))
214 score
= AVPROBE_SCORE_EXTENSION
;
216 if (av_match_name(lpd
.mime_type
, fmt1
->mime_type
)) {
217 int old_score
= score
;
218 score
+= AVPROBE_SCORE_MIME_BONUS
;
219 if (score
> AVPROBE_SCORE_MAX
) score
= AVPROBE_SCORE_MAX
;
220 av_log(NULL
, AV_LOG_DEBUG
, "Probing %s score:%d increased to %d due to MIME type\n", fmt1
->name
, old_score
, score
);
222 if (score
> score_max
) {
225 } else if (score
== score_max
)
228 if (nodat
== ID3_GREATER_PROBE
)
229 score_max
= FFMIN(AVPROBE_SCORE_EXTENSION
/ 2 - 1, score_max
);
230 *score_ret
= score_max
;
235 const AVInputFormat
*av_probe_input_format2(const AVProbeData
*pd
,
236 int is_opened
, int *score_max
)
239 const AVInputFormat
*fmt
= av_probe_input_format3(pd
, is_opened
, &score_ret
);
240 if (score_ret
> *score_max
) {
241 *score_max
= score_ret
;
247 const AVInputFormat
*av_probe_input_format(const AVProbeData
*pd
, int is_opened
)
250 return av_probe_input_format2(pd
, is_opened
, &score
);
253 int av_probe_input_buffer2(AVIOContext
*pb
, const AVInputFormat
**fmt
,
254 const char *filename
, void *logctx
,
255 unsigned int offset
, unsigned int max_probe_size
)
257 AVProbeData pd
= { filename
? filename
: "" };
259 int ret
= 0, probe_size
, buf_offset
= 0;
265 max_probe_size
= PROBE_BUF_MAX
;
266 else if (max_probe_size
< PROBE_BUF_MIN
) {
267 av_log(logctx
, AV_LOG_ERROR
,
268 "Specified probe size value %u cannot be < %u\n", max_probe_size
, PROBE_BUF_MIN
);
269 return AVERROR(EINVAL
);
272 if (offset
>= max_probe_size
)
273 return AVERROR(EINVAL
);
276 uint8_t *mime_type_opt
= NULL
;
278 av_opt_get(pb
, "mime_type", AV_OPT_SEARCH_CHILDREN
, &mime_type_opt
);
279 pd
.mime_type
= (const char *)mime_type_opt
;
280 semi
= pd
.mime_type
? strchr(pd
.mime_type
, ';') : NULL
;
286 for (probe_size
= PROBE_BUF_MIN
; probe_size
<= max_probe_size
&& !*fmt
&& !eof
;
287 probe_size
= FFMIN(probe_size
<< 1,
288 FFMAX(max_probe_size
, probe_size
+ 1))) {
289 score
= probe_size
< max_probe_size
? AVPROBE_SCORE_RETRY
: 0;
291 /* Read probe data. */
292 if ((ret
= av_reallocp(&buf
, probe_size
+ AVPROBE_PADDING_SIZE
)) < 0)
294 if ((ret
= avio_read(pb
, buf
+ buf_offset
,
295 probe_size
- buf_offset
)) < 0) {
296 /* Fail if error was not end of file, otherwise, lower score. */
297 if (ret
!= AVERROR_EOF
)
301 ret
= 0; /* error was end of file, nothing read */
305 if (buf_offset
< offset
)
307 pd
.buf_size
= buf_offset
- offset
;
308 pd
.buf
= &buf
[offset
];
310 memset(pd
.buf
+ pd
.buf_size
, 0, AVPROBE_PADDING_SIZE
);
312 /* Guess file format. */
313 *fmt
= av_probe_input_format2(&pd
, 1, &score
);
315 /* This can only be true in the last iteration. */
316 if (score
<= AVPROBE_SCORE_RETRY
) {
317 av_log(logctx
, AV_LOG_WARNING
,
318 "Format %s detected only with low score of %d, "
319 "misdetection possible!\n", (*fmt
)->name
, score
);
321 av_log(logctx
, AV_LOG_DEBUG
,
322 "Format %s probed with size=%d and score=%d\n",
323 (*fmt
)->name
, probe_size
, score
);
325 FILE *f
= fopen("probestat.tmp", "ab");
326 fprintf(f
, "probe_size:%d format:%s score:%d filename:%s\n", probe_size
, (*fmt
)->name
, score
, filename
);
333 ret
= AVERROR_INVALIDDATA
;
336 /* Rewind. Reuse probe buffer to avoid seeking. */
337 ret2
= ffio_rewind_with_probe_data(pb
, &buf
, buf_offset
);
341 av_freep(&pd
.mime_type
);
342 return ret
< 0 ? ret
: score
;
345 int av_probe_input_buffer(AVIOContext
*pb
, const AVInputFormat
**fmt
,
346 const char *filename
, void *logctx
,
347 unsigned int offset
, unsigned int max_probe_size
)
349 int ret
= av_probe_input_buffer2(pb
, fmt
, filename
, logctx
, offset
, max_probe_size
);
350 return ret
< 0 ? ret
: 0;