From: Benjamin Otte Date: Fri, 14 Nov 2003 22:12:56 +0000 (+0000) Subject: unify common typefind functions X-Git-Tag: 1.19.3~511^2~15096 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e410f1a47b630699f2dae48f74a94bfb50231da0;p=platform%2Fupstream%2Fgstreamer.git unify common typefind functions Original commit message from CVS: unify common typefind functions There are now _START_WITH and _RIFF macros to register types that start with some bytes or are a RIFF type. Implement detection of compressed types (compress, gzip, bzip2) with those --- diff --git a/gst/typefind/gsttypefindfunctions.c b/gst/typefind/gsttypefindfunctions.c index 468b3b0..0864997 100644 --- a/gst/typefind/gsttypefindfunctions.c +++ b/gst/typefind/gsttypefindfunctions.c @@ -36,65 +36,6 @@ GST_DEBUG_CATEGORY_STATIC (type_find_debug); #define GST_CAT_DEFAULT type_find_debug -/*** video/x-ms-asf ***********************************************************/ - -#define ASF_CAPS gst_caps_new ("asf_type_find", "video/x-ms-asf", NULL) -static void -asf_type_find (GstTypeFind *tf, gpointer unused) -{ - static guint8 header_guid[16] = - {0x30, 0x26, 0xB2, 0x75, 0x8E, 0x66, 0xCF, 0x11, - 0xA6, 0xD9, 0x00, 0xAA, 0x00, 0x62, 0xCE, 0x6C}; - guint8 *data = gst_type_find_peek (tf, 0, 16); - - if (data && memcmp (data, header_guid, 16) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, ASF_CAPS); - } -} - -/*** audio/x-au ***************************************************************/ - -#define AU_CAPS gst_caps_new ("au_type_find", "audio/x-au", NULL) -static void -au_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, ".snd", 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, AU_CAPS); - } -}; - -/*** video/avi ****************************************************************/ - -#define AVI_CAPS GST_CAPS_NEW ("avi_type_find", "video/avi", NULL) -static void -avi_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 12); - - if (data && memcmp (data, "RIFF", 4) == 0) { - data += 8; - if (memcmp (data, "AVI ", 4) == 0) - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, AVI_CAPS); - } -} - -/*** video/x-cdxa ****************************************************************/ - -#define CDXA_CAPS GST_CAPS_NEW ("cdxa_type_find", "video/x-cdxa", NULL) -static void -cdxa_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, "RIFF", 4) == 0) { - data += 8; - if (memcmp (data, "CDXA", 4) == 0) - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, CDXA_CAPS); - } -} - /*** text/plain ****************************************************************/ #define UTF8_CAPS GST_CAPS_NEW ("cdxa_type_find", "text/plain", NULL) @@ -666,34 +607,6 @@ qt_type_find (GstTypeFind *tf, gpointer unused) } }; -/*** application/vnd.rn-realmedia *********************************************/ - -#define RM_CAPS gst_caps_new ("realmedia_type_find", "application/vnd.rn-realmedia", NULL) -static void -rm_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, ".RMF", 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, RM_CAPS); - } -} - -/*** audio/x-wav ****************************************************************/ - -#define WAV_CAPS GST_CAPS_NEW ("wav_type_find", "audio/x-wav", NULL) -static void -wav_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 12); - - if (data && memcmp (data, "RIFF", 4) == 0) { - data += 8; - if (memcmp (data, "WAVE", 4) == 0) - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, WAV_CAPS); - } -} - /*** audio/x-aiff *********************************************/ #define AIFF_CAPS GST_CAPS_NEW ("aiff_type_find", "audio/x-aiff", NULL) @@ -839,19 +752,6 @@ mod_type_find (GstTypeFind *tf, gpointer unused) } } -/*** audio/x-flac *************************************************************/ - -#define FLAC_CAPS gst_caps_new ("flac_type_find", "audio/x-flac", NULL) -static void -flac_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, "fLaC", 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FLAC_CAPS); - } -}; - /*** application/x-shockwave-flash ********************************************/ #define SWF_CAPS gst_caps_new ("swf_type_find", "application/x-shockwave-flash", NULL) @@ -866,19 +766,6 @@ swf_type_find (GstTypeFind *tf, gpointer unused) } } -/*** application/ogg **********************************************************/ - -#define OGG_CAPS gst_caps_new ("ogg_type_find", "application/ogg", NULL) -static void -ogg_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, "OggS", 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, OGG_CAPS); - } -} - /*** image/jpeg ***************************************************************/ #define JPEG_CAPS gst_caps_new ("jpeg_type_find", "image/jpeg", NULL) @@ -899,63 +786,6 @@ jpeg_type_find (GstTypeFind *tf, gpointer unused) } } -/*** image/gif *********************/ -#define GIF_CAPS gst_caps_new ("gif_type_find", "image/gif", NULL) -static void -gif_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - - if (data && memcmp (data, "GIF8", 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, GIF_CAPS); - } -} - -/*** image/png ********************/ -#define PNG_CAPS gst_caps_new ("png_type_find", "image/png", NULL) -static void -png_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 8); - guint8 header[4] = {0x0D,0x0A, 0x1A, 0x0A}; - - if (data && (data[0] == 0x89) && memcmp (data + 1, "PNG", 3) == 0) { - if (memcmp (data + 4, header, 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, PNG_CAPS); - } - } -} - -/*** video/x-mng *******************/ -#define MNG_CAPS gst_caps_new ("mng_type_find", "video/x-mng", NULL) -static void -mng_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 8); - guint8 header[4] = {0x0D, 0x0A, 0x1A, 0x0A}; - - if (data && (data[0] == 0x8A) && memcmp (data + 1, "MNG", 3) == 0) { - if (memcmp (data + 4, header, 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MNG_CAPS); - } - } -} - -/*** image/x-jng *********************/ -#define JNG_CAPS gst_caps_new ("jng_type_find", "image/x-jng", NULL) -static void -jng_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 8); - guint8 header[4] = {0x0D, 0x0A, 0x1A, 0x0A}; - - if (data && (data[0] == 0x8B) && memcmp (data + 1, "JNG", 3) == 0) { - if (memcmp (data + 4, header, 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, JNG_CAPS); - } - } -} - /*** image/bmp *********************/ #define BMP_CAPS gst_caps_new ("bmp_type_find", "image/bmp", NULL) static void @@ -998,57 +828,6 @@ tiff_type_find (GstTypeFind *tf, gpointer ununsed) } } -/*** image/x-xcf *****************/ -#define XCF_CAPS GST_CAPS_NEW ("xcf_type_find", "image/x-xcf", NULL) -static void -xcf_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 8); - - if (data && memcmp (data, "gimp xcf", 8) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, XCF_CAPS); - } -} - -/*** image/x-xpixmap ***************/ -#define XPM_CAPS GST_CAPS_NEW ("xpm_type_find", "image/x-xpixmap", NULL) -static void -xpm_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 9); - - if (data && memcmp (data, "/* XPM */", 9) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, XPM_CAPS); - } -} - -#define RAS_CAPS GST_CAPS_NEW ("ras_type_find", "image/x-sun-raster", NULL) -static void -ras_type_find (GstTypeFind *tf, gpointer unused) -{ - guint8 *data = gst_type_find_peek (tf, 0, 4); - guint8 header[4] = {0x59, 0xA6, 0x6A, 0x95}; - - if (data && memcmp (data, header, 4) == 0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, RAS_CAPS); - } -} - -/*** video/x-matroska *********************************************************/ - -#define MATROSKA_CAPS gst_caps_new ("matroska_type", "video/x-matroska", NULL) -static void -matroska_type_find (GstTypeFind *tf, gpointer priv) -{ - static guint8 header[16] = { 0x1A, 0x45, 0xDF, 0xA3, 0x93, 0x42, 0x82, 0x88, - 'm', 'a', 't', 'r', 'o', 's', 'k', 'a' }; - guint8 *data = gst_type_find_peek (tf, 0, 16); - - if (data && !memcmp(data, header, 16)) { - gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, MATROSKA_CAPS); - } -} - /*** video/x-dv ***************************************************************/ #define DV_CAPS GST_CAPS_NEW ("dv_type_find", "video/x-dv", \ @@ -1078,19 +857,62 @@ dv_type_find (GstTypeFind *tf, gpointer private) } } -/*** video/x-dv ***************************************************************/ +/*** generic typefind for streams that have some data at a specific position***/ -#define SID_CAPS GST_CAPS_NEW ("sid_typefind", "audio/x-sid", NULL) +typedef struct { + guint8 * data; + guint size; + guint probability; + GstCaps * caps; +} GstTypeFindData; static void -sid_type_find (GstTypeFind *tf, gpointer private) +start_with_type_find (GstTypeFind *tf, gpointer private) { + GstTypeFindData *start_with = (GstTypeFindData *) private; guint8 *data; - data = gst_type_find_peek (tf, 0, 4); - if (data && memcmp (data, "PSID", 4)==0) { - gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, SID_CAPS); + GST_LOG ("trying to find mime type %s with the first %u bytes of data", + gst_caps_get_mime (start_with->caps), start_with->size); + data = gst_type_find_peek (tf, 0, start_with->size); + if (data && memcmp (data, start_with->data, start_with->size)==0) { + gst_type_find_suggest (tf, start_with->probability, start_with->caps); } } +#define TYPE_FIND_REGISTER_START_WITH(plugin,name,rank,ext,_data,_size,_probability)\ +G_BEGIN_DECLS{ \ + GstTypeFindData *sw_data = g_new (GstTypeFindData, 1); \ + sw_data->data = _data; \ + sw_data->size = _size; \ + sw_data->probability = _probability; \ + sw_data->caps = gst_caps_new ("start_with_caps", name, NULL); \ + TYPE_FIND_REGISTER (plugin, name, rank, start_with_type_find, \ + ext, sw_data->caps, sw_data); \ +}G_END_DECLS + +/*** same for riff types ******************************************************/ + +static void +riff_type_find (GstTypeFind *tf, gpointer private) +{ + GstTypeFindData *riff_data = (GstTypeFindData *) private; + guint8 *data = gst_type_find_peek (tf, 0, 12); + + if (data && memcmp (data, "RIFF", 4) == 0) { + data += 8; + if (memcmp (data, riff_data->data, 4) == 0) + gst_type_find_suggest (tf, riff_data->probability, riff_data->caps); + } +} +#define TYPE_FIND_REGISTER_RIFF(plugin,name,rank,ext,_data) \ +G_BEGIN_DECLS{ \ + GstTypeFindData *sw_data = g_new (GstTypeFindData, 1); \ + sw_data->data = _data; \ + sw_data->size = 4; \ + sw_data->probability = GST_TYPE_FIND_MAXIMUM; \ + sw_data->caps = gst_caps_new ("riff_caps", name, NULL); \ + TYPE_FIND_REGISTER (plugin, name, rank, riff_type_find, \ + ext, sw_data->caps, sw_data); \ +}G_END_DECLS /*** plugin initialization ****************************************************/ @@ -1139,19 +961,23 @@ plugin_init (GstPlugin *plugin) static gchar * jng_exts[] = {"jng", NULL}; static gchar * xpm_exts[] = {"xpm", NULL}; static gchar * ras_exts[] = {"ras", NULL}; + static gchar * bz2_exts[] = {"bz2", NULL}; + static gchar * gz_exts[] = {"gz", NULL}; + static gchar * zip_exts[] = {"zip", NULL}; + static gchar * compress_exts[] = {"Z", NULL}; GST_DEBUG_CATEGORY_INIT (type_find_debug, "typefindfunctions", GST_DEBUG_FG_GREEN | GST_DEBUG_BG_RED, "generic type find functions"); - TYPE_FIND_REGISTER (plugin, "video/x-ms-asf", GST_RANK_SECONDARY, - asf_type_find, asf_exts, ASF_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "audio/x-au", GST_RANK_MARGINAL, - au_type_find, au_exts, AU_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "video/avi", GST_RANK_PRIMARY, - avi_type_find, avi_exts, AVI_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "video/x-cdxa", GST_RANK_SECONDARY, - cdxa_type_find, cdxa_exts, CDXA_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "audio/x-flac", GST_RANK_PRIMARY, - flac_type_find, flac_exts, FLAC_CAPS, NULL); + /* must use strings, macros don't accept initializers */ + TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-ms-asf", GST_RANK_SECONDARY, asf_exts, + "\060\046\262\165\216\146\317\021\246\331\000\252\000\142\316\154", + 16, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-au", GST_RANK_MARGINAL, au_exts, + ".snd", 4, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_RIFF (plugin, "video/avi", GST_RANK_PRIMARY, avi_exts, "AVI "); + TYPE_FIND_REGISTER_RIFF (plugin, "video/x-cdxa", GST_RANK_SECONDARY, cdxa_exts, "CDXA"); + TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-flac", GST_RANK_PRIMARY, + flac_exts, "fLaC", 4, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER (plugin, "video/x-fli", GST_RANK_MARGINAL, flx_type_find, flx_exts, FLX_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "application/x-id3", GST_RANK_PRIMARY, @@ -1164,52 +990,59 @@ plugin_init (GstPlugin *plugin) mpeg1_sys_type_find, mpeg_sys_exts, MPEG_SYS_CAPS (1), NULL); TYPE_FIND_REGISTER (plugin, "video/mpeg2", GST_RANK_SECONDARY, mpeg2_sys_type_find, mpeg_sys_exts, MPEG_SYS_CAPS (2), NULL); - TYPE_FIND_REGISTER (plugin, "application/ogg", GST_RANK_PRIMARY, - ogg_type_find, ogg_exts, OGG_CAPS, NULL); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/ogg", GST_RANK_PRIMARY, + ogg_exts, "OggS", 4, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER (plugin, "video/mpeg", GST_RANK_SECONDARY, mpeg_video_type_find, mpeg_video_exts, MPEG_VIDEO_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "video/quicktime", GST_RANK_SECONDARY, qt_type_find, qt_exts, QT_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "application/vnd.rn-realmedia", GST_RANK_SECONDARY, - rm_type_find, rm_exts, RM_CAPS, NULL); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/vnd.rn-realmedia", GST_RANK_SECONDARY, + rm_exts, ".RMF", 4, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER (plugin, "application/x-shockwave-flash", GST_RANK_SECONDARY, swf_type_find, swf_exts, SWF_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "text/plain", GST_RANK_MARGINAL, utf8_type_find, utf8_exts, UTF8_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "text/uri-list", GST_RANK_MARGINAL, uri_type_find, uri_exts, URI_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "audio/x-wav", GST_RANK_PRIMARY, - wav_type_find, wav_exts, WAV_CAPS, NULL); + TYPE_FIND_REGISTER_RIFF (plugin, "audio/x-wav", GST_RANK_PRIMARY, wav_exts, "WAVE"); TYPE_FIND_REGISTER (plugin, "audio/x-aiff", GST_RANK_SECONDARY, aiff_type_find, aiff_exts, AIFF_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "audio/x-shorten", GST_RANK_SECONDARY, shn_type_find, shn_exts, SHN_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "image/jpeg", GST_RANK_PRIMARY, jpeg_type_find, jpeg_exts, JPEG_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/gif", GST_RANK_PRIMARY, - gif_type_find, gif_exts, GIF_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/png", GST_RANK_PRIMARY, - png_type_find, png_exts, PNG_CAPS, NULL); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/gif", GST_RANK_PRIMARY, + gif_exts, "GIF8", 4, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/png", GST_RANK_PRIMARY, + png_exts, "\211PNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER (plugin, "image/bmp", GST_RANK_PRIMARY, bmp_type_find, bmp_exts, BMP_CAPS, NULL); TYPE_FIND_REGISTER (plugin, "image/tiff", GST_RANK_PRIMARY, tiff_type_find, tiff_exts, TIFF_CAPS(0), NULL); - TYPE_FIND_REGISTER (plugin, "video/x-matroska", GST_RANK_SECONDARY, - matroska_type_find, matroska_exts, MATROSKA_CAPS, NULL); + TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-matroska", GST_RANK_SECONDARY, + matroska_exts, "\032\105\337\243\223\102\202\210matroska", 16, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER (plugin, "video/x-dv", GST_RANK_SECONDARY, dv_type_find, dv_exts, DV_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "video/x-sid", GST_RANK_MARGINAL, - sid_type_find, sid_exts, SID_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/x-xcf", GST_RANK_SECONDARY, - xcf_type_find, xcf_exts, XCF_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "video/x-mng", GST_RANK_SECONDARY, - mng_type_find, mng_exts, MNG_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/x-jng", GST_RANK_SECONDARY, - jng_type_find, jng_exts, JNG_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/x-xpixmap", GST_RANK_SECONDARY, - xpm_type_find, xpm_exts, XPM_CAPS, NULL); - TYPE_FIND_REGISTER (plugin, "image/x-sun-raster", GST_RANK_SECONDARY, - ras_type_find, ras_exts, RAS_CAPS, NULL); + TYPE_FIND_REGISTER_START_WITH (plugin, "audio/x-sid", GST_RANK_MARGINAL, + sid_exts, "PSID", 4, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-xcf", GST_RANK_SECONDARY, + xcf_exts, "gimp xcf", 8, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "video/x-mng", GST_RANK_SECONDARY, + mng_exts, "\212MNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-jng", GST_RANK_SECONDARY, + jng_exts, "\213JNG\015\012\032\012", 8, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-xpixmap", GST_RANK_SECONDARY, + xpm_exts, "/* XPM */", 9, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "image/x-sun-raster", GST_RANK_SECONDARY, + ras_exts, "\131\246\152\225", 4, GST_TYPE_FIND_MAXIMUM); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-bzip", GST_RANK_SECONDARY, + bz2_exts, "BZh", 3, GST_TYPE_FIND_LIKELY); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-gzip", GST_RANK_SECONDARY, + gz_exts, "\037\213", 2, GST_TYPE_FIND_LIKELY); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/zip", GST_RANK_SECONDARY, + zip_exts, "PK\003\004", 4, GST_TYPE_FIND_LIKELY); + TYPE_FIND_REGISTER_START_WITH (plugin, "application/x-compress", GST_RANK_SECONDARY, + compress_exts, "\037\235", 2, GST_TYPE_FIND_LIKELY); return TRUE; }