mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 03:35:21 +00:00
New typefind system: bytestream is now part of the core all plugins have been modified to use this new typefind syste...
Original commit message from CVS: New typefind system: * bytestream is now part of the core * all plugins have been modified to use this new typefind system * asf typefinding added * mpeg video stream typefiding removed because it's broken * duplicate typefind entries removed * extra id3 typefinding added, because we've seen 4 types of files (riff/wav, flac, vorbis, mp3) with id3 headers and each of these needs to work. Instead, I've added an id3 element and let it redo typefiding after the id3 header. this needs a hack because spider only typefinds once. We can remove this hack once spider supports multiple typefinds. * with all this, mp3 typefinding is semi-rewritten * id3 typefinding in flac/vorbis is removed, it's no longer needed * fixed spider and gst-typefind to use this, too. * Other general cleanups
This commit is contained in:
parent
9905c2c257
commit
38946080fd
16 changed files with 138 additions and 129 deletions
|
@ -262,7 +262,7 @@ GST_PLUGINS_ALL="\
|
||||||
ac3parse adder audioscale auparse avi \
|
ac3parse adder audioscale auparse avi \
|
||||||
asfdemux audioconvert cdxaparse chart \
|
asfdemux audioconvert cdxaparse chart \
|
||||||
cutter debug deinterlace effectv festival \
|
cutter debug deinterlace effectv festival \
|
||||||
filter flx goom intfloat law level median mixmatrix \
|
filter flx goom id3 intfloat law level median mixmatrix \
|
||||||
mpeg1sys mpeg1videoparse mpeg2enc mpeg2sub \
|
mpeg1sys mpeg1videoparse mpeg2enc mpeg2sub \
|
||||||
mpegaudio mpegaudioparse mpegstream mpegtypes \
|
mpegaudio mpegaudioparse mpegstream mpegtypes \
|
||||||
monoscope oneton overlay passthrough playondemand qtdemux \
|
monoscope oneton overlay passthrough playondemand qtdemux \
|
||||||
|
@ -1180,6 +1180,7 @@ gst/festival/Makefile
|
||||||
gst/filter/Makefile
|
gst/filter/Makefile
|
||||||
gst/flx/Makefile
|
gst/flx/Makefile
|
||||||
gst/goom/Makefile
|
gst/goom/Makefile
|
||||||
|
gst/id3/Makefile
|
||||||
gst/intfloat/Makefile
|
gst/intfloat/Makefile
|
||||||
gst/law/Makefile
|
gst/law/Makefile
|
||||||
gst/level/Makefile
|
gst/level/Makefile
|
||||||
|
|
|
@ -278,8 +278,9 @@ SUBDIRS=$(A52DEC_DIR) $(AALIB_DIR) $(ALSA_DIR) \
|
||||||
$(ARTS_DIR) $(ARTSC_DIR) $(AUDIOFILE_DIR) \
|
$(ARTS_DIR) $(ARTSC_DIR) $(AUDIOFILE_DIR) \
|
||||||
$(CDPARANOIA_DIR) $(DIVX_DIR) \
|
$(CDPARANOIA_DIR) $(DIVX_DIR) \
|
||||||
$(DVDREAD_DIR) $(DVDNAV_DIR) $(ESD_DIR) $(MAS_DIR) \
|
$(DVDREAD_DIR) $(DVDNAV_DIR) $(ESD_DIR) $(MAS_DIR) \
|
||||||
$(FFMPEG_DIR) $(FLAC_DIR) $(GDK_PIXBUF_DIR) $(GNOMEVFS_DIR) $(GSM_DIR) \
|
$(FFMPEG_DIR) $(FLAC_DIR) $(GDK_PIXBUF_DIR) \
|
||||||
$(HERMES_DIR) $(JACK_DIR) $(JPEG_DIR) \
|
$(GNOMEVFS_DIR) $(GSM_DIR) $(HERMES_DIR) \
|
||||||
|
$(JACK_DIR) $(JPEG_DIR) \
|
||||||
$(LADSPA_DIR) $(LAME_DIR) $(LCS_DIR) \
|
$(LADSPA_DIR) $(LAME_DIR) $(LCS_DIR) \
|
||||||
$(LIBDV_DIR) $(LIBFAME_DIR) $(LIBPNG_DIR) \
|
$(LIBDV_DIR) $(LIBFAME_DIR) $(LIBPNG_DIR) \
|
||||||
$(MAD_DIR) $(MATROSKA_DIR) $(MIKMOD_DIR) \
|
$(MAD_DIR) $(MATROSKA_DIR) $(MIKMOD_DIR) \
|
||||||
|
|
|
@ -159,30 +159,34 @@ GST_PAD_TEMPLATE_FACTORY ( audio_src_temp,
|
||||||
|
|
||||||
/* typefind stuff */
|
/* typefind stuff */
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
dv_type_find (GstBuffer *buf, gpointer private)
|
dv_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
guint32 head;
|
GstBuffer *buf = NULL;
|
||||||
GstCaps *new = NULL;
|
GstCaps *new = NULL;
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE (buf) < 5)
|
if (gst_bytestream_peek (bs, &buf, 5) == 5) {
|
||||||
return NULL;
|
guint32 head = GUINT32_FROM_BE (*((guint32 *) GST_BUFFER_DATA (buf)));
|
||||||
|
|
||||||
head = GUINT32_FROM_BE(*((guint32 *)GST_BUFFER_DATA(buf)));
|
/* check for DIF and DV flag */
|
||||||
|
if ((head & 0xffffff00) == 0x1f070000 &&
|
||||||
|
!(GST_BUFFER_DATA (buf)[4] & 0x01)) {
|
||||||
|
gchar *format;
|
||||||
|
|
||||||
/* check for DIF and DV flag */
|
if ((head & 0x000000ff) & 0x80)
|
||||||
if ((head & 0xffffff00) == 0x1f070000 && !(GST_BUFFER_DATA(buf)[4] & 0x01)) {
|
format = "PAL";
|
||||||
gchar *format;
|
else
|
||||||
|
format = "NTSC";
|
||||||
if ((head & 0x000000ff) & 0x80)
|
|
||||||
format = "PAL";
|
|
||||||
else
|
|
||||||
format = "NTSC";
|
|
||||||
|
|
||||||
new = GST_CAPS_NEW ("dv_type_find",
|
new = GST_CAPS_NEW ("dv_type_find",
|
||||||
"video/x-dv",
|
"video/x-dv",
|
||||||
"systemstream", GST_PROPS_BOOLEAN (TRUE)
|
"systemstream", GST_PROPS_BOOLEAN (TRUE));
|
||||||
);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (buf != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1002,9 +1006,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
GstElementFactory *factory;
|
GstElementFactory *factory;
|
||||||
GstTypeFactory *type;
|
GstTypeFactory *type;
|
||||||
|
|
||||||
if (!gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* We need to create an ElementFactory for each element we provide.
|
/* We need to create an ElementFactory for each element we provide.
|
||||||
* This consists of the name of the element, the GType identifier,
|
* This consists of the name of the element, the GType identifier,
|
||||||
* and a pointer to the details structure at the top of the file.
|
* and a pointer to the details structure at the top of the file.
|
||||||
|
|
|
@ -29,7 +29,7 @@ extern "C" {
|
||||||
|
|
||||||
|
|
||||||
#include <libdv/dv.h>
|
#include <libdv/dv.h>
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
|
|
||||||
|
|
||||||
/* This is the definition of the element's object structure. */
|
/* This is the definition of the element's object structure. */
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
extern GstElementDetails flacenc_details;
|
extern GstElementDetails flacenc_details;
|
||||||
extern GstElementDetails flacdec_details;
|
extern GstElementDetails flacdec_details;
|
||||||
|
|
||||||
static GstCaps* flac_type_find (GstBuffer *buf, gpointer private);
|
static GstCaps* flac_type_find (GstByteStream *bs, gpointer private);
|
||||||
|
|
||||||
GstPadTemplate *gst_flacdec_src_template, *gst_flacdec_sink_template;
|
GstPadTemplate *gst_flacdec_src_template, *gst_flacdec_sink_template;
|
||||||
GstPadTemplate *gst_flacenc_src_template, *gst_flacenc_sink_template;
|
GstPadTemplate *gst_flacenc_src_template, *gst_flacenc_sink_template;
|
||||||
|
@ -70,37 +70,26 @@ static GstTypeDefinition flacdefinition = {
|
||||||
|
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
flac_type_find (GstBuffer *buf, gpointer private)
|
flac_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
gint offset;
|
GstBuffer *buf = NULL;
|
||||||
guint8 *data;
|
GstCaps *new = NULL;
|
||||||
gint size;
|
|
||||||
guint32 head;
|
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE (buf) < 4)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
data = GST_BUFFER_DATA (buf);
|
if (gst_bytestream_peek (bs, &buf, 4) == 4) {
|
||||||
size = GST_BUFFER_SIZE (buf);
|
guint32 head = GUINT32_FROM_BE (*((guint32 *) GST_BUFFER_DATA (buf)));
|
||||||
|
|
||||||
head = GUINT32_FROM_BE (*((guint32 *)GST_BUFFER_DATA (buf)));
|
|
||||||
|
|
||||||
if (head == 0x664C6143)
|
if (head == 0x664C6143) {
|
||||||
return gst_caps_new ("flac_type_find", "application/x-flac", NULL);
|
new = GST_CAPS_NEW ("flac_type_find",
|
||||||
else {
|
"application/x-flac",
|
||||||
/* checks for existance of flac identification header in case
|
NULL);
|
||||||
* there's an ID3 tag */
|
|
||||||
for (offset = 0; offset < size-4; offset++) {
|
|
||||||
if (data[offset] == 'f' &&
|
|
||||||
data[offset+1] == 'L' &&
|
|
||||||
data[offset+2] == 'a' &&
|
|
||||||
data[offset+3] == 'C' ) {
|
|
||||||
return gst_caps_new ("flac_type_find", "application/x-flac", NULL);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
if (buf != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,10 +100,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
GstTypeFactory *type;
|
GstTypeFactory *type;
|
||||||
GstCaps *raw_caps, *flac_caps;
|
GstCaps *raw_caps, *flac_caps;
|
||||||
|
|
||||||
/* this filter needs the bytestream package */
|
|
||||||
if (!gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
gst_plugin_set_longname (plugin, "The FLAC Lossless compressor Codec");
|
gst_plugin_set_longname (plugin, "The FLAC Lossless compressor Codec");
|
||||||
|
|
||||||
/* create an elementfactory for the flacenc element */
|
/* create an elementfactory for the flacenc element */
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
|
|
||||||
#include <FLAC/all.h>
|
#include <FLAC/all.h>
|
||||||
|
|
||||||
|
|
|
@ -993,9 +993,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
|
|
||||||
LADSPAPluginSearch(ladspa_describe_plugin);
|
LADSPAPluginSearch(ladspa_describe_plugin);
|
||||||
|
|
||||||
if (! gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* initialize dparam support library */
|
/* initialize dparam support library */
|
||||||
gst_control_init(NULL,NULL);
|
gst_control_init(NULL,NULL);
|
||||||
|
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
|
|
||||||
#include "ladspa.h"
|
#include "ladspa.h"
|
||||||
|
|
||||||
|
|
|
@ -42,16 +42,23 @@ static GstElementDetails gst_auparse_details = {
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
au_type_find (GstBuffer *buf, gpointer private)
|
au_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
|
GstBuffer *buf = NULL;
|
||||||
GstCaps *new = NULL;
|
GstCaps *new = NULL;
|
||||||
gulong *head = (gulong *) GST_BUFFER_DATA (buf);
|
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE (buf) < 4)
|
if (gst_bytestream_peek (bs, &buf, 4) == 4) {
|
||||||
return NULL;
|
guint32 head = * (guint32 *) GST_BUFFER_DATA (buf);
|
||||||
|
if (head == 0x2e736e64 || head == 0x646e732e) {
|
||||||
|
new = gst_caps_new ("au_type_find",
|
||||||
|
"audio/x-au",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (*head == 0x2e736e64 || *head == 0x646e732e)
|
if (buf != NULL) {
|
||||||
new = gst_caps_new ("au_type_find", "audio/x-au", NULL);
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ static GstElementDetails gst_avi_demux_details = {
|
||||||
"(C) 1999",
|
"(C) 1999",
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstCaps* avi_type_find (GstBuffer *buf, gpointer private);
|
static GstCaps* avi_type_find (GstByteStream *bs, gpointer private);
|
||||||
|
|
||||||
/* typefactory for 'avi' */
|
/* typefactory for 'avi' */
|
||||||
static GstTypeDefinition avidefinition = {
|
static GstTypeDefinition avidefinition = {
|
||||||
|
@ -173,25 +173,29 @@ gst_avi_demux_init (GstAviDemux *avi_demux)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
avi_type_find (GstBuffer *buf,
|
avi_type_find (GstByteStream *bs,
|
||||||
gpointer private)
|
gpointer private)
|
||||||
{
|
{
|
||||||
gchar *data = GST_BUFFER_DATA (buf);
|
GstBuffer *buf = NULL;
|
||||||
GstCaps *new;
|
GstCaps *new = NULL;
|
||||||
|
|
||||||
GST_DEBUG ("avi_demux: typefind");
|
GST_DEBUG ("avi_demux: typefind");
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE (buf) < 12)
|
if (gst_bytestream_peek (bs, &buf, 12) == 12) {
|
||||||
return NULL;
|
guint32 head1 = GUINT32_FROM_LE (((guint32 *) GST_BUFFER_DATA (buf))[0]),
|
||||||
|
head2 = GUINT32_FROM_LE (((guint32 *) GST_BUFFER_DATA (buf))[2]);
|
||||||
|
|
||||||
if (GUINT32_FROM_LE (((guint32 *)data)[0]) != GST_RIFF_TAG_RIFF)
|
if (head1 == GST_RIFF_TAG_RIFF && head2 == GST_RIFF_RIFF_AVI) {
|
||||||
return NULL;
|
new = GST_CAPS_NEW ("avi_type_find",
|
||||||
if (GUINT32_FROM_LE (((guint32 *)data)[2]) != GST_RIFF_RIFF_AVI)
|
"video/avi",
|
||||||
return NULL;
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
new = GST_CAPS_NEW ("avi_type_find",
|
|
||||||
"video/avi",
|
|
||||||
NULL);
|
|
||||||
return new;
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1961,10 +1965,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
-1 /* end */
|
-1 /* end */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* this filter needs the riff parser */
|
|
||||||
if (!gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (!gst_library_load ("gstriff"))
|
if (!gst_library_load ("gstriff"))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
#include <gst/riff/riff.h>
|
#include <gst/riff/riff.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
|
|
||||||
#define JIFFIE (GST_SECOND/70)
|
#define JIFFIE (GST_SECOND/70)
|
||||||
|
|
||||||
static GstCaps* flxdec_type_find(GstBuffer *buf, gpointer private);
|
static GstCaps* flxdec_type_find (GstByteStream *bs, gpointer private);
|
||||||
|
|
||||||
/* flx element information */
|
/* flx element information */
|
||||||
static GstElementDetails flxdec_details = {
|
static GstElementDetails flxdec_details = {
|
||||||
|
@ -113,27 +113,33 @@ static void flx_decode_delta_flc (GstFlxDec *, guchar *, guchar *);
|
||||||
static GstElementClass *parent_class = NULL;
|
static GstElementClass *parent_class = NULL;
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
flxdec_type_find (GstBuffer *buf, gpointer private)
|
flxdec_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
guchar *data = GST_BUFFER_DATA(buf);
|
GstBuffer *buf = NULL;
|
||||||
GstCaps *new;
|
GstCaps *new = NULL;
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE(buf) < 134){
|
if (gst_bytestream_peek (bs, &buf, 134) == 134) {
|
||||||
return NULL;
|
guint8 *data = GST_BUFFER_DATA (buf);
|
||||||
}
|
|
||||||
|
|
||||||
/* check magic */
|
/* check magic */
|
||||||
if ((data[4] == 0x11 || data[4] == 0x12
|
if ((data[4] == 0x11 || data[4] == 0x12 ||
|
||||||
|| data[4] == 0x30 || data[4] == 0x44) && data[5] == 0xaf) {
|
data[4] == 0x30 || data[4] == 0x44) &&
|
||||||
|
data[5] == 0xaf) {
|
||||||
/* check the frame type of the first frame */
|
/* check the frame type of the first frame */
|
||||||
if ((data[132] == 0x00 || data[132] == 0xfa) && data[133] == 0xf1) {
|
if ((data[132] == 0x00 || data[132] == 0xfa) && data[133] == 0xf1) {
|
||||||
GST_DEBUG ("GstFlxDec: found supported flx format");
|
GST_DEBUG ("GstFlxDec: found supported flx format");
|
||||||
new = gst_caps_new("flxdec_type_find","video/x-fli", NULL);
|
new = gst_caps_new ("flxdec_type_find",
|
||||||
return new;
|
"video/x-fli",
|
||||||
|
NULL);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
if (buf != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -684,10 +690,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
GstElementFactory *factory;
|
GstElementFactory *factory;
|
||||||
GstTypeFactory *type;
|
GstTypeFactory *type;
|
||||||
|
|
||||||
/* this filter needs the bytestream package */
|
|
||||||
if (!gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
factory = gst_element_factory_new("flxdec", GST_TYPE_FLXDEC, &flxdec_details);
|
factory = gst_element_factory_new("flxdec", GST_TYPE_FLXDEC, &flxdec_details);
|
||||||
g_return_val_if_fail(factory != NULL, FALSE);
|
g_return_val_if_fail(factory != NULL, FALSE);
|
||||||
gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY);
|
gst_element_factory_set_rank (factory, GST_ELEMENT_RANK_PRIMARY);
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
|
|
||||||
#include "flx_color.h"
|
#include "flx_color.h"
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -104,7 +104,7 @@ gst_qtdemux_details =
|
||||||
"(C) 2003",
|
"(C) 2003",
|
||||||
};
|
};
|
||||||
|
|
||||||
static GstCaps* quicktime_type_find (GstBuffer *buf, gpointer private);
|
static GstCaps* quicktime_type_find (GstByteStream *bs, gpointer private);
|
||||||
|
|
||||||
static GstTypeDefinition quicktimedefinition = {
|
static GstTypeDefinition quicktimedefinition = {
|
||||||
"qtdemux_video/quicktime",
|
"qtdemux_video/quicktime",
|
||||||
|
@ -187,24 +187,29 @@ gst_qtdemux_init (GstQTDemux *qtdemux)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
quicktime_type_find (GstBuffer *buf, gpointer private)
|
quicktime_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
gchar *data = GST_BUFFER_DATA (buf);
|
GstBuffer *buf = NULL;
|
||||||
|
GstCaps *new = NULL;
|
||||||
|
|
||||||
g_return_val_if_fail (data != NULL, NULL);
|
if (gst_bytestream_peek (bs, &buf, 8) == 8) {
|
||||||
|
gchar *data = GST_BUFFER_DATA (buf);
|
||||||
if(GST_BUFFER_SIZE(buf) < 8){
|
|
||||||
return NULL;
|
if (!strncmp (&data[4], "wide", 4) ||
|
||||||
|
!strncmp (&data[4], "moov", 4) ||
|
||||||
|
!strncmp (&data[4], "mdat", 4) ||
|
||||||
|
!strncmp (&data[4], "free", 4)) {
|
||||||
|
new = GST_CAPS_NEW ("quicktime_type_find",
|
||||||
|
"video/quicktime",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (strncmp (&data[4], "wide", 4)==0 ||
|
|
||||||
strncmp (&data[4], "moov", 4)==0 ||
|
if (buf != NULL) {
|
||||||
strncmp (&data[4], "mdat", 4)==0 ||
|
gst_buffer_unref (buf);
|
||||||
strncmp (&data[4], "free", 4)==0) {
|
|
||||||
return gst_caps_new ("quicktime_type_find",
|
|
||||||
"video/quicktime",
|
|
||||||
NULL);
|
|
||||||
}
|
}
|
||||||
return NULL;
|
|
||||||
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -222,9 +227,6 @@ plugin_init (GModule *module, GstPlugin *plugin)
|
||||||
};
|
};
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
if (!gst_library_load ("gstbytestream"))
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
factory = gst_element_factory_new ("qtdemux", GST_TYPE_QTDEMUX,
|
factory = gst_element_factory_new ("qtdemux", GST_TYPE_QTDEMUX,
|
||||||
&gst_qtdemux_details);
|
&gst_qtdemux_details);
|
||||||
g_return_val_if_fail(factory != NULL, FALSE);
|
g_return_val_if_fail(factory != NULL, FALSE);
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
#define __GST_QTDEMUX_H__
|
#define __GST_QTDEMUX_H__
|
||||||
|
|
||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
#include <gst/bytestream/bytestream.h>
|
#include <gst/gstbytestream.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -31,7 +31,8 @@ static void gst_wavparse_init (GstWavParse *wavparse);
|
||||||
static GstElementStateReturn
|
static GstElementStateReturn
|
||||||
gst_wavparse_change_state (GstElement *element);
|
gst_wavparse_change_state (GstElement *element);
|
||||||
|
|
||||||
static GstCaps* wav_type_find (GstBuffer *buf, gpointer private);
|
static GstCaps* wav_type_find (GstByteStream *bs,
|
||||||
|
gpointer private);
|
||||||
|
|
||||||
static const GstFormat* gst_wavparse_get_formats (GstPad *pad);
|
static const GstFormat* gst_wavparse_get_formats (GstPad *pad);
|
||||||
static const GstQueryType *
|
static const GstQueryType *
|
||||||
|
@ -213,15 +214,27 @@ gst_wavparse_init (GstWavParse *wavparse)
|
||||||
}
|
}
|
||||||
|
|
||||||
static GstCaps*
|
static GstCaps*
|
||||||
wav_type_find (GstBuffer *buf, gpointer private)
|
wav_type_find (GstByteStream *bs, gpointer private)
|
||||||
{
|
{
|
||||||
gchar *data = GST_BUFFER_DATA (buf);
|
GstCaps *new = NULL;
|
||||||
|
GstBuffer *buf = NULL;
|
||||||
|
|
||||||
if (GST_BUFFER_SIZE (buf) < 12) return NULL;
|
if (gst_bytestream_peek (bs, &buf, 12) == 12) {
|
||||||
if (strncmp (&data[0], "RIFF", 4)) return NULL;
|
gchar *data = GST_BUFFER_DATA (buf);
|
||||||
if (strncmp (&data[8], "WAVE", 4)) return NULL;
|
|
||||||
|
|
||||||
return gst_caps_new ("wav_type_find", "audio/x-wav", NULL);
|
if (!strncmp (&data[0], "RIFF", 4) &&
|
||||||
|
!strncmp (&data[8], "WAVE", 4)) {
|
||||||
|
new = GST_CAPS_NEW ("wav_type_find",
|
||||||
|
"audio/x-wav",
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (buf != NULL) {
|
||||||
|
gst_buffer_unref (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wav_new_chunk_callback(GstRiffChunk *chunk, gpointer data)
|
static void wav_new_chunk_callback(GstRiffChunk *chunk, gpointer data)
|
||||||
|
|
Loading…
Reference in a new issue