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
27
34
35
36 /**
37 * @file
38 * Format register and lookup
39 */
40
42 {
43 const char *ext;
44
45 if (!filename)
46 return 0;
47
48 ext = strrchr(filename, '.');
49 if (ext)
51 return 0;
52 }
53
55 {
56 const char *ext;
59 char scratchpad[128];
60
61 if (!url)
62 return 0;
63
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
75
77 }
78
80 const char *mime_type)
81 {
85 int score_max, score;
86
87 /* specific test for image sequences */
88 #if CONFIG_IMAGE2_MUXER
89 if (!short_name && filename &&
93 }
94 #endif
95 /* Find the proper file type. */
96 score_max = 0;
99 continue;
100 score = 0;
102 score += 100;
104 score += 10;
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
118 const char *filename, const char *mime_type,
120 {
123 if (fmt2)
124 fmt = fmt2;
125 }
126
129
130 #if CONFIG_IMAGE2_MUXER || CONFIG_IMAGE2PIPE_MUXER
131 if (!strcmp(fmt->
name,
"image2") || !strcmp(fmt->
name,
"image2pipe")) {
133 }
134 #endif
142 else
144 }
145
147 {
152 return fmt;
154 }
155
157 int is_opened, int *score_ret)
158 {
162 int score, score_max = 0;
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
173 lpd.
buf = (
unsigned char *) zerobuffer;
174
179 nodat = ID3_ALMOST_GREATER_PROBE;
183 nodat = ID3_GREATER_MAX_PROBE;
184 } else
185 nodat = ID3_GREATER_PROBE;
186 }
187
190 continue;
192 continue;
193 score = 0;
196 if (score)
199 switch (nodat) {
200 case NO_ID3:
201 score =
FFMAX(score, 1);
202 break;
203 case ID3_GREATER_PROBE:
204 case ID3_ALMOST_GREATER_PROBE:
206 break;
207 case ID3_GREATER_MAX_PROBE:
209 break;
210 }
211 }
215 }
217 int old_score = score;
221 }
222 if (score > score_max) {
223 score_max = score;
224 fmt = fmt1;
225 } else if (score == score_max)
227 }
228 if (nodat == ID3_GREATER_PROBE)
230 *score_ret = score_max;
231
232 return fmt;
233 }
234
236 int is_opened, int *score_max)
237 {
238 int score_ret;
240 if (score_ret > *score_max) {
241 *score_max = score_ret;
242 return fmt;
243 } else
245 }
246
248 {
249 int score = 0;
251 }
252
254 const char *filename, void *logctx,
255 unsigned int offset,
unsigned int max_probe_size)
256 {
259 int ret = 0, probe_size, buf_offset = 0;
260 int score = 0;
261 int ret2;
262 int eof = 0;
263
264 if (!max_probe_size)
268 "Specified probe size value %u cannot be < %u\n", max_probe_size,
PROBE_BUF_MIN);
270 }
271
272 if (
offset >= max_probe_size)
274
276 uint8_t *mime_type_opt =
NULL;
277 char *semi;
279 pd.
mime_type = (
const char *)mime_type_opt;
281 if (semi) {
282 *semi = '0円';
283 }
284 }
285
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))) {
290
291 /* Read probe data. */
295 probe_size - buf_offset)) < 0) {
296 /* Fail if error was not end of file, otherwise, lower score. */
299
300 score = 0;
301 ret = 0;
/* error was end of file, nothing read */
302 eof = 1;
303 }
306 continue;
309
311
312 /* Guess file format. */
314 if (*fmt) {
315 /* This can only be true in the last iteration. */
318 "Format %s detected only with low score of %d, "
319 "misdetection possible!\n", (*fmt)->name, score);
320 } else
322 "Format %s probed with size=%d and score=%d\n",
323 (*fmt)->name, probe_size, score);
324 #if 0
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);
328 #endif
329 }
330 }
331
332 if (!*fmt)
334
336 /* Rewind. Reuse probe buffer to avoid seeking. */
340
342 return ret < 0 ?
ret : score;
343 }
344
346 const char *filename, void *logctx,
347 unsigned int offset,
unsigned int max_probe_size)
348 {
351 }