summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThibaut Mattern <thibaut.mattern@gmail.com>2008-02-18 23:51:40 +0100
committerThibaut Mattern <thibaut.mattern@gmail.com>2008-02-18 23:51:40 +0100
commitdfaac7bec1f45bbabb8e5cfbe1001dee13829496 (patch)
tree51150def7f224d8e6e1fd9c74ee630972e885fa4
parent81f97ffcec8753ec559ea7c3659bbf022d6a9b2b (diff)
downloadxine-lib-dfaac7bec1f45bbabb8e5cfbe1001dee13829496.tar.gz
xine-lib-dfaac7bec1f45bbabb8e5cfbe1001dee13829496.tar.bz2
Timecode diff is signed.
Should fix bug 35. --HG-- extra : transplant_source : %DD%95%9F%A7%8D%01%BD%98%40%E4R%AAW%F2%ED%93%B2%DE%1A%E9
-rw-r--r--src/demuxers/demux_matroska.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/demuxers/demux_matroska.c b/src/demuxers/demux_matroska.c
index 3c992ecca..63b6ea3c8 100644
--- a/src/demuxers/demux_matroska.c
+++ b/src/demuxers/demux_matroska.c
@@ -1832,6 +1832,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) {
@@ -1848,8 +1857,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;