Another merge from HEAD into CAPSNEGO1

Original commit message from CVS:
Another merge from HEAD into CAPSNEGO1
This commit is contained in:
Wim Taymans 2001-03-12 20:04:22 +00:00
parent b2a8888398
commit 91f9620700
17 changed files with 449 additions and 130 deletions

View file

@ -14,11 +14,11 @@ else
SUBDIRS_DOCS = SUBDIRS_DOCS =
endif endif
SUBDIRS = include gst libs plugins tools test tests examples \ SUBDIRS = include gst libs plugins tools test tests testsuite examples \
$(SUBDIRS_LGG) $(SUBDIRS_DOCS) $(SUBDIRS_LGG) $(SUBDIRS_DOCS)
# These are all the possible subdirs # These are all the possible subdirs
DIST_SUBDIRS = include gst libs plugins tools test tests examples gstplay editor docs debian DIST_SUBDIRS = include gst libs plugins tools test tests testsuite examples gstplay editor docs debian
bin_SCRIPTS = gstreamer-config bin_SCRIPTS = gstreamer-config

View file

@ -27,6 +27,8 @@ libvorbis (for vorbisenc, vorbisdec)
libcdparanoia (for cdparanoia ripper) libcdparanoia (for cdparanoia ripper)
liblame (for lame mp3 encoder) liblame (for lame mp3 encoder)
libshout (for the shoutcast plugin) libshout (for the shoutcast plugin)
libasound (for the alsa src/sink plugin)
librtp (for the rtp sink plugin)
for AVI playback you might want to get the windows libraries from for AVI playback you might want to get the windows libraries from
http://divx.euro.ru/ and put the .dll files in /usr/lib/win32/ http://divx.euro.ru/ and put the .dll files in /usr/lib/win32/

View file

