summaryrefslogtreecommitdiff
path: root/src
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 /src
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.
Diffstat (limited to 'src')
-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;