From e7ae77b8ed52039e9f17c15caaa7da224764fa67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Mon, 11 Dec 2006 17:33:26 +0000 Subject: gst/qtdemux/qtdemux.c: Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes... Original commit message from CVS: * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): Fix non-working redirects from inetfilm.com (handle 'alis' reference data type as well). Fixes #378613. --- ChangeLog | 6 ++++++ gst/qtdemux/qtdemux.c | 31 ++++++++++++++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 111a5eed..54595866 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2006-12-11 Tim-Philipp Müller + + * gst/qtdemux/qtdemux.c: (qtdemux_parse_tree): + Fix non-working redirects from inetfilm.com (handle 'alis' reference + data type as well). Fixes #378613. + 2006-12-11 Wim Taymans Patch by: Jonathan Matthew ). diff --git a/gst/qtdemux/qtdemux.c b/gst/qtdemux/qtdemux.c index 77493980..c4ffb99f 100644 --- a/gst/qtdemux/qtdemux.c +++ b/gst/qtdemux/qtdemux.c @@ -3134,9 +3134,34 @@ qtdemux_parse_tree (GstQTDemux * qtdemux) rdrf = qtdemux_tree_get_child_by_type (rmda, FOURCC_rdrf); if (rdrf) { - ref.location = g_strdup ((gchar *) rdrf->data + 20); - GST_LOG ("New location: %s", ref.location); - redirects = g_list_prepend (redirects, g_memdup (&ref, sizeof (ref))); + guint32 ref_type; + guint8 *ref_data; + + ref_type = GST_READ_UINT32_LE ((guint8 *) rdrf->data + 12); + ref_data = (guint8 *) rdrf->data + 20; + if (ref_type == GST_MAKE_FOURCC ('a', 'l', 'i', 's')) { + guint record_len, record_version, fn_len; + + /* MacOSX alias record, google for alias-layout.txt */ + record_len = GST_READ_UINT16_BE (ref_data + 4); + record_version = GST_READ_UINT16_BE (ref_data + 4 + 2); + fn_len = GST_READ_UINT8 (ref_data + 50); + if (record_len > 50 && record_version == 2 && fn_len > 0) { + ref.location = g_strndup ((gchar *) ref_data + 51, fn_len); + } + } else if (ref_type == GST_MAKE_FOURCC ('u', 'r', 'l', ' ')) { + ref.location = g_strdup ((gchar *) ref_data); + } else { + GST_DEBUG ("unknown rdrf reference type %" GST_FOURCC_FORMAT, + GST_FOURCC_ARGS (ref_type)); + } + if (ref.location != NULL) { + GST_INFO ("New location: %s", ref.location); + redirects = + g_list_prepend (redirects, g_memdup (&ref, sizeof (ref))); + } else { + GST_WARNING ("Failed to extract redirect location from rdrf atom"); + } } /* look for others */ -- cgit v1.2.1