@ -178,6 +178,8 @@ AC_PATH_PROG(XML_CONFIG, xml-config, no)
if test x$XML_CONFIG = xno; then if test x$XML_CONFIG = xno; then
AC_MSG_ERROR(Couldn't find xml-config) AC_MSG_ERROR(Couldn't find xml-config)
fi fi
AC_CHECK_LIB(xml, xmlDocGetRootElement, ,
[ AC_MSG_ERROR(Need version 1.8.1 or better of libxml) ])
XML_LIBS=`xml-config --libs` XML_LIBS=`xml-config --libs`
XML_CFLAGS=`xml-config --cflags` XML_CFLAGS=`xml-config --cflags`
AC_SUBST(XML_LIBS) AC_SUBST(XML_LIBS)
@ -193,7 +195,7 @@ dnl =======================================
dnl Check for libesd dnl Check for libesd
AM_PATH_ESD(0.2.12, HAVE_LIBESD=yes, HAVE_LIBESD=no) AM_PATH_ESD(0.2.12, HAVE_LIBESD=yes, HAVE_LIBESD=no)
AM_PATH_XMMS(0.1.0, HAVE_LIBXMMS=yes, HAVE_LIBXMMS=no) dnl AM_PATH_XMMS(0.1.0, HAVE_LIBXMMS=yes, HAVE_LIBXMMS=no)
dnl Check for libasound dnl Check for libasound
alsa_save_LIBS=$LIBS alsa_save_LIBS=$LIBS
@ -218,6 +220,24 @@ AC_SUBST(GDK_PIXBUF_LIBS)
AC_SUBST(GDK_PIXBUF_CFLAGS) AC_SUBST(GDK_PIXBUF_CFLAGS)
dnl Check for libgnome
AC_PATH_PROG(GNOME_CONFIG, gnome-config, no)
if test x$GNOME_CONFIG = xno; then
AC_MSG_WARN(Couldn't find gnome-config: can't build editor or gstplay)
GNOME_LIBS=
GNOME_CFLAGS=
HAVE_GNOME=no
else
GNOME_LIBS=`gnome-config --libs gnome gnomeui`
GNOME_CFLAGS=`gnome-config --cflags gnome gnomeui`
GHTTP_LIBS=`gnome-config --libs gnome gnomeui`
GHTTP_CFLAGS=`gnome-config --cflags gnome gnomeui`
HAVE_GNOME=yes
fi
AC_SUBST(GNOME_LIBS)
AC_SUBST(GNOME_CFLAGS)
AC_SUBST(GHTTP_LIBS)
dnl Check for libghttp dnl Check for libghttp
dnl FIXME: need to check for header dnl FIXME: need to check for header
AC_CHECK_LIB(ghttp, ghttp_request_new, AC_CHECK_LIB(ghttp, ghttp_request_new,
@ -231,26 +251,8 @@ AC_CHECK_LIB(ghttp, ghttp_request_new,
HAVE_LIBGHTTP=no HAVE_LIBGHTTP=no
], ],
$LIBS) $LIBS)
AC_SUBST(GHTTP_LIBS)
AC_SUBST(GST_HTTPSRC_GET_TYPE) AC_SUBST(GST_HTTPSRC_GET_TYPE)
dnl Check for libgnome
AC_PATH_PROG(GNOME_CONFIG, gnome-config, no)
if test x$GNOME_CONFIG = xno; then
AC_MSG_WARN(Couldn't find gnome-config: can't build editor or gstplay)
GNOME_LIBS=
GNOME_CFLAGS=
HAVE_GNOME=no
else
GNOME_LIBS=`gnome-config --libs gnome gnomeui`
GNOME_CFLAGS=`gnome-config --cflags gnome gnomeui`
HAVE_GNOME=yes
fi
AC_SUBST(GNOME_LIBS)
AC_SUBST(GNOME_CFLAGS)
dnl Check for libglade dnl Check for libglade
HAVE_LIBGLADE_GNOME="no" HAVE_LIBGLADE_GNOME="no"
AC_PATH_PROG(LIBGLADE_CONFIG_PATH, libglade-config, no) AC_PATH_PROG(LIBGLADE_CONFIG_PATH, libglade-config, no)
@ -367,6 +369,10 @@ AC_MSG_CHECKING(mpeg2dec library)
AC_CHECK_LIB(mpeg2, mpeg2_init, HAVE_MPEG2DEC=yes, HAVE_MPEG2DEC=no, ) AC_CHECK_LIB(mpeg2, mpeg2_init, HAVE_MPEG2DEC=yes, HAVE_MPEG2DEC=no, )
AC_CHECK_HEADER(mpeg2dec/mpeg2.h, :, HAVE_MPEG2DEC=no) AC_CHECK_HEADER(mpeg2dec/mpeg2.h, :, HAVE_MPEG2DEC=no)
dnl Check for librtp
AC_MSG_CHECKING(rtp library)
AC_CHECK_LIB(rtp, rtp_packet_new_take_data, HAVE_LIBRTP=yes, HAVE_LIBRTP=no, $GLIB_LIBS $GLIB_CFLAGS)
dnl check if css-auth.c exists (FIXME) dnl check if css-auth.c exists (FIXME)
AC_MSG_CHECKING(DVD CSS code) AC_MSG_CHECKING(DVD CSS code)
@ -600,6 +606,7 @@ AM_CONDITIONAL(HAVE_LIBESD, test "x$HAVE_LIBESD" = "xyes")
AM_CONDITIONAL(HAVE_LIBASOUND, test "x$HAVE_LIBASOUND" = "xyes") AM_CONDITIONAL(HAVE_LIBASOUND, test "x$HAVE_LIBASOUND" = "xyes")
AM_CONDITIONAL(HAVE_MPEG2DEC, test "x$HAVE_MPEG2DEC" = "xyes") AM_CONDITIONAL(HAVE_MPEG2DEC, test "x$HAVE_MPEG2DEC" = "xyes")
AM_CONDITIONAL(HAVE_LIBXMMS, test "x$HAVE_LIBXMMS" = "xyes") AM_CONDITIONAL(HAVE_LIBXMMS, test "x$HAVE_LIBXMMS" = "xyes")
AM_CONDITIONAL(HAVE_LIBRTP, test "x$HAVE_LIBRTP" = "xyes")
@ -693,8 +700,9 @@ libs/putbits/Makefile
libs/winloader/Makefile libs/winloader/Makefile
libs/idct/Makefile libs/idct/Makefile
plugins/Makefile plugins/Makefile
plugins/alsa/Makefile
plugins/au/Makefile plugins/au/Makefile
plugins/wav/Makefile plugins/audioscale/Makefile
plugins/avi/Makefile plugins/avi/Makefile
plugins/avi/wincodec/Makefile plugins/avi/wincodec/Makefile
plugins/jpeg/Makefile plugins/jpeg/Makefile
@ -724,6 +732,8 @@ plugins/mpeg1/system_encode/Makefile
plugins/mpeg1/mpeg1encoder/Makefile plugins/mpeg1/mpeg1encoder/Makefile
plugins/mpeg1video/Makefile plugins/mpeg1video/Makefile
plugins/mpeg1video/parse/Makefile plugins/mpeg1video/parse/Makefile
plugins/rtp/Makefile
plugins/rtp/rtpsend/Makefile
plugins/filters/Makefile plugins/filters/Makefile
plugins/filters/smooth/Makefile plugins/filters/smooth/Makefile
plugins/filters/median/Makefile plugins/filters/median/Makefile
@ -740,7 +750,7 @@ plugins/visualization/synaesthesia/Makefile
plugins/visualization/smoothwave/Makefile plugins/visualization/smoothwave/Makefile
plugins/videosink/Makefile plugins/videosink/Makefile
plugins/videoscale/Makefile plugins/videoscale/Makefile
plugins/audioscale/Makefile plugins/wav/Makefile
plugins/dvdsrc/Makefile plugins/dvdsrc/Makefile
plugins/vcdsrc/Makefile plugins/vcdsrc/Makefile
plugins/rtjpeg/Makefile plugins/rtjpeg/Makefile
@ -760,6 +770,7 @@ tests/Makefile
tests/sched/Makefile tests/sched/Makefile
tests/eos/Makefile tests/eos/Makefile
tests/nego/Makefile tests/nego/Makefile
testsuite/Makefile
examples/Makefile examples/Makefile
examples/autoplug/Makefile examples/autoplug/Makefile
examples/helloworld/Makefile examples/helloworld/Makefile

View file

@ -149,8 +149,6 @@ main(int argc, char *argv[])
gst_element_set_state (bin, GST_STATE_PLAYING); gst_element_set_state (bin, GST_STATE_PLAYING);
playing = TRUE;
while (gst_bin_iterate(GST_BIN(bin))); while (gst_bin_iterate(GST_BIN(bin)));
gst_element_set_state (bin, GST_STATE_NULL); gst_element_set_state (bin, GST_STATE_NULL);

View file

