From: <en...@fr...> - 2005-04-01 15:12:31
|
CVS Root: /cvs/gstreamer Module: gst-sandbox Changes by: ensonic Date: Fri Apr 01 2005 07:12:10 PST Log message: initial version - does absolutly noting useful yet Added files: gst-controller : AUTHORS ChangeLog Makefile.am NEWS README autogen.sh gst-controller/src: gst-controller.c gst-controller.h gstreamer-controller.pc.in Links: http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/AUTHORS?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/ChangeLog?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/Makefile.am?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/NEWS?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/README?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/autogen.sh?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-controller.c?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gst-controller.h?rev=1.1&content-type=text/vnd.viewcvs-markup http://freedesktop.org/cgi-bin/viewcvs.cgi/gstreamer/gst-sandbox/gst-controller/src/gstreamer-controller.pc.in?rev=1.1&content-type=text/vnd.viewcvs-markup ====Begin Diffs==== --- NEW FILE: AUTHORS --- Original Authors ---------------- Stefan Kost <en...@us...> Edward Hervey <bi...@gm...> --- NEW FILE: ChangeLog --- 2005-04-01 Stefan Kost <en...@us...> * AUTHORS: * Makefile.am: * README: * autogen.sh: * src/gst-controller.c: * src/gst-controller.h: * src/gstreamer-controller.pc.in: initial version - does absolutly noting useful yet --- NEW FILE: Makefile.am --- ## $Id: Makefile.am,v 1.1 2005/04/01 15:11:58 ensonic Exp $ SUBDIRS = src --- NEW FILE: NEWS --- --- NEW FILE: README --- $Id: README,v 1.1 2005/04/01 15:11:58 ensonic Exp $ New dynamic properties. This library is planned as a successor of the current dparams module (gstreamer/libs/control/). --- NEW FILE: autogen.sh --- #!/bin/sh # $Id: autogen.sh,v 1.1 2005/04/01 15:11:58 ensonic Exp $ # Run this to generate all the initial makefiles, etc. DIE=0 package=gst-controller # a silly hack that generates autoregen.sh but it's handy 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 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" fi fi fi if test ! -z "$WRONG"; then echo "found $pkg_version, not ok !" else echo "found $pkg_version, ok." 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" if [ ! -x `which $aclocal` ]; then echo "Error: cannot execute $aclocal !" return 1 autoheader_check () # same here - autoheader is part of autoconf # use the same voodoo if [ -z "$autoconf" ]; then echo "Error: no autoconf variable set !" autoheader=`echo $autoconf | sed s/autoconf/autoheader/` debug "autoheader: $autoheader" if [ "$autoheader" != "autoheader" ]; CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader" if [ ! -x `which $autoheader` ]; then echo "Error: cannot execute $autoheader !" 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 } 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"; echo echo "- Please get the right tools before proceeding." echo "- Alternatively, if you're sure we're wrong, run with --nocheck." exit 1 autogen_options () if test "x$1" = "x"; then return 0 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" --debug) DEBUG=defined AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug" echo "+ debug output enabled" --prefix=*) CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$optarg" echo "+ passing --prefix=$optarg to configure" --prefix) shift echo "DEBUG: $1" CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$1" echo "+ passing --prefix=$1 to configure" -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 "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" --with-autoconf=*) AUTOCONF=$optarg echo "+ using alternate autoconf in $optarg" CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF" --disable*|--enable*|--with*) echo "+ passing option $1 to configure" CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1" --) shift ; break ;; *) echo "- ignoring unknown autogen.sh argument $1"; shift ;; esac for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done if test ! -z "$CONFIGURE_EXT_OPT" echo "+ options passed to configure: $CONFIGURE_EXT_OPT" 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 echo "+ running $tool $options..." $tool $options || { echo $tool failed CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-compile-warnings --enable-debug=yes' autogen_options $@ echo -n "+ check for build tools" if test ! -z "$NOCHECK"; then echo ": skipped version checks"; else echo; fi version_check "autoconf" "$AUTOCONF autoconf 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.7 automake17 automake-1.6" \ "ftp://ftp.gnu.org/pub/gnu/automake/" 1 6 || DIE=1 version_check "autopoint" "autopoint" \ "ftp://ftp.gnu.org/pub/gnu/gettext/" 0 12 1 || DIE=1 version_check "intltoolize" "" \ "ftp://ftp.gnome.org/pub/GNOME/stable/sources/intltool" 0 1 5 || DIE=1 version_check "libtoolize" "libtoolize" \ "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 # 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 toplevel_check $srcfile # autopoint # older autopoint (< 0.12) has a tendency to complain about mkinstalldirs #if test -x mkinstalldirs; then rm mkinstalldirs; fi #tool_run "$autopoint --force" # aclocal if test -f acinclude.m4; then rm acinclude.m4; fi tool_run "$aclocal" "$ACLOCAL_FLAGS" #tool_run "$intltoolize" "--copy --force --automake" tool_run "$libtoolize" "--copy --force" tool_run "$autoheader" # touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo echo timestamp > stamp-h.in 2> /dev/null tool_run "$autoconf" debug "automake: $automake" tool_run "$automake" "--add-missing --copy --gnu" 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" echo echo ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT || { echo " configure failed" echo "Now type 'make' to compile $package." --- NEW FILE: gst-controller.c --- /* * gst-controller.c * * New dynamic properties * */ #include "config.h" #include "gst-controller.h" #define GST_CAT_DEFAULT gst_controller_debug GST_DEBUG_CATEGORY (GST_CAT_DEFAULT); /* methods */ GstController *gst_controller_new (GObject * object, gchar * first_property_name, ...) return(NULL); /* initialisation */ static gboolean plugin_init (GstPlugin * plugin) GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "gstcontroller", 0, "dynamic parameter control for gstreamer elements"); return TRUE; GST_PLUGIN_DEFINE (GST_CONTROLLER_MAJOR_VERSION, GST_CONTROLLER_MINOR_VERSION, "gstcontroller", "dynamic parameter control for gstreamer elements", plugin_init, VERSION, GST_CONTROLLER_LICENSE, PACKAGE_NAME, GST_CONTROLLER_ORIGIN ) --- NEW FILE: gst-controller.h --- * gst-controller.h * TODO : Write what has to be done plugin-side and application-side in order to * use GstController. #ifndef __GST_CONTROLLER_H__ #define __GST_CONTROLLER_H__ #include <glib-object.h> #include <gst/gst.h> G_BEGIN_DECLS /** * GST_PARAM_CONTROLLABLE: * Use this flag on GstElement properties you wish to be (eventually) handled * by a GstController. * TODO: needs to go to gstelemnt.h (to avoid clashes on G_PARAM_USER_SHIFT) #define GST_PARAM_CONTROLLABLE 1 << (G_PARAM_USER_SHIFT + 1) * GstTimedValue: * a structure for value+time typedef struct _GstTimedValue GstClockTime time; GValue *value; } GstTimedValue; * GstValueArray: * Structure to receive multiple values at a time typedef struct _GstValueArray gchar *property_name; gint nbsamples; // Number of samples requested gint64 sample_interval; // Interval between each sample gpointer *values; // pointer to the array (so it can be filled if NULL) } GstValueArray; * GstInterpolateMode: * The various interpolation modes available typedef enum /* None : steps-like interpolation, default */ GST_INTERPOLATE_NONE, Trigger : Returns the default value of the property, except for times with specific values GST_INTERPOLATE_TRIGGER, Linear : linear interpolation GST_INTERPOLATE_LINEAR, Quadratic : square interpolation GST_INTERPOLATE_QUADRATIC, Cubic : cubic interpolation GST_INTERPOLATE_CUBIC, User : user-provided interpolation GST_INTERPOLATE_USER } GstInterpolateMode; * GstInterpolateMethod: * Function pointer structure to do user-defined interpolation methods struct _GstControlledProperty; typedef struct _GstInterpolateMethod GValue * (* get) (struct _GstControlledProperty *prop, GstClockTime time); gboolean (* get_value_array) (struct _GstControlledProperty *prop, GstClockTime timestamp, GstValueArray *value_array); } GstInterpolateMethod; * GstController: * The instance structure of GstController typedef struct _GstController GObject parent; GList *properties; // List of GstControlledProperty GMutex *lock; } GstController; * GstControlledProperty: typedef struct _GstControlledProperty gchar *name; // name of the property GType parent_type; // type of the GObject element to which the property belongs GType type; // type of the handled property GValue default_value; // default value for the handled property GstInterpolateMode interpolation; // Interpolation mode GstInterpolateMethod *method; // User-implemented handler (if interpolation == GST_INTERPOLATE_USER) GSList *values; // List of GstTimedValue } GstControlledProperty; gst_controller_new Creates a new GstController for the given object's properties */ GstController *gst_controller_new (GObject * object, gchar * first_property_name, ...); gst_controller_remove_properties Removes the given object properties from the controller Returns : FALSE if one of the given property isn't handled by the controller, TRUE otherwise gboolean gst_controller_remove_properties (GstController * controller, GObject * object, gchar * first_property_name, ...); gst_controller_set* Functions used to set the values of given controller-handled properties Returns FALSE if the values couldn't be set (ex : properties not handled by controller), TRUE otherwise gboolean gst_controller_set (GstController * controller, gchar * property_name, GstClockTime time, GValue * value); gboolean gst_controller_set_many (GstController * controller, gchar * property_name, GSList * timedvalues); gst_controller_get Returns : the GValue of the property at the given time, or NULL if the property isn't handled by the controller GValue *gst_controller_get (GstController * controller, gchar * property_name, GstClockTime time); gst_controller_get_all Returns : The list of GstTimedValue for the given property, or NULL if the property isn't handled by the controller const GSList *gst_controller_get_all (GstController * controller, gchar * property_name); gst_controller_sink_values Sets the properties of the element, according to the controller that (maybe) handles them and for the given timestamp. Returns : TRUE if the controller values could be applied to the object properties, FALSE otherwise gboolean gst_controller_sink_values (GstController * controller, GObject * object, GstClockTime timestamp); gst_*_get_value_array[s] Functions to be able to get an array of values for one or more given element properties If the GstValueArray->values array is NULL, it will be created by the function. The type of the values in the array are the same as the property's type. the gst_element_* functions are just convenience functions for GstElement Returns : TRUE if the given array(s) could be filled, FALSE otherwise gboolean gst_controller_get_value_arrays (GstController * controller, gint64 timestamp, GSList * value_arrays); gboolean gst_controller_get_value_array (GstController * controller, gint64 timestamp, GstValueArray * value_array); gst_controller_set_interpolation_mode controller : property_name : mode : interpolation mode Sets the given interpolation mode on the given property. Returns : TRUE if the property is handled by the controller, FALSE otherwise gboolean gst_controller_set_interpolation_mode (GstController * controller, gchar * property_name, GstInterpolateMode mode); ** ** GstElement convenience functions **/ gst_element_control_properties Convenience function for GstElement Creates a GstController that allows you to dynamically control one, or more, GstElement properties. If the given GstElement already has a GstController, it adds the given properties to the existing controller and returns that controller. Returns : The GstController with which the user can control the given properties dynamically or NULL if one or more of the given properties aren't available, or cannot be controlled, for the given element. GstController *gst_element_control_properties (GstElement * element, gchar * first_property_name, ...); gst_element_uncontrol_properties Removes the given element's properties from it's controller Returns : FALSE if one of the given property names isn't handled by the controller, TRUE otherwise gboolean gst_element_uncontrol_properties (GstElement * element, gst_element_get_controller element : Returns : the controller handling some of the given element's properties, NULL if no controller GstController *gst_element_get_controller (GstElement * element); gst_element_set_controller Sets the controller on the given GstElement Returns : FALSE if the GstElement already has an controller, TRUE otherwise gboolean gst_element_set_controller (GstElement * element, GstController * controller); gst_element_sink_values convenience macro for GstElement Returns : same thing as gst_controller_sink_values #define gst_element_sink_values(element, timestamp) \ ((element)->controller) ? \ gst_controller_sink_values ((element)->controller, G_OBJECT(element), timestamp) :\ TRUE; gboolean gst_element_get_value_arrays (GstElement * element, gint64 timestamp, GSList * value_arrays); gboolean gst_element_get_value_array (GstElement * element, gint64 timestamp, GstValueArray * value_array); G_END_DECLS #endif /* __GST_CONTROLLER_H__ */ --- NEW FILE: gstreamer-controller.pc.in --- prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ includedir=@includedir@/gstreamer-@GST_MAJORMINOR@ Name: GStreamer Controller Version: @PACKAGE_VERSION@ Description: libgstcontroller, dynamic parameter control for gstreamer elements Requires: gstreamer-@GST_MAJORMINOR@ Libs: -L${libdir} @GST_LIBS@ -lgstcontroller Cflags: -I${includedir} |