Merge with the main trunk.

Original commit message from CVS:
Merge with the main trunk.
GstPlay needed some changes for the dynamic pads in the avidecoder since
the new autoplugger doesn't know about the outher elements. The next
version of the autoplugger will also handle the audfio/videosink connections
and will do a complete end-to-end autoplugging.
This commit is contained in:
Wim Taymans 2001-03-01 22:36:26 +00:00
parent 81197b7c06
commit 90ac5da6d6
149 changed files with 11324 additions and 8045 deletions

View file

@ -8,10 +8,17 @@ else
SUBDIRS_LGG =
endif
SUBDIRS = include gst libs plugins tools test tests examples $(SUBDIRS_LGG) docs
if BUILD_DOCS
SUBDIRS_DOCS = docs
else
SUBDIRS_DOCS =
endif
SUBDIRS = include gst libs plugins tools test tests examples \
$(SUBDIRS_LGG) $(SUBDIRS_DOCS)
# These are all the possible subdirs
DIST_SUBDIRS = intl po include gst libs plugins tools test tests examples gstplay editor docs
DIST_SUBDIRS = include gst libs plugins tools test tests examples gstplay editor docs debian
bin_SCRIPTS = gstreamer-config
@ -19,7 +26,7 @@ bin_SCRIPTS = gstreamer-config
m4datadir = $(datadir)/aclocal
m4data_DATA = gstreamer.m4
EXTRA_DIST = gstreamer.spec.in gstreamer-config.in gstreamer.m4 LICENSE REQUIREMENTS ABOUT-NLS
EXTRA_DIST = gstreamer.spec.in gstreamer-config.in gstreamer.m4 LICENSE REQUIREMENTS
dist-hook:
cp gstreamer.spec $(distdir)

View file

@ -7,7 +7,7 @@ AM_CONFIG_HEADER(config.h)
dnl FIXME this should be GSTREAMER_ now
STREAMER_MAJOR_VERSION=0
STREAMER_MINOR_VERSION=1
STREAMER_MICRO_VERSION=0
STREAMER_MICRO_VERSION=1
STREAMER_VERSION=$STREAMER_MAJOR_VERSION.$STREAMER_MINOR_VERSION.$STREAMER_MICRO_VERSION
PACKAGE=gstreamer
@ -41,20 +41,23 @@ AC_SUBST(GSTREAMER_LIBVERSION)
AM_MAINTAINER_MODE
AC_ISC_POSIX
AC_PROG_CC
AC_ISC_POSIX
AC_STDC_HEADERS
AC_ARG_PROGRAM
dnl We disable static building for development, for time savings
dnl *NOTE*: dnl this line before release, so release does static too
AM_DISABLE_STATIC
AC_LIBTOOL_DLOPEN
AM_PROG_LIBTOOL
dnl ALL_LINGUAS=""
dnl AM_GNU_GETTEXT
CFLAGS=""
dnl This is used for the -config script...
builddir=`pwd`
AC_SUBST(builddir)
dnl ##############################
dnl # Do automated configuration #
dnl ##############################
@ -156,16 +159,16 @@ AM_PATH_GLIB(1.2.0,,
AC_MSG_ERROR(Cannot find glib: Is glib-config in path?),
glib gmodule gthread)
dnl Put the glib flags into $LIBS and $CFLAGS since we always use them
LIBS="$LIBS $GLIB_LIBS"
CFLAGS="$CFLAGS $GLIB_CFLAGS"
CORE_LIBS="$GLIB_LIBS"
CORE_CFLAGS="$GLIB_CFLAGS"
dnl Check for gtk
AM_PATH_GTK(1.2.0,,
AC_MSG_ERROR(Cannot find gtk: Is gtk-config in path?))
dnl Put the gtk flags into $LIBS and $CFLAGS since we always use them
LIBS="$LIBS $GTK_LIBS"
CFLAGS="$CFLAGS $GTK_CFLAGS"
CORE_LIBS="$CORE_LIBS $GTK_LIBS"
CORE_CFLAGS="$CORE_CFLAGS $GTK_CFLAGS"
dnl Check for libxml
@ -177,8 +180,8 @@ XML_LIBS=`xml-config --libs`
XML_CFLAGS=`xml-config --cflags`
AC_SUBST(XML_LIBS)
AC_SUBST(XML_CFLAGS)
LIBS="$LIBS $XML_LIBS"
CFLAGS="$CFLAGS $XML_CFLAGS"
CORE_LIBS="$CORE_LIBS $XML_LIBS"
CORE_CFLAGS="$CORE_CFLAGS $XML_CFLAGS"
dnl Next, check for the optional libraries:
@ -257,8 +260,8 @@ else
LIBGLADE_GNOME_CFLAGS=`libglade-config --cflags gnome`
libglade_save_CFLAGS="$CFLAGS"
libglade_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $LIBGLADE_GNOME_CFLAGS"
LIBS="$LIBS $LIBGLADE_GNOME_LIBS"
CFLAGS="$CFLAGS $LIBGLADE_GNOME_CFLAGS $GTK_CFLAGS"
LIBS="$LIBS $LIBGLADE_GNOME_LIBS $GTK_LIBS"
HAVE_LIBGLADE_GNOME="no"
AC_TRY_LINK([#include <glade/glade.h>],[glade_gnome_init();],
HAVE_LIBGLADE_GNOME="yes",
@ -348,7 +351,7 @@ AC_CHECK_HEADER(cdda_paranoia.h, :, HAVE_CDPARANOIA=no)
dnl Check for liblame
AC_MSG_CHECKING(LAME library)
AC_CHECK_LIB(mp3lame, lame_init, HAVE_LIBLAME=yes, HAVE_LIBLAME=no, )
AC_CHECK_HEADER(lame.h, :, HAVE_LIBLAME=no)
AC_CHECK_HEADER(lame/lame.h, :, HAVE_LIBLAME=no)
dnl Check for libshout
AC_MSG_CHECKING(Shout library)
@ -487,6 +490,16 @@ AC_ARG_WITH(win32_libdir,
esac],
[:]) dnl Default value
AC_ARG_ENABLE(docs-build,
[ --enable-docs-build enable the building of the documentation],
[case "${enableval}" in
yes) BUILD_DOCS=yes ;;
no) BUILD_DOCS=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-docs-build) ;;
esac],
[BUILD_DOCS=no]) dnl Default value
dnl ################################################
dnl # Set defines according to variables set above #
@ -564,6 +577,7 @@ AM_CONDITIONAL(HAVE_LIBGLADE_GNOME, test "x$HAVE_LIBGLADE_GNOME" = "xyes")
AM_CONDITIONAL(HAVE_GNOME, test "x$HAVE_GNOME" = "xyes")
AM_CONDITIONAL(HAVE_LIBXV, test "x$HAVE_LIBXV" = "xyes")
AM_CONDITIONAL(HAVE_GTK_DOC, $HAVE_GTK_DOC)
AM_CONDITIONAL(BUILD_DOCS, test "x$BUILD_DOCS" = "xyes")
AM_CONDITIONAL(HAVE_DB2HTML, $HAVE_DB2HTML)
AM_CONDITIONAL(HAVE_DB2PS, $HAVE_DB2PS)
AM_CONDITIONAL(HAVE_PS2PDF, $HAVE_PS2PDF)
@ -609,7 +623,10 @@ dnl ##############################
dnl # Set up the defaults cflags #
dnl ##############################
dnl CC="kgcc"
CFLAGS="$CFLAGS -O6 -Wall"
CFLAGS="$CORE_CFLAGS $CFLAGS -O6 -Wall"
LIBS="$CORE_LIBS $LIBS"
AC_SUBST(CORE_LIBS)
AC_SUBST(CORE_CFLAGS)
dnl FIXME: having to AC_SUBST these is messy. Not sure if CPPFLAGS and LDFLAGS
dnl need it, either.
@ -648,8 +665,6 @@ dnl # Make the output files #
dnl #########################
AC_OUTPUT([Makefile
intl/Makefile
po/Makefile.in
include/Makefile
include/wine/Makefile
gst/Makefile
@ -756,6 +771,7 @@ docs/plugins/Makefile
docs/plugins/gstreamer-plugins.types
docs/manual/Makefile
docs/fwg/Makefile
debian/Makefile
stamp.h
gstreamer-config
gstreamer.spec])

2
debian/.gitignore vendored Normal file
View file

@ -0,0 +1,2 @@
*.debhelper
*substvars

33
debian/Makefile.am vendored Normal file
View file

@ -0,0 +1,33 @@
EXTRA_DIST = \
Makefile.am \
README.Debian \
changelog \
control \
copyright \
gsteditor.files \
gsteditor.menu \
gstmediaplay.files \
gstmediaplay.menu \
gstreamer-cdparanoia.files \
gstreamer-common.files \
gstreamer-doc.files \
gstreamer-elements.files \
gstreamer-esd.files \
gstreamer-lame.files \
gstreamer-mpg123.files \
gstreamer-plugin-template.postinst \
gstreamer-plugin-template.prerm \
gstreamer-runtime.files \
gstreamer-runtime.postinst \
gstreamer-tools.files \
gstreamer-vorbis.files \
libgst-dev.files \
libgst0.files \
libgst0.postinst \
libgsteditor-dev.files \
libgsteditor0.files \
libgsteditor0.postinst \
libgstmediaplay-dev.files \
libgstmediaplay0.files \
libgstmediaplay0.postinst \
rules

38
debian/README.Debian vendored Normal file
View file

@ -0,0 +1,38 @@
GStreamer for Debian
----------------------
This package contains the GStreamer distribution.
More information can be found at http://gstreamer.net/
GStreamer is split into a number of base packages:
libgst0 shared core libs
libgst-dev development libs and headers
libgst-runtime tools required by the libs (gstreamer-register)
gstreamer-doc documentation
gstreamer-tools useful tools
recommended plugins:
gstreamer-elements core plugins
gstreamer-common many independent plugins
optional plugins:
gstreamer-cdparanoia cdparanoia plugin
gstreamer-esd ESD plugin
gstreamer-lame LAME plugin
gstreamer-mpg123 mpg123 plugin
gstreamer-vorbis Vorbis plugin
and applications and their supporting libs:
libgstmediaplay0 media player libs
libgstmediaplay-dev media player dev support
gstmediaplay media player application
libgsteditor0 stream pipeline visual editor libs
libgsteditor-dev stream pipeline visual editor dev support
gsteditor stream pipeline visual editor application
David I. Lehn <dlehn@vt.edu> Fri, 19 Jan 2001 19:13:06 -0500

23
debian/changelog vendored Normal file
View file

@ -0,0 +1,23 @@
gstreamer (0.1.1-1) unstable; urgency=low
* New upstream release
* disable docs build, broken at the momemnt
-- David I. Lehn <dlehn@vt.edu> Sun, 25 Feb 2001 17:58:25 -0500
gstreamer (0.1.0-2) unstable; urgency=low
* debian/rules: call configure instead of autogen.sh
-- David I. Lehn <dlehn@vt.edu> Sat, 24 Feb 2001 18:31:36 -0500
gstreamer (0.1.0-1) unstable; urgency=low
* Initial Release.
-- David I. Lehn <dlehn@vt.edu> Mon, 15 Jan 2001 18:25:18 -0500
Local variables:
mode: debian-changelog
add-log-mailing-address "dlehn@vt.edu"
End:

143
debian/control vendored Normal file
View file

