summaryrefslogtreecommitdiff
path: root/src/demuxers
diff options
context:
space:
mode:
authorDarren Salt <linux@youmustbejoking.demon.co.uk>2008-02-29 14:59:25 +0000
committerDarren Salt <linux@youmustbejoking.demon.co.uk>2008-02-29 14:59:25 +0000
commitfc9ff87cf9b7753a1622339b4dd3e4ea286f05e7 (patch)
tree71c6249433ccb247678affe99d44137a6ec204e8 /src/demuxers
parent4a2a24dc98003e59ea9d7da982fefc81a82890d2 (diff)
parent2e5c9c79a47efe0df60aaea17569ea9f32d347a6 (diff)
downloadxine-lib-fc9ff87cf9b7753a1622339b4dd3e4ea286f05e7.tar.gz
xine-lib-fc9ff87cf9b7753a1622339b4dd3e4ea286f05e7.tar.bz2
Merge from 1.1.
--HG-- rename : src/combined/demux_wavpack.c => src/combined/wavpack_demuxer.c
Diffstat (limited to 'src/demuxers')
-rw-r--r--src/demuxers/demux_flac.c2
-rw-r--r--src/demuxers/demux_matroska.c14
-rw-r--r--src/demuxers/id3.c5
3 files changed, 17 insertions, 4 deletions
diff --git a/src/demuxers/demux_flac.c b/src/demuxers/demux_flac.c
index 2e84eb4b7..ed974a69c 100644
--- a/src/demuxers/demux_flac.c
+++ b/src/demuxers/demux_flac.c
@@ -201,7 +201,7 @@ static int open_flac_file(demux_flac_t *flac) {
length = _X_LE_32(ptr);
ptr += 4 + length;
- if (length >= block_length - 8)
+ if (length > block_length - 8)
return 0; /* bad length or too little left in the buffer */
user_comment_list_length = _X_LE_32(ptr);
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index ae71923d6..ec932aacb 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -1833,6 +1833,15 @@ static int read_block_data (demux_matroska_t *this, int len) {
return 1;
}
+static int parse_int16(uint8_t *data) {
+ int value = (int)_X_BE_16(data);
+ if (value & 1<<15)
+ {
+ value -= 1<<16;
+ }
+ return value;
+}
+
static int parse_block (demux_matroska_t *this, uint64_t block_size,
uint64_t cluster_timecode, uint64_t block_duration,
int normpos, int is_key) {
@@ -1849,8 +1858,9 @@ static int parse_block (demux_matroska_t *this, uint64_t block_size,
if (!(num_len = parse_ebml_uint(this, data, &track_num)))
return 0;
data += num_len;
-
- timecode_diff = (int)_X_BE_16(data);
+
+ /* timecode_diff is signed */
+ timecode_diff = parse_int16(data);
data += 2;
flags = *data;
diff --git a/src/demuxers/id3.c b/src/demuxers/id3.c
index f65d5564c..71cb5e743 100644
--- a/src/demuxers/id3.c
+++ b/src/demuxers/id3.c
@@ -543,6 +543,7 @@ int id3v23_parse_tag(input_plugin_t *input,
if (!id3v23_parse_frame_ext_header(input, &tag_frame_ext_header)) {
return 0;
}
+ pos += tag_frame_ext_header.size;
}
/* frame parsing */
while ((pos + ID3V23_FRAME_HEADER_SIZE) <= tag_header.size) {
@@ -563,7 +564,8 @@ int id3v23_parse_tag(input_plugin_t *input,
pos += tag_frame_header.size;
} else {
/* end of frames, the rest is padding */
- input->seek (input, tag_header.size - pos, SEEK_CUR);
+ lprintf("skipping padding %d bytes\n", tag_header.size - pos);
+ input->seek (input, tag_header.size - pos, SEEK_CUR);
return 1;
}
} else {
@@ -785,6 +787,7 @@ int id3v24_parse_tag(input_plugin_t *input,
if (!id3v24_parse_ext_header(input, &tag_frame_ext_header)) {
return 0;
}
+ pos += tag_frame_ext_header.size;
}
/* frame parsing */
while ((pos + ID3V24_FRAME_HEADER_SIZE) <= tag_header.size) {