diff options
author | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2004-01-02 20:38:59 +0000 |
---|---|---|
committer | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2004-01-02 20:38:59 +0000 |
commit | 02029d218d53b4b8cd619a6cddb771b1642dd556 (patch) | |
tree | 6847750934213768117c2d3b6eeea31c741eedfb /gst/matroska/ebml-read.c | |
parent | b4591e1182d6a93e3c8cee766b2f158205e10295 (diff) |
gst/matroska/: fix signed integer reading/writing.
Original commit message from CVS:
2004-01-02 Ronald Bultje <rbultje@ronald.bitfreak.net>
* gst/matroska/ebml-read.c: (gst_ebml_read_sint):
* gst/matroska/ebml-write.c: (gst_ebml_write_sint):
fix signed integer reading/writing.
Diffstat (limited to 'gst/matroska/ebml-read.c')
-rw-r--r-- | gst/matroska/ebml-read.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/gst/matroska/ebml-read.c b/gst/matroska/ebml-read.c index 67b9b5f3..c5b9c0da 100644 --- a/gst/matroska/ebml-read.c +++ b/gst/matroska/ebml-read.c @@ -464,7 +464,7 @@ gst_ebml_read_sint (GstEbmlRead *ebml, { GstBuffer *buf; guint8 *data; - guint size; + guint size, negative = 0, n = 0; if (!gst_ebml_read_buffer (ebml, id, &buf)) return FALSE; @@ -478,14 +478,19 @@ gst_ebml_read_sint (GstEbmlRead *ebml, gst_buffer_unref (buf); return FALSE; } + if (data[0] & 0x80) { + negative = 1; + data[0] &= ~0x80; + } *num = 0; - while (size > 0) { - *num = (*num << 8) | data[GST_BUFFER_SIZE (buf) - size]; - size--; + while (n < size) { + *num = (*num << 8) | data[n++]; } /* make signed */ - *num -= (1LL << ((8 * GST_BUFFER_SIZE (buf)) - 1)); + if (negative) { + *num = *num - (1LL << ((8 * size) - 1)); + } gst_buffer_unref (buf); |