diff options
author | Tim-Philipp Müller <tim@centricular.net> | 2006-12-11 17:33:26 +0000 |
---|---|---|
committer | Tim-Philipp Müller <tim@centricular.net> | 2006-12-11 17:33:26 +0000 |
commit | 81c7f2c4a7794707e9db9bcb5d67633150e06b49 (patch) | |
tree | ef6c9b70610b833ea5abbae9e01a22fd7b5dee38 /gst | |
parent | 0d3b023699640dc2866a2edba8c910ddf54c290e (diff) |
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.
Diffstat (limited to 'gst')
-rw-r--r-- | gst/qtdemux/qtdemux.c | 31 |
1 files changed, 28 insertions, 3 deletions
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 */ |