@ -0,0 +1,143 @@
Source: gstreamer
Section: x11
Priority: optional
Maintainer: David I. Lehn <dlehn@vt.edu>
Build-Depends: debhelper (>= 3.0.0), libxml-dev (>= 1.8.10), zlib1g-dev (>= 1:1.1.3), libghttp-dev (>= 1.0.6), libglib-dev (>= 1.2.8), libgtk1.2-dev (>= 1.2.8), libglade0-dev (>= 0.14), libglade-gnome0-dev (>= 0.14), libesd0-dev (>= 0.2.22), libcdparanoia0-dev (>= 3a9.7), libvorbis-dev (>= 1.0beta3), libgnome-dev (>= 1.2.11), libasound1-dev (>= 0.5.10), libghttp-dev (>= 1.0.9), libjpeg62-dev (>= 6b)
Build-Depends-Indep: debhelper (>= 3.0.0), gtk-doc-tools (>= 0.4.0), jade (>= 1.2.1), transfig (>= 3.2.3.c)
Standards-Version: 3.5.2.0
Package: libgst0
Architecture: any
Section: libs
Depends: ${shlibs:Depends}
Suggests: gstreamer-elements, gstreamer-common
Description: Core GStreamer shared library
Core GStreamer shared library
Package: libgst-dev
Architecture: any
Section: devel
Depends: libgst0 (= ${Source-Version}), libc6-dev
Recommends: gstreamer-doc (= ${Source-Version})
Description: GStreamer development libraries and headers
GStreamer development libraries and headers
Package: gstreamer-runtime
Architecture: any
Section: libs
Depends: ${shlibs:Depends}
Description: gstreamer-register binary needed to manage plugin registry
gstreamer-register binary needed to manage plugin registry
Package: gstreamer-doc
Architecture: all
Section: doc
Recommends: libgst-dev (= ${Source-Version})
Description: Core GStreamer documentation
Core GStreamer documentation
Package: gstreamer-tools
Architecture: any
Section: x11
Depends: ${shlibs:Depends}
Suggests: gstreamer-common
Description: Tools for use with GStreamer
Tools for use with GStreamer
.
gstreamer-inspect: query details of installed plugins
gstreamer-launch: command line pipeline generator
Package: libgstmediaplay0
Architecture: any
Section: libs
Depends: ${shlibs:Depends}
Description: GStreamer media player library
GStreamer media player library
Package: libgstmediaplay-dev
Architecture: any
Section: devel
Depends: libgstmediaplay0 (= ${Source-Version}), libc6-dev
Description: GStreamer media player development library and header
GStreamer media player development library and header
Package: gstmediaplay
Architecture: any
Section: x11
Depends: ${shlibs:Depends}
Suggests: gstreamer-common
Description: GStreamer media player
GStreamer media player
Package: libgsteditor0
Architecture: any
Section: libs
Depends: ${shlibs:Depends}
Description: GStreamer editor library
GStreamer editor library
Package: libgsteditor-dev
Architecture: any
Section: devel
Depends: libgsteditor0 (= ${Source-Version}), libc6-dev
Description: GStreamer editor development library and header
GStreamer editor development library and header
Package: gsteditor
Architecture: any
Section: x11
Depends: ${shlibs:Depends}
Suggests: gstreamer-common
Description: GStreamer editor
GStreamer editor
Package: gstreamer-cdparanoia
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: cdparanoia plugin for GStreamer
cdparanoia plugin for GStreamer
Package: gstreamer-common
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: Collection of GStreamer plugins
Collection of GStreamer plugins
.
These plugins have no special dependencies.
Package: gstreamer-elements
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: Core elements plugin for GStreamer
Core elements plugin for GStreamer
Package: gstreamer-esd
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: Enlightened Sound Daemon plugin for GStreamer
Enlightened Sound Daemon plugin for GStreamer
Package: gstreamer-lame
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: LAME plugin for GStreamer
LAME plugin for GStreamer
Package: gstreamer-mpg123
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: mpg123 plugin for GStreamer
mpg123 plugin for GStreamer
Package: gstreamer-vorbis
Architecture: any
Section: libs
Depends: ${shlibs:Depends}, gstreamer-runtime
Description: Vorbis plugin for GStreamer
Vorbis plugin for GStreamer

29
debian/copyright vendored Normal file
View file

@ -0,0 +1,29 @@
This package was debianized by David I. Lehn <dlehn@vt.edu> on
Mon, 15 Jan 2001 18:21:37 -0500.
It was downloaded from http://gstreamer.net/
Upstream Author(s):
Erik Walthinsen <omegahacker@users.sourceforge.net>
Wim Taymans <wim.taymans@chello.be>
Richard Boulton <richard@tartarus.org>
Copyright:
This package is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This package 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
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this package; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
On Debian GNU/Linux systems, the complete text of the GNU Lesser General
Public License can be found in `/usr/share/common-licenses/LGPL'.

2
debian/gsteditor.files vendored Normal file
View file

@ -0,0 +1,2 @@
usr/bin/gsteditor
usr/share/gsteditor

5
debian/gsteditor.menu vendored Normal file
View file

@ -0,0 +1,5 @@
?package(gsteditor): \
needs=X11 \
section=Apps/Viewers \
title="GStreamer Editor" \
command="/usr/bin/gsteditor"

2
debian/gstmediaplay.files vendored Normal file
View file

@ -0,0 +1,2 @@
usr/bin/gstmediaplay
usr/share/gstmediaplay

5
debian/gstmediaplay.menu vendored Normal file
View file

@ -0,0 +1,5 @@
?package(gstmediaplay): \
needs=X11 \
section=Apps/Viewers \
title="GStreamer Media Player" \
command="/usr/bin/gstmediaplay"

1
debian/gstreamer-cdparanoia.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libcdparanoia.*

48
debian/gstreamer-common.files vendored Normal file
View file

@ -0,0 +1,48 @@
usr/lib/gst/libgstriff.*
usr/lib/gst/libgstcolorspace.*
usr/lib/gst/libgstgetbits.*
usr/lib/gst/libgstparsewav.*
usr/lib/gst/libgstputbits.*
usr/lib/gst/libgstidct.*
usr/lib/gst/libgsttypes.*
usr/lib/gst/libgstvideoscale.*
usr/lib/gst/libwinloader.*
usr/lib/gst/libgstparseau.*
usr/lib/gst/libmp3parse.*
usr/lib/gst/libmp3types.*
usr/lib/gst/libstereo.*
usr/lib/gst/libvolume.*
usr/lib/gst/libgstspectrum.*
usr/lib/gst/libvumeter.*
usr/lib/gst/libsynaesthesia.*
usr/lib/gst/libsmoothwave.*
usr/lib/gst/libmpeg2parse.*
usr/lib/gst/libac3dec.*
usr/lib/gst/libac3parse.*
usr/lib/gst/libmpeg2play.*
usr/lib/gst/libmpeg2dec.*
usr/lib/gst/libmpeg2enc.*
usr/lib/gst/libmpeg2subt.*
usr/lib/gst/libmp2videoparse.*
usr/lib/gst/libmpeg2types.*
usr/lib/gst/libmpeg1parse.*
usr/lib/gst/libmpeg_play.*
usr/lib/gst/libmpeg1encoder.*
usr/lib/gst/libsystem_encode.*
usr/lib/gst/libmpegaudio.*
usr/lib/gst/libmpeg1types.*
usr/lib/gst/libvcdsrc.*
usr/lib/gst/librtjpeg.*
usr/lib/gst/libvideosink.*
usr/lib/gst/libv4lsrc.*
usr/lib/gst/libjpeg.*
usr/lib/gst/libmp1videoparse.*
usr/lib/gst/libvideoscale.*
usr/lib/gst/libsmooth.*
usr/lib/gst/libmedian.*
usr/lib/gst/libgstladspa.*
usr/lib/gst/libaudioscale.*
usr/lib/gst/libwincodec.*
usr/lib/gst/libaviencoder.*
usr/lib/gst/libavidecoder.*
usr/lib/gst/libdvdsrc.*

1
debian/gstreamer-doc.files vendored Normal file
View file

@ -0,0 +1 @@
usr/share/gstreamer

1
debian/gstreamer-elements.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libgstelements.*

1
debian/gstreamer-esd.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libesdsink.*

1
debian/gstreamer-lame.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libgstlame.*

1
debian/gstreamer-mpg123.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libmpg123.*

View file

@ -0,0 +1,25 @@
#! /bin/sh
# template plugin postinst script
set -e
case "$1" in
configure)
# Update shared lib deps
gstreamer-register
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
#DEBHELPER#
exit 0

23
debian/gstreamer-plugin-template.prerm vendored Normal file
View file

@ -0,0 +1,23 @@
#! /bin/sh
# template plugin prerm script
set -e
case "$1" in
remove|upgrade|deconfigure)
# update the shared libs
gstreamer-register
;;
failed-upgrade)
;;
*)
echo "prerm called with unknown argument \`$1'" >&2
exit 0
;;
esac
#DEBHELPER#
exit 0

1
debian/gstreamer-runtime.files vendored Normal file
View file

@ -0,0 +1 @@
usr/bin/gstreamer-register

47
debian/gstreamer-runtime.postinst vendored Normal file
View file

@ -0,0 +1,47 @@
#!/bin/sh
# postinst script for gstreamer
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/share/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
gstreamer-register
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

2
debian/gstreamer-tools.files vendored Normal file
View file

@ -0,0 +1,2 @@
usr/bin/gstreamer-inspect
usr/bin/gstreamer-launch

1
debian/gstreamer-vorbis.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/gst/libgstvorbis.*

6
debian/libgst-dev.files vendored Normal file
View file

@ -0,0 +1,6 @@
usr/include
usr/share/aclocal
usr/bin/gstreamer-config
usr/lib/libgst.la
usr/lib/libgst.so
usr/lib/gst/libgstelements.la

1
debian/libgst0.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/libgst.so.*

47
debian/libgst0.postinst vendored Normal file
View file

@ -0,0 +1,47 @@
#!/bin/sh
# postinst script for gstreamer
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/share/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
ldconfig
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

2
debian/libgsteditor-dev.files vendored Normal file
View file

@ -0,0 +1,2 @@
usr/lib/libgsteditor.la
usr/lib/libgsteditor.so

1
debian/libgsteditor0.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/libgsteditor.so.*

47
debian/libgsteditor0.postinst vendored Normal file
View file

@ -0,0 +1,47 @@
#!/bin/sh
# postinst script for gstreamer
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/share/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
ldconfig
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

2
debian/libgstmediaplay-dev.files vendored Normal file
View file

@ -0,0 +1,2 @@
usr/lib/libgstmediaplay.la
usr/lib/libgstmediaplay.so

1
debian/libgstmediaplay0.files vendored Normal file
View file

@ -0,0 +1 @@
usr/lib/libgstmediaplay.so.*

47
debian/libgstmediaplay0.postinst vendored Normal file
View file

@ -0,0 +1,47 @@
#!/bin/sh
# postinst script for gstreamer
#
# see: dh_installdeb(1)
set -e
# summary of how this script can be called:
# * <postinst> `configure' <most-recently-configured-version>
# * <old-postinst> `abort-upgrade' <new version>
# * <conflictor's-postinst> `abort-remove' `in-favour' <package>
# <new-version>
# * <deconfigured's-postinst> `abort-deconfigure' `in-favour'
# <failed-install-package> <version> `removing'
# <conflicting-package> <version>
# for details, see /usr/share/doc/packaging-manual/
#
# quoting from the policy:
# Any necessary prompting should almost always be confined to the
# post-installation script, and should be protected with a conditional
# so that unnecessary prompting doesn't happen if a package's
# installation fails and the `postinst' is called with `abort-upgrade',
# `abort-remove' or `abort-deconfigure'.
case "$1" in
configure)
ldconfig
;;
abort-upgrade|abort-remove|abort-deconfigure)
;;
*)
echo "postinst called with unknown argument \`$1'" >&2
exit 0
;;
esac
# dh_installdeb will replace this with shell code automatically
# generated by other debhelper scripts.
#DEBHELPER#
exit 0

146
debian/rules vendored Executable file
View file

