From d10a7b439b1dfe84be0c3c4f3e8823ceac002765 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim-Philipp=20M=C3=BCller?= Date: Thu, 2 Jun 2011 00:55:41 +0100 Subject: [PATCH] typefinding: add typefinder for WAP WBMP bitmaps https://bugzilla.gnome.org/show_bug.cgi?id=651294 --- gst/typefind/gsttypefindfunctions.c | 57 +++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c index 98dbade0f5..55152e8e3e 100644 --- a/gst/typefind/gsttypefindfunctions.c +++ b/gst/typefind/gsttypefindfunctions.c @@ -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,