diff options
author | Aleksey Lim <alsroot@member.fsf.org> | 2009-02-04 21:59:03 (GMT) |
---|---|---|
committer | Aleksey Lim <alsroot@member.fsf.org> | 2009-02-04 21:59:03 (GMT) |
commit | e229ac4e514e5ab454d3008467c4220a8819e9dd (patch) | |
tree | 5ce5096e6504a7c7ee08e941e66b5b6b4fdd9b8b |
Initial gst-template commit
-rw-r--r-- | .gitignore | 9 | ||||
-rw-r--r-- | AUTHORS | 1 | ||||
-rw-r--r-- | COPYING | 2 | ||||
-rw-r--r-- | ChangeLog | 217 | ||||
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | NEWS | 1 | ||||
-rw-r--r-- | README | 34 | ||||
-rwxr-xr-x | autogen.sh | 91 | ||||
-rw-r--r-- | configure.ac | 131 | ||||
-rw-r--r-- | gst-autogen.sh | 308 | ||||
-rw-r--r-- | m4/Makefile.am | 1 | ||||
-rw-r--r-- | m4/as-compiler-flag.m4 | 25 | ||||
-rw-r--r-- | m4/as-version.m4 | 66 | ||||
-rw-r--r-- | src/Makefile.am | 27 | ||||
-rw-r--r-- | src/gstespeak.c | 271 | ||||
-rw-r--r-- | src/gstespeak.h | 86 | ||||
-rw-r--r-- | src/gstplugin.c | 271 | ||||
-rw-r--r-- | src/gstplugin.h | 86 | ||||
-rwxr-xr-x | tools/make_element | 80 |
19 files changed, 1710 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0e9b070 --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +aclocal.m4 +autom4te.cache +autoregen.sh +config.log +config.status +configure +libtool + +gst-plugin-*.tar.* @@ -0,0 +1 @@ +Thomas Vander Stichele <thomas@apestaart.org> @@ -0,0 +1,2 @@ +Put your license in here! + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..5c25746 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,217 @@ +2008-11-04 Stefan Kost <ensonic@users.sf.net> + + * src/Makefile.am: + Don't install static libs for plugins. Fixes #550851 for the template. + +2008-10-30 Stefan Kost <ensonic@users.sf.net> + + * tools/make_element: + Don't replace GstPlugin. + +2008-08-11 Stefan Kost <ensonic@users.sf.net> + + * README: + * src/gstaudiofilter.c: + * src/gstplugin.c: + * src/gsttransform.c: + * tools/make_element: + Integrate new template and improve search'n'replace ops. Update + templates to use current API. + +2008-07-26 Stefan Kost <ensonic@users.sf.net> + + * tools/make_element: + Fix username detection. tries getent first and falls back to grep + passwd. Spotted by Karoly Segesdi. + +2008-06-09 Jan Schmidt <jan.schmidt@sun.com> + + * src/gstplugin.c: + Fix some memory leaks, and make the setcaps function actually + sets the caps on the other pad. + +2008-05-08 Stefan Kost <ensonic@users.sf.net> + + * README: + Add simple usage explanation and make it look like the other READMEs. + + * src/gstplugin.c: + * src/gstplugin.h: + * src/gsttransform.c: + * src/gsttransform.h: + * tools/make_element: + Add year, username and email fields. Update the templates here and + there a bit. Add more comments. + +2007-08-01 Tim-Philipp Müller <tim at centricular dot net> + + * src/gsttransform.c: + Include right header to avoid structure size mismatches etc. + +2007-07-25 Tim-Philipp Müller <tim at centricular dot net> + + Patch by: Steve Fink <sphink gmail com> + + * src/gstplugin.c: + Use GST_DEBUG_FUNCPTR() macros where it makes sense. + +2007-07-19 Stefan Kost <ensonic@users.sf.net> + + * configure.ac: + Fix CVS-build detection. + +2007-01-23 Tim-Philipp Müller <tim at centricular dot net> + + * src/Makefile.am: + Make clearer which Makefile variables need renaming if the plugin + name is changes (#399746) (pretty it is not, but it's the content + that counts, right?) + +2007-01-22 Tim-Philipp Müller <tim at centricular dot net> + + Patch by: Philip Jägenstedt <philipj at opera com> + + * tools/make_element: + Translate FOO_IS_MY_PLUGIN macro as well according to the template + (#399323). + +2006-07-04 Tim-Philipp Müller <tim at centricular dot net> + + * autogen.sh: + Run autoheader to create config.h.in and fix the build.` + +2006-07-03 Tim-Philipp Müller <tim at centricular dot net> + + * Makefile.am: + * autogen.sh: + * gst-autogen.sh: + Throw an error if autotools versions are too old. We require + automake 1.7 or newer (#346054). Add gst-autogen.sh to check + for this. + + * COPYING: + Add placeholder COPYING file so it doesn't get overwritten + by a GPL one by automake. + +2006-06-22 Tim-Philipp Müller <tim at centricular dot net> + + Patch by: Philip Jägenstedt <philip at lysator liu se> + + * src/gstplugin.c: (gst_plugin_template_base_init), + (gst_plugin_template_class_init), (gst_plugin_template_init), + (plugin_init): + Use GST_BOILERPLATE, add debug category (#345601). + +2006-04-20 Stefan Kost <ensonic@users.sf.net> + + Patch by: Johan Rydberg <jrydberg@gnu.org> + + * src/gstplugin.c: (gst_plugin_template_get_type), + (gst_plugin_template_base_init), (gst_plugin_template_class_init), + (gst_plugin_template_set_property), + (gst_plugin_template_get_property): + * src/gstplugin.h: + * src/gsttransform.c: (gst_plugin_template_base_init), + (gst_plugin_template_set_property), + (gst_plugin_template_get_property): + * tools/make_element: + remove double gst_get_, fix '_' in names + + +2006-02-26 Tim-Philipp Müller <tim at centricular dot net> + + * src/gstplugin.c: (gst_plugin_template_init), + (gst_plugin_template_chain): + Fix function declaration of _init() function. + Remove unnecessary assertion clutter in chain function + (that also failed to return a flow value, causing + compiler warnings). + +2006-02-07 Stefan Kost <ensonic@users.sf.net> + + * src/gstplugin.c: (gst_plugin_template_set_caps), + (gst_plugin_template_chain): + * src/gsttransform.c: (gst_plugin_template_transform_ip): + more code cleanups, more comments + +2006-02-07 Stefan Kost <ensonic@users.sf.net> + + * configure.ac: + allow installing to $HOME + * src/gstplugin.c: (gst_plugin_template_base_init), + (gst_plugin_template_init): + * src/gstplugin.h: + * src/gsttransform.c: (gst_plugin_template_base_init), + (gst_plugin_template_class_init), (gst_plugin_template_init), + (gst_plugin_template_transform_ip), + (gst_plugin_template_set_property), + (gst_plugin_template_get_property), (plugin_init): + * src/gsttransform.h: + add another template + * tools/make_element: + fix generator, when template (arg2) is given + +2006-01-23 Tim-Philipp Müller <tim at centricular dot net> + + * src/gstplugin.h: + FOO_BAR_CLASS(klass) should cast to FooBarClass*, + not FooBar*. + +2006-01-13 Thomas Vander Stichele <thomas at apestaart dot org> + + * autogen.sh: + * configure.ac: + * src/Makefile.am: + * src/gstplugin.c: + bring into the 0.10 world + Fix #315582 + +2005-12-16 Jan Schmidt <thaytan@mad.scientist.com> + + * src/gstplugin.c: (gst_plugin_template_class_init): + Need to have the set_property and get_property methods + before installing properties + +2005-12-14 Tim-Philipp Müller <tim at centricular dot net> + + * src/gstplugin.h: + Fix GST_IS_FOO_BAR_CLASS macro. + +2005-06-30 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + + * configure.ac: + * src/gstplugin.c: (gst_plugin_template_set_caps), + (gst_plugin_template_init), (gst_plugin_template_chain): + Fix for GStreamer 0.9. + +2004-04-22 Thomas Vander Stichele <thomas at apestaart dot org> + + * Makefile.am: + * autogen.sh: + * configure.ac: + * src/Makefile.am: + use proper LDFLAGS for plugins + run in maintainer mode by default + +2004-04-22 Thomas Vander Stichele <thomas at apestaart dot org> + + * configure.ac: ... and fix comments too + +2004-04-03 Benjamin Otte <otte@gnome.org> + + * configure.ac: + update for GStreamer 0.8 + +2004-01-25 Ronald Bultje <rbultje@ronald.bitfreak.net> + + * src/gstplugin.c: (gst_plugin_template_link), + (gst_plugin_template_base_init), (gst_plugin_template_init): + Fix for GStreamer 0.7.x. + +2003-02-06 Thomas Vander Stichele <thomas at apestaart dot org> + + * updated for GStreamer 0.6.0 + +2002-07-17 Thomas Vander Stichele <thomas at apestaart dot org> + + * initial creation on a flight to New York diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 0000000..7203ad8 --- /dev/null +++ b/Makefile.am @@ -0,0 +1,3 @@ +SUBDIRS = m4 src + +EXTRA_DIST = autogen.sh gst-autogen.sh @@ -0,0 +1 @@ +Nothing much yet. @@ -0,0 +1,34 @@ +WHAT IT IS +---------- + +gst-plugin is a template for writing your own GStreamer plug-in. + +The code is deliberately kept simple so that you quickly understand the basics +of how to set up autotools and your source tree. + +This template demonstrates : +- what to do in autogen.sh +- how to setup configure.ac (your package name and version, GStreamer flags) +- how to setup your source dir +- what to put in Makefile.am + +More features and templates might get added later on. + +HOW TO USE IT +------------- + +To use it, either make a copy for yourself and rename the parts or use the +make_element script in tools. To create sources for "myfilter" based on the +"gsttransform" template run: + +cd src; +../tools/make_element myfilter gsttransform + +This will create gstmyfilter.c and gstmyfilter.h. Open them in an editor and +start editing. There are several occurances of the string "template", update +those with real values. The plugin will be called 'myfilter' and it will have +one element called 'myfilter' too. Also look for "FIXME:" markers that point you +to places where you need to edit the code. + +You still need to adjust the Makefile.am. + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 0000000..9d84a03 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,91 @@ +#!/bin/sh +# you can either set the environment variables AUTOCONF and AUTOMAKE +# to the right versions, or leave them unset and get the RedHat 7.3 defaults + +DIE=0 +package=gst-plugin +srcfile=src/main.c + +# autogen.sh helper functions (copied from GStreamer's common/ CVS module) +if test ! -f ./gst-autogen.sh; +then + echo There is something wrong with your source tree. + echo You are either missing ./gst-autogen.sh or not + echo running autogen.sh from the top-level source + echo directory. + exit 1 +fi +. ./gst-autogen.sh + +CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-debug' + +autogen_options $@ + +echo -n "+ check for build tools" +if test ! -z "$NOCHECK"; then echo " skipped"; else echo; fi +version_check "autoconf" "$AUTOCONF autoconf autoconf259 autoconf257 autoconf-2.54 autoconf-2.53 autoconf-2.52" \ + "ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 52 || DIE=1 +version_check "automake" "$AUTOMAKE automake automake-1.9 automake19 automake-1.7 automake-1.6 automake-1.5" \ + "ftp://ftp.gnu.org/pub/gnu/automake/" 1 7 || DIE=1 +###version_check "autopoint" "autopoint" \ +### "ftp://ftp.gnu.org/pub/gnu/gettext/" 0 11 5 || DIE=1 +version_check "libtoolize" "$LIBTOOLIZE libtoolize glibtoolize" \ + "ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1 +version_check "pkg-config" "" \ + "http://www.freedesktop.org/software/pkgconfig" 0 8 0 || DIE=1 + +die_check $DIE + +autoconf_2_52d_check || DIE=1 +aclocal_check || DIE=1 +autoheader_check || DIE=1 + +die_check $DIE + +# if no arguments specified then this will be printed +if test -z "$*"; then + echo "+ checking for autogen.sh options" + echo " This autogen script will automatically run ./configure as:" + echo " ./configure $CONFIGURE_DEF_OPT" + echo " To pass any additional options, please specify them on the $0" + echo " command line." +fi + +tool_run "$aclocal" "-I m4/ $ACLOCAL_FLAGS" +tool_run "$libtoolize" "--copy --force" +tool_run "$autoheader" +tool_run "$autoconf" +tool_run "$automake" "-a -c" + +# if enable exists, add an -enable option for each of the lines in that file +if test -f enable; then + for a in `cat enable`; do + CONFIGURE_FILE_OPT="--enable-$a" + done +fi + +# if disable exists, add an -disable option for each of the lines in that file +if test -f disable; then + for a in `cat disable`; do + CONFIGURE_FILE_OPT="$CONFIGURE_FILE_OPT --disable-$a" + done +fi + +test -n "$NOCONFIGURE" && { + echo "+ skipping configure stage for package $package, as requested." + echo "+ autogen.sh done." + exit 0 +} + +echo "+ running configure ... " +test ! -z "$CONFIGURE_DEF_OPT" && echo " ./configure default flags: $CONFIGURE_DEF_OPT" +test ! -z "$CONFIGURE_EXT_OPT" && echo " ./configure external flags: $CONFIGURE_EXT_OPT" +test ! -z "$CONFIGURE_FILE_OPT" && echo " ./configure enable/disable flags: $CONFIGURE_FILE_OPT" +echo + +./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT $CONFIGURE_FILE_OPT || { + echo " configure failed" + exit 1 +} + +echo "Now type 'make' to compile $package." diff --git a/configure.ac b/configure.ac new file mode 100644 index 0000000..ba2be0f --- /dev/null +++ b/configure.ac @@ -0,0 +1,131 @@ +AC_INIT + +dnl versions of gstreamer and plugins-base +GST_MAJORMINOR=0.10 +GST_REQUIRED=0.10.0 +GSTPB_REQUIRED=0.10.0 + +dnl fill in your package name and version here +dnl the fourth (nano) number should be 0 for a release, 1 for CVS, +dnl and 2... for a prerelease + +dnl when going to/from release please set the nano correctly ! +dnl releases only do Wall, cvs and prerelease does Werror too +AS_VERSION(gst-plugin, GST_PLUGIN_VERSION, 0, 10, 0, 1, + GST_PLUGIN_CVS="no", GST_PLUGIN_CVS="yes") + +dnl AM_MAINTAINER_MODE provides the option to enable maintainer mode +#AM_MAINTAINER_MODE + +AM_INIT_AUTOMAKE($PACKAGE, $VERSION) + +dnl make aclocal work in maintainer mode +AC_SUBST(ACLOCAL_AMFLAGS, "-I m4") + +AM_CONFIG_HEADER(config.h) + +dnl check for tools +AC_PROG_CC +AC_PROG_LIBTOOL + + +dnl decide on error flags +AS_COMPILER_FLAG(-Wall, GST_WALL="yes", GST_WALL="no") + +if test "x$GST_WALL" = "xyes"; then + GST_ERROR="$GST_ERROR -Wall" + + if test "x$GST_PLUGIN_CVS" = "xyes"; then + AS_COMPILER_FLAG(-Werror,GST_ERROR="$GST_ERROR -Werror",GST_ERROR="$GST_ERROR") + fi +fi + +dnl Check for pkgconfig first +AC_CHECK_PROG(HAVE_PKGCONFIG, pkg-config, yes, no) + +dnl Give error and exit if we don't have pkgconfig +if test "x$HAVE_PKGCONFIG" = "xno"; then + AC_MSG_ERROR(you need to have pkgconfig installed !) +fi + +dnl Now we're ready to ask for gstreamer libs and cflags +dnl And we can also ask for the right version of gstreamer + + +PKG_CHECK_MODULES(GST, \ + gstreamer-$GST_MAJORMINOR >= $GST_REQUIRED, + HAVE_GST=yes,HAVE_GST=no) + +dnl Give error and exit if we don't have gstreamer +if test "x$HAVE_GST" = "xno"; then + AC_MSG_ERROR(you need gstreamer development packages installed !) +fi + +dnl append GST_ERROR cflags to GST_CFLAGS +GST_CFLAGS="$GST_CFLAGS $GST_ERROR" + +dnl make GST_CFLAGS and GST_LIBS available +AC_SUBST(GST_CFLAGS) +AC_SUBST(GST_LIBS) + +dnl make GST_MAJORMINOR available in Makefile.am +AC_SUBST(GST_MAJORMINOR) + +dnl If we need them, we can also use the base class libraries +PKG_CHECK_MODULES(GST_BASE, gstreamer-base-$GST_MAJORMINOR >= $GST_REQUIRED, + HAVE_GST_BASE=yes, HAVE_GST_BASE=no) + +dnl Give a warning if we don't have gstreamer libs +dnl you can turn this into an error if you need them +if test "x$HAVE_GST_BASE" = "xno"; then + AC_MSG_NOTICE(no GStreamer base class libraries found (gstreamer-base-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GST_BASE_CFLAGS) +AC_SUBST(GST_BASE_LIBS) + +dnl If we need them, we can also use the gstreamer-plugins-base libraries +PKG_CHECK_MODULES(GSTPB_BASE, + gstreamer-plugins-base-$GST_MAJORMINOR >= $GSTPB_REQUIRED, + HAVE_GSTPB_BASE=yes, HAVE_GSTPB_BASE=no) + +dnl Give a warning if we don't have gstreamer libs +dnl you can turn this into an error if you need them +if test "x$HAVE_GSTPB_BASE" = "xno"; then + AC_MSG_NOTICE(no GStreamer Plugins Base libraries found (gstreamer-plugins-base-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GSTPB_BASE_CFLAGS) +AC_SUBST(GSTPB_BASE_LIBS) + +dnl If we need them, we can also use the gstreamer-controller libraries +PKG_CHECK_MODULES(GSTCTRL, + gstreamer-controller-$GST_MAJORMINOR >= $GSTPB_REQUIRED, + HAVE_GSTCTRL=yes, HAVE_GSTCTRL=no) + +dnl Give a warning if we don't have gstreamer-controller +dnl you can turn this into an error if you need them +if test "x$HAVE_GSTCTRL" = "xno"; then + AC_MSG_NOTICE(no GStreamer Controller libraries found (gstreamer-controller-$GST_MAJORMINOR)) +fi + +dnl make _CFLAGS and _LIBS available +AC_SUBST(GSTCTRL_CFLAGS) +AC_SUBST(GSTCTRL_LIBS) + +dnl set the plugindir where plugins should be installed +if test "x${prefix}" = "x$HOME"; then + plugindir="$HOME/.gstreamer-$GST_MAJORMINOR/plugins" +else + plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR" +fi +AC_SUBST(plugindir) + +dnl set proper LDFLAGS for plugins +GST_PLUGIN_LDFLAGS='-module -avoid-version -export-symbols-regex [_]*\(gst_\|Gst\|GST_\).*' +AC_SUBST(GST_PLUGIN_LDFLAGS) + +AC_OUTPUT(Makefile m4/Makefile src/Makefile) + diff --git a/gst-autogen.sh b/gst-autogen.sh new file mode 100644 index 0000000..7b31212 --- /dev/null +++ b/gst-autogen.sh @@ -0,0 +1,308 @@ +# a silly hack that generates autoregen.sh but it's handy +# Remove the old autoregen.sh first to create a new file, +# as the current one may be being read by the shell executing +# this script. +if [ -f "autoregen.sh" ]; then + rm autoregen.sh +fi +echo "#!/bin/sh" > autoregen.sh +echo "./autogen.sh $@ \$@" >> autoregen.sh +chmod +x autoregen.sh + +# helper functions for autogen.sh + +debug () +# print out a debug message if DEBUG is a defined variable +{ + if test ! -z "$DEBUG" + then + echo "DEBUG: $1" + fi +} + +version_check () +# check the version of a package +# first argument : package name (executable) +# second argument : optional path where to look for it instead +# third argument : source download url +# rest of arguments : major, minor, micro version +# all consecutive ones : suggestions for binaries to use +# (if not specified in second argument) +{ + PACKAGE=$1 + PKG_PATH=$2 + URL=$3 + MAJOR=$4 + MINOR=$5 + MICRO=$6 + + # for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null + if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi + debug "major $MAJOR minor $MINOR micro $MICRO" + VERSION=$MAJOR + if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi + if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi + + debug "major $MAJOR minor $MINOR micro $MICRO" + + for SUGGESTION in $PKG_PATH; do + COMMAND="$SUGGESTION" + + # don't check if asked not to + test -z "$NOCHECK" && { + echo -n " checking for $COMMAND >= $VERSION ... " + } || { + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + } + + debug "checking version with $COMMAND" + ($COMMAND --version) < /dev/null > /dev/null 2>&1 || + { + echo "not found." + continue + } + # strip everything that's not a digit, then use cut to get the first field + pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1` + debug "pkg_version $pkg_version" + # remove any non-digit characters from the version numbers to permit numeric + # comparison + pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g` + pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g` + pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g` + test -z "$pkg_major" && pkg_major=0 + test -z "$pkg_minor" && pkg_minor=0 + test -z "$pkg_micro" && pkg_micro=0 + debug "found major $pkg_major minor $pkg_minor micro $pkg_micro" + + #start checking the version + debug "version check" + + # reset check + WRONG= + + if [ ! "$pkg_major" -gt "$MAJOR" ]; then + debug "major: $pkg_major <= $MAJOR" + if [ "$pkg_major" -lt "$MAJOR" ]; then + debug "major: $pkg_major < $MAJOR" + WRONG=1 + elif [ ! "$pkg_minor" -gt "$MINOR" ]; then + debug "minor: $pkg_minor <= $MINOR" + if [ "$pkg_minor" -lt "$MINOR" ]; then + debug "minor: $pkg_minor < $MINOR" + WRONG=1 + elif [ "$pkg_micro" -lt "$MICRO" ]; then + debug "micro: $pkg_micro < $MICRO" + WRONG=1 + fi + fi + fi + + if test ! -z "$WRONG"; then + echo "found $pkg_version, not ok !" + continue + else + echo "found $pkg_version, ok." + # we set a var with the same name as the package, but stripped of + # unwanted chars + VAR=`echo $PACKAGE | sed 's/-//g'` + debug "setting $VAR" + eval $VAR="$COMMAND" + return 0 + fi + done + + echo "not found !" + echo "You must have $PACKAGE installed to compile $package." + echo "Download the appropriate package for your distribution," + echo "or get the source tarball at $URL" + return 1; +} + +aclocal_check () +{ + # normally aclocal is part of automake + # so we expect it to be in the same place as automake + # so if a different automake is supplied, we need to adapt as well + # so how's about replacing automake with aclocal in the set var, + # and saving that in $aclocal ? + # note, this will fail if the actual automake isn't called automake* + # or if part of the path before it contains it + if [ -z "$automake" ]; then + echo "Error: no automake variable set !" + return 1 + else + aclocal=`echo $automake | sed s/automake/aclocal/` + debug "aclocal: $aclocal" + if [ "$aclocal" != "aclocal" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal" + fi + if [ ! -x `which $aclocal` ]; then + echo "Error: cannot execute $aclocal !" + return 1 + fi + fi +} + +autoheader_check () +{ + # same here - autoheader is part of autoconf + # use the same voodoo + if [ -z "$autoconf" ]; then + echo "Error: no autoconf variable set !" + return 1 + else + autoheader=`echo $autoconf | sed s/autoconf/autoheader/` + debug "autoheader: $autoheader" + if [ "$autoheader" != "autoheader" ]; + then + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" + fi + if [ ! -x `which $autoheader` ]; then + echo "Error: cannot execute $autoheader !" + return 1 + fi + fi + +} +autoconf_2_52d_check () +{ + # autoconf 2.52d has a weird issue involving a yes:no error + # so don't allow it's use + test -z "$NOCHECK" && { + ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'` + if test "$ac_version" = "2.52d"; then + echo "autoconf 2.52d has an issue with our current build." + echo "We don't know who's to blame however. So until we do, get a" + echo "regular version. RPM's of a working version are on the gstreamer site." + exit 1 + fi + } + return 0 +} + +die_check () +{ + # call with $DIE + # if set to 1, we need to print something helpful then die + DIE=$1 + if test "x$DIE" = "x1"; + then + echo + echo "- Please get the right tools before proceeding." + echo "- Alternatively, if you're sure we're wrong, run with --nocheck." + exit 1 + fi +} + +autogen_options () +{ + if test "x$1" = "x"; then + return 0 + fi + + while test "x$1" != "x" ; do + optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + case "$1" in + --noconfigure) + NOCONFIGURE=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure" + echo "+ configure run disabled" + shift + ;; + --nocheck) + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck" + NOCHECK=defined + echo "+ autotools version check disabled" + shift + ;; + --debug) + DEBUG=defined + AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" + echo "+ debug output enabled" + shift + ;; + --prefix=*) + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$optarg" + echo "+ passing --prefix=$optarg to configure" + shift + ;; + --prefix) + shift + echo "DEBUG: $1" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$1" + echo "+ passing --prefix=$1 to configure" + shift + ;; + + -h|--help) + echo "autogen.sh (autogen options) -- (configure options)" + echo "autogen.sh help options: " + echo " --noconfigure don't run the configure script" + echo " --nocheck don't do version checks" + echo " --debug debug the autogen process" + echo " --prefix will be passed on to configure" + echo + echo " --with-autoconf PATH use autoconf in PATH" + echo " --with-automake PATH use automake in PATH" + echo + echo "to pass options to configure, put them as arguments after -- " + exit 1 + ;; + --with-automake=*) + AUTOMAKE=$optarg + echo "+ using alternate automake in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE" + shift + ;; + --with-autoconf=*) + AUTOCONF=$optarg + echo "+ using alternate autoconf in $optarg" + CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" + shift + ;; + --disable*|--enable*|--with*) + echo "+ passing option $1 to configure" + CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" + shift + ;; + --) shift ; break ;; + *) echo "- ignoring unknown autogen.sh argument $1"; shift ;; + esac + done + + for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done + if test ! -z "$CONFIGURE_EXT_OPT" + then + echo "+ options passed to configure: $CONFIGURE_EXT_OPT" + fi +} + +toplevel_check () +{ + srcfile=$1 + test -f $srcfile || { + echo "You must run this script in the top-level $package directory" + exit 1 + } +} + + +tool_run () +{ + tool=$1 + options=$2 + run_if_fail=$3 + echo "+ running $tool $options..." + $tool $options || { + echo + echo $tool failed + eval $run_if_fail + exit 1 + } +} diff --git a/m4/Makefile.am b/m4/Makefile.am new file mode 100644 index 0000000..4a44032 --- /dev/null +++ b/m4/Makefile.am @@ -0,0 +1 @@ +EXTRA_DIST = as-version.m4 as-compiler-flag.m4 diff --git a/m4/as-compiler-flag.m4 b/m4/as-compiler-flag.m4 new file mode 100644 index 0000000..2f0ba19 --- /dev/null +++ b/m4/as-compiler-flag.m4 @@ -0,0 +1,25 @@ +dnl as-compiler-flag.m4 0.0.1 +dnl autostars m4 macro for detection of compiler flags +dnl +dnl ds@schleef.org + +AC_DEFUN([AS_COMPILER_FLAG], +[ + AC_MSG_CHECKING([to see if compiler understands $1]) + + save_CFLAGS="$CFLAGS" + CFLAGS="$CFLAGS $1" + + AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no]) + CFLAGS="$save_CFLAGS" + + if test "X$flag_ok" = Xyes ; then + $2 + true + else + $3 + true + fi + AC_MSG_RESULT([$flag_ok]) +]) + diff --git a/m4/as-version.m4 b/m4/as-version.m4 new file mode 100644 index 0000000..0bee437 --- /dev/null +++ b/m4/as-version.m4 @@ -0,0 +1,66 @@ +dnl as-version.m4 0.1.0 + +dnl autostars m4 macro for versioning + +dnl Thomas Vander Stichele <thomas at apestaart dot org> + +dnl $Id: as-version.m4,v 1.2 2004-09-17 22:18:03 leroutier Exp $ + +dnl AS_VERSION(PACKAGE, PREFIX, MAJOR, MINOR, MICRO, NANO, +dnl ACTION-IF-NO-NANO, [ACTION-IF-NANO]) + +dnl example +dnl AS_VERSION(gstreamer, GST_VERSION, 0, 3, 2,) +dnl for a 0.3.2 release version + +dnl this macro +dnl - defines [$PREFIX]_MAJOR, MINOR and MICRO +dnl - if NANO is empty, then we're in release mode, else in cvs/dev mode +dnl - defines [$PREFIX], VERSION, and [$PREFIX]_RELEASE +dnl - executes the relevant action +dnl - AC_SUBST's PACKAGE, VERSION, [$PREFIX] and [$PREFIX]_RELEASE +dnl as well as the little ones +dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents +dnl maintainer mode from running ok +dnl +dnl don't forget to put #undef [$2] and [$2]_RELEASE in acconfig.h +dnl if you use acconfig.h + +AC_DEFUN([AS_VERSION], +[ + PACKAGE=[$1] + [$2]_MAJOR=[$3] + [$2]_MINOR=[$4] + [$2]_MICRO=[$5] + NANO=[$6] + [$2]_NANO=$NANO + if test "x$NANO" = "x" || test "x$NANO" = "x0"; + then + AC_MSG_NOTICE(configuring [$1] for release) + VERSION=[$3].[$4].[$5] + [$2]_RELEASE=1 + dnl execute action + ifelse([$7], , :, [$7]) + else + AC_MSG_NOTICE(configuring [$1] for development with nano $NANO) + VERSION=[$3].[$4].[$5].$NANO + [$2]_RELEASE=0.`date +%Y%m%d.%H%M%S` + dnl execute action + ifelse([$8], , :, [$8]) + fi + + [$2]=$VERSION + AC_DEFINE_UNQUOTED([$2], "$[$2]", [Define the version]) + AC_SUBST([$2]) + AC_DEFINE_UNQUOTED([$2]_RELEASE, "$[$2]_RELEASE", [Define the release version]) + AC_SUBST([$2]_RELEASE) + + AC_SUBST([$2]_MAJOR) + AC_SUBST([$2]_MINOR) + AC_SUBST([$2]_MICRO) + AC_SUBST([$2]_NANO) + AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Define the package name]) + AC_SUBST(PACKAGE) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Define the version]) + AC_SUBST(VERSION) +]) diff --git a/src/Makefile.am b/src/Makefile.am new file mode 100644 index 0000000..8efd485 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,27 @@ +# plugindir is set in configure + +############################################################################## +# change libgstplugin.la to something more suitable, e.g. libmysomething.la # +############################################################################## +plugin_LTLIBRARIES = libgstplugin.la + +############################################################################## +# for the next set of variables, rename the prefix if you renamed the .la, # +# e.g. libgstplugin_la_SOURCES => libmysomething_la_SOURCES # +# libgstplugin_la_CFLAGS => libmysomething_la_CFLAGS # +# libgstplugin_la_LIBADD => libmysomething_la_LIBADD # +# libgstplugin_la_LDFLAGS => libmysomething_la_LDFLAGS # +############################################################################## + +# sources used to compile this plug-in +libgstplugin_la_SOURCES = gstplugin.c + +# flags used to compile this plugin +# add other _CFLAGS and _LIBS as needed +libgstplugin_la_CFLAGS = $(GST_CFLAGS) +libgstplugin_la_LIBADD = $(GST_LIBS) +libgstplugin_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) +libgstplugin_la_LIBTOOLFLAGS = --tag=disable-static + +# headers we need but don't want installed +noinst_HEADERS = gstplugin.h diff --git a/src/gstespeak.c b/src/gstespeak.c new file mode 100644 index 0000000..f3ee79d --- /dev/null +++ b/src/gstespeak.c @@ -0,0 +1,271 @@ +/* + * GStreamer + * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org> + * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * Copyright (C) 2009 <<user@hostname.org>> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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. + */ + +/** + * SECTION:element-espeak + * + * FIXME:Describe espeak here. + * + * <refsect2> + * <title>Example launch line</title> + * |[ + * gst-launch -v -m fakesrc ! espeak ! fakesink silent=TRUE + * ]| + * </refsect2> + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gst/gst.h> + +#include "gstespeak.h" + +GST_DEBUG_CATEGORY_STATIC (gst_espeak_debug); +#define GST_CAT_DEFAULT gst_espeak_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_SILENT +}; + +/* the capabilities of the inputs and outputs. + * + * describe the real formats here. + */ +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") + ); + +GST_BOILERPLATE (GstEspeak, gst_espeak, GstElement, + GST_TYPE_ELEMENT); + +static void gst_espeak_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_espeak_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_espeak_set_caps (GstPad * pad, GstCaps * caps); +static GstFlowReturn gst_espeak_chain (GstPad * pad, GstBuffer * buf); + +/* GObject vmethod implementations */ + +static void +gst_espeak_base_init (gpointer gclass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_set_details_simple(element_class, + "Espeak", + "FIXME:Generic", + "FIXME:Generic Template Element", + " <<user@hostname.org>>"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); +} + +/* initialize the espeak's class */ +static void +gst_espeak_class_init (GstEspeakClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_espeak_set_property; + gobject_class->get_property = gst_espeak_get_property; + + g_object_class_install_property (gobject_class, PROP_SILENT, + g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?", + FALSE, G_PARAM_READWRITE)); +} + +/* initialize the new element + * instantiate pads and add them to element + * set pad calback functions + * initialize instance structure + */ +static void +gst_espeak_init (GstEspeak * filter, + GstEspeakClass * gclass) +{ + filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_pad_set_setcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_espeak_set_caps)); + gst_pad_set_getcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_espeak_chain)); + + filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_pad_set_getcaps_function (filter->srcpad, + GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); + + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + filter->silent = FALSE; +} + +static void +gst_espeak_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstEspeak *filter = GST_ESPEAK (object); + + switch (prop_id) { + case PROP_SILENT: + filter->silent = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_espeak_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstEspeak *filter = GST_ESPEAK (object); + + switch (prop_id) { + case PROP_SILENT: + g_value_set_boolean (value, filter->silent); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstElement vmethod implementations */ + +/* this function handles the link with other elements */ +static gboolean +gst_espeak_set_caps (GstPad * pad, GstCaps * caps) +{ + GstEspeak *filter; + GstPad *otherpad; + + filter = GST_ESPEAK (gst_pad_get_parent (pad)); + otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; + gst_object_unref (filter); + + return gst_pad_set_caps (otherpad, caps); +} + +/* chain function + * this function does the actual processing + */ +static GstFlowReturn +gst_espeak_chain (GstPad * pad, GstBuffer * buf) +{ + GstEspeak *filter; + + filter = GST_ESPEAK (GST_OBJECT_PARENT (pad)); + + if (filter->silent == FALSE) + g_print ("I'm plugged, therefore I'm in.\n"); + + /* just push out the incoming buffer without touching it */ + return gst_pad_push (filter->srcpad, buf); +} + + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and other features + */ +static gboolean +espeak_init (GstPlugin * espeak) +{ + /* debug category for fltering log messages + * + * exchange the string 'Template espeak' with your description + */ + GST_DEBUG_CATEGORY_INIT (gst_espeak_debug, "espeak", + 0, "Template espeak"); + + return gst_element_register (espeak, "espeak", GST_RANK_NONE, + GST_TYPE_ESPEAK); +} + +/* gstreamer looks for this structure to register espeaks + * + * exchange the string 'Template espeak' with your espeak description + */ +GST_PLUGIN_DEFINE ( + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "espeak", + "Template espeak", + espeak_init, + VERSION, + "LGPL", + "GStreamer", + "http://gstreamer.net/" +) diff --git a/src/gstespeak.h b/src/gstespeak.h new file mode 100644 index 0000000..caa7ccc --- /dev/null +++ b/src/gstespeak.h @@ -0,0 +1,86 @@ +/* + * GStreamer + * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org> + * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * Copyright (C) 2009 <<user@hostname.org>> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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. + */ + +#ifndef __GST_ESPEAK_H__ +#define __GST_ESPEAK_H__ + +#include <gst/gst.h> + +G_BEGIN_DECLS + +/* #defines don't like whitespacey bits */ +#define GST_TYPE_ESPEAK \ + (gst_espeak_get_type()) +#define GST_ESPEAK(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ESPEAK,GstEspeak)) +#define GST_ESPEAK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ESPEAK,GstEspeakClass)) +#define GST_IS_ESPEAK(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ESPEAK)) +#define GST_IS_ESPEAK_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ESPEAK)) + +typedef struct _GstEspeak GstEspeak; +typedef struct _GstEspeakClass GstEspeakClass; + +struct _GstEspeak +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + gboolean silent; +}; + +struct _GstEspeakClass +{ + GstElementClass parent_class; +}; + +GType gst_espeak_get_type (void); + +G_END_DECLS + +#endif /* __GST_ESPEAK_H__ */ diff --git a/src/gstplugin.c b/src/gstplugin.c new file mode 100644 index 0000000..443890a --- /dev/null +++ b/src/gstplugin.c @@ -0,0 +1,271 @@ +/* + * GStreamer + * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org> + * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * Copyright (C) YEAR AUTHOR_NAME AUTHOR_EMAIL + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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. + */ + +/** + * SECTION:element-plugin + * + * FIXME:Describe plugin here. + * + * <refsect2> + * <title>Example launch line</title> + * |[ + * gst-launch -v -m fakesrc ! plugin ! fakesink silent=TRUE + * ]| + * </refsect2> + */ + +#ifdef HAVE_CONFIG_H +# include <config.h> +#endif + +#include <gst/gst.h> + +#include "gstplugin.h" + +GST_DEBUG_CATEGORY_STATIC (gst_plugin_template_debug); +#define GST_CAT_DEFAULT gst_plugin_template_debug + +/* Filter signals and args */ +enum +{ + /* FILL ME */ + LAST_SIGNAL +}; + +enum +{ + PROP_0, + PROP_SILENT +}; + +/* the capabilities of the inputs and outputs. + * + * describe the real formats here. + */ +static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") + ); + +static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") + ); + +GST_BOILERPLATE (GstPluginTemplate, gst_plugin_template, GstElement, + GST_TYPE_ELEMENT); + +static void gst_plugin_template_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec); +static void gst_plugin_template_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec); + +static gboolean gst_plugin_template_set_caps (GstPad * pad, GstCaps * caps); +static GstFlowReturn gst_plugin_template_chain (GstPad * pad, GstBuffer * buf); + +/* GObject vmethod implementations */ + +static void +gst_plugin_template_base_init (gpointer gclass) +{ + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + gst_element_class_set_details_simple(element_class, + "Plugin", + "FIXME:Generic", + "FIXME:Generic Template Element", + "AUTHOR_NAME AUTHOR_EMAIL"); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_factory)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_factory)); +} + +/* initialize the plugin's class */ +static void +gst_plugin_template_class_init (GstPluginTemplateClass * klass) +{ + GObjectClass *gobject_class; + GstElementClass *gstelement_class; + + gobject_class = (GObjectClass *) klass; + gstelement_class = (GstElementClass *) klass; + + gobject_class->set_property = gst_plugin_template_set_property; + gobject_class->get_property = gst_plugin_template_get_property; + + g_object_class_install_property (gobject_class, PROP_SILENT, + g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?", + FALSE, G_PARAM_READWRITE)); +} + +/* initialize the new element + * instantiate pads and add them to element + * set pad calback functions + * initialize instance structure + */ +static void +gst_plugin_template_init (GstPluginTemplate * filter, + GstPluginTemplateClass * gclass) +{ + filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink"); + gst_pad_set_setcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_plugin_template_set_caps)); + gst_pad_set_getcaps_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_plugin_template_chain)); + + filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src"); + gst_pad_set_getcaps_function (filter->srcpad, + GST_DEBUG_FUNCPTR(gst_pad_proxy_getcaps)); + + gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad); + gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad); + filter->silent = FALSE; +} + +static void +gst_plugin_template_set_property (GObject * object, guint prop_id, + const GValue * value, GParamSpec * pspec) +{ + GstPluginTemplate *filter = GST_PLUGIN_TEMPLATE (object); + + switch (prop_id) { + case PROP_SILENT: + filter->silent = g_value_get_boolean (value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +static void +gst_plugin_template_get_property (GObject * object, guint prop_id, + GValue * value, GParamSpec * pspec) +{ + GstPluginTemplate *filter = GST_PLUGIN_TEMPLATE (object); + + switch (prop_id) { + case PROP_SILENT: + g_value_set_boolean (value, filter->silent); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); + break; + } +} + +/* GstElement vmethod implementations */ + +/* this function handles the link with other elements */ +static gboolean +gst_plugin_template_set_caps (GstPad * pad, GstCaps * caps) +{ + GstPluginTemplate *filter; + GstPad *otherpad; + + filter = GST_PLUGIN_TEMPLATE (gst_pad_get_parent (pad)); + otherpad = (pad == filter->srcpad) ? filter->sinkpad : filter->srcpad; + gst_object_unref (filter); + + return gst_pad_set_caps (otherpad, caps); +} + +/* chain function + * this function does the actual processing + */ +static GstFlowReturn +gst_plugin_template_chain (GstPad * pad, GstBuffer * buf) +{ + GstPluginTemplate *filter; + + filter = GST_PLUGIN_TEMPLATE (GST_OBJECT_PARENT (pad)); + + if (filter->silent == FALSE) + g_print ("I'm plugged, therefore I'm in.\n"); + + /* just push out the incoming buffer without touching it */ + return gst_pad_push (filter->srcpad, buf); +} + + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and other features + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + /* debug category for fltering log messages + * + * exchange the string 'Template plugin' with your description + */ + GST_DEBUG_CATEGORY_INIT (gst_plugin_template_debug, "plugin", + 0, "Template plugin"); + + return gst_element_register (plugin, "plugin", GST_RANK_NONE, + GST_TYPE_PLUGIN_TEMPLATE); +} + +/* gstreamer looks for this structure to register plugins + * + * exchange the string 'Template plugin' with your plugin description + */ +GST_PLUGIN_DEFINE ( + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "plugin", + "Template plugin", + plugin_init, + VERSION, + "LGPL", + "GStreamer", + "http://gstreamer.net/" +) diff --git a/src/gstplugin.h b/src/gstplugin.h new file mode 100644 index 0000000..f1fe4ed --- /dev/null +++ b/src/gstplugin.h @@ -0,0 +1,86 @@ +/* + * GStreamer + * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org> + * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net> + * Copyright (C) YEAR AUTHOR_NAME AUTHOR_EMAIL + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + * DEALINGS IN THE SOFTWARE. + * + * Alternatively, the contents of this file may be used under the + * GNU Lesser General Public License Version 2.1 (the "LGPL"), in + * which case the following provisions apply instead of the ones + * mentioned above: + * + * 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. + */ + +#ifndef __GST_PLUGIN_TEMPLATE_H__ +#define __GST_PLUGIN_TEMPLATE_H__ + +#include <gst/gst.h> + +G_BEGIN_DECLS + +/* #defines don't like whitespacey bits */ +#define GST_TYPE_PLUGIN_TEMPLATE \ + (gst_plugin_template_get_type()) +#define GST_PLUGIN_TEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLUGIN_TEMPLATE,GstPluginTemplate)) +#define GST_PLUGIN_TEMPLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLUGIN_TEMPLATE,GstPluginTemplateClass)) +#define GST_IS_PLUGIN_TEMPLATE(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLUGIN_TEMPLATE)) +#define GST_IS_PLUGIN_TEMPLATE_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLUGIN_TEMPLATE)) + +typedef struct _GstPluginTemplate GstPluginTemplate; +typedef struct _GstPluginTemplateClass GstPluginTemplateClass; + +struct _GstPluginTemplate +{ + GstElement element; + + GstPad *sinkpad, *srcpad; + + gboolean silent; +}; + +struct _GstPluginTemplateClass +{ + GstElementClass parent_class; +}; + +GType gst_plugin_template_get_type (void); + +G_END_DECLS + +#endif /* __GST_PLUGIN_TEMPLATE_H__ */ diff --git a/tools/make_element b/tools/make_element new file mode 100755 index 0000000..af59cb4 --- /dev/null +++ b/tools/make_element @@ -0,0 +1,80 @@ +#!/bin/sh + +Template=$1; +srcfile=$2.c; +srcfile_h=$2.h; + +if test x"$1" = x ; then + echo "$0 Objectname [srcfile]\n"; + echo " creates gstobjectname.{c,h} implementing GstObjectname\n"; + exit 1; +fi + +if test x"$2" = x ; then + srcfile="gstplugin.c" + srcfile_h="gstplugin.h" +fi + +id=$(echo '$Id: make_element,v 1.8 2008-10-30 08:42:21 ensonic Exp $' | sed \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + ) + +TEMPLATE=$(echo $Template | tr a-z A-Z) +template=$(echo $Template | tr A-Z a-z) +filename=$(echo $template | tr -d _) +Template=$(echo $Template | tr -d _) +template_=$(echo $Template | sed "s/\([a-z]\)\([A-Z]\)/\1_\2/g" | tr A-Z a-z) + +YEAR=`date "+%Y"` +if [ -z "$REAL_NAME" ]; then + user=`id -u` + if [ `which 2>/dev/null getent` ]; then + entry=`getent passwd $user` + else + entry=`grep $user /etc/passwd` + fi + REAL_NAME=`echo $entry | awk -F":" '{ print $5 }' | awk -F"," '{ print $1 }'` +fi +if [ -z "$EMAIL_ADDRESS" ]; then + EMAIL_ADDRESS="<user@hostname.org>" +fi + +# remember to break up the Id: in the line below +sed \ + -e 's/gstplugin\.c/SOURCEFILE/g' \ + -e "s/gstplugin\.h/gst$filename.h/g" \ + -e "s/GstPluginTemplate/Gst$Template/g" \ + -e "s/gst_plugin_template/gst_$template_/g" \ + -e "s/gst_type_plugin_template/gst_$template_/g" \ + -e "s/GST_PLUGIN_TEMPLATE/GST_$TEMPLATE/g" \ + -e "s/GST_TYPE_PLUGIN_TEMPLATE/GST_TYPE_$TEMPLATE/g" \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + -e 's/SOURCEFILE/gstobject\.c/g' \ + -e "s%MAKEFILTERVERSION%$id%g" \ + -e "s/plugin/$template/g" \ + -e "s/\([^G][^s][^t]\)Plugin/\1$Template/g" \ + -e "s/YEAR/$YEAR/g" \ + -e "s/AUTHOR_NAME/$REAL_NAME/g" \ + -e "s/AUTHOR_EMAIL/<$EMAIL_ADDRESS>/g" \ + $srcfile >gst$filename.c.tmp && mv gst$filename.c.tmp gst$filename.c + +if [ -e $srcfile_h ]; then + sed \ + -e 's/gstplugin\.c/SOURCEFILE/g' \ + -e "s/GstPluginTemplate/Gst$Template/g" \ + -e "s/gst_plugin_template/gst_$template_/g" \ + -e "s/gst_type_plugin_template/gst_$template_/g" \ + -e "s/GST_PLUGIN_TEMPLATE/GST_$TEMPLATE/g" \ + -e "s/GST_TYPE_PLUGIN_TEMPLATE/GST_TYPE_$TEMPLATE/g" \ + -e "s/GST_IS_PLUGIN_TEMPLATE/GST_IS_$TEMPLATE/g" \ + -e 's/\$I[d]: \([^$]*\)\$/\1/g' \ + -e 's/SOURCEFILE/gstobject\.c/g' \ + -e "s%MAKEFILTERVERSION%$id%g" \ + -e "s/plugin/$template/g" \ + -e "s/\([^G][^s][^t]\)Plugin/\1$Template/g" \ + -e "s/YEAR/$YEAR/g" \ + -e "s/AUTHOR_NAME/$REAL_NAME/g" \ + -e "s/AUTHOR_EMAIL/<$EMAIL_ADDRESS>/g" \ + $srcfile_h >gst$filename.h.tmp && mv gst$filename.h.tmp gst$filename.h +fi + |