typefindfunctions: UTF-8 MSS Manifest detection support

Check if the first bytes of data contain an UTF-8 BOM.

https://bugzilla.gnome.org/show_bug.cgi?id=750802
This commit is contained in:
Philippe Normand 2015-06-11 18:14:47 +02:00 committed by Sebastian Dröge
parent 9c47e7d5e6
commit d182e66bce

View File

@ -3580,6 +3580,7 @@ mss_manifest_type_find (GstTypeFind * tf, gpointer unused)
glong n_read = 0, size = 0;
guint length;
gchar *utf8;
gboolean utf8_bom_detected = FALSE;
if (xml_check_first_element (tf, "SmoothStreamingMedia", 20, TRUE)) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MSS_MANIFEST_CAPS);
@ -3595,7 +3596,9 @@ mss_manifest_type_find (GstTypeFind * tf, gpointer unused)
return;
/* look for a possible BOM */
if (data[0] == 0xFF && data[1] == 0xFE)
if (data[0] == 0xEF && data[1] == 0xBB)
utf8_bom_detected = TRUE;
else if (data[0] == 0xFF && data[1] == 0xFE)
data_endianness = G_LITTLE_ENDIAN;
else if (data[0] == 0xFE && data[1] == 0xFF)
data_endianness = G_BIG_ENDIAN;
@ -3619,6 +3622,15 @@ mss_manifest_type_find (GstTypeFind * tf, gpointer unused)
data += 2;
length -= 2;
if (utf8_bom_detected) {
/* skip last byte of the BOM */
data++;
length--;
if (xml_check_first_element_from_data (data, length,
"SmoothStreamingMedia", 20, TRUE))
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MSS_MANIFEST_CAPS);
} else {
length = GST_ROUND_DOWN_2 (length);
/* convert to native endian UTF-16 */
@ -3631,9 +3643,9 @@ mss_manifest_type_find (GstTypeFind * tf, gpointer unused)
"SmoothStreamingMedia", 20, TRUE))
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MSS_MANIFEST_CAPS);
}
g_free (utf8);
}
}
/*** image/jpeg ***/