gst-libs/gst/audio/Makefile.am: Add gstaudiofiltertemplate.c and building of gstaudio...
authorDavid Schleef <ds@schleef.org>
Fri, 16 Jan 2004 00:55:29 +0000 (00:55 +0000)
committerDavid Schleef <ds@schleef.org>
Fri, 16 Jan 2004 00:55:29 +0000 (00:55 +0000)
Original commit message from CVS:
* gst-libs/gst/audio/Makefile.am:
Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c
from the template.
* gst-libs/gst/audio/gstaudiofilter.c:
* gst-libs/gst/audio/gstaudiofilter.h:
Add bytes_per_sample and size and n_samples calculation.
* gst-libs/gst/audio/gstaudiofilterexample.c:
Remove, now autogenerated.
* gst-libs/gst/audio/gstaudiofiltertemplate.c:
Moved from gstaudiofilterexample, object name changed, code added
so that it actually works.
* gst-libs/gst/audio/make_filter:
Script to build an audiofilter subclass from the template.
* gst/colorspace/Makefile.am:
* gst/colorspace/yuv2yuv.c:
Remove file, since it's GPL, and we don't use it.

ChangeLog
gst-libs/gst/audio/Makefile.am
gst-libs/gst/audio/gstaudiofilter.c
gst-libs/gst/audio/gstaudiofilter.h
gst-libs/gst/audio/gstaudiofilterexample.c [deleted file]
gst-libs/gst/audio/gstaudiofiltertemplate.c [new file with mode: 0644]
gst-libs/gst/audio/make_filter [new file with mode: 0755]

index 73f0a22..eac8669 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2004-01-15  David Schleef  <ds@schleef.org>
+
+       * gst-libs/gst/audio/Makefile.am:
+       Add gstaudiofiltertemplate.c and building of gstaudiofilterexample.c
+       from the template.
+       * gst-libs/gst/audio/gstaudiofilter.c:
+       * gst-libs/gst/audio/gstaudiofilter.h:
+       Add bytes_per_sample and size and n_samples calculation.
+       * gst-libs/gst/audio/gstaudiofilterexample.c:
+       Remove, now autogenerated.
+       * gst-libs/gst/audio/gstaudiofiltertemplate.c:
+       Moved from gstaudiofilterexample, object name changed, code added
+       so that it actually works.
+       * gst-libs/gst/audio/make_filter:
+       Script to build an audiofilter subclass from the template.
+       * gst/colorspace/Makefile.am:
+       * gst/colorspace/yuv2yuv.c:
+       Remove file, since it's GPL, and we don't use it.
+
 2004-01-15  Julien MOUTTE  <julien@moutte.net>
 
        * sys/ximage/ximagesink.c: (gst_ximagesink_chain): 
index d99cbcc..ac16d96 100644 (file)
@@ -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
index cda21da..35ed487 100644 (file)
@@ -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);
index 4723c32..9786e16 100644 (file)
@@ -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 (file)
index 15e111a..0000000
+++ /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 (file)
index 0000000..c7c0ce2
--- /dev/null
@@ -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 (executable)
index 0000000..6a8efca
--- /dev/null
@@ -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
+