@ -1,6 +1,7 @@
/* GStreamer /* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be> * 2000 Wim Taymans <wtay@chello.be>
* 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
* *
* gstsinesrc.c: * gstsinesrc.c:
* *
@ -51,20 +52,25 @@ enum {
ARG_0, ARG_0,
ARG_VOLUME, ARG_VOLUME,
ARG_FORMAT, ARG_FORMAT,
ARG_CHANNELS, ARG_SAMPLERATE,
ARG_FREQUENCY, ARG_FREQ,
ARG_TABLESIZE,
ARG_BUFFER_SIZE,
}; };
static void gst_sinesrc_class_init(GstSineSrcClass *klass); static void gst_sinesrc_class_init(GstSineSrcClass *klass);
static void gst_sinesrc_init(GstSineSrc *sinesrc); static void gst_sinesrc_init(GstSineSrc *src);
static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id);
static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id);
//static gboolean gst_sinesrc_change_state(GstElement *element, //static gboolean gst_sinesrc_change_state(GstElement *element,
// GstElementState state); // GstElementState state);
//static void gst_sinesrc_close_audio(GstSineSrc *src); //static void gst_sinesrc_close_audio(GstSineSrc *src);
//static gboolean gst_sinesrc_open_audio(GstSineSrc *src); //static gboolean gst_sinesrc_open_audio(GstSineSrc *src);
void gst_sinesrc_sync_parms(GstSineSrc *sinesrc); static void gst_sinesrc_populate_sinetable(GstSineSrc *src);
static inline void gst_sinesrc_update_table_inc(GstSineSrc *src);
static inline void gst_sinesrc_update_vol_scale(GstSineSrc *src);
void gst_sinesrc_sync_parms(GstSineSrc *src);
static GstBuffer * gst_sinesrc_get(GstPad *pad); static GstBuffer * gst_sinesrc_get(GstPad *pad);
@ -105,31 +111,44 @@ gst_sinesrc_class_init(GstSineSrcClass *klass) {
GTK_ARG_READWRITE, ARG_VOLUME); GTK_ARG_READWRITE, ARG_VOLUME);
gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_FORMAT); GTK_ARG_READWRITE, ARG_FORMAT);
gtk_object_add_arg_type("GstSineSrc::channels", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::samplerate", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_CHANNELS); GTK_ARG_READWRITE, ARG_SAMPLERATE);
gtk_object_add_arg_type("GstSineSrc::frequency", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::tablesize", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_FREQUENCY); GTK_ARG_READWRITE, ARG_TABLESIZE);
gtk_object_add_arg_type("GstSineSrc::freq", GTK_TYPE_DOUBLE,
GTK_ARG_READWRITE, ARG_FREQ);
gtk_object_add_arg_type("GstSineSrc::buffersize", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_BUFFER_SIZE);
gtkobject_class->set_arg = gst_sinesrc_set_arg; gtkobject_class->set_arg = gst_sinesrc_set_arg;
gtkobject_class->get_arg = gst_sinesrc_get_arg; gtkobject_class->get_arg = gst_sinesrc_get_arg;
// gstelement_class->change_state = gst_sinesrc_change_state; // gstelement_class->change_state = gst_sinesrc_change_state;
} }
static void gst_sinesrc_init(GstSineSrc *sinesrc) { static void gst_sinesrc_init(GstSineSrc *src) {
sinesrc->srcpad = gst_pad_new("src",GST_PAD_SRC);
gst_pad_set_get_function(sinesrc->srcpad,gst_sinesrc_get); src->srcpad = gst_pad_new("src",GST_PAD_SRC);
gst_element_add_pad(GST_ELEMENT(sinesrc),sinesrc->srcpad); gst_pad_set_get_function(src->srcpad, gst_sinesrc_get);
gst_element_add_pad(GST_ELEMENT(src), src->srcpad);
sinesrc->volume = 1.0; src->volume = 1.0;
gst_sinesrc_update_vol_scale(src);
sinesrc->format = AFMT_S16_LE; src->format = AFMT_S16_LE;
sinesrc->channels = 2; src->samplerate = 44100;
sinesrc->frequency = 44100; src->freq = 100.0;
src->table_pos = 0.0;
src->table_size = 1024;
gst_sinesrc_populate_sinetable(src);
gst_sinesrc_update_table_inc(src);
gst_sinesrc_sync_parms(src);
src->buffer_size=1024;
src->seq = 0;
sinesrc->seq = 0; src->sentmeta = FALSE;
sinesrc->sentmeta = FALSE;
} }
static GstBuffer * static GstBuffer *
@ -139,23 +158,43 @@ gst_sinesrc_get(GstPad *pad)
GstBuffer *buf; GstBuffer *buf;
gint16 *samples; gint16 *samples;
gint i; gint i;
gint volume;
gdouble val;
g_return_val_if_fail (pad != NULL, NULL); g_return_val_if_fail (pad != NULL, NULL);
src = GST_SINESRC(gst_pad_get_parent (pad)); src = GST_SINESRC(gst_pad_get_parent (pad));
buf = gst_buffer_new(); buf = gst_buffer_new();
g_return_val_if_fail (buf, NULL); g_return_val_if_fail (buf, NULL);
GST_BUFFER_DATA(buf) = (gpointer)malloc(4096); samples = g_new(gint16, src->buffer_size);
samples = (gint16*)GST_BUFFER_DATA(buf); GST_BUFFER_DATA(buf) = (gpointer) samples;
GST_BUFFER_SIZE(buf) = 4096; GST_BUFFER_SIZE(buf) = 2 * src->buffer_size;
for (i=0 ; i < src->buffer_size; i++) {
src->table_lookup = (gint)(src->table_pos);
src->table_lookup_next = src->table_lookup + 1;
src->table_interp = src->table_pos - src->table_lookup;
// wrap the array lookups if we're out of bounds
if (src->table_lookup_next >= src->table_size){
src->table_lookup_next -= src->table_size;
if (src->table_lookup >= src->table_size){
src->table_lookup -= src->table_size;
src->table_pos -= src->table_size;
}
}
src->table_pos += src->table_inc;
volume = 65535 * src->volume; //no interpolation
for (i=0;i<1024;i++) { //samples[i] = src->table_data[src->table_lookup]
val = sin((gdouble)i/src->frequency); // * src->vol_scale;
samples[i] = val * volume;
samples[i+1] = samples[i]; //linear interpolation
samples[i] = ((src->table_interp
*(src->table_data[src->table_lookup_next]
-src->table_data[src->table_lookup]
)
)+src->table_data[src->table_lookup]
)* src->vol_scale;
} }
if (!src->sentmeta) { if (!src->sentmeta) {
@ -165,7 +204,7 @@ gst_sinesrc_get(GstPad *pad)
src->sentmeta = TRUE; src->sentmeta = TRUE;
} }
g_print(">"); //g_print(">");
return buf; return buf;
} }
@ -178,17 +217,35 @@ static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id) {
switch (id) { switch (id) {
case ARG_VOLUME: case ARG_VOLUME:
if (GTK_VALUE_DOUBLE(*arg) < 0.0 || GTK_VALUE_DOUBLE(*arg) > 1.0)
break;
src->volume = GTK_VALUE_DOUBLE(*arg); src->volume = GTK_VALUE_DOUBLE(*arg);
gst_sinesrc_update_vol_scale(src);
break; break;
case ARG_FORMAT: case ARG_FORMAT:
src->format = GTK_VALUE_INT(*arg); src->format = GTK_VALUE_INT(*arg);
gst_sinesrc_sync_parms(src);
break; break;
case ARG_CHANNELS: case ARG_SAMPLERATE:
src->channels = GTK_VALUE_INT(*arg); src->samplerate = GTK_VALUE_INT(*arg);
gst_sinesrc_sync_parms(src);
gst_sinesrc_update_table_inc(src);
break; break;
case ARG_FREQUENCY: case ARG_FREQ: {
src->frequency = GTK_VALUE_INT(*arg); if (GTK_VALUE_DOUBLE(*arg) <= 0.0 || GTK_VALUE_DOUBLE(*arg) > src->samplerate/2)
break;
src->freq = GTK_VALUE_DOUBLE(*arg);
gst_sinesrc_update_table_inc(src);
break; break;
case ARG_TABLESIZE:
src->table_size = GTK_VALUE_INT(*arg);
gst_sinesrc_populate_sinetable(src);
gst_sinesrc_update_table_inc(src);
break;
case ARG_BUFFER_SIZE:
src->buffer_size = GTK_VALUE_INT(*arg);
break;
}
default: default:
break; break;
} }
@ -208,11 +265,17 @@ static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id) {
case ARG_FORMAT: case ARG_FORMAT:
GTK_VALUE_INT(*arg) = src->format; GTK_VALUE_INT(*arg) = src->format;
break; break;
case ARG_CHANNELS: case ARG_SAMPLERATE:
GTK_VALUE_INT(*arg) = src->channels; GTK_VALUE_INT(*arg) = src->samplerate;
break; break;
case ARG_FREQUENCY: case ARG_FREQ:
GTK_VALUE_INT(*arg) = src->frequency; GTK_VALUE_DOUBLE(*arg) = src->freq;
break;
case ARG_TABLESIZE:
GTK_VALUE_INT(*arg) = src->table_size;
break;
case ARG_BUFFER_SIZE:
GTK_VALUE_INT(*arg) = src->buffer_size;
break; break;
default: default:
arg->type = GTK_TYPE_INVALID; arg->type = GTK_TYPE_INVALID;
@ -243,9 +306,33 @@ static gboolean gst_sinesrc_change_state(GstElement *element,
} }
*/ */
void gst_sinesrc_sync_parms(GstSineSrc *sinesrc) { static void gst_sinesrc_populate_sinetable(GstSineSrc *src)
sinesrc->meta.format = sinesrc->format; {
sinesrc->meta.channels = sinesrc->channels; gint i;
sinesrc->meta.frequency = sinesrc->frequency; gdouble pi2scaled = M_PI * 2 / src->table_size;
sinesrc->sentmeta = FALSE; gfloat *table = g_new(gfloat, src->table_size);
for(i=0 ; i < src->table_size ; i++){
table[i] = (gfloat)sin(i * pi2scaled);
}
g_free(src->table_data);
src->table_data = table;
}
static inline void gst_sinesrc_update_table_inc(GstSineSrc *src)
{
src->table_inc = src->table_size * src->freq / src->samplerate;
}
static inline void gst_sinesrc_update_vol_scale(GstSineSrc *src)
{
src->vol_scale = 32767 * src->volume;
}
void gst_sinesrc_sync_parms(GstSineSrc *src) {
src->meta.format = src->format;
src->meta.channels = 1;
src->meta.frequency = src->samplerate;
src->sentmeta = FALSE;
} }

