typefindfunctions: only typefind text with a BOM as text/utf16 or text/utf32
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 9 Dec 2011 01:31:20 +0000 (01:31 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Fri, 9 Dec 2011 01:33:58 +0000 (01:33 +0000)
We added the utf typefinder because the mp3 typefinder was a tad
overzealous when it came to typefinding things as mp3, and replaced
it with even more overzealous utf16/32 typefinders.

Fixes unit test.

gst/typefind/gsttypefindfunctions.c

index d7541f47ccdc6dcdc358a31ac18b3f8aa2e845e0..27823b64bf05333323afca54d8bc916fcb1c2dfc 100644 (file)
@@ -281,7 +281,7 @@ check_utf32 (const guint8 * data, gint len, gint endianness)
 
 static void
 unicode_type_find (GstTypeFind * tf, const GstUnicodeTester * tester,
-    guint n_tester, const char *media_type)
+    guint n_tester, const char *media_type, gboolean require_bom)
 {
   size_t n;
   gint len = 4;
@@ -313,6 +313,8 @@ unicode_type_find (GstTypeFind * tf, const GstUnicodeTester * tester,
       if (!memcmp (data, tester[n].bom, tester[n].bomlen))
         bom_boost = tester[n].boost;
     }
+    if (require_bom && bom_boost == 0)
+      continue;
     if (!(*tester[n].checker) (data, len, tester[n].endianness))
       continue;
     tmpprob = GST_TYPE_FIND_POSSIBLE - 20 + bom_boost;
@@ -342,7 +344,7 @@ utf16_type_find (GstTypeFind * tf, gpointer unused)
     {2, "\xfe\xff", check_utf16, 20, G_BIG_ENDIAN},
   };
   unicode_type_find (tf, utf16tester, G_N_ELEMENTS (utf16tester),
-      "text/utf-16");
+      "text/utf-16", TRUE);
 }
 
 static GstStaticCaps utf32_caps = GST_STATIC_CAPS ("text/utf-32");
@@ -357,7 +359,7 @@ utf32_type_find (GstTypeFind * tf, gpointer unused)
     {4, "\x00\x00\xfe\xff", check_utf32, 20, G_BIG_ENDIAN}
   };
   unicode_type_find (tf, utf32tester, G_N_ELEMENTS (utf32tester),
-      "text/utf-32");
+      "text/utf-32", TRUE);
 }
 
 /*** text/uri-list ***/