diff options
author | Torsten Jager <t.jager@gmx.de> | 2014-10-03 15:05:25 +0200 |
---|---|---|
committer | Torsten Jager <t.jager@gmx.de> | 2014-10-03 15:05:25 +0200 |
commit | 67768d253061973e65246dd9d22da850533ac4e6 (patch) | |
tree | d051761ce761fc75b9472485d734a397a9a12be0 /src | |
parent | 2390d870ff4735918d4630d4078b7eae2d117148 (diff) | |
download | xine-lib-67768d253061973e65246dd9d22da850533ac4e6.tar.gz xine-lib-67768d253061973e65246dd9d22da850533ac4e6.tar.bz2 |
Detect mp3 files with large id3v2 tags.
At least when input is seekable.
AVformat demux used to hit in such cases, but that one is still very unstable.
Diffstat (limited to 'src')
-rw-r--r-- | src/demuxers/demux_mpgaudio.c | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/demuxers/demux_mpgaudio.c b/src/demuxers/demux_mpgaudio.c index 5bff17858..affed543d 100644 --- a/src/demuxers/demux_mpgaudio.c +++ b/src/demuxers/demux_mpgaudio.c @@ -872,6 +872,20 @@ static int detect_mpgaudio_file(input_plugin_t *input, */ int tag_size = _X_BE_32_synchsafe(&buf[6]); lprintf("try to skip id3v2 tag (%d bytes)\n", tag_size); + /* id3v2 tags may be larger than preview size (album artwork JPG or something). + * try to skip by seeking. + */ + if (INPUT_IS_SEEKABLE (input)) { + input->seek (input, 10 + tag_size, SEEK_SET); + preview_len = input->read (input, buf, MAX_PREVIEW_SIZE); + if (!sniff_buffer_looks_like_mp3 (buf, preview_len, version, layer)) { + lprintf ("sniff_buffer_looks_like_mp3 failed\n"); + return 0; + } else { + lprintf ("a valid mp3 frame follows the id3v2 tag\n"); + return 1; + } + } if ((10 + tag_size) >= preview_len) { lprintf("cannot skip id3v2 tag\n"); return 0; |