View file

@ -60,13 +60,23 @@ struct _GstSineSrc {
/* parameters */ /* parameters */
gdouble volume; gdouble volume;
gint freq; gdouble vol_scale;
gdouble freq;
/* lookup table data */
gfloat *table_data;
gdouble table_pos;
gdouble table_inc;
gint table_size;
gdouble table_interp;
gint table_lookup;
gint table_lookup_next;
/* audio parameters */ /* audio parameters */
gint format; gint format;
gint channels; gint samplerate;
gint frequency;
gint buffer_size;
gulong seq; gulong seq;
MetaAudioRaw meta; MetaAudioRaw meta;

View file

@ -63,8 +63,6 @@ gst_init (int *argc, char **argv[])
if (!g_thread_supported ()) g_thread_init (NULL); if (!g_thread_supported ()) g_thread_init (NULL);
_gst_progname = g_strdup(*argv[0]);
gtk_init (argc,argv); gtk_init (argc,argv);
if (!gst_init_check (argc,argv)) { if (!gst_init_check (argc,argv)) {
@ -123,9 +121,13 @@ gst_init_check (int *argc,
gboolean ret = TRUE; gboolean ret = TRUE;
gboolean showhelp = FALSE; gboolean showhelp = FALSE;
_gst_progname = NULL;
if (argc && argv) { if (argc && argv) {
gint i, j, k; gint i, j, k;
_gst_progname = g_strdup(*argv[0]);
for (i=1; i< *argc; i++) { for (i=1; i< *argc; i++) {
if (!strncmp ("--gst-info-mask=", (*argv)[i], 16)) { if (!strncmp ("--gst-info-mask=", (*argv)[i], 16)) {
guint32 val; guint32 val;
@ -184,6 +186,10 @@ gst_init_check (int *argc,
} }
} }
if (_gst_progname == NULL) {
_gst_progname = g_strdup("gstprog");
}
/* check for ENV variables */ /* check for ENV variables */
{ {

View file

@ -107,7 +107,7 @@ gst_pipeline_init (GstPipeline *pipeline)
* Returns: newly created GstPipeline * Returns: newly created GstPipeline
*/ */
GstElement* GstElement*
gst_pipeline_new (guchar *name) gst_pipeline_new (const guchar *name)
{ {
return gst_elementfactory_make ("pipeline", name); return gst_elementfactory_make ("pipeline", name);
} }

View file

@ -57,7 +57,7 @@ struct _GstPipelineClass {
}; };
GtkType gst_pipeline_get_type (void); GtkType gst_pipeline_get_type (void);
GstElement* gst_pipeline_new (guchar *name); GstElement* gst_pipeline_new (const guchar *name);
#define gst_pipeline_destroy(pipeline) gst_object_destroy(GST_OBJECT(pipeline)) #define gst_pipeline_destroy(pipeline) gst_object_destroy(GST_OBJECT(pipeline))
void gst_pipeline_iterate (GstPipeline *pipeline); void gst_pipeline_iterate (GstPipeline *pipeline);

View file

@ -24,9 +24,12 @@
static void gst_colorspace_rgb_to_rgb_identity(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest); static void gst_colorspace_rgb_to_rgb_identity(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest); static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_rgb24_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_rgb32_to_bgr32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest); static void gst_colorspace_rgb32_to_bgr32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_rgb555_to_rgb565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest); static void gst_colorspace_rgb555_to_rgb565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_bgr565_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest); static void gst_colorspace_bgr565_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_bgr24_to_bgr565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
static void gst_colorspace_bgr32_to_bgr565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest);
GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceConverter *space, GstColorSpaceType src, GstColorSpaceType dest) { GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceConverter *space, GstColorSpaceType src, GstColorSpaceType dest) {
switch(src) { switch(src) {
@ -39,6 +42,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC
case GST_COLORSPACE_BGR24: case GST_COLORSPACE_BGR24:
space->outsize = space->width*space->height*3; space->outsize = space->width*space->height*3;
return gst_colorspace_rgb24_to_bgr24; return gst_colorspace_rgb24_to_bgr24;
case GST_COLORSPACE_RGB32:
space->outsize = space->width*space->height*4;
return gst_colorspace_rgb24_to_rgb32;
default: default:
break; break;
} }
@ -52,6 +58,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC
case GST_COLORSPACE_BGR24: case GST_COLORSPACE_BGR24:
space->outsize = space->width*space->height*3; space->outsize = space->width*space->height*3;
return gst_colorspace_rgb_to_rgb_identity; return gst_colorspace_rgb_to_rgb_identity;
case GST_COLORSPACE_BGR565:
space->outsize = space->width*space->height*2;
return gst_colorspace_bgr24_to_bgr565;
default: default:
break; break;
} }
@ -78,6 +87,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC
case GST_COLORSPACE_BGR32: case GST_COLORSPACE_BGR32:
space->outsize = space->width*space->height*4; space->outsize = space->width*space->height*4;
return gst_colorspace_rgb_to_rgb_identity; return gst_colorspace_rgb_to_rgb_identity;
case GST_COLORSPACE_BGR565:
space->outsize = space->width*space->height*2;
return gst_colorspace_bgr32_to_bgr565;
default: default:
break; break;
} }
@ -122,7 +134,7 @@ static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigne
gint size; gint size;
gchar temp; gchar temp;
GST_DEBUG (0,"gst_colorspace_rgb24_to_bgr24 %p %p %d\n", src, dest, space->outsize); GST_DEBUG (0,"gst_colorspace_rgb24_to_bgr24 %p %p %d %d %d\n", src, dest, space->outsize, space->width, space->height);
size = space->outsize/3; size = space->outsize/3;
@ -145,6 +157,54 @@ static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigne
GST_DEBUG (0,"gst_colorspace_rgb24_to_bgr24 end\n"); GST_DEBUG (0,"gst_colorspace_rgb24_to_bgr24 end\n");
} }
static void gst_colorspace_bgr24_to_bgr565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
{
gint size;
guint16 *destptr = (guint16 *)dest;
GST_DEBUG (0,"gst_colorspace_bgr24_to_bgr565 %p %p %d %d %d\n", src, dest, space->outsize, space->width, space->height);
size = space->outsize/2;
while (size--) {
*destptr++ = ((src[2]&0xF8)<<8)|((src[1]&0xFC)<<3)|((src[0]&0xF8)>>3);
src+=3;
}
GST_DEBUG (0,"gst_colorspace_bgr24_to_bgr565 end\n");
}
static void gst_colorspace_bgr32_to_bgr565(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
{
gint size;
guint16 *destptr = (guint16 *)dest;
GST_DEBUG (0,"gst_colorspace_bgr32_to_bgr565 %p %p %d %d %d\n", src, dest, space->outsize, space->width, space->height);
size = space->outsize/2;
while (size--) {
*destptr++ = ((src[2]&0xF8)<<8)|((src[1]&0xFC)<<3)|((src[0]&0xF8)>>3);
src+=4;
}
GST_DEBUG (0,"gst_colorspace_bgr32_to_bgr565 end\n");
}
static void gst_colorspace_rgb24_to_rgb32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
{
gint size;
guint32 *destptr = (guint32 *)dest;
GST_DEBUG (0,"gst_colorspace_rgb24_to_rgb32 %p %p %d\n", src, dest, space->outsize);
size = space->outsize/4;
while (size--) {
*destptr++ = (src[0]<<16)|(src[1]<<8)|src[2];
src+=3;
}
GST_DEBUG (0,"gst_colorspace_rgb24_to_rgb32 end\n");
}
static void gst_colorspace_rgb32_to_bgr32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest) static void gst_colorspace_rgb32_to_bgr32(GstColorSpaceConverter *space, unsigned char *src, unsigned char *dest)
{ {
gint size; gint size;

View file

@ -1,6 +1,7 @@
/* GStreamer /* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu> * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be> * 2000 Wim Taymans <wtay@chello.be>
* 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
* *
* gstsinesrc.c: * gstsinesrc.c:
* *
@ -51,20 +52,25 @@ enum {
ARG_0, ARG_0,
ARG_VOLUME, ARG_VOLUME,
ARG_FORMAT, ARG_FORMAT,
ARG_CHANNELS, ARG_SAMPLERATE,
ARG_FREQUENCY, ARG_FREQ,
ARG_TABLESIZE,
ARG_BUFFER_SIZE,
}; };
static void gst_sinesrc_class_init(GstSineSrcClass *klass); static void gst_sinesrc_class_init(GstSineSrcClass *klass);
static void gst_sinesrc_init(GstSineSrc *sinesrc); static void gst_sinesrc_init(GstSineSrc *src);
static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id);
static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id); static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id);
//static gboolean gst_sinesrc_change_state(GstElement *element, //static gboolean gst_sinesrc_change_state(GstElement *element,
// GstElementState state); // GstElementState state);
//static void gst_sinesrc_close_audio(GstSineSrc *src); //static void gst_sinesrc_close_audio(GstSineSrc *src);
//static gboolean gst_sinesrc_open_audio(GstSineSrc *src); //static gboolean gst_sinesrc_open_audio(GstSineSrc *src);
void gst_sinesrc_sync_parms(GstSineSrc *sinesrc); static void gst_sinesrc_populate_sinetable(GstSineSrc *src);
static inline void gst_sinesrc_update_table_inc(GstSineSrc *src);
static inline void gst_sinesrc_update_vol_scale(GstSineSrc *src);
void gst_sinesrc_sync_parms(GstSineSrc *src);
static GstBuffer * gst_sinesrc_get(GstPad *pad); static GstBuffer * gst_sinesrc_get(GstPad *pad);
@ -105,31 +111,44 @@ gst_sinesrc_class_init(GstSineSrcClass *klass) {
GTK_ARG_READWRITE, ARG_VOLUME); GTK_ARG_READWRITE, ARG_VOLUME);
gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_FORMAT); GTK_ARG_READWRITE, ARG_FORMAT);
gtk_object_add_arg_type("GstSineSrc::channels", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::samplerate", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_CHANNELS); GTK_ARG_READWRITE, ARG_SAMPLERATE);
gtk_object_add_arg_type("GstSineSrc::frequency", GTK_TYPE_INT, gtk_object_add_arg_type("GstSineSrc::tablesize", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_FREQUENCY); GTK_ARG_READWRITE, ARG_TABLESIZE);
gtk_object_add_arg_type("GstSineSrc::freq", GTK_TYPE_DOUBLE,
GTK_ARG_READWRITE, ARG_FREQ);
gtk_object_add_arg_type("GstSineSrc::buffersize", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_BUFFER_SIZE);
gtkobject_class->set_arg = gst_sinesrc_set_arg; gtkobject_class->set_arg = gst_sinesrc_set_arg;
gtkobject_class->get_arg = gst_sinesrc_get_arg; gtkobject_class->get_arg = gst_sinesrc_get_arg;
// gstelement_class->change_state = gst_sinesrc_change_state; // gstelement_class->change_state = gst_sinesrc_change_state;
} }
static void gst_sinesrc_init(GstSineSrc *sinesrc) { static void gst_sinesrc_init(GstSineSrc *src) {
sinesrc->srcpad = gst_pad_new("src",GST_PAD_SRC);
gst_pad_set_get_function(sinesrc->srcpad,gst_sinesrc_get); src->srcpad = gst_pad_new("src",GST_PAD_SRC);
gst_element_add_pad(GST_ELEMENT(sinesrc),sinesrc->srcpad); gst_pad_set_get_function(src->srcpad, gst_sinesrc_get);
gst_element_add_pad(GST_ELEMENT(src), src->srcpad);
sinesrc->volume = 1.0; src->volume = 1.0;
gst_sinesrc_update_vol_scale(src);
sinesrc->format = AFMT_S16_LE; src->format = AFMT_S16_LE;
sinesrc->channels = 2; src->samplerate = 44100;
sinesrc->frequency = 44100; src->freq = 100.0;
src->table_pos = 0.0;
src->table_size = 1024;
gst_sinesrc_populate_sinetable(src);
gst_sinesrc_update_table_inc(src);
gst_sinesrc_sync_parms(src);
src->buffer_size=1024;
src->seq = 0;
sinesrc->seq = 0; src->sentmeta = FALSE;
sinesrc->sentmeta = FALSE;
} }
static GstBuffer * static GstBuffer *
@ -139,23 +158,43 @@ gst_sinesrc_get(GstPad *pad)
GstBuffer *buf; GstBuffer *buf;
gint16 *samples; gint16 *samples;
gint i; gint i;
gint volume;
gdouble val;
g_return_val_if_fail (pad != NULL, NULL); g_return_val_if_fail (pad != NULL, NULL);
src = GST_SINESRC(gst_pad_get_parent (pad)); src = GST_SINESRC(gst_pad_get_parent (pad));
buf = gst_buffer_new(); buf = gst_buffer_new();
g_return_val_if_fail (buf, NULL); g_return_val_if_fail (buf, NULL);
GST_BUFFER_DATA(buf) = (gpointer)malloc(4096); samples = g_new(gint16, src->buffer_size);
samples = (gint16*)GST_BUFFER_DATA(buf); GST_BUFFER_DATA(buf) = (gpointer) samples;
GST_BUFFER_SIZE(buf) = 4096; GST_BUFFER_SIZE(buf) = 2 * src->buffer_size;
for (i=0 ; i < src->buffer_size; i++) {
src->table_lookup = (gint)(src->table_pos);
src->table_lookup_next = src->table_lookup + 1;
src->table_interp = src->table_pos - src->table_lookup;
// wrap the array lookups if we're out of bounds
if (src->table_lookup_next >= src->table_size){
src->table_lookup_next -= src->table_size;
if (src->table_lookup >= src->table_size){
src->table_lookup -= src->table_size;
src->table_pos -= src->table_size;
}
}
src->table_pos += src->table_inc;
volume = 65535 * src->volume; //no interpolation
for (i=0;i<1024;i++) { //samples[i] = src->table_data[src->table_lookup]
val = sin((gdouble)i/src->frequency); // * src->vol_scale;
samples[i] = val * volume;
samples[i+1] = samples[i]; //linear interpolation
samples[i] = ((src->table_interp
*(src->table_data[src->table_lookup_next]
-src->table_data[src->table_lookup]
)
)+src->table_data[src->table_lookup]
)* src->vol_scale;
} }
if (!src->sentmeta) { if (!src->sentmeta) {
@ -165,7 +204,7 @@ gst_sinesrc_get(GstPad *pad)
src->sentmeta = TRUE; src->sentmeta = TRUE;
} }
g_print(">"); //g_print(">");
return buf; return buf;
} }
@ -178,17 +217,35 @@ static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id) {
switch (id) { switch (id) {
case ARG_VOLUME: case ARG_VOLUME:
if (GTK_VALUE_DOUBLE(*arg) < 0.0 || GTK_VALUE_DOUBLE(*arg) > 1.0)
break;
src->volume = GTK_VALUE_DOUBLE(*arg); src->volume = GTK_VALUE_DOUBLE(*arg);
gst_sinesrc_update_vol_scale(src);
break; break;
case ARG_FORMAT: case ARG_FORMAT:
src->format = GTK_VALUE_INT(*arg); src->format = GTK_VALUE_INT(*arg);
gst_sinesrc_sync_parms(src);
break; break;
case ARG_CHANNELS: case ARG_SAMPLERATE:
src->channels = GTK_VALUE_INT(*arg); src->samplerate = GTK_VALUE_INT(*arg);
gst_sinesrc_sync_parms(src);
gst_sinesrc_update_table_inc(src);
break; break;
case ARG_FREQUENCY: case ARG_FREQ: {
src->frequency = GTK_VALUE_INT(*arg); if (GTK_VALUE_DOUBLE(*arg) <= 0.0 || GTK_VALUE_DOUBLE(*arg) > src->samplerate/2)
break;
src->freq = GTK_VALUE_DOUBLE(*arg);
gst_sinesrc_update_table_inc(src);
break; break;
case ARG_TABLESIZE:
src->table_size = GTK_VALUE_INT(*arg);
gst_sinesrc_populate_sinetable(src);
gst_sinesrc_update_table_inc(src);
break;
case ARG_BUFFER_SIZE:
src->buffer_size = GTK_VALUE_INT(*arg);
break;
}
default: default:
break; break;
} }
@ -208,11 +265,17 @@ static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id) {
case ARG_FORMAT: case ARG_FORMAT:
GTK_VALUE_INT(*arg) = src->format; GTK_VALUE_INT(*arg) = src->format;
break; break;
case ARG_CHANNELS: case ARG_SAMPLERATE:
GTK_VALUE_INT(*arg) = src->channels; GTK_VALUE_INT(*arg) = src->samplerate;
break; break;
case ARG_FREQUENCY: case ARG_FREQ:
GTK_VALUE_INT(*arg) = src->frequency; GTK_VALUE_DOUBLE(*arg) = src->freq;
break;
case ARG_TABLESIZE:
GTK_VALUE_INT(*arg) = src->table_size;
break;
case ARG_BUFFER_SIZE:
GTK_VALUE_INT(*arg) = src->buffer_size;
break; break;
default: default:
arg->type = GTK_TYPE_INVALID; arg->type = GTK_TYPE_INVALID;
@ -243,9 +306,33 @@ static gboolean gst_sinesrc_change_state(GstElement *element,
} }
*/ */
void gst_sinesrc_sync_parms(GstSineSrc *sinesrc) { static void gst_sinesrc_populate_sinetable(GstSineSrc *src)
sinesrc->meta.format = sinesrc->format; {
sinesrc->meta.channels = sinesrc->channels; gint i;
sinesrc->meta.frequency = sinesrc->frequency; gdouble pi2scaled = M_PI * 2 / src->table_size;
sinesrc->sentmeta = FALSE; gfloat *table = g_new(gfloat, src->table_size);
for(i=0 ; i < src->table_size ; i++){
table[i] = (gfloat)sin(i * pi2scaled);
}
g_free(src->table_data);
src->table_data = table;
}
static inline void gst_sinesrc_update_table_inc(GstSineSrc *src)
{
src->table_inc = src->table_size * src->freq / src->samplerate;
}
static inline void gst_sinesrc_update_vol_scale(GstSineSrc *src)
{
src->vol_scale = 32767 * src->volume;
}
void gst_sinesrc_sync_parms(GstSineSrc *src) {
src->meta.format = src->format;
src->meta.channels = 1;
src->meta.frequency = src->samplerate;
src->sentmeta = FALSE;
} }

View file

@ -60,13 +60,23 @@ struct _GstSineSrc {
/* parameters */ /* parameters */
gdouble volume; gdouble volume;
gint freq; gdouble vol_scale;
gdouble freq;
/* lookup table data */
gfloat *table_data;
gdouble table_pos;
gdouble table_inc;
gint table_size;
gdouble table_interp;
gint table_lookup;
gint table_lookup_next;
/* audio parameters */ /* audio parameters */
gint format; gint format;
gint channels; gint samplerate;
gint frequency;
gint buffer_size;
gulong seq; gulong seq;
MetaAudioRaw meta; MetaAudioRaw meta;

View file

@ -34,8 +34,8 @@ main (int argc, char *argv[])
gtk_signal_connect (GTK_OBJECT (autoplugger), "new_object", new_object_added, NULL); gtk_signal_connect (GTK_OBJECT (autoplugger), "new_object", new_object_added, NULL);
element = gst_autoplug_to_caps (autoplugger, testcaps, element = gst_autoplug_to_caps (autoplugger, testcaps,
g_list_append (NULL, gst_pad_get_caps (gst_element_get_pad (audiosink, "sink"))), gst_pad_get_caps (gst_element_get_pad (audiosink, "sink")),
g_list_append (NULL, gst_pad_get_caps (gst_element_get_pad (videosink, "sink"))), gst_pad_get_caps (gst_element_get_pad (videosink, "sink")),
NULL); NULL);
g_assert (element != NULL); g_assert (element != NULL);

View file

@ -0,0 +1,11 @@
SUBDIRS =
testprogs = test_gst_init
TESTS = $(testprogs)
check_PROGRAMS = $(testprogs)
# we have nothing but apps here, we can do this safely
LIBS += $(GST_LIBS)
CFLAGS += $(GST_CFLAGS)

View file

@ -0,0 +1,13 @@
#include <gst/gst.h>
/* This tests that gst_init() doesn't segfault when passed two NULLs as
* parameters, and that it doesn't fail if gst_init() happens to get called
* a second time. */
int
main (int argc, char *argv[])
{
gst_init(NULL, NULL);
gst_init(&argc, &argv);
return 0;
}

11
testsuite/Makefile.am Normal file
View file

@ -0,0 +1,11 @@
SUBDIRS =
testprogs = test_gst_init
TESTS = $(testprogs)
check_PROGRAMS = $(testprogs)
# we have nothing but apps here, we can do this safely
LIBS += $(GST_LIBS)
CFLAGS += $(GST_CFLAGS)

13
testsuite/test_gst_init.c Normal file
View file

@ -0,0 +1,13 @@
#include <gst/gst.h>
/* This tests that gst_init() doesn't segfault when passed two NULLs as
* parameters, and that it doesn't fail if gst_init() happens to get called
* a second time. */
int
main (int argc, char *argv[])
{
gst_init(NULL, NULL);
gst_init(&argc, &argv);
return 0;
}