@ -0,0 +1,146 @@
#!/usr/bin/make -f
# Sample debian/rules that uses debhelper.
# GNU copyright 1997 by Joey Hess.
#
# Uncomment this to turn on verbose mode.
#export DH_VERBOSE=1
# This is the debhelper compatability version to use.
export DH_COMPAT=2
# This has to be exported to make some magic below work.
export DH_OPTIONS
# The plugins are basically the same.
# Link special names to a template file.
# still need "*.files" to be done by hand
PLUGINS=cdparanoia common elements esd lame mpg123 vorbis
setup-links:
for i in $(PLUGINS); do \
ln -fs debian/gstreamer-plugin-template.postinst \
debian/gstreamer-$$i.postinst; \
ln -fs debian/gstreamer-plugin-template.prerm \
debian/gstreamer-$$i.prerm; \
done
configure: configure-stamp
configure-stamp:
dh_testdir
# Add here commands to configure the package.
./configure \
--prefix=/usr \
--mandir=\$${prefix}/share/man \
--infodir=\$${prefix}/share/info \
--with-configdir=/etc/gstreamer \
--disable-plugin-srcdir \
--disable-docs-build
touch configure-stamp
build: configure-stamp build-stamp
build-stamp:
dh_testdir
# Add here commands to compile the package.
$(MAKE)
touch build-stamp
clean:
dh_testdir
dh_testroot
rm -f build-stamp configure-stamp
# Add here commands to clean up after the build process.
-$(MAKE) distclean
dh_clean
for i in $(PLUGINS); do \
rm -f debian/gstreamer-$$i.postinst; \
rm -f debian/gstreamer-$$i.prerm; \
done
install: DH_OPTIONS=
install: build
dh_testdir
dh_testroot
dh_clean -k
dh_installdirs
# Add here commands to install the package into debian/gstreamer.
$(MAKE) install prefix=$(CURDIR)/debian/gstreamer/usr
dh_movefiles --sourcedir=debian/gstreamer
# Build architecture-independent files here.
# Pass -i to all debhelper commands in this target to reduce clutter.
binary-indep: DH_OPTIONS=-i
binary-indep: build install
# Need this version of debhelper for DH_OPTIONS to work.
dh_testdir
dh_testroot
# dh_installdebconf
dh_installdocs
dh_installexamples
dh_installmenu
# dh_installemacsen
# dh_installpam
# dh_installinit
# dh_installcron
# dh_installmanpages
# dh_installinfo
# dh_undocumented
dh_installchangelogs ChangeLog
dh_strip
# dh_link
dh_compress
dh_fixperms
# You may want to make some executables suid here.
# dh_suidregister
dh_installdeb
# dh_makeshlibs
# dh_perl
# dh_shlibdeps
dh_gencontrol
dh_md5sums
dh_builddeb
# Build architecture-dependent files here.
# Pass -a to all debhelper commands in this target to reduce clutter.
binary-arch: DH_OPTIONS=-a
binary-arch: build install setup-links
# Need this version of debhelper for DH_OPTIONS to work.
dh_testdir
dh_testroot
# dh_installdebconf
dh_installdocs
dh_installexamples
dh_installmenu
# dh_installemacsen
# dh_installpam
# dh_installinit
# dh_installcron
# dh_installmanpages
# dh_installinfo
dh_undocumented
dh_installchangelogs ChangeLog
dh_strip
# dh_link
dh_compress
dh_fixperms
# You may want to make some executables suid here.
# dh_suidregister
dh_installdeb
dh_makeshlibs
# dh_perl
dh_shlibdeps -l`pwd`/debian/libgst0/usr/lib:`pwd`/debian/libgstmediaplay0/usr/lib:`pwd`/debian/libgsteditor0/usr/lib
dh_gencontrol
dh_md5sums
dh_builddeb
binary: binary-indep binary-arch
.PHONY: build clean binary-indep binary-arch binary install configure

View file

@ -1,4 +1,4 @@
SUBDIRS = manual fwg gst libs
SUBDIRS = manual fwg gst libs plugins
EXTRA_DIST = random slides manuals.mak

View file

@ -17,7 +17,7 @@
</para>
</chapter>
<chapter id="cha-testapp-connect">
<chapter id="cha-testapp-running">
<title>Running the pipeline</title>
<para>
</para>

View file

@ -23,7 +23,7 @@
</author>
</authorgroup>
<legalnotice>
<legalnotice id="legalnotice">
<para>
This material may be distributed only subject to the terms and
conditions set forth in the Open Publication License, v1.0 or

View file

@ -23,7 +23,6 @@ tmpl_sources = \
tmpl/cothreads.sgml \
tmpl/gst.sgml \
tmpl/gstinfo.sgml \
tmpl/gstasyncdisksrc.sgml \
tmpl/gstautoplug.sgml \
tmpl/gstscheduler.sgml \
tmpl/gstprops.sgml \

View file

@ -30,7 +30,6 @@
<!entity GstFakeSrc SYSTEM "sgml/gstfakesrc.sgml">
<!entity GstFakeSink SYSTEM "sgml/gstfakesink.sgml">
<!entity GstDiskSrc SYSTEM "sgml/gstdisksrc.sgml">
<!entity GstAsyncDiskSrc SYSTEM "sgml/gstasyncdisksrc.sgml">
<!entity GstHttpSrc SYSTEM "sgml/gsthttpsrc.sgml">
<!entity GstFdSrc SYSTEM "sgml/gstfdsrc.sgml">
<!entity GstAudioSrc SYSTEM "sgml/gstaudiosrc.sgml">
@ -125,7 +124,6 @@ with some more specialized elements.</para>
&GstFakeSink;
&GstDiskSrc;
&GstAsyncDiskSrc;
&GstHttpSrc;
&GstAudioSrc;

View file

@ -343,6 +343,7 @@ GstPadEOSFunction
GstPadPushFunction
GstPadPullFunction
GstRegionType
GstPadPullRegionFunction
GstPadDirection
@ -374,14 +375,16 @@ gst_pad_connect
gst_pad_disconnect
gst_pad_push
gst_pad_pull
gst_pad_pull_region
gst_pad_pullregion
gst_pad_select
gst_pad_set_eos
gst_pad_handle_qos
gst_pad_eos
gst_pad_load_and_connect
GST_RPAD_LEN
GST_RPAD_OFFSET
GST_RPAD_REGIONTYPE
GstRealPad
GST_RPAD_DIRECTION
GST_RPAD_CAPS
@ -506,6 +509,7 @@ gst_plugin_is_loaded
gst_plugin_load_all
gst_plugin_load
gst_plugin_load_absolute
gst_plugin_add_path
gst_library_load
gst_plugin_add_factory
gst_plugin_add_type
@ -690,21 +694,6 @@ GstCPUFlags
gst_cpu_get_flags
</SECTION>
<SECTION>
<FILE>gstasyncdisksrc</FILE>
<TITLE>GstAsyncDiskSrc</TITLE>
GstAsyncDiskSrcFlags
<SUBSECTION Standard>
GstAsyncDiskSrc
GstAsyncDiskSrcClass
gst_asyncdisksrc_get_type
GST_TYPE_ASYNCDISKSRC
GST_ASYNCDISKSRC
GST_ASYNCDISKSRC_CLASS
GST_IS_ASYNCDISKSRC
GST_IS_ASYNCDISKSRC_CLASS
</SECTION>
<SECTION>
<FILE>gstaudiosink</FILE>
<TITLE>GstAudioSink</TITLE>
@ -749,7 +738,6 @@ GST_DISKSRC
GST_DISKSRC_CLASS
GST_IS_DISKSRC
GST_IS_DISKSRC_CLASS
gst_disksrc_details
</SECTION>
<SECTION>

View file

@ -134,39 +134,6 @@ This macro releases a lock on the object.
<!-- ##### ENUM GstBufferFlags ##### -->
<para>
FIXME this is strange.
<informaltable pgwide=1 frame="none" role="enum">
<tgroup cols="2"><colspec colwidth="2*"><colspec colwidth="8*">
<tbody>
<row>
<entry>GST_BUFFER_READONLY</entry>
<entry>the buffer is read only</entry>
</row>
<row>
<entry>GST_BUFFER_EOS</entry>
<entry>this buffer is the last one in the stream</entry>
</row>
<row>
<entry>GST_BUFFER_ORIGINAL</entry>
<entry>this buffer not a copy</entry>
</row>
<row>
<entry>GST_BUFFER_DONTFREE</entry>
<entry>do not try to free the data when this buffer is unref-ed</entry>
</row>
<row>
<entry>GST_BUFFER_FLUSH</entry>
<entry>this buffer is not related to previous buffers. This flag is mainly
used when data in a stream has been skipped</entry>
</row>
</tbody></tgroup></informaltable>
</para>
@GST_BUFFER_READONLY: the buffer is read only
@ -175,7 +142,7 @@ used when data in a stream has been skipped</entry>
@GST_BUFFER_FLUSH: this buffer is not related to previous buffers. This flag is mainly
used when data in a stream has been skipped
@GST_BUFFER_EOS: this buffer is the last one in the stream
@GST_BUFFER_DISCONTINUOUS:
@GST_BUFFER_DISCONTINUOUS: The buffer has a discontinuity
<!-- ##### STRUCT GstBuffer ##### -->
<para>

View file

@ -102,6 +102,8 @@ a mime-type and a set of properties.
</para>
@caps:
@Param2:
<!-- # Unused Parameters # -->
@typeid:

View file

@ -2,12 +2,11 @@
GstDiskSrc
<!-- ##### SECTION Short_Description ##### -->
Synchronous read from a file (disksrc)
Asynchronous read from a file (disksrc)
<!-- ##### SECTION Long_Description ##### -->
<para>
Synchonously read buffers from a file. If you need asynchronous reading
with seeking capabilities use a <classname>GstAsynDiskSrc</classname> instead.
Asynchonously read buffers from a file.
</para>
@ -45,11 +44,11 @@ Specify how many bytes to read at a time.
<!-- ##### ARG GstDiskSrc:offset ##### -->
<para>
Get the current offset in the file.
Get/set the current offset in the file.
</para>
<!-- ##### ARG GstDiskSrc:size ##### -->
<para>
Get the size of the file.
</para>

View file

@ -101,26 +101,26 @@ This macro releases a lock on the object.
<!-- ##### MACRO GST_GET_LOCK ##### -->
<para>
Acquire a reference to the mutex of this object.
</para>
@obj:
@obj: Object to get the mutex of.
<!-- ##### MACRO GST_OBJECT_PARENT ##### -->
<para>
Get the parent of this object
</para>
@obj:
@obj: Object to get the parent of.
<!-- ##### MACRO GST_OBJECT_NAME ##### -->
<para>
Get the name of this object
</para>
@obj:
@obj: Object to get the name of.
<!-- ##### FUNCTION gst_object_new ##### -->

View file

@ -124,12 +124,14 @@ The function that will be called when pulling a buffer.
<!-- ##### USER_FUNCTION GstPadGetRegionFunction ##### -->
<para>
The function that will be called when pulling a region buffer.
You can specify which buffer to get using an offset/length pair or
a start/stop timecode pair.
</para>
@pad: the pad to get a buffer from
@type:
@type: the type of region to get (time or offset based)
@offset: the offset of the region to get
@len:
@len: the length of the region to get
@Returns: a #GstBuffer
<!-- # Unused Parameters # -->
@size: the size of the region to get
@ -172,18 +174,28 @@ The function that will be called when pulling buffers.
@Returns: a GstBuffer
<!-- ##### ENUM GstRegionType ##### -->
<para>
the region types for #gst_pad_pullregion.
</para>
@GST_REGION_NONE: no type specified
@GST_REGION_OFFSET_LEN: an offet/length pair
@GST_REGION_TIME_LEN: a time start/length pair
<!-- ##### USER_FUNCTION GstPadPullRegionFunction ##### -->
<para>
The function that will be called when pulling a region buffer.
You can specify which buffer to get using an offset/length pair or
a start/stop timecode pair.
</para>
@pad: the pad to pull
@type:
@offset: the offset of the region to pull
@len:
@Returns: a GstBuffer
<!-- # Unused Parameters # -->
@size: the size of the region to pull
@pad: the pad to get a buffer from
@type: the type of region to get (time or offset based)
@offset: the offset of the region to get
@len: the length of the region to get
@Returns: a #GstBuffer
</para>
<!-- ##### ENUM GstPadDirection ##### -->
@ -440,6 +452,8 @@ Destroy the pad.
</para>
@pad:
@buf:
<!-- # Unused Parameters # -->
@buffer:
@ -466,16 +480,6 @@ Destroy the pad.
@size:
<!-- ##### FUNCTION gst_pad_select ##### -->
<para>
</para>
@nextpad:
@Varargs:
@Returns:
<!-- ##### FUNCTION gst_pad_set_eos ##### -->
<para>
@ -514,6 +518,30 @@ Call the EOS function of the pad
@elements:
<!-- ##### MACRO GST_RPAD_LEN ##### -->
<para>
</para>
@pad:
<!-- ##### MACRO GST_RPAD_OFFSET ##### -->
<para>
</para>
@pad:
<!-- ##### MACRO GST_RPAD_REGIONTYPE ##### -->
<para>
</para>
@pad:
<!-- ##### STRUCT GstRealPad ##### -->
<para>

View file

@ -135,6 +135,14 @@ by the loader at statup.
@Returns:
<!-- ##### FUNCTION gst_plugin_add_path ##### -->
<para>
</para>
@path:
<!-- ##### FUNCTION gst_library_load ##### -->
<para>

View file

