From 83742b7edf0e6f70673f8a6978c242dd196871d4 Mon Sep 17 00:00:00 2001 From: Rov Juvano Date: Tue, 20 May 2008 13:51:57 -0400 Subject: [PATCH] initial import from CVS gstreamer/gst-template/gst-plugin --- AUTHORS | 1 + COPYING | 2 + ChangeLog | 172 +++++++++++++++++++++++++++ Makefile.am | 3 + NEWS | 1 + README | 12 ++ autogen.sh | 91 +++++++++++++++ configure.ac | 131 +++++++++++++++++++++ gst-autogen.sh | 308 +++++++++++++++++++++++++++++++++++++++++++++++++ m4/Makefile.am | 1 + m4/as-compiler-flag.m4 | 25 ++++ m4/as-version.m4 | 66 +++++++++++ src/Makefile.am | 26 +++++ src/gstplugin.c | 267 ++++++++++++++++++++++++++++++++++++++++++ src/gstplugin.h | 85 ++++++++++++++ src/gsttransform.c | 214 ++++++++++++++++++++++++++++++++++ src/gsttransform.h | 57 +++++++++ tools/make_element | 53 +++++++++ 18 files changed, 1515 insertions(+) create mode 100644 AUTHORS create mode 100644 COPYING create mode 100644 ChangeLog create mode 100644 Makefile.am create mode 100644 NEWS create mode 100644 README create mode 100755 autogen.sh create mode 100644 configure.ac create mode 100644 gst-autogen.sh create mode 100644 m4/Makefile.am create mode 100644 m4/as-compiler-flag.m4 create mode 100644 m4/as-version.m4 create mode 100644 src/Makefile.am create mode 100644 src/gstplugin.c create mode 100644 src/gstplugin.h create mode 100644 src/gsttransform.c create mode 100644 src/gsttransform.h create mode 100755 tools/make_element diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..1bb7449 --- /dev/null +++ b/AUTHORS @@ -0,0 +1 @@ +Thomas Vander Stichele diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..09ec995 --- /dev/null +++ b/COPYING @@ -0,0 +1,2 @@ +Put your license in here! + diff --git a/ChangeLog b/ChangeLog new file mode 100644 index 0000000..832f699 --- /dev/null +++ b/ChangeLog @@ -0,0 +1,172 @@ +2007-08-01 Tim-Philipp Müller + + * src/gsttransform.c: + Include right header to avoid structure size mismatches etc. + +2007-07-25 Tim-Philipp Müller + + Patch by: Steve Fink + + * src/gstplugin.c: + Use GST_DEBUG_FUNCPTR() macros where it makes sense. + +2007-07-19 Stefan Kost + + * configure.ac: + Fix CVS-build detection. + +2007-01-23 Tim-Philipp Müller + + * 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 + + Patch by: Philip Jägenstedt + + * tools/make_element: + Translate FOO_IS_MY_PLUGIN macro as well according to the template + (#399323). + +2006-07-04 Tim-Philipp Müller + + * autogen.sh: + Run autoheader to create config.h.in and fix the build.` + +2006-07-03 Tim-Philipp Müller + + * 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 + + Patch by: Philip Jägenstedt + + * 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 + + Patch by: Johan Rydberg + + * 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 + + * 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 + + * 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 + + * 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 + + * src/gstplugin.h: + FOO_BAR_CLASS(klass) should cast to FooBarClass*, + not FooBar*. + +2006-01-13 Thomas Vander Stichele + + * autogen.sh: + * configure.ac: + * src/Makefile.am: + * src/gstplugin.c: + bring into the 0.10 world + Fix #315582 + +2005-12-16 Jan Schmidt + + * 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 + + * src/gstplugin.h: + Fix GST_IS_FOO_BAR_CLASS macro. + +2005-06-30 Ronald S. Bultje + + * 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 + + * 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 + + * configure.ac: ... and fix comments too + +2004-04-03 Benjamin Otte + + * configure.ac: + update for GStreamer 0.8 + +2004-01-25 Ronald Bultje + + * 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 + + * updated for GStreamer 0.6.0 + +2002-07-17 Thomas Vander Stichele + + * 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 diff --git a/NEWS b/NEWS new file mode 100644 index 0000000..3474a99 --- /dev/null +++ b/NEWS @@ -0,0 +1 @@ +Nothing much yet. diff --git a/README b/README new file mode 100644 index 0000000..e800f09 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +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 might get added to this template later on. 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..c5c6885 --- /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 + +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..ddf3180 --- /dev/null +++ b/src/Makefile.am @@ -0,0 +1,26 @@ +# 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) + +# headers we need but don't want installed +noinst_HEADERS = gstplugin.h diff --git a/src/gstplugin.c b/src/gstplugin.c new file mode 100644 index 0000000..9bc4e07 --- /dev/null +++ b/src/gstplugin.c @@ -0,0 +1,267 @@ +/* + * GStreamer + * Copyright 2005 Thomas Vander Stichele + * Copyright 2005 Ronald S. Bultje + * + * 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 + * + * + * Example launch line + * + * + * gst-launch -v -m audiotestsrc ! plugin ! fakesink silent=TRUE + * + * + * + */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#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 +{ + ARG_0, + ARG_SILENT +}; + +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); + +static void +gst_plugin_template_base_init (gpointer gclass) +{ + static GstElementDetails element_details = { + "PluginTemplate", + "Generic/PluginTemplate", + "Generic Template Element", + "Thomas Vander Stichele " + }; + GstElementClass *element_class = GST_ELEMENT_CLASS (gclass); + + 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)); + gst_element_class_set_details (element_class, &element_details); +} + +/* 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, ARG_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 functions + * initialize structure + */ +static void +gst_plugin_template_init (GstPluginTemplate * filter, + GstPluginTemplateClass * gclass) +{ + GstElementClass *klass = GST_ELEMENT_GET_CLASS (filter); + + filter->sinkpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "sink"), "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)); + + filter->srcpad = + gst_pad_new_from_template (gst_element_class_get_pad_template (klass, + "src"), "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); + gst_pad_set_chain_function (filter->sinkpad, + GST_DEBUG_FUNCPTR(gst_plugin_template_chain)); + 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 ARG_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 ARG_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; + + return gst_pad_set_caps (pad, 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 pad templates + * register the features + * + * exchange the string 'plugin' with your elemnt name + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + /* exchange the strings 'plugin' and 'Template plugin' with your + * plugin name and description */ + GST_DEBUG_CATEGORY_INIT (gst_plugin_template_debug, "plugin", + 0, "Template plugin"); + + return gst_element_register (plugin, "myelement", + GST_RANK_NONE, GST_TYPE_PLUGIN_TEMPLATE); +} + +/* this is the structure that gstreamer looks for to register plugins + * + * exchange the strings 'plugin' and 'Template plugin' with you plugin name and + * 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..1bcdb90 --- /dev/null +++ b/src/gstplugin.h @@ -0,0 +1,85 @@ +/* + * GStreamer + * Copyright 2005 Thomas Vander Stichele + * Copyright 2005 Ronald S. Bultje + * + * 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 + +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/src/gsttransform.c b/src/gsttransform.c new file mode 100644 index 0000000..4cfcb8d --- /dev/null +++ b/src/gsttransform.c @@ -0,0 +1,214 @@ +/* + * GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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 + * + * + * Example launch line + * + * + * gst-launch -v -m audiotestsrc ! plugin ! fakesink silent=TRUE + * + * + * + */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "gsttransform.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, +}; + +static GstStaticPadTemplate sink_template = +GST_STATIC_PAD_TEMPLATE ( + "sink", + GST_PAD_SINK, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") +); + +static GstStaticPadTemplate src_template = +GST_STATIC_PAD_TEMPLATE ( + "src", + GST_PAD_SRC, + GST_PAD_ALWAYS, + GST_STATIC_CAPS ("ANY") +); + +#define DEBUG_INIT(bla) \ + GST_DEBUG_CATEGORY_INIT (gst_plugin_template_debug, "plugin_template", 0, "transformer template plugin"); + +GST_BOILERPLATE_FULL (GstPluginTemplate, gst_plugin_template, GstBaseTransform, + GST_TYPE_BASE_TRANSFORM, DEBUG_INIT); + +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 GstFlowReturn gst_plugin_template_transform_ip (GstBaseTransform * base, + GstBuffer * outbuf); + +/* GObject vmethod implementations */ + +static void +gst_plugin_template_base_init (gpointer klass) +{ + static GstElementDetails element_details = { + "PluginTemplate", + "Generic/PluginTemplate", + "Generic Template Element", + "Stefan Kost " + }; + GstElementClass *element_class = GST_ELEMENT_CLASS (klass); + + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&src_template)); + gst_element_class_add_pad_template (element_class, + gst_static_pad_template_get (&sink_template)); + gst_element_class_set_details (element_class, &element_details); +} + +static void +gst_plugin_template_class_init (GstPluginTemplateClass * klass) +{ + GObjectClass *gobject_class; + + gobject_class = (GObjectClass *) 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 | GST_PARAM_CONTROLLABLE)); + + GST_BASE_TRANSFORM_CLASS (klass)->transform_ip = + GST_DEBUG_FUNCPTR (gst_plugin_template_transform_ip); +} + +static void +gst_plugin_template_init (GstPluginTemplate *filter, GstPluginTemplateClass * klass) +{ + 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; + } +} + +/* GstBaseTransform vmethod implementations */ + +/* this function does the actual processing + */ +static GstFlowReturn +gst_plugin_template_transform_ip (GstBaseTransform * base, GstBuffer * outbuf) +{ + GstPluginTemplate *filter = GST_PLUGIN_TEMPLATE (base); + + if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_TIMESTAMP (outbuf))) + gst_object_sync_values (G_OBJECT (filter), GST_BUFFER_TIMESTAMP (outbuf)); + + if (filter->silent == FALSE) + g_print ("I'm plugged, therefore I'm in.\n"); + + return GST_FLOW_OK; +} + + +/* entry point to initialize the plug-in + * initialize the plug-in itself + * register the element factories and pad templates + * register the features + * + * exchange the string 'plugin' with your elemnt name + */ +static gboolean +plugin_init (GstPlugin * plugin) +{ + /* initialize gst controller library */ + gst_controller_init(NULL, NULL); + + return gst_element_register (plugin, "plugin", GST_RANK_NONE, + GST_TYPE_PLUGIN_TEMPLATE); +} + +/* this is the structure that gstreamer looks for to register plugins + * + * exchange the strings 'plugin' and 'Template plugin' with you plugin name and + * description + */ +GST_PLUGIN_DEFINE ( + GST_VERSION_MAJOR, + GST_VERSION_MINOR, + "plugin", + "Generic Template Plugin", + plugin_init, + VERSION, + "LGPL", + "GStreamer", + "http://gstreamer.net/" +) diff --git a/src/gsttransform.h b/src/gsttransform.h new file mode 100644 index 0000000..cdbfbf7 --- /dev/null +++ b/src/gsttransform.h @@ -0,0 +1,57 @@ +/* + * GStreamer + * Copyright (C) 2006 Stefan Kost + * + * 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 +#include + +G_BEGIN_DECLS + +#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 { + GstBaseTransform element; + + gboolean silent; +}; + +struct _GstPluginTemplateClass { + GstBaseTransformClass 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..434c1b1 --- /dev/null +++ b/tools/make_element @@ -0,0 +1,53 @@ +#!/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.4 2007-01-22 12:16:02 tpm 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 _) + +# 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" \ + $srcfile >gst$filename.c.tmp && mv gst$filename.c.tmp gst$filename.c + +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" \ + $srcfile_h >gst$filename.h.tmp && mv gst$filename.h.tmp gst$filename.h + -- 2.11.4.GIT