typefinding: add typefinder for WAP WBMP bitmaps
authorTim-Philipp Müller <tim.muller@collabora.co.uk>
Wed, 1 Jun 2011 23:55:41 +0000 (00:55 +0100)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Thu, 2 Jun 2011 13:36:06 +0000 (14:36 +0100)
https://bugzilla.gnome.org/show_bug.cgi?id=651294

gst/typefind/gsttypefindfunctions.c

index 98dbade..55152e8 100644 (file)
@@ -4007,6 +4007,61 @@ windows_icon_typefind (GstTypeFind * find, gpointer user_data)
       "image/x-icon", NULL);
 }
 
+/*** WAP WBMP typefinder ***/
+
+static void
+wbmp_typefind (GstTypeFind * find, gpointer user_data)
+{
+  guint8 *data;
+  gint64 datalen;
+  guint w, h, size;
+
+  /* http://en.wikipedia.org/wiki/Wireless_Application_Protocol_Bitmap_Format */
+  datalen = gst_type_find_get_length (find);
+  if (datalen == 0)
+    return;
+
+  data = gst_type_find_peek (find, 0, 5);
+  if (data == NULL)
+    return;
+
+  /* want 0x00 0x00 at start */
+  if (*data++ != 0 || *data++ != 0)
+    return;
+
+  /* min header size */
+  size = 4;
+
+  /* let's assume max width/height is 65536 */
+  w = *data++;
+  if ((w & 0x80)) {
+    w = (w << 8) | *data++;
+    if ((w & 0x80))
+      return;
+    ++size;
+    data = gst_type_find_peek (find, 4, 2);
+    if (data == NULL)
+      return;
+  }
+  h = *data++;
+  if ((h & 0x80)) {
+    h = (h << 8) | *data++;
+    if ((h & 0x80))
+      return;
+    ++size;
+  }
+
+  if (w == 0 || h == 0)
+    return;
+
+  /* now add bitmap size */
+  size += h * (GST_ROUND_UP_8 (w) / 8);
+
+  if (datalen == size) {
+    gst_type_find_suggest_simple (find, GST_TYPE_FIND_POSSIBLE - 10,
+        "image/vnd.wap.wbmp", NULL);
+  }
+}
 
 /*** DEGAS Atari images (also to avoid false positives, see #625129) ***/
 static void
@@ -4522,6 +4577,8 @@ plugin_init (GstPlugin * plugin)
   TYPE_FIND_REGISTER_START_WITH (plugin, "image/vnd.adobe.photoshop",
       GST_RANK_SECONDARY, psd_exts, "8BPS\000\001\000\000\000\000", 10,
       GST_TYPE_FIND_LIKELY);
+  TYPE_FIND_REGISTER (plugin, "image/vnd.wap.wbmp", GST_RANK_MARGINAL,
+      wbmp_typefind, NULL, NULL, NULL, NULL);
   TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-yuv4mpeg",
       GST_RANK_SECONDARY, y4m_exts, "YUV4MPEG2 ", 10, GST_TYPE_FIND_LIKELY);
   TYPE_FIND_REGISTER (plugin, "image/x-icon", GST_RANK_MARGINAL,