Commit cca77e21 authored by Andy Wingo's avatar Andy Wingo
Browse files

a hack to work around intltool's brokenness a current check for mpeg2dec...

a hack to work around intltool's brokenness a current check for mpeg2dec details->klass reorganizations an element br...

Original commit message from CVS:
* a hack to work around intltool's brokenness
* a current check for mpeg2dec
* details->klass reorganizations
* an element browser that uses details->klass
* separated cdxa parse out from the avi directory
parent d4458d89
......@@ -166,7 +166,7 @@ GST_PLUGIN_LDFLAGS='-module -avoid-version'
AC_SUBST(GST_PLUGIN_LDFLAGS)
GST_PLUGINS_ALL="\
ac3parse adder audioscale auparse avi chart\
ac3parse adder audioscale auparse avi cdxaparse chart\
cutter deinterlace flx goom intfloat law level\
median mpeg1enc mpeg1sys mpeg1videoparse mpeg2enc mpeg2sub\
mpegaudio mpegaudioparse mpegstream mpegtypes modplug\
......@@ -744,6 +744,7 @@ gst/adder/Makefile
gst/audioscale/Makefile
gst/auparse/Makefile
gst/avi/Makefile
gst/cdxaparse/Makefile
gst/chart/Makefile
gst/cutter/Makefile
gst/deinterlace/Makefile
......
......@@ -70,7 +70,7 @@ GType gst_esdmon_get_type(void);
/* elementfactory information */
static GstElementDetails esdmon_details = {
"Esound audio monitor",
"Src/Esdmon",
"Source/Audio",
"Monitors audio from an esound server",
VERSION,
"Richard Boulton <richard-gst@tartarus.org>",
......
......@@ -26,7 +26,7 @@
/* elementfactory information */
static GstElementDetails esdsink_details = {
"Esound audio sink",
"Sink/Esdsink",
"Sink/Audio",
"Plays audio to an esound server",
VERSION,
"Richard Boulton <richard-gst@tartarus.org>",
......
......@@ -29,7 +29,7 @@ extern GstPadTemplate *dec_src_template, *dec_sink_template;
/* elementfactory information */
GstElementDetails flacdec_details = {
"FLAC decoder",
"Filter/Audio/Decoder",
"Codec/Audio/Decoder",
"Decodes FLAC lossless audio streams",
VERSION,
"Wim Taymans <wim.taymans@chello.be>",
......
......@@ -28,7 +28,7 @@ extern GstPadTemplate *enc_src_template, *enc_sink_template;
/* elementfactory information */
GstElementDetails flacenc_details = {
"FLAC encoder",
"Filter/Audio/Encoder",
"Codec/Audio/Encoder",
"Encodes audio with the FLAC lossless audio encoder",
VERSION,
"Wim Taymans <wim.taymans@chello.be>",
......
......@@ -28,7 +28,7 @@ extern GstPadTemplate *jpegdec_src_template, *jpegdec_sink_template;
/* elementfactory information */
GstElementDetails gst_jpegdec_details = {
"jpeg image decoder",
"Filter/Decoder/Image",
"Codec/Image/Decoder",
".jpeg",
VERSION,
"Wim Taymans <wim.taymans@tvd.be>",
......
......@@ -25,7 +25,7 @@
/* elementfactory information */
GstElementDetails gst_jpegenc_details = {
"jpeg image encoder",
"Filter/Encoder/Image",
"Codec/Image/Encoder",
".jpeg",
VERSION,
"Wim Taymans <wim.taymans@tvd.be>",
......
......@@ -398,6 +398,7 @@ gst_ladspa_init (GstLADSPA *ladspa)
ladspa->newcaps = FALSE;
ladspa->activated = FALSE;
ladspa->bufpool = NULL;
ladspa->inplace_broken = LADSPA_IS_INPLACE_BROKEN(ladspa->descriptor->Properties);
if (sinkcount==0 && srccount == 1) {
/* get mode (no sink pads) */
......@@ -719,7 +720,6 @@ gst_ladspa_loop(GstElement *element)
GstBuffer **buffers_in, **buffers_out;
GstBufferPool *bufpool;
GstByteStream **bytestreams;
gboolean inplace_broken;
GstLADSPA *ladspa = (GstLADSPA *)element;
GstLADSPAClass *oclass = (GstLADSPAClass*)(G_OBJECT_GET_CLASS (ladspa));
......@@ -799,7 +799,7 @@ gst_ladspa_loop(GstElement *element)
/* we now have a full set of buffers_in.
* now share or create the buffers_out */
for (i=0 ; i<numsrcpads ; i++){
if (i <= numsinkpads && !inplace_broken){
if (i <= numsinkpads && !ladspa->inplace_broken){
/* we can share buffers */
buffers_out[i] = buffers_in[i];
data_out[i] = data_in[i];
......@@ -845,7 +845,7 @@ gst_ladspa_loop(GstElement *element)
buffers_out[i] = NULL;
}
for (i=0 ; i<numsinkpads ; i++) {
if (i > numsrcpads || inplace_broken){
if (i > numsrcpads || ladspa->inplace_broken){
/* we have some buffers to unref */
gst_buffer_unref(buffers_in[i]);
}
......@@ -873,11 +873,10 @@ static void
gst_ladspa_chain (GstPad *pad, GstBuffer *buf)
{
LADSPA_Descriptor *desc;
LADSPA_Data *data_in, **data_out;
GstBuffer **buffers_out;
LADSPA_Data *data_in, **data_out = NULL;
GstBuffer **buffers_out = NULL;
unsigned long num_samples;
gboolean inplace_broken;
guint num_to_process, num_processed, i, numsrcpads;
GstLADSPA *ladspa;
......@@ -909,13 +908,12 @@ gst_ladspa_chain (GstPad *pad, GstBuffer *buf)
desc = ladspa->descriptor;
inplace_broken = LADSPA_IS_INPLACE_BROKEN(desc->Properties);
if (numsrcpads > 0){
guint num_created_buffers = 0;
buffers_out = g_new(GstBuffer*, numsrcpads);
data_out = g_new(LADSPA_Data*, numsrcpads);
if (inplace_broken){
if (ladspa->inplace_broken){
num_created_buffers = numsrcpads;
}
else {
......@@ -1077,7 +1075,7 @@ ladspa_describe_plugin(const char *pcFullFilename,
/* construct the element details struct */
details = g_new0(GstElementDetails,1);
details->longname = g_strdup(desc->Name);
details->klass = "Filter/LADSPA";
details->klass = "Filter/Audio/LADSPA";
details->description = details->longname;
details->version = g_strdup_printf("%ld",desc->UniqueID);
details->author = g_strdup(desc->Maker);
......
......@@ -66,7 +66,7 @@ struct _GstLADSPA {
gint samplerate, buffersize, numbuffers;
gint64 timestamp;
gboolean inplace_broken;
};
struct _GstLADSPAClass {
......
......@@ -30,7 +30,7 @@
/* elementfactory information */
static GstElementDetails gst_auparse_details = {
".au parser",
"Parser/Audio",
"Codec/Parser",
"Parse an .au file into raw audio",
VERSION,
"Erik Walthinsen <omega@cse.ogi.edu>",
......
......@@ -2,20 +2,17 @@ plugindir = $(libdir)/gst
plugin_LTLIBRARIES = \
libgstavimux.la \
libgstavidemux.la \
libgstcdxaparse.la
libgstavidemux.la
# libgstaviaudiodecoder.la
libgstavidemux_la_SOURCES = gstavidemux.c
libgstavimux_la_SOURCES = gstavimux.c
# libgstaviaudiodecoder_la_SOURCES = gstaviaudiodecoder.c
libgstcdxaparse_la_SOURCES = gstcdxaparse.c
noinst_HEADERS = \
gstavimux.h \
gstavidemux.h \
gstaviaudiodecoder.h \
gstcdxaparse.h
gstaviaudiodecoder.h
#CFLAGS += -Wall -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions -ffast-math -DNDEBUG
......@@ -31,8 +28,4 @@ libgstavimux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
# libgstaviaudiodecoder_la_LIBADD =
# libgstaviaudiodecoder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
libgstcdxaparse_la_CFLAGS = -O2 -ffast-math $(GST_CFLAGS)
libgstcdxaparse_la_LIBADD =
libgstcdxaparse_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
EXTRA_DIST = README_win32dll README
......@@ -26,9 +26,9 @@
/* elementfactory information */
static GstElementDetails gst_avi_demux_details = {
".avi parser",
"Parser/Video",
"Parse a .avi file into audio and video",
"Avi demuxer",
"Codec/Demuxer",
"Demultiplex an avi file into audio and video",
VERSION,
"Erik Walthinsen <omega@cse.ogi.edu>\n"
"Wim Taymans <wim.taymans@tvd.be>",
......
......@@ -45,8 +45,8 @@
static GstElementDetails
gst_avimux_details =
{
".avi mux",
"Mux/Video",
"Avi multiplexer",
"Codec/Muxer",
"Muxes audio and video into an avi stream",
VERSION,
"Ronald Bultje <rbultje@ronald.bitfreak.net>",
......
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* <2002> Wim Taymans <wim.taymans@chello.be>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <string.h>
#include "gstcdxaparse.h"
#define MAKE_FOUR_CC(a,b,c,d) ( ((guint32)a) | (((guint32)b)<< 8) | \
((guint32)c)<<16 | (((guint32)d)<<24) )
/* RIFF types */
#define GST_RIFF_TAG_RIFF MAKE_FOUR_CC('R','I','F','F')
#define GST_RIFF_RIFF_CDXA MAKE_FOUR_CC('C','D','X','A')
#define GST_RIFF_TAG_fmt MAKE_FOUR_CC('f','m','t',' ')
#define GST_RIFF_TAG_data MAKE_FOUR_CC('d','a','t','a')
/* elementfactory information */
static GstElementDetails gst_cdxa_parse_details = {
".dat parser",
"Parser/Video",
"Parse a .dat file (VCD) into raw mpeg1",
VERSION,
"Wim Taymans <wim.taymans@tvd.be>",
"(C) 2002",
};
static GstCaps* cdxa_type_find (GstBuffer *buf, gpointer private);
/* typefactory for 'cdxa' */
static GstTypeDefinition cdxadefinition = {
"cdxaparse_video/avi",
"video/avi",
".dat",
cdxa_type_find,
};
/* CDXAParse signals and args */
enum {
/* FILL ME */
LAST_SIGNAL
};
enum {
ARG_0,
/* FILL ME */
};
GST_PAD_TEMPLATE_FACTORY (sink_templ,
"sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"cdxaparse_sink",
"video/avi",
"format", GST_PROPS_STRING ("CDXA")
)
)
GST_PAD_TEMPLATE_FACTORY (src_templ,
"src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_CAPS_NEW (
"cdxaparse_src",
"video/mpeg",
"mpegversion", GST_PROPS_INT (1),
"systemstream", GST_PROPS_BOOLEAN (TRUE)
)
)
static void gst_cdxa_parse_class_init (GstCDXAParseClass *klass);
static void gst_cdxa_parse_init (GstCDXAParse *cdxa_parse);
static void gst_cdxa_parse_loop (GstElement *element);
static GstElementStateReturn
gst_cdxa_parse_change_state (GstElement *element);
static GstElementClass *parent_class = NULL;
/*static guint gst_cdxa_parse_signals[LAST_SIGNAL] = { 0 }; */
GType
gst_cdxa_parse_get_type(void)
{
static GType cdxa_parse_type = 0;
if (!cdxa_parse_type) {
static const GTypeInfo cdxa_parse_info = {
sizeof(GstCDXAParseClass),
NULL,
NULL,
(GClassInitFunc)gst_cdxa_parse_class_init,
NULL,
NULL,
sizeof(GstCDXAParse),
0,
(GInstanceInitFunc)gst_cdxa_parse_init,
};
cdxa_parse_type = g_type_register_static(GST_TYPE_ELEMENT, "GstCDXAParse", &cdxa_parse_info, 0);
}
return cdxa_parse_type;
}
static void
gst_cdxa_parse_class_init (GstCDXAParseClass *klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
gobject_class = (GObjectClass*)klass;
gstelement_class = (GstElementClass*)klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
gstelement_class->change_state = gst_cdxa_parse_change_state;
}
static void
gst_cdxa_parse_init (GstCDXAParse *cdxa_parse)
{
GST_FLAG_SET (cdxa_parse, GST_ELEMENT_EVENT_AWARE);
cdxa_parse->sinkpad = gst_pad_new_from_template (
GST_PAD_TEMPLATE_GET (sink_templ), "sink");
gst_element_add_pad (GST_ELEMENT (cdxa_parse), cdxa_parse->sinkpad);
cdxa_parse->srcpad = gst_pad_new_from_template (
GST_PAD_TEMPLATE_GET (src_templ), "src");
gst_element_add_pad (GST_ELEMENT (cdxa_parse), cdxa_parse->srcpad);
gst_element_set_loop_function (GST_ELEMENT (cdxa_parse), gst_cdxa_parse_loop);
}
static GstCaps*
cdxa_type_find (GstBuffer *buf,
gpointer private)
{
gchar *data = GST_BUFFER_DATA (buf);
GstCaps *new;
GST_DEBUG (0,"cdxa_parse: typefind");
if (GUINT32_FROM_LE (((guint32 *)data)[0]) != GST_RIFF_TAG_RIFF)
return NULL;
if (GUINT32_FROM_LE (((guint32 *)data)[2]) != GST_RIFF_RIFF_CDXA)
return NULL;
new = GST_CAPS_NEW ("cdxa_type_find",
"video/avi",
"RIFF", GST_PROPS_STRING ("CDXA"));
return new;
}
static gboolean
gst_cdxa_parse_handle_event (GstCDXAParse *cdxa_parse)
{
guint32 remaining;
GstEvent *event;
GstEventType type;
gst_bytestream_get_status (cdxa_parse->bs, &remaining, &event);
type = event? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN;
switch (type) {
case GST_EVENT_EOS:
gst_pad_event_default (cdxa_parse->sinkpad, event);
break;
case GST_EVENT_SEEK:
g_warning ("seek event\n");
break;
case GST_EVENT_FLUSH:
g_warning ("flush event\n");
break;
case GST_EVENT_DISCONTINUOUS:
g_warning ("discont event\n");
break;
default:
g_warning ("unhandled event %d\n", type);
break;
}
return TRUE;
}
/*
CDXA starts with the following header:
! RIFF:4 ! size:4 ! "CDXA" ! "fmt " ! size:4 ! (size+1)&~1 bytes of crap !
! "data" ! data_size:4 ! (data_size/2352) sectors...
*/
typedef struct
{
gchar RIFF_tag[4];
guint32 riff_size;
gchar CDXA_tag[4];
gchar fmt_tag[4];
guint32 fmt_size;
} CDXAParseHeader;
/*
A sectors is 2352 bytes long and is composed of:
! sync ! header ! subheader ! data ... ! edc !
! 12 bytes ! 4 bytes ! 8 bytes ! 2324 bytes ! 4 bytes !
!-------------------------------------------------------!
We parse the data out of it and send it to the srcpad.
*/
static void
gst_cdxa_parse_loop (GstElement *element)
{
GstCDXAParse *cdxa_parse;
CDXAParseHeader *header;
g_return_if_fail (element != NULL);
g_return_if_fail (GST_IS_CDXA_PARSE (element));
cdxa_parse = GST_CDXA_PARSE (element);
if (cdxa_parse->state == CDXA_PARSE_HEADER) {
guint32 fmt_size;
guint8 *buf;
header = (CDXAParseHeader *) gst_bytestream_peek_bytes (cdxa_parse->bs, 20);
if (!header)
return;
cdxa_parse->riff_size = GUINT32_FROM_LE (header->riff_size);
fmt_size = (GUINT32_FROM_LE (header->fmt_size) + 1)&~1;
/* flush the header + fmt_size bytes + 4 bytes "data" */
if (!gst_bytestream_flush (cdxa_parse->bs, 20 + fmt_size + 4))
return;
/* get the data size */
buf = gst_bytestream_peek_bytes (cdxa_parse->bs, 4);
if (!buf)
return;
cdxa_parse->data_size = GUINT32_FROM_LE (*((guint32 *)buf));
/* flush the data size */
if (!gst_bytestream_flush (cdxa_parse->bs, 4))
return;
if (cdxa_parse->data_size % CDXA_SECTOR_SIZE)
g_warning ("cdxa_parse: size not multiple of %d bytes", CDXA_SECTOR_SIZE);
cdxa_parse->sectors = cdxa_parse->data_size / CDXA_SECTOR_SIZE;
cdxa_parse->state = CDXA_PARSE_DATA;
}
else {
GstBuffer *buf;
GstBuffer *outbuf;
buf = gst_bytestream_read (cdxa_parse->bs, CDXA_SECTOR_SIZE);
if (!buf) {
gst_cdxa_parse_handle_event (cdxa_parse);
return;
}
outbuf = gst_buffer_create_sub (buf, 24, CDXA_DATA_SIZE);
gst_buffer_unref (buf);
gst_pad_push (cdxa_parse->srcpad, outbuf);
}
}
static GstElementStateReturn
gst_cdxa_parse_change_state (GstElement *element)
{
GstCDXAParse *cdxa_parse = GST_CDXA_PARSE (element);
switch (GST_STATE_TRANSITION (element)) {
case GST_STATE_NULL_TO_READY:
break;
case GST_STATE_READY_TO_PAUSED:
cdxa_parse->state = CDXA_PARSE_HEADER;
cdxa_parse->bs = gst_bytestream_new (cdxa_parse->sinkpad);
break;
case GST_STATE_PAUSED_TO_PLAYING:
break;
case GST_STATE_PLAYING_TO_PAUSED:
break;
case GST_STATE_PAUSED_TO_READY:
gst_bytestream_destroy (cdxa_parse->bs);
break;
case GST_STATE_READY_TO_NULL:
break;
default:
break;
}
parent_class->change_state (element);
return GST_STATE_SUCCESS;
}
static gboolean
plugin_init (GModule *module, GstPlugin *plugin)
{
GstElementFactory *factory;
GstTypeFactory *type;
/* this filter needs the riff parser */
if (!gst_library_load ("gstbytestream")) {
gst_info("cdxaparse: could not load support library: 'gstbytestream'\n");
return FALSE;
}
/* create an elementfactory for the cdxa_parse element */
factory = gst_element_factory_new ("cdxaparse", GST_TYPE_CDXA_PARSE,
&gst_cdxa_parse_details);
g_return_val_if_fail (factory != NULL, FALSE);
gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (src_templ));
gst_element_factory_add_pad_template (factory, GST_PAD_TEMPLATE_GET (sink_templ));
type = gst_type_factory_new (&cdxadefinition);
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (type));
gst_plugin_add_feature (plugin, GST_PLUGIN_FEATURE (factory));
return TRUE;
}
GstPluginDesc plugin_desc = {
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"cdxaparse",
plugin_init
};
/* GStreamer
* Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu>
* <2002> Wim Tayans <wim.taymans@chello.be>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_CDXA_PARSE_H__
#define __GST_CDXA_PARSE_H__
#include <config.h>
#include <gst/gst.h>
#include <gst/bytestream/bytestream.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define GST_TYPE_CDXA_PARSE \
(gst_cdxa_parse_get_type())
#define GST_CDXA_PARSE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_CDXA_PARSE,GstCDXAParse))
#define GST_CDXA_PARSE_CLASS(klass) \