@ -154,14 +154,6 @@ This macro usets the given flags.
</para>
<!-- ##### FUNCTION gst_pipeline_add_src ##### -->
<para>
</para>
@pipeline:
@src:
<!-- ##### MACRO DEBUG ##### -->
<para>
Use this macro to show debugging info. This is only usefull when developing new
@ -681,14 +673,6 @@ Query whether this object has multiple input pads.
@size:
@Returns:
<!-- ##### USER_FUNCTION GstAutoplugListFunction ##### -->
<para>
Get a list of all elements. These elements will be used in autoplugging.
</para>
@data: user data
@Returns: a GList of elements
<!-- ##### FUNCTION gst_fdsink_new_with_fd ##### -->
<para>
@ -911,6 +895,15 @@ Specify the current offset in the file.
@klass:
<!-- ##### FUNCTION gst_pad_select ##### -->
<para>
</para>
@nextpad:
@Varargs:
@Returns:
<!-- ##### FUNCTION gst_identity_get_type ##### -->
<para>
@ -1019,12 +1012,6 @@ on its own.
@klass:
<!-- ##### MACRO GST_AUTOPLUG_MAX_COST ##### -->
<para>
The maximum cost of a certain connection.
</para>
<!-- ##### SECTION ./tmpl/gstcolorspace.sgml:Short_Description ##### -->
@ -1471,15 +1458,6 @@ This macro unsets the given state on the element.
@pad:
@parent:
<!-- ##### FUNCTION gst_autoplug_caps ##### -->
<para>
</para>
@srccaps:
@sinkcaps:
@Returns:
<!-- ##### FUNCTION gst_tee_new ##### -->
<para>
@ -1708,15 +1686,6 @@ This macro sets the given state on the element.
</para>
<!-- ##### FUNCTION gst_autoplug_pads ##### -->
<para>
</para>
@srcpad:
@sinkpad:
@Returns:
<!-- ##### FUNCTION gst_src_push_region ##### -->
<para>
@ -2026,14 +1995,6 @@ GstFilter
@GST_CAPS_ALWAYS:
@GST_CAPS_MAYBE:
<!-- ##### FUNCTION gst_pipeline_autoplug ##### -->
<para>
</para>
@pipeline:
@Returns:
<!-- ##### STRUCT GstPadClass ##### -->
<para>
@ -2048,6 +2009,7 @@ Flags for the GstSrc element
@GST_SRC_ASYNC: Indicates that this src is asynchronous
@GST_SRC_FLAG_LAST: subclasses can use this to number their flags
<!-- ##### MACRO GST_HTTPSRC ##### -->
<para>
@ -2239,6 +2201,13 @@ The end point of a filter graph
@format:
@args...:
<!-- ##### SECTION ./tmpl/gstasyncdisksrc.sgml:Long_Description ##### -->
<para>
Reads data from a file. You can seek to a specific location by setting
the offset.
</para>
<!-- ##### MACRO GST_IS_ASYNCDISKSRC_CLASS ##### -->
<para>
@ -2266,14 +2235,6 @@ The end point of a filter graph
</para>
<!-- ##### FUNCTION gst_pipeline_add_sink ##### -->
<para>
</para>
@pipeline:
@sink:
<!-- ##### SECTION ./tmpl/plugin.sgml:Title ##### -->
plugin
@ -2336,14 +2297,6 @@ This macro checks to see if the given state is set.
</para>
<!-- ##### FUNCTION gst_plugin_find_elementfactory ##### -->
<para>
</para>
@name:
@Returns:
<!-- ##### FUNCTION gst_type_dump ##### -->
<para>
@ -2387,16 +2340,6 @@ This macro sets the given flags.
@klass:
<!-- ##### USER_FUNCTION GstAutoplugCostFunction ##### -->
<para>
Calculate the cost between two elements.
</para>
@src: the source element
@dest: the destination element
@data: optional user data
@Returns: the cost for a connection between the two elements
<!-- ##### MACRO DEBUG_LEAVE_STRING ##### -->
<para>

View file

@ -1,5 +1,5 @@
manualname = gstreamer-manual
htmlname = gstreamer.html
htmlname = index.html
sgml_files = gstreamer-manual.sgml \
advanced.sgml \
@ -20,6 +20,7 @@ sgml_files = gstreamer-manual.sgml \
motivation.sgml \
plugins.sgml \
programs.sgml \
debugging.sgml \
queues.sgml \
states.sgml \
threads.sgml \

View file

@ -110,7 +110,7 @@
while (elements) {
GstElement *element = GST_ELEMENT (elements-&gt;data);
g_print ("element in bin: %s\n", gst_element_get_name (element));
g_print ("element in bin: &percnt;s\n", gst_element_get_name (element));
elements = g_list_next (elements);
}

View file

@ -0,0 +1,89 @@
<chapter id="cha-debugging">
<title>Debugging</title>
<para>
GStreamer has an extensive set of debugging tools for
plugin developers.
</para>
<sect1>
<title>Command line options</title>
<para>
Applications using the GStreamer libraries accept the following set
of command line argruments to enable the debugging system.
</para>
<para>
<itemizedlist>
<listitem>
<para>
<option>--gst-debug-mask=<replaceable>mask</replaceable></option>
Sets the mask for the debugging output.
</para>
</listitem>
<listitem>
<para>
<option>--gst-info-mask=<replaceable>mask</replaceable></option>
Sets the mask for the info output.
</para>
</listitem>
<listitem>
<para>
<option>--gst-plugin-spew</option>
Enable printout of errors while loading GST plugins.
</para>
</listitem>
<listitem>
<para>
<option>--gst-plugin-path=<replaceable>PATH</replaceable></option>
Add a directory to the plugin search path.
</para>
<listitem>
<para>
<option>--help</option> Print the a short desciption of the
options and an overview of the current debugging/info masks
set.
</para>
</listitem>
</itemizedlist>
</para>
<para>
<para>
The follwing table gives an overview of the mask values and
their meaning. (enabled) means that the corresponding flag
has been set.
</para>
<programlisting>
Mask (to be OR'ed) info/debug FLAGS
--------------------------------------------------------
0x00000001 (enabled)/ GST_INIT
0x00000002 / COTHREADS
0x00000004 / COTHREAD_SWITCH
0x00000008 / AUTOPLUG
0x00000010 / AUTOPLUG_ATTEMPT
0x00000020 / PARENTAGE
0x00000040 / STATES
0x00000080 / PLANING
0x00000100 / SCHEDULING
0x00000200 / OPERATION
0x00000400 / BUFFER
0x00000800 / CAPS
0x00001000 / CLOCK
0x00002000 / ELEMENT_PADS
0x00004000 / ELEMENTFACTORY
0x00008000 / PADS
0x00010000 / PIPELINE
0x00020000 / PLUGIN_LOADING
0x00040000 / PLUGIN_ERRORS
0x00080000 / PROPERTIES
0x00100000 / THREAD
0x00200000 / TYPES
0x00400000 / XML
</programlisting>
</sect1>
<sect1>
<title>Adding a custom debug handler</title>
<para>
</para>
</sect1>
</chapter>

View file

@ -102,7 +102,7 @@ new_pad_created (GstElement *parse, GstPad *pad, GstElement *pipeline)
GtkWidget *appwindow;
g_print ("***** a new pad %s was created\n", gst_pad_get_name (pad));
g_print ("***** a new pad &percnt;s was created\n", gst_pad_get_name (pad));
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PAUSED);

View file

