diff options
Diffstat (limited to 'gst-libs/gst/audio')
-rw-r--r-- | gst-libs/gst/audio/Makefile.am | 5 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiofilter.c | 6 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiofilter.h | 5 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiofilterexample.c | 170 | ||||
-rw-r--r-- | gst-libs/gst/audio/gstaudiofiltertemplate.c | 265 | ||||
-rwxr-xr-x | gst-libs/gst/audio/make_filter | 35 |
6 files changed, 315 insertions, 171 deletions
diff --git a/gst-libs/gst/audio/Makefile.am b/gst-libs/gst/audio/Makefile.am index d99cbcc6..ac16d969 100644 --- a/gst-libs/gst/audio/Makefile.am +++ b/gst-libs/gst/audio/Makefile.am @@ -2,6 +2,9 @@ librarydir = $(libdir)/gstreamer-@GST_MAJORMINOR@ library_LTLIBRARIES = libgstaudio.la libgstaudiofilter.la libgstaudiofilterexample.la +EXTRA_DIST = gstaudiofiltertemplate.c make_filter +CLEANFILES = gstaudiofilterexample.c + libgstaudio_la_SOURCES = audio.c audioclock.c libgstaudioincludedir = $(includedir)/gstreamer-@GST_MAJORMINOR@/gst/audio @@ -19,3 +22,5 @@ libgstaudiofilterexample_la_SOURCES = gstaudiofilterexample.c libgstaudiofilterexample_la_CFLAGS = $(GST_CFLAGS) libgstaudiofilterexample_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +gstaudiofilterexample.c: $(srcdir)/make_filter $(srcdir)/gstaudiofiltertemplate.c + $(srcdir)/make_filter AudiofilterExample $(srcdir)/gstaudiofiltertemplate.c diff --git a/gst-libs/gst/audio/gstaudiofilter.c b/gst-libs/gst/audio/gstaudiofilter.c index cda21da0..35ed4875 100644 --- a/gst-libs/gst/audio/gstaudiofilter.c +++ b/gst-libs/gst/audio/gstaudiofilter.c @@ -144,6 +144,9 @@ gst_audiofilter_link (GstPad *pad, const GstCaps *caps) } ret &= gst_structure_get_int (structure, "rate", &audiofilter->rate); + audiofilter->bytes_per_sample = (audiofilter->width/8) * + audiofilter->channels; + if (audiofilter_class->setup) (audiofilter_class->setup) (audiofilter); return GST_PAD_LINK_OK; @@ -204,6 +207,9 @@ gst_audiofilter_chain (GstPad *pad, GstData *data) return; } + audiofilter->size = GST_BUFFER_SIZE (inbuf); + audiofilter->n_samples = audiofilter->size / audiofilter->bytes_per_sample; + if (gst_data_is_writable(data)) { if (audiofilter_class->filter_inplace) { (audiofilter_class->filter_inplace) (audiofilter, inbuf); diff --git a/gst-libs/gst/audio/gstaudiofilter.h b/gst-libs/gst/audio/gstaudiofilter.h index 4723c329..9786e16c 100644 --- a/gst-libs/gst/audio/gstaudiofilter.h +++ b/gst-libs/gst/audio/gstaudiofilter.h @@ -56,13 +56,16 @@ struct _GstAudiofilter { /* audio state */ gboolean inited; + gboolean passthru; int rate; int width; int channels; int depth; - gboolean passthru; + int n_samples; + int size; + int bytes_per_sample; }; struct _GstAudiofilterClass { diff --git a/gst-libs/gst/audio/gstaudiofilterexample.c b/gst-libs/gst/audio/gstaudiofilterexample.c deleted file mode 100644 index 15e111af..00000000 --- a/gst-libs/gst/audio/gstaudiofilterexample.c +++ /dev/null @@ -1,170 +0,0 @@ -/* GStreamer - * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> - * Copyright (C) <2003> David Schleef <ds@schleef.org> - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <gst/gst.h> -#include <gst/audio/gstaudiofilter.h> - -typedef struct _GstAudiofilterExample GstAudiofilterExample; -typedef struct _GstAudiofilterExampleClass GstAudiofilterExampleClass; - -#define GST_TYPE_AUDIOFILTER_EXAMPLE \ - (gst_audiofilter_example_get_type()) -#define GST_AUDIOFILTER_EXAMPLE(obj) \ - (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOFILTER_EXAMPLE,GstAudiofilterExample)) -#define GST_AUDIOFILTER_EXAMPLE_CLASS(klass) \ - (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOFILTER_EXAMPLE,GstAudiofilterExampleClass)) -#define GST_IS_AUDIOFILTER_EXAMPLE(obj) \ - (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOFILTER_EXAMPLE)) -#define GST_IS_AUDIOFILTER_EXAMPLE_CLASS(obj) \ - (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOFILTER_EXAMPLE)) - -struct _GstAudiofilterExample { - GstAudiofilter audiofilter; - -}; - -struct _GstAudiofilterExampleClass { - GstAudiofilterClass parent_class; - -}; - - -/* GstAudiofilterExample signals and args */ -enum { - /* FILL ME */ - LAST_SIGNAL -}; - -enum { - ARG_0, - ARG_METHOD, - /* FILL ME */ -}; - -static void gst_audiofilter_example_base_init (gpointer g_class); -static void gst_audiofilter_example_class_init (gpointer g_class, gpointer class_data); - -static void gst_audiofilter_example_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); -static void gst_audiofilter_example_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); - -GType -gst_audiofilter_example_get_type (void) -{ - static GType audiofilter_example_type = 0; - - if (!audiofilter_example_type) { - static const GTypeInfo audiofilter_example_info = { - sizeof(GstAudiofilterExampleClass), - gst_audiofilter_example_base_init, - NULL, - gst_audiofilter_example_class_init, - NULL, - NULL, - sizeof(GstAudiofilterExample), - 0, - NULL, - }; - audiofilter_example_type = g_type_register_static(GST_TYPE_AUDIOFILTER, - "GstAudiofilterExample", &audiofilter_example_info, 0); - } - return audiofilter_example_type; -} - -static void gst_audiofilter_example_base_init (gpointer g_class) -{ - static GstElementDetails audiofilter_example_details = { - "Audio filter example", - "Filter/Effect/Audio", - "Filters audio", - "David Schleef <ds@schleef.org>" - }; - GstAudiofilterExampleClass *klass = (GstAudiofilterExampleClass *) g_class; - GstElementClass *element_class = GST_ELEMENT_CLASS (klass); - - gst_element_class_set_details (element_class, &audiofilter_example_details); -} - -static void gst_audiofilter_example_class_init (gpointer g_class, gpointer class_data) -{ - GObjectClass *gobject_class; - GstElementClass *gstelement_class; - GstAudiofilterExampleClass *klass; - - klass = (GstAudiofilterExampleClass *)g_class; - gobject_class = (GObjectClass*)klass; - gstelement_class = (GstElementClass*)klass; - - gobject_class->set_property = gst_audiofilter_example_set_property; - gobject_class->get_property = gst_audiofilter_example_get_property; -} - -static void -gst_audiofilter_example_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) -{ - GstAudiofilterExample *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AUDIOFILTER_EXAMPLE(object)); - src = GST_AUDIOFILTER_EXAMPLE(object); - - GST_DEBUG("gst_audiofilter_example_set_property"); - switch (prop_id) { - default: - break; - } -} - -static void -gst_audiofilter_example_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) -{ - GstAudiofilterExample *src; - - /* it's not null if we got it, but it might not be ours */ - g_return_if_fail(GST_IS_AUDIOFILTER_EXAMPLE(object)); - src = GST_AUDIOFILTER_EXAMPLE(object); - - switch (prop_id) { - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static gboolean -plugin_init (GstPlugin *plugin) -{ - return TRUE; -} - -GST_PLUGIN_DEFINE ( - GST_VERSION_MAJOR, - GST_VERSION_MINOR, - "gstaudiofilter_example", - "Audio filter example", - plugin_init, - VERSION, - "LGPL", - GST_PACKAGE, - GST_ORIGIN -) diff --git a/gst-libs/gst/audio/gstaudiofiltertemplate.c b/gst-libs/gst/audio/gstaudiofiltertemplate.c new file mode 100644 index 00000000..c7c0ce2b --- /dev/null +++ b/gst-libs/gst/audio/gstaudiofiltertemplate.c @@ -0,0 +1,265 @@ +/* GStreamer + * Copyright (C) <1999> Erik Walthinsen <omega@cse.ogi.edu> + * Copyright (C) <2003> David Schleef <ds@schleef.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +/* + * This file was (probably) generated from + * $Id$ + * and + * MAKEFILTERVERSION + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <gst/gst.h> +#include <gst/audio/audio.h> +#include <gst/audio/gstaudiofilter.h> +#include <string.h> + +typedef struct _GstAudiofilterTemplate GstAudiofilterTemplate; +typedef struct _GstAudiofilterTemplateClass GstAudiofilterTemplateClass; + +#define GST_TYPE_AUDIOFILTER_TEMPLATE \ + (gst_audiofilter_template_get_type()) +#define GST_AUDIOFILTER_TEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIOFILTER_TEMPLATE,GstAudiofilterTemplate)) +#define GST_AUDIOFILTER_TEMPLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIOFILTER_TEMPLATE,GstAudiofilterTemplateClass)) +#define GST_IS_AUDIOFILTER_TEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIOFILTER_TEMPLATE)) +#define GST_IS_AUDIOFILTER_TEMPLATE_CLASS(obj) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOFILTER_TEMPLATE)) + +struct _GstAudiofilterTemplate { + GstAudiofilter audiofilter; + +}; + +struct _GstAudiofilterTemplateClass { + GstAudiofilterClass parent_class; + +}; + + +enum { + /* FILL ME */ + LAST_SIGNAL +}; + +enum { + ARG_0, + /* FILL ME */ +}; + +static void gst_audiofilter_template_base_init (gpointer g_class); +static void gst_audiofilter_template_class_init (gpointer g_class, gpointer class_data); +static void gst_audiofilter_template_init (GTypeInstance *instance, gpointer g_class); + +static void gst_audiofilter_template_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); +static void gst_audiofilter_template_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); + +static void gst_audiofilter_template_setup (GstAudiofilter *audiofilter); +static void gst_audiofilter_template_filter (GstAudiofilter *audiofilter, GstBuffer *outbuf, GstBuffer *inbuf); +static void gst_audiofilter_template_filter_inplace (GstAudiofilter *audiofilter, GstBuffer *buf); + +GType +gst_audiofilter_template_get_type (void) +{ + static GType audiofilter_template_type = 0; + + if (!audiofilter_template_type) { + static const GTypeInfo audiofilter_template_info = { + sizeof(GstAudiofilterTemplateClass), + gst_audiofilter_template_base_init, + NULL, + gst_audiofilter_template_class_init, + NULL, + gst_audiofilter_template_init, + sizeof(GstAudiofilterTemplate), + 0, + NULL, + }; + audiofilter_template_type = g_type_register_static(GST_TYPE_AUDIOFILTER, + "GstAudiofilterTemplate", &audiofilter_template_info, 0); + } + return audiofilter_template_type; +} + +static void gst_audiofilter_template_base_init (gpointer g_class) +{ + static GstElementDetails audiofilter_template_details = { + "Audio filter template", + "Filter/Effect/Audio", + "Filters audio", + "David Schleef <ds@schleef.org>" + }; + GstAudiofilterTemplateClass *klass = (GstAudiofilterTemplateClass *) g_class; + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_set_details (element_class, &audiofilter_template_details); + + gst_audiofilter_class_add_pad_templates (GST_AUDIOFILTER_CLASS (g_class), + gst_caps_from_string (GST_AUDIO_INT_STANDARD_PAD_TEMPLATE_CAPS)); +} + +static void +gst_audiofilter_template_class_init (gpointer g_class, gpointer class_data) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + GstAudiofilterTemplateClass *klass; + GstAudiofilterClass *audiofilter_class; + + klass = (GstAudiofilterTemplateClass *)g_class; + gobject_class = (GObjectClass*)klass; + gstelement_class = (GstElementClass*)klass; + audiofilter_class = (GstAudiofilterClass *)g_class; + +#if 0 + g_object_class_install_property(gobject_class, ARG_METHOD, + g_param_spec_enum("method","method","method", + GST_TYPE_AUDIOTEMPLATE_METHOD, GST_AUDIOTEMPLATE_METHOD_1, + G_PARAM_READWRITE)); +#endif + + gobject_class->set_property = gst_audiofilter_template_set_property; + gobject_class->get_property = gst_audiofilter_template_get_property; + + audiofilter_class->setup = gst_audiofilter_template_setup; + audiofilter_class->filter = gst_audiofilter_template_filter; + audiofilter_class->filter_inplace = gst_audiofilter_template_filter_inplace; +audiofilter_class->filter = NULL; +} + +static void +gst_audiofilter_template_init (GTypeInstance *instance, gpointer g_class) +{ + //GstAudiofilterTemplate *audiofilter_template = GST_AUDIOFILTER_TEMPLATE (instance); + //GstAudiofilter *audiofilter = GST_AUDIOFILTER (instance); + + GST_DEBUG ("gst_audiofilter_template_init"); + + /* do stuff */ + +} + +static void +gst_audiofilter_template_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) +{ + GstAudiofilterTemplate *src; + + /* it's not null if we got it, but it might not be ours */ + g_return_if_fail(GST_IS_AUDIOFILTER_TEMPLATE(object)); + src = GST_AUDIOFILTER_TEMPLATE(object); + + GST_DEBUG("gst_audiofilter_template_set_property"); + switch (prop_id) { + default: + break; + } +} + +static void +gst_audiofilter_template_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec) +{ + GstAudiofilterTemplate *src; + + /* it's not null if we got it, but it might not be ours */ + g_return_if_fail(GST_IS_AUDIOFILTER_TEMPLATE(object)); + src = GST_AUDIOFILTER_TEMPLATE(object); + + switch (prop_id) { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static gboolean +plugin_init (GstPlugin *plugin) +{ + if (!gst_library_load ("gstaudiofilter")) + return FALSE; + + return gst_element_register (plugin, "audiofiltertemplate", GST_RANK_NONE, + GST_TYPE_AUDIOFILTER_TEMPLATE); +} + +GST_PLUGIN_DEFINE ( + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "gstaudiofilter_template", + "Audio filter template", + plugin_init, + VERSION, + "LGPL", + GST_PACKAGE, + GST_ORIGIN +) + +static void +gst_audiofilter_template_setup (GstAudiofilter *audiofilter) +{ + GstAudiofilterTemplate *audiofilter_template; + + g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter)); + audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter); + + /* if any setup needs to be done, do it here */ + +} + +/* You may choose to implement either a copying filter or an + * in-place filter (or both). Implementing only one will give + * full functionality, however, implementing both will cause + * audiofilter to use the optimal function in every situation, + * with a minimum of memory copies. */ + +static void +gst_audiofilter_template_filter (GstAudiofilter *audiofilter, + GstBuffer *outbuf, GstBuffer *inbuf) +{ + GstAudiofilterTemplate *audiofilter_template; + + g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter)); + audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter); + + /* do something interesting here. This simply copies the source + * to the destination. */ + + memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (inbuf), + audiofilter->size); +} + +static void +gst_audiofilter_template_filter_inplace (GstAudiofilter *audiofilter, + GstBuffer *buf) +{ + GstAudiofilterTemplate *audiofilter_template; + + g_return_if_fail (GST_IS_AUDIOFILTER_TEMPLATE (audiofilter)); + audiofilter_template = GST_AUDIOFILTER_TEMPLATE (audiofilter); + + /* do something interesting here. This simply copies the source + * to the destination. */ + +} + diff --git a/gst-libs/gst/audio/make_filter b/gst-libs/gst/audio/make_filter new file mode 100755 index 00000000..6a8efcad --- /dev/null +++ b/gst-libs/gst/audio/make_filter @@ -0,0 +1,35 @@ +#!/bin/sh + +Template=$1; +srcfile=$2; + +if test x"$1" = x ; then + echo "$0 Objectname [srcfile]\n"; + echo " creates gstobjectname.{c,h} implementing GstObjectname,\n"; + echo " subclassing GstAudiofilter.\n"; + exit 1; +fi + +if test x"$2" = x ; then + srcfile="gstaudiofiltertemplate.c" +fi + +id=$(echo '$Id$' | sed \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + ) +echo $id + +TEMPLATE=$(echo $Template | tr a-z A-Z) +template=$(echo $Template | tr A-Z a-z) + +# remember to break up the Id: in the line below +sed \ + -e 's/gstaudiofiltertemplate\.c/SOURCEFILE/g' \ + -e "s/AudiofilterTemplate/$Template/g" \ + -e "s/audiofiltertemplate/$template/g" \ + -e "s/VIDEOFILTERTEMPLATE/$TEMPLATE/g" \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + -e 's/SOURCEFILE/gstaudiofiltertemplate\.c/g' \ + -e "s%MAKEFILTERVERSION%$id%g" \ + $srcfile >gst$template.c.tmp && mv gst$template.c.tmp gst$template.c + |