diff --git a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctions.c b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctions.c index 805cb0a301b6..a10ef26028e8 100644 --- a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctions.c +++ b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctions.c @@ -5512,6 +5512,195 @@ tap_type_find (GstTypeFind * tf, gpointer unused) } } +/*** audio/x-brstm ***/ + +static GstStaticCaps brstm_caps = GST_STATIC_CAPS ("audio/x-brstm"); + +#define BRSTM_CAPS (gst_static_caps_get(&brstm_caps)) +static void +brstm_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 8); + + if (data) { + if (GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('R', 'S', 'T', 'M')) + return; + if (GST_READ_UINT32_LE (data + 4) != 0xfffe + && GST_READ_UINT32_LE (data + 4) != 0xfeff) + return; + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, BRSTM_CAPS); + } +} + +/*** audio/x-bfstm ***/ + +static GstStaticCaps bfstm_caps = GST_STATIC_CAPS ("audio/x-bfstm"); + +#define BFSTM_CAPS (gst_static_caps_get(&bfstm_caps)) +static void +bfstm_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 8); + + if (data) { + if (GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('F', 'S', 'T', 'M') && + GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('C', 'S', 'T', 'M')) + return; + if (GST_READ_UINT32_LE (data + 4) != 0xfffe + && GST_READ_UINT32_LE (data + 4) != 0xfeff) + return; + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, BFSTM_CAPS); + } +} + +/*** audio/x-dsf ***/ + +static GstStaticCaps dsf_caps = GST_STATIC_CAPS ("audio/x-dsf"); + +#define DSF_CAPS (gst_static_caps_get(&dsf_caps)) +static void +dsf_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 12); + + if (data) { + if (memcmp (data, "DSD ", 4) != 0) + return; + if (GST_READ_UINT64_BE (data + 4) == 28) + return; + + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, DSF_CAPS); + } +} + +/*** video/x-ea ***/ + +static GstStaticCaps ea_caps = GST_STATIC_CAPS ("video/x-ea"); + +#define EA_CAPS (gst_static_caps_get(&ea_caps)) +static void +ea_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 8); + + if (data) { + static const guint32 ea_fourccs[] = { + GST_MAKE_FOURCC ('I', 'S', 'N', 'h'), + GST_MAKE_FOURCC ('S', 'C', 'H', 'l'), + GST_MAKE_FOURCC ('S', 'E', 'A', 'D'), + GST_MAKE_FOURCC ('S', 'H', 'E', 'N'), + GST_MAKE_FOURCC ('k', 'V', 'G', 'T'), + GST_MAKE_FOURCC ('M', 'A', 'D', 'k'), + GST_MAKE_FOURCC ('M', 'P', 'C', 'h'), + GST_MAKE_FOURCC ('M', 'V', 'h', 'd'), + GST_MAKE_FOURCC ('M', 'V', 'I', 'h'), + GST_MAKE_FOURCC ('A', 'V', 'P', '6'), + }; + + guint32 fourcc = GST_READ_UINT32_LE (data); + gboolean found = FALSE; + + for (gsize i = 0; i < G_N_ELEMENTS (ea_fourccs); i++) { + if (fourcc == ea_fourccs[i]) { + found = TRUE; + break; + } + } + if (!found) + return; + + guint32 size = GST_READ_UINT32_LE (data + 4); + gboolean big_endian = size > 0x000fffff; + if (big_endian) + size = GUINT32_SWAP_LE_BE (size); + if (size > 0xfffff || size < 8) + return; + + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, EA_CAPS); + } +} + +/*** video/x-film-cpk ***/ + +static GstStaticCaps film_cpk_caps = GST_STATIC_CAPS ("video/x-film-cpk"); + +#define FILM_CPK_CAPS (gst_static_caps_get(&film_cpk_caps)) +static void +film_cpk_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 20); + + if (data) { + if (GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('F', 'I', 'L', 'M')) + return; + if (GST_READ_UINT32_LE (data + 16) != GST_MAKE_FOURCC ('F', 'D', 'S', 'C')) + return; + + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, FILM_CPK_CAPS); + } +} + +/*** application/gxf ***/ + +static GstStaticCaps gxf_caps = GST_STATIC_CAPS ("application/gxf"); + +#define GXF_CAPS (gst_static_caps_get(&gxf_caps)) +static void +gxf_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 16); + + if (data) { + if (memcmp (data, "\x00\x00\x00\x00\x01\xbc", 6) != 0) + return; + if (memcmp (data + 10, "\x00\x00\x00\x00\xe1\xe2", 6) != 0) + return; + gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, GXF_CAPS); + } +} + +/*** application/x-iff ***/ + +static GstStaticCaps iff_caps = GST_STATIC_CAPS ("application/x-iff"); + +#define IFF_CAPS (gst_static_caps_get(&iff_caps)) +static void +iff_type_find (GstTypeFind * tf, gpointer unused) +{ + const guint8 *data = gst_type_find_peek (tf, 0, 16); + + if (data) { + if (GST_READ_UINT32_LE (data) == GST_MAKE_FOURCC ('F', 'O', 'R', 'M') && + (GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('8', 'S', 'V', 'X') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('1', '6', 'S', + 'V') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('M', 'A', 'U', + 'D') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('P', 'B', 'M', + ' ') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('A', 'C', 'B', + 'M') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('D', 'E', 'E', + 'P') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('I', 'L', 'B', + 'M') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('R', 'G', 'B', + '8') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('A', 'N', 'I', + 'M') + || GST_READ_UINT32_LE (data + 8) == GST_MAKE_FOURCC ('R', 'G', 'B', + 'N'))) { + return gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, IFF_CAPS); + } + + if (GST_READ_UINT32_LE (data) == GST_MAKE_FOURCC ('F', 'R', 'M', '8') + && GST_READ_UINT32_LE (data + 12) == GST_MAKE_FOURCC ('D', 'S', 'D', + ' ')) { + return gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, IFF_CAPS); + } + } +} + /*** video/vivo ***/ static GstStaticCaps vivo_caps = GST_STATIC_CAPS ("video/vivo"); @@ -6212,3 +6401,17 @@ GST_TYPE_FIND_REGISTER_DEFINE (aa, "audio/audible", GST_RANK_MARGINAL, aa_type_find, "aa,aax", AA_CAPS, NULL, NULL); GST_TYPE_FIND_REGISTER_DEFINE (tap, "audio/x-tap-tap", GST_RANK_PRIMARY, tap_type_find, "tap", TAP_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (brstm, "audio/x-brstm", GST_RANK_SECONDARY, + brstm_type_find, "brstm", BRSTM_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (bfstm, "audio/x-bfstm", GST_RANK_SECONDARY, + bfstm_type_find, "bfstm,bcstm", BFSTM_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (dsf, "audio/x-dsf", GST_RANK_PRIMARY, + dsf_type_find, NULL, DSF_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (ea, "video/x-ea", GST_RANK_SECONDARY, + ea_type_find, NULL, EA_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (film_cpk, "video/x-film-cpk", GST_RANK_SECONDARY, + film_cpk_type_find, "cpk", FILM_CPK_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (gxf, "application/gxf", GST_RANK_SECONDARY, + gxf_type_find, NULL, GXF_CAPS, NULL, NULL); +GST_TYPE_FIND_REGISTER_DEFINE (iff, "application/x-iff", GST_RANK_SECONDARY, + iff_type_find, NULL, IFF_CAPS, NULL, NULL); diff --git a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.c b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.c index c0e386aa2a28..998cfd4cf7fa 100644 --- a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.c +++ b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.c @@ -42,15 +42,18 @@ plugin_init (GstPlugin * plugin) /* must use strings, macros don't accept initializers */ /*Riff Type find register */ + GST_TYPE_FIND_REGISTER (fourxm, plugin); GST_TYPE_FIND_REGISTER (avi, plugin); GST_TYPE_FIND_REGISTER (qcp, plugin); GST_TYPE_FIND_REGISTER (cdxa, plugin); GST_TYPE_FIND_REGISTER (riff_mid, plugin); GST_TYPE_FIND_REGISTER (wav, plugin); GST_TYPE_FIND_REGISTER (webp, plugin); + GST_TYPE_FIND_REGISTER (xwma, plugin); /*'Start with' Type find register */ GST_TYPE_FIND_REGISTER (asf, plugin); + GST_TYPE_FIND_REGISTER (avs, plugin); GST_TYPE_FIND_REGISTER (vcd, plugin); GST_TYPE_FIND_REGISTER (imelody, plugin); GST_TYPE_FIND_REGISTER (scc, plugin); @@ -203,6 +206,13 @@ plugin_init (GstPlugin * plugin) GST_TYPE_FIND_REGISTER (pva, plugin); GST_TYPE_FIND_REGISTER (aa, plugin); GST_TYPE_FIND_REGISTER (tap, plugin); + GST_TYPE_FIND_REGISTER (brstm, plugin); + GST_TYPE_FIND_REGISTER (bfstm, plugin); + GST_TYPE_FIND_REGISTER (dsf, plugin); + GST_TYPE_FIND_REGISTER (ea, plugin); + GST_TYPE_FIND_REGISTER (film_cpk, plugin); + GST_TYPE_FIND_REGISTER (gxf, plugin); + GST_TYPE_FIND_REGISTER (iff, plugin); return TRUE; } diff --git a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.h b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.h index 0dfbc700b00b..1ef0eff272a3 100644 --- a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.h +++ b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsplugin.h @@ -41,9 +41,12 @@ GST_TYPE_FIND_REGISTER_DECLARE (cdxa); GST_TYPE_FIND_REGISTER_DECLARE (riff_mid); GST_TYPE_FIND_REGISTER_DECLARE (wav); GST_TYPE_FIND_REGISTER_DECLARE (webp); +GST_TYPE_FIND_REGISTER_DECLARE (fourxm); +GST_TYPE_FIND_REGISTER_DECLARE (xwma); /*'Start with' type find declaration */ GST_TYPE_FIND_REGISTER_DECLARE (asf); +GST_TYPE_FIND_REGISTER_DECLARE (avs); GST_TYPE_FIND_REGISTER_DECLARE (vcd); GST_TYPE_FIND_REGISTER_DECLARE (imelody); GST_TYPE_FIND_REGISTER_DECLARE (scc); @@ -195,5 +198,12 @@ GST_TYPE_FIND_REGISTER_DECLARE (ssa); GST_TYPE_FIND_REGISTER_DECLARE (pva); GST_TYPE_FIND_REGISTER_DECLARE (aa); GST_TYPE_FIND_REGISTER_DECLARE (tap); +GST_TYPE_FIND_REGISTER_DECLARE (brstm); +GST_TYPE_FIND_REGISTER_DECLARE (bfstm); +GST_TYPE_FIND_REGISTER_DECLARE (dsf); +GST_TYPE_FIND_REGISTER_DECLARE (ea); +GST_TYPE_FIND_REGISTER_DECLARE (film_cpk); +GST_TYPE_FIND_REGISTER_DECLARE (gxf); +GST_TYPE_FIND_REGISTER_DECLARE (iff); #endif //__GST_TYPE_FIND_FUNCTIONS_PLUGIN_H__ diff --git a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsriff.c b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsriff.c index ba5521961102..98823c437000 100644 --- a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsriff.c +++ b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsriff.c @@ -81,3 +81,7 @@ TYPE_FIND_REGISTER_RIFF_DEFINE (wav, "audio/x-wav", GST_RANK_PRIMARY, "wav", "WAVE"); TYPE_FIND_REGISTER_RIFF_DEFINE (webp, "image/webp", GST_RANK_PRIMARY, "webp", "WEBP"); +TYPE_FIND_REGISTER_RIFF_DEFINE (fourxm, "video/x-4xm", GST_RANK_PRIMARY, + NULL, "4XMV"); +TYPE_FIND_REGISTER_RIFF_DEFINE (xwma, "audio/x-xwma", GST_RANK_PRIMARY, + NULL, "XWMA"); diff --git a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsstartwith.c b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsstartwith.c index 6109e9c9ab54..b65a6827a867 100644 --- a/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsstartwith.c +++ b/subprojects/gst-plugins-base/gst/typefind/gsttypefindfunctionsstartwith.c @@ -177,3 +177,5 @@ TYPE_FIND_REGISTER_START_WITH_DEFINE (xi, "audio/x-xi", GST_RANK_SECONDARY, "xi", "Extended Instrument: ", 21, GST_TYPE_FIND_MAXIMUM); TYPE_FIND_REGISTER_START_WITH_DEFINE (dmp, "audio/x-tap-dmp", GST_RANK_SECONDARY, "dmp", "DC2N-TAP-RAW", 12, GST_TYPE_FIND_LIKELY); +TYPE_FIND_REGISTER_START_WITH_DEFINE (avs, "video/x-avs", + GST_RANK_SECONDARY, NULL, "wW\x10\x00", 4, GST_TYPE_FIND_LIKELY);