FFmpeg
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 
41 int 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 
54 int ff_match_url_ext(const char *url, const char *extensions)
55 {
56  const char *ext;
57  URLComponents uc;
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 
79 const 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 
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)
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")) {
132  codec_id = ff_guess_image2_codec(filename);
133  }
134 #endif
135  if (codec_id == AV_CODEC_ID_NONE)
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 
146 const 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))
217  score = AVPROBE_SCORE_EXTENSION;
218  }
219  if (av_match_name(lpd.mime_type, fmt1->mime_type)) {
220  int old_score = score;
221  score += AVPROBE_SCORE_MIME_BONUS;
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 
250 const 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(pd.mime_type, ';') : 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 
338 fail:
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 }
AV_OPT_SEARCH_CHILDREN
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
Definition: opt.h:605
AVMEDIA_TYPE_SUBTITLE
@ AVMEDIA_TYPE_SUBTITLE
Definition: avutil.h:203
AV_LOG_WARNING
#define AV_LOG_WARNING
Something somehow does not look correct.
Definition: log.h:216
FFInputFormat::read_probe
int(* read_probe)(const AVProbeData *)
Tell if a given file has a chance of being parsed as this format.
Definition: demux.h:73
AVOutputFormat::extensions
const char * extensions
comma-separated filename extensions
Definition: avformat.h:514
AVOutputFormat::name
const char * name
Definition: avformat.h:506
AVERROR
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later. That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another. Frame references ownership and permissions
opt.h
av_probe_input_buffer2
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
AVERROR_EOF
#define AVERROR_EOF
End of file.
Definition: error.h:57
URLComponents
Definition: url.h:359
id3v2.h
URLComponents::path
const char * path
Definition: url.h:366
ff_guess_image2_codec
enum AVCodecID ff_guess_image2_codec(const char *filename)
Definition: img2.c:126
AVProbeData::buf_size
int buf_size
Size of buf except extra allocated bytes.
Definition: avformat.h:454
FFMAX
#define FFMAX(a, b)
Definition: macros.h:47
URL_COMPONENT_HAVE
#define URL_COMPONENT_HAVE(uc, component)
Definition: url.h:382
AVOutputFormat::subtitle_codec
enum AVCodecID subtitle_codec
default subtitle codec
Definition: avformat.h:518
av_filename_number_test
int av_filename_number_test(const char *filename)
Check whether filename actually is a numbered sequence generator.
Definition: utils.c:121
AVPROBE_SCORE_MAX
#define AVPROBE_SCORE_MAX
maximum score
Definition: avformat.h:463
fail
#define fail()
Definition: checkasm.h:217
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition: writing_filters.txt:86
AVPROBE_PADDING_SIZE
#define AVPROBE_PADDING_SIZE
extra allocated bytes at the end of the probe buffer
Definition: avformat.h:465
av_probe_input_format3
const AVInputFormat * av_probe_input_format3(const AVProbeData *pd, int is_opened, int *score_ret)
Guess the file format.
Definition: format.c:156
AV_LOG_TRACE
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
Definition: log.h:236
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:210
AVInputFormat
Definition: avformat.h:544
AVProbeData::mime_type
const char * mime_type
mime_type, when known.
Definition: avformat.h:455
AVInputFormat::extensions
const char * extensions
If extensions are defined, then no probe is done.
Definition: avformat.h:570
ff_match_url_ext
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
AVInputFormat::name
const char * name
A comma separated list of short names for the format.
Definition: avformat.h:549
AVProbeData::buf
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
Definition: avformat.h:453
AVMEDIA_TYPE_AUDIO
@ AVMEDIA_TYPE_AUDIO
Definition: avutil.h:201
AVProbeData::filename
const char * filename
Definition: avformat.h:452
av_match_ext
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
AVOutputFormat::audio_codec
enum AVCodecID audio_codec
default audio codec
Definition: avformat.h:516
AVInputFormat::mime_type
const char * mime_type
Comma-separated list of mime types.
Definition: avformat.h:581
AV_LOG_DEBUG
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:231
codec_id
enum AVCodecID codec_id
Definition: vaapi_decode.c:410
URLComponents::query
const char * query
including initial '?' if present
Definition: url.h:367
av_probe_input_format2
const AVInputFormat * av_probe_input_format2(const AVProbeData *pd, int is_opened, int *score_max)
Guess the file format.
Definition: format.c:238
internal.h
av_probe_input_format
const AVInputFormat * av_probe_input_format(const AVProbeData *pd, int is_opened)
Guess the file format.
Definition: format.c:250
NULL
#define NULL
Definition: coverity.c:32
AVProbeData
This structure contains the data a format has to probe a file.
Definition: avformat.h:451
AVPROBE_SCORE_EXTENSION
#define AVPROBE_SCORE_EXTENSION
score for file extension
Definition: avformat.h:461
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
AVOutputFormat::flags
int flags
can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:525
f
f
Definition: af_crystalizer.c:122
AVIOContext
Bytestream IO Context.
Definition: avio.h:160
AVMediaType
AVMediaType
Definition: avutil.h:198
ID3v2_DEFAULT_MAGIC
#define ID3v2_DEFAULT_MAGIC
Default magic bytes for ID3v2 header: "ID3".
Definition: id3v2.h:35
av_reallocp
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
AVFMT_NOFILE
#define AVFMT_NOFILE
Demuxer will use avio_open, no opened file should be provided by the caller.
Definition: avformat.h:468
av_demuxer_iterate
const AVInputFormat * av_demuxer_iterate(void **opaque)
Iterate over all registered demuxers.
Definition: allformats.c:614
offset
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf offset
Definition: writing_filters.txt:86
av_probe_input_buffer
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
AVOutputFormat::mime_type
const char * mime_type
Definition: avformat.h:513
PROBE_BUF_MAX
#define PROBE_BUF_MAX
Definition: internal.h:34
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
AVOutputFormat
Definition: avformat.h:505
i
#define i(width, name, range_min, range_max)
Definition: cbs_h2645.c:256
avio_internal.h
FFMIN
#define FFMIN(a, b)
Definition: macros.h:49
url.h
AVPROBE_SCORE_RETRY
#define AVPROBE_SCORE_RETRY
Definition: avformat.h:458
AVFMT_EXPERIMENTAL
#define AVFMT_EXPERIMENTAL
The muxer/demuxer is experimental and should be used with caution.
Definition: avformat.h:475
demux.h
ff_id3v2_tag_len
int ff_id3v2_tag_len(const uint8_t *buf)
Get the length of an ID3v2 tag.
Definition: id3v2.c:159
ret
ret
Definition: filter_design.txt:187
avformat.h
av_guess_codec
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
av_muxer_iterate
const AVOutputFormat * av_muxer_iterate(void **opaque)
Iterate over all registered muxers.
Definition: allformats.c:593
AVInputFormat::flags
int flags
Can use flags: AVFMT_NOFILE, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, AVFMT_NOTIMESTAMPS,...
Definition: avformat.h:563
ffifmt
static const FFInputFormat * ffifmt(const AVInputFormat *fmt)
Definition: demux.h:143
PROBE_BUF_MIN
#define PROBE_BUF_MIN
size of probe buffer, for guessing file type from file contents
Definition: internal.h:33
av_match_name
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:346
avio_read
int avio_read(AVIOContext *s, unsigned char *buf, int size)
Read size bytes from AVIOContext into buf.
Definition: aviobuf.c:615
AVOutputFormat::video_codec
enum AVCodecID video_codec
default video codec
Definition: avformat.h:517
av_find_input_format
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
AVMEDIA_TYPE_VIDEO
@ AVMEDIA_TYPE_VIDEO
Definition: avutil.h:200
read_probe
static int read_probe(const AVProbeData *p)
Definition: cdg.c:30
av_guess_format
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
mem.h
ffio_rewind_with_probe_data
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
AVPROBE_SCORE_MIME_BONUS
#define AVPROBE_SCORE_MIME_BONUS
score added for matching mime type
Definition: avformat.h:462
av_freep
#define av_freep(p)
Definition: tableprint_vlc.h:35
av_strlcpy
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
av_opt_get
int av_opt_get(void *obj, const char *name, int search_flags, uint8_t **out_val)
Definition: opt.c:1215
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
avstring.h
ff_url_decompose
int ff_url_decompose(URLComponents *uc, const char *url, const char *end)
Parse an URL to find the components.
Definition: url.c:91
ff_id3v2_match
int ff_id3v2_match(const uint8_t *buf, const char *magic)
Detect ID3v2 Header.
Definition: id3v2.c:146
AVIOContext::av_class
const AVClass * av_class
A class for private options.
Definition: avio.h:173