summaryrefslogtreecommitdiffstats
path: root/gst/matroska/ebml-read.c
diff options
context:
space:
mode:
authorRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-01-02 20:38:59 +0000
committerRonald S. Bultje <rbultje@ronald.bitfreak.net>2004-01-02 20:38:59 +0000
commit02029d218d53b4b8cd619a6cddb771b1642dd556 (patch)
tree6847750934213768117c2d3b6eeea31c741eedfb /gst/matroska/ebml-read.c
parentb4591e1182d6a93e3c8cee766b2f158205e10295 (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.c15
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);