GStreamer use a *large* array of tools and libraries, most of which are
optional.  We have attempted to make sure that any code that depends on
optional libraries doesn't get built unless you have those libraries.  If
you find this not to be the case, please, let us know by filing a bug
report at http://sourceforge.net/bugs/?group_id=1936.


Required libraries:
===================
glib v1.2.0 or better
gtk+ v1.2.0 or better
libxml          (also called gnome-xml, available from http://xmlsoft.org/)
libHermes	(for gstplay)
			http://www.clanlib.org/hermes/

These libraries are all central parts of gnome, and are available from the
ftp.gnome.org or its mirrors, amongst other places.

Optional libraries:
===================
gdk_pixbuf
libgnomeui	(for gstplay, gsteditor, autoplug example, several tests)
libglade	(for gstplay, gsteditor)

libghttp	(for httpsrc)
			http://ftp.gnome.org/pub/GNOME/stable/sources/libghttp/
libaudiofile    (for afsrc/afsink)
			http://oss.sgi.com/projects/audiofile/
libmad          (for the mad mp3 decoder plugin)
			http://www.mars.org/home/rob/proj/mpeg/
libjpeg         (for jpegenc/jpegdec)
			http://www.ijg.org/
libopenquicktime (for the QT plugin)
			http://sourceforge.net/projects/openquicktime/
libXv		(for videosink)
libxaudio	(for xa mp3 decoder)
			http://www.xaudio.com/
libvorbis	(for vorbisenc, vorbisdec)
			http://www.xiph.org/ogg/vorbis/index.html
libcdparanoia	(for cdparanoia ripper)
			http://www.xiph.org/paranoia/index.html
liblame		(for lame mp3 encoder)
			http://www.mp3dev.org/mp3/
libshout	(for the shoutcast plugin)
			http://www.icecast.org
libasound	(for the alsa src/sink plugin)
			http://alsa-project.org/
librtp		(for the rtp sink plugin, shipped with Gnome-O-Phone)
			http://sourceforge.net/projects/gphone
aalib		(for the aa sink plugin)
			http://aa-project.sourceforge.net/aalib/
aRts		(for the arts plugin wrapper, and the artsd sink)
			http://www.arts-project.org
raw1394/linux1394	(for the dv plugin)
			http://linux1394.sourceforge.net
decss		(for the dvdsrc)
			http://www.linuxrising.com/dvd-munitions_tar.gz
libesound	(for the esd sink 
			ftp.gnome.org/pub/GNOME/stable/sources/esound)
gnome-vfs	(for the gnome-vfs src)
libgsm		(for the gsm plugin)
			http://kbs.cs.tu-berlin.de/~jutta/toast.html
sdl		(for the sdl sink)
			http://www.libsdl.org
xmms		(for the xmms plugins wrapper)
			http://www.xmms.org
mpeg2dec/ac3dec	(for mpeg2 related plugins and dvd playback)
			http://linuxvideo.org/mpeg2dec/
			and http://linuxvideo.org/ac3dec/
avifile		(for the avi windows decoder plugins
			you might want to get the windows libraries 
			from http://divx.euro.ru/ and put the .dll files 
			in /usr/lib/win32/)

An extra set of tools is required if you wish to build GStreamer out of
CVS (using autogen.sh):

Required tools:
===============
autoconf
automake v1.4 or better
libtool v1.3.5 or better

Optional tools:
===============
gtkdoc
db2html
fig2dev

Optional debian packages:
=========================
(This is an incomplete list, made only of problems which have been reported,
rather than by an audit.)
task-helix-gnome-dev   OR libgnome-dev

gtk-doc-tools 0.4-0.2  -- needed to build documentation
