summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@gmail.com>2001-03-12 20:04:22 +0000
committerWim Taymans <wim.taymans@gmail.com>2001-03-12 20:04:22 +0000
commit91f96207002a2178fe8409873e41f9b9f1494490 (patch)
tree4d83cce4542926514231d05cfe8b1852cfc16462
parentb2a888839847ef0425e9a9ce8cb23e9c896bf682 (diff)
Another merge from HEAD into CAPSNEGO1BRANCH-CAPSNEGO1
Original commit message from CVS: Another merge from HEAD into CAPSNEGO1
-rw-r--r--Makefile.am4
-rw-r--r--REQUIREMENTS2
-rw-r--r--configure.in51
-rw-r--r--docs/manual/xml.sgml2
-rw-r--r--gst/elements/gstsinesrc.c185
-rw-r--r--gst/elements/gstsinesrc.h18
-rw-r--r--gst/gst.c10
-rw-r--r--gst/gstpipeline.c2
-rw-r--r--gst/gstpipeline.h2
-rw-r--r--libs/colorspace/rgb2rgb.c62
-rw-r--r--plugins/elements/gstsinesrc.c185
-rw-r--r--plugins/elements/gstsinesrc.h18
-rw-r--r--tests/autoplug.c4
-rw-r--r--tests/old/testsuite/Makefile.am11
-rw-r--r--tests/old/testsuite/test_gst_init.c13
-rw-r--r--testsuite/Makefile.am11
-rw-r--r--testsuite/test_gst_init.c13
17 files changed, 456 insertions, 137 deletions
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,23 +220,6 @@ AC_SUBST(GDK_PIXBUF_LIBS)
AC_SUBST(GDK_PIXBUF_CFLAGS)
-dnl Check for libghttp
-dnl FIXME: need to check for header
-AC_CHECK_LIB(ghttp, ghttp_request_new,
- [GHTTP_LIBS="-lghttp"
- GST_HTTPSRC_GET_TYPE="gst_httpsrc_get_type"
- HAVE_LIBGHTTP=yes
- ],
- [AC_MSG_WARN(Cannot find libghttp: can't build gsthttpsrc)
- GHTTP_LIBS=
- GST_HTTPSRC_GET_TYPE=
- 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
@@ -245,11 +230,28 @@ if test x$GNOME_CONFIG = xno; then
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,
+ [GHTTP_LIBS="-lghttp"
+ GST_HTTPSRC_GET_TYPE="gst_httpsrc_get_type"
+ HAVE_LIBGHTTP=yes
+ ],
+ [AC_MSG_WARN(Cannot find libghttp: can't build gsthttpsrc)
+ GHTTP_LIBS=
+ GST_HTTPSRC_GET_TYPE=
+ HAVE_LIBGHTTP=no
+ ],
+ $LIBS)
+AC_SUBST(GST_HTTPSRC_GET_TYPE)
dnl Check for libglade
HAVE_LIBGLADE_GNOME="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 <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
*
* 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);
-
- sinesrc->volume = 1.0;
-
- sinesrc->format = AFMT_S16_LE;
- sinesrc->channels = 2;
- sinesrc->frequency = 44100;
-
- sinesrc->seq = 0;
-
- sinesrc->sentmeta = FALSE;
+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);
+
+ src->volume = 1.0;
+ gst_sinesrc_update_vol_scale(src);
+
+ 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;
+
+ 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;
-
- 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];
+ 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;
+
+ //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_FREQ:
+ GTK_VALUE_DOUBLE(*arg) = src->freq;
break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT(*arg) = src->frequency;
+ 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 <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
+ * 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
*
* 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);
-
- sinesrc->volume = 1.0;
-
- sinesrc->format = AFMT_S16_LE;
- sinesrc->channels = 2;
- sinesrc->frequency = 44100;
-
- sinesrc->seq = 0;
-
- sinesrc->sentmeta = FALSE;
+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);
+
+ src->volume = 1.0;
+ gst_sinesrc_update_vol_scale(src);
+
+ 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;
+
+ 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;
-
- 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];
+ 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;
+
+ //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_FREQ:
+ GTK_VALUE_DOUBLE(*arg) = src->freq;
break;
- case ARG_FREQUENCY:
- GTK_VALUE_INT(*arg) = src->frequency;
+ 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 <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;
+}
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 <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;
+}