Index: gst/isomp4/qtdemux_types.c
===================================================================
--- gst/isomp4/qtdemux_types.c	(révision 11780)
+++ gst/isomp4/qtdemux_types.c	(révision 11790)
@@ -171,6 +171,7 @@
       qtdemux_dump_mehd},
   {FOURCC_ovc1, "ovc1", 0},
   {FOURCC_owma, "owma", 0},
+  {FOURCC_tfdt, "Track fragment decode time", 0, qtdemux_dump_tfdt},
   {0, "unknown", 0,},
 };
 
Index: gst/isomp4/qtdemux_dump.c
===================================================================
--- gst/isomp4/qtdemux_dump.c	(révision 11780)
+++ gst/isomp4/qtdemux_dump.c	(révision 11790)
@@ -721,6 +721,28 @@
 }
 
 gboolean
+qtdemux_dump_tfdt (GstQTDemux * qtdemux, GstByteReader * data, int depth)
+{
+  guint32 version = 0;
+  guint64 decode_time;
+  guint value_size;
+
+  if (!gst_byte_reader_get_uint32_be (data, &version))
+    return FALSE;
+
+  GST_LOG ("%*s  version/flags: %08x", depth, "", version);
+
+  value_size = ((version >> 24) == 1) ? sizeof (guint64) : sizeof (guint32);
+  if (qt_atom_parser_get_offset (data, value_size, &decode_time)) {
+    GST_LOG ("%*s  Track fragment decode time: %" G_GUINT64_FORMAT,
+        depth, "", decode_time);
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
+gboolean
 qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data, int depth)
 {
   guint32 version;
Index: gst/isomp4/qtdemux_dump.h
===================================================================
--- gst/isomp4/qtdemux_dump.h	(révision 11780)
+++ gst/isomp4/qtdemux_dump.h	(révision 11790)
@@ -75,6 +75,8 @@
     int depth);
 gboolean qtdemux_dump_sdtp (GstQTDemux * qtdemux, GstByteReader * data,
     int depth);
+gboolean qtdemux_dump_tfdt (GstQTDemux * qtdemux, GstByteReader * data,
+    int depth);
 gboolean qtdemux_dump_unknown (GstQTDemux * qtdemux, GstByteReader * data,
     int depth);
 
Index: gst/isomp4/qtdemux.c
===================================================================
--- gst/isomp4/qtdemux.c	(révision 11780)
+++ gst/isomp4/qtdemux.c	(révision 11790)
@@ -2098,7 +2098,7 @@
 qtdemux_parse_trun (GstQTDemux * qtdemux, GstByteReader * trun,
     QtDemuxStream * stream, guint32 d_sample_duration, guint32 d_sample_size,
     guint32 d_sample_flags, gint64 moof_offset, gint64 moof_length,
-    gint64 * base_offset, gint64 * running_offset)
+    gint64 * base_offset, gint64 * running_offset, gint64 decode_time)
 {
   guint64 timestamp;
   gint32 data_offset = 0;
@@ -2220,7 +2220,7 @@
   if (G_UNLIKELY (stream->n_samples == 0)) {
     /* the timestamp of the first sample is also provided by the tfra entry
      * but we shouldn't rely on it as it is at the end of files */
-    timestamp = 0;
+    timestamp = decode_time;
   } else {
     /* subsequent fragments extend stream */
     timestamp =
@@ -2389,13 +2389,46 @@
 }
 
 static gboolean
+qtdemux_parse_tfdt (GstQTDemux * qtdemux, GstByteReader * br,
+    guint64 * decode_time)
+{
+  guint32 version = 0;
+
+  if (!gst_byte_reader_get_uint32_be (br, &version))
+    return FALSE;
+
+  version >>= 24;
+  if (version == 1) {
+    if (!gst_byte_reader_get_uint64_be (br, decode_time))
+      goto failed;
+  } else {
+    guint32 dec_time = 0;
+    if (!gst_byte_reader_get_uint32_be (br, &dec_time))
+      goto failed;
+    *decode_time = dec_time;
+  }
+
+  GST_INFO_OBJECT (qtdemux, "Track fragment decode time: %" G_GUINT64_FORMAT,
+      *decode_time);
+
+  return TRUE;
+
+failed:
+  {
+    GST_DEBUG_OBJECT (qtdemux, "parsing tfdt failed");
+    return FALSE;
+  }
+}
+
+static gboolean
 qtdemux_parse_moof (GstQTDemux * qtdemux, const guint8 * buffer, guint length,
     guint64 moof_offset, QtDemuxStream * stream)
 {
-  GNode *moof_node, *traf_node, *tfhd_node, *trun_node;
-  GstByteReader trun_data, tfhd_data;
+  GNode *moof_node, *traf_node, *tfhd_node, *trun_node, *tfdt_node;
+  GstByteReader trun_data, tfhd_data, tfdt_data;
   guint32 ds_size = 0, ds_duration = 0, ds_flags = 0;
   gint64 base_offset, running_offset;
+  guint64 decode_time = 0;
 
   /* NOTE @stream ignored */
 
@@ -2416,6 +2449,13 @@
     if (!qtdemux_parse_tfhd (qtdemux, &tfhd_data, &stream, &ds_duration,
             &ds_size, &ds_flags, &base_offset))
       goto missing_tfhd;
+    tfdt_node =
+        qtdemux_tree_get_child_by_type_full (traf_node, FOURCC_tfdt,
+        &tfdt_data);
+    if (tfdt_node) {
+      qtdemux_parse_tfdt (qtdemux, &tfdt_data, &decode_time);
+    }
+
     if (G_UNLIKELY (!stream)) {
       /* we lost track of offset, we'll need to regain it,
        * but can delay complaining until later or avoid doing so altogether */
@@ -2431,7 +2471,7 @@
     while (trun_node) {
       qtdemux_parse_trun (qtdemux, &trun_data, stream,
           ds_duration, ds_size, ds_flags, moof_offset, length, &base_offset,
-          &running_offset);
+          &running_offset, decode_time);
       /* iterate all siblings */
       trun_node = qtdemux_tree_get_sibling_by_type_full (trun_node, FOURCC_trun,
           &trun_data);
Index: gst/isomp4/qtdemux_fourcc.h
===================================================================
--- gst/isomp4/qtdemux_fourcc.h	(révision 11780)
+++ gst/isomp4/qtdemux_fourcc.h	(révision 11790)
@@ -230,6 +230,9 @@
 #define FOURCC_ovc1     GST_MAKE_FOURCC('o','v','c','1')
 #define FOURCC_owma     GST_MAKE_FOURCC('o','w','m','a')
 
+/* MPEG DASH */
+#define FOURCC_tfdt     GST_MAKE_FOURCC('t','f','d','t')
+
 G_END_DECLS
 
 #endif /* __GST_QTDEMUX_FOURCC_H__ */
