From: Arnaud Vrac <avrac@freebox.fr>
Date: Fri, 11 Jan 2013 18:18:54 +0100
Subject: qtdemux: parse TKHD transformation matrix


diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -6598,12 +6598,32 @@ qtdemux_parse_trak (GstQTDemux * qtdemux, GNode * trak)
 
   if (stream->subtype == FOURCC_vide) {
     guint32 w = 0, h = 0;
+    gfloat matrix[9];
+    gint i;
 
     stream->sampled = TRUE;
 
     /* version 1 uses some 64-bit ints */
-    if (!gst_byte_reader_skip (&tkhd, 56 + value_size)
-        || !gst_byte_reader_get_uint32_be (&tkhd, &w)
+    if (gst_byte_reader_skip (&tkhd, 20 + value_size)) {
+      for (i = 0; i < 9; i++) {
+        guint32 fx;
+
+        gst_byte_reader_get_uint32_be (&tkhd, &fx);
+        if ((i + 1) % 3 == 0)
+          matrix[i] = ((gint32) fx >> 30) +
+              ((gfloat) (fx & 0x3fffffff)) / (1U << 30);
+        else
+          matrix[i] = ((gint32) fx >> 16) +
+              ((gfloat) (fx & 0xffff)) / (1U << 16);
+      }
+
+      GST_DEBUG_OBJECT (qtdemux, "TKHD matrix %.2f, %.2f, %.2f | "
+          "%.2f, %.2f, %.2f | %.2f, %.2f, %.2f",
+          matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5],
+          matrix[6], matrix[7], matrix[8]);
+    }
+
+    if (!gst_byte_reader_get_uint32_be (&tkhd, &w)
         || !gst_byte_reader_get_uint32_be (&tkhd, &h))
       goto corrupt_file;
 
