summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorsten Jager <t.jager@gmx.de>2014-10-03 15:05:25 +0200
committerTorsten Jager <t.jager@gmx.de>2014-10-03 15:05:25 +0200
commit67768d253061973e65246dd9d22da850533ac4e6 (patch)
treed051761ce761fc75b9472485d734a397a9a12be0
parent2390d870ff4735918d4630d4078b7eae2d117148 (diff)
downloadxine-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.
-rw-r--r--src/demuxers/demux_mpgaudio.c14
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;