typefind: Add typefinders for formats that were previously available via ffmpeg

Co-Authored-By: Matthew Waters <matthew@centricular.com>
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/6505>
This commit is contained in:
Sebastian Dröge 2024-05-01 18:05:35 +03:00 committed by GStreamer Marge Bot
parent e52f0bbc03
commit a7bba83ded
8 changed files with 850 additions and 20 deletions

View file

@ -34154,6 +34154,7 @@
"avmux_f4v:maxdelay",
"avmux_f4v:preload",
"avmux_film_cpk",
"avmux_film_cpk!audio_%u",
"avmux_film_cpk!src",
"avmux_film_cpk!video_%u",
"avmux_film_cpk:maxdelay",

View file

@ -27140,7 +27140,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-avs:\n",
"caps": "video/x-avs:\n",
"direction": "sink",
"presence": "always"
},
@ -27268,7 +27268,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-dsf:\n",
"caps": "audio/x-dsf:\n",
"direction": "sink",
"presence": "always"
},
@ -27300,7 +27300,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-ea:\n",
"caps": "video/x-ea:\n",
"direction": "sink",
"presence": "always"
},
@ -27332,7 +27332,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-film_cpk:\n",
"caps": "video/x-film-cpk:\n",
"direction": "sink",
"presence": "always"
},
@ -27428,7 +27428,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-idcin:\n",
"caps": "video/x-idcin:\n",
"direction": "sink",
"presence": "always"
},
@ -27460,7 +27460,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-iff:\n",
"caps": "application/x-iff:\n",
"direction": "sink",
"presence": "always"
},
@ -27492,7 +27492,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-ipmovie:\n",
"caps": "video/x-ipmovie:\n",
"direction": "sink",
"presence": "always"
},
@ -27556,7 +27556,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-mm:\n",
"caps": "application/x-mm:\n",
"direction": "sink",
"presence": "always"
},
@ -27588,7 +27588,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-mmf:\n",
"caps": "application/vnd.smaf:\n",
"direction": "sink",
"presence": "always"
},
@ -27748,7 +27748,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-nut:\n",
"caps": "application/x-nut:\n",
"direction": "sink",
"presence": "always"
},
@ -27876,7 +27876,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-smk:\n",
"caps": "application/x-smk:\n",
"direction": "sink",
"presence": "always"
},
@ -27908,7 +27908,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-sol:\n",
"caps": "application/x-sol:\n",
"direction": "sink",
"presence": "always"
},
@ -27972,7 +27972,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-vmd:\n",
"caps": "application/x-vmd:\n",
"direction": "sink",
"presence": "always"
},
@ -28036,7 +28036,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-wc3movie:\n",
"caps": "application/x-wc3movie:\n",
"direction": "sink",
"presence": "always"
},
@ -28068,7 +28068,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-wsaud:\n",
"caps": "application/x-wsaud:\n",
"direction": "sink",
"presence": "always"
},
@ -28100,7 +28100,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-wsvqa:\n",
"caps": "application/x-wsvqa:\n",
"direction": "sink",
"presence": "always"
},
@ -28132,7 +28132,7 @@
"presence": "sometimes"
},
"sink": {
"caps": "application/x-gst-av-xwma:\n",
"caps": "audio/x-xwma:\n",
"direction": "sink",
"presence": "always"
},
@ -137075,8 +137075,13 @@
"klass": "Codec/Muxer",
"long-name": "libav Sega FILM / CPK muxer",
"pad-templates": {
"audio_%%u": {
"caps": "audio/x-raw:\n channels: [ 1, 2 ]\n rate: [ 4000, 96000 ]\n format: S16BE\n layout: interleaved\n",
"direction": "sink",
"presence": "request"
},
"src": {
"caps": "application/x-gst-av-film_cpk:\n",
"caps": "video/x-film-cpk:\n",
"direction": "src",
"presence": "always"
},
@ -138227,7 +138232,7 @@
"presence": "request"
},
"src": {
"caps": "application/x-gst-av-mmf:\n",
"caps": "application/vnd.smaf:\n",
"direction": "src",
"presence": "always"
}
@ -138911,7 +138916,7 @@
"long-name": "libav NUT muxer",
"pad-templates": {
"src": {
"caps": "application/x-gst-av-nut:\n",
"caps": "application/x-nut:\n",
"direction": "src",
"presence": "always"
},

View file

@ -3833,6 +3833,42 @@ gst_ffmpeg_formatid_to_caps (const gchar * format_name)
caps = gst_caps_from_string ("audio/x-brstm");
} else if (!strcmp (format_name, "bfstm")) {
caps = gst_caps_from_string ("audio/x-bfstm");
} else if (!strcmp (format_name, "avs")) {
caps = gst_caps_from_string ("video/x-avs");
} else if (!strcmp (format_name, "dsf")) {
caps = gst_caps_from_string ("audio/x-dsf");
} else if (!strcmp (format_name, "ea")) {
caps = gst_caps_from_string ("video/x-ea");
} else if (!strcmp (format_name, "film_cpk")) {
caps = gst_caps_from_string ("video/x-film-cpk");
} else if (!strcmp (format_name, "xwma")) {
caps = gst_caps_from_string ("audio/x-xwma");
} else if (!strcmp (format_name, "iff")) {
caps = gst_caps_from_string ("application/x-iff");
} else if (!strcmp (format_name, "idcin")) {
caps = gst_caps_new_empty_simple ("video/x-idcin");
} else if (!strcmp (format_name, "ipmovie")) {
caps = gst_caps_new_empty_simple ("video/x-ipmovie");
} else if (!strcmp (format_name, "mm")) {
caps = gst_caps_new_empty_simple ("application/x-mm");
} else if (!strcmp (format_name, "mmf")) {
caps = gst_caps_new_empty_simple ("application/vnd.smaf");
} else if (!strcmp (format_name, "nut")) {
caps = gst_caps_new_empty_simple ("application/x-nut");
} else if (!strcmp (format_name, "pxstr")) {
caps = gst_caps_new_empty_simple ("application/x-pxstr");
} else if (!strcmp (format_name, "smk")) {
caps = gst_caps_new_empty_simple ("application/x-smk");
} else if (!strcmp (format_name, "sol")) {
caps = gst_caps_new_empty_simple ("application/x-sol");
} else if (!strcmp (format_name, "vmd")) {
caps = gst_caps_new_empty_simple ("application/x-vmd");
} else if (!strcmp (format_name, "wc3movie")) {
caps = gst_caps_new_empty_simple ("application/x-wc3movie");
} else if (!strcmp (format_name, "wsaud")) {
caps = gst_caps_new_empty_simple ("application/x-wsaud");
} else if (!strcmp (format_name, "wsvqa")) {
caps = gst_caps_new_empty_simple ("application/x-wsvqa");
} else {
gchar *name;
@ -4029,6 +4065,18 @@ gst_ffmpeg_formatid_get_codecids (const gchar * format_name,
*video_codec_list = ivf_video_list;
*audio_codec_list = ivf_audio_list;
} else if ((!strcmp (format_name, "film_cpk"))) {
static enum AVCodecID cpk_video_list[] = {
AV_CODEC_ID_CINEPAK,
AV_CODEC_ID_NONE
};
static enum AVCodecID cpk_audio_list[] = {
AV_CODEC_ID_PCM_S16BE,
AV_CODEC_ID_NONE
};
*video_codec_list = cpk_video_list;
*audio_codec_list = cpk_audio_list;
} else if ((plugin->audio_codec != AV_CODEC_ID_NONE) ||
(plugin->video_codec != AV_CODEC_ID_NONE)) {
tmp_vlist[0] = plugin->video_codec;

View file

@ -5512,6 +5512,699 @@ 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'))) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, IFF_CAPS);
return;
}
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',
' ')) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, IFF_CAPS);
return;
}
}
}
/*** video/x-idcin ***/
static GstStaticCaps idcin_caps = GST_STATIC_CAPS ("video/x-idcin");
#define IDCIN_CAPS (gst_static_caps_get(&idcin_caps))
static void
idcin_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data = gst_type_find_peek (tf, 0, 20 + 64 * 1024 + 4);
if (!data)
return;
// See ffmpeg/libavformat/idcin.c:idcin_probe() for details
guint number, sample_rate;
guint w, h;
gint i;
w = GST_READ_UINT32_LE (data);
if (w == 0 || w > 1024)
return;
h = GST_READ_UINT32_LE (data + 4);
if (h == 0 || h > 1024)
return;
sample_rate = GST_READ_UINT32_LE (data + 8);
if (sample_rate && (sample_rate < 8000 || sample_rate > 48000))
return;
number = GST_READ_UINT32_LE (data + 12);
if (number > 2 || (sample_rate && !number))
return;
number = GST_READ_UINT32_LE (data + 16);
if (number > 2 || (sample_rate && !number))
return;
i = 20 + 64 * 1024;
if (GST_READ_UINT32_LE (data + i) == 1)
i += 768;
data = gst_type_find_peek (tf, 0, 20 + 64 * 1024 + 768 + 12);
if (!data)
return;
if (GST_READ_UINT32_LE (data + i + 8) != w * h)
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, IDCIN_CAPS);
}
/*** video/x-idcin ***/
static GstStaticCaps mm_caps = GST_STATIC_CAPS ("application/x-mm");
#define MM_CAPS (gst_static_caps_get(&mm_caps))
static void
mm_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data = gst_type_find_peek (tf, 0, 24 + 6);
if (!data)
return;
// See ffmpeg/libavformat/mm.c:probe() for details
gint len, type, fps, w, h;
if (GST_READ_UINT16_LE (&data[0]) != 0x00)
return;
len = GST_READ_UINT32_LE (&data[2]);
if (len != 22 && len != 24)
return;
fps = GST_READ_UINT16_LE (&data[8]);
w = GST_READ_UINT16_LE (&data[12]);
h = GST_READ_UINT16_LE (&data[14]);
if (!fps || fps > 60 || !w || w > 2048 || !h || h > 2048)
return;
type = GST_READ_UINT16_LE (&data[len]);
if (!type || type > 0x31)
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, MM_CAPS);
}
/*** video/x-ipmovie ***/
static GstStaticCaps ipmovie_caps = GST_STATIC_CAPS ("video/x-ipmovie");
#define IPMOVIE_CAPS (gst_static_caps_get(&ipmovie_caps))
static void
ipmovie_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 4096)
length = 4096;
static const char signature[] = "Interplay MVE File\x1A\0\x1A";
if (length < sizeof (signature))
return;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
for (gsize i = 0; i < length - sizeof (signature); i++) {
if (memcmp (data + i, signature, sizeof (signature)) != 0) {
gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, IPMOVIE_CAPS);
return;
}
}
}
/*** application/vnd.smaf ***/
static GstStaticCaps mmf_caps = GST_STATIC_CAPS ("application/vnd.smaf");
#define MMF_CAPS (gst_static_caps_get(&mmf_caps))
static void
mmf_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data = gst_type_find_peek (tf, 0, 12);
if (!data)
return;
if (data[0] == 'M' && data[1] == 'M' &&
data[2] == 'M' && data[3] == 'D' &&
data[8] == 'C' && data[9] == 'N' && data[10] == 'T' && data[11] == 'I')
gst_type_find_suggest (tf, GST_TYPE_FIND_LIKELY, MMF_CAPS);
}
/*** video/x-nsv ***/
static GstStaticCaps nsv_caps = GST_STATIC_CAPS ("video/x-nsv");
#define NSV_CAPS (gst_static_caps_get(&nsv_caps))
static void
nsv_type_find (GstTypeFind * tf, gpointer unused)
{
static const guint8 marker[4] = { 'N', 'S', 'V', 's', };
const guint8 *data;
guint64 length;
gsize i;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 4096)
length = 4096;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 4)
return;
if (data[0] == 'N' && data[1] == 'S' &&
data[2] == 'V' && (data[3] == 'f' || data[3] == 's')) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, NSV_CAPS);
return;
}
if (length < 24)
return;
for (i = 1; i < length - 23; i++) {
if (memcmp (&data[i], marker, sizeof (marker)) == 0) {
gsize offset = i + 23;
if (offset < length) {
guint32 vsize = GST_READ_UINT24_LE (&data[i + 19]) >> 4;
guint32 asize = GST_READ_UINT16_LE (&data[i + 22]) >> 4;
offset += asize + vsize;
if (offset + 1 < length && GST_READ_UINT16_LE (&data[offset]) == 0xBEEF) {
gst_type_find_suggest (tf, GST_TYPE_FIND_NEARLY_CERTAIN, NSV_CAPS);
return;
}
}
gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, NSV_CAPS);
return;
}
}
}
/*** application/x-nut ***/
static GstStaticCaps nut_caps = GST_STATIC_CAPS ("application/x-nut");
#define NUT_CAPS (gst_static_caps_get(&nut_caps))
static void
nut_type_find (GstTypeFind * tf, gpointer unused)
{
guint64 marker = (0x7A561F5F04ADULL + (((guint64) ('N' << 8) + 'M') << 48));
const guint8 *data;
guint64 length;
gsize i;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 4096)
length = 4096;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 8)
return;
for (i = 0; i < length - 8; i++) {
if (GST_READ_UINT64_BE (&data[i]) == marker) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, NUT_CAPS);
return;
}
}
}
/*** application/x-pxstr ***/
static GstStaticCaps pxstr_caps = GST_STATIC_CAPS ("application/x-pxstr");
#define PXSTR_CAPS (gst_static_caps_get(&pxstr_caps))
static void
pxstr_type_find (GstTypeFind * tf, gpointer unused)
{
static const guint8 sync_header[] =
{ 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00
};
static const gsize raw_cd_sector_size = 2352;
const guint8 *data;
guint64 length;
int n_vid = 0, n_aud = 0;
gsize i;
length = gst_type_find_get_length (tf);
if (length == 0 || length > raw_cd_sector_size * 5)
length = raw_cd_sector_size * 5;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 12)
return;
if (GST_READ_UINT32_LE (data) == GST_MAKE_FOURCC ('R', 'I', 'F', 'F')
&& GST_READ_UINT32_LE (&data[8]) == GST_MAKE_FOURCC ('C', 'D', 'X', 'A')) {
length -= 0x2C;
data = &data[0x2C];
}
// minimum CD sector size
if (length < raw_cd_sector_size)
return;
for (i = 0; i < length;) {
if (length - i > 0x25)
break;
if (memcmp (&data[i], sync_header, sizeof (sync_header)) != 0)
return;
if (data[i + 0x11] >= 32)
return;
switch (data[i + 0x12] & 0x0E) {
/* data and video */
case 0x08:
case 0x02:{
gint16 current_sector = (gint16) GST_READ_UINT16_LE (&data[i + 0x1C]);
gint16 sector_count = (gint16) GST_READ_UINT16_LE (&data[i + 0x1E]);
gint16 frame_size = (gint16) GST_READ_UINT16_LE (&data[i + 0x24]);
if (!(frame_size > 0
&& current_sector < sector_count
&& sector_count * 0x780 >= frame_size))
return;
n_vid++;
break;
}
/* audio */
case 0x04:{
if (data[i + 0x13] & 0x2A)
return;
n_aud++;
break;
}
default:
if (data[i + 0x12] & 0x0E)
return;
break;
}
i += raw_cd_sector_size;
}
if (n_aud + n_vid > 3)
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, PXSTR_CAPS);
else if (n_aud + n_vid)
gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, PXSTR_CAPS);
}
/*** application/x-smk ***/
static GstStaticCaps smk_caps = GST_STATIC_CAPS ("application/x-smk");
#define SMK_CAPS (gst_static_caps_get(&smk_caps))
static void
smk_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 12)
length = 12;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 12)
return;
if (GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('S', 'M', 'K', '2')
&& GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('S', 'M', 'K', '4')) {
return;
}
if (GST_READ_UINT32_LE (&data[4]) > 32768
|| GST_READ_UINT32_LE (&data[8]) > 32768) {
gst_type_find_suggest (tf, GST_TYPE_FIND_MINIMUM, SMK_CAPS);
} else {
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SMK_CAPS);
}
}
/*** application/x-sol ***/
static GstStaticCaps sol_caps = GST_STATIC_CAPS ("application/x-sol");
#define SOL_CAPS (gst_static_caps_get(&sol_caps))
static void
sol_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
guint16 magic;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 8)
length = 8;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 8)
return;
magic = (guint16) GST_READ_UINT32_LE (data);
if (magic != 0x0b8d && magic != 0x0c0d && magic != 0x0c8d)
return;
if (GST_READ_UINT32_BE (&data[4]) != GST_MAKE_FOURCC ('S', 'O', 'L', 0))
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, SOL_CAPS);
}
/*** application/x-vmd ***/
static GstStaticCaps vmd_caps = GST_STATIC_CAPS ("application/x-vmd");
#define VMD_CAPS (gst_static_caps_get(&vmd_caps))
static void
vmd_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
int w, h, rate;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 806)
length = 806;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 806)
return;
if (GST_READ_UINT16_LE (data) != 0x0330 - 2)
return;
w = GST_READ_UINT16_LE (&data[12]);
h = GST_READ_UINT16_LE (&data[14]);
rate = GST_READ_UINT16_LE (&data[804]);
if ((!w || w > 2048 || !h || h > 2048)
&& rate != 22050)
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, VMD_CAPS);
}
/*** application/x-wc3movie ***/
static GstStaticCaps wc3movie_caps = GST_STATIC_CAPS ("application/x-wc3movie");
#define WC3MOVIE_CAPS (gst_static_caps_get(&wc3movie_caps))
static void
wc3movie_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 12)
length = 12;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 12)
return;
if (GST_READ_UINT32_LE (data) != GST_MAKE_FOURCC ('F', 'O', 'R', 'M')
|| GST_READ_UINT32_LE (&data[8]) != GST_MAKE_FOURCC ('M', 'O', 'V', 'E'))
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, WC3MOVIE_CAPS);
}
/*** application/x-wsaud ***/
static GstStaticCaps wsaud_caps = GST_STATIC_CAPS ("application/x-wsaud");
#define WSAUD_CAPS (gst_static_caps_get(&wsaud_caps))
static void
wsaud_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
int rate;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 20)
length = 20;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 20)
return;
rate = GST_READ_UINT16_LE (data);
if (rate < 8000 || rate > 48000)
return;
if (data[10] & 0xfc)
return;
if (data[11] != 99 && data[11] != 1)
return;
if (GST_READ_UINT32_LE (&data[16]) != 0x0000DEAF)
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_POSSIBLE, WSAUD_CAPS);
}
/*** application/x-wsvqa ***/
static GstStaticCaps wsvqa_caps = GST_STATIC_CAPS ("application/x-wsvqa");
#define WSVQA_CAPS (gst_static_caps_get(&wsvqa_caps))
static void
wsvqa_type_find (GstTypeFind * tf, gpointer unused)
{
const guint8 *data;
guint64 length;
length = gst_type_find_get_length (tf);
if (length == 0 || length > 12)
length = 12;
data = gst_type_find_peek (tf, 0, length);
if (!data)
return;
if (length < 12)
return;
if (GST_READ_UINT32_BE (data) != GST_MAKE_FOURCC ('F', 'O', 'R', 'M')
|| GST_READ_UINT32_BE (&data[8]) != GST_MAKE_FOURCC ('W', 'V', 'Q', 'A'))
return;
gst_type_find_suggest (tf, GST_TYPE_FIND_MAXIMUM, WSVQA_CAPS);
}
/*** video/vivo ***/
static GstStaticCaps vivo_caps = GST_STATIC_CAPS ("video/vivo");
@ -6212,3 +6905,44 @@ 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);
GST_TYPE_FIND_REGISTER_DEFINE (ipmovie, "application/x-ipmovie",
GST_RANK_SECONDARY, ipmovie_type_find, NULL, IPMOVIE_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (idcin, "video/x-idcin", GST_RANK_MARGINAL,
idcin_type_find, NULL, IDCIN_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (mm, "application/x-mm", GST_RANK_MARGINAL,
mm_type_find, NULL, MM_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (mmf, "application/vnd.smaf", GST_RANK_SECONDARY,
mmf_type_find, "mmf", MMF_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (nsv, "video/x-nsv", GST_RANK_MARGINAL,
nsv_type_find, "nsv", NSV_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (nut, "application/x-nut", GST_RANK_MARGINAL,
nut_type_find, "nut", NUT_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (pxstr, "application/x-pxstr", GST_RANK_MARGINAL,
pxstr_type_find, "pxstr", PXSTR_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (smk, "application/x-smk", GST_RANK_MARGINAL,
smk_type_find, "smk", SMK_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (sol, "application/x-sol", GST_RANK_MARGINAL,
sol_type_find, "sol", SOL_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (vmd, "application/x-vmd", GST_RANK_MARGINAL,
vmd_type_find, "vmd", VMD_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (wc3movie, "application/x-wc3movie",
GST_RANK_MARGINAL, wc3movie_type_find, "wc3movie", WC3MOVIE_CAPS, NULL,
NULL);
GST_TYPE_FIND_REGISTER_DEFINE (wsaud, "application/x-wsaud", GST_RANK_MARGINAL,
wsaud_type_find, "wsaud", WSAUD_CAPS, NULL, NULL);
GST_TYPE_FIND_REGISTER_DEFINE (wsvqa, "application/x-wsvqa", GST_RANK_MARGINAL,
wsvqa_type_find, "wsvqa", WSVQA_CAPS, NULL, NULL);

View file

@ -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;
}

View file

@ -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);
@ -91,6 +94,7 @@ GST_TYPE_FIND_REGISTER_DECLARE (ds_store);
GST_TYPE_FIND_REGISTER_DECLARE (psd);
GST_TYPE_FIND_REGISTER_DECLARE (xi);
GST_TYPE_FIND_REGISTER_DECLARE (dmp);
GST_TYPE_FIND_REGISTER_DECLARE (yuv4mpeg);
/*Type find declaration by functions */
GST_TYPE_FIND_REGISTER_DECLARE (musepack);
@ -195,5 +199,25 @@ 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);
GST_TYPE_FIND_REGISTER_DECLARE (idcin);
GST_TYPE_FIND_REGISTER_DECLARE (ipmovie);
GST_TYPE_FIND_REGISTER_DECLARE (mm);
GST_TYPE_FIND_REGISTER_DECLARE (mmf);
GST_TYPE_FIND_REGISTER_DECLARE (nsv);
GST_TYPE_FIND_REGISTER_DECLARE (nut);
GST_TYPE_FIND_REGISTER_DECLARE (pxstr);
GST_TYPE_FIND_REGISTER_DECLARE (smk);
GST_TYPE_FIND_REGISTER_DECLARE (sol);
GST_TYPE_FIND_REGISTER_DECLARE (vmd);
GST_TYPE_FIND_REGISTER_DECLARE (wc3movie);
GST_TYPE_FIND_REGISTER_DECLARE (wsaud);
GST_TYPE_FIND_REGISTER_DECLARE (wsvqa);
#endif //__GST_TYPE_FIND_FUNCTIONS_PLUGIN_H__

View file

@ -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");

View file

@ -177,3 +177,7 @@ 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);
TYPE_FIND_REGISTER_START_WITH_DEFINE (yuv4mpeg, "application/x-yuv4mpeg",
GST_RANK_MARGINAL, NULL, "YUV4MPEG2", 9, GST_TYPE_FIND_MAXIMUM);