From 2f97f23897aa416ee783060685147b8373338b0a Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Wed, 11 Apr 2007 09:53:38 +0000 Subject: gst/qtdemux/: Handle version 1 mdhd atoms to get extended precision durations. Original commit message from CVS: * gst/qtdemux/qtdemux.c: (gst_qtdemux_get_duration), (qtdemux_parse_samples), (qtdemux_parse_segments), (qtdemux_parse_trak), (qtdemux_parse_tree): * gst/qtdemux/qtdemux_dump.c: (qtdemux_dump_mdhd): Handle version 1 mdhd atoms to get extended precision durations. Fixes #426972. --- gst/qtdemux/qtdemux_dump.c | 36 +++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) (limited to 'gst/qtdemux/qtdemux_dump.c') diff --git a/gst/qtdemux/qtdemux_dump.c b/gst/qtdemux/qtdemux_dump.c index 357a5b15..391d67a0 100644 --- a/gst/qtdemux/qtdemux_dump.c +++ b/gst/qtdemux/qtdemux_dump.c @@ -83,14 +83,36 @@ qtdemux_dump_elst (GstQTDemux * qtdemux, guint8 * buffer, int depth) void qtdemux_dump_mdhd (GstQTDemux * qtdemux, guint8 * buffer, int depth) { - GST_LOG ("%*s version/flags: %08x", depth, "", QT_UINT32 (buffer + 8)); - GST_LOG ("%*s creation time: %u", depth, "", QT_UINT32 (buffer + 12)); - GST_LOG ("%*s modify time: %u", depth, "", QT_UINT32 (buffer + 16)); - GST_LOG ("%*s time scale: 1/%u sec", depth, "", QT_UINT32 (buffer + 20)); - GST_LOG ("%*s duration: %u", depth, "", QT_UINT32 (buffer + 24)); - GST_LOG ("%*s language: %u", depth, "", QT_UINT16 (buffer + 28)); - GST_LOG ("%*s quality: %u", depth, "", QT_UINT16 (buffer + 30)); + guint32 version; + guint64 duration, ctime, mtime; + guint32 time_scale; + guint16 language, quality; + + version = QT_UINT32 (buffer + 8); + GST_LOG ("%*s version/flags: %08x", depth, "", version); + + if (version == 0x01000000) { + ctime = QT_UINT64 (buffer + 12); + mtime = QT_UINT64 (buffer + 20); + time_scale = QT_UINT32 (buffer + 28); + duration = QT_UINT64 (buffer + 32); + language = QT_UINT16 (buffer + 40); + quality = QT_UINT16 (buffer + 42); + } else { + ctime = QT_UINT32 (buffer + 12); + mtime = QT_UINT32 (buffer + 16); + time_scale = QT_UINT32 (buffer + 20); + duration = QT_UINT32 (buffer + 24); + language = QT_UINT16 (buffer + 28); + quality = QT_UINT16 (buffer + 30); + } + GST_LOG ("%*s creation time: %" G_GUINT64_FORMAT, depth, "", ctime); + GST_LOG ("%*s modify time: %" G_GUINT64_FORMAT, depth, "", mtime); + GST_LOG ("%*s time scale: 1/%u sec", depth, "", time_scale); + GST_LOG ("%*s duration: %" G_GUINT64_FORMAT, depth, "", duration); + GST_LOG ("%*s language: %u", depth, "", language); + GST_LOG ("%*s quality: %u", depth, "", quality); } void -- cgit