@ -23,12 +23,13 @@
<!ENTITY XML SYSTEM "xml.sgml">
<!ENTITY PLUGINS SYSTEM "plugins.sgml">
<!ENTITY DEBUGGING SYSTEM "debugging.sgml">
<!ENTITY PROGRAMS SYSTEM "programs.sgml">
<!ENTITY COMPONENTS SYSTEM "components.sgml">
<!ENTITY QUOTES SYSTEM "quotes.sgml">
]>
<book id="GStreamer">
<book id="index">
<bookinfo>
<authorgroup>
@ -43,7 +44,7 @@
</author>
</authorgroup>
<legalnotice>
<legalnotice id="legalnotice">
<para>
This material may be distributed only subject to the terms and
conditions set forth in the Open Publication License, v1.0 or later (the
@ -183,9 +184,12 @@
<partintro>
<para>
<application>GStreamer</application> comes prepackaged with a few programs.
and some usefull debugging options.
</para>
</partintro>
&DEBUGGING;
&PROGRAMS;
&COMPONENTS;

View file

@ -38,7 +38,7 @@ main (int argc, char *argv[])
gst_init(&amp;argc, &amp;argv);
if (argc != 2) {
g_print ("usage: %s &lt;filename&gt;n", argv[0]);
g_print ("usage: &percnt;s &lt;filename&gt;n", argv[0]);
exit (-1);
}

View file

@ -41,7 +41,7 @@ main (int argc, char *argv[])
GstElement *pipeline;
if (argc != 2) {
g_print ("usage: %s &lt;filename&gt;\n", argv[0]);
g_print ("usage: &percnt;s &lt;filename&gt;\n", argv[0]);
exit (-1);
}

View file

@ -34,7 +34,7 @@
while (pads) {
GstPad *pad = GST_PAD (pads-&gt;data);
g_print ("pad name %s\n", gst_pad_get_name (pad));
g_print ("pad name &percnt;s\n", gst_pad_get_name (pad));
pads = g_list_next (pads);
}
@ -57,7 +57,7 @@
GstObject.
</para>
</sect2>
<sect2 id="sec-pads-synamic">
<sect2 id="sec-pads-dynamic">
<title>Dynamic pads</title>
<para>
Some elements might not have their pads when they are created. This can, for
@ -82,7 +82,7 @@
static void
pad_connect_func (GstElement *parser, GstPad *pad, GstElement *pipeline)
{
g_print("***** a new pad %s was created\n", gst_pad_get_name(pad));
g_print("***** a new pad &percnt;s was created\n", gst_pad_get_name(pad));
gst_element_set_state (pipeline, GST_STATE_PAUSED);
@ -119,6 +119,58 @@ main(int argc, char *argv[])
</para>
</note>
</sect2>
<sect2 id="sec-pads-request">
<title>Request pads</title>
<para>
An element can also have request pads. These pads are not created automatically
but are only created on demand. This is very usefull for muxers, aggregators
and tee elements.
</para>
<para>
The tee element, for example, has one input pad and a request padtemplate for the
output pads. Whenever an element wants to get an output pad from the tee element, it
has to request the pad.
</para>
<para>
The following piece of code can be used to get a pad from the tee element. After
the pad has been requested, it can be used to connect another element to it.
</para>
<programlisting>
...
GstPad *pad;
...
element = gst_elementfactory_make ("tee", "element");
pad = gst_element_request_pad_by_name (element, "src%d");
g_print ("new pad %s\n", gst_pad_get_name (pad));
...
</programlisting>
<para>
The gst_element_request_pad_by_name method can be used to get a pad
from the element based on the name_template of the padtemplate.
</para>
<para>
It is also possible to request a pad that is compatible with another
padtemplate. This is very usefull if you want to connect an element to
a muxer element and you need to request a pad that is compatible. The
gst_element_request_compatible_pad is used to request a compatible pad, as
is shown in the next example.
</para>
<programlisting>
...
GstPadTemplate *templ;
GstPad *pad;
...
element = gst_elementfactory_make ("tee", "element");
mp3parse = gst_elementfactory_make ("mp3parse", "mp3parse");
templ = gst_element_get_padtemplate_by_name (mp3parse, "sink");
pad = gst_element_request_compatible_pad (element, templ);
g_print ("new pad %s\n", gst_pad_get_name (pad));
...
</programlisting>
</sect2>
</sect1>
<sect1 id="sec-pads-description">
<title>Capabilities of a GstPad</title>
@ -258,12 +310,12 @@ Pads:
...
caps = gst_pad_get_caps_list (pad);
g_print ("pad name %s\n", gst_pad_get_name (pad));
g_print ("pad name &percnt;s\n", gst_pad_get_name (pad));
while (caps) {
GstCaps *cap = (GstCaps *) caps-&gt;data;
g_print (" Capability name %s, MIME type\n", gst_caps_get_name (cap),
g_print (" Capability name &percnt;s, MIME type\n", gst_caps_get_name (cap),
gst_caps_get_mime (cap));
caps = g_list_next (caps);

View file

@ -55,7 +55,7 @@ struct _GstPlugin {
while (plugins) {
GstPlugin *plugin = (GstPlugin *)plugins-&gt;data;
g_print ("plugin: %s\n", gst_plugin_get_name (plugin));
g_print ("plugin: &percnt;s\n", gst_plugin_get_name (plugin));
plugins = g_list_next (plugins);
}

View file

@ -66,7 +66,7 @@ main (int argc, char *argv[])
gst_init (&amp;argc,&amp;argv);
if (argc != 2) {
g_print ("usage: %s &lt;filename&gt;\n", argv[0]);
g_print ("usage: &percnt;s &lt;filename&gt;\n", argv[0]);
exit (-1);
}

View file

@ -11,6 +11,26 @@
</para>
<variablelist>
<varlistentry>
<term>16 Feb 2001</term>
<listitem>
<para>
<emphasis>wtay:</emphasis>
I shipped a few commerical products to &gt;40000 people now but
GStreamer is way more exciting...
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>16 Feb 2001</term>
<listitem>
<para>
*
<emphasis>tool-man</emphasis>
is a gstreamer groupie
</para>
</listitem>
</varlistentry>
<varlistentry>
<term>14 Jan 2001</term>
<listitem>

View file

@ -77,7 +77,7 @@ main (int argc, char *argv[])
GstElement *thread;
if (argc != 2) {
g_print ("usage: %s &lt;filename&gt;\n", argv[0]);
g_print ("usage: &percnt;s &lt;filename&gt;\n", argv[0]);
exit (-1);
}

View file

@ -64,7 +64,7 @@ main(int argc, char *argv[])
gst_init(&amp;argc,&amp;argv);
if (argc != 2) {
g_print("usage: %s &lt;filename&gt;\n", argv[0]);
g_print("usage: &percnt;s &lt;filename&gt;\n", argv[0]);
exit(-1);
}

View file

@ -38,7 +38,7 @@ main (int argc, char *argv[])
gst_init (&amp;argc,&amp;argv);
if (argc != 2) {
g_print ("usage: %s &lt;filename&gt;\n", argv[0]);
g_print ("usage: &percnt;s &lt;filename&gt;\n", argv[0]);
exit (-1);
}
@ -120,7 +120,9 @@ main (int argc, char *argv[])
<sect1 id="sec-xml-load">
<title>Loading a GstElement from an XML file</title>
<para>
A saved XML file can be loade with the gst_xml_new (filename, rootelement).
Before an XML file can be loaded, you must create a GstXML object.
A saved XML file can then be loaded with the
gst_xml_parse_file (xml, filename, rootelement) method.
The root element can optionally left NULL. The following code example loads
the previously created XML file and runs it.
</para>
@ -128,37 +130,28 @@ main (int argc, char *argv[])
#include &lt;stdlib.h&gt;
#include &lt;gst/gst.h&gt;
gboolean playing;
/* eos will be called when the src element has an end of stream */
void
eos (GstElement *element, gpointer data)
{
g_print ("have eos, quitting\n");
playing = FALSE;
}
int
main(int argc, char *argv[])
{
GstXML *xml;
GstElement *bin;
GstElement *disk;
gboolean ret;
gst_init (&amp;argc, &amp;argv);
xml = gst_xml_new ("xmlTest.gst", NULL);
xml = gst_xml_new ();
ret = gst_xml_parse_file(xml, "xmlTest.gst", NULL);
g_assert (ret == TRUE);
bin = gst_xml_get_element (xml, "bin");
g_assert (bin != NULL);
gst_element_set_state (bin, GST_STATE_PLAYING);
playing = TRUE;
while (playing) {
gst_bin_iterate (GST_BIN (bin));
}
while (gst_bin_iterate(GST_BIN(bin)));
gst_element_set_state (bin, GST_STATE_NULL);
@ -173,6 +166,127 @@ main(int argc, char *argv[])
gst_xml_get_topelements (xml) can be used to get a list of all toplevel elements
in the XML file.
</para>
<para>
In addition to loading a file, you can also load a from a xmlDocPtr and
an in memory buffer using gst_xml_parse_doc and gst_xml_parse_memory
respectivily. both of these methods return a gboolean indicating success
or failure of the requested action.
</para>
</sect1>
<sect1 id="sec-xml-custom">
<title>Adding custom XML tags into the core XML data</title>
<para>
It is possible to add custom XML tags to the core XML created with
gst_xml_write. This feature can be used by an application to add more
information to the save plugins. the editor will for example insert
the position of the elements on the screen using the custom XML tags.
</para>
<para>
It is strongly suggested to save and load the custom XML tags using
a namespace. This will solve the problem of having your XML tags
interfere with the core XML tags.
</para>
<para>
To insert a hook into the element saving procedure you can connect
a signal to the GstElement using the following piece of code:
</para>
<programlisting>
xmlNsPtr ns;
...
ns = xmlNewNs (NULL, "http://gstreamer.net/gst-test/1.0/", "test");
...
thread = gst_elementfactory_make("thread", "thread");
gtk_signal_connect (GTK_OBJECT (thread), "object_saved", object_saved, g_strdup ("decoder thread"));
...
</programlisting>
<para>
When the thread is saved, the object_save method will be caled. Our example
will insert a comment tag:
</para>
<programlisting>
static void
object_saved (GstObject *object, xmlNodePtr parent, gpointer data)
{
xmlNodePtr child;
child = xmlNewChild(parent, ns, "comment", NULL);
xmlNewChild(child, ns, "text", (gchar *)data);
}
</programlisting>
<para>
Adding the custom tag code to the above example you will get an XML file
with the custom tags in it. Here's an excerpt:
</para>
<programlisting>
...
&lt;gst:element&gt;
&lt;gst:name&gt;thread&lt;/gst:name&gt;
&lt;gst:type&gt;thread&lt;/gst:type&gt;
&lt;gst:version&gt;0.1.0&lt;/gst:version&gt;
...
&lt;/gst:children&gt;
&lt;test:comment&gt;
&lt;test:text&gt;decoder thread&lt;/test:text&gt;
&lt;/test:comment&gt;
&lt;/gst:element&gt;
...
</programlisting>
<para>
To retrieve the custom XML again, you need to attach a signal to
the GstXML object used to load the XML data. You can then parse your
custom XML from the XML tree whenever an object is loaded.
</para>
<para>
We can extend our previous example with the following piece of
code.
</para>
<programlisting>
xml = gst_xml_new ();
gtk_signal_connect (GTK_OBJECT (xml), "object_loaded", xml_loaded, xml);
ret = gst_xml_parse_file(xml, "xmlTest.gst", NULL);
g_assert (ret == TRUE);
</programlisting>
<para>
Whenever a new object has been loaded, the xml_loaded function will be
called. this function looks like:
</para>
<programlisting>
static void
xml_loaded (GstXML *xml, GstObject *object, xmlNodePtr self, gpointer data)
{
xmlNodePtr children = self-&gt;xmlChildrenNode;
while (children) {
if (!strcmp (children-&gt;name, "comment")) {
xmlNodePtr nodes = children-&gt;xmlChildrenNode;
while (nodes) {
if (!strcmp (nodes-&gt;name, "text")) {
gchar *name = g_strdup (xmlNodeGetContent (nodes));
g_print ("object %s loaded with comment '%s'\n",
gst_object_get_name (object), name);
}
nodes = nodes-&gt;next;
}
}
children = children-&gt;next;
}
}
</programlisting>
<para>
As you can see, you'll get a handle to the GstXML object, the
newly loaded GstObject and the xmlNodePtr that was used to create
this object. In the above example we look for our special tag inside
the XML tree that was used to load the object and we print our
comment to the console.
</para>
</sect1>
</chapter>

View file

@ -47,7 +47,9 @@ sgml/$(DOC_MODULE)-doc.bottom: $(tmpl_sources)
$(MAKE) sgml
scanobj:
CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)" ./gstdoc-scanobj --module=$(DOC_MODULE)
env CC="$(LIBTOOL) $(CC)" CFLAGS="$(LIBGST_CFLAGS) $(GLIB_CFLAGS) $(XML_CFLAGS) -I../../" LDFLAGS="$(GST_LIBS)"\
./gstdoc-scanobj --module=$(DOC_MODULE)
tmpl: scanobj
./gstdoc-mktmpl --module=$(DOC_MODULE)

View file

@ -839,7 +839,7 @@ output_widget_pads (FILE *fp, GstElement *element)
type = gst_type_find_by_id(1);
fprintf (fp, "<PAD>\n<NAME>%s::%s</NAME>\n",
gtk_type_name(factory->type), pad->name);
gtk_type_name(factory->type), gst_object_get_name (GST_OBJECT (pad)));
if (type) {
fprintf(fp, "<MIME>%s</MIME>\n", type->mime);

View file

@ -14,8 +14,3 @@ Ac3Parse
</para>
<!-- ##### ARG Ac3Parse:skip ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ Audioscale
</para>
<!-- ##### ARG Audioscale:frequency ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ GstAviEncoder
</para>
<!-- ##### ARG GstAviEncoder:video ##### -->
<para>
</para>
<!-- ##### ARG GstAviEncoder:audio ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ GstMpeg2enc
</para>
<!-- ##### ARG GstMpeg2enc:frames_per_second ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ GstMpeg2play
</para>
<!-- ##### ARG GstMpeg2play:frames_per_second ##### -->
<para>
</para>

View file

@ -14,11 +14,3 @@ GstMpeg_play
</para>
<!-- ##### SIGNAL GstMpeg_play::frame-decoded ##### -->
<para>
</para>
@gstmpeg_play: the object which received the signal.
@arg1:

File diff suppressed because it is too large Load diff

View file

@ -14,8 +14,3 @@ GstSpectrum
</para>
<!-- ##### ARG GstSpectrum:width ##### -->
<para>
</para>

View file

@ -14,73 +14,3 @@ GstV4lSrc
</para>
<!-- ##### ARG GstV4lSrc:width ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:height ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:format ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:tune ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:tuned ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:input ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:norm ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:volume ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:mute ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:mode ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:color ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:bright ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:hue ##### -->
<para>
</para>
<!-- ##### ARG GstV4lSrc:contrast ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ GstWinDec
</para>
<!-- ##### ARG GstWinDec:avi_header ##### -->
<para>
</para>
<!-- ##### ARG GstWinDec:bitdepth ##### -->
<para>
</para>

View file

@ -14,36 +14,3 @@ GstWinEnc
</para>
<!-- ##### SIGNAL GstWinEnc::frame-encoded ##### -->
<para>
</para>
@gstwinenc: the object which received the signal.
@arg1:
<!-- ##### ARG GstWinEnc:avi_header ##### -->
<para>
</para>
<!-- ##### ARG GstWinEnc:bitrate ##### -->
<para>
</para>
<!-- ##### ARG GstWinEnc:quality ##### -->
<para>
</para>
<!-- ##### ARG GstWinEnc:compression ##### -->
<para>
</para>
<!-- ##### ARG GstWinEnc:last_frame_size ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ GstMedian
</para>
<!-- ##### ARG GstMedian:active ##### -->
<para>
</para>
<!-- ##### ARG GstMedian:filtersize ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ Mp3Parse
</para>
<!-- ##### ARG Mp3Parse:skip ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ Mpeg1Parse
</para>
<!-- ##### ARG Mpeg1Parse:mux_rate ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ Mpeg2Parse
</para>
<!-- ##### ARG Mpeg2Parse:mux_rate ##### -->
<para>
</para>

View file

@ -14,8 +14,3 @@ Mpeg2Subt
</para>
<!-- ##### ARG Mpeg2Subt:skip ##### -->
<para>
</para>

View file

@ -14,18 +14,3 @@ GstSmooth
</para>
<!-- ##### ARG GstSmooth:active ##### -->
<para>
</para>
<!-- ##### ARG GstSmooth:tolerance ##### -->
<para>
</para>
<!-- ##### ARG GstSmooth:filtersize ##### -->
<para>
</para>

View file

@ -14,18 +14,3 @@ GstSmoothWave
</para>
<!-- ##### ARG GstSmoothWave:width ##### -->
<para>
</para>
<!-- ##### ARG GstSmoothWave:height ##### -->
<para>
</para>
<!-- ##### ARG GstSmoothWave:widget ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ GstStereo
</para>
<!-- ##### ARG GstStereo:active ##### -->
<para>
</para>
<!-- ##### ARG GstStereo:stereo ##### -->
<para>
</para>

View file

@ -14,18 +14,3 @@ GstSynaesthesia
</para>
<!-- ##### ARG GstSynaesthesia:width ##### -->
<para>
</para>
<!-- ##### ARG GstSynaesthesia:height ##### -->
<para>
</para>
<!-- ##### ARG GstSynaesthesia:widget ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ System_Encode
</para>
<!-- ##### ARG System_Encode:video ##### -->
<para>
</para>
<!-- ##### ARG System_Encode:audio ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ Videoscale
</para>
<!-- ##### ARG Videoscale:width ##### -->
<para>
</para>
<!-- ##### ARG Videoscale:height ##### -->
<para>
</para>

View file

@ -14,42 +14,3 @@ GstVideoSink
</para>
<!-- ##### SIGNAL GstVideoSink::frame-displayed ##### -->
<para>
</para>
@gstvideosink: the object which received the signal.
<!-- # Unused Parameters # -->
@arg1:
<!-- ##### ARG GstVideoSink:width ##### -->
<para>
</para>
<!-- ##### ARG GstVideoSink:height ##### -->
<para>
</para>
<!-- ##### ARG GstVideoSink:widget ##### -->
<para>
</para>
<!-- ##### ARG GstVideoSink:frames_displayed ##### -->
<para>
</para>
<!-- ##### ARG GstVideoSink:frame_time ##### -->
<para>
</para>
<!-- ##### ARG GstVideoSink:xv_enabled ##### -->
<para>
</para>

View file

@ -14,13 +14,3 @@ GstVolume
</para>
<!-- ##### ARG GstVolume:active ##### -->
<para>
</para>
<!-- ##### ARG GstVolume:volume ##### -->
<para>
</para>

View file

@ -14,33 +14,3 @@ GstVuMeter
</para>
<!-- ##### ARG GstVuMeter:volume ##### -->
<para>
</para>
<!-- ##### ARG GstVuMeter:volumeptr ##### -->
<para>
</para>
<!-- ##### ARG GstVuMeter:volume_left ##### -->
<para>
</para>
<!-- ##### ARG GstVuMeter:volumeptr_left ##### -->
<para>
</para>
<!-- ##### ARG GstVuMeter:volume_right ##### -->
<para>
</para>
<!-- ##### ARG GstVuMeter:volumeptr_right ##### -->
<para>
</para>

36
docs/random/NOTES-0.1.1 Normal file
View file

@ -0,0 +1,36 @@
compile fixes:
- BSD compatibility fixes (MAP_ANON)
- libxml compile problems fix
- compile fixes for non x86 architectures
(mpg123, mpeg_play, getbits, videoscale, ac3dec)
- mpeg2enc asm comment fixes
bug fixes:
- videoscaler/colorconversion fixes
- OSS audiosink bug fix
- reworked the queue threading code
- fixed the /etc/gstreamer permissions problem
- various minor bug fixes
changes:
- state change modifications
- _request pad implemented for muxer/mixer/aggregator
elements. also _request_compatible additions.
- massive ghostpad changes
- EOS handling (not for gstmediaplay)
- icecast send plugin using libshout
- lots of GstObject changes (XML save, name, parent
properties fixes)
- preliminary XML namespaces.
- added support for custom app tags in the XML save/load
routines (preliminary support)
- cothreads updates for ALPHA/ARM
- asyncdisksrc is gone in favor of a better disksrc
- getregion rework
- videoscaler/colorconversion updates
- manual/docs updates

1132
docs/random/caps.dia Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,345 @@
caps negotiation
================
1) purpose
----------
The pads expose the media types they can handle using a mime
type and a set of properties. Before the pad is created or
used to pass buffers, we only know the global 'range' of media
data this pad can accept. When the element has had a chance to
look at the media data, only then it knows the exact values of the
properties.
example1:
!
! The mp3 decoder exposes the capabilities of its src pad
! with the following caps:
!
! 'mpg123_src':
! MIME type: 'audio/raw':
! format: Integer: 16
! depth: Integer: 16
! rate: Integer range: 11025 - 48000
! channels: Integer range: 1 - 2
as you can see in example1, the padtemplate has both a range
(for the audio rate) and a list (for the number of channels)
for its properties.
only when the mpg123 element has decoded the first mpeg audio
header, it knows the exact values of the rate and channels
properties.
suppose that we want to connect this src pad to the sink pad
of an audiosink with the properties given in example2:
example2:
!
! 'audiosink_sink':
! MIME type: 'audio/raw':
! format: Integer: 16
! depth: List:
! Integer: 8
! Integer: 16
! rate: Integer range: 8000 - 44000
! channels: Integer range: 1 - 2
we can see that connecting the mpg123 src pad with the
audiosinks sink pad can cause a potential problem with the
rate property.
When the mpg123 decoder decides to output raw audio with a
48000Hz samplerate, the audiosink will not be able to handle
it. The conservative approach would be to disallow the connection
between the two incompatible pads. This rules out any potential
problems but severely limits the amount of possible connections
between the elements.
Another approach would be to allow the connection (and mark it
as dangerous) and let the two elements figure out a suitable
media type at runtime. This procedure is called caps negotiation.
2) a bit of history
-------------------
The typing of the data that was attached to a buffer used to be
done using GstMeta* (and it still is as of 11 feb 2001). With
the new GstCaps and GstProps system this typing is gradually moved
to the pads and to the padtemplates. This has several advantages:
- the typing of the data tends to be static. The type of media
doesn't change for every buffer.
- Moving the typing up to the pad(templates) allows us to save
them into the registry and allows us to figure out what pads
are compatible.
- the current metadata implementation needs header files. this may
change when we also use properties for metadata.
example3:
!
! This is the current GstMeta structure that travels with audio buffers
!
! struct _MetaAudioRaw {
! GstMeta meta;
!
! /* formatting information */
! gint format;
! gint channels;
! gint frequency;
! gint bps;
! };
The question still remains what purpose the metadata will serve
now that we expose the media type in the pads. Some possibilities:
- interesting information, not describing the data itself but the
context in which the data was generated (suggested buffer size,
timestamps, etc...)
- user app metadata.
In this proposal we also assume that the current use of metadata using
GstMeta is deprecated and that we move this information to the properties
of the pads.
3) the pad/padtemplates caps
----------------------------
All elements have to provide a padtemplate for their pads.
The padtemplates provide a range of possible media types this pad can
src/sink. the main purpose for the padtemplates is to allow a
rough guess at which pads are compatible before even a single buffer
has been processed by the element.
pads are usually created from the templates. When the pad is created
it has no GstCaps* attached to it yet. The possible caps this pad
can have is exposed in the padtemplate. The caps are filled in by
the element when it knows the values for the caps.
4) the connect function
-----------------------
when two pads are connected the following steps will take
placei (not sure, FIXME):
- if both pads have caps, the caps are checked. If the caps
are incompatible, the padtemplates are checked, if they
are compatible, caps negotiation is performed.
- if one of the pads has caps, the caps is checked against
the padtemplate of the peer pad. If they are incompatible,
the padtemplates are compared, if they are incompatible,
caps negotiation is performed.
- if none of the pads have caps, the padtemplates are checked,
if they are incompatible, a warning is issued.
5) when the element knows the media type it is handling
-------------------------------------------------------
When the element has received its first buffer it will know
the media type it is handling by inspecting the buffer.
before pushing the data out to its peer element(s), the element
will set its src pad with the appropriate caps and properties.
These caps must follow the following rules:
- the caps must be compatible with the padtemplates of this
pad.
- the caps cannot contain ranges or lists.
when the element wants to change the caps of a pad, it has to
perform gst_pad_renegotiate (GstPad *pad). this will trigger
the caps negotiation procedure.
this will trigger the class method of the pad and calls the pads
gst_pad_negotiate function:
GstCaps *gst_pad_negotiate (GstPad *pad, GstCaps *caps, guint count);
This function takes a GstCaps *structure as an argument (typically the
current caps of the pad) and a negotiation counter. this counter can be
used to keep track of the negotiation process.
The pad then creates a new caps structure with the desired caps.
If the caps are accepted, it just returns the provided input caps. the
_renegotiate function will set the caps of both pads whenever the
input caps are the same (pointer wise) as the input caps.
the caps structure is checked against the padtemplate of the peer pad,
if it is incompatible the gst_pad_negotiate function is called again
and the element is supposed to create another caps structure.
the gst_pad_renegotiate function then calls the gst_pad_negotiate
function of the peer pad with the new caps as the argument. The peer
pad can adjust or create a new caps if it doesn't accept it.
the caps structure keeps on bouncing between the two pads until one
of the pads negotiation functions returns the caps unmodified.
The element can also return a NULL pointer if it has run out of
options for the caps structure. When this happens, both pads are set
the the NULL caps again and the pad connnection is broken.
The negotiation process is stopped after a fixed number of tries,
when the counter has reached some limit. This limit is typically
checked by the pads negotiate function.
6) caps negotiation function
----------------------------
the negotiate function of a pad is called whenever the pad or
peer pad has performed _renegotiate.
example5:
!
! this is the caps negotiation function implemented by an element on
! one of its sink pads.
!
! static GstCaps*
! gst_pad_negotiate (GstPad *pad, GstCaps *caps, guint counter)
! {
! /* we don't accept anything else than audio/raw */
! if (strcmp (gst_caps_get_mime (caps), "audio/raw"))
! return NULL;
!
! if (gst_caps_get_int_prop (caps, "format") != AFMT_S16_LE)
! return NULL;
!
! /* we accept everything else */
! return caps;
! }
When the negotiate function returns NULL (it does not accept the
specified caps of the peer pad), the negotiation process is stopped.
APPENDIX A: use cases
=====================
1) mpg123 src!sink audiosink
----------------------------
When the pads are connected the padtemplates are checked and it
turns out that the pads might be incompatible (mpg123 can do
48000Hz while audiosink can do 44000Hz). Nothing happens at
connect time except for the user app that can mark this connection
as possibly dangerous and keep some spare elements ready for when
the pads turn out to be incompatible.
both elements start out with no caps at all (NULL). mpg123 wants
to output a buffer with specific properties. It calls
gst_pad_renegotiate (mpg123->srcpad).
The _renegotiate functions calls the negotiate function of the
mpg123->srcpad. the negotiate function would look like this:
/*
* The mpg123 element cannot convert the decoded type into something
* else so it has to force the caps of the src pad into the specific
* type as defined by the mp3.
*/
static GstCaps*
gst_mpeg123_src_negotiate (GstPad *pad, GstCaps *caps, guint counter)
{
GstMpg123 *mpg123;
mpg123 = GST_MPG123 (gst_pad_get_parent (pad));
/* we got caps in, check them */
if (caps != NULL) {
if (!strcmp (gst_caps_get_mime (caps), "audio/raw") &&
(gst_caps_get_int_prop (caps, "format") == AFMT_S16_LE) &&
(gst_caps_get_int_prop (caps, "depth") == 16) &&
(gst_caps_get_int_prop (caps, "rate") == mpg123->rate) &&
(gst_caps_get_int_prop (caps, "channels") == mpg123->channels)) {
return caps;
}
}
/* we didn't get caps, so we decide */
else if (counter != 2) {
GstCaps *new;
/* fill in our desired caps */
new = gst_caps_new_with_props (
"src_caps", /* name */
"audio/raw", /* mime */
gst_props_new (
"format", GST_PROPS_INT (AFMT_S16_LE),
"depth", GST_PROPS_INT (16),
"rate", GST_PROPS_INT (mpg123->rate),
"channels", GST_PROPS_INT (mpg123->channels),
NULL
)
);
return caps;
}
/* too many attempts at nogotiation, bail out */
return NULL;
}
The audiosink pad negotiate function would look like this:
/*
* The audiosink has a wide range of possible parameters for
* its sink pad, based on the audio card capabilities and
* possibly the element configuration.
* we assume the audiosink element can be both the initiator of
* the negotiations and the negotiated one.
*/
static GstCaps*
gst_audiosink_sink_negotiate (GstPad *pad, GstCaps *caps, guint counter)
{
GstAudiosink *audiosink;
gboolean accepted = TRUE;
audiosink = GST_AUDIOSINK (gst_pad_get_parent (pad));
/* we got caps in, we know they will match the padtemplate */
if (caps != NULL) {
return caps;
}
/* we didn't get caps, so we decide */
else if (counter != 2) {
GstCaps *new;
/* fill in our desired caps */
new = gst_caps_new_with_props (
"sink_caps", /* name */
"audio/raw", /* mime */
gst_props_new (
"format", GST_PROPS_INT (audiosink->format),
"depth", GST_PROPS_INT (audiosink->depth),
"rate", GST_PROPS_INT (audiosink->rate),
"channels", GST_PROPS_INT (audiosink->channels),
NULL
)
);
return caps;
}
/* too many attempts at nogotiation, bail out */
return NULL;
}

