Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
ffmpeg
Commits
e253a9e2
Commit
e253a9e2
authored
Mar 13, 2014
by
Luca Barbato
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avformat: Move av_probe_input* to format.c
parent
942269fd
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
138 additions
and
136 deletions
+138
-136
format.c
libavformat/format.c
+138
-1
utils.c
libavformat/utils.c
+0
-135
No files found.
libavformat/format.c
View file @
e253a9e2
...
@@ -19,9 +19,12 @@
...
@@ -19,9 +19,12 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
*/
#include "libavutil/avstring.h"
#include "avio_internal.h"
#include "avformat.h"
#include "avformat.h"
#include "id3v2.h"
#include "internal.h"
#include "internal.h"
#include "libavutil/avstring.h"
/**
/**
* @file
* @file
...
@@ -181,3 +184,137 @@ AVInputFormat *av_find_input_format(const char *short_name)
...
@@ -181,3 +184,137 @@ AVInputFormat *av_find_input_format(const char *short_name)
return
fmt
;
return
fmt
;
return
NULL
;
return
NULL
;
}
}
AVInputFormat
*
av_probe_input_format2
(
AVProbeData
*
pd
,
int
is_opened
,
int
*
score_max
)
{
AVProbeData
lpd
=
*
pd
;
AVInputFormat
*
fmt1
=
NULL
,
*
fmt
;
int
score
,
id3
=
0
;
if
(
lpd
.
buf_size
>
10
&&
ff_id3v2_match
(
lpd
.
buf
,
ID3v2_DEFAULT_MAGIC
))
{
int
id3len
=
ff_id3v2_tag_len
(
lpd
.
buf
);
if
(
lpd
.
buf_size
>
id3len
+
16
)
{
lpd
.
buf
+=
id3len
;
lpd
.
buf_size
-=
id3len
;
}
id3
=
1
;
}
fmt
=
NULL
;
while
((
fmt1
=
av_iformat_next
(
fmt1
)))
{
if
(
!
is_opened
==
!
(
fmt1
->
flags
&
AVFMT_NOFILE
))
continue
;
score
=
0
;
if
(
fmt1
->
read_probe
)
{
score
=
fmt1
->
read_probe
(
&
lpd
);
}
else
if
(
fmt1
->
extensions
)
{
if
(
av_match_ext
(
lpd
.
filename
,
fmt1
->
extensions
))
score
=
AVPROBE_SCORE_EXTENSION
;
}
if
(
score
>
*
score_max
)
{
*
score_max
=
score
;
fmt
=
fmt1
;
}
else
if
(
score
==
*
score_max
)
fmt
=
NULL
;
}
// A hack for files with huge id3v2 tags -- try to guess by file extension.
if
(
!
fmt
&&
is_opened
&&
*
score_max
<
AVPROBE_SCORE_EXTENSION
/
2
)
{
while
((
fmt
=
av_iformat_next
(
fmt
)))
if
(
fmt
->
extensions
&&
av_match_ext
(
lpd
.
filename
,
fmt
->
extensions
))
{
*
score_max
=
AVPROBE_SCORE_EXTENSION
/
2
;
break
;
}
}
if
(
!
fmt
&&
id3
&&
*
score_max
<
AVPROBE_SCORE_EXTENSION
/
2
-
1
)
{
while
((
fmt
=
av_iformat_next
(
fmt
)))
if
(
fmt
->
extensions
&&
av_match_ext
(
"mp3"
,
fmt
->
extensions
))
{
*
score_max
=
AVPROBE_SCORE_EXTENSION
/
2
-
1
;
break
;
}
}
return
fmt
;
}
AVInputFormat
*
av_probe_input_format
(
AVProbeData
*
pd
,
int
is_opened
)
{
int
score
=
0
;
return
av_probe_input_format2
(
pd
,
is_opened
,
&
score
);
}
/* size of probe buffer, for guessing file type from file contents */
#define PROBE_BUF_MIN 2048
#define PROBE_BUF_MAX (1 << 20)
int
av_probe_input_buffer
(
AVIOContext
*
pb
,
AVInputFormat
**
fmt
,
const
char
*
filename
,
void
*
logctx
,
unsigned
int
offset
,
unsigned
int
max_probe_size
)
{
AVProbeData
pd
=
{
filename
?
filename
:
""
};
uint8_t
*
buf
=
NULL
;
int
ret
=
0
,
probe_size
;
if
(
!
max_probe_size
)
max_probe_size
=
PROBE_BUF_MAX
;
else
if
(
max_probe_size
>
PROBE_BUF_MAX
)
max_probe_size
=
PROBE_BUF_MAX
;
else
if
(
max_probe_size
<
PROBE_BUF_MIN
)
return
AVERROR
(
EINVAL
);
if
(
offset
>=
max_probe_size
)
return
AVERROR
(
EINVAL
);
avio_skip
(
pb
,
offset
);
max_probe_size
-=
offset
;
for
(
probe_size
=
PROBE_BUF_MIN
;
probe_size
<=
max_probe_size
&&
!*
fmt
;
probe_size
=
FFMIN
(
probe_size
<<
1
,
FFMAX
(
max_probe_size
,
probe_size
+
1
)))
{
int
score
=
probe_size
<
max_probe_size
?
AVPROBE_SCORE_MAX
/
4
:
0
;
/* Read probe data. */
if
((
ret
=
av_reallocp
(
&
buf
,
probe_size
+
AVPROBE_PADDING_SIZE
))
<
0
)
return
ret
;
if
((
ret
=
avio_read
(
pb
,
buf
+
pd
.
buf_size
,
probe_size
-
pd
.
buf_size
))
<
0
)
{
/* Fail if error was not end of file, otherwise, lower score. */
if
(
ret
!=
AVERROR_EOF
)
{
av_free
(
buf
);
return
ret
;
}
score
=
0
;
ret
=
0
;
/* error was end of file, nothing read */
}
pd
.
buf_size
+=
ret
;
pd
.
buf
=
buf
;
memset
(
pd
.
buf
+
pd
.
buf_size
,
0
,
AVPROBE_PADDING_SIZE
);
/* Guess file format. */
*
fmt
=
av_probe_input_format2
(
&
pd
,
1
,
&
score
);
if
(
*
fmt
)
{
/* This can only be true in the last iteration. */
if
(
score
<=
AVPROBE_SCORE_MAX
/
4
)
{
av_log
(
logctx
,
AV_LOG_WARNING
,
"Format detected only with low score of %d, "
"misdetection possible!
\n
"
,
score
);
}
else
av_log
(
logctx
,
AV_LOG_DEBUG
,
"Probed with size=%d and score=%d
\n
"
,
probe_size
,
score
);
}
}
if
(
!*
fmt
)
{
av_free
(
buf
);
return
AVERROR_INVALIDDATA
;
}
/* Rewind. Reuse probe buffer to avoid seeking. */
if
((
ret
=
ffio_rewind_with_probe_data
(
pb
,
buf
,
pd
.
buf_size
))
<
0
)
av_free
(
buf
);
return
ret
;
}
libavformat/utils.c
View file @
e253a9e2
...
@@ -41,7 +41,6 @@
...
@@ -41,7 +41,6 @@
#include "audiointerleave.h"
#include "audiointerleave.h"
#include "avformat.h"
#include "avformat.h"
#include "avio_internal.h"
#include "id3v2.h"
#include "id3v2.h"
#include "internal.h"
#include "internal.h"
#include "metadata.h"
#include "metadata.h"
...
@@ -139,67 +138,6 @@ int av_filename_number_test(const char *filename)
...
@@ -139,67 +138,6 @@ int av_filename_number_test(const char *filename)
(
av_get_frame_filename
(
buf
,
sizeof
(
buf
),
filename
,
1
)
>=
0
);
(
av_get_frame_filename
(
buf
,
sizeof
(
buf
),
filename
,
1
)
>=
0
);
}
}
AVInputFormat
*
av_probe_input_format2
(
AVProbeData
*
pd
,
int
is_opened
,
int
*
score_max
)
{
AVProbeData
lpd
=
*
pd
;
AVInputFormat
*
fmt1
=
NULL
,
*
fmt
;
int
score
,
id3
=
0
;
if
(
lpd
.
buf_size
>
10
&&
ff_id3v2_match
(
lpd
.
buf
,
ID3v2_DEFAULT_MAGIC
))
{
int
id3len
=
ff_id3v2_tag_len
(
lpd
.
buf
);
if
(
lpd
.
buf_size
>
id3len
+
16
)
{
lpd
.
buf
+=
id3len
;
lpd
.
buf_size
-=
id3len
;
}
id3
=
1
;
}
fmt
=
NULL
;
while
((
fmt1
=
av_iformat_next
(
fmt1
)))
{
if
(
!
is_opened
==
!
(
fmt1
->
flags
&
AVFMT_NOFILE
))
continue
;
score
=
0
;
if
(
fmt1
->
read_probe
)
{
score
=
fmt1
->
read_probe
(
&
lpd
);
}
else
if
(
fmt1
->
extensions
)
{
if
(
av_match_ext
(
lpd
.
filename
,
fmt1
->
extensions
))
score
=
AVPROBE_SCORE_EXTENSION
;
}
if
(
score
>
*
score_max
)
{
*
score_max
=
score
;
fmt
=
fmt1
;
}
else
if
(
score
==
*
score_max
)
fmt
=
NULL
;
}
// A hack for files with huge id3v2 tags -- try to guess by file extension.
if
(
!
fmt
&&
is_opened
&&
*
score_max
<
AVPROBE_SCORE_EXTENSION
/
2
)
{
while
((
fmt
=
av_iformat_next
(
fmt
)))
if
(
fmt
->
extensions
&&
av_match_ext
(
lpd
.
filename
,
fmt
->
extensions
))
{
*
score_max
=
AVPROBE_SCORE_EXTENSION
/
2
;
break
;
}
}
if
(
!
fmt
&&
id3
&&
*
score_max
<
AVPROBE_SCORE_EXTENSION
/
2
-
1
)
{
while
((
fmt
=
av_iformat_next
(
fmt
)))
if
(
fmt
->
extensions
&&
av_match_ext
(
"mp3"
,
fmt
->
extensions
))
{
*
score_max
=
AVPROBE_SCORE_EXTENSION
/
2
-
1
;
break
;
}
}
return
fmt
;
}
AVInputFormat
*
av_probe_input_format
(
AVProbeData
*
pd
,
int
is_opened
)
{
int
score
=
0
;
return
av_probe_input_format2
(
pd
,
is_opened
,
&
score
);
}
static
int
set_codec_from_probe_data
(
AVFormatContext
*
s
,
AVStream
*
st
,
static
int
set_codec_from_probe_data
(
AVFormatContext
*
s
,
AVStream
*
st
,
AVProbeData
*
pd
,
int
score
)
AVProbeData
*
pd
,
int
score
)
{
{
...
@@ -241,79 +179,6 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
...
@@ -241,79 +179,6 @@ static int set_codec_from_probe_data(AVFormatContext *s, AVStream *st,
/************************************************************/
/************************************************************/
/* input media file */
/* input media file */
/** size of probe buffer, for guessing file type from file contents */
#define PROBE_BUF_MIN 2048
#define PROBE_BUF_MAX (1 << 20)
int
av_probe_input_buffer
(
AVIOContext
*
pb
,
AVInputFormat
**
fmt
,
const
char
*
filename
,
void
*
logctx
,
unsigned
int
offset
,
unsigned
int
max_probe_size
)
{
AVProbeData
pd
=
{
filename
?
filename
:
""
};
uint8_t
*
buf
=
NULL
;
int
ret
=
0
,
probe_size
;
if
(
!
max_probe_size
)
max_probe_size
=
PROBE_BUF_MAX
;
else
if
(
max_probe_size
>
PROBE_BUF_MAX
)
max_probe_size
=
PROBE_BUF_MAX
;
else
if
(
max_probe_size
<
PROBE_BUF_MIN
)
return
AVERROR
(
EINVAL
);
if
(
offset
>=
max_probe_size
)
return
AVERROR
(
EINVAL
);
avio_skip
(
pb
,
offset
);
max_probe_size
-=
offset
;
for
(
probe_size
=
PROBE_BUF_MIN
;
probe_size
<=
max_probe_size
&&
!*
fmt
;
probe_size
=
FFMIN
(
probe_size
<<
1
,
FFMAX
(
max_probe_size
,
probe_size
+
1
)))
{
int
score
=
probe_size
<
max_probe_size
?
AVPROBE_SCORE_MAX
/
4
:
0
;
/* Read probe data. */
if
((
ret
=
av_reallocp
(
&
buf
,
probe_size
+
AVPROBE_PADDING_SIZE
))
<
0
)
return
ret
;
if
((
ret
=
avio_read
(
pb
,
buf
+
pd
.
buf_size
,
probe_size
-
pd
.
buf_size
))
<
0
)
{
/* Fail if error was not end of file, otherwise, lower score. */
if
(
ret
!=
AVERROR_EOF
)
{
av_free
(
buf
);
return
ret
;
}
score
=
0
;
ret
=
0
;
/* error was end of file, nothing read */
}
pd
.
buf_size
+=
ret
;
pd
.
buf
=
buf
;
memset
(
pd
.
buf
+
pd
.
buf_size
,
0
,
AVPROBE_PADDING_SIZE
);
/* Guess file format. */
*
fmt
=
av_probe_input_format2
(
&
pd
,
1
,
&
score
);
if
(
*
fmt
)
{
/* This can only be true in the last iteration. */
if
(
score
<=
AVPROBE_SCORE_MAX
/
4
)
{
av_log
(
logctx
,
AV_LOG_WARNING
,
"Format detected only with low score of %d, "
"misdetection possible!
\n
"
,
score
);
}
else
av_log
(
logctx
,
AV_LOG_DEBUG
,
"Probed with size=%d and score=%d
\n
"
,
probe_size
,
score
);
}
}
if
(
!*
fmt
)
{
av_free
(
buf
);
return
AVERROR_INVALIDDATA
;
}
/* Rewind. Reuse probe buffer to avoid seeking. */
if
((
ret
=
ffio_rewind_with_probe_data
(
pb
,
buf
,
pd
.
buf_size
))
<
0
)
av_free
(
buf
);
return
ret
;
}
/* Open input file and probe the format if necessary. */
/* Open input file and probe the format if necessary. */
static
int
init_input
(
AVFormatContext
*
s
,
const
char
*
filename
,
static
int
init_input
(
AVFormatContext
*
s
,
const
char
*
filename
,
AVDictionary
**
options
)
AVDictionary
**
options
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment