summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-02-11 19:39:04 +0100
committerMark Nauwelaerts <mark.nauwelaerts@collabora.co.uk>2010-02-16 16:09:26 +0100
commit58d84a993c343b6ad95a108060d74f405392501c (patch)
tree662b0af811f58f39028c25cd7077dc46d21a4d97
parent87e80aab576207c34ce4ce624c7720767e7858bf (diff)
qtdemux: handle signed values in 3GPP location tag
-rw-r--r--gst/qtdemux/qtdemux.c7
-rw-r--r--gst/qtdemux/qtdemux_types.h1
2 files changed, 5 insertions, 3 deletions
diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c
index 055e8f863..ba6d4c783 100644
--- a/gst/qtdemux/qtdemux.c
+++ b/gst/qtdemux/qtdemux.c
@@ -6040,13 +6040,14 @@ qtdemux_tag_add_location (GstQTDemux * qtdemux, const char *tag,
/* +1 +1 = skip null-terminator and location role byte */
offset += 1 + 1;
- longitude = QT_FP32 (data + offset);
+ /* table in spec says unsigned, semantics say negative has meaning ... */
+ longitude = QT_SFP32 (data + offset);
offset += 4;
- latitude = QT_FP32 (data + offset);
+ latitude = QT_SFP32 (data + offset);
offset += 4;
- altitude = QT_FP32 (data + offset);
+ altitude = QT_SFP32 (data + offset);
/* one invalid means all are invalid */
if (longitude >= -180.0 && longitude <= 180.0 &&
diff --git a/gst/qtdemux/qtdemux_types.h b/gst/qtdemux/qtdemux_types.h
index 8148cb9a7..e5c0bd62c 100644
--- a/gst/qtdemux/qtdemux_types.h
+++ b/gst/qtdemux/qtdemux_types.h
@@ -38,6 +38,7 @@ typedef struct _QtNodeType QtNodeType;
#define QT_UINT16(a) (GST_READ_UINT16_BE(a))
#define QT_UINT8(a) (GST_READ_UINT8(a))
#define QT_FP32(a) ((GST_READ_UINT32_BE(a))/65536.0)
+#define QT_SFP32(a) (((gint)(GST_READ_UINT32_BE(a)))/65536.0)
#define QT_FP16(a) ((GST_READ_UINT16_BE(a))/256.0)
#define QT_FOURCC(a) (GST_READ_UINT32_LE(a))
#define QT_UINT64(a) ((((guint64)QT_UINT32(a))<<32)|QT_UINT32(((guint8 *)a)+4))