View file

@ -1,4 +1,4 @@
SUBDIRS = autoplug \
helloworld helloworld2 \
queue queue2 queue3 queue4 \
launch thread xml plugins
launch thread xml plugins typefind

View file

@ -17,9 +17,14 @@
* Boston, MA 02111-1307, USA.
*/
/* First, include the header file for the plugin, to bring in the
* object definition and other useful things.
*/
#include "example.h"
/* elementfactory information */
/* The ElementDetails structure gives a human-readable description
* of the plugin, as well as author and version data.
*/
static GstElementDetails example_details = {
"An example plugin",
"Example",
@ -29,30 +34,47 @@ static GstElementDetails example_details = {
"(C) 2000",
};
/* Example signals and args */
/* These are the signals that this element can fire. They are zero-
* based because the numbers themselves are private to the object.
* LAST_SIGNAL is used for initialization of the signal array.
*/
enum {
ASDF,
/* FILL ME */
LAST_SIGNAL
};
/* Arguments are identified the same way, but cannot be zero, so you
* must leave the ARG_0 entry in as a placeholder.
*/
enum {
ARG_0,
ARG_ACTIVE
ARG_ACTIVE,
/* FILL ME */
};
/* The PadFactory structures describe what pads the element has or
* can have. They can be quite complex, but for this example plugin
* they are rather simple.
*/
static GstPadFactory sink_factory = {
"sink", /* the name of the pads */
GST_PAD_FACTORY_SINK, /* type of the pad */
GST_PAD_FACTORY_ALWAYS, /* ALWAYS/SOMETIMES */
GST_PAD_FACTORY_CAPS(
"example_sink", /* the name of the caps */
"unknown/unknown", /* the mime type of the caps */
"something", GST_PROPS_INT (1), /* a property */
"foo", GST_PROPS_BOOLEAN (TRUE) /* another property */
"sink", /* The name of the pad */
GST_PAD_FACTORY_SINK, /* Direction of the pad */
GST_PAD_FACTORY_ALWAYS, /* The pad exists for every instance */
GST_PAD_FACTORY_CAPS( /* This factory has specific capabilities */
"example_sink", /* The name of the caps */
"unknown/unknown", /* The overall MIME/type */
"foo", GST_PROPS_INT (1), /* An integer property */
"bar", GST_PROPS_BOOLEAN (TRUE), /* A boolean */
"baz", GST_PROPS_LIST ( /* A list of values for */
GST_PROPS_INT (1),
GST_PROPS_INT (3)
)
),
NULL
NULL /* All factories must be NULL-terminated */
};
/* This factory is much simpler, and defines the source pad. */
static GstPadFactory src_factory = {
"src",
GST_PAD_FACTORY_SRC,
@ -65,19 +87,35 @@ static GstPadFactory src_factory = {
};
static void gst_example_class_init (GstExampleClass *klass);
static void gst_example_init (GstExample *example);
/* A number of functon prototypes are given so we can refer to them later. */
static void gst_example_class_init (GstExampleClass *klass);
static void gst_example_init (GstExample *example);
static void gst_example_chain (GstPad *pad, GstBuffer *buf);
static void gst_example_chain (GstPad *pad, GstBuffer *buf);
static void gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id);
static void gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id);
static void gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id);
static void gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id);
GstPadTemplate *src_template, *sink_template;
/* These hold the constructed pad templates, which are created during
* plugin load, and used during element instantiation.
*/
static GstPadTemplate *src_template, *sink_template;
/* The parent class pointer needs to be kept around for some object
* operations.
*/
static GstElementClass *parent_class = NULL;
//static guint gst_example_signals[LAST_SIGNAL] = { 0 };
/* This array holds the ids of the signals registered for this object.
* The array indexes are based on the enum up above.
*/
static guint gst_example_signals[LAST_SIGNAL] = { 0 };
/* This function is used to register and subsequently return the type
* identifier for this object class. On first invocation, it will
* register the type, providing the name of the class, struct sizes,
* and pointers to the various functions that define the class.
*/
GtkType
gst_example_get_type(void)
{
@ -90,8 +128,8 @@ gst_example_get_type(void)
sizeof(GstExampleClass),
(GtkClassInitFunc)gst_example_class_init,
(GtkObjectInitFunc)gst_example_init,
(GtkArgSetFunc)gst_example_set_arg,
(GtkArgGetFunc)gst_example_get_arg,
(GtkArgSetFunc)NULL, /* These last three are depracated */
(GtkArgGetFunc)NULL,
(GtkClassInitFunc)NULL,
};
example_type = gtk_type_unique(GST_TYPE_ELEMENT,&example_info);
@ -99,70 +137,166 @@ gst_example_get_type(void)
return example_type;
}
/* In order to create an instance of an object, the class must be
* initialized by this function. GtkObject will take care of running
* it, based on the pointer to the function provided above.
*/
static void
gst_example_class_init (GstExampleClass *klass)
{
/* Class pointers are needed to supply pointers to the private
* implementations of parent class methods.
*/
GtkObjectClass *gtkobject_class;
GstElementClass *gstelement_class;
/* Since the example class contains the parent classes, you can simply
* cast the pointer to get access to the parent classes.
*/
gtkobject_class = (GtkObjectClass*)klass;
gstelement_class = (GstElementClass*)klass;
/* The parent class is needed for class method overrides. */
parent_class = gtk_type_class(GST_TYPE_ELEMENT);
/* Here we add an argument to the object. This argument is an integer,
* and can be both read and written.
*/
gtk_object_add_arg_type("GstExample::active", GTK_TYPE_INT,
GTK_ARG_READWRITE, ARG_ACTIVE);
/* Here we add a signal to the object. This is avery useless signal
* called asdf. The signal will also pass a pointer to the listeners
* which happens to be the example element itself */
gst_example_signals[ASDF] =
gtk_signal_new("asdf", GTK_RUN_LAST, gtkobject_class->type,
GTK_SIGNAL_OFFSET (GstExampleClass, asdf),
gtk_marshal_NONE__POINTER, GTK_TYPE_NONE, 1,
GST_TYPE_EXAMPLE);
gtk_object_class_add_signals (gtkobject_class, gst_example_signals,
LAST_SIGNAL);
/* The last thing is to provide the functions that implement get and set
* of arguments.
*/
gtkobject_class->set_arg = gst_example_set_arg;
gtkobject_class->get_arg = gst_example_get_arg;
}
/* This function is responsible for initializing a specific instance of
* the plugin.
*/
static void
gst_example_init(GstExample *example)
{
/* First we create the sink pad, which is the input to the element.
* We will use the sink_template constructed in the plugin_init function
* (below) to quickly generate the pad we need.
*/
example->sinkpad = gst_pad_new_from_template (sink_template, "sink");
gst_element_add_pad(GST_ELEMENT(example),example->sinkpad);
/* Setting the chain function allows us to supply the function that will
* actually be performing the work. Without this, the element would do
* nothing, with undefined results (assertion failures and such).
*/
gst_pad_set_chain_function(example->sinkpad,gst_example_chain);
/* We then must add this pad to the element's list of pads. The base
* element class manages the list of pads, and provides accessors to it.
*/
gst_element_add_pad(GST_ELEMENT(example),example->sinkpad);
/* The src pad, the output of the element, is created and registered
* in the same way, with the exception of the chain function. Source
* pads don't have chain functions, because they can't accept buffers,
* they only produce them.
*/
example->srcpad = gst_pad_new_from_template (src_template, "src");
gst_element_add_pad(GST_ELEMENT(example),example->srcpad);
/* Initialization of element's private variables. */
example->active = FALSE;
}
/* The chain function is the heart of the element. It's where all the
* work is done. It is passed a pointer to the pad in question, as well
* as the buffer provided by the peer element.
*/
static void
gst_example_chain (GstPad *pad, GstBuffer *buf)
{
GstExample *example;
GstBuffer *outbuf;
/* Some of these checks are of dubious value, since if there were not
* already true, the chain function would never be called.
*/
g_return_if_fail(pad != NULL);
g_return_if_fail(GST_IS_PAD(pad));
g_return_if_fail(buf != NULL);
//g_return_if_fail(GST_IS_BUFFER(buf));
/* We need to get a pointer to the element this pad belogs to. */
example = GST_EXAMPLE(gst_pad_get_parent (pad));
/* A few more sanity checks to make sure that the element that owns
* this pad is the right kind of element, in case something got confused.
*/
g_return_if_fail(example != NULL);
g_return_if_fail(GST_IS_EXAMPLE(example));
/* If we are supposed to be doing something, here's where it happens. */
if (example->active) {
/* DO STUFF */
}
/* In this example we're going to copy the buffer to another one,
* so we need to allocate a new buffer first. */
outbuf = gst_buffer_new();
gst_pad_push(example->srcpad,buf);
/* We need to copy the size and offset of the buffer at a minimum. */
GST_BUFFER_SIZE (outbuf) = GST_BUFFER_SIZE (buf);
GST_BUFFER_OFFSET (outbuf) = GST_BUFFER_OFFSET (buf);
/* Then allocate the memory for the new buffer */
GST_BUFFER_DATA (outbuf) = (guchar *)g_malloc (GST_BUFFER_SIZE (outbuf));
/* Then copy the data in the incoming buffer into the new buffer. */
memcpy (GST_BUFFER_DATA (outbuf), GST_BUFFER_DATA (buf), GST_BUFFER_SIZE (outbuf));
/* When we're done with the buffer, we push it on to the next element
* in the pipeline, through the element's source pad, which is stored
* in the element's structure.
*/
gst_pad_push(example->srcpad,outbuf);
/* For fun we'll emit our useless signal here */
gtk_signal_emit (GTK_OBJECT (example), gst_example_signals[ASDF],
example);
/* If we're not doing something, just send the original incoming buffer. */
} else {
gst_pad_push(example->srcpad,buf);
}
}
/* Arguments are part of the Gtk+ object system, and these functions
* enable the element to respond to various arguments.
*/
static void
gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id)
{
GstExample *example;
/* it's not null if we got it, but it might not be ours */
/* It's not null if we got it, but it might not be ours */
g_return_if_fail(GST_IS_EXAMPLE(object));
/* Get a pointer of the right type. */
example = GST_EXAMPLE(object);
switch(id) {
/* Check the argument id to see which argument we're setting. */
switch (id) {
case ARG_ACTIVE:
/* Here we simply copy the value of the argument to our private
* storage. More complex operations can be done, but beware that
* they may occur at any time, possibly even while your chain function
* is running, if you are using threads.
*/
example->active = GTK_VALUE_INT(*arg);
g_print("example: set active to %d\n",example->active);
break;
@ -171,12 +305,13 @@ gst_example_set_arg (GtkObject *object,GtkArg *arg,guint id)
}
}
/* The set function is simply the inverse of the get fuction. */
static void
gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id)
{
GstExample *example;
/* it's not null if we got it, but it might not be ours */
/* It's not null if we got it, but it might not be ours */
g_return_if_fail(GST_IS_EXAMPLE(object));
example = GST_EXAMPLE(object);
@ -190,25 +325,45 @@ gst_example_get_arg (GtkObject *object,GtkArg *arg,guint id)
}
}
/* This is the entry into the plugin itself. When the plugin loads,
* this function is called to register everything that the plugin provides.
*/
GstPlugin*
plugin_init (GModule *module)
{
GstPlugin *plugin;
GstElementFactory *factory;
/* First we try to create a new Plugin structure. */
plugin = gst_plugin_new("example");
/* If we get a NULL back, chances are we're already loaded. */
g_return_val_if_fail(plugin != NULL, NULL);
/* We need to create an ElementFactory for each element we provide.
* This consists of the name of the element, the GtkType identifier,
* and a pointer to the details structure at the top of the file.
*/
factory = gst_elementfactory_new("example", GST_TYPE_EXAMPLE, &example_details);
g_return_val_if_fail(factory != NULL, NULL);
/* The pad templates can be easily generated from the factories above,
* and then added to the list of padtemplates for the elementfactory.
* Note that the generated padtemplates are stored in static global
* variables, for the gst_example_init function to use later on.
*/
sink_template = gst_padtemplate_new (&sink_factory);
gst_elementfactory_add_padtemplate (factory, sink_template);
src_template = gst_padtemplate_new (&src_factory);
gst_elementfactory_add_padtemplate (factory, src_template);
/* The very last thing is to register the elementfactory with the plugin. */
gst_plugin_add_factory (plugin, factory);
/* Now we can return the pointer to the newly created Plugin object. */
return plugin;
/* At this point, the GStreamer core registers the plugin, its
* elementfactories, padtemplates, etc., for use in you application.
*/
}

