From 91f96207002a2178fe8409873e41f9b9f1494490 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Mon, 12 Mar 2001 20:04:22 +0000 Subject: [PATCH] Another merge from HEAD into CAPSNEGO1 Original commit message from CVS: Another merge from HEAD into CAPSNEGO1 --- Makefile.am | 4 +- REQUIREMENTS | 2 + configure.in | 53 +++++---- docs/manual/xml.sgml | 2 - gst/elements/gstsinesrc.c | 177 +++++++++++++++++++++------- gst/elements/gstsinesrc.h | 18 ++- gst/gst.c | 10 +- gst/gstpipeline.c | 2 +- gst/gstpipeline.h | 2 +- libs/colorspace/rgb2rgb.c | 62 +++++++++- plugins/elements/gstsinesrc.c | 177 +++++++++++++++++++++------- plugins/elements/gstsinesrc.h | 18 ++- tests/autoplug.c | 4 +- tests/old/testsuite/Makefile.am | 11 ++ tests/old/testsuite/test_gst_init.c | 13 ++ testsuite/Makefile.am | 11 ++ testsuite/test_gst_init.c | 13 ++ 17 files changed, 449 insertions(+), 130 deletions(-) create mode 100644 tests/old/testsuite/Makefile.am create mode 100644 tests/old/testsuite/test_gst_init.c create mode 100644 testsuite/Makefile.am create mode 100644 testsuite/test_gst_init.c diff --git a/Makefile.am b/Makefile.am index f894e1812c..2fc9edfef4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,11 +14,11 @@ else SUBDIRS_DOCS = endif -SUBDIRS = include gst libs plugins tools test tests examples \ +SUBDIRS = include gst libs plugins tools test tests testsuite examples \ $(SUBDIRS_LGG) $(SUBDIRS_DOCS) # 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 diff --git a/REQUIREMENTS b/REQUIREMENTS index 5b19cd0a8f..4af1a43b99 100644 --- a/REQUIREMENTS +++ b/REQUIREMENTS @@ -27,6 +27,8 @@ libvorbis (for vorbisenc, vorbisdec) libcdparanoia (for cdparanoia ripper) liblame (for lame mp3 encoder) 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 http://divx.euro.ru/ and put the .dll files in /usr/lib/win32/ diff --git a/configure.in b/configure.in index becb671bfd..aa0f85dd79 100644 --- a/configure.in +++ b/configure.in @@ -178,6 +178,8 @@ AC_PATH_PROG(XML_CONFIG, xml-config, no) if test x$XML_CONFIG = xno; then AC_MSG_ERROR(Couldn't find xml-config) fi +AC_CHECK_LIB(xml, xmlDocGetRootElement, , + [ AC_MSG_ERROR(Need version 1.8.1 or better of libxml) ]) XML_LIBS=`xml-config --libs` XML_CFLAGS=`xml-config --cflags` AC_SUBST(XML_LIBS) @@ -193,7 +195,7 @@ dnl ======================================= dnl Check for libesd 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 alsa_save_LIBS=$LIBS @@ -218,6 +220,24 @@ AC_SUBST(GDK_PIXBUF_LIBS) 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 FIXME: need to check for header AC_CHECK_LIB(ghttp, ghttp_request_new, @@ -231,26 +251,8 @@ AC_CHECK_LIB(ghttp, ghttp_request_new, HAVE_LIBGHTTP=no ], $LIBS) -AC_SUBST(GHTTP_LIBS) 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 HAVE_LIBGLADE_GNOME="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_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) 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_MPEG2DEC, test "x$HAVE_MPEG2DEC" = "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/idct/Makefile plugins/Makefile +plugins/alsa/Makefile plugins/au/Makefile -plugins/wav/Makefile +plugins/audioscale/Makefile plugins/avi/Makefile plugins/avi/wincodec/Makefile plugins/jpeg/Makefile @@ -724,6 +732,8 @@ plugins/mpeg1/system_encode/Makefile plugins/mpeg1/mpeg1encoder/Makefile plugins/mpeg1video/Makefile plugins/mpeg1video/parse/Makefile +plugins/rtp/Makefile +plugins/rtp/rtpsend/Makefile plugins/filters/Makefile plugins/filters/smooth/Makefile plugins/filters/median/Makefile @@ -740,7 +750,7 @@ plugins/visualization/synaesthesia/Makefile plugins/visualization/smoothwave/Makefile plugins/videosink/Makefile plugins/videoscale/Makefile -plugins/audioscale/Makefile +plugins/wav/Makefile plugins/dvdsrc/Makefile plugins/vcdsrc/Makefile plugins/rtjpeg/Makefile @@ -760,6 +770,7 @@ tests/Makefile tests/sched/Makefile tests/eos/Makefile tests/nego/Makefile +testsuite/Makefile examples/Makefile examples/autoplug/Makefile examples/helloworld/Makefile diff --git a/docs/manual/xml.sgml b/docs/manual/xml.sgml index 7cc518205c..18413f187b 100644 --- a/docs/manual/xml.sgml +++ b/docs/manual/xml.sgml @@ -149,8 +149,6 @@ main(int argc, char *argv[]) gst_element_set_state (bin, GST_STATE_PLAYING); - playing = TRUE; - while (gst_bin_iterate(GST_BIN(bin))); gst_element_set_state (bin, GST_STATE_NULL); diff --git a/gst/elements/gstsinesrc.c b/gst/elements/gstsinesrc.c index 5e47d279c8..9d46555eec 100644 --- a/gst/elements/gstsinesrc.c +++ b/gst/elements/gstsinesrc.c @@ -1,6 +1,7 @@ /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans + * 2001 Steve Baker * * gstsinesrc.c: * @@ -51,20 +52,25 @@ enum { ARG_0, ARG_VOLUME, ARG_FORMAT, - ARG_CHANNELS, - ARG_FREQUENCY, + ARG_SAMPLERATE, + ARG_FREQ, + ARG_TABLESIZE, + ARG_BUFFER_SIZE, }; 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_get_arg(GtkObject *object,GtkArg *arg,guint id); //static gboolean gst_sinesrc_change_state(GstElement *element, // GstElementState state); //static void gst_sinesrc_close_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); @@ -105,31 +111,44 @@ gst_sinesrc_class_init(GstSineSrcClass *klass) { GTK_ARG_READWRITE, ARG_VOLUME); gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_FORMAT); - gtk_object_add_arg_type("GstSineSrc::channels", GTK_TYPE_INT, - GTK_ARG_READWRITE, ARG_CHANNELS); - gtk_object_add_arg_type("GstSineSrc::frequency", GTK_TYPE_INT, - GTK_ARG_READWRITE, ARG_FREQUENCY); - + gtk_object_add_arg_type("GstSineSrc::samplerate", GTK_TYPE_INT, + GTK_ARG_READWRITE, ARG_SAMPLERATE); + gtk_object_add_arg_type("GstSineSrc::tablesize", GTK_TYPE_INT, + 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->get_arg = gst_sinesrc_get_arg; // gstelement_class->change_state = gst_sinesrc_change_state; } -static void gst_sinesrc_init(GstSineSrc *sinesrc) { - sinesrc->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_pad_set_get_function(sinesrc->srcpad,gst_sinesrc_get); - gst_element_add_pad(GST_ELEMENT(sinesrc),sinesrc->srcpad); +static void gst_sinesrc_init(GstSineSrc *src) { + + src->srcpad = gst_pad_new("src",GST_PAD_SRC); + 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; - sinesrc->channels = 2; - sinesrc->frequency = 44100; + src->format = AFMT_S16_LE; + src->samplerate = 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; - - sinesrc->sentmeta = FALSE; + src->sentmeta = FALSE; } static GstBuffer * @@ -139,23 +158,43 @@ gst_sinesrc_get(GstPad *pad) GstBuffer *buf; gint16 *samples; gint i; - gint volume; - gdouble val; - + g_return_val_if_fail (pad != NULL, NULL); src = GST_SINESRC(gst_pad_get_parent (pad)); buf = gst_buffer_new(); g_return_val_if_fail (buf, NULL); - GST_BUFFER_DATA(buf) = (gpointer)malloc(4096); - samples = (gint16*)GST_BUFFER_DATA(buf); - GST_BUFFER_SIZE(buf) = 4096; + samples = g_new(gint16, src->buffer_size); + GST_BUFFER_DATA(buf) = (gpointer) samples; + 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; - for (i=0;i<1024;i++) { - val = sin((gdouble)i/src->frequency); - samples[i] = val * volume; - samples[i+1] = samples[i]; + //no interpolation + //samples[i] = src->table_data[src->table_lookup] + // * src->vol_scale; + + //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) { @@ -165,7 +204,7 @@ gst_sinesrc_get(GstPad *pad) src->sentmeta = TRUE; } - g_print(">"); + //g_print(">"); return buf; } @@ -178,17 +217,35 @@ static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id) { switch (id) { case ARG_VOLUME: + if (GTK_VALUE_DOUBLE(*arg) < 0.0 || GTK_VALUE_DOUBLE(*arg) > 1.0) + break; src->volume = GTK_VALUE_DOUBLE(*arg); + gst_sinesrc_update_vol_scale(src); break; case ARG_FORMAT: src->format = GTK_VALUE_INT(*arg); + gst_sinesrc_sync_parms(src); break; - case ARG_CHANNELS: - src->channels = GTK_VALUE_INT(*arg); + case ARG_SAMPLERATE: + src->samplerate = GTK_VALUE_INT(*arg); + gst_sinesrc_sync_parms(src); + gst_sinesrc_update_table_inc(src); break; - case ARG_FREQUENCY: - src->frequency = GTK_VALUE_INT(*arg); + case ARG_FREQ: { + 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; + 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: break; } @@ -208,11 +265,17 @@ static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id) { case ARG_FORMAT: GTK_VALUE_INT(*arg) = src->format; break; - case ARG_CHANNELS: - GTK_VALUE_INT(*arg) = src->channels; + case ARG_SAMPLERATE: + GTK_VALUE_INT(*arg) = src->samplerate; break; - case ARG_FREQUENCY: - GTK_VALUE_INT(*arg) = src->frequency; + case ARG_FREQ: + 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; default: arg->type = GTK_TYPE_INVALID; @@ -243,9 +306,33 @@ static gboolean gst_sinesrc_change_state(GstElement *element, } */ -void gst_sinesrc_sync_parms(GstSineSrc *sinesrc) { - sinesrc->meta.format = sinesrc->format; - sinesrc->meta.channels = sinesrc->channels; - sinesrc->meta.frequency = sinesrc->frequency; - sinesrc->sentmeta = FALSE; +static void gst_sinesrc_populate_sinetable(GstSineSrc *src) +{ + gint i; + gdouble pi2scaled = M_PI * 2 / src->table_size; + 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; } diff --git a/gst/elements/gstsinesrc.h b/gst/elements/gstsinesrc.h index b0c457a4e4..82803f71d3 100644 --- a/gst/elements/gstsinesrc.h +++ b/gst/elements/gstsinesrc.h @@ -60,13 +60,23 @@ struct _GstSineSrc { /* parameters */ 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 */ gint format; - gint channels; - gint frequency; + gint samplerate; + gint buffer_size; gulong seq; MetaAudioRaw meta; diff --git a/gst/gst.c b/gst/gst.c index d46aeba2b9..15ab7fb08b 100644 --- a/gst/gst.c +++ b/gst/gst.c @@ -63,8 +63,6 @@ gst_init (int *argc, char **argv[]) if (!g_thread_supported ()) g_thread_init (NULL); - _gst_progname = g_strdup(*argv[0]); - gtk_init (argc,argv); if (!gst_init_check (argc,argv)) { @@ -123,9 +121,13 @@ gst_init_check (int *argc, gboolean ret = TRUE; gboolean showhelp = FALSE; + _gst_progname = NULL; + if (argc && argv) { gint i, j, k; + _gst_progname = g_strdup(*argv[0]); + for (i=1; i< *argc; i++) { if (!strncmp ("--gst-info-mask=", (*argv)[i], 16)) { guint32 val; @@ -184,6 +186,10 @@ gst_init_check (int *argc, } } + if (_gst_progname == NULL) { + _gst_progname = g_strdup("gstprog"); + } + /* check for ENV variables */ { diff --git a/gst/gstpipeline.c b/gst/gstpipeline.c index f42d82bd2b..f2772d488d 100644 --- a/gst/gstpipeline.c +++ b/gst/gstpipeline.c @@ -107,7 +107,7 @@ gst_pipeline_init (GstPipeline *pipeline) * Returns: newly created GstPipeline */ GstElement* -gst_pipeline_new (guchar *name) +gst_pipeline_new (const guchar *name) { return gst_elementfactory_make ("pipeline", name); } diff --git a/gst/gstpipeline.h b/gst/gstpipeline.h index 3c13978e63..27f14e4526 100644 --- a/gst/gstpipeline.h +++ b/gst/gstpipeline.h @@ -57,7 +57,7 @@ struct _GstPipelineClass { }; 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)) void gst_pipeline_iterate (GstPipeline *pipeline); diff --git a/libs/colorspace/rgb2rgb.c b/libs/colorspace/rgb2rgb.c index d5e788f090..7459785a8d 100644 --- a/libs/colorspace/rgb2rgb.c +++ b/libs/colorspace/rgb2rgb.c @@ -24,9 +24,12 @@ 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_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_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_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) { switch(src) { @@ -39,6 +42,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC case GST_COLORSPACE_BGR24: space->outsize = space->width*space->height*3; return gst_colorspace_rgb24_to_bgr24; + case GST_COLORSPACE_RGB32: + space->outsize = space->width*space->height*4; + return gst_colorspace_rgb24_to_rgb32; default: break; } @@ -52,6 +58,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC case GST_COLORSPACE_BGR24: space->outsize = space->width*space->height*3; 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: break; } @@ -78,6 +87,9 @@ GstColorSpaceConvertFunction gst_colorspace_rgb2rgb_get_converter(GstColorSpaceC case GST_COLORSPACE_BGR32: space->outsize = space->width*space->height*4; 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: break; } @@ -122,7 +134,7 @@ static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigne gint size; 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; @@ -145,6 +157,54 @@ static void gst_colorspace_rgb24_to_bgr24(GstColorSpaceConverter *space, unsigne 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) { gint size; diff --git a/plugins/elements/gstsinesrc.c b/plugins/elements/gstsinesrc.c index 5e47d279c8..9d46555eec 100644 --- a/plugins/elements/gstsinesrc.c +++ b/plugins/elements/gstsinesrc.c @@ -1,6 +1,7 @@ /* GStreamer * Copyright (C) 1999,2000 Erik Walthinsen * 2000 Wim Taymans + * 2001 Steve Baker * * gstsinesrc.c: * @@ -51,20 +52,25 @@ enum { ARG_0, ARG_VOLUME, ARG_FORMAT, - ARG_CHANNELS, - ARG_FREQUENCY, + ARG_SAMPLERATE, + ARG_FREQ, + ARG_TABLESIZE, + ARG_BUFFER_SIZE, }; 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_get_arg(GtkObject *object,GtkArg *arg,guint id); //static gboolean gst_sinesrc_change_state(GstElement *element, // GstElementState state); //static void gst_sinesrc_close_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); @@ -105,31 +111,44 @@ gst_sinesrc_class_init(GstSineSrcClass *klass) { GTK_ARG_READWRITE, ARG_VOLUME); gtk_object_add_arg_type("GstSineSrc::format", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_FORMAT); - gtk_object_add_arg_type("GstSineSrc::channels", GTK_TYPE_INT, - GTK_ARG_READWRITE, ARG_CHANNELS); - gtk_object_add_arg_type("GstSineSrc::frequency", GTK_TYPE_INT, - GTK_ARG_READWRITE, ARG_FREQUENCY); - + gtk_object_add_arg_type("GstSineSrc::samplerate", GTK_TYPE_INT, + GTK_ARG_READWRITE, ARG_SAMPLERATE); + gtk_object_add_arg_type("GstSineSrc::tablesize", GTK_TYPE_INT, + 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->get_arg = gst_sinesrc_get_arg; // gstelement_class->change_state = gst_sinesrc_change_state; } -static void gst_sinesrc_init(GstSineSrc *sinesrc) { - sinesrc->srcpad = gst_pad_new("src",GST_PAD_SRC); - gst_pad_set_get_function(sinesrc->srcpad,gst_sinesrc_get); - gst_element_add_pad(GST_ELEMENT(sinesrc),sinesrc->srcpad); +static void gst_sinesrc_init(GstSineSrc *src) { + + src->srcpad = gst_pad_new("src",GST_PAD_SRC); + 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; - sinesrc->channels = 2; - sinesrc->frequency = 44100; + src->format = AFMT_S16_LE; + src->samplerate = 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; - - sinesrc->sentmeta = FALSE; + src->sentmeta = FALSE; } static GstBuffer * @@ -139,23 +158,43 @@ gst_sinesrc_get(GstPad *pad) GstBuffer *buf; gint16 *samples; gint i; - gint volume; - gdouble val; - + g_return_val_if_fail (pad != NULL, NULL); src = GST_SINESRC(gst_pad_get_parent (pad)); buf = gst_buffer_new(); g_return_val_if_fail (buf, NULL); - GST_BUFFER_DATA(buf) = (gpointer)malloc(4096); - samples = (gint16*)GST_BUFFER_DATA(buf); - GST_BUFFER_SIZE(buf) = 4096; + samples = g_new(gint16, src->buffer_size); + GST_BUFFER_DATA(buf) = (gpointer) samples; + 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; - for (i=0;i<1024;i++) { - val = sin((gdouble)i/src->frequency); - samples[i] = val * volume; - samples[i+1] = samples[i]; + //no interpolation + //samples[i] = src->table_data[src->table_lookup] + // * src->vol_scale; + + //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) { @@ -165,7 +204,7 @@ gst_sinesrc_get(GstPad *pad) src->sentmeta = TRUE; } - g_print(">"); + //g_print(">"); return buf; } @@ -178,17 +217,35 @@ static void gst_sinesrc_set_arg(GtkObject *object,GtkArg *arg,guint id) { switch (id) { case ARG_VOLUME: + if (GTK_VALUE_DOUBLE(*arg) < 0.0 || GTK_VALUE_DOUBLE(*arg) > 1.0) + break; src->volume = GTK_VALUE_DOUBLE(*arg); + gst_sinesrc_update_vol_scale(src); break; case ARG_FORMAT: src->format = GTK_VALUE_INT(*arg); + gst_sinesrc_sync_parms(src); break; - case ARG_CHANNELS: - src->channels = GTK_VALUE_INT(*arg); + case ARG_SAMPLERATE: + src->samplerate = GTK_VALUE_INT(*arg); + gst_sinesrc_sync_parms(src); + gst_sinesrc_update_table_inc(src); break; - case ARG_FREQUENCY: - src->frequency = GTK_VALUE_INT(*arg); + case ARG_FREQ: { + 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; + 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: break; } @@ -208,11 +265,17 @@ static void gst_sinesrc_get_arg(GtkObject *object,GtkArg *arg,guint id) { case ARG_FORMAT: GTK_VALUE_INT(*arg) = src->format; break; - case ARG_CHANNELS: - GTK_VALUE_INT(*arg) = src->channels; + case ARG_SAMPLERATE: + GTK_VALUE_INT(*arg) = src->samplerate; break; - case ARG_FREQUENCY: - GTK_VALUE_INT(*arg) = src->frequency; + case ARG_FREQ: + 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; default: arg->type = GTK_TYPE_INVALID; @@ -243,9 +306,33 @@ static gboolean gst_sinesrc_change_state(GstElement *element, } */ -void gst_sinesrc_sync_parms(GstSineSrc *sinesrc) { - sinesrc->meta.format = sinesrc->format; - sinesrc->meta.channels = sinesrc->channels; - sinesrc->meta.frequency = sinesrc->frequency; - sinesrc->sentmeta = FALSE; +static void gst_sinesrc_populate_sinetable(GstSineSrc *src) +{ + gint i; + gdouble pi2scaled = M_PI * 2 / src->table_size; + 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; } diff --git a/plugins/elements/gstsinesrc.h b/plugins/elements/gstsinesrc.h index b0c457a4e4..82803f71d3 100644 --- a/plugins/elements/gstsinesrc.h +++ b/plugins/elements/gstsinesrc.h @@ -60,13 +60,23 @@ struct _GstSineSrc { /* parameters */ 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 */ gint format; - gint channels; - gint frequency; + gint samplerate; + gint buffer_size; gulong seq; MetaAudioRaw meta; diff --git a/tests/autoplug.c b/tests/autoplug.c index 472cd4ca24..4c1a05c3f3 100644 --- a/tests/autoplug.c +++ b/tests/autoplug.c @@ -34,8 +34,8 @@ main (int argc, char *argv[]) gtk_signal_connect (GTK_OBJECT (autoplugger), "new_object", new_object_added, NULL); element = gst_autoplug_to_caps (autoplugger, testcaps, - g_list_append (NULL, 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 (audiosink, "sink")), + gst_pad_get_caps (gst_element_get_pad (videosink, "sink")), NULL); g_assert (element != NULL); diff --git a/tests/old/testsuite/Makefile.am b/tests/old/testsuite/Makefile.am new file mode 100644 index 0000000000..9e32fd0ae2 --- /dev/null +++ b/tests/old/testsuite/Makefile.am @@ -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) diff --git a/tests/old/testsuite/test_gst_init.c b/tests/old/testsuite/test_gst_init.c new file mode 100644 index 0000000000..1749328509 --- /dev/null +++ b/tests/old/testsuite/test_gst_init.c @@ -0,0 +1,13 @@ +#include + +/* 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; +} diff --git a/testsuite/Makefile.am b/testsuite/Makefile.am new file mode 100644 index 0000000000..9e32fd0ae2 --- /dev/null +++ b/testsuite/Makefile.am @@ -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) diff --git a/testsuite/test_gst_init.c b/testsuite/test_gst_init.c new file mode 100644 index 0000000000..1749328509 --- /dev/null +++ b/testsuite/test_gst_init.c @@ -0,0 +1,13 @@ +#include + +/* 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; +}