aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Niedermayer <michael@niedermayer.cc>2016-01-30 22:01:16 +0100
committerMichael Niedermayer <michael@niedermayer.cc>2016-01-30 22:25:31 +0100
commit77864be44a0daeae846d7395b3cb682a22ce99a9 (patch)
tree3d83034c3c890b547a654d04d747371c7507dede
parent8619582bdf1be5ee58655a01d42da547f727b19b (diff)
downloadffmpeg-77864be44a0daeae846d7395b3cb682a22ce99a9.tar.gz
avformat/format: Weight the filename extension higher if there is nearly no data after an ID3 available
Fixes Ticket5205 Based-on-patch-by: Carl Eugen Hoyos Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
-rw-r--r--libavformat/format.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/libavformat/format.c b/libavformat/format.c
index 9d14c67913..15fe167fb2 100644
--- a/libavformat/format.c
+++ b/libavformat/format.c
@@ -175,6 +175,7 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened,
const static uint8_t zerobuffer[AVPROBE_PADDING_SIZE];
enum nodat {
NO_ID3,
+ ID3_ALMOST_GREATER_PROBE,
ID3_GREATER_PROBE,
ID3_GREATER_MAX_PROBE,
} nodat = NO_ID3;
@@ -185,6 +186,8 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened,
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) {
+ if (lpd.buf_size < 2LL*id3len + 16)
+ nodat = ID3_ALMOST_GREATER_PROBE;
lpd.buf += id3len;
lpd.buf_size -= id3len;
} else if (id3len >= PROBE_BUF_MAX) {
@@ -203,9 +206,18 @@ AVInputFormat *av_probe_input_format3(AVProbeData *pd, int is_opened,
if (score)
av_log(NULL, AV_LOG_TRACE, "Probing %s score:%d size:%d\n", fmt1->name, score, lpd.buf_size);
if (fmt1->extensions && av_match_ext(lpd.filename, fmt1->extensions)) {
- if (nodat == NO_ID3) score = FFMAX(score, 1);
- else if (nodat == ID3_GREATER_PROBE) score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1);
- else score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
+ switch (nodat) {
+ case NO_ID3:
+ score = FFMAX(score, 1);
+ break;
+ case ID3_GREATER_PROBE:
+ case ID3_ALMOST_GREATER_PROBE:
+ score = FFMAX(score, AVPROBE_SCORE_EXTENSION / 2 - 1);
+ break;
+ case ID3_GREATER_MAX_PROBE:
+ score = FFMAX(score, AVPROBE_SCORE_EXTENSION);
+ break;
+ }
}
} else if (fmt1->extensions) {
if (av_match_ext(lpd.filename, fmt1->extensions))