View file

@ -28,36 +28,61 @@ extern "C" {
#endif /* __cplusplus */
/* Definition of structure storing data for this element. */
/* This is the definition of the element's object structure. */
typedef struct _GstExample GstExample;
/* The structure itself is derived from GstElement, as can be seen by the
* fact that there's a complete instance of the GstElement structure at
* the beginning of the object. This allows the element to be cast to
* an Element or even an Object.
*/
struct _GstExample {
GstElement element;
/* We need to keep track of our pads, so we do so here. */
GstPad *sinkpad,*srcpad;
gint8 active;
/* We'll use this to decide whether to do anything to the data we get. */
gboolean active;
};
/* Standard definition defining a class for this element. */
/* The other half of the object is its class. The class also derives from
* the same parent, though it must be the class structure this time.
* Function pointers for polymophic methods and signals are placed in this
* structure. */
typedef struct _GstExampleClass GstExampleClass;
struct _GstExampleClass {
GstElementClass parent_class;
/* signals */
void (*asdf) (GstElement *element, GstExample *example);
};
/* Standard macros for defining types for this element. */
/* Five standard preprocessing macros are used in the Gtk+ object system.
* The first uses the object's _get_type function to return the GtkType
* of the object.
*/
#define GST_TYPE_EXAMPLE \
(gst_example_get_type())
/* The second is a checking cast to the correct type. If the object passed
* is not the right type, a warning will be generated on stderr.
*/
#define GST_EXAMPLE(obj) \
(GTK_CHECK_CAST((obj),GST_TYPE_EXAMPLE,GstExample))
/* The third is a checking cast of the class instead of the object. */
#define GST_EXAMPLE_CLASS(klass) \
(GTK_CHECK_CLASS_CAST((klass),GST_TYPE_EXAMPLE,GstExample))
/* The last two simply check to see if the passed pointer is an object or
* class of the correct type. */
#define GST_IS_EXAMPLE(obj) \
(GTK_CHECK_TYPE((obj),GST_TYPE_EXAMPLE))
#define GST_IS_EXAMPLE_CLASS(obj) \
(GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_EXAMPLE))
/* Standard function returning type information. */
/* This is the only prototype needed, because it is used in the above
* GST_TYPE_EXAMPLE macro.
*/
GtkType gst_example_get_type(void);

