FFmpeg
Loading...
Searching...
No Matches
format.c
Go to the documentation of this file.
1/*
2 * Format register and lookup
3 * Copyright (c) 2000, 2001, 2002 Fabrice Bellard
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#include "config_components.h"
23
24#include "libavutil/avstring.h"
25#include "libavutil/mem.h"
26#include "libavutil/opt.h"
27
28#include "avio_internal.h"
29#include "avformat.h"
30#include "demux.h"
31#include "id3v2.h"
32#include "internal.h"
33#include "url.h"
34
35
36/**
37 * @file
38 * Format register and lookup
39 */
40
41int av_match_ext(const char *filename, const char *extensions)
42{
43 const char *ext;
44
45 if (!filename)
46 return 0;
47
48 ext = strrchr(filename, '.');
49 if (ext)
50 return av_match_name(ext + 1, extensions);
51 return 0;
52}
53
54int ff_match_url_ext(const char *url, const char *extensions)
55{
56 const char *ext;
58 int ret;
59 char scratchpad[128];
60
61 if (!url)
62 return 0;
63
64 ret = ff_url_decompose(&uc, url, NULL);
65 if (ret < 0 || !URL_COMPONENT_HAVE(uc, scheme))
66 return ret;
67 for (ext = uc.query; *ext != '.' && ext > uc.path; ext--)
68 ;
69
70 if (*ext != '.')
71 return 0;
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);
75
76 return av_match_name(scratchpad, extensions);
77}
78
79const AVOutputFormat *av_guess_format(const char *short_name, const char *filename,
80 const char *mime_type)
81{
82 const AVOutputFormat *fmt = NULL;
83 const AVOutputFormat *fmt_found = NULL;
84 void *i = 0;
85 int score_max, score;
86
87 /* specific test for image sequences */
88#if CONFIG_IMAGE2_MUXER
89 if (!short_name && filename &&
90 av_filename_number_test(filename) &&
92 return av_guess_format("image2", NULL, NULL);
93 }
94#endif
95 /* Find the proper file type. */
96 score_max = 0;
97 while ((fmt = av_muxer_iterate(&i))) {
98 if (fmt->flags & AVFMT_EXPERIMENTAL && !short_name)
99 continue;
100 score = 0;
101 if (fmt->name && short_name && av_match_name(short_name, fmt->name))
102 score += 100;
103 if (fmt->mime_type && mime_type && !strcmp(fmt->mime_type, mime_type))
104 score += 10;
105 if (filename && fmt->extensions &&
106 av_match_ext(filename, fmt->extensions)) {
107 score += 5;
108 }
109 if (score > score_max) {
110 score_max = score;
111 fmt_found = fmt;
112 }
113 }
114 return fmt_found;
115}
116
117enum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name,
118 const char *filename, const char *mime_type,
119 enum AVMediaType type)
120{
121 if (av_match_name("segment", fmt->name) || av_match_name("ssegment", fmt->name)) {
122 const AVOutputFormat *fmt2 = av_guess_format(NULL, filename, NULL);
123 if (fmt2)
124 fmt = fmt2;
125 }
126
127 if (type == AVMEDIA_TYPE_VIDEO) {
129
130#if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER
131 if (!strcmp(fmt->name, "image2") || !strcmp(fmt->name, "image2pipe")) {
133 }
134#endif
136 codec_id = fmt->video_codec;
137 return codec_id;
138 } else if (type == AVMEDIA_TYPE_AUDIO)
139 return fmt->audio_codec;
140 else if (type == AVMEDIA_TYPE_SUBTITLE)
141 return fmt->subtitle_codec;
142 else
143 return AV_CODEC_ID_NONE;
144}
145
146const AVInputFormat *av_find_input_format(const char *short_name)
147{
148 const AVInputFormat *fmt = NULL;
149 void *i = 0;
150 while ((fmt = av_demuxer_iterate(&i)))
151 if (av_match_name(short_name, fmt->name))
152 return fmt;
153 return NULL;
154}
155
157 int is_opened, int *score_ret)
158{
159 AVProbeData lpd = *pd;
160 const AVInputFormat *fmt1 = NULL;
161 const AVInputFormat *fmt = NULL;
162 int score, score_max = 0;
163 void *i = 0;
164 const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
165 enum nodat {
166 NO_ID3,
167 ID3_ALMOST_GREATER_PROBE,
168 ID3_GREATER_PROBE,
169 ID3_GREATER_MAX_PROBE,
170 } nodat = NO_ID3;
171
172 if (!lpd.buf)
173 lpd.buf = (unsigned char *) zerobuffer;
174
175 while (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;
180 lpd.buf += id3len;
181 lpd.buf_size -= id3len;
182 } else if (id3len >= PROBE_BUF_MAX) {
183 nodat = ID3_GREATER_MAX_PROBE;
184 break;
185 } else {
186 nodat = ID3_GREATER_PROBE;
187 break;
188 }
189 }
190
191 while ((fmt1 = av_demuxer_iterate(&i))) {
192 if (fmt1->flags & AVFMT_EXPERIMENTAL)
193 continue;
194 if (!is_opened == !(fmt1->flags & AVFMT_NOFILE) && strcmp(fmt1->name, "image2"))
195 continue;
196 score = 0;
197 if (ffifmt(fmt1)->read_probe) {
198 score = ffifmt(fmt1)->read_probe(&lpd);
199 if (score)
200 av_log(NULL, AV_LOG_TRACE, "Probing %s score:%d size:%d\n", fmt1->name, score, lpd.buf_size);
201 if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions)) {
202 switch (nodat) {
203 case NO_ID3:
204 score = FFMAX(score, 1);
205 break;
206 case ID3_GREATER_PROBE:
207 case ID3_ALMOST_GREATER_PROBE:
208 score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1);
209 break;
210 case ID3_GREATER_MAX_PROBE:
211 score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
212 break;
213 }
214 }
215 } else if (fmt1->extensions) {
216 if (av_match_ext(lpd.filename, fmt1->extensions))
218 }
219 if (av_match_name(lpd.mime_type, fmt1->mime_type)) {
220 int old_score = score;
222 if (score > AVPROBE_SCORE_MAX) score = AVPROBE_SCORE_MAX;
223 av_log(NULL, AV_LOG_DEBUG, "Probing %s score:%d increased to %d due to MIME type\n", fmt1->name, old_score, score);
224 }
225 if (score > score_max) {
226 score_max = score;
227 fmt = fmt1;
228 } else if (score == score_max)
229 fmt = NULL;
230 }
231 if (nodat == ID3_GREATER_PROBE)
232 score_max = FFMIN(AVPROBE_SCORE_EXTENSION / 2 - 1, score_max);
233 *score_ret = score_max;
234
235 return fmt;
236}
237
239 int is_opened, int *score_max)
240{
241 int score_ret;
242 const AVInputFormat *fmt = av_probe_input_format3(pd, is_opened, &score_ret);
243 if (score_ret > *score_max) {
244 *score_max = score_ret;
245 return fmt;
246 } else
247 return NULL;
248}
249
250const AVInputFormat *av_probe_input_format(const AVProbeData *pd, int is_opened)
251{
252 int score = 0;
253 return av_probe_input_format2(pd, is_opened, &score);
254}
255
257 const char *filename, void *logctx,
258 unsigned int offset, unsigned int max_probe_size)
259{
260 AVProbeData pd = { filename ? filename : "" };
261 uint8_t *buf = NULL;
262 int ret = 0, probe_size, buf_offset = 0;
263 int score = 0;
264 int ret2;
265 int eof = 0;
266
267 if (!max_probe_size)
268 max_probe_size = PROBE_BUF_MAX;
269 else if (max_probe_size < PROBE_BUF_MIN) {
270 av_log(logctx, AV_LOG_ERROR,
271 "Specified probe size value %u cannot be < %u\n", max_probe_size, PROBE_BUF_MIN);
272 return AVERROR(EINVAL);
273 }
274
275 if (offset >= max_probe_size)
276 return AVERROR(EINVAL);
277
278 if (pb->av_class) {
279 uint8_t *mime_type_opt = NULL;
280 char *semi;
281 av_opt_get(pb, "mime_type", AV_OPT_SEARCH_CHILDREN, &mime_type_opt);
282 pd.mime_type = (const char *)mime_type_opt;
283 semi = pd.mime_type ? strchr(mime_type_opt, ';') : NULL;
284 if (semi) {
285 *semi = '\0';
286 }
287 }
288
289 for (probe_size = PROBE_BUF_MIN; probe_size <= max_probe_size && !*fmt && !eof;
290 probe_size = FFMIN(probe_size << 1,
291 FFMAX(max_probe_size, probe_size + 1))) {
292 score = probe_size < max_probe_size ? AVPROBE_SCORE_RETRY : 0;
293
294 /* Read probe data. */
295 if ((ret = av_reallocp(&buf, probe_size + AVPROBE_PADDING_SIZE)) < 0)
296 goto fail;
297 if ((ret = avio_read(pb, buf + buf_offset,
298 probe_size - buf_offset)) < 0) {
299 /* Fail if error was not end of file, otherwise, lower score. */
300 if (ret != AVERROR_EOF)
301 goto fail;
302
303 score = 0;
304 ret = 0; /* error was end of file, nothing read */
305 eof = 1;
306 }
307 buf_offset += ret;
308 if (buf_offset < offset)
309 continue;
310 pd.buf_size = buf_offset - offset;
311 pd.buf = &buf[offset];
312
313 memset(pd.buf + pd.buf_size, 0, AVPROBE_PADDING_SIZE);
314
315 /* Guess file format. */
316 *fmt = av_probe_input_format2(&pd, 1, &score);
317 if (*fmt) {
318 /* This can only be true in the last iteration. */
319 if (score <= AVPROBE_SCORE_RETRY) {
320 av_log(logctx, AV_LOG_WARNING,
321 "Format %s detected only with low score of %d, "
322 "misdetection possible!\n", (*fmt)->name, score);
323 } else
324 av_log(logctx, AV_LOG_DEBUG,
325 "Format %s probed with size=%d and score=%d\n",
326 (*fmt)->name, probe_size, score);
327#if 0
328 FILE *f = fopen("probestat.tmp", "ab");
329 fprintf(f, "probe_size:%d format:%s score:%d filename:%s\n", probe_size, (*fmt)->name, score, filename);
330 fclose(f);
331#endif
332 }
333 }
334
335 if (!*fmt)
337
338fail:
339 /* Rewind. Reuse probe buffer to avoid seeking. */
340 ret2 = ffio_rewind_with_probe_data(pb, &buf, buf_offset);
341 if (ret >= 0)
342 ret = ret2;
343
344 av_freep(&pd.mime_type);
345 return ret < 0 ? ret : score;
346}
347
349 const char *filename, void *logctx,
350 unsigned int offset, unsigned int max_probe_size)
351{
352 int ret = av_probe_input_buffer2(pb, fmt, filename, logctx, offset, max_probe_size);
353 return ret < 0 ? ret : 0;
354}
Main libavformat public API header.
#define AVPROBE_SCORE_MAX
maximum score
Definition avformat.h:483
#define AVPROBE_PADDING_SIZE
extra allocated bytes at the end of the probe buffer
Definition avformat.h:485
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition avformat.h:488
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition avformat.h:481
#define AVFMT_EXPERIMENTAL
The muxer/demuxer is experimental and should be used with caution.
Definition avformat.h:495
#define AVPROBE_SCORE_MIME_BONUS
score added for matching mime type
Definition avformat.h:482
#define AVPROBE_SCORE_RETRY
Definition avformat.h:478
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition aviobuf.c:615
int ffio_rewind_with_probe_data(AVIOContext *s, unsigned char **buf, int buf_size)
Rewind the AVIOContext using the specified buffer containing the first buf_size bytes of the file.
Definition aviobuf.c:1151
#define i(width, name, range_min, range_max)
Definition cbs_h264.c:63
#define f(width, name)
Definition cbs_vp8.c:236
static int read_probe(const AVProbeData *p)
Definition cdg.c:30
#define NULL
Definition coverity.c:32
static const FFInputFormat * ffifmt(const AVInputFormat *fmt)
Definition demux.h:186
#define fail
Definition test.h:479
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition codec_id.h:47
@ AV_CODEC_ID_NONE
Definition codec_id.h:48
const AVOutputFormat * av_muxer_iterate(void **opaque)
Iterate over all registered muxers.
Definition allformats.c:597
const AVInputFormat * av_demuxer_iterate(void **opaque)
Iterate over all registered demuxers.
Definition allformats.c:618
const AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
Definition format.c:146
const AVInputFormat * av_probe_input_format3(const AVProbeData *pd, int is_opened, int *score_ret)
Guess the file format.
Definition format.c:156
int av_probe_input_buffer(AVIOContext *pb, const AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)
Like av_probe_input_buffer2() but returns 0 on success.
Definition format.c:348
int av_probe_input_buffer2(AVIOContext *pb, const AVInputFormat **fmt, const char *filename, void *logctx, unsigned int offset, unsigned int max_probe_size)
Probe a bytestream to determine the input format.
Definition format.c:256
const AVInputFormat * av_probe_input_format(const AVProbeData *pd, int is_opened)
Guess the file format.
Definition format.c:250
const AVInputFormat * av_probe_input_format2(const AVProbeData *pd, int is_opened, int *score_max)
Guess the file format.
Definition format.c:238
enum AVCodecID av_guess_codec(const AVOutputFormat *fmt, const char *short_name, const char *filename, const char *mime_type, enum AVMediaType type)
Guess the codec ID based upon muxer and filename.
Definition format.c:117
const AVOutputFormat * av_guess_format(const char *short_name, const char *filename, const char *mime_type)
Return the output format in the list of registered output formats which best matches the provided par...
Definition format.c:79
int av_match_ext(const char *filename, const char *extensions)
Return a positive value if the given filename has one of the given extensions, 0 otherwise.
Definition format.c:41
int av_filename_number_test(const char *filename)
Check whether filename actually is a numbered sequence generator.
Definition utils.c:121
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition error.h:61
#define AVERROR_EOF
End of file.
Definition error.h:57
#define AVERROR(e)
Definition error.h:45
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition log.h:236
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition log.h:231
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition log.h:216
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition log.h:210
int av_reallocp(void *ptr, size_t size)
Allocate, reallocate, or free a block of memory through a pointer to a pointer.
Definition mem.c:188
AVMediaType
Definition avutil.h:198
@ AVMEDIA_TYPE_AUDIO
Definition avutil.h:201
@ AVMEDIA_TYPE_SUBTITLE
Definition avutil.h:203
@ AVMEDIA_TYPE_VIDEO
Definition avutil.h:200
int av_match_name(const char *name, const char *names)
Match instances of a name in a comma-separated list of names.
Definition avstring.c:341
size_t av_strlcpy(char *dst, const char *src, size_t size)
Copy the string src to dst, but no more than size - 1 bytes, and null-terminate dst.
Definition avstring.c:85
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition opt.c:1287
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition opt.h:604
cl_device_type type
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
Definition id3v2.c:165
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
Definition id3v2.c:152
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
Definition id3v2.h:35
enum AVCodecID ff_guess_image2_codec(const char *filename)
Definition img2.c:126
unsigned offset
Definition libaomenc.c:763
int ff_match_url_ext(const char *url, const char *extensions)
Return a positive value if the given url has one of the given extensions, negative AVERROR on error,...
Definition format.c:54
#define PROBE_BUF_MIN
size of probe buffer, for guessing file type from file contents
Definition internal.h:33
#define PROBE_BUF_MAX
Definition internal.h:34
#define FFMIN(a, b)
Definition macros.h:49
#define FFMAX(a, b)
Definition macros.h:47
Memory handling functions.
AVOptions.
Bytestream IO Context.
Definition avio.h:160
const AVClass * av_class
A class for private options.
Definition avio.h:173
int flags
Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_EXPERIMENTAL, AVFMT_SHOW_IDS,...
Definition avformat.h:585
const char * name
A comma separated list of short names for the format.
Definition avformat.h:570
const char * mime_type
Comma-separated list of mime types.
Definition avformat.h:603
const char * extensions
If extensions are defined, then no probe is done.
Definition avformat.h:592
const char * extensions
comma-separated filename extensions
Definition avformat.h:535
enum AVCodecID video_codec
default video codec
Definition avformat.h:538
enum AVCodecID audio_codec
default audio codec
Definition avformat.h:537
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_EXPERIMENTAL, AVFMT_GLOBALHEADER,...
Definition avformat.h:546
const char * name
Definition avformat.h:527
const char * mime_type
Definition avformat.h:534
enum AVCodecID subtitle_codec
default subtitle codec
Definition avformat.h:539
This structure contains the data a format has to probe a file.
Definition avformat.h:471
const char * filename
Definition avformat.h:472
const char * mime_type
mime_type, when known.
Definition avformat.h:475
int buf_size
Size of buf except extra allocated bytes.
Definition avformat.h:474
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition avformat.h:473
int(* read_probe)(const AVProbeData *)
Tell if a given file has a chance of being parsed as this format.
Definition demux.h:92
const char * path
Definition url.h:368
const char * query
including initial '?
Definition url.h:369
#define av_freep(p)
#define av_log(a,...)
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.
Definition url.c:91
unbuffered private I/O API
#define URL_COMPONENT_HAVE(uc, component)
Definition url.h:384
enum AVCodecID codec_id