View file

@ -43,29 +43,48 @@ libgst_la_SOURCES = \
gstparse.c \
$(GSTARCH_SRCS)
##### Oh this sucks so badly. This isn't funny. #####
# the compiler shoots cothreads.c in the head at -O6
# FIXME: these manual rules break the dependency generation, so we have a
# nasty hack here.
LTCOMPILE2=$(LTCOMPILE) -O2
COMPILE2=$(COMPILE) -O2
cothreads.lo: cothreads.c
@echo '$(LTCOMPILE2) -c $<'; \
$(LTCOMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
@-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
< .deps/$(*F).pp > .deps/$(*F).P; \
tr ' ' '\012' < .deps/$(*F).pp \
| sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
>> .deps/$(*F).P; \
rm -f .deps/$(*F).pp
cothreads.o: cothreads.c
@echo '$(COMPILE2) -c $<'; \
$(COMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
@-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
< .deps/$(*F).pp > .deps/$(*F).P; \
tr ' ' '\012' < .deps/$(*F).pp \
| sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
>> .deps/$(*F).P; \
rm -f .deps/$(*F).pp
#LTCOMPILE2=$(LTCOMPILE) -O2
#COMPILE2=$(COMPILE) -O2
cothreads.lo: cothreads.c cothreads.h gst_private.h ../config.h gstinfo.c \
gstarch.h gsti386.h
$(LIBTOOL) --mode=compile $(COMPILE) -O2 -c $<
cothreads.o: cothreads.c cothreads.h gst_private.h ../config.h gstinfo.c \
gstarch.h gsti386.h
$(COMPILE) -O2 -c $<
# NOTDEPEND.cothreads.lo: cothreads.c
# NOTDEPEND $(LTCOMPILE2) -c $<
# NOTDEPEND.cothreads.o: cothreads.c
# NOTDEPEND $(COMPILE2) -c $<
#cothreads.lo: cothreads.c
# @echo '$(LTCOMPILE2) -c $<'; \
# $(LTCOMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
# @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
# < .deps/$(*F).pp > .deps/$(*F).P; \
# tr ' ' '\012' < .deps/$(*F).pp \
# | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
# >> .deps/$(*F).P; \
# rm -f .deps/$(*F).pp
#cothreads.o: cothreads.c
# @echo '$(COMPILE2) -c $<'; \
# $(COMPILE2) -Wp,-MD,.deps/$(*F).pp -c $<
# @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \
# < .deps/$(*F).pp > .deps/$(*F).P; \
# tr ' ' '\012' < .deps/$(*F).pp \
# | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \
# >> .deps/$(*F).P; \
# rm -f .deps/$(*F).pp
##### end immense suckage #####
libgstincludedir = $(includedir)/gst
libgstinclude_HEADERS = \

View file

@ -171,6 +171,33 @@ gst_autoplug_pads_autoplug_func (GstElement *src, GstPad *pad, GstElement *sink)
return connected;
}
typedef struct {
GstElement *result;
GList *endcap;
gint i;
} dynamic_pad_struct;
static void
autoplug_dynamic_pad (GstElement *element, GstPad *pad, gpointer data)
{
dynamic_pad_struct *info = (dynamic_pad_struct *)data;
GList *pads = gst_element_get_pad_list (element);
GST_DEBUG (0,"attempting to dynamically create a ghostpad for %s=%s\n", GST_ELEMENT_NAME (element),
GST_PAD_NAME (pad));
while (pads) {
GstPad *pad = GST_PAD (pads->data);
pads = g_list_next (pads);
if (gst_caps_list_check_compatibility (gst_pad_get_caps_list (pad), info->endcap)) {
gst_element_add_ghost_pad (info->result, pad, g_strdup_printf("src_%02d", info->i));
GST_DEBUG (0,"gstpipeline: new dynamic pad %s\n", GST_PAD_NAME (pad));
break;
}
}
}
static void
gst_autoplug_pads_autoplug (GstElement *src, GstElement *sink)
{
@ -455,17 +482,34 @@ differ:
{
GList *endcap = (GList *)(endcaps->data);
GList *pads = gst_element_get_pad_list (thesrcelement);
gboolean have_pad = FALSE;
endcaps = g_list_next (endcaps);
GST_DEBUG (0,"attempting to create a ghostpad for %s\n", GST_ELEMENT_NAME (thesrcelement));
while (pads) {
GstPad *pad = GST_PAD (pads->data);
pads = g_list_next (pads);
if (gst_caps_list_check_compatibility (gst_pad_get_caps_list (pad), endcap)) {
gst_element_add_ghost_pad (result, pad, g_strdup_printf("src_%02d", i));
have_pad = TRUE;
break;
}
}
if (!have_pad) {
dynamic_pad_struct *data = g_new0(dynamic_pad_struct, 1);
data->result = result;
data->endcap = endcap;
data->i = i;
GST_DEBUG (0,"delaying the creation of a ghostpad for %s\n", GST_ELEMENT_NAME (thesrcelement));
gtk_signal_connect (GTK_OBJECT (thesrcelement), "new_pad",
autoplug_dynamic_pad, data);
gtk_signal_connect (GTK_OBJECT (thesrcelement), "new_ghost_pad",
autoplug_dynamic_pad, data);
}
}
}

View file

@ -32,7 +32,7 @@
GstElementDetails gst_disksrc_details = {
"asynchronous Disk Source",
"Disk Source",
"Source/File",
"Read from arbitrary point in a file",
VERSION,

View file

@ -48,18 +48,17 @@ struct _elements_entry {
};
static struct _elements_entry _elements[] = {
{ "fakesrc", gst_fakesrc_get_type, &gst_fakesrc_details, NULL },
{ "fakesink", gst_fakesink_get_type, &gst_fakesink_details, NULL },
{ "asyncdisksrc", gst_disksrc_get_type, &gst_disksrc_details, NULL },
{ "audiosink", gst_audiosink_get_type, &gst_audiosink_details, gst_audiosink_factory_init },
{ "audiosrc", gst_audiosrc_get_type, &gst_audiosrc_details, NULL },
{ "disksrc", gst_disksrc_get_type, &gst_disksrc_details, NULL },
{ "identity", gst_identity_get_type, &gst_identity_details, NULL },
{ "fdsink", gst_fdsink_get_type, &gst_fdsink_details, NULL },
{ "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL },
{ "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL },
{ "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, NULL },
{ "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init },
{ "fakesrc", gst_fakesrc_get_type, &gst_fakesrc_details, NULL },
{ "fakesink", gst_fakesink_get_type, &gst_fakesink_details, NULL },
{ "audiosink", gst_audiosink_get_type, &gst_audiosink_details, gst_audiosink_factory_init },
{ "audiosrc", gst_audiosrc_get_type, &gst_audiosrc_details, NULL },
{ "disksrc", gst_disksrc_get_type, &gst_disksrc_details, NULL },
{ "identity", gst_identity_get_type, &gst_identity_details, NULL },
{ "fdsink", gst_fdsink_get_type, &gst_fdsink_details, NULL },
{ "fdsrc", gst_fdsrc_get_type, &gst_fdsrc_details, NULL },
{ "pipefilter", gst_pipefilter_get_type, &gst_pipefilter_details, NULL },
{ "sinesrc", gst_sinesrc_get_type, &gst_sinesrc_details, NULL },
{ "tee", gst_tee_get_type, &gst_tee_details, gst_tee_factory_init },
#if HAVE_LIBGHTTP
{ "httpsrc", gst_httpsrc_get_type, &gst_httpsrc_details, NULL },

View file

@ -35,11 +35,13 @@
#include "gsttypefind.h"
#define MAX_PATH_SPLIT 16
gchar *_gst_progname;
extern gint _gst_trace_on;
extern gboolean _gst_plugin_spew;
static gboolean gst_init_check (int *argc, gchar ***argv);
@ -88,6 +90,31 @@ gst_init (int *argc, char **argv[])
}
}
static void
gst_add_paths_func (gchar *pathlist)
{
gchar **paths;
gint j = 0;
gchar *lastpath = g_strdup (pathlist);
while (lastpath) {
paths = g_strsplit (lastpath, G_SEARCHPATH_SEPARATOR_S, MAX_PATH_SPLIT);
g_free (lastpath);
lastpath = NULL;
while (paths[j]) {
GST_INFO (GST_CAT_GST_INIT, "Adding plugin path: \"%s\"", paths[j]);
gst_plugin_add_path (paths[j]);
if (++j == MAX_PATH_SPLIT) {
lastpath = g_strdup (paths[j]);
g_strfreev (paths);
j=0;
break;
}
}
}
}
/* returns FALSE if the program can be aborted */
static gboolean
gst_init_check (int *argc,
@ -128,6 +155,16 @@ gst_init_check (int *argc,
(*argv)[i] = NULL;
}
else if (!strncmp ("--gst-plugin-spew", (*argv)[i], 17)) {
_gst_plugin_spew = TRUE;
(*argv)[i] = NULL;
}
else if (!strncmp ("--gst-plugin-path=", (*argv)[i], 17)) {
gst_add_paths_func ((*argv)[i]+18);
(*argv)[i] = NULL;
}
else if (!strncmp ("--help", (*argv)[i], 6)) {
showhelp = TRUE;
}
@ -147,20 +184,33 @@ gst_init_check (int *argc,
}
}
/* check for ENV variables */
{
gchar *plugin_path = g_getenv("GST_PLUGIN_PATH");
gst_add_paths_func (plugin_path);
}
if (showhelp) {
guint i;
g_print ("usage %s [OPTION...]\n", (*argv)[0]);
g_print ("usage %s [OPTION...]\n", _gst_progname);
g_print ("\nGStreamer options\n");
g_print (" --gst-info-mask=FLAGS Gst info flags to set (current %08x)\n", gst_info_get_categories());
g_print (" --gst-debug-mask=FLAGS Gst debugging flags to set\n");
g_print (" --gst-info-mask=FLAGS GST info flags to set (current %08x)\n", gst_info_get_categories());
g_print (" --gst-debug-mask=FLAGS GST debugging flags to set\n");
g_print (" --gst-plugin-spew Enable printout of errors while loading GST plugins\n");
g_print (" --gst-plugin-path=PATH Add directories separated with '%s' to the plugin search path\n",
G_SEARCHPATH_SEPARATOR_S);
g_print ("\nGStreamer info/debug FLAGS (to be OR'ed)\n");
g_print ("\n Mask (to be OR'ed) info/debug FLAGS \n");
g_print ("--------------------------------------------------------\n");
for (i = 0; i<GST_CAT_MAX_CATEGORY; i++) {
g_print (" 0x%08x %s %s\n", 1<<i,
g_print (" 0x%08x %s%s %s\n", 1<<i,
(gst_info_get_categories() & (1<<i)?"(enabled)":" "),
(gst_debug_get_categories() & (1<<i)?"/(enabled)":"/ "),
gst_get_category_name (i));
}

Some files were not shown because too many files have changed in this diff Show more