Merge branch 'master' into 0.11

Conflicts:
	common
	configure.ac
This commit is contained in:
Wim Taymans 2010-12-13 11:43:13 +01:00
commit fc12ade012
91 changed files with 1502 additions and 10445 deletions

3
.gitmodules vendored Normal file
View file

@ -0,0 +1,3 @@
[submodule "common"]
path = common
url = git://anongit.freedesktop.org/gstreamer/common

View file

@ -6,6 +6,7 @@ SUBDIRS = \
m4 \ m4 \
common \ common \
pkgconfig \ pkgconfig \
docs \
examples examples
DIST_SUBDIRS = $(SUBDIRS) DIST_SUBDIRS = $(SUBDIRS)
@ -33,3 +34,11 @@ check-torture:
true true
endif endif
# cruft: plugins that have been merged or moved or renamed
CRUFT_FILES = \
$(top_builddir)/common/shave \
$(top_builddir)/common/shave-libtool
include $(top_srcdir)/common/cruft.mak
all-local: check-cruft

View file

@ -5,16 +5,13 @@ DIE=0
package=gst-rtsp package=gst-rtsp
srcfile=gst/rtsp-server/rtsp-server.c srcfile=gst/rtsp-server/rtsp-server.c
# a quick cvs co to ease the transition # Make sure we have common
if test ! -d common; if test ! -f common/gst-autogen.sh;
then then
echo "+ getting common/ from cvs" echo "+ Setting up common submodule"
if test -e CVS/Tag git submodule init
then
TAG="-r `tail -c +2 CVS/Tag`"
fi
cvs co $TAG common
fi fi
git submodule update
# source helper functions # source helper functions
if test ! -f common/gst-autogen.sh; if test ! -f common/gst-autogen.sh;
@ -25,18 +22,25 @@ then
fi fi
. common/gst-autogen.sh . common/gst-autogen.sh
# install pre-commit hook for doing clean commits
if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \);
then
rm -f .git/hooks/pre-commit
ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
fi
CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc'
autogen_options $@ autogen_options $@
echo -n "+ check for build tools" printf "+ check for build tools"
if test ! -z "$NOCHECK"; then echo ": skipped version checks"; else echo; fi if test ! -z "$NOCHECK"; then echo ": skipped version checks"; else echo; fi
version_check "autoconf" "$AUTOCONF autoconf autoconf259 autoconf257 autoconf-2.54 autoconf-2.53 autoconf253 autoconf-2.52 autoconf252" \ version_check "autoconf" "$AUTOCONF autoconf autoconf270 autoconf269 autoconf268 autoconf267 autoconf266 autoconf265 autoconf264 autoconf263 autoconf262 autoconf261 autoconf260" \
"ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 52 || DIE=1 "ftp://ftp.gnu.org/pub/gnu/autoconf/" 2 60 || DIE=1
version_check "automake" "$AUTOMAKE automake automake-1.9 automake19 automake-1.8 automake18 automake-1.7 automake17 automake-1.6 automake16" \ version_check "automake" "$AUTOMAKE automake automake-1.11 automake-1.10" \
"ftp://ftp.gnu.org/pub/gnu/automake/" 1 7 || DIE=1 "ftp://ftp.gnu.org/pub/gnu/automake/" 1 10 || DIE=1
version_check "autopoint" "autopoint" \ version_check "autopoint" "autopoint" \
"ftp://ftp.gnu.org/pub/gnu/gettext/" 0 11 5 || DIE=1 "ftp://ftp.gnu.org/pub/gnu/gettext/" 0 17 || DIE=1
version_check "libtoolize" "libtoolize libtoolize15 glibtoolize" \ version_check "libtoolize" "libtoolize libtoolize15 glibtoolize" \
"ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1 "ftp://ftp.gnu.org/pub/gnu/libtool/" 1 5 0 || DIE=1
version_check "pkg-config" "" \ version_check "pkg-config" "" \
@ -61,43 +65,47 @@ fi
toplevel_check $srcfile toplevel_check $srcfile
tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS" # autopoint
# older autopoint (< 0.12) has a tendency to complain about mkinstalldirs
if test -x mkinstalldirs; then rm mkinstalldirs; fi
# first remove patch if necessary, then run autopoint, then reapply
if test -f po/Makefile.in.in;
then
patch -p0 -R --forward < common/gettext.patch
fi
tool_run "$autopoint" "--force" "patch -p0 < common/gettext.patch"
patch -p0 < common/gettext.patch
# aclocal
# if test -f acinclude.m4; then rm acinclude.m4; fi
tool_run "$libtoolize" "--copy --force" tool_run "$libtoolize" "--copy --force"
tool_run "$aclocal" "-I m4 -I common/m4 $ACLOCAL_FLAGS"
tool_run "$autoheader" tool_run "$autoheader"
# touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo # touch the stamp-h.in build stamp so we don't re-run autoheader in maintainer mode -- wingo
echo timestamp > stamp-h.in 2> /dev/null echo timestamp > stamp-h.in 2> /dev/null
tool_run "$autoconf" tool_run "$autoconf"
tool_run "$automake" "-a -c" debug "automake: $automake"
tool_run "$automake" "--add-missing --copy"
# if enable exists, add an -enable option for each of the lines in that file
if test -f enable; then
for a in `cat enable`; do
CONFIGURE_FILE_OPT="--enable-$a"
done
fi
# if disable exists, add an -disable option for each of the lines in that file
if test -f disable; then
for a in `cat disable`; do
CONFIGURE_FILE_OPT="$CONFIGURE_FILE_OPT --disable-$a"
done
fi
test -n "$NOCONFIGURE" && { test -n "$NOCONFIGURE" && {
echo "+ skipping configure stage for package $package, as requested." echo "skipping configure stage for package $package, as requested."
echo "+ autogen.sh done." echo "autogen.sh done."
exit 0 exit 0
} }
echo "+ running configure ... " echo "+ running configure ... "
test ! -z "$CONFIGURE_DEF_OPT" && echo " ./configure default flags: $CONFIGURE_DEF_OPT" test ! -z "$CONFIGURE_DEF_OPT" && echo " ./configure default flags: $CONFIGURE_DEF_OPT"
test ! -z "$CONFIGURE_EXT_OPT" && echo " ./configure external flags: $CONFIGURE_EXT_OPT" test ! -z "$CONFIGURE_EXT_OPT" && echo " ./configure external flags: $CONFIGURE_EXT_OPT"
test ! -z "$CONFIGURE_FILE_OPT" && echo " ./configure enable/disable flags: $CONFIGURE_FILE_OPT"
echo echo
./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT $CONFIGURE_FILE_OPT || { echo ./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT
./configure $CONFIGURE_DEF_OPT $CONFIGURE_EXT_OPT || {
echo " configure failed" echo " configure failed"
exit 1 exit 1
} }
echo "Now type 'make' to compile $package."

File diff suppressed because it is too large Load diff

View file

@ -1,15 +0,0 @@
SUBDIRS = m4
EXTRA_DIST = \
ChangeLog \
gettext.patch \
glib-gen.mak gtk-doc.mak upload.mak release.mak \
gst-autogen.sh \
c-to-xml.py gst-xmlinspect.py mangle-tmpl.py scangobj-merge.py \
gtk-doc-plugins.mak \
plugins.xsl gstdoc-scangobj \
gst.supp check.mak \
coverage/lcov.mak \
coverage/coverage-report.pl \
coverage/coverage-report.xsl \
coverage/coverage-report-entry.pl

View file

@ -1,34 +0,0 @@
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
"""
Convert a C program to valid XML to be included in docbook
"""
import sys
import os
from xml.sax import saxutils
def main():
if len(sys.argv) == 1:
sys.stderr.write("Please specify a source file to convert")
sys.exit(1)
source = sys.argv[1]
if not os.path.exists(source):
sys.stderr.write("%s does not exist.\n" % source)
sys.exit(1)
content = open(source, "r").read()
# print header
print '<?xml version="1.0"?>'
print '<!DOCTYPE refentry PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd">'
print
print '<programlisting>'
# print content
print saxutils.escape(content).encode('UTF-8')
print '</programlisting>'
main()

View file

@ -1,149 +0,0 @@
clean-local-check:
for i in `find . -name ".libs" -type d`; do \
rm -rf $$i; \
done
if HAVE_VALGRIND
# hangs spectacularly on some machines, so let's not do this by default yet
check-valgrind:
make valgrind
else
check-valgrind:
@true
endif
LOOPS = 10
# run any given test by running make test.check
# if the test fails, run it again at at least debug level 2
%.check: %
@$(TESTS_ENVIRONMENT) \
CK_DEFAULT_TIMEOUT=20 \
$* || \
$(TESTS_ENVIRONMENT) \
GST_DEBUG=$$GST_DEBUG,*:2 \
CK_DEFAULT_TIMEOUT=20 \
$*
# run any given test in a loop
%.torture: %
@for i in `seq 1 $(LOOPS)`; do \
$(TESTS_ENVIRONMENT) \
CK_DEFAULT_TIMEOUT=20 \
$*; done
# run any given test in an infinite loop
%.forever: %
@while true; do \
$(TESTS_ENVIRONMENT) \
CK_DEFAULT_TIMEOUT=20 \
$* || break; done
# valgrind any given test by running make test.valgrind
%.valgrind: %
$(TESTS_ENVIRONMENT) \
CK_DEFAULT_TIMEOUT=360 \
G_SLICE=always-malloc \
libtool --mode=execute \
$(VALGRIND_PATH) -q \
$(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \
--tool=memcheck --leak-check=full --trace-children=yes \
--leak-resolution=high --num-callers=20 \
./$* 2>&1 | tee valgrind.log
@if grep "==" valgrind.log > /dev/null 2>&1; then \
rm valgrind.log; \
exit 1; \
fi
@rm valgrind.log
# valgrind any given test and generate suppressions for it
%.valgrind.gen-suppressions: %
$(TESTS_ENVIRONMENT) \
CK_DEFAULT_TIMEOUT=360 \
G_SLICE=always-malloc \
libtool --mode=execute \
$(VALGRIND_PATH) -q \
$(foreach s,$(SUPPRESSIONS),--suppressions=$(s)) \
--tool=memcheck --leak-check=full --trace-children=yes \
--leak-resolution=high --num-callers=20 \
--gen-suppressions=all \
./$* 2>&1 | tee suppressions.log
# valgrind any given test until failure by running make test.valgrind-forever
%.valgrind-forever: %
@while make $*.valgrind; do \
true; done
# gdb any given test by running make test.gdb
%.gdb: %
$(TESTS_ENVIRONMENT) \
CK_FORK=no \
libtool --mode=execute \
gdb $*
# torture tests
torture: $(TESTS)
-rm test-registry.xml
@echo "Torturing tests ..."
for i in `seq 1 $(LOOPS)`; do \
make check || \
(echo "Failure after $$i runs"; exit 1) || \
exit 1; \
done
@banner="All $(LOOPS) loops passed"; \
dashes=`echo "$$banner" | sed s/./=/g`; \
echo $$dashes; echo $$banner; echo $$dashes
# forever tests
forever: $(TESTS)
-rm test-registry.xml
@echo "Forever tests ..."
while true; do \
make check || \
(echo "Failure"; exit 1) || \
exit 1; \
done
# valgrind all tests
valgrind: $(TESTS)
@echo "Valgrinding tests ..."
@failed=0; \
for t in $(filter-out $(VALGRIND_TESTS_DISABLE),$(TESTS)); do \
make $$t.valgrind; \
if test "$$?" -ne 0; then \
echo "Valgrind error for test $$t"; \
failed=`expr $$failed + 1`; \
whicht="$$whicht $$t"; \
fi; \
done; \
if test "$$failed" -ne 0; then \
echo "$$failed tests had leaks or errors under valgrind:"; \
echo "$$whicht"; \
false; \
fi
# inspect every plugin feature
GST_INSPECT = $(GST_TOOLS_DIR)/gst-inspect-$(GST_MAJORMINOR)
inspect:
@echo "Inspecting features ..."
for e in `$(TESTS_ENVIRONMENT) $(GST_INSPECT) | head -n -2 \
| cut -d: -f2`; \
do echo Inspecting $$e; \
$(GST_INSPECT) $$e > /dev/null 2>&1; done
help:
@echo "make check -- run all checks"
@echo "make torture -- run all checks $(LOOPS) times"
@echo "make (dir)/(test).check -- run the given check once"
@echo "make (dir)/(test).forever -- run the given check forever"
@echo "make (dir)/(test).torture -- run the given check $(LOOPS) times"
@echo
@echo "make (dir)/(test).gdb -- start up gdb for the given test"
@echo
@echo "make valgrind -- valgrind all tests"
@echo "make (dir)/(test).valgrind -- valgrind the given test"
@echo "make (dir)/(test).valgrind-forever -- valgrind the given test forever"
@echo "make (dir)/(test).valgrind.gen-suppressions -- generate suppressions"
@echo " and save to suppressions.log"
@echo "make inspect -- inspect all plugin features"

View file

@ -1,70 +0,0 @@
#!/usr/bin/perl
#
# Copyright (C) 2006 Daniel Berrange
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
print <<EOF;
<html>
<head>
<title>Coverage report for $ARGV[0]</title>
<style type="text/css">
span.perfect {
background: rgb(0,255,0);
}
span.terrible {
background: rgb(255,0,0);
}
</style>
</head>
<body>
<h1>Coverage report for $ARGV[0]</h1>
<pre>
EOF
while (<>) {
s/&/&amp;/g;
s/</&lt;/g;
s/>/&gt;/g;
if (/^\s*function (\S+) called (\d+) returned \d+% blocks executed \d+%/) {
my $class = $2 > 0 ? "perfect" : "terrible";
$_ = "<span class=\"$class\" id=\"" . $1 . "\">$_</span>";
} elsif (/^\s*branch\s+\d+\s+taken\s+(\d+)%\s+.*$/) {
my $class = $1 > 0 ? "perfect" : "terrible";
$_ = "<span class=\"$class\">$_</span>";
} elsif (/^\s*branch\s+\d+\s+never executed.*$/) {
my $class = "terrible";
$_ = "<span class=\"$class\">$_</span>";
} elsif (/^\s*call\s+\d+\s+never executed.*$/) {
my $class = "terrible";
$_ = "<span class=\"$class\">$_</span>";
} elsif (/^\s*call\s+\d+\s+returned\s+(\d+)%.*$/) {
my $class = $1 > 0 ? "perfect" : "terrible";
$_ = "<span class=\"$class\">$_</span>";
}
print;
}
print <<EOF;
</pre>
</body>
</html>
EOF

View file

@ -1,125 +0,0 @@
#!/usr/bin/perl
#
# Copyright (C) 2006 Daniel Berrange
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
use warnings;
use strict;
my %coverage = ( functions => {}, files => {} );
my %filemap;
my $type;
my $name;
my @functions;
while (<>) {
if (/^Function '(.*)'\s*$/) {
$type = "function";
$name = $1;
$coverage{$type}->{$name} = {};
push @functions, $name;
} elsif (/^File '(.*?)'\s*$/) {
$type = "file";
$name = $1;
$coverage{$type}->{$name} = {};
foreach my $func (@functions) {
$coverage{"function"}->{$func}->{file} = $name;
}
@functions = ();
} elsif (/^Lines executed:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{lines} = $2;
$coverage{$type}->{$name}->{linesCoverage} = $1;
} elsif (/^Branches executed:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{branches} = $2;
$coverage{$type}->{$name}->{branchesCoverage} = $1;
} elsif (/^Taken at least once:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{conds} = $2;
$coverage{$type}->{$name}->{condsCoverage} = $1;
} elsif (/^Calls executed:(.*)%\s*of\s*(\d+)\s*$/) {
$coverage{$type}->{$name}->{calls} = $2;
$coverage{$type}->{$name}->{callsCoverage} = $1;
} elsif (/^No branches$/) {
$coverage{$type}->{$name}->{branches} = 0;
$coverage{$type}->{$name}->{branchesCoverage} = "100.00";
$coverage{$type}->{$name}->{conds} = 0;
$coverage{$type}->{$name}->{condsCoverage} = "100.00";
} elsif (/^No calls$/) {
$coverage{$type}->{$name}->{calls} = 0;
$coverage{$type}->{$name}->{callsCoverage} = "100.00";
} elsif (/^\s*(.*):creating '(.*)'\s*$/) {
$filemap{$1} = $2;
} elsif (/^\s*$/) {
# nada
} else {
warn "Shit [$_]\n";
}
}
my %summary;
foreach my $type ("function", "file") {
$summary{$type} = {};
foreach my $m ("lines", "branches", "conds", "calls") {
my $totalGot = 0;
my $totalMiss = 0;
my $count = 0;
foreach my $func (keys %{$coverage{function}}) {
$count++;
my $got = $coverage{function}->{$func}->{$m};
$totalGot += $got;
my $miss = $got * $coverage{function}->{$func}->{$m ."Coverage"} / 100;
$totalMiss += $miss;
}
$summary{$type}->{$m} = sprintf("%d", $totalGot);
$summary{$type}->{$m . "Coverage"} = sprintf("%.2f", $totalMiss / $totalGot * 100);
}
}
print "<coverage>\n";
foreach my $type ("function", "file") {
printf "<%ss>\n", $type;
foreach my $name (sort { $a cmp $b } keys %{$coverage{$type}}) {
my $rec = $coverage{$type}->{$name};
printf " <entry name=\"%s\" details=\"%s\">\n", $name, ($type eq "file" ? $filemap{$name} : $filemap{$rec->{file}});
printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $rec->{lines}, $rec->{linesCoverage};
if (exists $rec->{branches}) {
printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $rec->{branches}, $rec->{branchesCoverage};
}
if (exists $rec->{conds}) {
printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $rec->{conds}, $rec->{condsCoverage};
}
if (exists $rec->{calls}) {
printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $rec->{calls}, $rec->{callsCoverage};
}
print " </entry>\n";
}
printf " <summary>\n";
printf " <lines count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{lines}, $summary{$type}->{linesCoverage};
printf " <branches count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{branches}, $summary{$type}->{branchesCoverage};
printf " <conditions count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{conds}, $summary{$type}->{condsCoverage};
printf " <calls count=\"%s\" coverage=\"%s\"/>\n", $summary{$type}->{calls}, $summary{$type}->{callsCoverage};
printf " </summary>\n";
printf "</%ss>\n", $type;
}
print "</coverage>\n";

View file

@ -1,235 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
#
# Copyright (C) 2006 Daniel Berrange
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output method="html"/>
<xsl:template match="coverage">
<html>
<head>
<title>Coverage report</title>
<style type="text/css">
tbody tr.odd td.label {
border-top: 1px solid rgb(128,128,128);
border-bottom: 1px solid rgb(128,128,128);
}
tbody tr.odd td.label {
background: rgb(200,200,200);
}
thead, tfoot {
background: rgb(60,60,60);
color: white;
font-weight: bold;
}
tr td.perfect {
background: rgb(0,255,0);
color: black;
}
tr td.excellant {
background: rgb(140,255,140);
color: black;
}
tr td.good {
background: rgb(160,255,0);
color: black;
}
tr td.poor {
background: rgb(255,160,0);
color: black;
}
tr td.bad {
background: rgb(255,140,140);
color: black;
}
tr td.terrible {
background: rgb(255,0,0);
color: black;
}
</style>
</head>
<body>
<h1>Coverage report</h1>
<xsl:apply-templates/>
</body>
</html>
</xsl:template>
<xsl:template match="functions">
<h2>Function coverage</h2>
<xsl:call-template name="content">
<xsl:with-param name="type" select="'function'"/>
</xsl:call-template>
</xsl:template>
<xsl:template match="files">
<h2>File coverage</h2>
<xsl:call-template name="content">
<xsl:with-param name="type" select="'file'"/>
</xsl:call-template>
</xsl:template>
<xsl:template name="content">
<xsl:param name="type"/>
<table>
<thead>
<tr>
<th>Name</th>
<th>Lines</th>
<th>Branches</th>
<th>Conditions</th>
<th>Calls</th>
</tr>
</thead>
<tbody>
<xsl:for-each select="entry">
<xsl:call-template name="entry">
<xsl:with-param name="type" select="$type"/>
<xsl:with-param name="class">
<xsl:choose>
<xsl:when test="position() mod 2">
<xsl:text>odd</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>even</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</tbody>
<tfoot>
<xsl:for-each select="summary">
<xsl:call-template name="entry">
<xsl:with-param name="type" select="'summary'"/>
<xsl:with-param name="class">
<xsl:choose>
<xsl:when test="position() mod 2">
<xsl:text>odd</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>even</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
</xsl:call-template>
</xsl:for-each>
</tfoot>
</table>
</xsl:template>
<xsl:template name="entry">
<xsl:param name="type"/>
<xsl:param name="class"/>
<tr class="{$class}">
<xsl:choose>
<xsl:when test="$type = 'function'">
<td class="label"><a href="{@details}.html#{@name}"><xsl:value-of select="@name"/></a></td>
</xsl:when>
<xsl:when test="$type = 'file'">
<td class="label"><a href="{@details}.html"><xsl:value-of select="@name"/></a></td>
</xsl:when>
<xsl:otherwise>
<td class="label">Summary</td>
</xsl:otherwise>
</xsl:choose>
<xsl:if test="count(lines)">
<xsl:apply-templates select="lines"/>
</xsl:if>
<xsl:if test="not(count(lines))">
<xsl:call-template name="missing"/>
</xsl:if>
<xsl:if test="count(branches)">
<xsl:apply-templates select="branches"/>
</xsl:if>
<xsl:if test="not(count(branches))">
<xsl:call-template name="missing"/>
</xsl:if>
<xsl:if test="count(conditions)">
<xsl:apply-templates select="conditions"/>
</xsl:if>
<xsl:if test="not(count(conditions))">
<xsl:call-template name="missing"/>
</xsl:if>
<xsl:if test="count(calls)">
<xsl:apply-templates select="calls"/>
</xsl:if>
<xsl:if test="not(count(calls))">
<xsl:call-template name="missing"/>
</xsl:if>
</tr>
</xsl:template>
<xsl:template match="lines">
<xsl:call-template name="row"/>
</xsl:template>
<xsl:template match="branches">
<xsl:call-template name="row"/>
</xsl:template>
<xsl:template match="conditions">
<xsl:call-template name="row"/>
</xsl:template>
<xsl:template match="calls">
<xsl:call-template name="row"/>
</xsl:template>
<xsl:template name="missing">
<td></td>
</xsl:template>
<xsl:template name="row">
<xsl:variable name="quality">
<xsl:choose>
<xsl:when test="@coverage = 100">
<xsl:text>perfect</xsl:text>
</xsl:when>
<xsl:when test="@coverage >= 80.0">
<xsl:text>excellant</xsl:text>
</xsl:when>
<xsl:when test="@coverage >= 60.0">
<xsl:text>good</xsl:text>
</xsl:when>
<xsl:when test="@coverage >= 40.0">
<xsl:text>poor</xsl:text>
</xsl:when>
<xsl:when test="@coverage >= 20.0">
<xsl:text>bad</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:text>terrible</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<td class="{$quality}"><xsl:value-of select="@coverage"/>% of <xsl:value-of select="@count"/></td>
</xsl:template>
</xsl:stylesheet>

View file

@ -1,29 +0,0 @@
# run lcov from scratch, always
lcov-reset:
make lcov-run
make lcov-report
# run lcov from scratch if the dir is not there
lcov:
make lcov-reset
# reset run coverage tests
lcov-run:
@-rm -rf lcov
find . -name "*.gcda" -exec rm {} \;
if test -d tests/check; then make -C tests/check inspect; fi
make check
# generate report based on current coverage data
lcov-report:
mkdir lcov
lcov --directory . --capture --output-file lcov/lcov.info
lcov -l lcov/lcov.info | grep -v "`cd $(top_srcdir) && pwd`" | cut -d: -f1 > lcov/remove
lcov -l lcov/lcov.info | grep "tests/check/" | cut -d: -f1 >> lcov/remove
lcov -r lcov/lcov.info `cat lcov/remove` > lcov/lcov.cleaned.info
rm lcov/remove
mv lcov/lcov.cleaned.info lcov/lcov.info
genhtml -t "$(PACKAGE_STRING)" -o lcov lcov/lcov.info
lcov-upload: lcov
rsync -rvz -e ssh --delete lcov/* gstreamer.freedesktop.org:/srv/gstreamer.freedesktop.org/www/data/coverage/lcov/$(PACKAGE)

View file

@ -1,23 +0,0 @@
--- po/Makefile.in.in.orig 2006-01-07 12:03:45.000000000 +0100
+++ po/Makefile.in.in 2006-01-07 12:04:23.000000000 +0100
@@ -11,6 +11,9 @@
PACKAGE = @PACKAGE@
VERSION = @VERSION@
+# thomas: add GETTEXT_PACKAGE substitution as used in Makevars
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+
SHELL = /bin/sh
@SET_MAKE@
@@ -305,7 +308,9 @@
update-gmo: Makefile $(GMOFILES)
@:
-Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in
+# thomas: add LINGUAS as a dependency so that the Makefile gets rebuilt
+# properly when we add languages
+Makefile: Makefile.in.in $(top_builddir)/config.status POTFILES.in LINGUAS
cd $(top_builddir) \
&& CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \
$(SHELL) ./config.status

View file

@ -1,42 +0,0 @@
# these are the variables your Makefile.am should set
# the example is based on the colorbalance interface
#glib_enum_headers=$(colorbalance_headers)
#glib_enum_define=GST_COLOR_BALANCE
#glib_enum_prefix=gst_color_balance
# these are all the rules generating the relevant files
%-marshal.h: %-marshal.list
glib-genmarshal --header --prefix=$(glib_enum_prefix)_marshal $^ > $*-marshal.h.tmp
mv $*-marshal.h.tmp $*-marshal.h
%-marshal.c: %-marshal.list
echo "#include \"$*-marshal.h\"" >> $*-marshal.c.tmp
glib-genmarshal --body --prefix=$(glib_enum_prefix)_marshal $^ >> $*-marshal.c.tmp
mv $*-marshal.c.tmp $*-marshal.c
%-enumtypes.h: $(glib_enum_headers)
glib-mkenums \
--fhead "#ifndef __$(glib_enum_define)_ENUM_TYPES_H__\n#define __$(glib_enum_define)_ENUM_TYPES_H__\n\n#include <glib-object.h>\n\nG_BEGIN_DECLS\n" \
--fprod "\n/* enumerations from \"@filename@\" */\n" \
--vhead "GType @enum_name@_get_type (void);\n#define GST_TYPE_@ENUMSHORT@ (@enum_name@_get_type())\n" \
--ftail "G_END_DECLS\n\n#endif /* __$(glib_enum_define)_ENUM_TYPES_H__ */" \
$^ > $@
%-enumtypes.c: $(glib_enum_headers)
@if test "x$(glib_enum_headers)" == "x"; then echo "ERROR: glib_enum_headers is empty, please fix Makefile"; exit 1; fi
glib-mkenums \
--fhead "#include <$*.h>" \
--fprod "\n/* enumerations from \"@filename@\" */" \
--vhead "GType\n@enum_name@_get_type (void)\n{\n static GType etype = 0;\n if (etype == 0) {\n static const G@Type@Value values[] = {" \
--vprod " { @VALUENAME@, \"@VALUENAME@\", \"@valuenick@\" }," \
--vtail " { 0, NULL, NULL }\n };\n etype = g_@type@_register_static (\"@EnumName@\", values);\n }\n return etype;\n}\n" \
$^ > $@
# a hack rule to make sure .Plo files exist because they get include'd
# from Makefile's
.deps/%-marshal.Plo:
touch $@
.deps/%-enumtypes.Plo:
touch $@

View file

@ -1,308 +0,0 @@
# a silly hack that generates autoregen.sh but it's handy
# Remove the old autoregen.sh first to create a new file,
# as the current one may be being read by the shell executing
# this script.
if [ -f "autoregen.sh" ]; then
rm autoregen.sh
fi
echo "#!/bin/sh" > autoregen.sh
echo "./autogen.sh $@ \$@" >> autoregen.sh
chmod +x autoregen.sh
# helper functions for autogen.sh
debug ()
# print out a debug message if DEBUG is a defined variable
{
if test ! -z "$DEBUG"
then
echo "DEBUG: $1"
fi
}
version_check ()
# check the version of a package
# first argument : package name (executable)
# second argument : optional path where to look for it instead
# third argument : source download url
# rest of arguments : major, minor, micro version
# all consecutive ones : suggestions for binaries to use
# (if not specified in second argument)
{
PACKAGE=$1
PKG_PATH=$2
URL=$3
MAJOR=$4
MINOR=$5
MICRO=$6
# for backwards compatibility, we let PKG_PATH=PACKAGE when PKG_PATH null
if test -z "$PKG_PATH"; then PKG_PATH=$PACKAGE; fi
debug "major $MAJOR minor $MINOR micro $MICRO"
VERSION=$MAJOR
if test ! -z "$MINOR"; then VERSION=$VERSION.$MINOR; else MINOR=0; fi
if test ! -z "$MICRO"; then VERSION=$VERSION.$MICRO; else MICRO=0; fi
debug "major $MAJOR minor $MINOR micro $MICRO"
for SUGGESTION in $PKG_PATH; do
COMMAND="$SUGGESTION"
# don't check if asked not to
test -z "$NOCHECK" && {
echo -n " checking for $COMMAND >= $VERSION ... "
} || {
# we set a var with the same name as the package, but stripped of
# unwanted chars
VAR=`echo $PACKAGE | sed 's/-//g'`
debug "setting $VAR"
eval $VAR="$COMMAND"
return 0
}
debug "checking version with $COMMAND"
($COMMAND --version) < /dev/null > /dev/null 2>&1 ||
{
echo "not found."
continue
}
# strip everything that's not a digit, then use cut to get the first field
pkg_version=`$COMMAND --version|head -n 1|sed 's/^.*)[^0-9]*//'|cut -d' ' -f1`
debug "pkg_version $pkg_version"
# remove any non-digit characters from the version numbers to permit numeric
# comparison
pkg_major=`echo $pkg_version | cut -d. -f1 | sed s/[a-zA-Z\-].*//g`
pkg_minor=`echo $pkg_version | cut -d. -f2 | sed s/[a-zA-Z\-].*//g`
pkg_micro=`echo $pkg_version | cut -d. -f3 | sed s/[a-zA-Z\-].*//g`
test -z "$pkg_major" && pkg_major=0
test -z "$pkg_minor" && pkg_minor=0
test -z "$pkg_micro" && pkg_micro=0
debug "found major $pkg_major minor $pkg_minor micro $pkg_micro"
#start checking the version
debug "version check"
# reset check
WRONG=
if [ ! "$pkg_major" -gt "$MAJOR" ]; then
debug "major: $pkg_major <= $MAJOR"
if [ "$pkg_major" -lt "$MAJOR" ]; then
debug "major: $pkg_major < $MAJOR"
WRONG=1
elif [ ! "$pkg_minor" -gt "$MINOR" ]; then
debug "minor: $pkg_minor <= $MINOR"
if [ "$pkg_minor" -lt "$MINOR" ]; then
debug "minor: $pkg_minor < $MINOR"
WRONG=1
elif [ "$pkg_micro" -lt "$MICRO" ]; then
debug "micro: $pkg_micro < $MICRO"
WRONG=1
fi
fi
fi
if test ! -z "$WRONG"; then
echo "found $pkg_version, not ok !"
continue
else
echo "found $pkg_version, ok."
# we set a var with the same name as the package, but stripped of
# unwanted chars
VAR=`echo $PACKAGE | sed 's/-//g'`
debug "setting $VAR"
eval $VAR="$COMMAND"
return 0
fi
done
echo "not found !"
echo "You must have $PACKAGE installed to compile $package."
echo "Download the appropriate package for your distribution,"
echo "or get the source tarball at $URL"
return 1;
}
aclocal_check ()
{
# normally aclocal is part of automake
# so we expect it to be in the same place as automake
# so if a different automake is supplied, we need to adapt as well
# so how's about replacing automake with aclocal in the set var,
# and saving that in $aclocal ?
# note, this will fail if the actual automake isn't called automake*
# or if part of the path before it contains it
if [ -z "$automake" ]; then
echo "Error: no automake variable set !"
return 1
else
aclocal=`echo $automake | sed s/automake/aclocal/`
debug "aclocal: $aclocal"
if [ "$aclocal" != "aclocal" ];
then
CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-aclocal=$aclocal"
fi
if [ ! -x `which $aclocal` ]; then
echo "Error: cannot execute $aclocal !"
return 1
fi
fi
}
autoheader_check ()
{
# same here - autoheader is part of autoconf
# use the same voodoo
if [ -z "$autoconf" ]; then
echo "Error: no autoconf variable set !"
return 1
else
autoheader=`echo $autoconf | sed s/autoconf/autoheader/`
debug "autoheader: $autoheader"
if [ "$autoheader" != "autoheader" ];
then
CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoheader=$autoheader"
fi
if [ ! -x `which $autoheader` ]; then
echo "Error: cannot execute $autoheader !"
return 1
fi
fi
}
autoconf_2_52d_check ()
{
# autoconf 2.52d has a weird issue involving a yes:no error
# so don't allow it's use
test -z "$NOCHECK" && {
ac_version=`$autoconf --version|head -n 1|sed 's/^[a-zA-Z\.\ ()]*//;s/ .*$//'`
if test "$ac_version" = "2.52d"; then
echo "autoconf 2.52d has an issue with our current build."
echo "We don't know who's to blame however. So until we do, get a"
echo "regular version. RPM's of a working version are on the gstreamer site."
exit 1
fi
}
return 0
}
die_check ()
{
# call with $DIE
# if set to 1, we need to print something helpful then die
DIE=$1
if test "x$DIE" = "x1";
then
echo
echo "- Please get the right tools before proceeding."
echo "- Alternatively, if you're sure we're wrong, run with --nocheck."
exit 1
fi
}
autogen_options ()
{
if test "x$1" = "x"; then
return 0
fi
while test "x$1" != "x" ; do
optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
case "$1" in
--noconfigure)
NOCONFIGURE=defined
AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --noconfigure"
echo "+ configure run disabled"
shift
;;
--nocheck)
AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --nocheck"
NOCHECK=defined
echo "+ autotools version check disabled"
shift
;;
--debug)
DEBUG=defined
AUTOGEN_EXT_OPT="$AUTOGEN_EXT_OPT --debug"
echo "+ debug output enabled"
shift
;;
--prefix=*)
CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$optarg"
echo "+ passing --prefix=$optarg to configure"
shift
;;
--prefix)
shift
echo "DEBUG: $1"
CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT --prefix=$1"
echo "+ passing --prefix=$1 to configure"
shift
;;
-h|--help)
echo "autogen.sh (autogen options) -- (configure options)"
echo "autogen.sh help options: "
echo " --noconfigure don't run the configure script"
echo " --nocheck don't do version checks"
echo " --debug debug the autogen process"
echo " --prefix will be passed on to configure"
echo
echo " --with-autoconf PATH use autoconf in PATH"
echo " --with-automake PATH use automake in PATH"
echo
echo "to pass options to configure, put them as arguments after -- "
exit 1
;;
--with-automake=*)
AUTOMAKE=$optarg
echo "+ using alternate automake in $optarg"
CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-automake=$AUTOMAKE"
shift
;;
--with-autoconf=*)
AUTOCONF=$optarg
echo "+ using alternate autoconf in $optarg"
CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-autoconf=$AUTOCONF"
shift
;;
--disable*|--enable*|--with*)
echo "+ passing option $1 to configure"
CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $1"
shift
;;
--) shift ; break ;;
*) echo "- ignoring unknown autogen.sh argument $1"; shift ;;
esac
done
for arg do CONFIGURE_EXT_OPT="$CONFIGURE_EXT_OPT $arg"; done
if test ! -z "$CONFIGURE_EXT_OPT"
then
echo "+ options passed to configure: $CONFIGURE_EXT_OPT"
fi
}
toplevel_check ()
{
srcfile=$1
test -f $srcfile || {
echo "You must run this script in the top-level $package directory"
exit 1
}
}
tool_run ()
{
tool=$1
options=$2
run_if_fail=$3
echo "+ running $tool $options..."
$tool $options || {
echo
echo $tool failed
eval $run_if_fail
exit 1
}
}

View file

@ -1,168 +0,0 @@
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
"""
examine all plugins and elements and output xml documentation for them
used as part of the plugin documentation build
"""
import sys
import os
import pygst
pygst.require('0.10')
import gst
INDENT_SIZE = 2
# all templates
PAD_TEMPLATE = """<caps>
<name>%(name)s</name>
<direction>%(direction)s</direction>
<presence>%(presence)s</presence>
<details>%(details)s</details>
</caps>"""
ELEMENT_TEMPLATE = """<element>
<name>%(name)s</name>
<longname>%(longname)s</longname>
<class>%(class)s</class>
<description>%(description)s</description>
<author>%(author)s</author>
<pads>
%(pads)s
</pads>
</element>"""
PLUGIN_TEMPLATE = """<plugin>
<name>%(name)s</name>
<description>%(description)s</description>
<filename>%(filename)s</filename>
<basename>%(basename)s</basename>
<version>%(version)s</version>
<license>%(license)s</license>
<source>%(source)s</source>
<package>%(package)s</package>
<origin>%(origin)s</origin>
<elements>
%(elements)s
</elements>
</plugin>"""
def xmlencode(line):
"""
Replace &, <, and >
"""
line = "&amp;".join(line.split("&"))
line = "&lt;".join(line.split("<"))
line = "&gt;".join(line.split(">"))
return line
def get_offset(indent):
return " " * INDENT_SIZE * indent
def output_pad_template(pt, indent=0):
print "PAD TEMPLATE", pt.name_template
paddir = ("unknown","source","sink")
padpres = ("always","sometimes","request")
d = {
'name': xmlencode(pt.name_template),
'direction': xmlencode(paddir[pt.direction]),
'presence': xmlencode(padpres[pt.presence]),
'details': xmlencode(pt.static_caps.string),
}
block = PAD_TEMPLATE % d
offset = get_offset(indent)
return offset + ("\n" + offset).join(block.split("\n"))
def output_element_factory(elf, indent=0):
print "ELEMENT", elf.get_name()
padsoutput = []
padtemplates = elf.get_static_pad_templates()
for padtemplate in padtemplates:
padsoutput.append(output_pad_template(padtemplate, indent))
d = {
'name': xmlencode(elf.get_name()),
'longname': xmlencode(elf.get_longname()),
'class': xmlencode(elf.get_klass()),
'description': xmlencode(elf.get_description()),
'author': xmlencode(elf.get_author()),
'pads': "\n".join(padsoutput),
}
block = ELEMENT_TEMPLATE % d
offset = get_offset(indent)
return offset + ("\n" + offset).join(block.split("\n"))
def output_plugin(plugin, indent=0):
print "PLUGIN", plugin.get_name()
version = plugin.get_version()
elements = {}
gst.debug('getting features for plugin %s' % plugin.get_name())
registry = gst.registry_get_default()
features = registry.get_feature_list_by_plugin(plugin.get_name())
gst.debug('plugin %s has %d features' % (plugin.get_name(), len(features)))
for feature in features:
if isinstance(feature, gst.ElementFactory):
elements[feature.get_name()] = feature
#gst.debug("got features")
elementsoutput = []
keys = elements.keys()
keys.sort()
for name in keys:
feature = elements[name]
elementsoutput.append(output_element_factory(feature, indent + 2))
filename = plugin.get_filename()
basename = filename
if basename:
basename = os.path.basename(basename)
d = {
'name': xmlencode(plugin.get_name()),
'description': xmlencode(plugin.get_description()),
'filename': filename,
'basename': basename,
'version': version,
'license': xmlencode(plugin.get_license()),
'source': xmlencode(plugin.get_source()),
'package': xmlencode(plugin.get_package()),
'origin': xmlencode(plugin.get_origin()),
'elements': "\n".join(elementsoutput),
}
block = PLUGIN_TEMPLATE % d
offset = get_offset(indent)
return offset + ("\n" + offset).join(block.split("\n"))
def main():
if len(sys.argv) == 1:
sys.stderr.write("Please specify a source module to inspect")
sys.exit(1)
source = sys.argv[1]
if len(sys.argv) > 2:
os.chdir(sys.argv[2])
registry = gst.registry_get_default()
all = registry.get_plugin_list()
for plugin in all:
gst.debug("inspecting plugin %s from source %s" % (
plugin.get_name(), plugin.get_source()))
# this skips gstcoreelements, with bin and pipeline
if plugin.get_filename() is None:
continue
if plugin.get_source() != source:
continue
filename = "plugin-%s.xml" % plugin.get_name()
handle = open(filename, "w")
handle.write(output_plugin(plugin))
handle.close()
main()

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -1,358 +0,0 @@
# This is an include file specifically tuned for building documentation
# for GStreamer plug-ins
help:
@echo "If you are a doc maintainer, run 'make update' to update"
@echo "the documentation files maintained in CVS"
# update the stuff maintained by doc maintainers
update:
make inspect-update
make scanobj-update
# We set GPATH here; this gives us semantics for GNU make
# which are more like other make's VPATH, when it comes to
# whether a source that is a target of one rule is then
# searched for in VPATH/GPATH.
#
GPATH = $(srcdir)
# thomas: make docs parallel installable
TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@
EXTRA_DIST = \
scanobj-build.stamp \
$(srcdir)/inspect/*.xml \
inspect.stamp \
inspect-build.stamp \
$(SCANOBJ_FILES) \
$(content_files) \
$(extra_files) \
$(HTML_IMAGES) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE).types \
$(DOC_OVERRIDES) \
$(DOC_MODULE)-sections.txt
MAINTAINER_DOC_STAMPS = \
scanobj-build.stamp \
inspect-build.stamp \
inspect.stamp
# we don't add inspect-build.stamp and scanobj-build.stamp here since they are
# built manually by docs maintainers and result is commited to CVS
DOC_STAMPS = \
scan-build.stamp \
tmpl-build.stamp \
sgml-build.stamp \
html-build.stamp \
scan.stamp \
tmpl.stamp \
sgml.stamp \
html.stamp
# files generated/updated by gtkdoc-scangobj
SCANOBJ_FILES = \
$(DOC_MODULE).signals \
$(DOC_MODULE).hierarchy \
$(DOC_MODULE).interfaces \
$(DOC_MODULE).prerequisites \
$(DOC_MODULE).args
SCANOBJ_FILES_O = \
.libs/$(DOC_MODULE)-scan.o
# files generated/updated by gtkdoc-scan
SCAN_FILES = \
$(DOC_MODULE)-sections.txt \
$(DOC_MODULE)-overrides.txt \
$(DOC_MODULE)-undocumented.txt \
$(DOC_MODULE)-decl.txt \
$(DOC_MODULE)-decl-list.txt
if ENABLE_GTK_DOC
all-local: html-build.stamp
#### scan gobjects; done by documentation maintainer ####
scanobj-update:
-rm scanobj-build.stamp
make scanobj-build.stamp
# in the case of non-srcdir builds, the built gst directory gets added
# to gtk-doc scanning; but only then, to avoid duplicates
# FIXME: since we don't have the scan step as part of the build anymore,
# we could remove that
# TODO: finish elite script that updates the output files of this step
# instead of rewriting them, so that multiple maintainers can generate
# a collective set of args and signals
scanobj-build.stamp: $(SCANOBJ_DEPS) $(basefiles)
@echo '*** Scanning GObjects ***'
if test x"$(srcdir)" != x. ; then \
for f in $(SCANOBJ_FILES); \
do \
cp $(srcdir)/$$f . ; \
done; \
else \
$(INSPECT_ENVIRONMENT) \
CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \
CFLAGS="-g $(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" \
$(GST_DOC_SCANOBJ) --type-init-func="gst_init(NULL,NULL)" \
--module=$(DOC_MODULE) --source=$(PACKAGE) && \
$(PYTHON) \
$(top_srcdir)/common/scangobj-merge.py $(DOC_MODULE); \
fi
touch scanobj-build.stamp
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(SCANOBJ_FILES_O): scan-build.stamp
@true
### inspect GStreamer plug-ins; done by documentation maintainer ###
# only look at the plugins in this module when building inspect .xml stuff
INSPECT_REGISTRY=$(top_builddir)/docs/plugins/inspect-registry.xml
INSPECT_ENVIRONMENT=\
GST_PLUGIN_SYSTEM_PATH= \
GST_PLUGIN_PATH=$(top_builddir)/gst:$(top_builddir)/sys:$(top_builddir)/ext:$(top_builddir)/plugins:$(top_builddir)/src \
GST_REGISTRY=$(INSPECT_REGISTRY)
# update the element and plugin XML descriptions; store in inspect/
inspect:
mkdir inspect
inspect-update: inspect
-rm $(INSPECT_REGISTRY)
-rm inspect-build.stamp
make inspect-build.stamp
# FIXME: inspect.stamp should be written to by gst-xmlinspect.py
# IFF the output changed; see gtkdoc-mktmpl
inspect-build.stamp:
@echo '*** Rebuilding plugin inspection files ***'
if test x"$(srcdir)" != x. ; then \
cp $(srcdir)/inspect.stamp . ; \
cp $(srcdir)/inspect-build.stamp . ; \
else \
$(INSPECT_ENVIRONMENT) $(PYTHON) \
$(top_srcdir)/common/gst-xmlinspect.py $(PACKAGE) inspect && \
echo -n "timestamp" > inspect.stamp && \
touch inspect-build.stamp; \
fi
### scan headers; done on every build ###
scan-build.stamp: $(HFILE_GLOB) $(EXTRA_HFILES) $(basefiles) scanobj-build.stamp inspect-build.stamp
if test "x$(top_srcdir)" != "x$(top_builddir)" && \
test -d "$(top_builddir)/gst"; \
then \
export BUILT_OPTIONS="--source-dir=$(top_builddir)/gst"; \
fi; \
gtkdoc-scan \
$(SCAN_OPTIONS) $(EXTRA_HFILES) \
--module=$(DOC_MODULE) \
$$BUILT_OPTIONS \
--ignore-headers="$(IGNORE_HFILES)"; \
touch scan-build.stamp
#### update templates; done on every build ####
### FIXME: make this error out again when docs are fixed for 0.9
# in a non-srcdir build, we need to copy files from the previous step
# and the files from previous runs of this step
tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES)
@echo '*** Rebuilding template files ***'
if test x"$(srcdir)" != x. ; then \
for f in $(SCANOBJ_FILES) $(SCAN_FILES); \
do \
if test -e $(srcdir)/$$f; then cp $(srcdir)/$$f . ; fi; \
done; \
fi
gtkdoc-mktmpl --module=$(DOC_MODULE) | tee tmpl-build.log
$(PYTHON) \
$(top_srcdir)/common/mangle-tmpl.py $(srcdir)/inspect tmpl
@cat $(DOC_MODULE)-unused.txt
rm -f tmpl-build.log
touch tmpl-build.stamp
tmpl.stamp: tmpl-build.stamp
@true
#### build xml; done on every build ####
### FIXME: make this error out again when docs are fixed for 0.9
sgml-build.stamp: tmpl.stamp inspect.stamp $(CFILE_GLOB) $(top_srcdir)/common/plugins.xsl
@echo '*** Building XML ***'
@-mkdir -p xml
@for a in $(srcdir)/inspect/*.xml; do \
xsltproc --stringparam module $(MODULE) \
$(top_srcdir)/common/plugins.xsl $$a > xml/`basename $$a`; done
@for f in $(EXAMPLE_CFILES); do \
$(PYTHON) $(top_srcdir)/common/c-to-xml.py $$f > xml/element-`basename $$f .c`.xml; done
gtkdoc-mkdb \
--module=$(DOC_MODULE) \
--source-dir=$(DOC_SOURCE_DIR) \
--main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) \
--output-format=xml \
--ignore-files="$(IGNORE_HFILES) $(IGNORE_CFILES)" \
$(MKDB_OPTIONS) \
| tee sgml-build.log
@if grep "WARNING:" sgml-build.log > /dev/null; then true; fi # exit 1; fi
cp ../version.entities xml
rm sgml-build.log
touch sgml-build.stamp
sgml.stamp: sgml-build.stamp
@true
#### build html; done on every step ####
html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
@echo '*** Building HTML ***'
if test -d html; then rm -rf html; fi
mkdir html
cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html
@for f in $(content_files); do cp $(srcdir)/$$f html; done
cp -pr xml html
cp ../version.entities html
cd html && gtkdoc-mkhtml $(DOC_MODULE) $(DOC_MAIN_SGML_FILE) \
2>&1 | tee ../html-build.log
@if grep "warning:" html-build.log > /dev/null; then \
echo "ERROR"; grep "warning:" html-build.log; exit 1; fi
@rm html-build.log
rm -f html/$(DOC_MAIN_SGML_FILE)
rm -rf html/xml
rm -f html/version.entities
test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \
if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done
@echo '-- Fixing Crossreferences'
gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
touch html-build.stamp
else
all-local:
endif
# FC3 seems to need -scan.c to be part of CLEANFILES for distcheck
# no idea why FC4 can do without
CLEANFILES = \
$(SCANOBJ_FILES_O) \
$(DOC_MODULE)-scan.c \
$(DOC_MODULE)-unused.txt \
$(DOC_STAMPS) \
inspect-registry.xml
# FIXME: these rules need a little cleaning up
clean-local:
rm -f *~ *.bak
rm -rf .libs
# clean files generated for tmpl build
-rm -rf tmpl
# clean files copied/generated for nonsrcdir tmpl build
if test x"$(srcdir)" != x. ; then \
rm -rf $(SCANOBJ_FILES) $(SCAN_FILES); \
fi
# clean files generated for xml build
-rm -rf xml
# clean files generate for html build
-rm -rf html
distclean-local: clean
rm -rf tmpl/*.sgml.bak
rm -f *.stamp || true
rm -rf *.o
# thomas: make docs parallel installable; devhelp requires majorminor too
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to install' ; \
else \
for i in $$installfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
fi; \
echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
echo '-- Installing $(srcdir)/html/index.sgml' ; \
$(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
if test -e $(srcdir)/html/style.css; then \
echo '-- Installing $(srcdir)/html/style.css' ; \
$(INSTALL_DATA) $(srcdir)/html/style.css $(DESTDIR)$(TARGET_DIR); \
fi; \
fi)
uninstall-local:
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to uninstall' ; \
else \
for i in $$installfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
fi; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \
if test -e $(DESTDIR)$(TARGET_DIR)/style.css; then \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/style.css' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/style.css; \
fi; \
fi)
if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) 2>/dev/null; fi; true
#
# Checks
#
check-hierarchy: $(DOC_MODULE).hierarchy
@if grep ' ' $(DOC_MODULE).hierarchy; then \
echo "$(DOC_MODULE).hierarchy contains tabs, please fix"; \
/bin/false; \
fi
check: check-hierarchy
#
# Require gtk-doc when making dist
#
if ENABLE_GTK_DOC
dist-check-gtkdoc:
else
dist-check-gtkdoc:
@echo "*** gtk-doc must be installed and enabled in order to make dist"
@false
endif
# FIXME: decide whether we want to dist generated html or not
dist-hook: dist-check-gtkdoc dist-hook-local
mkdir $(distdir)/tmpl
mkdir $(distdir)/xml
mkdir $(distdir)/html
-cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
-cp $(srcdir)/sgml/*.xml $(distdir)/xml
-cp $(srcdir)/html/index.sgml $(distdir)/html
-cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
-cp $(srcdir)/html/$(DOC_MODULE).devhelp $(distdir)/html
images=$(HTML_IMAGES) ; \
for i in "" $$images ; do \
if test "$$i" != ""; then cp $(srcdir)/$$i $(distdir)/html ; fi; \
done
.PHONY : dist-hook-local

View file

@ -1,260 +0,0 @@
###########################################################################
# Everything below here is generic and you shouldn't need to change it.
###########################################################################
# thomas: except of course that we did
# thomas: copied from glib-2
# We set GPATH here; this gives us semantics for GNU make
# which are more like other make's VPATH, when it comes to
# whether a source that is a target of one rule is then
# searched for in VPATH/GPATH.
#
GPATH = $(srcdir)
# thomas: make docs parallel installable
TARGET_DIR=$(HTML_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@
EXTRA_DIST = \
$(content_files) \
$(extra_files) \
$(HTML_IMAGES) \
$(DOC_MAIN_SGML_FILE) \
$(DOC_MODULE).types \
$(DOC_OVERRIDES) \
$(DOC_MODULE)-sections.txt
DOC_STAMPS = \
scan-build.stamp \
tmpl-build.stamp \
sgml-build.stamp \
html-build.stamp \
$(srcdir)/tmpl.stamp \
$(srcdir)/sgml.stamp \
$(srcdir)/html.stamp
SCANOBJ_FILES = \
$(DOC_MODULE).args \
$(DOC_MODULE).hierarchy \
$(DOC_MODULE).interfaces \
$(DOC_MODULE).prerequisites \
.libs/$(DOC_MODULE)-scan.o \
$(DOC_MODULE).signals
CLEANFILES = $(SCANOBJ_FILES) $(DOC_MODULE)-unused.txt $(DOC_STAMPS)
if ENABLE_GTK_DOC
all-local: html-build.stamp
#### scan ####
# in the case of non-srcdir builds, the built gst directory gets added
# to gtk-doc scanning; but only then, to avoid duplicates
scan-build.stamp: $(HFILE_GLOB) $(SCANOBJ_DEPS) $(basefiles)
@echo '*** Scanning header files ***'
if grep -l '^..*$$' $(srcdir)/$(DOC_MODULE).types > /dev/null; \
then \
if test x"$(srcdir)" != x. ; then \
cp $(srcdir)/$(DOC_MODULE).types . ; \
chmod u+w $(DOC_MODULE).types ; \
fi ; \
GST_PLUGIN_SYSTEM_PATH=`cd $(top_builddir) && pwd` \
GST_PLUGIN_PATH= \
CC="$(GTKDOC_CC)" LD="$(GTKDOC_LD)" \
CFLAGS="$(GTKDOC_CFLAGS)" LDFLAGS="$(GTKDOC_LIBS)" \
gtkdoc-scangobj --type-init-func="gst_init(NULL,NULL)" \
--module=$(DOC_MODULE) ; \
else \
cd $(srcdir) ; \
for i in $(SCANOBJ_FILES) ; do \
test -f $$i || touch $$i ; \
done \
fi
if test "x$(top_srcdir)" != "x$(top_builddir)"; \
then \
export BUILT_OPTIONS="--source-dir=$(DOC_BUILD_DIR)"; \
fi; \
gtkdoc-scan \
$(SCAN_OPTIONS) $(EXTRA_HFILES) \
--module=$(DOC_MODULE) \
--source-dir=$(DOC_SOURCE_DIR) \
$$BUILT_OPTIONS \
--ignore-headers="$(IGNORE_HFILES)"
touch scan-build.stamp
$(DOC_MODULE)-decl.txt $(SCANOBJ_FILES): scan-build.stamp
@true
#### templates ####
tmpl-build.stamp: $(DOC_MODULE)-decl.txt $(SCANOBJ_FILES) $(DOC_MODULE)-sections.txt $(DOC_OVERRIDES)
@echo '*** Rebuilding template files ***'
if test x"$(srcdir)" != x. ; then \
cp $(srcdir)/$(DOC_MODULE)-sections.txt . ; \
touch $(DOC_MODULE)-decl.txt ; \
fi
gtkdoc-mktmpl --module=$(DOC_MODULE) | tee tmpl-build.log
@if test -s $(DOC_MODULE)-unused.txt; then \
exit $(if $(DOCS_ARE_INCOMPLETE_PLEASE_FIXME),0,1); fi
rm -f tmpl-build.log
touch tmpl-build.stamp
tmpl.stamp: tmpl-build.stamp
@true
#### xml ####
### FIXME: make this error out again when docs are fixed for 0.9
sgml-build.stamp: tmpl.stamp $(CFILE_GLOB)
@echo '*** Building XML ***'
gtkdoc-mkdb --module=$(DOC_MODULE) --source-dir=$(DOC_SOURCE_DIR) --main-sgml-file=$(srcdir)/$(DOC_MAIN_SGML_FILE) --output-format=xml $(MKDB_OPTIONS) | tee sgml-build.log
@if grep "WARNING:" sgml-build.log > /dev/null; then true; fi # exit 1; fi
rm sgml-build.log
touch sgml-build.stamp
sgml.stamp: sgml-build.stamp
@true
#### html ####
html-build.stamp: sgml.stamp $(DOC_MAIN_SGML_FILE) $(content_files)
@echo '*** Building HTML ***'
if test -d html; then rm -rf html; fi
mkdir html
cp $(srcdir)/$(DOC_MAIN_SGML_FILE) html
@for f in $(content_files); do cp $(srcdir)/$$f html; done
cp -pr xml html
cp ../version.entities html
cd html && gtkdoc-mkhtml $(DOC_MODULE) $(DOC_MAIN_SGML_FILE)
rm -f html/$(DOC_MAIN_SGML_FILE)
rm -rf html/xml
rm -f html/version.entities
test "x$(HTML_IMAGES)" = "x" || for i in "" $(HTML_IMAGES) ; do \
if test "$$i" != ""; then cp $(srcdir)/$$i html ; fi; done
@echo '-- Fixing Crossreferences'
gtkdoc-fixxref --module-dir=html --html-dir=$(HTML_DIR) $(FIXXREF_OPTIONS)
touch html-build.stamp
else
all-local:
endif
clean-local:
rm -f *~ *.bak
rm -rf xml html
rm -rf .libs
maintainer-clean-local: clean
cd $(srcdir) && rm -rf xml html $(DOC_MODULE)-decl-list.txt $(DOC_MODULE)-decl.txt
# company: don't delete .sgml and -sections.txt as they're in CVS
# FIXME : thomas added all sgml files and some other things to make
# make distcheck work
distclean-local: clean
rm -f $(DOC_MODULE)-decl-list.txt
rm -f $(DOC_MODULE)-decl.txt
rm -f $(DOC_MODULE)-undocumented.txt
rm -f $(DOC_MODULE)-unused.txt
rm -rf tmpl/*.sgml.bak
rm -f $(DOC_MODULE).hierarchy
rm -f *.stamp || true
if test x"$(srcdir)" != x. ; then \
rm -f $(DOC_MODULE)-docs.sgml ; \
rm -f $(DOC_MODULE).types ; \
rm -f $(DOC_MODULE).interfaces ; \
rm -f $(DOC_MODULE)-overrides.txt ; \
rm -f $(DOC_MODULE).prerequisites ; \
rm -f $(DOC_MODULE)-sections.txt ; \
rm -rf tmpl/*.sgml ; \
fi
rm -rf *.o
# thomas: make docs parallel installable; devhelp requires majorminor too
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to install' ; \
else \
for i in $$installfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
fi; \
echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
if test -e $(srcdir)/html/$(DOC_MODULE).devhelp2; then \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp2 \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \
fi; \
echo '-- Installing $(srcdir)/html/index.sgml' ; \
$(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
if test -e $(srcdir)/html/style.css; then \
echo '-- Installing $(srcdir)/html/style.css' ; \
$(INSTALL_DATA) $(srcdir)/html/style.css $(DESTDIR)$(TARGET_DIR); \
fi; \
fi)
uninstall-local:
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to uninstall' ; \
else \
for i in $$installfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
fi; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
if test -e $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; then \
rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp2; \
fi; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \
if test -e $(DESTDIR)$(TARGET_DIR)/style.css; then \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/style.css' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/style.css; \
fi; \
fi)
if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) 2>/dev/null; fi; true
#
# Require gtk-doc when making dist
#
if ENABLE_GTK_DOC
dist-check-gtkdoc:
else
dist-check-gtkdoc:
@echo "*** gtk-doc must be installed and enabled in order to make dist"
@false
endif
dist-hook: dist-check-gtkdoc dist-hook-local
mkdir $(distdir)/tmpl
mkdir $(distdir)/xml
mkdir $(distdir)/html
-cp $(srcdir)/tmpl/*.sgml $(distdir)/tmpl
-cp $(srcdir)/sgml/*.xml $(distdir)/xml
-cp $(srcdir)/html/index.sgml $(distdir)/html
-cp $(srcdir)/html/*.html $(srcdir)/html/*.css $(distdir)/html
-cp $(srcdir)/html/$(DOC_MODULE).devhelp* $(distdir)/html
images=$(HTML_IMAGES) ; \
for i in "" $$images ; do \
if test "$$i" != ""; then cp $(srcdir)/$$i $(distdir)/html ; fi; \
done
.PHONY : dist-hook-local

View file

@ -1,5 +0,0 @@
libtool.m4
ltoptions.m4
ltsugar.m4
ltversion.m4
lt~obsolete.m4

View file

@ -1,28 +0,0 @@
EXTRA_DIST = \
README \
as-ac-expand.m4 \
as-auto-alt.m4 \
as-compiler-flag.m4 \
as-compiler.m4 \
as-docbook.m4 \
as-libtool.m4 \
as-libtool-tags.m4 \
as-python.m4 \
as-scrub-include.m4 \
as-version.m4 \
ax_create_stdint_h.m4 \
glib-gettext.m4 \
gst-arch.m4 \
gst-args.m4 \
gst-check.m4 \
gst-debuginfo.m4 \
gst-default.m4 \
gst-doc.m4 \
gst-feature.m4 \
gst-function.m4 \
gst-gettext.m4 \
gst-glib2.m4 \
gst-libxml2.m4 \
gst-plugindir.m4 \
gst-valgrind.m4 \
pkg.m4

View file

@ -1,3 +0,0 @@
All aclocal .m4 files we need are put here and cat'd to acinclude.m4 in
the source root. Official ones (taken from the relevant devel packages)
are named as-is, unofficial ones (or changed ones) get a gst-prefix.

View file

@ -1,43 +0,0 @@
dnl as-ac-expand.m4 0.2.0
dnl autostars m4 macro for expanding directories using configure's prefix
dnl thomas@apestaart.org
dnl AS_AC_EXPAND(VAR, CONFIGURE_VAR)
dnl example
dnl AS_AC_EXPAND(SYSCONFDIR, $sysconfdir)
dnl will set SYSCONFDIR to /usr/local/etc if prefix=/usr/local
AC_DEFUN([AS_AC_EXPAND],
[
EXP_VAR=[$1]
FROM_VAR=[$2]
dnl first expand prefix and exec_prefix if necessary
prefix_save=$prefix
exec_prefix_save=$exec_prefix
dnl if no prefix given, then use /usr/local, the default prefix
if test "x$prefix" = "xNONE"; then
prefix="$ac_default_prefix"
fi
dnl if no exec_prefix given, then use prefix
if test "x$exec_prefix" = "xNONE"; then
exec_prefix=$prefix
fi
full_var="$FROM_VAR"
dnl loop until it doesn't change anymore
while true; do
new_full_var="`eval echo $full_var`"
if test "x$new_full_var" = "x$full_var"; then break; fi
full_var=$new_full_var
done
dnl clean up
full_var=$new_full_var
AC_SUBST([$1], "$full_var")
dnl restore prefix and exec_prefix
prefix=$prefix_save
exec_prefix=$exec_prefix_save
])

View file

@ -1,50 +0,0 @@
dnl as-auto-alt.m4 0.0.2
dnl autostars m4 macro for supplying alternate autotools versions to configure
dnl thomas@apestaart.org
dnl
dnl AS_AUTOTOOLS_ALTERNATE()
dnl
dnl supplies --with arguments for autoconf, autoheader, automake, aclocal
AC_DEFUN([AS_AUTOTOOLS_ALTERNATE],
[
dnl allow for different autoconf version
AC_ARG_WITH(autoconf,
AC_HELP_STRING([--with-autoconf],
[use a different autoconf for regeneration of Makefiles]),
[
unset AUTOCONF
AM_MISSING_PROG(AUTOCONF, ${withval})
AC_MSG_NOTICE([Using $AUTOCONF as autoconf])
])
dnl allow for different autoheader version
AC_ARG_WITH(autoheader,
AC_HELP_STRING([--with-autoheader],
[use a different autoheader for regeneration of Makefiles]),
[
unset AUTOHEADER
AM_MISSING_PROG(AUTOHEADER, ${withval})
AC_MSG_NOTICE([Using $AUTOHEADER as autoheader])
])
dnl allow for different automake version
AC_ARG_WITH(automake,
AC_HELP_STRING([--with-automake],
[use a different automake for regeneration of Makefiles]),
[
unset AUTOMAKE
AM_MISSING_PROG(AUTOMAKE, ${withval})
AC_MSG_NOTICE([Using $AUTOMAKE as automake])
])
dnl allow for different aclocal version
AC_ARG_WITH(aclocal,
AC_HELP_STRING([--with-aclocal],
[use a different aclocal for regeneration of Makefiles]),
[
unset ACLOCAL
AM_MISSING_PROG(ACLOCAL, ${withval})
AC_MSG_NOTICE([Using $ACLOCAL as aclocal])
])
])

View file

@ -1,33 +0,0 @@
dnl as-compiler-flag.m4 0.1.0
dnl autostars m4 macro for detection of compiler flags
dnl David Schleef <ds@schleef.org>
dnl $Id: as-compiler-flag.m4,v 1.1 2004/06/01 09:33:45 thomasvs Exp $
dnl AS_COMPILER_FLAG(CFLAGS, ACTION-IF-ACCEPTED, [ACTION-IF-NOT-ACCEPTED])
dnl Tries to compile with the given CFLAGS.
dnl Runs ACTION-IF-ACCEPTED if the compiler can compile with the flags,
dnl and ACTION-IF-NOT-ACCEPTED otherwise.
AC_DEFUN([AS_COMPILER_FLAG],
[
AC_MSG_CHECKING([to see if compiler understands $1])
save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $1"
AC_TRY_COMPILE([ ], [], [flag_ok=yes], [flag_ok=no])
CFLAGS="$save_CFLAGS"
if test "X$flag_ok" = Xyes ; then
$2
true
else
$3
true
fi
AC_MSG_RESULT([$flag_ok])
])

View file

@ -1,44 +0,0 @@
dnl as-compiler.m4 0.1.0
dnl autostars m4 macro for detection of compiler flavor
dnl Thomas Vander Stichele <thomas at apestaart dot org>
dnl $Id: as-compiler.m4,v 1.4 2004/06/01 09:33:45 thomasvs Exp $
dnl AS_COMPILER(COMPILER)
dnl will set variable COMPILER to
dnl - gcc
dnl - forte
dnl - (empty) if no guess could be made
AC_DEFUN([AS_COMPILER],
[
as_compiler=
AC_MSG_CHECKING(for compiler flavour)
dnl is it gcc ?
if test "x$GCC" = "xyes"; then
as_compiler="gcc"
fi
dnl is it forte ?
AC_TRY_RUN([
int main
(int argc, char *argv[])
{
#ifdef __sun
return 0;
#else
return 1;
#endif
}
], as_compiler="forte", ,)
if test "x$as_compiler" = "x"; then
AC_MSG_RESULT([unknown !])
else
AC_MSG_RESULT($as_compiler)
fi
[$1]=$as_compiler
])

View file

@ -1,66 +0,0 @@
dnl AS_DOCBOOK([, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl checks if xsltproc can build docbook documentation
dnl (which is possible if the catalog is set up properly
dnl I also tried checking for a specific version and type of docbook
dnl but xsltproc seemed to happily run anyway, so we can't check for that
dnl and version
dnl this macro takes inspiration from
dnl http://www.movement.uklinux.net/docs/docbook-autotools/configure.html
AC_DEFUN([AS_DOCBOOK],
[
XSLTPROC_FLAGS=--nonet
DOCBOOK_ROOT=
TYPE_LC=xml
TYPE_UC=XML
DOCBOOK_VERSION=4.1.2
if test ! -f /etc/xml/catalog; then
for i in /usr/share/sgml/docbook/stylesheet/xsl/nwalsh /usr/share/sgml/docbook/xsl-stylesheets/;
do
if test -d "$i"; then
DOCBOOK_ROOT=$i
fi
done
else
XML_CATALOG=/etc/xml/catalog
CAT_ENTRY_START='<!--'
CAT_ENTRY_END='-->'
fi
dnl We need xsltproc to process the test
AC_CHECK_PROG(XSLTPROC,xsltproc,xsltproc,)
XSLTPROC_WORKS=no
if test -n "$XSLTPROC"; then
AC_MSG_CHECKING([whether xsltproc docbook processing works])
if test -n "$XML_CATALOG"; then
DB_FILE="http://docbook.sourceforge.net/release/xsl/current/xhtml/docbook.xsl"
else
DB_FILE="$DOCBOOK_ROOT/docbook.xsl"
fi
$XSLTPROC $XSLTPROC_FLAGS $DB_FILE >/dev/null 2>&1 << END
<?xml version="1.0" encoding='ISO-8859-1'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook $TYPE_UC V$DOCBOOK_VERSION//EN" "http://www.oasis-open.org/docbook/$TYPE_LC/$DOCBOOK_VERSION/docbookx.dtd">
<book id="test">
</book>
END
if test "$?" = 0; then
XSLTPROC_WORKS=yes
fi
AC_MSG_RESULT($XSLTPROC_WORKS)
fi
if test "x$XSLTPROC_WORKS" = "xyes"; then
dnl execute ACTION-IF-FOUND
ifelse([$1], , :, [$1])
else
dnl execute ACTION-IF-NOT-FOUND
ifelse([$2], , :, [$2])
fi
AC_SUBST(XML_CATALOG)
AC_SUBST(XSLTPROC_FLAGS)
AC_SUBST(DOCBOOK_ROOT)
AC_SUBST(CAT_ENTRY_START)
AC_SUBST(CAT_ENTRY_END)
])

View file

@ -1,83 +0,0 @@
dnl as-libtool-tags.m4 0.1.4
dnl autostars m4 macro for selecting libtool "tags" (languages)
dnl Andy Wingo does not claim credit for this macro
dnl backported from libtool 1.6 by Paolo Bonzini
dnl see http://lists.gnu.org/archive/html/libtool/2003-12/msg00007.html
dnl $Id: as-libtool-tags.m4,v 1.3 2006/04/01 15:30:56 thomasvs Exp $
dnl AS_LIBTOOL_TAGS([tags...])
dnl example
dnl AS_LIBTOOL_TAGS([]) for only C (no fortran, etc)
dnl When AC_LIBTOOL_TAGS is used, I redefine _LT_AC_TAGCONFIG
dnl to be more similar to the libtool 1.6 implementation, which
dnl uses an m4 loop and m4 case instead of a shell loop. This
dnl way the CXX/GCJ/F77/RC tests are not always expanded.
dnl AS_LIBTOOL_TAGS
dnl ---------------
dnl tags to enable
AC_DEFUN([AS_LIBTOOL_TAGS],
[m4_define([_LT_TAGS],[$1])
m4_define([_LT_AC_TAGCONFIG], [
# redefined LT AC TAGCONFIG
if test -f "$ltmain"; then
if test ! -f "${ofile}"; then
AC_MSG_WARN([output file `$ofile' does not exist])
fi
if test -z "$LTCC"; then
eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
if test -z "$LTCC"; then
AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
else
AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
fi
fi
AC_FOREACH([_LT_TAG], _LT_TAGS,
echo THOMAS: tag _LT_TAG
[m4_case(_LT_TAG,
[CXX], [
if test -n "$CXX" && test "X$CXX" != "Xno"; then
echo "THOMAS: YAY CXX"
AC_LIBTOOL_LANG_CXX_CONFIG
available_tags="$available_tags _LT_TAG"
fi],
[F77], [
if test -n "$F77" && test "X$F77" != "Xno"; then
AC_LIBTOOL_LANG_F77_CONFIG
available_tags="$available_tags _LT_TAG"
fi],
[GCJ], [
if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
AC_LIBTOOL_LANG_GCJ_CONFIG
available_tags="$available_tags _LT_TAG"
fi],
[RC], [
if test -n "$RC" && test "X$RC" != "Xno"; then
AC_LIBTOOL_LANG_RC_CONFIG
available_tags="$available_tags _LT_TAG"
fi],
[m4_errprintn(m4_location[: error: invalid tag name: ]"_LT_TAG")
m4_exit(1)])
])
echo THOMAS: available tags: $available_tags
fi
# Now substitute the updated list of available tags.
if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
mv "${ofile}T" "$ofile"
chmod +x "$ofile"
AC_MSG_NOTICE([updated available libtool tags with $available_tags.])
else
rm -f "${ofile}T"
AC_MSG_ERROR([unable to update list of available tagged configurations.])
fi
])dnl _LT_AC_TAG_CONFIG
])

View file

@ -1,45 +0,0 @@
dnl as-libtool.m4 0.1.4
dnl autostars m4 macro for libtool versioning
dnl Thomas Vander Stichele <thomas at apestaart dot org>
dnl $Id: as-libtool.m4,v 1.6 2004/06/01 10:04:44 thomasvs Exp $
dnl AS_LIBTOOL(PREFIX, CURRENT, REVISION, AGE, [RELEASE])
dnl example
dnl AS_LIBTOOL(GST, 2, 0, 0)
dnl this macro
dnl - defines [$PREFIX]_CURRENT, REVISION and AGE
dnl - defines [$PREFIX]_LIBVERSION
dnl - defines [$PREFIX]_LT_LDFLAGS to set versioning
dnl - AC_SUBST's them all
dnl if RELEASE is given, then add a -release option to the LDFLAGS
dnl with the given release version
dnl then use [$PREFIX]_LT_LDFLAGS in the relevant Makefile.am's
dnl call AM_PROG_LIBTOOL after this call
AC_DEFUN([AS_LIBTOOL],
[
[$1]_CURRENT=[$2]
[$1]_REVISION=[$3]
[$1]_AGE=[$4]
[$1]_LIBVERSION=[$2]:[$3]:[$4]
AC_SUBST([$1]_CURRENT)
AC_SUBST([$1]_REVISION)
AC_SUBST([$1]_AGE)
AC_SUBST([$1]_LIBVERSION)
[$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -version-info $[$1]_LIBVERSION"
if test ! -z "[$5]"
then
[$1]_LT_LDFLAGS="$[$1]_LT_LDFLAGS -release [$5]"
fi
AC_SUBST([$1]_LT_LDFLAGS)
AC_LIBTOOL_DLOPEN
])

View file

@ -1,152 +0,0 @@
## ------------------------
## Python file handling
## From Andrew Dalke
## Updated by James Henstridge
## Updated by Andy Wingo to loop through possible pythons
## ------------------------
# AS_PATH_PYTHON([MINIMUM-VERSION])
# Adds support for distributing Python modules and packages. To
# install modules, copy them to $(pythondir), using the python_PYTHON
# automake variable. To install a package with the same name as the
# automake package, install to $(pkgpythondir), or use the
# pkgpython_PYTHON automake variable.
# The variables $(pyexecdir) and $(pkgpyexecdir) are provided as
# locations to install python extension modules (shared libraries).
# Another macro is required to find the appropriate flags to compile
# extension modules.
# If your package is configured with a different prefix to python,
# users will have to add the install directory to the PYTHONPATH
# environment variable, or create a .pth file (see the python
# documentation for details).
# If the MINIMUM-VERSION argument is passed, AS_PATH_PYTHON will
# cause an error if the version of python installed on the system
# doesn't meet the requirement. MINIMUM-VERSION should consist of
# numbers and dots only.
# Updated to loop over all possible python binaries by Andy Wingo
# <wingo@pobox.com>
# Updated to only warn and unset PYTHON if no good one is found
AC_DEFUN([AS_PATH_PYTHON],
[
dnl Find a version of Python. I could check for python versions 1.4
dnl or earlier, but the default installation locations changed from
dnl $prefix/lib/site-python in 1.4 to $prefix/lib/python1.5/site-packages
dnl in 1.5, and I don't want to maintain that logic.
dnl should we do the version check?
PYTHON_CANDIDATES="python python2.2 python2.1 python2.0 python2 \
python1.6 python1.5"
ifelse([$1],[],
[AC_PATH_PROG(PYTHON, $PYTHON_CANDIDATES)],
[
AC_MSG_NOTICE(Looking for Python version >= $1)
changequote(<<, >>)dnl
prog="
import sys, string
minver = '$1'
# split string by '.' and convert to numeric
minver_info = map(string.atoi, string.split(minver, '.'))
# we can now do comparisons on the two lists:
if sys.version_info >= tuple(minver_info):
sys.exit(0)
else:
sys.exit(1)"
changequote([, ])dnl
python_good=false
for python_candidate in $PYTHON_CANDIDATES; do
unset PYTHON
AC_PATH_PROG(PYTHON, $python_candidate) 1> /dev/null 2> /dev/null
if test "x$PYTHON" = "x"; then continue; fi
if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC; then
AC_MSG_CHECKING(["$PYTHON":])
AC_MSG_RESULT([okay])
python_good=true
break;
else
dnl clear the cache val
unset ac_cv_path_PYTHON
fi
done
])
if test "$python_good" != "true"; then
AC_MSG_WARN([No suitable version of python found])
PYTHON=
else
AC_MSG_CHECKING([local Python configuration])
dnl Query Python for its version number. Getting [:3] seems to be
dnl the best way to do this; it's what "site.py" does in the standard
dnl library. Need to change quote character because of [:3]
AC_SUBST(PYTHON_VERSION)
changequote(<<, >>)dnl
PYTHON_VERSION=`$PYTHON -c "import sys; print sys.version[:3]"`
changequote([, ])dnl
dnl Use the values of $prefix and $exec_prefix for the corresponding
dnl values of PYTHON_PREFIX and PYTHON_EXEC_PREFIX. These are made
dnl distinct variables so they can be overridden if need be. However,
dnl general consensus is that you shouldn't need this ability.
AC_SUBST(PYTHON_PREFIX)
PYTHON_PREFIX='${prefix}'
AC_SUBST(PYTHON_EXEC_PREFIX)
PYTHON_EXEC_PREFIX='${exec_prefix}'
dnl At times (like when building shared libraries) you may want
dnl to know which OS platform Python thinks this is.
AC_SUBST(PYTHON_PLATFORM)
PYTHON_PLATFORM=`$PYTHON -c "import sys; print sys.platform"`
dnl Set up 4 directories:
dnl pythondir -- where to install python scripts. This is the
dnl site-packages directory, not the python standard library
dnl directory like in previous automake betas. This behaviour
dnl is more consistent with lispdir.m4 for example.
dnl
dnl Also, if the package prefix isn't the same as python's prefix,
dnl then the old $(pythondir) was pretty useless.
AC_SUBST(pythondir)
pythondir=$PYTHON_PREFIX"/lib/python"$PYTHON_VERSION/site-packages
dnl pkgpythondir -- $PACKAGE directory under pythondir. Was
dnl PYTHON_SITE_PACKAGE in previous betas, but this naming is
dnl more consistent with the rest of automake.
dnl Maybe this should be put in python.am?
AC_SUBST(pkgpythondir)
pkgpythondir=\${pythondir}/$PACKAGE
dnl pyexecdir -- directory for installing python extension modules
dnl (shared libraries) Was PYTHON_SITE_EXEC in previous betas.
AC_SUBST(pyexecdir)
pyexecdir=$PYTHON_EXEC_PREFIX"/lib/python"$PYTHON_VERSION/site-packages
dnl pkgpyexecdir -- $(pyexecdir)/$(PACKAGE)
dnl Maybe this should be put in python.am?
AC_SUBST(pkgpyexecdir)
pkgpyexecdir=\${pyexecdir}/$PACKAGE
AC_MSG_RESULT([looks good])
fi
])

View file

@ -1,36 +0,0 @@
dnl as-scrub-include.m4 0.0.4
dnl autostars m4 macro for scrubbing CFLAGS of system include dirs
dnl because gcc 3.x complains about including system including dirs
dnl Thomas Vander Stichele <thomas at apestaart dot org>
dnl $Id: as-scrub-include.m4,v 1.5 2004/06/12 08:19:09 thomasvs Exp $
dnl This macro uses output of cpp -v and expects it to contain text that
dnl looks a little bit like this:
dnl #include <...> search starts here:
dnl /usr/local/include
dnl /usr/lib/gcc-lib/i386-redhat-linux/3.2/include
dnl /usr/include
dnl End of search list.
dnl AS_SCRUB_INCLUDE(VAR)
dnl example
dnl AS_SCRUB_INCLUDE(CFLAGS)
dnl will remove all system include dirs from the given CFLAGS
AC_DEFUN([AS_SCRUB_INCLUDE],
[
GIVEN_CFLAGS=$[$1]
INCLUDE_DIRS=`echo | cpp -v 2>&1`
dnl remove everything from this output between the "starts here" and "End of"
dnl line
INCLUDE_DIRS=`echo $INCLUDE_DIRS | sed -e 's/.*<...> search starts here://' | sed -e 's/End of search list.*//'`
for dir in $INCLUDE_DIRS; do
dnl use "" as the sed script so $dir gets expanded
GIVEN_CFLAGS=`echo $GIVEN_CFLAGS | sed -e "s#-I$dir ##"`
done
[$1]=$GIVEN_CFLAGS
])

View file

@ -1,71 +0,0 @@
dnl as-version.m4 0.2.0
dnl autostars m4 macro for versioning
dnl Thomas Vander Stichele <thomas at apestaart dot org>
dnl $Id: as-version.m4,v 1.4 2004/06/01 09:40:05 thomasvs Exp $
dnl AS_VERSION
dnl example
dnl AS_VERSION
dnl this macro
dnl - AC_SUBST's PACKAGE_VERSION_MAJOR, _MINOR, _MICRO
dnl - AC_SUBST's PACKAGE_VERSION_RELEASE,
dnl which can be used for rpm release fields
dnl - doesn't call AM_INIT_AUTOMAKE anymore because it prevents
dnl maintainer mode from running correctly
dnl
dnl don't forget to put #undef PACKAGE_VERSION_RELEASE in acconfig.h
dnl if you use acconfig.h
AC_DEFUN([AS_VERSION],
[
PACKAGE_VERSION_MAJOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f1)
PACKAGE_VERSION_MINOR=$(echo AC_PACKAGE_VERSION | cut -d'.' -f2)
PACKAGE_VERSION_MICRO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f3)
AC_SUBST(PACKAGE_VERSION_MAJOR)
AC_SUBST(PACKAGE_VERSION_MINOR)
AC_SUBST(PACKAGE_VERSION_MICRO)
])
dnl AS_NANO(ACTION-IF-NO-NANO, [ACTION-IF-NANO])
dnl requires AC_INIT to be called before
dnl For projects using a fourth or nano number in your versioning to indicate
dnl development or prerelease snapshots, this macro allows the build to be
dnl set up differently accordingly.
dnl this macro:
dnl - parses AC_PACKAGE_VERSION, set by AC_INIT, and extracts the nano number
dnl - sets the variable PACKAGE_VERSION_NANO
dnl - sets the variable PACKAGE_VERSION_RELEASE, which can be used
dnl for rpm release fields
dnl - executes ACTION-IF-NO-NANO or ACTION-IF-NANO
dnl example:
dnl AS_NANO(RELEASE="yes", RELEASE="no")
AC_DEFUN([AS_NANO],
[
AC_MSG_CHECKING(nano version)
NANO=$(echo AC_PACKAGE_VERSION | cut -d'.' -f4)
if test x"$NANO" = x || test "x$NANO" = "x0" ; then
AC_MSG_RESULT([0 (release)])
NANO=0
PACKAGE_VERSION_RELEASE=1
ifelse([$1], , :, [$1])
else
AC_MSG_RESULT($NANO)
PACKAGE_VERSION_RELEASE=0.`date +%Y%m%d.%H%M%S`
ifelse([$2], , :, [$2])
fi
PACKAGE_VERSION_NANO=$NANO
AC_SUBST(PACKAGE_VERSION_NANO)
AC_SUBST(PACKAGE_VERSION_RELEASE)
])

View file

@ -1,569 +0,0 @@
dnl @synopsis AX_CREATE_STDINT_H [( HEADER-TO-GENERATE [, HEDERS-TO-CHECK])]
dnl
dnl the "ISO C9X: 7.18 Integer types <stdint.h>" section requires the
dnl existence of an include file <stdint.h> that defines a set of
dnl typedefs, especially uint8_t,int32_t,uintptr_t.
dnl Many older installations will not provide this file, but some will
dnl have the very same definitions in <inttypes.h>. In other enviroments
dnl we can use the inet-types in <sys/types.h> which would define the
dnl typedefs int8_t and u_int8_t respectivly.
dnl
dnl This macros will create a local "_stdint.h" or the headerfile given as
dnl an argument. In many cases that file will just "#include <stdint.h>"
dnl or "#include <inttypes.h>", while in other environments it will provide
dnl the set of basic 'stdint's definitions/typedefs:
dnl int8_t,uint8_t,int16_t,uint16_t,int32_t,uint32_t,intptr_t,uintptr_t
dnl int_least32_t.. int_fast32_t.. intmax_t
dnl which may or may not rely on the definitions of other files,
dnl or using the AC_CHECK_SIZEOF macro to determine the actual
dnl sizeof each type.
dnl
dnl if your header files require the stdint-types you will want to create an
dnl installable file mylib-int.h that all your other installable header
dnl may include. So if you have a library package named "mylib", just use
dnl AX_CREATE_STDINT_H(mylib-int.h)
dnl in configure.ac and go to install that very header file in Makefile.am
dnl along with the other headers (mylib.h) - and the mylib-specific headers
dnl can simply use "#include <mylib-int.h>" to obtain the stdint-types.
dnl
dnl Remember, if the system already had a valid <stdint.h>, the generated
dnl file will include it directly. No need for fuzzy HAVE_STDINT_H things...
dnl
dnl @, (status: used on new platforms) (see http://ac-archive.sf.net/gstdint/)
dnl @version $Id: ax_create_stdint_h.m4,v 1.2 2004/03/09 14:57:53 thomasvs Exp $
dnl @author Guido Draheim <guidod@gmx.de>
AC_DEFUN([AX_CREATE_STDINT_H],
[# ------ AX CREATE STDINT H -------------------------------------
AC_MSG_CHECKING([for stdint types])
ac_stdint_h=`echo ifelse($1, , _stdint.h, $1)`
# try to shortcircuit - if the default include path of the compiler
# can find a "stdint.h" header then we assume that all compilers can.
AC_CACHE_VAL([ac_cv_header_stdint_t],[
old_CXXFLAGS="$CXXFLAGS" ; CXXFLAGS=""
old_CPPFLAGS="$CPPFLAGS" ; CPPFLAGS=""
old_CFLAGS="$CFLAGS" ; CFLAGS=""
AC_TRY_COMPILE([#include <stdint.h>],[int_least32_t v = 0;],
[ac_cv_stdint_result="(assuming C99 compatible system)"
ac_cv_header_stdint_t="stdint.h"; ],
[ac_cv_header_stdint_t=""])
CXXFLAGS="$old_CXXFLAGS"
CPPFLAGS="$old_CPPFLAGS"
CFLAGS="$old_CFLAGS" ])
v="... $ac_cv_header_stdint_h"
if test "$ac_stdint_h" = "stdint.h" ; then
AC_MSG_RESULT([(are you sure you want them in ./stdint.h?)])
elif test "$ac_stdint_h" = "inttypes.h" ; then
AC_MSG_RESULT([(are you sure you want them in ./inttypes.h?)])
elif test "_$ac_cv_header_stdint_t" = "_" ; then
AC_MSG_RESULT([(putting them into $ac_stdint_h)$v])
else
ac_cv_header_stdint="$ac_cv_header_stdint_t"
AC_MSG_RESULT([$ac_cv_header_stdint (shortcircuit)])
fi
if test "_$ac_cv_header_stdint_t" = "_" ; then # can not shortcircuit..
dnl .....intro message done, now do a few system checks.....
dnl btw, all CHECK_TYPE macros do automatically "DEFINE" a type, therefore
dnl we use the autoconf implementation detail _AC CHECK_TYPE_NEW instead
inttype_headers=`echo $2 | sed -e 's/,/ /g'`
ac_cv_stdint_result="(no helpful system typedefs seen)"
AC_CACHE_CHECK([for stdint uintptr_t], [ac_cv_header_stdint_x],[
ac_cv_header_stdint_x="" # the 1997 typedefs (inttypes.h)
AC_MSG_RESULT([(..)])
for i in stdint.h inttypes.h sys/inttypes.h $inttype_headers ; do
unset ac_cv_type_uintptr_t
unset ac_cv_type_uint64_t
_AC_CHECK_TYPE_NEW(uintptr_t,[ac_cv_header_stdint_x=$i],dnl
continue,[#include <$i>])
AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
ac_cv_stdint_result="(seen uintptr_t$and64 in $i)"
break;
done
AC_MSG_CHECKING([for stdint uintptr_t])
])
if test "_$ac_cv_header_stdint_x" = "_" ; then
AC_CACHE_CHECK([for stdint uint32_t], [ac_cv_header_stdint_o],[
ac_cv_header_stdint_o="" # the 1995 typedefs (sys/inttypes.h)
AC_MSG_RESULT([(..)])
for i in inttypes.h sys/inttypes.h stdint.h $inttype_headers ; do
unset ac_cv_type_uint32_t
unset ac_cv_type_uint64_t
AC_CHECK_TYPE(uint32_t,[ac_cv_header_stdint_o=$i],dnl
continue,[#include <$i>])
AC_CHECK_TYPE(uint64_t,[and64="/uint64_t"],[and64=""],[#include<$i>])
ac_cv_stdint_result="(seen uint32_t$and64 in $i)"
break;
done
AC_MSG_CHECKING([for stdint uint32_t])
])
fi
if test "_$ac_cv_header_stdint_x" = "_" ; then
if test "_$ac_cv_header_stdint_o" = "_" ; then
AC_CACHE_CHECK([for stdint u_int32_t], [ac_cv_header_stdint_u],[
ac_cv_header_stdint_u="" # the BSD typedefs (sys/types.h)
AC_MSG_RESULT([(..)])
for i in sys/types.h inttypes.h sys/inttypes.h $inttype_headers ; do
unset ac_cv_type_u_int32_t
unset ac_cv_type_u_int64_t
AC_CHECK_TYPE(u_int32_t,[ac_cv_header_stdint_u=$i],dnl
continue,[#include <$i>])
AC_CHECK_TYPE(u_int64_t,[and64="/u_int64_t"],[and64=""],[#include<$i>])
ac_cv_stdint_result="(seen u_int32_t$and64 in $i)"
break;
done
AC_MSG_CHECKING([for stdint u_int32_t])
])
fi fi
dnl if there was no good C99 header file, do some typedef checks...
if test "_$ac_cv_header_stdint_x" = "_" ; then
AC_MSG_CHECKING([for stdint datatype model])
AC_MSG_RESULT([(..)])
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(void*)
ac_cv_stdint_char_model=""
ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_char"
ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_short"
ac_cv_stdint_char_model="$ac_cv_stdint_char_model$ac_cv_sizeof_int"
ac_cv_stdint_long_model=""
ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_int"
ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_long"
ac_cv_stdint_long_model="$ac_cv_stdint_long_model$ac_cv_sizeof_voidp"
name="$ac_cv_stdint_long_model"
case "$ac_cv_stdint_char_model/$ac_cv_stdint_long_model" in
122/242) name="$name, IP16 (standard 16bit machine)" ;;
122/244) name="$name, LP32 (standard 32bit mac/win)" ;;
122/*) name="$name (unusual int16 model)" ;;
124/444) name="$name, ILP32 (standard 32bit unixish)" ;;
124/488) name="$name, LP64 (standard 64bit unixish)" ;;
124/448) name="$name, LLP64 (unusual 64bit unixish)" ;;
124/*) name="$name (unusual int32 model)" ;;
128/888) name="$name, ILP64 (unusual 64bit numeric)" ;;
128/*) name="$name (unusual int64 model)" ;;
222/*|444/*) name="$name (unusual dsptype)" ;;
*) name="$name (very unusal model)" ;;
esac
AC_MSG_RESULT([combined for stdint datatype model... $name])
fi
if test "_$ac_cv_header_stdint_x" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_x"
elif test "_$ac_cv_header_stdint_o" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_o"
elif test "_$ac_cv_header_stdint_u" != "_" ; then
ac_cv_header_stdint="$ac_cv_header_stdint_u"
else
ac_cv_header_stdint="stddef.h"
fi
AC_MSG_CHECKING([for extra inttypes in chosen header])
AC_MSG_RESULT([($ac_cv_header_stdint)])
dnl see if int_least and int_fast types are present in _this_ header.
unset ac_cv_type_int_least32_t
unset ac_cv_type_int_fast32_t
AC_CHECK_TYPE(int_least32_t,,,[#include <$ac_cv_header_stdint>])
AC_CHECK_TYPE(int_fast32_t,,,[#include<$ac_cv_header_stdint>])
AC_CHECK_TYPE(intmax_t,,,[#include <$ac_cv_header_stdint>])
fi # shortcircut to system "stdint.h"
# ------------------ PREPARE VARIABLES ------------------------------
if test "$GCC" = "yes" ; then
ac_cv_stdint_message="using gnu compiler "`$CC --version | head -n 1`
else
ac_cv_stdint_message="using $CC"
fi
AC_MSG_RESULT([make use of $ac_cv_header_stdint in $ac_stdint_h dnl
$ac_cv_stdint_result])
# ----------------- DONE inttypes.h checks START header -------------
AC_CONFIG_COMMANDS([$ac_stdint_h],[
AC_MSG_NOTICE(creating $ac_stdint_h : $_ac_stdint_h)
ac_stdint=$tmp/_stdint.h
echo "#ifndef" $_ac_stdint_h >$ac_stdint
echo "#define" $_ac_stdint_h "1" >>$ac_stdint
echo "#ifndef" _GENERATED_STDINT_H >>$ac_stdint
echo "#define" _GENERATED_STDINT_H '"'$PACKAGE $VERSION'"' >>$ac_stdint
echo "/* generated $ac_cv_stdint_message */" >>$ac_stdint
if test "_$ac_cv_header_stdint_t" != "_" ; then
echo "#define _STDINT_HAVE_STDINT_H" "1" >>$ac_stdint
fi
cat >>$ac_stdint <<STDINT_EOF
/* ................... shortcircuit part ........................... */
#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H
#include <stdint.h>
#else
#include <stddef.h>
/* .................... configured part ............................ */
STDINT_EOF
echo "/* whether we have a C99 compatible stdint header file */" >>$ac_stdint
if test "_$ac_cv_header_stdint_x" != "_" ; then
ac_header="$ac_cv_header_stdint_x"
echo "#define _STDINT_HEADER_INTPTR" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_INTPTR */" >>$ac_stdint
fi
echo "/* whether we have a C96 compatible inttypes header file */" >>$ac_stdint
if test "_$ac_cv_header_stdint_o" != "_" ; then
ac_header="$ac_cv_header_stdint_o"
echo "#define _STDINT_HEADER_UINT32" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_UINT32 */" >>$ac_stdint
fi
echo "/* whether we have a BSD compatible inet types header */" >>$ac_stdint
if test "_$ac_cv_header_stdint_u" != "_" ; then
ac_header="$ac_cv_header_stdint_u"
echo "#define _STDINT_HEADER_U_INT32" '"'"$ac_header"'"' >>$ac_stdint
else
echo "/* #undef _STDINT_HEADER_U_INT32 */" >>$ac_stdint
fi
echo "" >>$ac_stdint
if test "_$ac_header" != "_" ; then if test "$ac_header" != "stddef.h" ; then
echo "#include <$ac_header>" >>$ac_stdint
echo "" >>$ac_stdint
fi fi
echo "/* which 64bit typedef has been found */" >>$ac_stdint
if test "$ac_cv_type_uint64_t" = "yes" ; then
echo "#define _STDINT_HAVE_UINT64_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_UINT64_T */" >>$ac_stdint
fi
if test "$ac_cv_type_u_int64_t" = "yes" ; then
echo "#define _STDINT_HAVE_U_INT64_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_U_INT64_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint
echo "/* which type model has been detected */" >>$ac_stdint
if test "_$ac_cv_stdint_char_model" != "_" ; then
echo "#define _STDINT_CHAR_MODEL" "$ac_cv_stdint_char_model" >>$ac_stdint
echo "#define _STDINT_LONG_MODEL" "$ac_cv_stdint_long_model" >>$ac_stdint
else
echo "/* #undef _STDINT_CHAR_MODEL // skipped */" >>$ac_stdint
echo "/* #undef _STDINT_LONG_MODEL // skipped */" >>$ac_stdint
fi
echo "" >>$ac_stdint
echo "/* whether int_least types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_least32_t" = "yes"; then
echo "#define _STDINT_HAVE_INT_LEAST32_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_LEAST32_T */" >>$ac_stdint
fi
echo "/* whether int_fast types were detected */" >>$ac_stdint
if test "$ac_cv_type_int_fast32_t" = "yes"; then
echo "#define _STDINT_HAVE_INT_FAST32_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INT_FAST32_T */" >>$ac_stdint
fi
echo "/* whether intmax_t type was detected */" >>$ac_stdint
if test "$ac_cv_type_intmax_t" = "yes"; then
echo "#define _STDINT_HAVE_INTMAX_T" "1" >>$ac_stdint
else
echo "/* #undef _STDINT_HAVE_INTMAX_T */" >>$ac_stdint
fi
echo "" >>$ac_stdint
cat >>$ac_stdint <<STDINT_EOF
/* .................... detections part ............................ */
/* whether we need to define bitspecific types from compiler base types */
#ifndef _STDINT_HEADER_INTPTR
#ifndef _STDINT_HEADER_UINT32
#ifndef _STDINT_HEADER_U_INT32
#define _STDINT_NEED_INT_MODEL_T
#else
#define _STDINT_HAVE_U_INT_TYPES
#endif
#endif
#endif
#ifdef _STDINT_HAVE_U_INT_TYPES
#undef _STDINT_NEED_INT_MODEL_T
#endif
#ifdef _STDINT_CHAR_MODEL
#if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124
#ifndef _STDINT_BYTE_MODEL
#define _STDINT_BYTE_MODEL 12
#endif
#endif
#endif
#ifndef _STDINT_HAVE_INT_LEAST32_T
#define _STDINT_NEED_INT_LEAST_T
#endif
#ifndef _STDINT_HAVE_INT_FAST32_T
#define _STDINT_NEED_INT_FAST_T
#endif
#ifndef _STDINT_HEADER_INTPTR
#define _STDINT_NEED_INTPTR_T
#ifndef _STDINT_HAVE_INTMAX_T
#define _STDINT_NEED_INTMAX_T
#endif
#endif
/* .................... definition part ............................ */
/* some system headers have good uint64_t */
#ifndef _HAVE_UINT64_T
#if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T
#define _HAVE_UINT64_T
#elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T
#define _HAVE_UINT64_T
typedef u_int64_t uint64_t;
#endif
#endif
#ifndef _HAVE_UINT64_T
/* .. here are some common heuristics using compiler runtime specifics */
#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L
#define _HAVE_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;
#elif !defined __STRICT_ANSI__
#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__
#define _HAVE_UINT64_T
typedef __int64 int64_t;
typedef unsigned __int64 uint64_t;
#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__
/* note: all ELF-systems seem to have loff-support which needs 64-bit */
#if !defined _NO_LONGLONG
#define _HAVE_UINT64_T
typedef long long int64_t;
typedef unsigned long long uint64_t;
#endif
#elif defined __alpha || (defined __mips && defined _ABIN32)
#if !defined _NO_LONGLONG
typedef long int64_t;
typedef unsigned long uint64_t;
#endif
/* compiler/cpu type to define int64_t */
#endif
#endif
#endif
#if defined _STDINT_HAVE_U_INT_TYPES
/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */
typedef u_int8_t uint8_t;
typedef u_int16_t uint16_t;
typedef u_int32_t uint32_t;
/* glibc compatibility */
#ifndef __int8_t_defined
#define __int8_t_defined
#endif
#endif
#ifdef _STDINT_NEED_INT_MODEL_T
/* we must guess all the basic types. Apart from byte-adressable system, */
/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */
/* (btw, those nibble-addressable systems are way off, or so we assume) */
dnl /* have a look at "64bit and data size neutrality" at */
dnl /* http://unix.org/version2/whatsnew/login_64bit.html */
dnl /* (the shorthand "ILP" types always have a "P" part) */
#if defined _STDINT_BYTE_MODEL
#if _STDINT_LONG_MODEL+0 == 242
/* 2:4:2 = IP16 = a normal 16-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned long uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef long int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444
/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */
/* 4:4:4 = ILP32 = a normal 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488
/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */
/* 4:8:8 = LP64 = a normal 64-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
/* this system has a "long" of 64bit */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
typedef unsigned long uint64_t;
typedef long int64_t;
#endif
#elif _STDINT_LONG_MODEL+0 == 448
/* LLP64 a 64-bit system derived from a 32-bit system */
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
#ifndef __int8_t_defined
#define __int8_t_defined
typedef char int8_t;
typedef short int16_t;
typedef int int32_t;
#endif
/* assuming the system has a "long long" */
#ifndef _HAVE_UINT64_T
#define _HAVE_UINT64_T
typedef unsigned long long uint64_t;
typedef long long int64_t;
#endif
#else
#define _STDINT_NO_INT32_T
#endif
#else
#define _STDINT_NO_INT8_T
#define _STDINT_NO_INT32_T
#endif
#endif
/*
* quote from SunOS-5.8 sys/inttypes.h:
* Use at your own risk. As of February 1996, the committee is squarely
* behind the fixed sized types; the "least" and "fast" types are still being
* discussed. The probability that the "fast" types may be removed before
* the standard is finalized is high enough that they are not currently
* implemented.
*/
#if defined _STDINT_NEED_INT_LEAST_T
typedef int8_t int_least8_t;
typedef int16_t int_least16_t;
typedef int32_t int_least32_t;
#ifdef _HAVE_UINT64_T
typedef int64_t int_least64_t;
#endif
typedef uint8_t uint_least8_t;
typedef uint16_t uint_least16_t;
typedef uint32_t uint_least32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t uint_least64_t;
#endif
/* least types */
#endif
#if defined _STDINT_NEED_INT_FAST_T
typedef int8_t int_fast8_t;
typedef int int_fast16_t;
typedef int32_t int_fast32_t;
#ifdef _HAVE_UINT64_T
typedef int64_t int_fast64_t;
#endif
typedef uint8_t uint_fast8_t;
typedef unsigned uint_fast16_t;
typedef uint32_t uint_fast32_t;
#ifdef _HAVE_UINT64_T
typedef uint64_t uint_fast64_t;
#endif
/* fast types */
#endif
#ifdef _STDINT_NEED_INTMAX_T
#ifdef _HAVE_UINT64_T
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;
#else
typedef long intmax_t;
typedef unsigned long uintmax_t;
#endif
#endif
#ifdef _STDINT_NEED_INTPTR_T
#ifndef __intptr_t_defined
#define __intptr_t_defined
/* we encourage using "long" to store pointer values, never use "int" ! */
#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484
typedef unsinged int uintptr_t;
typedef int intptr_t;
#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444
typedef unsigned long uintptr_t;
typedef long intptr_t;
#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T
typedef uint64_t uintptr_t;
typedef int64_t intptr_t;
#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */
typedef unsigned long uintptr_t;
typedef long intptr_t;
#endif
#endif
#endif
/* shortcircuit*/
#endif
/* once */
#endif
#endif
STDINT_EOF
if cmp -s $ac_stdint_h $ac_stdint 2>/dev/null; then
AC_MSG_NOTICE([$ac_stdint_h is unchanged])
else
ac_dir=`AS_DIRNAME(["$ac_stdint_h"])`
AS_MKDIR_P(["$ac_dir"])
rm -f $ac_stdint_h
mv $ac_stdint $ac_stdint_h
fi
],[# variables for create stdint.h replacement
PACKAGE="$PACKAGE"
VERSION="$VERSION"
ac_stdint_h="$ac_stdint_h"
_ac_stdint_h=AS_TR_CPP(_$PACKAGE-$ac_stdint_h)
ac_cv_stdint_message="$ac_cv_stdint_message"
ac_cv_header_stdint_t="$ac_cv_header_stdint_t"
ac_cv_header_stdint_x="$ac_cv_header_stdint_x"
ac_cv_header_stdint_o="$ac_cv_header_stdint_o"
ac_cv_header_stdint_u="$ac_cv_header_stdint_u"
ac_cv_type_uint64_t="$ac_cv_type_uint64_t"
ac_cv_type_u_int64_t="$ac_cv_type_u_int64_t"
ac_cv_stdint_char_model="$ac_cv_stdint_char_model"
ac_cv_stdint_long_model="$ac_cv_stdint_long_model"
ac_cv_type_int_least32_t="$ac_cv_type_int_least32_t"
ac_cv_type_int_fast32_t="$ac_cv_type_int_fast32_t"
ac_cv_type_intmax_t="$ac_cv_type_intmax_t"
])
])

View file

@ -1,181 +0,0 @@
dnl _AM_TRY_CHECK(MINIMUM-VERSION, EXTRA-CFLAGS, EXTRA-LIBS, CHECK-LIB-NAME
dnl [, ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]])
dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS
dnl Done this way because of the brokenness that is
dnl https://launchpad.net/distros/ubuntu/+source/check/+bug/5840
dnl
AC_DEFUN([_AM_TRY_CHECK],
[
min_check_version=$1
extra_cflags=$2
extra_libs=$3
check_lib_name=$4
CHECK_CFLAGS="$extra_cflags"
CHECK_LIBS="$extra_libs -l$check_lib_name"
ac_save_CFLAGS="$CFLAGS"
ac_save_LIBS="$LIBS"
CFLAGS="$CFLAGS $CHECK_CFLAGS"
LIBS="$CHECK_LIBS $LIBS"
AC_MSG_CHECKING(for check named $check_lib_name - version >= $min_check_version)
rm -f conf.check-test
dnl unset no_check, since in our second run it would have been set to yes
dnl before
no_check=
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <check.h>
int main ()
{
int major, minor, micro;
char *tmp_version;
system ("touch conf.check-test");
/* HP/UX 9 (%@#!) writes to sscanf strings */
tmp_version = strdup("$min_check_version");
if (sscanf(tmp_version, "%d.%d.%d", &major, &minor, &micro) != 3) {
printf("%s, bad version string\n", "$min_check_version");
return 1;
}
if ((CHECK_MAJOR_VERSION != check_major_version) ||
(CHECK_MINOR_VERSION != check_minor_version) ||
(CHECK_MICRO_VERSION != check_micro_version))
{
printf("\n*** The check header file (version %d.%d.%d) does not match\n",
CHECK_MAJOR_VERSION, CHECK_MINOR_VERSION, CHECK_MICRO_VERSION);
printf("*** the check library (version %d.%d.%d).\n",
check_major_version, check_minor_version, check_micro_version);
return 1;
}
if ((check_major_version > major) ||
((check_major_version == major) && (check_minor_version > minor)) ||
((check_major_version == major) && (check_minor_version == minor) && (check_micro_version >= micro)))
{
return 0;
}
else
{
printf("\n*** An old version of check (%d.%d.%d) was found.\n",
check_major_version, check_minor_version, check_micro_version);
printf("*** You need a version of check being at least %d.%d.%d.\n", major, minor, micro);
printf("***\n");
printf("*** If you have already installed a sufficiently new version, this error\n");
printf("*** probably means that the wrong copy of the check library and header\n");
printf("*** file is being found. Rerun configure with the --with-check=PATH option\n");
printf("*** to specify the prefix where the correct version was installed.\n");
}
return 1;
}
],, no_check=yes, [echo $ac_n "cross compiling; assumed OK... $ac_c"])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
if test "x$no_check" = x ; then
AC_MSG_RESULT(yes)
ifelse([$5], , :, [$5])
else
AC_MSG_RESULT(no)
if test -f conf.check-test ; then
:
else
echo "*** Could not run check test program, checking why..."
CFLAGS="$CFLAGS $CHECK_CFLAGS"
LIBS="$CHECK_LIBS $LIBS"
AC_TRY_LINK([
#include <stdio.h>
#include <stdlib.h>
#include <check.h>
], , [ echo "*** The test program compiled, but did not run. This usually means"
echo "*** that the run-time linker is not finding check. You'll need to set your"
echo "*** LD_LIBRARY_PATH environment variable, or edit /etc/ld.so.conf to point"
echo "*** to the installed location Also, make sure you have run ldconfig if that"
echo "*** is required on your system"
echo "***"
echo "*** If you have an old version installed, it is best to remove it, although"
echo "*** you may also be able to get things to work by modifying LD_LIBRARY_PATH"],
[ echo "*** The test program failed to compile or link. See the file config.log for"
echo "*** the exact error that occured." ])
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
fi
CHECK_CFLAGS=""
CHECK_LIBS=""
rm -f conf.check-test
ifelse([$6], , AC_MSG_ERROR([check not found]), [$6])
fi
])
dnl AM_PATH_CHECK([MINIMUM-VERSION, [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND]]])
dnl Test for check, and define CHECK_CFLAGS and CHECK_LIBS
dnl
AC_DEFUN([AM_PATH_CHECK],
[
AC_ARG_WITH(check,
[ --with-check=PATH prefix where check is installed [default=auto]])
AC_ARG_WITH(checklibname,
AC_HELP_STRING([--with-check-lib-name=NAME],
[name of the PIC check library (default=check)]))
min_check_version=ifelse([$1], ,0.8.2,$1)
if test x$with_check = xno; then
AC_MSG_RESULT(disabled)
ifelse([$3], , AC_MSG_ERROR([disabling check is not supported]), [$3])
else
if test "x$with_check" != x; then
CHECK_EXTRA_CFLAGS="-I$with_check/include"
CHECK_EXTRA_LIBS="-L$with_check/lib"
else
CHECK_EXTRA_CFLAGS=""
CHECK_EXTRA_LIBS=""
fi
if test x$with_checklibname = x; then
_AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS,
check_pic, [have_check=true], [have_check=false])
if test x$have_check = xtrue; then
ifelse([$2], , :, [$2])
else
_AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS,
check, [have_check=true], [have_check=false])
if test x$have_check = xtrue; then
ifelse([$2], , :, [$2])
else
ifelse([$3], , AC_MSG_ERROR([check not found]), [$3])
fi
fi
else
_AM_TRY_CHECK($min_check_version, $CHECK_EXTRA_CFLAGS, $CHECK_EXTRA_LIBS,
$with_checklibname, [have_check=true], [have_check=false])
if test x$have_check = xtrue; then
ifelse([$2], , :, [$2])
else
ifelse([$3], , AC_MSG_ERROR([check not found]), [$3])
fi
fi
AC_SUBST(CHECK_CFLAGS)
AC_SUBST(CHECK_LIBS)
rm -f conf.check-test
fi
])

View file

@ -1,380 +0,0 @@
# Copyright (C) 1995-2002 Free Software Foundation, Inc.
# Copyright (C) 2001-2003 Red Hat, Inc.
#
# This file is free software, distributed under the terms of the GNU
# General Public License. As a special exception to the GNU General
# Public License, this file may be distributed as part of a program
# that contains a configuration script generated by Autoconf, under
# the same distribution terms as the rest of that program.
#
# This file can be copied and used freely without restrictions. It can
# be used in projects which are not available under the GNU Public License
# but which still want to provide support for the GNU gettext functionality.
#
# Macro to add for using GNU gettext.
# Ulrich Drepper <drepper@cygnus.com>, 1995, 1996
#
# Modified to never use included libintl.
# Owen Taylor <otaylor@redhat.com>, 12/15/1998
#
# Major rework to remove unused code
# Owen Taylor <otaylor@redhat.com>, 12/11/2002
#
# Added better handling of ALL_LINGUAS from GNU gettext version
# written by Bruno Haible, Owen Taylor <otaylor.redhat.com> 5/30/3002
#
# We need this here as well, since someone might use autoconf-2.5x
# to configure GLib then an older version to configure a package
# using AM_GLIB_GNU_GETTEXT
AC_PREREQ(2.53)
dnl
dnl We go to great lengths to make sure that aclocal won't
dnl try to pull in the installed version of these macros
dnl when running aclocal in the glib directory.
dnl
m4_copy([AC_DEFUN],[glib_DEFUN])
m4_copy([AC_REQUIRE],[glib_REQUIRE])
dnl
dnl At the end, if we're not within glib, we'll define the public
dnl definitions in terms of our private definitions.
dnl
# GLIB_LC_MESSAGES
#--------------------
glib_DEFUN([GLIB_LC_MESSAGES],
[AC_CHECK_HEADERS([locale.h])
if test $ac_cv_header_locale_h = yes; then
AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
[AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
if test $am_cv_val_LC_MESSAGES = yes; then
AC_DEFINE(HAVE_LC_MESSAGES, 1,
[Define if your <locale.h> file defines LC_MESSAGES.])
fi
fi])
# GLIB_PATH_PROG_WITH_TEST
#----------------------------
dnl GLIB_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR,
dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
glib_DEFUN([GLIB_PATH_PROG_WITH_TEST],
[# Extract the first word of "$2", so it can be a program name with args.
set dummy $2; ac_word=[$]2
AC_MSG_CHECKING([for $ac_word])
AC_CACHE_VAL(ac_cv_path_$1,
[case "[$]$1" in
/*)
ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
;;
*)
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in ifelse([$5], , $PATH, [$5]); do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
if [$3]; then
ac_cv_path_$1="$ac_dir/$ac_word"
break
fi
fi
done
IFS="$ac_save_ifs"
dnl If no 4th arg is given, leave the cache variable unset,
dnl so AC_PATH_PROGS will keep looking.
ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
])dnl
;;
esac])dnl
$1="$ac_cv_path_$1"
if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then
AC_MSG_RESULT([$]$1)
else
AC_MSG_RESULT(no)
fi
AC_SUBST($1)dnl
])
# GLIB_WITH_NLS
#-----------------
glib_DEFUN([GLIB_WITH_NLS],
dnl NLS is obligatory
[USE_NLS=yes
AC_SUBST(USE_NLS)
gt_cv_have_gettext=no
CATOBJEXT=NONE
XGETTEXT=:
INTLLIBS=
AC_CHECK_HEADER(libintl.h,
[gt_cv_func_dgettext_libintl="no"
libintl_extra_libs=""
#
# First check in libc
#
AC_CACHE_CHECK([for dgettext in libc], gt_cv_func_dgettext_libc,
[AC_TRY_LINK([
#include <libintl.h>
],
[return (int) dgettext ("","")],
gt_cv_func_dgettext_libc=yes,
gt_cv_func_dgettext_libc=no)
])
if test "$gt_cv_func_dgettext_libc" = "yes" ; then
AC_CHECK_FUNCS(bind_textdomain_codeset)
fi
#
# If we don't have everything we want, check in libintl
#
if test "$gt_cv_func_dgettext_libc" != "yes" \
|| test "$ac_cv_func_bind_textdomain_codeset" != "yes" ; then
AC_CHECK_LIB(intl, bindtextdomain,
[AC_CHECK_LIB(intl, dgettext,
gt_cv_func_dgettext_libintl=yes)])
if test "$gt_cv_func_dgettext_libintl" != "yes" ; then
AC_MSG_CHECKING([if -liconv is needed to use gettext])
AC_MSG_RESULT([])
AC_CHECK_LIB(intl, dcgettext,
[gt_cv_func_dgettext_libintl=yes
libintl_extra_libs=-liconv],
:,-liconv)
fi
#
# If we found libintl, then check in it for bind_textdomain_codeset();
# we'll prefer libc if neither have bind_textdomain_codeset(),
# and both have dgettext
#
if test "$gt_cv_func_dgettext_libintl" = "yes" ; then
glib_save_LIBS="$LIBS"
LIBS="$LIBS -lintl $libintl_extra_libs"
unset ac_cv_func_bind_textdomain_codeset
AC_CHECK_FUNCS(bind_textdomain_codeset)
LIBS="$glib_save_LIBS"
if test "$ac_cv_func_bind_textdomain_codeset" = "yes" ; then
gt_cv_func_dgettext_libc=no
else
if test "$gt_cv_func_dgettext_libc" = "yes"; then
gt_cv_func_dgettext_libintl=no
fi
fi
fi
fi
if test "$gt_cv_func_dgettext_libc" = "yes" \
|| test "$gt_cv_func_dgettext_libintl" = "yes"; then
gt_cv_have_gettext=yes
fi
if test "$gt_cv_func_dgettext_libintl" = "yes"; then
INTLLIBS="-lintl $libintl_extra_libs"
fi
if test "$gt_cv_have_gettext" = "yes"; then
AC_DEFINE(HAVE_GETTEXT,1,
[Define if the GNU gettext() function is already present or preinstalled.])
GLIB_PATH_PROG_WITH_TEST(MSGFMT, msgfmt,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep 'dv '`"], no)dnl
if test "$MSGFMT" != "no"; then
glib_save_LIBS="$LIBS"
LIBS="$LIBS $INTLLIBS"
AC_CHECK_FUNCS(dcgettext)
AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
GLIB_PATH_PROG_WITH_TEST(XGETTEXT, xgettext,
[test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
AC_TRY_LINK(, [extern int _nl_msg_cat_cntr;
return _nl_msg_cat_cntr],
[CATOBJEXT=.gmo
DATADIRNAME=share],
[case $host in
*-*-solaris*)
dnl On Solaris, if bind_textdomain_codeset is in libc,
dnl GNU format message catalog is always supported,
dnl since both are added to the libc all together.
dnl Hence, we'd like to go with DATADIRNAME=share and
dnl and CATOBJEXT=.gmo in this case.
AC_CHECK_FUNC(bind_textdomain_codeset,
[CATOBJEXT=.gmo
DATADIRNAME=share],
[CATOBJEXT=.mo
DATADIRNAME=lib])
;;
*)
CATOBJEXT=.mo
DATADIRNAME=lib
;;
esac])
LIBS="$glib_save_LIBS"
INSTOBJEXT=.mo
else
gt_cv_have_gettext=no
fi
fi
])
if test "$gt_cv_have_gettext" = "yes" ; then
AC_DEFINE(ENABLE_NLS, 1,
[always defined to indicate that i18n is enabled])
fi
dnl Test whether we really found GNU xgettext.
if test "$XGETTEXT" != ":"; then
dnl If it is not GNU xgettext we define it as : so that the
dnl Makefiles still can work.
if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
: ;
else
AC_MSG_RESULT(
[found xgettext program is not GNU xgettext; ignore it])
XGETTEXT=":"
fi
fi
# We need to process the po/ directory.
POSUB=po
AC_OUTPUT_COMMANDS(
[case "$CONFIG_FILES" in *po/Makefile.in*)
sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
esac])
dnl These rules are solely for the distribution goal. While doing this
dnl we only have to keep exactly one list of the available catalogs
dnl in configure.in.
for lang in $ALL_LINGUAS; do
GMOFILES="$GMOFILES $lang.gmo"
POFILES="$POFILES $lang.po"
done
dnl Make all variables we use known to autoconf.
AC_SUBST(CATALOGS)
AC_SUBST(CATOBJEXT)
AC_SUBST(DATADIRNAME)
AC_SUBST(GMOFILES)
AC_SUBST(INSTOBJEXT)
AC_SUBST(INTLLIBS)
AC_SUBST(PO_IN_DATADIR_TRUE)
AC_SUBST(PO_IN_DATADIR_FALSE)
AC_SUBST(POFILES)
AC_SUBST(POSUB)
])
# AM_GLIB_GNU_GETTEXT
# -------------------
# Do checks necessary for use of gettext. If a suitable implementation
# of gettext is found in either in libintl or in the C library,
# it will set INTLLIBS to the libraries needed for use of gettext
# and AC_DEFINE() HAVE_GETTEXT and ENABLE_NLS. (The shell variable
# gt_cv_have_gettext will be set to "yes".) It will also call AC_SUBST()
# on various variables needed by the Makefile.in.in installed by
# glib-gettextize.
dnl
glib_DEFUN([GLIB_GNU_GETTEXT],
[AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_HEADER_STDC])dnl
GLIB_LC_MESSAGES
GLIB_WITH_NLS
if test "$gt_cv_have_gettext" = "yes"; then
if test "x$ALL_LINGUAS" = "x"; then
LINGUAS=
else
AC_MSG_CHECKING(for catalogs to be installed)
NEW_LINGUAS=
for presentlang in $ALL_LINGUAS; do
useit=no
if test "%UNSET%" != "${LINGUAS-%UNSET%}"; then
desiredlanguages="$LINGUAS"
else
desiredlanguages="$ALL_LINGUAS"
fi
for desiredlang in $desiredlanguages; do
# Use the presentlang catalog if desiredlang is
# a. equal to presentlang, or
# b. a variant of presentlang (because in this case,
# presentlang can be used as a fallback for messages
# which are not translated in the desiredlang catalog).
case "$desiredlang" in
"$presentlang"*) useit=yes;;
esac
done
if test $useit = yes; then
NEW_LINGUAS="$NEW_LINGUAS $presentlang"
fi
done
LINGUAS=$NEW_LINGUAS
AC_MSG_RESULT($LINGUAS)
fi
dnl Construct list of names of catalog files to be constructed.
if test -n "$LINGUAS"; then
for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
fi
fi
dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly
dnl find the mkinstalldirs script in another subdir but ($top_srcdir).
dnl Try to locate is.
MKINSTALLDIRS=
if test -n "$ac_aux_dir"; then
MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs"
fi
if test -z "$MKINSTALLDIRS"; then
MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs"
fi
AC_SUBST(MKINSTALLDIRS)
dnl Generate list of files to be processed by xgettext which will
dnl be included in po/Makefile.
test -d po || mkdir po
if test "x$srcdir" != "x."; then
if test "x`echo $srcdir | sed 's@/.*@@'`" = "x"; then
posrcprefix="$srcdir/"
else
posrcprefix="../$srcdir/"
fi
else
posrcprefix="../"
fi
rm -f po/POTFILES
sed -e "/^#/d" -e "/^\$/d" -e "s,.*, $posrcprefix& \\\\," -e "\$s/\(.*\) \\\\/\1/" \
< $srcdir/po/POTFILES.in > po/POTFILES
])
# AM_GLIB_DEFINE_LOCALEDIR(VARIABLE)
# -------------------------------
# Define VARIABLE to the location where catalog files will
# be installed by po/Makefile.
glib_DEFUN([GLIB_DEFINE_LOCALEDIR],
[glib_REQUIRE([GLIB_GNU_GETTEXT])dnl
glib_save_prefix="$prefix"
glib_save_exec_prefix="$exec_prefix"
test "x$prefix" = xNONE && prefix=$ac_default_prefix
test "x$exec_prefix" = xNONE && exec_prefix=$prefix
if test "x$CATOBJEXT" = "x.mo" ; then
localedir=`eval echo "${libdir}/locale"`
else
localedir=`eval echo "${datadir}/locale"`
fi
prefix="$glib_save_prefix"
exec_prefix="$glib_save_exec_prefix"
AC_DEFINE_UNQUOTED($1, "$localedir",
[Define the location where the catalogs will be installed])
])
dnl
dnl Now the definitions that aclocal will find
dnl
ifdef(glib_configure_in,[],[
AC_DEFUN([AM_GLIB_GNU_GETTEXT],[GLIB_GNU_GETTEXT($@)])
AC_DEFUN([AM_GLIB_DEFINE_LOCALEDIR],[GLIB_DEFINE_LOCALEDIR($@)])
])dnl

View file

@ -1,123 +0,0 @@
dnl AG_GST_ARCH
dnl sets up defines and automake conditionals for host architecture
dnl checks endianness
dnl defines HOST_CPU
AC_DEFUN([AG_GST_ARCH],
[
AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use host_ variables
dnl Determine CPU
case "x${host_cpu}" in
xi?86 | xk? | xi?86_64)
HAVE_CPU_I386=yes
AC_DEFINE(HAVE_CPU_I386, 1, [Define if the host CPU is an x86])
dnl FIXME could use some better detection
dnl (ie CPUID)
case "x${host_cpu}" in
xi386 | xi486) ;;
*)
AC_DEFINE(HAVE_RDTSC, 1, [Define if RDTSC is available]) ;;
esac ;;
xpowerpc)
HAVE_CPU_PPC=yes
AC_DEFINE(HAVE_CPU_PPC, 1, [Define if the host CPU is a PowerPC]) ;;
xpowerpc64)
HAVE_CPU_PPC64=yes
AC_DEFINE(HAVE_CPU_PPC64, 1, [Define if the host CPU is a 64 bit PowerPC]) ;;
xalpha*)
HAVE_CPU_ALPHA=yes
AC_DEFINE(HAVE_CPU_ALPHA, 1, [Define if the host CPU is an Alpha]) ;;
xarm*)
HAVE_CPU_ARM=yes
AC_DEFINE(HAVE_CPU_ARM, 1, [Define if the host CPU is an ARM]) ;;
xsparc*)
HAVE_CPU_SPARC=yes
AC_DEFINE(HAVE_CPU_SPARC, 1, [Define if the host CPU is a SPARC]) ;;
xmips*)
HAVE_CPU_MIPS=yes
AC_DEFINE(HAVE_CPU_MIPS, 1, [Define if the host CPU is a MIPS]) ;;
xhppa*)
HAVE_CPU_HPPA=yes
AC_DEFINE(HAVE_CPU_HPPA, 1, [Define if the host CPU is a HPPA]) ;;
xs390*)
HAVE_CPU_S390=yes
AC_DEFINE(HAVE_CPU_S390, 1, [Define if the host CPU is a S390]) ;;
xia64*)
HAVE_CPU_IA64=yes
AC_DEFINE(HAVE_CPU_IA64, 1, [Define if the host CPU is a IA64]) ;;
xm68k*)
HAVE_CPU_M68K=yes
AC_DEFINE(HAVE_CPU_M68K, 1, [Define if the host CPU is a M68K]) ;;
xx86_64)
HAVE_CPU_X86_64=yes
AC_DEFINE(HAVE_CPU_X86_64, 1, [Define if the host CPU is a x86_64]) ;;
xcris)
HAVE_CPU_CRIS=yes
AC_DEFINE(HAVE_CPU_CRIS, 1, [Define if the host CPU is a CRIS]) ;;
xcrisv32)
HAVE_CPU_CRISV32=yes
AC_DEFINE(HAVE_CPU_CRISV32, 1, [Define if the host CPU is a CRISv32]) ;;
esac
dnl Determine endianness
AC_C_BIGENDIAN
AM_CONDITIONAL(HAVE_CPU_I386, test "x$HAVE_CPU_I386" = "xyes")
AM_CONDITIONAL(HAVE_CPU_PPC, test "x$HAVE_CPU_PPC" = "xyes")
AM_CONDITIONAL(HAVE_CPU_PPC64, test "x$HAVE_CPU_PPC64" = "xyes")
AM_CONDITIONAL(HAVE_CPU_ALPHA, test "x$HAVE_CPU_ALPHA" = "xyes")
AM_CONDITIONAL(HAVE_CPU_ARM, test "x$HAVE_CPU_ARM" = "xyes")
AM_CONDITIONAL(HAVE_CPU_SPARC, test "x$HAVE_CPU_SPARC" = "xyes")
AM_CONDITIONAL(HAVE_CPU_HPPA, test "x$HAVE_CPU_HPPA" = "xyes")
AM_CONDITIONAL(HAVE_CPU_MIPS, test "x$HAVE_CPU_MIPS" = "xyes")
AM_CONDITIONAL(HAVE_CPU_S390, test "x$HAVE_CPU_S390" = "xyes")
AM_CONDITIONAL(HAVE_CPU_IA64, test "x$HAVE_CPU_IA64" = "xyes")
AM_CONDITIONAL(HAVE_CPU_M68K, test "x$HAVE_CPU_M68K" = "xyes")
AM_CONDITIONAL(HAVE_CPU_X86_64, test "x$HAVE_CPU_X86_64" = "xyes")
AM_CONDITIONAL(HAVE_CPU_CRIS, test "x$HAVE_CPU_CRIS" = "xyes")
AM_CONDITIONAL(HAVE_CPU_CRISV32, test "x$HAVE_CPU_CRISV32" = "xyes")
AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu", [the host CPU])
])
dnl check if unaligned memory access works correctly
AC_DEFUN([AG_GST_UNALIGNED_ACCESS], [
AC_MSG_CHECKING([if unaligned memory access works correctly])
if test x"$as_cv_unaligned_access" = x ; then
case $host in
alpha*|arm*|hp*|mips*|sh*|sparc*|ia64*)
_AS_ECHO_N([(blacklisted) ])
as_cv_unaligned_access=no
;;
i?86*|powerpc*|m68k*|cris*)
_AS_ECHO_N([(whitelisted) ])
as_cv_unaligned_access=yes
;;
esac
else
_AS_ECHO_N([(cached) ])
fi
if test x"$as_cv_unaligned_access" = x ; then
AC_TRY_RUN([
int main(int argc, char **argv)
{
char array[] = "ABCDEFGH";
unsigned int iarray[2];
memcpy(iarray,array,8);
#define GET(x) (*(unsigned int *)((char *)iarray + (x)))
if(GET(0) != 0x41424344 && GET(0) != 0x44434241) return 1;
if(GET(1) != 0x42434445 && GET(1) != 0x45444342) return 1;
if(GET(2) != 0x43444546 && GET(2) != 0x46454443) return 1;
if(GET(3) != 0x44454647 && GET(3) != 0x47464544) return 1;
return 0;
}
], as_cv_unaligned_access="yes", as_cv_unaligned_access="no")
fi
AC_MSG_RESULT($as_cv_unaligned_access)
if test "$as_cv_unaligned_access" = "yes"; then
AC_DEFINE_UNQUOTED(HAVE_UNALIGNED_ACCESS, 1,
[defined if unaligned memory access works correctly])
fi
])

View file

@ -1,276 +0,0 @@
dnl configure-time options shared among gstreamer modules
dnl AG_GST_ARG_DEBUG
dnl AG_GST_ARG_PROFILING
dnl AG_GST_ARG_VALGRIND
dnl AG_GST_ARG_GCOV
dnl AG_GST_ARG_EXAMPLES
dnl AG_GST_ARG_WITH_PKG_CONFIG_PATH
dnl AG_GST_ARG_WITH_PACKAGE_NAME
dnl AG_GST_ARG_WITH_PACKAGE_ORIGIN
dnl AG_GST_ARG_WITH_PLUGINS
dnl AG_GST_ARG_ENABLE_EXTERNAL
dnl AG_GST_ARG_ENABLE_EXPERIMENTAL
dnl AG_GST_ARG_ENABLE_BROKEN
AC_DEFUN([AG_GST_ARG_DEBUG],
[
dnl debugging stuff
AC_ARG_ENABLE(debug,
AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]),
[
case "${enableval}" in
yes) USE_DEBUG=yes ;;
no) USE_DEBUG=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
esac
],
[USE_DEBUG=yes]) dnl Default value
])
AC_DEFUN([AG_GST_ARG_PROFILING],
[
AC_ARG_ENABLE(profiling,
AC_HELP_STRING([--enable-profiling],
[adds -pg to compiler commandline, for profiling]),
[
case "${enableval}" in
yes) USE_PROFILING=yes ;;
no) USE_PROFILING=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-profiling) ;;
esac
],
[USE_PROFILING=no]) dnl Default value
])
AC_DEFUN([AG_GST_ARG_VALGRIND],
[
dnl valgrind inclusion
AC_ARG_ENABLE(valgrind,
AC_HELP_STRING([--disable-valgrind],[disable run-time valgrind detection]),
[
case "${enableval}" in
yes) USE_VALGRIND="$USE_DEBUG" ;;
no) USE_VALGRIND=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;;
esac
],
[USE_VALGRIND="$USE_DEBUG"]) dnl Default value
VALGRIND_REQ="2.1"
if test "x$USE_VALGRIND" = xyes; then
PKG_CHECK_MODULES(VALGRIND, valgrind > $VALGRIND_REQ,
USE_VALGRIND="yes",
[
USE_VALGRIND="no"
AC_MSG_RESULT([no])
])
fi
if test "x$USE_VALGRIND" = xyes; then
AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used])
AC_MSG_NOTICE(Using extra code paths for valgrind)
fi
])
AC_DEFUN([AG_GST_ARG_GCOV],
[
AC_ARG_ENABLE(gcov,
AC_HELP_STRING([--enable-gcov],
[compile with coverage profiling instrumentation (gcc only)]),
enable_gcov=$enableval,
enable_gcov=no)
if test x$enable_gcov = xyes ; then
if test "x$GCC" != "xyes"
then
AC_MSG_ERROR([gcov only works if gcc is used])
fi
AS_COMPILER_FLAG(["-fprofile-arcs"],
[GCOV_CFLAGS="$GCOV_CFLAGS -fprofile-arcs"],
true)
AS_COMPILER_FLAG(["-ftest-coverage"],
[GCOV_CFLAGS="$GCOV_CFLAGS -ftest-coverage"],
true)
dnl remove any -O flags - FIXME: is this needed ?
GCOV_CFLAGS=`echo "$GCOV_CFLAGS" | sed -e 's/-O[[0-9]]*//g'`
dnl libtool 1.5.22 and lower strip -fprofile-arcs from the flags
dnl passed to the linker, which is a bug; -fprofile-arcs implicitly
dnl links in -lgcov, so we do it explicitly here for the same effect
GCOV_LIBS=-lgcov
AC_SUBST(GCOV_CFLAGS)
AC_SUBST(GCOV_LIBS)
GCOV=`echo $CC | sed s/gcc/gcov/g`
AC_SUBST(GCOV)
GST_GCOV_ENABLED=yes
AC_DEFINE_UNQUOTED(GST_GCOV_ENABLED, 1,
[Defined if gcov is enabled to force a rebuild due to config.h changing])
dnl if gcov is used, we do not want default -O2 CFLAGS
if test "x$GST_GCOV_ENABLED" = "xyes"
then
CFLAGS="-O0"
AC_SUBST(CFLAGS)
CXXFLAGS="-O0"
AC_SUBST(CXXFLAGS)
FFLAGS="-O0"
AC_SUBST(FFLAGS)
CCASFLAGS="-O0"
AC_SUBST(CCASFLAGS)
AC_MSG_NOTICE([gcov enabled, setting CFLAGS and friends to $CFLAGS])
fi
fi
AM_CONDITIONAL(GST_GCOV_ENABLED, test x$enable_gcov = xyes)
])
AC_DEFUN([AG_GST_ARG_EXAMPLES],
[
AC_ARG_ENABLE(examples,
AC_HELP_STRING([--disable-examples], [disable building examples]),
[
case "${enableval}" in
yes) BUILD_EXAMPLES=yes ;;
no) BUILD_EXAMPLES=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-examples) ;;
esac
],
[BUILD_EXAMPLES=yes]) dnl Default value
AM_CONDITIONAL(BUILD_EXAMPLES, test "x$BUILD_EXAMPLES" = "xyes")
])
AC_DEFUN([AG_GST_ARG_WITH_PKG_CONFIG_PATH],
[
dnl possibly modify pkg-config path
AC_ARG_WITH(pkg-config-path,
AC_HELP_STRING([--with-pkg-config-path],
[colon-separated list of pkg-config(1) dirs]),
[
export PKG_CONFIG_PATH=${withval}
AC_MSG_NOTICE(Set PKG_CONFIG_PATH to $PKG_CONFIG_PATH)
])
])
dnl This macro requires that GST_CVS is set to yes or no (release)
AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_NAME],
[
dnl package name in plugins
AC_ARG_WITH(package-name,
AC_HELP_STRING([--with-package-name],
[specify package name to use in plugins]),
[
case "${withval}" in
yes) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;;
no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;;
*) GST_PACKAGE_NAME="${withval}" ;;
esac
],
[
P=$1
if test "x$P" = "x"
then
P=$PACKAGE_NAME
fi
dnl default value
if test "x$GST_CVS" = "xyes"
then
dnl nano >= 1
GST_PACKAGE_NAME="$P CVS/prerelease"
else
GST_PACKAGE_NAME="$P source release"
fi
]
)
AC_MSG_NOTICE(Using $GST_PACKAGE_NAME as package name)
AC_DEFINE_UNQUOTED(GST_PACKAGE_NAME, "$GST_PACKAGE_NAME",
[package name in plugins])
AC_SUBST(GST_PACKAGE_NAME)
])
AC_DEFUN([AG_GST_ARG_WITH_PACKAGE_ORIGIN],
[
dnl package origin URL
AC_ARG_WITH(package-origin,
AC_HELP_STRING([--with-package-origin],
[specify package origin URL to use in plugins]),
[
case "${withval}" in
yes) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;;
no) AC_MSG_ERROR(bad value ${withval} for --with-package-origin) ;;
*) GST_PACKAGE_ORIGIN="${withval}" ;;
esac
],
[GST_PACKAGE_ORIGIN="[Unknown package origin]"] dnl Default value
)
AC_MSG_NOTICE(Using $GST_PACKAGE_ORIGIN as package origin)
AC_DEFINE_UNQUOTED(GST_PACKAGE_ORIGIN, "$GST_PACKAGE_ORIGIN",
[package origin])
AC_SUBST(GST_PACKAGE_ORIGIN)
])
dnl sets GST_PLUGINS_SELECTED to the list given as an argument, or to
dnl GST_PLUGINS_ALL
AC_DEFUN([AG_GST_ARG_WITH_PLUGINS],
[
AC_ARG_WITH(plugins,
AC_HELP_STRING([--with-plugins],
[comma-separated list of dependencyless plug-ins to compile]),
[
for i in `echo $withval | tr , ' '`; do
if echo $GST_PLUGINS_ALL | grep $i > /dev/null
then
GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED $i"
else
echo "plug-in $i not recognized, ignoring..."
fi
done],
[GST_PLUGINS_SELECTED=$GST_PLUGINS_ALL])
])
AC_DEFUN([AG_GST_ARG_ENABLE_EXTERNAL],
[
AG_GST_CHECK_FEATURE(EXTERNAL, [enable building of plug-ins with external deps],,
HAVE_EXTERNAL=yes, enabled,
[
AC_MSG_NOTICE(building external plug-ins)
BUILD_EXTERNAL="yes"
],[
AC_MSG_WARN(all plug-ins with external dependencies will not be built)
BUILD_EXTERNAL="no"
])
# make BUILD_EXTERNAL available to Makefile.am
AM_CONDITIONAL(BUILD_EXTERNAL, test "x$BUILD_EXTERNAL" = "xyes")
])
dnl experimental plug-ins; stuff that hasn't had the dust settle yet
dnl read 'builds, but might not work'
AC_DEFUN([AG_GST_ARG_ENABLE_EXPERIMENTAL],
[
AG_GST_CHECK_FEATURE(EXPERIMENTAL,
[building of experimental plug-ins],,
HAVE_EXPERIMENTAL=yes, disabled,
[
AC_MSG_WARN(building experimental plug-ins)
BUILD_EXPERIMENTAL="yes"
],[
AC_MSG_NOTICE(not building experimental plug-ins)
BUILD_EXPERIMENTAL="no"
])
# make BUILD_EXPERIMENTAL available to Makefile.am
AM_CONDITIONAL(BUILD_EXPERIMENTAL, test "x$BUILD_EXPERIMENTAL" = "xyes")
])
dnl broken plug-ins; stuff that doesn't seem to build at the moment
AC_DEFUN([AG_GST_ARG_ENABLE_BROKEN],
[
AG_GST_CHECK_FEATURE(BROKEN, [enable building of broken plug-ins],,
HAVE_BROKEN=yes, disabled,
[
AC_MSG_WARN([building broken plug-ins -- no bug reports on these, only patches ...])
],[
AC_MSG_NOTICE([not building broken plug-ins])
])
])

View file

@ -1,138 +0,0 @@
dnl pkg-config-based checks for GStreamer modules and dependency modules
dnl generic:
dnl AG_GST_PKG_CHECK_MODULES([PREFIX], [WHICH], [REQUIRED])
dnl sets HAVE_[$PREFIX], [$PREFIX]_*
dnl AG_GST_CHECK_MODULES([PREFIX], [MODULE], [MINVER], [NAME], [REQUIRED])
dnl sets HAVE_[$PREFIX], [$PREFIX]_*
dnl specific:
dnl AG_GST_CHECK_GST([MAJMIN], [MINVER], [REQUIRED])
dnl also sets/ACSUBSTs GST_TOOLS_DIR and GST_PLUGINS_DIR
dnl AG_GST_CHECK_GST_BASE([MAJMIN], [MINVER], [REQUIRED])
dnl AG_GST_CHECK_GST_GDP([MAJMIN], [MINVER], [REQUIRED])
dnl AG_GST_CHECK_GST_CONTROLLER([MAJMIN], [MINVER], [REQUIRED])
dnl AG_GST_CHECK_GST_CHECK([MAJMIN], [MINVER], [REQUIRED])
dnl AG_GST_CHECK_GST_PLUGINS_BASE([MAJMIN], [MINVER], [REQUIRED])
dnl also sets/ACSUBSTs GSTPB_PLUGINS_DIR
AC_DEFUN([AG_GST_PKG_CHECK_MODULES],
[
which="[$2]"
dnl not required by default, since we use this mostly for plugin deps
required=ifelse([$3], , "no", [$3])
PKG_CHECK_MODULES([$1], $which,
[
HAVE_[$1]="yes"
],
[
HAVE_[$1]="no"
AC_MSG_RESULT(no)
if test "x$required" = "xyes"; then
AC_MSG_ERROR($[$1]_PKG_ERRORS)
else
AC_MSG_NOTICE($[$1]_PKG_ERRORS)
fi
])
dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7
dnl It gets done automatically in automake >= 1.7, which we now require
]))
AC_DEFUN([AG_GST_CHECK_MODULES],
[
module=[$2]
minver=[$3]
name="[$4]"
required=ifelse([$5], , "yes", [$5]) dnl required by default
PKG_CHECK_MODULES([$1], $module >= $minver,
[
HAVE_[$1]="yes"
],
[
HAVE_[$1]="no"
AC_MSG_RESULT(no)
AC_MSG_NOTICE($[$1]_PKG_ERRORS)
if test "x$required" = "xyes"; then
AC_MSG_ERROR([no $module >= $minver ($name) found])
else
AC_MSG_NOTICE([no $module >= $minver ($name) found])
fi
])
dnl AC_SUBST of CFLAGS and LIBS was not done before automake 1.7
dnl It gets done automatically in automake >= 1.7, which we now require
]))
AC_DEFUN([AG_GST_CHECK_GST],
[
AG_GST_CHECK_MODULES(GST, gstreamer-[$1], [$2], [GStreamer], [$3])
dnl allow setting before calling this macro to override
if test -z $GST_TOOLS_DIR; then
GST_TOOLS_DIR=`$PKG_CONFIG --variable=toolsdir gstreamer-[$1]`
if test -z $GST_TOOLS_DIR; then
AC_MSG_ERROR(
[no tools dir set in GStreamer pkg-config file, core upgrade needed.])
fi
fi
AC_MSG_NOTICE([using GStreamer tools in $GST_TOOLS_DIR])
AC_SUBST(GST_TOOLS_DIR)
dnl check for where core plug-ins got installed
dnl this is used for unit tests
dnl allow setting before calling this macro to override
if test -z $GST_PLUGINS_DIR; then
GST_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-[$1]`
if test -z $GST_PLUGINS_DIR; then
AC_MSG_ERROR(
[no pluginsdir set in GStreamer pkg-config file, core upgrade needed.])
fi
fi
AC_MSG_NOTICE([using GStreamer plug-ins in $GST_PLUGINS_DIR])
AC_SUBST(GST_PLUGINS_DIR)
])
AC_DEFUN([AG_GST_CHECK_GST_BASE],
[
AG_GST_CHECK_MODULES(GST_BASE, gstreamer-base-[$1], [$2],
[GStreamer Base Libraries], [$3])
])
AC_DEFUN([AG_GST_CHECK_GST_GDP],
[
AG_GST_CHECK_MODULES(GST_GDP, gstreamer-dataprotocol-[$1], [$2],
[GStreamer Data Protocol Library], [$3])
])
AC_DEFUN([AG_GST_CHECK_GST_CONTROLLER],
[
AG_GST_CHECK_MODULES(GST_CONTROLLER, gstreamer-controller-[$1], [$2],
[GStreamer Controller Library], [$3])
])
AC_DEFUN([AG_GST_CHECK_GST_CHECK],
[
AG_GST_CHECK_MODULES(GST_CHECK, gstreamer-check-[$1], [$2],
[GStreamer Check unittest Library], [$3])
])
AC_DEFUN([AG_GST_CHECK_GST_PLUGINS_BASE],
[
AG_GST_CHECK_MODULES(GST_PLUGINS_BASE, gstreamer-plugins-base-[$1], [$2],
[GStreamer Base Plug-ins Library], [$3])
dnl check for where base plug-ins got installed
dnl this is used for unit tests
dnl allow setting before calling this macro to override
if test -z $GSTPB_PLUGINS_DIR; then
GSTPB_PLUGINS_DIR=`$PKG_CONFIG --variable=pluginsdir gstreamer-plugins-base-[$1]`
if test -z $GSTPB_PLUGINS_DIR; then
AC_MSG_ERROR(
[no pluginsdir set in GStreamer Base Plug-ins pkg-config file])
fi
fi
AC_MSG_NOTICE([using GStreamer Base Plug-ins in $GSTPB_PLUGINS_DIR])
AC_SUBST(GSTPB_PLUGINS_DIR)
])

View file

@ -1,46 +0,0 @@
AC_DEFUN([AG_GST_DEBUGINFO], [
AC_ARG_ENABLE(debug,
AC_HELP_STRING([--disable-debug],[disable addition of -g debugging info]),
[case "${enableval}" in
yes) USE_DEBUG=yes ;;
no) USE_DEBUG=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;;
esac],
[USE_DEBUG=yes]) dnl Default value
AC_ARG_ENABLE(DEBUG,
AC_HELP_STRING([--disable-DEBUG],[disables compilation of debugging messages]),
[case "${enableval}" in
yes) ENABLE_DEBUG=yes ;;
no) ENABLE_DEBUG=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-DEBUG) ;;
esac],
[ENABLE_DEBUG=yes]) dnl Default value
if test x$ENABLE_DEBUG = xyes; then
AC_DEFINE(GST_DEBUG_ENABLED, 1, [Define if DEBUG statements should be compiled in])
fi
AC_ARG_ENABLE(INFO,
AC_HELP_STRING([--disable-INFO],[disables compilation of informational messages]),
[case "${enableval}" in
yes) ENABLE_INFO=yes ;;
no) ENABLE_INFO=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-INFO) ;;
esac],
[ENABLE_INFO=yes]) dnl Default value
if test x$ENABLE_INFO = xyes; then
AC_DEFINE(GST_INFO_ENABLED, 1, [Define if INFO statements should be compiled in])
fi
AC_ARG_ENABLE(debug-color,
AC_HELP_STRING([--disable-debug-color],[disables color output of DEBUG and INFO output]),
[case "${enableval}" in
yes) ENABLE_DEBUG_COLOR=yes ;;
no) ENABLE_DEBUG_COLOR=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-debug-color) ;;
esac],
[ENABLE_DEBUG_COLOR=yes]) dnl Default value
if test "x$ENABLE_DEBUG_COLOR" = xyes; then
AC_DEFINE(GST_DEBUG_COLOR, 1, [Define if debugging messages should be colorized])
fi
])

View file

@ -1,45 +0,0 @@
dnl default elements used for tests and such
dnl AG_GST_DEFAULT_ELEMENTS
AC_DEFUN([AG_GST_DEFAULT_ELEMENTS],
[
dnl decide on default elements
dnl FIXME: provide configure-time options for this
dnl FIXME: describe where exactly this gets used
dnl FIXME: decide if it's a problem that this could point to sinks from
dnl depending plugin modules
DEFAULT_AUDIOSINK="autoaudiosink"
DEFAULT_VIDEOSINK="autovideosink"
DEFAULT_AUDIOSRC="alsasrc"
DEFAULT_VIDEOSRC="v4lsrc"
DEFAULT_VISUALIZER="goom"
case "$host" in
*-sun-* | *pc-solaris* )
DEFAULT_AUDIOSINK="sunaudiosink"
DEFAULT_VIDEOSINK="ximagesink"
DEFAULT_AUDIOSRC="sunaudiosrc"
;;
*-darwin* )
DEFAULT_AUDIOSINK="osxaudiosink"
DEFAULT_AUDIOSRC="osxaudiosrc"
DEFAULT_VIDEOSINK="osxvideosink"
;;
esac
AC_SUBST(DEFAULT_AUDIOSINK)
AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSINK, "$DEFAULT_AUDIOSINK",
[Default audio sink])
AC_SUBST(DEFAULT_AUDIOSRC)
AC_DEFINE_UNQUOTED(DEFAULT_AUDIOSRC, "$DEFAULT_AUDIOSRC",
[Default audio source])
AC_SUBST(DEFAULT_VIDEOSINK)
AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSINK, "$DEFAULT_VIDEOSINK",
[Default video sink])
AC_SUBST(DEFAULT_VIDEOSRC)
AC_DEFINE_UNQUOTED(DEFAULT_VIDEOSRC, "$DEFAULT_VIDEOSRC",
[Default video source])
AC_SUBST(DEFAULT_VISUALIZER)
AC_DEFINE_UNQUOTED(DEFAULT_VISUALIZER, "$DEFAULT_VISUALIZER",
[Default visualizer])
])

View file

@ -1,148 +0,0 @@
AC_DEFUN([AG_GST_DOCBOOK_CHECK],
[
dnl choose a location to install docbook docs in
if test "x$PACKAGE_TARNAME" = "x"
then
AC_MSG_ERROR([Internal error - PACKAGE_TARNAME not set])
fi
docdir="\$(datadir)/doc/$PACKAGE_TARNAME-$GST_MAJORMINOR"
dnl enable/disable docbook documentation building
AC_ARG_ENABLE(docbook,
AC_HELP_STRING([--enable-docbook],
[use docbook to build documentation [default=no]]),,
enable_docbook=no)
have_docbook=no
if test x$enable_docbook = xyes; then
dnl check if we actually have everything we need
dnl check for docbook tools
AC_CHECK_PROG(HAVE_DOCBOOK2PS, docbook2ps, yes, no)
AC_CHECK_PROG(HAVE_DOCBOOK2HTML, docbook2html, yes, no)
AC_CHECK_PROG(HAVE_JADETEX, jadetex, yes, no)
AC_CHECK_PROG(HAVE_PS2PDF, ps2pdf, yes, no)
# -V option appeared in 0.6.10
docbook2html_min_version=0.6.10
if test "x$HAVE_DOCBOOK2HTML" != "xno"; then
docbook2html_version=`docbook2html --version`
AC_MSG_CHECKING([docbook2html version ($docbook2html_version) >= $docbook2html_min_version])
if perl -w <<EOF
(\$min_version_major, \$min_version_minor, \$min_version_micro ) = "$docbook2html_min_version" =~ /(\d+)\.(\d+)\.(\d+)/;
(\$docbook2html_version_major, \$docbook2html_version_minor, \$docbook2html_version_micro ) = "$docbook2html_version" =~ /(\d+)\.(\d+)\.(\d+)/;
exit (((\$docbook2html_version_major > \$min_version_major) ||
((\$docbook2html_version_major == \$min_version_major) &&
(\$docbook2html_version_minor >= \$min_version_minor)) ||
((\$docbook2html_version_major == \$min_version_major) &&
(\$docbook2html_version_minor >= \$min_version_minor) &&
(\$docbook2html_version_micro >= \$min_version_micro)))
? 0 : 1);
EOF
then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
HAVE_DOCBOOK2HTML=no
fi
fi
dnl check if we can process docbook stuff
AS_DOCBOOK(have_docbook=yes, have_docbook=no)
dnl check for extra tools
AC_CHECK_PROG(HAVE_DVIPS, dvips, yes, no)
AC_CHECK_PROG(HAVE_XMLLINT, xmllint, yes, no)
dnl check for image conversion tools
AC_CHECK_PROG(HAVE_FIG2DEV, fig2dev, yes, no)
if test "x$HAVE_FIG2DEV" = "xno" ; then
AC_MSG_WARN([Did not find fig2dev (from xfig), images will not be generated.])
fi
dnl The following is a hack: if fig2dev doesn't display an error message
dnl for the desired type, we assume it supports it.
HAVE_FIG2DEV_EPS=no
if test "x$HAVE_FIG2DEV" = "xyes" ; then
fig2dev_quiet=`fig2dev -L eps </dev/null 2>&1 >/dev/null`
if test "x$fig2dev_quiet" = "x" ; then
HAVE_FIG2DEV_EPS=yes
fi
fi
HAVE_FIG2DEV_PNG=no
if test "x$HAVE_FIG2DEV" = "xyes" ; then
fig2dev_quiet=`fig2dev -L png </dev/null 2>&1 >/dev/null`
if test "x$fig2dev_quiet" = "x" ; then
HAVE_FIG2DEV_PNG=yes
fi
fi
HAVE_FIG2DEV_PDF=no
if test "x$HAVE_FIG2DEV" = "xyes" ; then
fig2dev_quiet=`fig2dev -L pdf </dev/null 2>&1 >/dev/null`
if test "x$fig2dev_quiet" = "x" ; then
HAVE_FIG2DEV_PDF=yes
fi
fi
AC_CHECK_PROG(HAVE_PNGTOPNM, pngtopnm, yes, no)
AC_CHECK_PROG(HAVE_PNMTOPS, pnmtops, yes, no)
AC_CHECK_PROG(HAVE_EPSTOPDF, epstopdf, yes, no)
dnl check if we can generate HTML
if test "x$HAVE_DOCBOOK2HTML" = "xyes" && \
test "x$enable_docbook" = "xyes" && \
test "x$HAVE_XMLLINT" = "xyes" && \
test "x$HAVE_FIG2DEV_PNG" = "xyes"; then
DOC_HTML=yes
AC_MSG_NOTICE(Will output HTML documentation)
else
DOC_HTML=no
AC_MSG_NOTICE(Will not output HTML documentation)
fi
dnl check if we can generate PS
if test "x$HAVE_DOCBOOK2PS" = "xyes" && \
test "x$enable_docbook" = "xyes" && \
test "x$HAVE_XMLLINT" = "xyes" && \
test "x$HAVE_JADETEX" = "xyes" && \
test "x$HAVE_FIG2DEV_EPS" = "xyes" && \
test "x$HAVE_DVIPS" = "xyes" && \
test "x$HAVE_PNGTOPNM" = "xyes" && \
test "x$HAVE_PNMTOPS" = "xyes"; then
DOC_PS=yes
AC_MSG_NOTICE(Will output PS documentation)
else
DOC_PS=no
AC_MSG_NOTICE(Will not output PS documentation)
fi
dnl check if we can generate PDF - using only ps2pdf
if test "x$DOC_PS" = "xyes" && \
test "x$enable_docbook" = "xyes" && \
test "x$HAVE_XMLLINT" = "xyes" && \
test "x$HAVE_PS2PDF" = "xyes"; then
DOC_PDF=yes
AC_MSG_NOTICE(Will output PDF documentation)
else
DOC_PDF=no
AC_MSG_NOTICE(Will not output PDF documentation)
fi
dnl if we don't have everything, we should disable
if test "x$have_docbook" != "xyes"; then
enable_docbook=no
fi
fi
dnl if we're going to install documentation, tell us where
if test "x$have_docbook" = "xyes"; then
AC_MSG_NOTICE(Installing documentation in $docdir)
AC_SUBST(docdir)
fi
AM_CONDITIONAL(ENABLE_DOCBOOK, test x$enable_docbook = xyes)
AM_CONDITIONAL(DOC_HTML, test x$DOC_HTML = xyes)
AM_CONDITIONAL(DOC_PDF, test x$DOC_PDF = xyes)
AM_CONDITIONAL(DOC_PS, test x$DOC_PS = xyes)
])

View file

@ -1,71 +0,0 @@
dnl handle various error-related things
dnl Thomas Vander Stichele <thomas@apestaart.org>
dnl Last modification: 2005-10-16
dnl AG_GST_SET_ERROR_CFLAGS([ADD-WERROR])
dnl AG_GST_SET_LEVEL_DEFAULT([IS-CVS-VERSION])
dnl Sets ERROR_CFLAGS to something the compiler will accept.
dnl AC_SUBST them so they are available in Makefile
dnl -Wall is added if it is supported
dnl -Werror is added if ADD-WERROR is not "no"
dnl These flags can be overridden at make time:
dnl make ERROR_CFLAGS=
AC_DEFUN([AG_GST_SET_ERROR_CFLAGS],
[
AC_REQUIRE([AC_PROG_CC])
AC_REQUIRE([AS_COMPILER_FLAG])
dnl if we support -Wall, set it unconditionally
AS_COMPILER_FLAG(-Wall,
ERROR_CFLAGS="-Wall",
ERROR_CFLAGS="")
dnl if asked for, add -Werror if supported
if test "x$1" != "xno"
then
AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror")
dnl if -Werror isn't suported
if test "x$ERROR_CFLAGS" == "x"
then
dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,no%E_STATEMENT_NOT_REACHED (Sun Forte case)
dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
AS_COMPILER_FLAG([-errwarn=%all,no%E_EMPTY_DECLARATION,no%E_STATEMENT_NOT_REACHED],
[ERROR_CFLAGS="-errwarn=%all,no%E_EMPTY_DECLARATION,no%E_STATEMENT_NOT_REACHED"])
dnl if this also isn't suported, try only for -errwarn=%all
if test "x$ERROR_CFLAGS" == "x"
then
AS_COMPILER_FLAG(-errwarn=%all,
ERROR_CFLAGS="-errwarn=%all")
fi
fi
fi
AC_SUBST(ERROR_CFLAGS)
AC_MSG_NOTICE([set ERROR_CFLAGS to $ERROR_CFLAGS])
])
dnl Sets the default error level for debugging messages
AC_DEFUN([AG_GST_SET_LEVEL_DEFAULT],
[
dnl define correct errorlevel for debugging messages. We want to have
dnl GST_ERROR messages printed when running cvs builds
if test "x[$1]" = "xyes"; then
GST_LEVEL_DEFAULT=GST_LEVEL_ERROR
else
GST_LEVEL_DEFAULT=GST_LEVEL_NONE
fi
AC_DEFINE_UNQUOTED(GST_LEVEL_DEFAULT, $GST_LEVEL_DEFAULT,
[Default errorlevel to use])
dnl AC_SUBST so we can use it for win32/common/config.h
AC_SUBST(GST_LEVEL_DEFAULT)
])

View file

@ -1,285 +0,0 @@
dnl Perform a check for a feature for GStreamer
dnl Richard Boulton <richard-alsa@tartarus.org>
dnl Thomas Vander Stichele <thomas@apestaart.org> added useful stuff
dnl Last modification: 25/06/2001
dnl AG_GST_CHECK_FEATURE(FEATURE-NAME, FEATURE-DESCRIPTION,
dnl DEPENDENT-PLUGINS, TEST-FOR-FEATURE,
dnl DISABLE-BY-DEFAULT, ACTION-IF-USE, ACTION-IF-NOTUSE)
dnl
dnl This macro adds a command line argument to allow the user to enable
dnl or disable a feature, and if the feature is enabled, performs a supplied
dnl test to check if the feature is available.
dnl
dnl The test should define HAVE_<FEATURE-NAME> to "yes" or "no" depending
dnl on whether the feature is available.
dnl
dnl The macro will set USE_<FEATURE-NAME> to "yes" or "no" depending on
dnl whether the feature is to be used.
dnl Thomas changed this, so that when USE_<FEATURE-NAME> was already set
dnl to no, then it stays that way.
dnl
dnl The macro will call AM_CONDITIONAL(USE_<<FEATURE-NAME>, ...) to allow
dnl the feature to control what is built in Makefile.ams. If you want
dnl additional actions resulting from the test, you can add them with the
dnl ACTION-IF-USE and ACTION-IF-NOTUSE parameters.
dnl
dnl FEATURE-NAME is the name of the feature, and should be in
dnl purely upper case characters.
dnl FEATURE-DESCRIPTION is used to describe the feature in help text for
dnl the command line argument.
dnl DEPENDENT-PLUGINS lists any plug-ins which depend on this feature.
dnl TEST-FOR-FEATURE is a test which sets HAVE_<FEATURE-NAME> to "yes"
dnl or "no" depending on whether the feature is
dnl available.
dnl DISABLE-BY-DEFAULT if "disabled", the feature is disabled by default,
dnl if any other value, the feature is enabled by default.
dnl ACTION-IF-USE any extra actions to perform if the feature is to be
dnl used.
dnl ACTION-IF-NOTUSE any extra actions to perform if the feature is not to
dnl be used.
dnl
dnl
dnl thomas :
dnl we also added a history.
dnl GST_PLUGINS_YES will contain all plugins to be built
dnl that were checked through AG_GST_CHECK_FEATURE
dnl GST_PLUGINS_NO will contain those that won't be built
AC_DEFUN([AG_GST_CHECK_FEATURE],
[echo
AC_MSG_NOTICE(*** checking feature: [$2] ***)
if test "x[$3]" != "x"
then
AC_MSG_NOTICE(*** for plug-ins: [$3] ***)
fi
dnl
builtin(define, [gst_endisable], ifelse($5, [disabled], [enable], [disable]))dnl
dnl if it is set to NO, then don't even consider it for building
NOUSE=
if test "x$USE_[$1]" = "xno"; then
NOUSE="yes"
fi
AC_ARG_ENABLE(translit([$1], A-Z, a-z),
[ ]builtin(format, --%-26s gst_endisable %s, gst_endisable-translit([$1], A-Z, a-z), [$2]ifelse([$3],,,: [$3])),
[ case "${enableval}" in
yes) USE_[$1]=yes;;
no) USE_[$1]=no;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-translit([$1], A-Z, a-z)) ;;
esac],
[ USE_$1=]ifelse($5, [disabled], [no], [yes])) dnl DEFAULT
dnl *** set it back to no if it was preset to no
if test "x$NOUSE" = "xyes"; then
USE_[$1]="no"
AC_MSG_WARN(*** $3 pre-configured not to be built)
fi
NOUSE=
dnl *** If it's enabled
if test x$USE_[$1] = xyes; then
dnl save compile variables before the test
gst_check_save_LIBS=$LIBS
gst_check_save_LDFLAGS=$LDFLAGS
gst_check_save_CFLAGS=$CFLAGS
gst_check_save_CPPFLAGS=$CPPFLAGS
gst_check_save_CXXFLAGS=$CXXFLAGS
HAVE_[$1]=no
dnl TEST_FOR_FEATURE
$4
LIBS=$gst_check_save_LIBS
LDFLAGS=$gst_check_save_LDFLAGS
CFLAGS=$gst_check_save_CFLAGS
CPPFLAGS=$gst_check_save_CPPFLAGS
CXXFLAGS=$gst_check_save_CXXFLAGS
dnl If it isn't found, unset USE_[$1]
if test x$HAVE_[$1] = xno; then
USE_[$1]=no
else
ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will be built: [$3])])
fi
fi
dnl *** Warn if it's disabled or not found
if test x$USE_[$1] = xyes; then
ifelse([$6], , :, [$6])
if test "x$3" != "x"; then
GST_PLUGINS_YES="\t[$3]\n$GST_PLUGINS_YES"
fi
AC_DEFINE(HAVE_[$1], , [support for features: $3])
else
ifelse([$3], , :, [AC_MSG_NOTICE(*** These plugins will not be built: [$3])])
if test "x$3" != "x"; then
GST_PLUGINS_NO="\t[$3]\n$GST_PLUGINS_NO"
fi
ifelse([$7], , :, [$7])
fi
dnl *** Define the conditional as appropriate
AM_CONDITIONAL(USE_[$1], test x$USE_[$1] = xyes)
])
dnl Use a -config program which accepts --cflags and --libs parameters
dnl to set *_CFLAGS and *_LIBS and check existence of a feature.
dnl Richard Boulton <richard-alsa@tartarus.org>
dnl Last modification: 26/06/2001
dnl AG_GST_CHECK_CONFIGPROG(FEATURE-NAME, CONFIG-PROG-FILENAME, MODULES)
dnl
dnl This check was written for GStreamer: it should be renamed and checked
dnl for portability if you decide to use it elsewhere.
dnl
AC_DEFUN([AG_GST_CHECK_CONFIGPROG],
[
AC_PATH_PROG([$1]_CONFIG, [$2], no)
if test x$[$1]_CONFIG = xno; then
[$1]_LIBS=
[$1]_CFLAGS=
HAVE_[$1]=no
else
if [$2] --plugin-libs [$3] &> /dev/null; then
[$1]_LIBS=`[$2] --plugin-libs [$3]`
else
[$1]_LIBS=`[$2] --libs [$3]`
fi
[$1]_CFLAGS=`[$2] --cflags [$3]`
HAVE_[$1]=yes
fi
AC_SUBST([$1]_LIBS)
AC_SUBST([$1]_CFLAGS)
])
dnl Use AC_CHECK_LIB and AC_CHECK_HEADER to do both tests at once
dnl sets HAVE_module if we have it
dnl Richard Boulton <richard-alsa@tartarus.org>
dnl Last modification: 26/06/2001
dnl AG_GST_CHECK_LIBHEADER(FEATURE-NAME, LIB NAME, LIB FUNCTION, EXTRA LD FLAGS,
dnl HEADER NAME, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
dnl
dnl This check was written for GStreamer: it should be renamed and checked
dnl for portability if you decide to use it elsewhere.
dnl
AC_DEFUN([AG_GST_CHECK_LIBHEADER],
[
AC_CHECK_LIB([$2], [$3], HAVE_[$1]=yes, HAVE_[$1]=no,[$4])
if test "x$HAVE_[$1]" = "xyes"; then
AC_CHECK_HEADER([$5], :, HAVE_[$1]=no)
if test "x$HAVE_[$1]" = "xyes"; then
dnl execute what needs to be
ifelse([$6], , :, [$6])
else
ifelse([$7], , :, [$7])
fi
else
ifelse([$7], , :, [$7])
fi
AC_SUBST(HAVE_[$1])
]
)
dnl 2004-02-14 Thomas - changed to get set properly and use proper output
dnl 2003-06-27 Benjamin Otte - changed to make this work with gstconfig.h
dnl
dnl Add a subsystem --disable flag and all the necessary symbols and substitions
dnl
dnl AG_GST_CHECK_SUBSYSTEM_DISABLE(SYSNAME, [subsystem name])
dnl
AC_DEFUN([AG_GST_CHECK_SUBSYSTEM_DISABLE],
[
dnl this define will replace each literal subsys_def occurrence with
dnl the lowercase hyphen-separated subsystem
dnl e.g. if $1 is GST_DEBUG then subsys_def will be a macro with gst-debug
define([subsys_def],translit([$1], _A-Z, -a-z))
AC_ARG_ENABLE(subsys_def,
AC_HELP_STRING(--disable-subsys_def, [disable $2]),
[
case "${enableval}" in
yes) GST_DISABLE_[$1]=no ;;
no) GST_DISABLE_[$1]=yes ;;
*) AC_MSG_ERROR([bad value ${enableval} for --enable-subsys_def]) ;;
esac
],
[GST_DISABLE_[$1]=no]) dnl Default value
if test x$GST_DISABLE_[$1] = xyes; then
AC_MSG_NOTICE([disabled subsystem [$2]])
GST_DISABLE_[$1]_DEFINE="#define GST_DISABLE_$1 1"
else
GST_DISABLE_[$1]_DEFINE="/* #undef GST_DISABLE_$1 */"
fi
AC_SUBST(GST_DISABLE_[$1]_DEFINE)
undefine([subsys_def])
])
dnl Parse gstconfig.h for feature and defines add the symbols and substitions
dnl
dnl AG_GST_PARSE_SUBSYSTEM_DISABLE(GST_CONFIGPATH, FEATURE)
dnl
AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLE],
[
grep >/dev/null "#undef GST_DISABLE_$2" $1
if test $? = 0; then
GST_DISABLE_[$2]=0
else
GST_DISABLE_[$2]=1
fi
AC_SUBST(GST_DISABLE_[$2])
])
dnl Parse gstconfig.h and defines add the symbols and substitions
dnl
dnl GST_CONFIGPATH=`$PKG_CONFIG --variable=includedir gstreamer-0.10`"/gst/gstconfig.h"
dnl AG_GST_PARSE_SUBSYSTEM_DISABLES(GST_CONFIGPATH)
dnl
AC_DEFUN([AG_GST_PARSE_SUBSYSTEM_DISABLES],
[
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,GST_DEBUG)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,LOADSAVE)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PARSE)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,TRACE)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ALLOC_TRACE)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,REGISTRY)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,ENUMTYPES)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,INDEX)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,PLUGIN)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,URI)
AG_GST_PARSE_SUBSYSTEM_DISABLE($1,XML)
])
dnl relies on GST_PLUGINS_ALL, GST_PLUGINS_SELECTED, GST_PLUGINS_YES,
dnl GST_PLUGINS_NO, and BUILD_EXTERNAL
AC_DEFUN([AG_GST_OUTPUT_PLUGINS], [
echo "configure: *** Plug-ins without external dependencies that will be built:"
( for i in $GST_PLUGINS_SELECTED; do /bin/echo -e '\t'$i; done ) | sort
echo
echo "configure: *** Plug-ins without external dependencies that will NOT be built:"
( for i in $GST_PLUGINS_ALL; do
case $GST_PLUGINS_SELECTED in
*$i*)
;;
*)
/bin/echo -e '\t'$i
;;
esac
done ) | sort
echo
if test "x$BUILD_EXTERNAL" = "xno"; then
echo "configure: *** No plug-ins with external dependencies will be built"
else
/bin/echo -n "configure: *** Plug-ins with dependencies that will be built:"
/bin/echo -e "$GST_PLUGINS_YES" | sort
/bin/echo
/bin/echo -n "configure: *** Plug-ins with dependencies that will NOT be built:"
/bin/echo -e "$GST_PLUGINS_NO" | sort
/bin/echo
fi
])

View file

@ -1,63 +0,0 @@
dnl
dnl Check for compiler mechanism to show functions in debugging
dnl copied from an Ali patch floating on the internet
dnl
AC_DEFUN([AG_GST_CHECK_FUNCTION],[
dnl #1: __PRETTY_FUNCTION__
AC_MSG_CHECKING(whether $CC implements __PRETTY_FUNCTION__)
AC_CACHE_VAL(have_pretty_function,[
AC_TRY_LINK([#include <stdio.h>],
[printf("%s", __PRETTY_FUNCTION__);],
have_pretty_function=yes,
have_pretty_function=no)
])
AC_MSG_RESULT($have_pretty_function)
if test "$have_pretty_function" = yes; then
AC_DEFINE(HAVE_PRETTY_FUNCTION, 1,
[defined if the compiler implements __PRETTY_FUNCTION__])
fi
dnl #2: __FUNCTION__
AC_MSG_CHECKING(whether $CC implements __FUNCTION__)
AC_CACHE_VAL(have_function,[
AC_TRY_LINK([#include <stdio.h>],
[printf("%s", __FUNCTION__);],
have_function=yes,
have_function=no)
])
AC_MSG_RESULT($have_function)
if test "$have_function" = yes; then
AC_DEFINE(HAVE_FUNCTION, 1,
[defined if the compiler implements __FUNCTION__])
fi
dnl #3: __func__
AC_MSG_CHECKING(whether $CC implements __func__)
AC_CACHE_VAL(have_func,[
AC_TRY_LINK([#include <stdio.h>],
[printf("%s", __func__);],
have_func=yes,
have_func=no)
])
AC_MSG_RESULT($have_func)
if test "$have_func" = yes; then
AC_DEFINE(HAVE_FUNC, 1,
[defined if the compiler implements __func__])
fi
dnl now define FUNCTION to whatever works, and fallback to ""
if test "$have_pretty_function" = yes; then
function=__PRETTY_FUNCTION__
else
if test "$have_function" = yes; then
function=__FUNCTION__
else
if test "$have_func" = yes; then
function=__func__
else
function=\"\"
fi
fi
fi
AC_DEFINE_UNQUOTED(GST_FUNCTION, $function, [macro to use to show function name])
])

View file

@ -1,21 +0,0 @@
dnl gettext setup
dnl AG_GST_GETTEXT([gettext-package])
dnl defines GETTEXT_PACKAGE and LOCALEDIR
AC_DEFUN([AG_GST_GETTEXT],
[
if test "$USE_NLS" = "yes"; then
GETTEXT_PACKAGE=[$1]
else
GETTEXT_PACKAGE=[NULL]
fi
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED([GETTEXT_PACKAGE], "$GETTEXT_PACKAGE",
[gettext package name])
dnl define LOCALEDIR in config.h
AS_AC_EXPAND(LOCALEDIR, $datadir/locale)
AC_DEFINE_UNQUOTED([LOCALEDIR], "$LOCALEDIR",
[gettext locale dir])
])

View file

@ -1,26 +0,0 @@
dnl check for a minimum version of GLib
dnl AG_GST_GLIB_CHECK([minimum-version-required])
AC_DEFUN([AG_GST_GLIB_CHECK],
[
dnl Minimum required version of GLib
GLIB_REQ=[$1]
if test "x$GLIB_REQ" = "x"
then
AC_MSG_ERROR([Please specify a required version for GLib 2.0])
fi
AC_SUBST(GLIB_REQ)
dnl Check for glib with everything
PKG_CHECK_MODULES(GLIB,
glib-2.0 >= $GLIB_REQ gobject-2.0 gthread-2.0 gmodule-no-export-2.0,
HAVE_GLIB=yes,HAVE_GLIB=no)
if test "x$HAVE_GLIB" = "xno"; then
AC_MSG_ERROR([This package requires GLib >= $GLIB_REQ to compile.])
fi
dnl for the poor souls who for example have glib in /usr/local
AS_SCRUB_INCLUDE(GLIB_CFLAGS)
])

View file

@ -1,43 +0,0 @@
dnl call this macro with the minimum required version as an argument
dnl this macro sets and AC_SUBSTs XML_CFLAGS and XML_LIBS
dnl it also sets LIBXML_PKG, used for the pkg-config file
AC_DEFUN([AG_GST_LIBXML2_CHECK],
[
dnl Minimum required version of libxml2
dnl default to 2.4.9 if not specified
LIBXML2_REQ=ifelse([$1],,2.4.9,[$1])
AC_SUBST(LIBXML2_REQ)
dnl check for libxml2
PKG_CHECK_MODULES(XML, libxml-2.0 >= $LIBXML2_REQ,
HAVE_LIBXML2=yes, HAVE_LIBXML2=no)
if test "x$HAVE_LIBXML2" = "xyes"; then
AC_DEFINE(HAVE_LIBXML2, 1, [Define if libxml2 is available])
else
AC_MSG_ERROR([Need libxml2 for glib2 builds -- you should be able to do without it -- this needs fixing])
fi
dnl this is for the .pc file
LIBXML_PKG=', libxml-2.0'
AC_SUBST(LIBXML_PKG)
AC_SUBST(XML_LIBS)
AC_SUBST(XML_CFLAGS)
dnl XML_LIBS might pull in -lz without zlib actually being on the system, so
dnl try linking with these LIBS and CFLAGS
ac_save_CFLAGS=$CFLAGS
ac_save_LIBS=$LIBS
CFLAGS="$CFLAGS $XML_CFLAGS"
LIBS="$LIBS $XML_LIBS"
AC_TRY_LINK([
#include <libxml/tree.h>
#include <stdio.h>
],[
/* function body */
],
AC_MSG_NOTICE([Test xml2 program linked]),
AC_MSG_ERROR([Could not link libxml2 test program. Check if you have the necessary dependencies.])
)
CFLAGS="$ac_save_CFLAGS"
LIBS="$ac_save_LIBS"
])

View file

@ -1,17 +0,0 @@
dnl AG_GST_SET_PLUGINDIR
dnl AC_DEFINE PLUGINDIR to the full location where plug-ins will be installed
dnl AC_SUBST plugindir, to be used in Makefile.am's
AC_DEFUN([AG_GST_SET_PLUGINDIR],
[
dnl define location of plugin directory
AS_AC_EXPAND(PLUGINDIR, ${libdir}/gstreamer-$GST_MAJORMINOR)
AC_DEFINE_UNQUOTED(PLUGINDIR, "$PLUGINDIR",
[directory where plugins are located])
AC_MSG_NOTICE([Using $PLUGINDIR as the plugin install location])
dnl plugin directory configure-time variable for use in Makefile.am
plugindir="\$(libdir)/gstreamer-$GST_MAJORMINOR"
AC_SUBST(plugindir)
])

View file

@ -1,35 +0,0 @@
AC_DEFUN([AG_GST_VALGRIND_CHECK],
[
dnl valgrind inclusion
AC_ARG_ENABLE(valgrind,
AC_HELP_STRING([--disable-valgrind], [disable run-time valgrind detection]),
[
case "${enableval}" in
yes) USE_VALGRIND="$USE_DEBUG" ;;
no) USE_VALGRIND=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --enable-valgrind) ;;
esac],
[
USE_VALGRIND="$USE_DEBUG"
]) dnl Default value
VALGRIND_REQ="2.1"
if test "x$USE_VALGRIND" = xyes; then
PKG_CHECK_MODULES(VALGRIND, valgrind > $VALGRIND_REQ,
USE_VALGRIND="yes",
[
USE_VALGRIND="no"
AC_MSG_RESULT([no])
])
fi
if test "x$USE_VALGRIND" = xyes; then
AC_DEFINE(HAVE_VALGRIND, 1, [Define if valgrind should be used])
AC_MSG_NOTICE(Using extra code paths for valgrind)
fi
AC_SUBST(VALGRIND_CFLAGS)
AC_SUBST(VALGRIND_LIBS)
AC_PATH_PROG(VALGRIND_PATH, valgrind, no)
AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno")
])

View file

@ -1,53 +0,0 @@
dnl -*- mode: autoconf -*-
# serial 1
dnl Usage:
dnl GTK_DOC_CHECK([minimum-gtk-doc-version])
AC_DEFUN([GTK_DOC_CHECK],
[
AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
dnl for overriding the documentation installation directory
AC_ARG_WITH(html-dir,
AC_HELP_STRING([--with-html-dir=PATH], [path to installed docs]),,
[with_html_dir='${datadir}/gtk-doc/html'])
HTML_DIR="$with_html_dir"
AC_SUBST(HTML_DIR)
dnl enable/disable documentation building
AC_ARG_ENABLE(gtk-doc,
AC_HELP_STRING([--enable-gtk-doc],
[use gtk-doc to build documentation [default=no]]),,
enable_gtk_doc=no)
have_gtk_doc=no
if test x$enable_gtk_doc = xyes; then
if test -z "$PKG_CONFIG"; then
AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
fi
if test "$PKG_CONFIG" != "no" && $PKG_CONFIG --exists gtk-doc; then
have_gtk_doc=yes
fi
dnl do we want to do a version check?
ifelse([$1],[],,
[gtk_doc_min_version=$1
if test "$have_gtk_doc" = yes; then
AC_MSG_CHECKING([gtk-doc version >= $gtk_doc_min_version])
if $PKG_CONFIG --atleast-version $gtk_doc_min_version gtk-doc; then
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT(no)
have_gtk_doc=no
fi
fi
])
if test "$have_gtk_doc" != yes; then
enable_gtk_doc=no
fi
fi
AM_CONDITIONAL(ENABLE_GTK_DOC, test x$enable_gtk_doc = xyes)
AM_CONDITIONAL(GTK_DOC_USE_LIBTOOL, test -n "$LIBTOOL")
])

View file

@ -1,94 +0,0 @@
dnl -*- mode: autoconf -*-
dnl Copyright 2009 Johan Dahlin
dnl
dnl This file is free software; the author(s) gives unlimited
dnl permission to copy and/or distribute it, with or without
dnl modifications, as long as this notice is preserved.
dnl
# serial 1
m4_define([_GOBJECT_INTROSPECTION_CHECK_INTERNAL],
[
AC_BEFORE([AC_PROG_LIBTOOL],[$0])dnl setup libtool first
AC_BEFORE([AM_PROG_LIBTOOL],[$0])dnl setup libtool first
AC_BEFORE([LT_INIT],[$0])dnl setup libtool first
dnl enable/disable introspection
m4_if([$2], [require],
[dnl
enable_introspection=yes
],[dnl
AC_ARG_ENABLE(introspection,
AS_HELP_STRING([--enable-introspection[=@<:@no/auto/yes@:>@]],
[Enable introspection for this build]),,
[enable_introspection=auto])
])dnl
AC_MSG_CHECKING([for gobject-introspection])
dnl presence/version checking
AS_CASE([$enable_introspection],
[no], [dnl
found_introspection="no (disabled, use --enable-introspection to enable)"
],dnl
[yes],[dnl
PKG_CHECK_EXISTS([gobject-introspection-1.0],,
AC_MSG_ERROR([gobject-introspection-1.0 is not installed]))
PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1],
found_introspection=yes,
AC_MSG_ERROR([You need to have gobject-introspection >= $1 installed to build AC_PACKAGE_NAME]))
],dnl
[auto],[dnl
PKG_CHECK_EXISTS([gobject-introspection-1.0 >= $1], found_introspection=yes, found_introspection=no)
],dnl
[dnl
AC_MSG_ERROR([invalid argument passed to --enable-introspection, should be one of @<:@no/auto/yes@:>@])
])dnl
AC_MSG_RESULT([$found_introspection])
INTROSPECTION_SCANNER=
INTROSPECTION_COMPILER=
INTROSPECTION_GENERATE=
INTROSPECTION_GIRDIR=
INTROSPECTION_TYPELIBDIR=
if test "x$found_introspection" = "xyes"; then
INTROSPECTION_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
INTROSPECTION_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
INTROSPECTION_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
INTROSPECTION_GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
INTROSPECTION_TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
INTROSPECTION_CFLAGS=`$PKG_CONFIG --cflags gobject-introspection-1.0`
INTROSPECTION_LIBS=`$PKG_CONFIG --libs gobject-introspection-1.0`
INTROSPECTION_MAKEFILE=`$PKG_CONFIG --variable=datadir gobject-introspection-1.0`/gobject-introspection-1.0/Makefile.introspection
fi
AC_SUBST(INTROSPECTION_SCANNER)
AC_SUBST(INTROSPECTION_COMPILER)
AC_SUBST(INTROSPECTION_GENERATE)
AC_SUBST(INTROSPECTION_GIRDIR)
AC_SUBST(INTROSPECTION_TYPELIBDIR)
AC_SUBST(INTROSPECTION_CFLAGS)
AC_SUBST(INTROSPECTION_LIBS)
AC_SUBST(INTROSPECTION_MAKEFILE)
AM_CONDITIONAL(HAVE_INTROSPECTION, test "x$found_introspection" = "xyes")
])
dnl Usage:
dnl GOBJECT_INTROSPECTION_CHECK([minimum-g-i-version])
AC_DEFUN([GOBJECT_INTROSPECTION_CHECK],
[
_GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1])
])
dnl Usage:
dnl GOBJECT_INTROSPECTION_REQUIRE([minimum-g-i-version])
AC_DEFUN([GOBJECT_INTROSPECTION_REQUIRE],
[
_GOBJECT_INTROSPECTION_CHECK_INTERNAL([$1], [require])
])

View file

@ -1,131 +0,0 @@
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
#
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program 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
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# As a special exception to the GNU General Public License, if you
# distribute this file as part of a program that contains a
# configuration script generated by Autoconf, you may include it under
# the same distribution terms that you use for the rest of that program.
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
# ----------------------------------
AC_DEFUN([PKG_PROG_PKG_CONFIG],
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
fi
if test -n "$PKG_CONFIG"; then
_pkg_min_version=m4_ifval([$1], [$1], [0.9.0])
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
AC_MSG_RESULT([yes])
else
AC_MSG_RESULT([no])
PKG_CONFIG=""
fi
fi[]dnl
])# PKG_PROG_PKG_CONFIG
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
#
# Check to see whether a particular set of modules exists. Similar
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
#
#
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
# this or PKG_CHECK_MODULES is called, or make sure to call
# PKG_CHECK_EXISTS manually
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_EXISTS],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
if test -n "$PKG_CONFIG" && \
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
m4_ifval([$2], [$2], [:])
m4_ifvaln([$3], [else
$3])dnl
fi])
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
# ---------------------------------------------
m4_define([_PKG_CONFIG],
[if test -n "$PKG_CONFIG"; then
PKG_CHECK_EXISTS([$3],
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
[pkg_failed=yes])
else
pkg_failed=untried
fi[]dnl
])# _PKG_CONFIG
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
# [ACTION-IF-NOT-FOUND])
#
#
# Note that if there is a possibility the first call to
# PKG_CHECK_MODULES might not happen, you should be sure to include an
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
#
#
# --------------------------------------------------------------
AC_DEFUN([PKG_CHECK_MODULES],
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
pkg_failed=no
AC_MSG_CHECKING([for $1])
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
if test $pkg_failed = yes; then
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
# Put the nasty error message in config.log where it belongs
echo "$$1[]_PKG_ERRORS" 1>&AS_MESSAGE_LOG_FD
ifelse([$4], , [AC_MSG_ERROR(dnl
[Package requirements ($2) were not met.
Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.
Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.])],
[$4])
elif test $pkg_failed = untried; then
ifelse([$4], , [AC_MSG_FAILURE(dnl
[The pkg-config script could not be found or is too old. Make sure it
is in your PATH or set the PKG_CONFIG environment variable to the full
path to pkg-config.
Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables
to avoid the need to call pkg-config. See the pkg-config man page for
more details.
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
[$4])
else
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
AC_MSG_RESULT([yes])
ifelse([$3], , :, [$3])
fi[]dnl
])# PKG_CHECK_MODULES

View file

@ -1,155 +0,0 @@
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
"""
use the output from gst-xmlinspect.py to mangle tmpl/*.sgml and
insert/overwrite Short Description and Long Description
"""
# FIXME: right now it uses pygst and scans on its own;
# we really should use inspect/*.xml instead since the result of
# gst-xmlinspect.py is commited by the docs maintainer, who can be
# expected to have pygst, but this step should be done for every docs build,
# so no pygst allowed
# read in inspect/*.xml
# for every tmpl/element-(name).xml: mangle with details from element
import glob
import re
import sys
import os
class Tmpl:
def __init__(self, filename):
self.filename = filename
self._sectionids = []
self._sections = {}
def read(self):
"""
Read and parse the sections from the given file.
"""
lines = open(self.filename).readlines()
matcher = re.compile("<!-- ##### SECTION (\S+) ##### -->\n")
id = None
for line in lines:
match = matcher.search(line)
if match:
id = match.expand("\\1")
self._sectionids.append(id)
self._sections[id] = []
else:
if not id:
sys.stderr.write(
"WARNING: line before a SECTION header: %s" % line)
else:
self._sections[id].append(line)
def get_section(self, id):
"""
Get the content from the given section.
"""
return self._sections[id]
def set_section(self, id, content):
"""
Replace the given section id with the given content.
"""
self._sections[id] = content
def output(self):
"""
Return the output of the current template in the tmpl/*.sgml format.
"""
lines = []
for id in self._sectionids:
lines.append("<!-- ##### SECTION %s ##### -->\n" % id)
for line in self._sections[id]:
lines.append(line)
return "".join(lines)
def write(self, backup=False):
"""
Write out the template file again, backing up the previous one.
"""
if backup:
target = self.filename + ".mangle.bak"
os.rename(self.filename, target)
handle = open(self.filename, "w")
handle.write(self.output())
handle.close()
from xml.dom.ext.reader import Sax2
from xml.dom.NodeFilter import NodeFilter
def get_elements(file):
elements = {}
handle = open(file)
reader = Sax2.Reader()
doc = reader.fromStream(handle)
handle.close()
walker = doc.createTreeWalker(doc.documentElement,
NodeFilter.SHOW_ELEMENT, None, 0)
while walker.currentNode and walker.currentNode.tagName != 'elements':
walker.nextNode()
# we're at elements now
el = walker.firstChild()
while walker.currentNode:
element = walker.firstChild()
# loop over children of <element>
name = None
description = None
while walker.currentNode:
if walker.currentNode.tagName == 'name':
name = walker.currentNode.firstChild.data.encode('UTF-8')
if walker.currentNode.tagName == 'description':
description = walker.currentNode.firstChild.data.encode('UTF-8')
if not walker.nextSibling(): break
# back up to <element>
walker.parentNode()
elements[name] = {'description': description}
if not walker.nextSibling(): break
return elements
def main():
if not len(sys.argv) == 3:
sys.stderr.write('Please specify the inspect/ dir and the tmpl/ dir')
sys.exit(1)
inspectdir = sys.argv[1]
tmpldir = sys.argv[2]
# parse all .xml files; build map of element name -> short desc
#for file in glob.glob("inspect/plugin-*.xml"):
elements = {}
for file in glob.glob("%s/plugin-*.xml" % inspectdir):
elements.update(get_elements(file))
for file in glob.glob("%s/element-*.sgml" % tmpldir):
base = os.path.basename(file)
element = base[len("element-"):-len(".sgml")]
tmpl = Tmpl(file)
tmpl.read()
if element in elements.keys():
description = elements[element]['description']
tmpl.set_section("Short_Description", "%s\n\n" % description)
# put in an include if not yet there
line = '<include xmlns="http://www.w3.org/2003/XInclude" href="' + \
'element-' + element + '-details.xml" />\n'
section = tmpl.get_section("Long_Description")
if not section[0] == line:
section.insert(0, line)
tmpl.set_section("Long_Description", section)
tmpl.write()
main()

View file

@ -1,200 +0,0 @@
<?xml version='1.0'?> <!--*- mode: xml -*-->
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:exsl="http://exslt.org/common"
extension-element-prefixes="exsl"
version="1.0">
<xsl:output method="xml" indent="yes"
doctype-public ="-//OASIS//DTD DocBook XML V4.1.2//EN"
doctype-system = "http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd"/>
<xsl:param name="module" />
<xsl:template match="element">
<xsl:element name="varlistentry">
<xsl:element name="term">
<xsl:element name="link">
<xsl:attribute name="linkend"><xsl:value-of select="$module" />-plugins-<xsl:value-of select="name"/></xsl:attribute>
<xsl:value-of select="name" />
</xsl:element>
</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="description" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:variable name="name"><xsl:copy-of select="name"/></xsl:variable>
<!-- here we write an element-(name)-details.xml file for the element -->
<exsl:document href="{concat ('xml/element-', $name, '-details.xml')}" method="xml" indent="yes">
<xsl:element name="refsect2">
<xsl:element name="title">Element Information</xsl:element>
<xsl:element name="variablelist">
<!-- plugin name and link -->
<xsl:element name="varlistentry">
<xsl:element name="term">plugin</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara">
<xsl:element name="link">
<xsl:attribute name="linkend">plugin-<xsl:value-of select="../../name"/></xsl:attribute>
<xsl:value-of select="../../name" />
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">author</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="author" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">class</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="class" /></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element> <!-- variablelist -->
<xsl:element name="title">Element Pads</xsl:element>
<!-- process all caps -->
<xsl:for-each select="pads/caps">
<xsl:element name="variablelist">
<xsl:element name="varlistentry">
<xsl:element name="term">name</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="name" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">direction</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="direction" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">presence</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="presence" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">details</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="details" /></xsl:element>
</xsl:element>
</xsl:element>
</xsl:element> <!-- variablelist -->
<!--xsl:element name="programlisting"><xsl:value-of select="details" /></xsl:element-->
</xsl:for-each>
</xsl:element>
</exsl:document>
</xsl:template>
<xsl:template match="plugin">
<xsl:element name="refentry">
<xsl:attribute name="id"><xsl:value-of select="$module" />-plugins-plugin-<xsl:value-of select="name"/></xsl:attribute>
<xsl:element name="refmeta">
<xsl:element name="refentrytitle">
<xsl:value-of select="name"/>
</xsl:element>
<xsl:element name="manvolnum">3</xsl:element>
<xsl:element name="refmiscinfo">FIXME Library</xsl:element>
</xsl:element> <!-- refmeta -->
<xsl:element name="refnamediv">
<xsl:element name="refname">
<xsl:element name="anchor">
<xsl:attribute name="id">plugin-<xsl:value-of select="name"/></xsl:attribute>
<xsl:value-of select="name"/>
</xsl:element>
</xsl:element>
<xsl:element name="refpurpose">
<xsl:value-of select="description"/>
</xsl:element>
</xsl:element>
<xsl:element name="refsect1">
<xsl:element name="title">Plugin Information</xsl:element>
<xsl:element name="variablelist">
<xsl:element name="varlistentry">
<xsl:element name="term">filename</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="basename" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">version</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="version" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">run-time license</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="license" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">package</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara"><xsl:value-of select="package" /></xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="varlistentry">
<xsl:element name="term">origin</xsl:element>
<xsl:element name="listitem">
<xsl:element name="simpara">
<!-- only show origin as link if it starts with http -->
<xsl:choose>
<xsl:when test="substring(@href, 1, 4) = 'http'">
<xsl:element name="ulink">
<xsl:attribute name="url"><xsl:value-of select="origin" /></xsl:attribute>
<xsl:value-of select="origin" />
</xsl:element>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="origin" />
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:element>
<xsl:element name="refsect1">
<xsl:element name="title">Elements</xsl:element>
<!-- process all elements -->
<xsl:element name="variablelist">
<xsl:apply-templates select="elements"/>
</xsl:element>
</xsl:element>
</xsl:element>
</xsl:template>
<!-- ignore -->
<xsl:template match="gst-plugin-paths" />
</xsl:stylesheet>

View file

@ -1,4 +0,0 @@
# rule to download the latest .po files
download-po: $(top_srcdir)/common/download-translations
$(top_srcdir)/common/download-translations $(PACKAGE)

View file

@ -1,25 +0,0 @@
# include this snippet to add a common release: target by using
# include $(top_srcdir)/common/release.mak
# make bz2 as well
AUTOMAKE_OPTIONS = dist-bzip2
release: dist
make $(PACKAGE)-$(VERSION).tar.gz.md5
make $(PACKAGE)-$(VERSION).tar.bz2.md5
# generate md5 sum files
%.md5: %
md5sum $< > $@
# check that no marshal or enumtypes files are included
# this in turn ensures that distcheck fails for missing .list files which is currently
# shadowed when the corresponding .c and .h files are included.
distcheck-hook:
@test "x" = "x`find $(distdir) -name \*-enumtypes.[ch] | grep -v win32`" && \
test "x" = "x`find $(distdir) -name \*-marshal.[ch]`" || \
( $(ECHO) "*** Leftover enumtypes or marshal files in the tarball." && \
$(ECHO) "*** Make sure the following files are not disted:" && \
find $(distdir) -name \*-enumtypes.[ch] | grep -v win32 && \
find $(distdir) -name \*-marshal.[ch] && \
false )

View file

@ -1,226 +0,0 @@
#!/usr/bin/python
# -*- Mode: Python -*-
# vi:si:et:sw=4:sts=4:ts=4
"""
parse, update and write .signals and .args files
"""
from twisted.python import util
import sys
import os
def debug(*args):
pass
class Object:
def __init__(self, name):
self._signals = util.OrderedDict()
self._args = util.OrderedDict()
self.name = name
def __repr__(self):
return "<Object %s>" % self.name
def add_signal(self, signal, overwrite=True):
if not overwrite and self._signals.has_key(signal.name):
raise IndexError, "signal %s already in %r" % (signal.name, self)
self._signals[signal.name] = signal
def add_arg(self, arg, overwrite=True):
if not overwrite and self._args.has_key(arg.name):
raise IndexError, "arg %s already in %r" % (arg.name, self)
self._args[arg.name] = arg
class Docable:
def __init__(self, **kwargs):
for key in self.attrs:
setattr(self, key, kwargs[key])
self.dict = kwargs
def __repr__(self):
return "<%r %s>" % (str(self.__class__), self.name)
class Signal(Docable):
attrs = ['name', 'returns', 'args']
class Arg(Docable):
attrs = ['name', 'type', 'range', 'flags', 'nick', 'blurb', 'default']
class GDoc:
def load_file(self, filename):
try:
lines = open(filename).readlines()
self.load_data("".join(lines))
except IOError:
print "WARNING - could not read from %s" % filename
def save_file(self, filename, backup=False):
"""
Save the signals information to the given .signals file if the
file content changed.
"""
olddata = None
try:
lines = open(filename).readlines()
olddata = "".join(lines)
except IOError:
print "WARNING - could not read from %s" % filename
newdata = self.get_data()
if olddata and olddata == newdata:
return
if olddata:
if backup:
os.rename(filename, filename + '.bak')
handle = open(filename, "w")
handle.write(newdata)
handle.close()
class Signals(GDoc):
def __init__(self):
self._objects = util.OrderedDict()
def load_data(self, data):
"""
Load the .signals lines, creating our list of objects and signals.
"""
import re
smatcher = re.compile(
'(?s)' # make . match \n
'<SIGNAL>\n(.*?)</SIGNAL>\n'
)
nmatcher = re.compile(
'<NAME>'
'(?P<object>\S*)' # store object
'::'
'(?P<signal>\S*)' # store signal
'</NAME>'
)
rmatcher = re.compile(
'(?s)' # make . match \n
'<RETURNS>(?P<returns>\S*)</RETURNS>\n' # store returns
'(?P<args>.*)' # store args
)
for block in smatcher.findall(data):
nmatch = nmatcher.search(block)
if nmatch:
o = nmatch.group('object')
debug("Found object", o)
debug("Found signal", nmatch.group('signal'))
if not self._objects.has_key(o):
object = Object(o)
self._objects[o] = object
rmatch = rmatcher.search(block)
if rmatch:
dict = rmatch.groupdict().copy()
dict['name'] = nmatch.group('signal')
signal = Signal(**dict)
self._objects[o].add_signal(signal)
def get_data(self):
lines = []
for o in self._objects.values():
for s in o._signals.values():
block = """<SIGNAL>
<NAME>%(object)s::%(name)s</NAME>
<RETURNS>%(returns)s</RETURNS>
%(args)s</SIGNAL>
"""
d = s.dict.copy()
d['object'] = o.name
lines.append(block % d)
return "\n".join(lines) + '\n'
class Args(GDoc):
def __init__(self):
self._objects = util.OrderedDict()
def load_data(self, data):
"""
Load the .args lines, creating our list of objects and args.
"""
import re
amatcher = re.compile(
'(?s)' # make . match \n
'<ARG>\n(.*?)</ARG>\n'
)
nmatcher = re.compile(
'<NAME>'
'(?P<object>\S*)' # store object
'::'
'(?P<arg>\S*)' # store arg
'</NAME>'
)
rmatcher = re.compile(
'(?s)' # make . match \n
'<TYPE>(?P<type>\S*)</TYPE>\n' # store type
'<RANGE>(?P<range>.*?)</RANGE>\n' # store range
'<FLAGS>(?P<flags>\S*)</FLAGS>\n' # store flags
'<NICK>(?P<nick>.*?)</NICK>\n' # store nick
'<BLURB>(?P<blurb>.*?)</BLURB>\n' # store blurb
'<DEFAULT>(?P<default>.*?)</DEFAULT>\n' # store default
)
for block in amatcher.findall(data):
nmatch = nmatcher.search(block)
if nmatch:
o = nmatch.group('object')
debug("Found object", o)
debug("Found arg", nmatch.group('arg'))
if not self._objects.has_key(o):
object = Object(o)
self._objects[o] = object
rmatch = rmatcher.search(block)
if rmatch:
dict = rmatch.groupdict().copy()
dict['name'] = nmatch.group('arg')
arg = Arg(**dict)
self._objects[o].add_arg(arg)
else:
print "ERROR: could not match arg from block %s" % block
def get_data(self):
lines = []
for o in self._objects.values():
for a in o._args.values():
block = """<ARG>
<NAME>%(object)s::%(name)s</NAME>
<TYPE>%(type)s</TYPE>
<RANGE>%(range)s</RANGE>
<FLAGS>%(flags)s</FLAGS>
<NICK>%(nick)s</NICK>
<BLURB>%(blurb)s</BLURB>
<DEFAULT>%(default)s</DEFAULT>
</ARG>
"""
d = a.dict.copy()
d['object'] = o.name
lines.append(block % d)
return "\n".join(lines) + '\n'
def main(argv):
modulename = None
try:
modulename = argv[1]
except IndexError:
sys.stderr.write('Pleae provide a documentation module name\n')
sys.exit(1)
print "Merging scangobj output for %s" % modulename
signals = Signals()
signals.load_file(modulename + '.signals')
signals.load_file(modulename + '.signals.new')
signals.save_file(modulename + '.signals', backup=True)
args = Args()
args.load_file(modulename + '.args')
args.load_file(modulename + '.args.new')
args.save_file(modulename + '.args', backup=True)
main(sys.argv)

View file

@ -1,33 +0,0 @@
# this snippet is to be included by both our docbook manuals
# and gtk-doc API references
# it adds an upload target to each of these dir's Makefiles
# each Makefile.am should define the following variables:
# - DOC: the base name of the documentation
# (faq, manual, pwg, gstreamer, gstreamer-libs)
# - FORMATS: the formats in which DOC is output
# (html ps pdf)
# if you want to use it, make sure your $HOME/.ssh/config file contains the
# correct User entry for the Host entry for the DOC_SERVER
# these variables define the location of the online docs
DOC_SERVER = gstreamer.freedesktop.org
DOC_BASE = /srv/gstreamer.freedesktop.org/www/data/doc
DOC_URL = $(DOC_SERVER):$(DOC_BASE)
upload: $(FORMATS)
@if test "x$(PACKAGE_VERSION_NANO)" = x0; then \
export DOCVERSION=$(VERSION); \
else export DOCVERSION=head; \
fi; \
export DIR=$(DOC_BASE)/gstreamer/$$DOCVERSION/$(DOC); \
ssh $(DOC_SERVER) mkdir -p $$DIR; \
if echo $(FORMATS) | grep html > /dev/null; then export SRC="$$SRC html"; fi; \
if echo $(FORMATS) | grep ps > /dev/null; then export SRC="$$SRC $(DOC).ps"; fi; \
if echo $(FORMATS) | grep pdf > /dev/null; then export SRC="$$SRC $(DOC).pdf"; fi; \
echo Uploading $$SRC to $(DOC_SERVER):$$DIR; \
rsync -rv -e ssh --delete $$SRC $(DOC_SERVER):$$DIR; \
ssh $(DOC_SERVER) chmod -R g+w $$DIR; \
echo Done

View file

@ -3,8 +3,9 @@ dnl initialize autoconf
dnl when going to/from release please set the nano (fourth number) right ! dnl when going to/from release please set the nano (fourth number) right !
dnl releases only do Wall, cvs and prerelease does Werror too dnl releases only do Wall, cvs and prerelease does Werror too
AC_INIT(Gst-RTSP, 0.11.0.1, AC_INIT(Gst-RTSP, 0.11.0.1,
http://gstreamer.net/, http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer,
gst-rtsp) gst-rtsp)
AG_GST_INIT
dnl initialize automake dnl initialize automake
AM_INIT_AUTOMAKE([-Wno-portability 1.10]) AM_INIT_AUTOMAKE([-Wno-portability 1.10])
@ -13,7 +14,7 @@ dnl define PACKAGE_VERSION_* variables
AS_VERSION AS_VERSION
dnl check if this is a release version dnl check if this is a release version
AS_NANO(GST_CVS="no", GST_CVS="yes") AS_NANO(GST_GIT="no", GST_GIT="yes")
dnl can autoconf find the source ? dnl can autoconf find the source ?
AC_CONFIG_SRCDIR([gst/rtsp-server/rtsp-server.c]) AC_CONFIG_SRCDIR([gst/rtsp-server/rtsp-server.c])
@ -52,6 +53,12 @@ AS_AUTOTOOLS_ALTERNATE
dnl Add parameters for aclocal dnl Add parameters for aclocal
AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4") AC_SUBST(ACLOCAL_AMFLAGS, "-I m4 -I common/m4")
dnl set up gettext
dnl the version check needs to stay here because autopoint greps for it
AM_GNU_GETTEXT_VERSION([0.17])
AM_GNU_GETTEXT([external])
AG_GST_GETTEXT([gstreamer-$GST_MAJORMINOR])
dnl *** check for arguments to configure *** dnl *** check for arguments to configure ***
AG_GST_ARG_DEBUG AG_GST_ARG_DEBUG
@ -71,8 +78,22 @@ AC_PROG_CC
AM_PROG_CC_C_O AM_PROG_CC_C_O
dnl check for python dnl check for python
AM_PATH_PYTHON(2.3) AM_PATH_PYTHON
AM_CHECK_PYTHON_HEADERS([HAVE_PYTHON_HEADERS="yes"], [HAVE_PYTHON_HEADERS="no"]) AC_MSG_CHECKING(for python >= 2.3)
prog="
import sys, string
minver = (2,3,0,'final',0)
if sys.version_info < minver:
sys.exit(1)
sys.exit(0)"
if $PYTHON -c "$prog" 1>&AC_FD_CC 2>&AC_FD_CC
then
AC_MSG_RESULT(okay)
else
AC_MSG_ERROR(too old)
fi
AM_CHECK_PYTHON_HEADERS(,[AC_MSG_ERROR(could not find Python headers)])
AC_PATH_PROG(VALGRIND_PATH, valgrind, no) AC_PATH_PROG(VALGRIND_PATH, valgrind, no)
AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno") AM_CONDITIONAL(HAVE_VALGRIND, test ! "x$VALGRIND_PATH" = "xno")
@ -190,10 +211,10 @@ dnl set location of plugin directory
AG_GST_SET_PLUGINDIR AG_GST_SET_PLUGINDIR
dnl define an ERROR_CFLAGS Makefile variable dnl define an ERROR_CFLAGS Makefile variable
AG_GST_SET_ERROR_CFLAGS($GST_CVS) AG_GST_SET_ERROR_CFLAGS($GST_GIT)
dnl define correct level for debugging messages dnl define correct level for debugging messages
AG_GST_SET_LEVEL_DEFAULT($GST_CVS) AG_GST_SET_LEVEL_DEFAULT($GST_GIT)
dnl used in examples dnl used in examples
AG_GST_DEFAULT_ELEMENTS AG_GST_DEFAULT_ELEMENTS
@ -276,6 +297,9 @@ bindings/vala/Makefile
pkgconfig/Makefile pkgconfig/Makefile
pkgconfig/gst-rtsp-server.pc pkgconfig/gst-rtsp-server.pc
pkgconfig/gst-rtsp-server-uninstalled.pc pkgconfig/gst-rtsp-server-uninstalled.pc
docs/Makefile
docs/version.entities
docs/libs/Makefile
]) ])
AC_OUTPUT AC_OUTPUT

11
docs/Makefile.am Normal file
View file

@ -0,0 +1,11 @@
if ENABLE_GTK_DOC
DOCS_SUBDIRS = libs
else
DOCS_SUBDIRS =
endif
SUBDIRS = $(DOCS_SUBDIRS)
DIST_SUBDIRS = libs
EXTRA_DIST = \
version.entities.in

105
docs/libs/Makefile.am Normal file
View file

@ -0,0 +1,105 @@
GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj
## Process this file with automake to produce Makefile.in
# The name of the module, e.g. 'glib'.
MODULE=gst-rtsp-server
DOC_MODULE=$(MODULE)
# for upload-doc.mak
DOC=$(MODULE)
FORMATS=html ps pdf
html: html-build.stamp
include $(top_srcdir)/common/upload-doc.mak
# generated basefiles
#basefiles = \
## $(DOC_MODULE).types \
# $(DOC_MODULE)-sections.txt \
# $(DOC_MODULE)-docs.sgml
# ugly hack to make -unused.sgml work
#unused-build.stamp:
# BUILDDIR=`pwd` && \
# cd $(srcdir)/tmpl && \
# ln -sf gstreamer-libs-unused.sgml \
# $$BUILDDIR/tmpl/gstreamer-libs-@GST_MAJORMINOR@-unused.sgml
# touch unused-build.stamp
# these rules are added to create parallel docs using GST_MAJORMINOR
#$(basefiles): gstreamer-libs-@GST_MAJORMINOR@%: gstreamer-libs%
# cp $< $@
#CLEANFILES = $(basefiles)
# The top-level SGML file. Change it if you want.
DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml
# The directory containing the source code. Relative to $(top_srcdir).
# gtk-doc will search all .c & .h files beneath here for inline comments
# documenting functions and macros.
DOC_SOURCE_DIR = $(top_srcdir)/gst/rtsp-server/
DOC_BUILD_DIR=$(top_builddir)/gst/rtsp-server/
SCAN_OPTIONS=
# FIXME :
# there's something wrong with gstreamer-sections.txt not being in the dist
# maybe it doesn't resolve; we're adding it below for now
#EXTRA_DIST = gstreamer.types.in gstreamer.hierarchy $(DOC_MODULE)-sections.txt gstreamer-sections.txt $(DOC_MAIN_SGML_FILE)
# Extra options to supply to gtkdoc-mkdb.
MKDB_OPTIONS=--sgml-mode --source-suffixes=c,h,cc,m
# Extra options to supply to gtkdoc-fixref.
FIXXREF_OPTIONS=--extra-dir=$(GLIB_PREFIX)/share/gtk-doc/html \
--extra-dir=$(GST_PREFIX)/share/gtk-doc/html \
--extra-dir=$(GSTPB_PREFIX)/share/gtk-doc/html
# Used for dependencies.
HFILE_GLOB=$(DOC_SOURCE_DIR)/*.h
CFILE_GLOB=$(DOC_SOURCE_DIR)/*.c
SCANOBJ_DEPS = \
$(top_builddir)/gst/rtsp-server/libgstrtspserver-@GST_MAJORMINOR@.la
# Extra options to supply to gtkdoc-scan.
SCANOBJ_OPTIONS=--type-init-func="g_type_init();gst_init(&argc,&argv)"
# Header files to ignore when scanning.
IGNORE_HFILES =
IGNORE_CFILES =
# we add all .h files of elements that have signals/args we want
# sadly this also pulls in the private methods - maybe we should
# move those around in the source ?
# also, we should add some stuff here conditionally based on whether
# or not the plugin will actually build
# but I'm not sure about that - it might be this Just Works given that
# the registry won't have the element
EXTRA_HFILES =
# Images to copy into HTML directory.
HTML_IMAGES =
# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE).
content_files =
# Other files to distribute.
extra_files =
# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib
# contains GtkObjects/GObjects and you want to document signals and properties.
GTKDOC_CFLAGS = -I$(top_srcdir) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GST_PBUTILS_CFLAGS)
GTKDOC_LIBS = $(SCANOBJ_DEPS) $(GST_BASE_LIBS) $(GST_LIBS)
GTKDOC_CC=$(LIBTOOL) --tag=CC --mode=compile $(CC)
GTKDOC_LD=$(LIBTOOL) --tag=CC --mode=link $(CC)
# If you need to override some of the declarations, place them in this file
# and uncomment this line.
#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt
DOC_OVERRIDES =
include $(top_srcdir)/common/gtk-doc.mak

View file

@ -0,0 +1,88 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY % version-entities SYSTEM "version.entities">
%version-entities;
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>GStreamer RTSP Server Reference Manual</title>
<releaseinfo>
for GStreamer RTSP Server &GST_MAJORMINOR;
</releaseinfo>
</bookinfo>
<chapter>
<xi:include href="xml/rtsp-client.xml"/>
<xi:include href="xml/rtsp-media-factory.xml"/>
<xi:include href="xml/rtsp-media-mapping.xml"/>
<xi:include href="xml/rtsp-media.xml"/>
<xi:include href="xml/rtsp-params.xml"/>
<xi:include href="xml/rtsp-sdp.xml"/>
<xi:include href="xml/rtsp-server.xml"/>
<xi:include href="xml/rtsp-session-pool.xml"/>
<xi:include href="xml/rtsp-session.xml"/>
</chapter>
<!-- <chapter> -->
<!-- <title>Base Classes</title> -->
<!-- <xi:include href="xml/ges-timeline.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-layer.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-object.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-source.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-overlay.xml"/> -->
<!-- <xi:include href="xml/ges-track.xml"/> -->
<!-- <xi:include href="xml/ges-track-object.xml"/> -->
<!-- <xi:include href="xml/ges-track-source.xml"/> -->
<!-- <xi:include href="xml/ges-track-operation.xml"/> -->
<!-- </chapter> -->
<!-- <chapter> -->
<!-- <title>Timeline objects</title> -->
<!-- <xi:include href="xml/ges-timeline-filesource.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-title-source.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-test-source.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-text-overlay.xml"/> -->
<!-- <xi:include href="xml/ges-timeline-transition.xml"/> -->
<!-- </chapter> -->
<!-- <chapter> -->
<!-- <title>Track objects</title> -->
<!-- <xi:include href="xml/ges-track-filesource.xml"/> -->
<!-- <xi:include href="xml/ges-track-title-source.xml"/> -->
<!-- <xi:include href="xml/ges-track-audio-test-source.xml"/> -->
<!-- <xi:include href="xml/ges-track-video-test-source.xml"/> -->
<!-- <xi:include href="xml/ges-track-text-overlay.xml"/> -->
<!-- <xi:include href="xml/ges-track-transition.xml"/> -->
<!-- <xi:include href="xml/ges-track-video-transition.xml"/> -->
<!-- <xi:include href="xml/ges-track-audio-transition.xml"/> -->
<!-- </chapter> -->
<!-- <chapter> -->
<!-- <title>Simple Timeline interface</title> -->
<!-- <xi:include href="xml/ges-simple-timeline-layer.xml"/> -->
<!-- </chapter> -->
<!-- <chapter> -->
<!-- <title>Convenience classes</title> -->
<!-- <xi:include href="xml/ges-timeline-pipeline.xml"/> -->
<!-- <xi:include href="xml/ges-custom-timeline-source.xml"/> -->
<!-- </chapter> -->
<!-- <chapter> -->
<!-- <title>Serialization Classes</title> -->
<!-- <xi:include href="xml/ges-formatter.xml"/> -->
<!-- <xi:include href="xml/ges-keyfile-formatter.xml"/> -->
<!-- </chapter> -->
<chapter id="ges-hierarchy">
<title>Object Hierarchy</title>
<xi:include href="xml/tree_index.sgml"/>
</chapter>
<index id="api-index-full">
<title>API Index</title>
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
</index>
</book>

View file

@ -0,0 +1,223 @@
<SECTION>
<FILE>rtsp-media-mapping</FILE>
<TITLE>GstRTSPMediaMapping</TITLE>
GstRTSPMediaMapping
GstRTSPMediaMappingClass
gst_rtsp_media_mapping_new
gst_rtsp_media_mapping_find_factory
gst_rtsp_media_mapping_add_factory
gst_rtsp_media_mapping_remove_factory
<SUBSECTION Standard>
GST_RTSP_MEDIA_MAPPING_CLASS
GST_RTSP_MEDIA_MAPPING_CAST
GST_RTSP_MEDIA_MAPPING_CLASS_CAST
GST_RTSP_MEDIA_MAPPING
GST_IS_RTSP_MEDIA_MAPPING
GST_TYPE_RTSP_MEDIA_MAPPING
gst_rtsp_media_mapping_get_type
GST_IS_RTSP_MEDIA_MAPPING_CLASS
GST_RTSP_MEDIA_MAPPING_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-media-factory</FILE>
<TITLE>GstRTSPMediaFactory</TITLE>
GstRTSPMediaFactory
GstRTSPMediaFactoryClass
gst_rtsp_media_factory_new
gst_rtsp_media_factory_set_launch
gst_rtsp_media_factory_get_launch
gst_rtsp_media_factory_set_shared
gst_rtsp_media_factory_is_shared
gst_rtsp_media_factory_set_eos_shutdown
gst_rtsp_media_factory_is_eos_shutdown
gst_rtsp_media_factory_construct
gst_rtsp_media_factory_collect_streams
<SUBSECTION Standard>
GST_RTSP_MEDIA_FACTORY_CLASS
GST_RTSP_MEDIA_FACTORY_CAST
GST_RTSP_MEDIA_FACTORY_CLASS_CAST
GST_RTSP_MEDIA_FACTORY
GST_IS_RTSP_MEDIA_FACTORY
GST_TYPE_RTSP_MEDIA_FACTORY
gst_rtsp_media_factory_get_type
GST_IS_RTSP_MEDIA_FACTORY_CLASS
GST_RTSP_MEDIA_FACTORY_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-media</FILE>
<TITLE>GstRTSPMedia</TITLE>
GstRTSPMediaStream
GstRTSPMedia
GstRTSPMediaClass
GstRTSPMediaTrans
GstRTSPSendFunc
GstRTSPKeepAliveFunc
GstRTSPMediaStatus
gst_rtsp_media_new
gst_rtsp_media_set_shared
gst_rtsp_media_is_shared
gst_rtsp_media_set_reusable
gst_rtsp_media_is_reusable
gst_rtsp_media_set_protocols
gst_rtsp_media_get_protocols
gst_rtsp_media_set_eos_shutdown
gst_rtsp_media_is_eos_shutdown
gst_rtsp_media_prepare
gst_rtsp_media_is_prepared
gst_rtsp_media_unprepare
gst_rtsp_media_n_streams
gst_rtsp_media_get_stream
gst_rtsp_media_seek
gst_rtsp_media_stream_rtp
gst_rtsp_media_stream_rtcp
gst_rtsp_media_set_state
gst_rtsp_media_remove_elements
gst_rtsp_media_trans_cleanup
<SUBSECTION Standard>
GST_RTSP_MEDIA_CLASS
GST_RTSP_MEDIA_CAST
GST_RTSP_MEDIA_CLASS_CAST
GST_RTSP_MEDIA
GST_IS_RTSP_MEDIA
GST_TYPE_RTSP_MEDIA
gst_rtsp_media_get_type
GST_IS_RTSP_MEDIA_CLASS
GST_RTSP_MEDIA_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-server</FILE>
<TITLE>GstRTSPServer</TITLE>
GstRTSPServer
GstRTSPServerClass
gst_rtsp_server_new
gst_rtsp_server_set_address
gst_rtsp_server_get_address
gst_rtsp_server_set_service
gst_rtsp_server_get_service
gst_rtsp_server_set_backlog
gst_rtsp_server_get_backlog
gst_rtsp_server_set_session_pool
gst_rtsp_server_get_session_pool
gst_rtsp_server_set_media_mapping
gst_rtsp_server_get_media_mapping
gst_rtsp_server_io_func
gst_rtsp_server_get_io_channel
gst_rtsp_server_create_watch
gst_rtsp_server_attach
<SUBSECTION Standard>
GST_RTSP_SERVER_CLASS
GST_RTSP_SERVER_CAST
GST_RTSP_SERVER_CLASS_CAST
GST_RTSP_SERVER
GST_IS_RTSP_SERVER
GST_TYPE_RTSP_SERVER
gst_rtsp_server_get_type
GST_IS_RTSP_SERVER_CLASS
GST_RTSP_SERVER_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-session-pool</FILE>
<TITLE>GstRTSPSessionPool</TITLE>
GstRTSPSessionPool
GstRTSPSessionPoolClass
GstRTSPSessionPoolFunc
GstRTSPFilterResult
GstRTSPSessionFilterFunc
gst_rtsp_session_pool_new
gst_rtsp_session_pool_set_max_sessions
gst_rtsp_session_pool_get_max_sessions
gst_rtsp_session_pool_get_n_sessions
gst_rtsp_session_pool_create
gst_rtsp_session_pool_find
gst_rtsp_session_pool_remove
gst_rtsp_session_pool_filter
gst_rtsp_session_pool_cleanup
gst_rtsp_session_pool_create_watch
<SUBSECTION Standard>
GST_RTSP_SESSION_POOL_CLASS
GST_RTSP_SESSION_POOL_CAST
GST_RTSP_SESSION_POOL_CLASS_CAST
GST_RTSP_SESSION_POOL
GST_IS_RTSP_SESSION_POOL
GST_TYPE_RTSP_SESSION_POOL
gst_rtsp_session_pool_get_type
GST_IS_RTSP_SESSION_POOL_CLASS
GST_RTSP_SESSION_POOL_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-session</FILE>
<TITLE>GstRTSPSession</TITLE>
GstRTSPSession
GstRTSPSessionClass
GstRTSPSessionStream
GstRTSPSessionMedia
gst_rtsp_session_new
gst_rtsp_session_get_sessionid
gst_rtsp_session_set_timeout
gst_rtsp_session_get_timeout
gst_rtsp_session_touch
gst_rtsp_session_prevent_expire
gst_rtsp_session_allow_expire
gst_rtsp_session_next_timeout
gst_rtsp_session_is_expired
gst_rtsp_session_manage_media
gst_rtsp_session_release_media
gst_rtsp_session_get_media
gst_rtsp_session_media_set_state
gst_rtsp_session_media_get_stream
gst_rtsp_session_media_alloc_channels
gst_rtsp_session_stream_set_transport
gst_rtsp_session_stream_set_callbacks
gst_rtsp_session_stream_set_keepalive
<SUBSECTION Standard>
GST_RTSP_SESSION_CLASS
GST_RTSP_SESSION_CAST
GST_RTSP_SESSION_CLASS_CAST
GST_RTSP_SESSION
GST_IS_RTSP_SESSION
GST_TYPE_RTSP_SESSION
gst_rtsp_session_get_type
GST_IS_RTSP_SESSION_CLASS
GST_RTSP_SESSION_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-client</FILE>
<TITLE>GstRTSPClient</TITLE>
GstRTSPClient
GstRTSPClientClass
gst_rtsp_client_new
gst_rtsp_client_set_session_pool
gst_rtsp_client_get_session_pool
gst_rtsp_client_set_media_mapping
gst_rtsp_client_get_media_mapping
gst_rtsp_client_accept
<SUBSECTION Standard>
GST_RTSP_CLIENT_CLASS
GST_RTSP_CLIENT_CAST
GST_RTSP_CLIENT_CLASS_CAST
GST_RTSP_CLIENT
GST_IS_RTSP_CLIENT
GST_TYPE_RTSP_CLIENT
gst_rtsp_client_get_type
GST_IS_RTSP_CLIENT_CLASS
GST_RTSP_CLIENT_GET_CLASS
</SECTION>
<SECTION>
<FILE>rtsp-params</FILE>
gst_rtsp_params_set
gst_rtsp_params_get
</SECTION>
<SECTION>
<FILE>rtsp-sdp</FILE>
GstSDPInfo
gst_rtsp_sdp_from_media
</SECTION>

View file

@ -0,0 +1,8 @@
#include <gst/gst.h>
gst_rtsp_media_mapping_get_type
gst_rtsp_media_factory_get_type
gst_rtsp_media_get_type
gst_rtsp_server_get_type
gst_rtsp_session_pool_get_type
gst_rtsp_session_get_type
gst_rtsp_client_get_type

1
docs/version.entities.in Normal file
View file

@ -0,0 +1 @@
<!ENTITY GST_MAJORMINOR "@GST_MAJORMINOR@">

View file

@ -1,4 +1,4 @@
noinst_PROGRAMS = test-video test-ogg test-mp4 test-readme test-launch test-sdp noinst_PROGRAMS = test-video test-ogg test-mp4 test-readme test-launch test-sdp test-uri
INCLUDES = -I$(top_srcdir) -I$(srcdir) INCLUDES = -I$(top_srcdir) -I$(srcdir)

View file

@ -33,8 +33,8 @@ main (int argc, char *argv[])
if (argc < 2) { if (argc < 2) {
g_print ("usage: %s <launch line> \n" g_print ("usage: %s <launch line> \n"
"example: %s \"( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )\"\n", "example: %s \"( videotestsrc ! x264enc ! rtph264pay name=pay0 pt=96 )\"\n",
argv[0], argv[0]); argv[0], argv[0]);
return -1; return -1;
} }

View file

@ -46,12 +46,10 @@ main (int argc, char *argv[])
* that be used to map uri mount points to media factories */ * that be used to map uri mount points to media factories */
mapping = gst_rtsp_server_get_media_mapping (server); mapping = gst_rtsp_server_get_media_mapping (server);
str = g_strdup_printf ( str = g_strdup_printf ("( "
"( "
"filesrc location=%s ! qtdemux name=d " "filesrc location=%s ! qtdemux name=d "
"d. ! queue ! rtph264pay pt=96 name=pay0 " "d. ! queue ! rtph264pay pt=96 name=pay0 "
"d. ! queue ! rtpmp4apay pt=97 name=pay1 " "d. ! queue ! rtpmp4apay pt=97 name=pay1 " ")", argv[1]);
")", argv[1]);
/* make a media factory for a test stream. The default media factory can use /* make a media factory for a test stream. The default media factory can use
* gst-launch syntax to create pipelines. * gst-launch syntax to create pipelines.

View file

@ -46,12 +46,10 @@ main (int argc, char *argv[])
* that be used to map uri mount points to media factories */ * that be used to map uri mount points to media factories */
mapping = gst_rtsp_server_get_media_mapping (server); mapping = gst_rtsp_server_get_media_mapping (server);
str = g_strdup_printf ( str = g_strdup_printf ("( "
"( "
"filesrc location=%s ! oggdemux name=d " "filesrc location=%s ! oggdemux name=d "
"d. ! queue ! rtptheorapay name=pay0 pt=96 " "d. ! queue ! rtptheorapay name=pay0 pt=96 "
"d. ! queue ! rtpvorbispay name=pay1 pt=97 " "d. ! queue ! rtpvorbispay name=pay1 pt=97 " ")", argv[1]);
")", argv[1]);
/* make a media factory for a test stream. The default media factory can use /* make a media factory for a test stream. The default media factory can use
* gst-launch syntax to create pipelines. * gst-launch syntax to create pipelines.

View file

@ -46,7 +46,7 @@ main (int argc, char *argv[])
* element with pay%d names will be a stream */ * element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new (); factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory, gst_rtsp_media_factory_set_launch (factory,
"( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )"); "( videotestsrc is-live=1 ! x264enc ! rtph264pay name=pay0 pt=96 )");
gst_rtsp_media_factory_set_shared (factory, TRUE); gst_rtsp_media_factory_set_shared (factory, TRUE);

View file

@ -23,7 +23,7 @@
static gboolean static gboolean
timeout (GstRTSPServer *server, gboolean ignored) timeout (GstRTSPServer * server, gboolean ignored)
{ {
GstRTSPSessionPool *pool; GstRTSPSessionPool *pool;
@ -65,7 +65,9 @@ main (int argc, char *argv[])
* element with pay%d names will be a stream */ * element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new (); factory = gst_rtsp_media_factory_new ();
str = g_strdup_printf ( "( filesrc location=%s ! sdpdemux name=dynpay0 )", argv[1]); str =
g_strdup_printf ("( filesrc location=%s ! sdpdemux name=dynpay0 )",
argv[1]);
gst_rtsp_media_factory_set_launch (factory, str); gst_rtsp_media_factory_set_launch (factory, str);
gst_rtsp_media_factory_set_shared (factory, TRUE); gst_rtsp_media_factory_set_shared (factory, TRUE);
g_free (str); g_free (str);

89
examples/test-uri.c Normal file
View file

@ -0,0 +1,89 @@
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gst/gst.h>
#include <gst/rtsp-server/rtsp-server.h>
static gboolean
timeout (GstRTSPServer * server, gboolean ignored)
{
GstRTSPSessionPool *pool;
pool = gst_rtsp_server_get_session_pool (server);
gst_rtsp_session_pool_cleanup (pool);
g_object_unref (pool);
return TRUE;
}
int
main (int argc, char *argv[])
{
GMainLoop *loop;
GstRTSPServer *server;
GstRTSPMediaMapping *mapping;
GstRTSPMediaFactoryURI *factory;
gst_init (&argc, &argv);
if (argc < 2) {
g_message ("usage: %s <uri>", argv[0]);
return -1;
}
loop = g_main_loop_new (NULL, FALSE);
/* create a server instance */
server = gst_rtsp_server_new ();
/* get the mapping for this server, every server has a default mapper object
* that be used to map uri mount points to media factories */
mapping = gst_rtsp_server_get_media_mapping (server);
/* make a URI media factory for a test stream. */
factory = gst_rtsp_media_factory_uri_new ();
gst_rtsp_media_factory_uri_set_uri (factory, argv[1]);
/* attach the test factory to the /test url */
gst_rtsp_media_mapping_add_factory (mapping, "/test",
GST_RTSP_MEDIA_FACTORY (factory));
/* don't need the ref to the mapper anymore */
g_object_unref (mapping);
/* attach the server to the default maincontext */
if (gst_rtsp_server_attach (server, NULL) == 0)
goto failed;
g_timeout_add_seconds (2, (GSourceFunc) timeout, server);
/* start serving */
g_main_loop_run (loop);
return 0;
/* ERRORS */
failed:
{
g_print ("failed to attach the server\n");
return -1;
}
}

View file

@ -23,7 +23,7 @@
static gboolean static gboolean
timeout (GstRTSPServer *server, gboolean ignored) timeout (GstRTSPServer * server, gboolean ignored)
{ {
GstRTSPSessionPool *pool; GstRTSPSessionPool *pool;
@ -59,11 +59,10 @@ main (int argc, char *argv[])
* element with pay%d names will be a stream */ * element with pay%d names will be a stream */
factory = gst_rtsp_media_factory_new (); factory = gst_rtsp_media_factory_new ();
gst_rtsp_media_factory_set_launch (factory, "( " gst_rtsp_media_factory_set_launch (factory, "( "
"videotestsrc ! video/x-raw-yuv,width=352,height=288,framerate=15/1 ! " "videotestsrc ! video/x-raw-yuv,width=352,height=288,framerate=15/1 ! "
"x264enc ! rtph264pay name=pay0 pt=96 " "x264enc ! rtph264pay name=pay0 pt=96 "
"audiotestsrc ! audio/x-raw-int,rate=8000 ! " "audiotestsrc ! audio/x-raw-int,rate=8000 ! "
"alawenc ! rtppcmapay name=pay1 pt=97 " "alawenc ! rtppcmapay name=pay1 pt=97 " ")");
")");
/* attach the test factory to the /test url */ /* attach the test factory to the /test url */
gst_rtsp_media_mapping_add_factory (mapping, "/test", factory); gst_rtsp_media_mapping_add_factory (mapping, "/test", factory);

View file

@ -3,6 +3,7 @@ public_headers = \
rtsp-sdp.h \ rtsp-sdp.h \
rtsp-media.h \ rtsp-media.h \
rtsp-media-factory.h \ rtsp-media-factory.h \
rtsp-media-factory-uri.h \
rtsp-media-mapping.h \ rtsp-media-mapping.h \
rtsp-session.h \ rtsp-session.h \
rtsp-session-pool.h \ rtsp-session-pool.h \
@ -14,6 +15,7 @@ c_sources = \
rtsp-sdp.c \ rtsp-sdp.c \
rtsp-media.c \ rtsp-media.c \
rtsp-media-factory.c \ rtsp-media-factory.c \
rtsp-media-factory-uri.c \
rtsp-media-mapping.c \ rtsp-media-mapping.c \
rtsp-session.c \ rtsp-session.c \
rtsp-session-pool.c \ rtsp-session-pool.c \
@ -41,28 +43,45 @@ libgstrtspserver_@GST_MAJORMINOR@include_HEADERS = $(public_headers)
CLEANFILES = CLEANFILES =
-include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_GIRS =
INTROSPECTION_SCANNER_ARGS = --add-include-path=$(srcdir) --strip-prefix=Gst
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir)
if HAVE_INTROSPECTION if HAVE_INTROSPECTION
introspection_sources = $(public_headers) $(c_sources) BUILT_GIRSOURCES = GstRtspServer-@GST_MAJORMINOR@.gir
GstRtspServer-0.10.gir: $(INTROSPECTION_SCANNER) libgstrtspserver-@GST_MAJORMINOR@.la gir_headers=$(patsubst %,$(srcdir)/%, $(libgstrtspserver_@GST_MAJORMINOR@include_HEADERS))
GstRtspServer_0_10_gir_INCLUDES = Gst-@GST_MAJORMINOR@ GstRtsp-@GST_MAJORMINOR@ gir_sources=$(patsubst %,$(srcdir)/%, $(libgstrtspserver_@GST_MAJORMINOR@_la_SOURCES))
GstRtspServer_0_10_gir_CFLAGS = $(INCLUDES) gir_cincludes=$(patsubst %,--c-include='gst/rtsp-server/%',$(libgstrtspinclude_HEADERS))
GstRtspServer_0_10_gir_LIBS = libgstrtspserver-@GST_MAJORMINOR@.la
GstRtspServer_0_10_gir_FILES = $(introspection_sources)
GstRtspServer_0_10_gir_NAMESPACE = GstRtspServer
GstRtspServer_0_10_gir_VERSION = @GST_MAJORMINOR@
INTROSPECTION_GIRS += GstRtspServer-0.10.gir
GstRtspServer-@GST_MAJORMINOR@.gir: $(INTROSPECTION_SCANNER) libgstrtspserver-@GST_MAJORMINOR@.la
$(AM_V_GEN)PKG_CONFIG_PATH="$(GST_PKG_CONFIG_PATH)" \
$(INTROSPECTION_SCANNER) -v --namespace GstRtspServer \
--nsversion=@GST_MAJORMINOR@ \
--strip-prefix=Gst \
-I$(top_srcdir) \
-I$(top_builddir) \
-DIN_GOBJECT_INTROSPECTION=1 \
--c-include='gst/gst.h' \
--add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-0.10` \
--library=libgstrtspserver-0.10.la \
--include=Gst-0.10 \
--include=GstRtsp-0.10 \
--libtool="$(top_builddir)/libtool" \
--pkg gstreamer-0.10 \
--pkg gstreamer-rtsp-0.10 \
--pkg-export gstreamer-rtsp-server-0.10 \
--output $@ \
$(gir_headers) \
$(gir_sources)
# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
# install anything - we need to install inside our prefix.
girdir = $(datadir)/gir-1.0 girdir = $(datadir)/gir-1.0
gir_DATA = $(INTROSPECTION_GIRS) gir_DATA = $(BUILT_GIRSOURCES)
typelibdir = $(libdir)/girepository-1.0 typelibsdir = $(libdir)/girepository-1.0/
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
CLEANFILES += $(gir_DATA) $(typelib_DATA) typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
%.typelib: %.gir $(INTROSPECTION_COMPILER)
$(AM_V_GEN)$(INTROSPECTION_COMPILER) --includedir=$(srcdir) --includedir=$(builddir) $(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
endif endif

View file

@ -49,7 +49,7 @@ static void gst_rtsp_client_finalize (GObject * obj);
static void client_session_finalized (GstRTSPClient * client, static void client_session_finalized (GstRTSPClient * client,
GstRTSPSession * session); GstRTSPSession * session);
static void unlink_session_streams (GstRTSPClient * client, static void unlink_session_streams (GstRTSPClient * client,
GstRTSPSession *session, GstRTSPSessionMedia * media); GstRTSPSession * session, GstRTSPSessionMedia * media);
G_DEFINE_TYPE (GstRTSPClient, gst_rtsp_client, G_TYPE_OBJECT); G_DEFINE_TYPE (GstRTSPClient, gst_rtsp_client, G_TYPE_OBJECT);
@ -89,18 +89,19 @@ gst_rtsp_client_init (GstRTSPClient * client)
} }
static void static void
client_unlink_session (GstRTSPClient *client, GstRTSPSession *session) client_unlink_session (GstRTSPClient * client, GstRTSPSession * session)
{ {
GList *medias; GList *medias;
/* unlink all media managed in this session */ /* unlink all media managed in this session */
for (medias = session->medias; medias; medias = g_list_next (medias)) { for (medias = session->medias; medias; medias = g_list_next (medias)) {
unlink_session_streams (client, session, (GstRTSPSessionMedia *) medias->data); unlink_session_streams (client, session,
(GstRTSPSessionMedia *) medias->data);
} }
} }
static void static void
client_cleanup_sessions (GstRTSPClient *client) client_cleanup_sessions (GstRTSPClient * client)
{ {
GList *sessions; GList *sessions;
@ -350,7 +351,8 @@ do_send_data (GstBuffer * buffer, guint8 channel, GstRTSPClient * client)
} }
static void static void
link_stream (GstRTSPClient * client, GstRTSPSession *session, GstRTSPSessionStream * stream) link_stream (GstRTSPClient * client, GstRTSPSession * session,
GstRTSPSessionStream * stream)
{ {
GST_DEBUG ("client %p: linking stream %p", client, stream); GST_DEBUG ("client %p: linking stream %p", client, stream);
gst_rtsp_session_stream_set_callbacks (stream, (GstRTSPSendFunc) do_send_data, gst_rtsp_session_stream_set_callbacks (stream, (GstRTSPSendFunc) do_send_data,
@ -361,7 +363,8 @@ link_stream (GstRTSPClient * client, GstRTSPSession *session, GstRTSPSessionStre
} }
static void static void
unlink_stream (GstRTSPClient * client, GstRTSPSession *session, GstRTSPSessionStream * stream) unlink_stream (GstRTSPClient * client, GstRTSPSession * session,
GstRTSPSessionStream * stream)
{ {
GST_DEBUG ("client %p: unlinking stream %p", client, stream); GST_DEBUG ("client %p: unlinking stream %p", client, stream);
gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL); gst_rtsp_session_stream_set_callbacks (stream, NULL, NULL, NULL, NULL);
@ -371,7 +374,8 @@ unlink_stream (GstRTSPClient * client, GstRTSPSession *session, GstRTSPSessionSt
} }
static void static void
unlink_session_streams (GstRTSPClient * client, GstRTSPSession *session, GstRTSPSessionMedia * media) unlink_session_streams (GstRTSPClient * client, GstRTSPSession * session,
GstRTSPSessionMedia * media)
{ {
guint n_streams, i; guint n_streams, i;
@ -396,7 +400,7 @@ unlink_session_streams (GstRTSPClient * client, GstRTSPSession *session, GstRTSP
static void static void
close_connection (GstRTSPClient * client) close_connection (GstRTSPClient * client)
{ {
const gchar * tunnelid; const gchar *tunnelid;
GST_DEBUG ("client %p: closing connection", client); GST_DEBUG ("client %p: closing connection", client);
@ -759,7 +763,6 @@ handle_setup_request (GstRTSPClient * client, GstRTSPUrl * uri,
gchar *trans_str, *pos; gchar *trans_str, *pos;
guint streamid; guint streamid;
GstRTSPSessionMedia *media; GstRTSPSessionMedia *media;
gboolean need_session;
GstRTSPUrl *url; GstRTSPUrl *url;
/* the uri contains the stream number we added in the SDP config, which is /* the uri contains the stream number we added in the SDP config, which is
@ -847,8 +850,6 @@ handle_setup_request (GstRTSPClient * client, GstRTSPUrl * uri,
/* get a handle to the configuration of the media in the session, this can /* get a handle to the configuration of the media in the session, this can
* return NULL if this is a new url to manage in this session. */ * return NULL if this is a new url to manage in this session. */
media = gst_rtsp_session_get_media (session, uri); media = gst_rtsp_session_get_media (session, uri);
need_session = FALSE;
} else { } else {
/* create a session if this fails we probably reached our session limit or /* create a session if this fails we probably reached our session limit or
* something. */ * something. */
@ -857,8 +858,6 @@ handle_setup_request (GstRTSPClient * client, GstRTSPUrl * uri,
/* we need a new media configuration in this session */ /* we need a new media configuration in this session */
media = NULL; media = NULL;
need_session = TRUE;
} }
/* we have no media, find one and manage it */ /* we have no media, find one and manage it */
@ -1163,7 +1162,8 @@ client_session_finalized (GstRTSPClient * client, GstRTSPSession * session)
/* remove the session */ /* remove the session */
if (!(client->sessions = g_list_remove (client->sessions, session))) { if (!(client->sessions = g_list_remove (client->sessions, session))) {
GST_INFO ("client %p: all sessions finalized, close the connection", client); GST_INFO ("client %p: all sessions finalized, close the connection",
client);
close_connection (client); close_connection (client);
} }
} }
@ -1215,7 +1215,7 @@ handle_request (GstRTSPClient * client, GstRTSPMessage * request)
} }
/* we always try to parse the url first */ /* we always try to parse the url first */
if ((res = gst_rtsp_url_parse (uristr, &uri)) != GST_RTSP_OK) { if (gst_rtsp_url_parse (uristr, &uri) != GST_RTSP_OK) {
send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, request); send_generic_response (client, GST_RTSP_STS_BAD_REQUEST, request);
return; return;
} }
@ -1550,7 +1550,8 @@ no_tunnelid:
tunnel_existed: tunnel_existed:
{ {
g_mutex_unlock (tunnels_lock); g_mutex_unlock (tunnels_lock);
GST_ERROR ("client %p: tunnel session %s already existed", client, tunnelid); GST_ERROR ("client %p: tunnel session %s already existed", client,
tunnelid);
return FALSE; return FALSE;
} }
} }
@ -1562,7 +1563,8 @@ tunnel_start (GstRTSPWatch * watch, gpointer user_data)
client = GST_RTSP_CLIENT (user_data); client = GST_RTSP_CLIENT (user_data);
GST_INFO ("client %p: tunnel start (connection %p)", client, client->connection); GST_INFO ("client %p: tunnel start (connection %p)", client,
client->connection);
if (!remember_tunnel (client)) if (!remember_tunnel (client))
goto tunnel_error; goto tunnel_error;
@ -1584,7 +1586,8 @@ tunnel_lost (GstRTSPWatch * watch, gpointer user_data)
client = GST_RTSP_CLIENT (user_data); client = GST_RTSP_CLIENT (user_data);
GST_INFO ("client %p: tunnel lost (connection %p)", client, client->connection); GST_INFO ("client %p: tunnel lost (connection %p)", client,
client->connection);
/* ignore error, it'll only be a problem when the client does a POST again */ /* ignore error, it'll only be a problem when the client does a POST again */
remember_tunnel (client); remember_tunnel (client);

View file

@ -0,0 +1,458 @@
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include "rtsp-media-factory-uri.h"
#define DEFAULT_URI NULL
enum
{
PROP_0,
PROP_URI,
PROP_LAST
};
#define RAW_VIDEO_CAPS \
"video/x-raw-yuv; " \
"video/x-raw-rgb; " \
"video/x-raw-gray"
#define RAW_AUDIO_CAPS \
"audio/x-raw-int; " \
"audio/x-raw-float"
static GstStaticCaps raw_video_caps = GST_STATIC_CAPS (RAW_VIDEO_CAPS);
static GstStaticCaps raw_audio_caps = GST_STATIC_CAPS (RAW_AUDIO_CAPS);
typedef struct
{
GstRTSPMediaFactoryURI *factory;
guint pt;
} FactoryData;
static void
free_data (FactoryData * data)
{
g_object_unref (data->factory);
g_free (data);
}
static const gchar *factory_key = "GstRTSPMediaFactoryURI";
GST_DEBUG_CATEGORY (rtsp_media_factory_uri_debug);
#define GST_CAT_DEFAULT rtsp_media_factory_uri_debug
static void gst_rtsp_media_factory_uri_get_property (GObject * object,
guint propid, GValue * value, GParamSpec * pspec);
static void gst_rtsp_media_factory_uri_set_property (GObject * object,
guint propid, const GValue * value, GParamSpec * pspec);
static void gst_rtsp_media_factory_uri_finalize (GObject * obj);
static GstElement *rtsp_media_factory_uri_get_element (GstRTSPMediaFactory *
factory, const GstRTSPUrl * url);
G_DEFINE_TYPE (GstRTSPMediaFactoryURI, gst_rtsp_media_factory_uri,
GST_TYPE_RTSP_MEDIA_FACTORY);
static void
gst_rtsp_media_factory_uri_class_init (GstRTSPMediaFactoryURIClass * klass)
{
GObjectClass *gobject_class;
GstRTSPMediaFactoryClass *mediafactory_class;
gobject_class = G_OBJECT_CLASS (klass);
mediafactory_class = GST_RTSP_MEDIA_FACTORY_CLASS (klass);
gobject_class->get_property = gst_rtsp_media_factory_uri_get_property;
gobject_class->set_property = gst_rtsp_media_factory_uri_set_property;
gobject_class->finalize = gst_rtsp_media_factory_uri_finalize;
/**
* GstRTSPMediaFactoryURI::uri
*
* The uri of the resource that will be served by this factory.
*/
g_object_class_install_property (gobject_class, PROP_URI,
g_param_spec_string ("uri", "URI",
"The URI of the resource to stream", DEFAULT_URI,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
mediafactory_class->get_element = rtsp_media_factory_uri_get_element;
GST_DEBUG_CATEGORY_INIT (rtsp_media_factory_uri_debug, "rtspmediafactoryuri",
0, "GstRTSPMediaFactoryUri");
}
static void
gst_rtsp_media_factory_uri_init (GstRTSPMediaFactoryURI * factory)
{
factory->uri = g_strdup (DEFAULT_URI);
factory->factories =
gst_element_factory_list_get_elements (GST_ELEMENT_FACTORY_TYPE_PAYLOADER,
GST_RANK_NONE);
factory->raw_vcaps = gst_static_caps_get (&raw_video_caps);
factory->raw_acaps = gst_static_caps_get (&raw_audio_caps);
}
static void
gst_rtsp_media_factory_uri_finalize (GObject * obj)
{
GstRTSPMediaFactoryURI *factory = GST_RTSP_MEDIA_FACTORY_URI (obj);
g_free (factory->uri);
gst_plugin_feature_list_free (factory->factories);
gst_caps_unref (factory->raw_vcaps);
gst_caps_unref (factory->raw_acaps);
G_OBJECT_CLASS (gst_rtsp_media_factory_uri_parent_class)->finalize (obj);
}
static void
gst_rtsp_media_factory_uri_get_property (GObject * object, guint propid,
GValue * value, GParamSpec * pspec)
{
GstRTSPMediaFactoryURI *factory = GST_RTSP_MEDIA_FACTORY_URI (object);
switch (propid) {
case PROP_URI:
g_value_take_string (value, gst_rtsp_media_factory_uri_get_uri (factory));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
}
}
static void
gst_rtsp_media_factory_uri_set_property (GObject * object, guint propid,
const GValue * value, GParamSpec * pspec)
{
GstRTSPMediaFactoryURI *factory = GST_RTSP_MEDIA_FACTORY_URI (object);
switch (propid) {
case PROP_URI:
gst_rtsp_media_factory_uri_set_uri (factory, g_value_get_string (value));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
}
}
/**
* gst_rtsp_media_factory_uri_new:
*
* Create a new #GstRTSPMediaFactoryURI instance.
*
* Returns: a new #GstRTSPMediaFactoryURI object.
*/
GstRTSPMediaFactoryURI *
gst_rtsp_media_factory_uri_new (void)
{
GstRTSPMediaFactoryURI *result;
result = g_object_new (GST_TYPE_RTSP_MEDIA_FACTORY_URI, NULL);
return result;
}
/**
* gst_rtsp_media_factory_uri_set_uri:
* @factory: a #GstRTSPMediaFactory
* @uri: the uri the stream
*
* Set the URI of the resource that will be streamed by this factory.
*/
void
gst_rtsp_media_factory_uri_set_uri (GstRTSPMediaFactoryURI * factory,
const gchar * uri)
{
g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY_URI (factory));
g_return_if_fail (uri != NULL);
GST_RTSP_MEDIA_FACTORY_LOCK (factory);
g_free (factory->uri);
factory->uri = g_strdup (uri);
GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
}
/**
* gst_rtsp_media_factory_uri_get_uri:
* @factory: a #GstRTSPMediaFactory
*
* Get the URI that will provide media for this factory.
*
* Returns: the configured URI. g_free() after usage.
*/
gchar *
gst_rtsp_media_factory_uri_get_uri (GstRTSPMediaFactoryURI * factory)
{
gchar *result;
g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY_URI (factory), NULL);
GST_RTSP_MEDIA_FACTORY_LOCK (factory);
result = g_strdup (factory->uri);
GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
return result;
}
static GstElementFactory *
find_payloader (GstRTSPMediaFactoryURI * urifact, GstCaps * caps)
{
GList *list, *tmp;
GstElementFactory *factory = NULL;
/* find payloader that can link */
list = gst_element_factory_list_filter (urifact->factories, caps,
GST_PAD_SINK, FALSE);
for (tmp = list; tmp; tmp = g_list_next (tmp)) {
GstElementFactory *f = GST_ELEMENT_FACTORY_CAST (tmp->data);
const gchar *name;
name = gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (f));
if (strcmp (name, "gdppay") == 0)
continue;
factory = f;
break;
}
if (factory)
g_object_ref (factory);
gst_plugin_feature_list_free (list);
return factory;
}
static gboolean
autoplug_continue_cb (GstElement * uribin, GstPad * pad, GstCaps * caps,
GstElement * element)
{
GList *list, *tmp;
FactoryData *data;
GstElementFactory *factory;
gboolean res;
GST_DEBUG ("found pad %s:%s of caps %" GST_PTR_FORMAT,
GST_DEBUG_PAD_NAME (pad), caps);
data = g_object_get_data (G_OBJECT (element), factory_key);
if (!(factory = find_payloader (data->factory, caps)))
goto no_factory;
/* we found a payloader, stop autoplugging */
GST_DEBUG ("found payloader factory %s",
gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
gst_object_unref (factory);
return FALSE;
/* ERRORS */
no_factory:
{
/* no payloader, continue autoplugging */
GST_DEBUG ("no payloader found");
return TRUE;
}
}
static void
pad_added_cb (GstElement * uribin, GstPad * pad, GstElement * element)
{
GstRTSPMediaFactoryURI *urifact;
FactoryData *data;
GstElementFactory *factory;
GstElement *payloader;
GstCaps *caps;
GstPad *sinkpad, *srcpad, *ghostpad;
GstElement *convert;
gchar *padname;
GST_DEBUG ("added pad %s:%s", GST_DEBUG_PAD_NAME (pad));
/* link the element now and expose the pad */
data = g_object_get_data (G_OBJECT (element), factory_key);
urifact = data->factory;
/* ref to make refcounting easier later */
gst_object_ref (pad);
padname = gst_pad_get_name (pad);
/* get pad caps first, then call get_caps, then fail */
if ((caps = GST_PAD_CAPS (pad)))
gst_caps_ref (caps);
else if ((caps = gst_pad_get_caps (pad)) == NULL)
goto no_caps;
/* check for raw caps */
if (gst_caps_can_intersect (caps, urifact->raw_vcaps)) {
/* we have raw video caps, insert converter */
convert = gst_element_factory_make ("ffmpegcolorspace", NULL);
} else if (gst_caps_can_intersect (caps, urifact->raw_acaps)) {
/* we have raw audio caps, insert converter */
convert = gst_element_factory_make ("audioconvert", NULL);
} else {
convert = NULL;
}
if (convert) {
gst_bin_add (GST_BIN_CAST (element), convert);
gst_element_set_state (convert, GST_STATE_PLAYING);
sinkpad = gst_element_get_static_pad (convert, "sink");
gst_pad_link (pad, sinkpad);
gst_object_unref (sinkpad);
/* unref old pad, we reffed before */
gst_object_unref (pad);
/* continue with new pad and caps */
pad = gst_element_get_static_pad (convert, "src");
if ((caps = GST_PAD_CAPS (pad)))
gst_caps_ref (caps);
else if ((caps = gst_pad_get_caps (pad)) == NULL)
goto no_caps;
}
if (!(factory = find_payloader (urifact, caps)))
goto no_factory;
gst_caps_unref (caps);
/* we have a payloader now */
GST_DEBUG ("found payloader factory %s",
gst_plugin_feature_get_name (GST_PLUGIN_FEATURE (factory)));
payloader = gst_element_factory_create (factory, NULL);
if (payloader == NULL)
goto no_payloader;
g_object_set (payloader, "pt", data->pt, NULL);
data->pt++;
/* add the payloader to the pipeline */
gst_bin_add (GST_BIN_CAST (element), payloader);
gst_element_set_state (payloader, GST_STATE_PLAYING);
/* link the pad to the sinkpad of the payloader */
sinkpad = gst_element_get_static_pad (payloader, "sink");
gst_pad_link (pad, sinkpad);
gst_object_unref (sinkpad);
gst_object_unref (pad);
/* now expose the srcpad of the payloader as a ghostpad with the same name
* as the uridecodebin pad name. */
srcpad = gst_element_get_static_pad (payloader, "src");
ghostpad = gst_ghost_pad_new (padname, srcpad);
gst_object_unref (srcpad);
g_free (padname);
gst_pad_set_active (ghostpad, TRUE);
gst_element_add_pad (element, ghostpad);
return;
/* ERRORS */
no_caps:
{
GST_WARNING ("could not get caps from pad");
g_free (padname);
gst_object_unref (pad);
return;
}
no_factory:
{
GST_DEBUG ("no payloader found");
g_free (padname);
gst_caps_unref (caps);
gst_object_unref (pad);
return;
}
no_payloader:
{
GST_ERROR ("could not create payloader from factory");
g_free (padname);
gst_caps_unref (caps);
gst_object_unref (pad);
return;
}
}
static void
no_more_pads_cb (GstElement * uribin, GstElement * element)
{
GST_DEBUG ("no-more-pads");
gst_element_no_more_pads (element);
}
static GstElement *
rtsp_media_factory_uri_get_element (GstRTSPMediaFactory * factory,
const GstRTSPUrl * url)
{
GstElement *topbin, *element, *uribin;
GstRTSPMediaFactoryURI *urifact;
FactoryData *data;
urifact = GST_RTSP_MEDIA_FACTORY_URI_CAST (factory);
GST_LOG ("creating element");
topbin = gst_bin_new ("GstRTSPMediaFactoryURI");
g_assert (topbin != NULL);
/* our bin will dynamically expose payloaded pads */
element = gst_bin_new ("dynpay0");
g_assert (element != NULL);
uribin = gst_element_factory_make ("uridecodebin", "uribin");
if (uribin == NULL)
goto no_uridecodebin;
g_object_set (uribin, "uri", urifact->uri, NULL);
/* keep factory data around */
data = g_new0 (FactoryData, 1);
data->factory = g_object_ref (factory);
data->pt = 96;
g_object_set_data_full (G_OBJECT (element), factory_key,
data, (GDestroyNotify) free_data);
/* connect to the signals */
g_signal_connect (uribin, "autoplug-continue",
(GCallback) autoplug_continue_cb, element);
g_signal_connect (uribin, "pad-added", (GCallback) pad_added_cb, element);
g_signal_connect (uribin, "no-more-pads", (GCallback) no_more_pads_cb,
element);
gst_bin_add (GST_BIN_CAST (element), uribin);
gst_bin_add (GST_BIN_CAST (topbin), element);
return topbin;
no_uridecodebin:
{
g_critical ("can't create uridecodebin element");
g_object_unref (element);
return NULL;
}
}

View file

@ -0,0 +1,78 @@
/* GStreamer
* Copyright (C) 2008 Wim Taymans <wim.taymans at gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#include <gst/gst.h>
#include "rtsp-media-factory.h"
#ifndef __GST_RTSP_MEDIA_FACTORY_URI_H__
#define __GST_RTSP_MEDIA_FACTORY_URI_H__
G_BEGIN_DECLS
/* types for the media factory */
#define GST_TYPE_RTSP_MEDIA_FACTORY_URI (gst_rtsp_media_factory_uri_get_type ())
#define GST_IS_RTSP_MEDIA_FACTORY_URI(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_RTSP_MEDIA_FACTORY_URI))
#define GST_IS_RTSP_MEDIA_FACTORY_URI_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_RTSP_MEDIA_FACTORY_URI))
#define GST_RTSP_MEDIA_FACTORY_URI_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_RTSP_MEDIA_FACTORY_URI, GstRTSPMediaFactoryURIClass))
#define GST_RTSP_MEDIA_FACTORY_URI(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_RTSP_MEDIA_FACTORY_URI, GstRTSPMediaFactoryURI))
#define GST_RTSP_MEDIA_FACTORY_URI_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_RTSP_MEDIA_FACTORY_URI, GstRTSPMediaFactoryURIClass))
#define GST_RTSP_MEDIA_FACTORY_URI_CAST(obj) ((GstRTSPMediaFactoryURI*)(obj))
#define GST_RTSP_MEDIA_FACTORY_URI_CLASS_CAST(klass) ((GstRTSPMediaFactoryURIClass*)(klass))
typedef struct _GstRTSPMediaFactoryURI GstRTSPMediaFactoryURI;
typedef struct _GstRTSPMediaFactoryURIClass GstRTSPMediaFactoryURIClass;
/**
* GstRTSPMediaFactoryURI:
* @uri: the uri
*
* A media factory that creates a pipeline to play and uri.
*/
struct _GstRTSPMediaFactoryURI {
GstRTSPMediaFactory parent;
gchar *uri;
GstCaps *raw_vcaps;
GstCaps *raw_acaps;
GList *factories;
};
/**
* GstRTSPMediaFactoryURIClass:
*
* The #GstRTSPMediaFactoryURI class structure.
*/
struct _GstRTSPMediaFactoryURIClass {
GstRTSPMediaFactoryClass parent_class;
};
GType gst_rtsp_media_factory_uri_get_type (void);
/* creating the factory */
GstRTSPMediaFactoryURI * gst_rtsp_media_factory_uri_new (void);
/* configuring the factory */
void gst_rtsp_media_factory_uri_set_uri (GstRTSPMediaFactoryURI *factory,
const gchar *uri);
gchar * gst_rtsp_media_factory_uri_get_uri (GstRTSPMediaFactoryURI *factory);
G_END_DECLS
#endif /* __GST_RTSP_MEDIA_FACTORY_URI_H__ */

View file

@ -35,17 +35,22 @@ enum
GST_DEBUG_CATEGORY (rtsp_media_debug); GST_DEBUG_CATEGORY (rtsp_media_debug);
#define GST_CAT_DEFAULT rtsp_media_debug #define GST_CAT_DEFAULT rtsp_media_debug
static void gst_rtsp_media_factory_get_property (GObject *object, guint propid, static void gst_rtsp_media_factory_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec); GValue * value, GParamSpec * pspec);
static void gst_rtsp_media_factory_set_property (GObject *object, guint propid, static void gst_rtsp_media_factory_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec); const GValue * value, GParamSpec * pspec);
static void gst_rtsp_media_factory_finalize (GObject * obj); static void gst_rtsp_media_factory_finalize (GObject * obj);
static gchar * default_gen_key (GstRTSPMediaFactory *factory, const GstRTSPUrl *url); static gchar *default_gen_key (GstRTSPMediaFactory * factory,
static GstElement * default_get_element (GstRTSPMediaFactory *factory, const GstRTSPUrl *url); const GstRTSPUrl * url);
static GstRTSPMedia * default_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl *url); static GstElement *default_get_element (GstRTSPMediaFactory * factory,
static void default_configure (GstRTSPMediaFactory *factory, GstRTSPMedia *media); const GstRTSPUrl * url);
static GstElement* default_create_pipeline (GstRTSPMediaFactory *factory, GstRTSPMedia *media); static GstRTSPMedia *default_construct (GstRTSPMediaFactory * factory,
const GstRTSPUrl * url);
static void default_configure (GstRTSPMediaFactory * factory,
GstRTSPMedia * media);
static GstElement *default_create_pipeline (GstRTSPMediaFactory * factory,
GstRTSPMedia * media);
G_DEFINE_TYPE (GstRTSPMediaFactory, gst_rtsp_media_factory, G_TYPE_OBJECT); G_DEFINE_TYPE (GstRTSPMediaFactory, gst_rtsp_media_factory, G_TYPE_OBJECT);
@ -77,16 +82,18 @@ gst_rtsp_media_factory_class_init (GstRTSPMediaFactoryClass * klass)
* named dynpay0, dynpay1, etc.. * named dynpay0, dynpay1, etc..
*/ */
g_object_class_install_property (gobject_class, PROP_LAUNCH, g_object_class_install_property (gobject_class, PROP_LAUNCH,
g_param_spec_string ("launch", "Launch", "A launch description of the pipeline", g_param_spec_string ("launch", "Launch",
DEFAULT_LAUNCH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); "A launch description of the pipeline", DEFAULT_LAUNCH,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_SHARED, g_object_class_install_property (gobject_class, PROP_SHARED,
g_param_spec_boolean ("shared", "Shared", "If media from this factory is shared", g_param_spec_boolean ("shared", "Shared",
DEFAULT_SHARED, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); "If media from this factory is shared", DEFAULT_SHARED,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
g_object_class_install_property (gobject_class, PROP_EOS_SHUTDOWN, g_object_class_install_property (gobject_class, PROP_EOS_SHUTDOWN,
g_param_spec_boolean ("eos-shutdown", "EOS Shutdown", g_param_spec_boolean ("eos-shutdown", "EOS Shutdown",
"Send EOS down the pipeline before shutting down", "Send EOS down the pipeline before shutting down",
DEFAULT_EOS_SHUTDOWN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); DEFAULT_EOS_SHUTDOWN, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
klass->gen_key = default_gen_key; klass->gen_key = default_gen_key;
@ -108,7 +115,7 @@ gst_rtsp_media_factory_init (GstRTSPMediaFactory * factory)
factory->lock = g_mutex_new (); factory->lock = g_mutex_new ();
factory->medias_lock = g_mutex_new (); factory->medias_lock = g_mutex_new ();
factory->medias = g_hash_table_new_full (g_str_hash, g_str_equal, factory->medias = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref); g_free, g_object_unref);
} }
static void static void
@ -125,8 +132,8 @@ gst_rtsp_media_factory_finalize (GObject * obj)
} }
static void static void
gst_rtsp_media_factory_get_property (GObject *object, guint propid, gst_rtsp_media_factory_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec) GValue * value, GParamSpec * pspec)
{ {
GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object); GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object);
@ -138,7 +145,8 @@ gst_rtsp_media_factory_get_property (GObject *object, guint propid,
g_value_set_boolean (value, gst_rtsp_media_factory_is_shared (factory)); g_value_set_boolean (value, gst_rtsp_media_factory_is_shared (factory));
break; break;
case PROP_EOS_SHUTDOWN: case PROP_EOS_SHUTDOWN:
g_value_set_boolean (value, gst_rtsp_media_factory_is_eos_shutdown (factory)); g_value_set_boolean (value,
gst_rtsp_media_factory_is_eos_shutdown (factory));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
@ -146,8 +154,8 @@ gst_rtsp_media_factory_get_property (GObject *object, guint propid,
} }
static void static void
gst_rtsp_media_factory_set_property (GObject *object, guint propid, gst_rtsp_media_factory_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec) const GValue * value, GParamSpec * pspec)
{ {
GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object); GstRTSPMediaFactory *factory = GST_RTSP_MEDIA_FACTORY (object);
@ -159,7 +167,8 @@ gst_rtsp_media_factory_set_property (GObject *object, guint propid,
gst_rtsp_media_factory_set_shared (factory, g_value_get_boolean (value)); gst_rtsp_media_factory_set_shared (factory, g_value_get_boolean (value));
break; break;
case PROP_EOS_SHUTDOWN: case PROP_EOS_SHUTDOWN:
gst_rtsp_media_factory_set_eos_shutdown (factory, g_value_get_boolean (value)); gst_rtsp_media_factory_set_eos_shutdown (factory,
g_value_get_boolean (value));
break; break;
default: default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec); G_OBJECT_WARN_INVALID_PROPERTY_ID (object, propid, pspec);
@ -200,15 +209,16 @@ gst_rtsp_media_factory_new (void)
* etc.. Each of the payloaders will result in a stream. * etc.. Each of the payloaders will result in a stream.
*/ */
void void
gst_rtsp_media_factory_set_launch (GstRTSPMediaFactory *factory, const gchar *launch) gst_rtsp_media_factory_set_launch (GstRTSPMediaFactory * factory,
const gchar * launch)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory)); g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
g_return_if_fail (launch != NULL); g_return_if_fail (launch != NULL);
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
g_free (factory->launch); g_free (factory->launch);
factory->launch = g_strdup (launch); factory->launch = g_strdup (launch);
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
} }
/** /**
@ -221,15 +231,15 @@ gst_rtsp_media_factory_set_launch (GstRTSPMediaFactory *factory, const gchar *la
* Returns: the configured launch description. g_free() after usage. * Returns: the configured launch description. g_free() after usage.
*/ */
gchar * gchar *
gst_rtsp_media_factory_get_launch (GstRTSPMediaFactory *factory) gst_rtsp_media_factory_get_launch (GstRTSPMediaFactory * factory)
{ {
gchar *result; gchar *result;
g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL); g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), NULL);
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
result = g_strdup (factory->launch); result = g_strdup (factory->launch);
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
return result; return result;
} }
@ -242,14 +252,14 @@ gst_rtsp_media_factory_get_launch (GstRTSPMediaFactory *factory)
* Configure if media created from this factory can be shared between clients. * Configure if media created from this factory can be shared between clients.
*/ */
void void
gst_rtsp_media_factory_set_shared (GstRTSPMediaFactory *factory, gst_rtsp_media_factory_set_shared (GstRTSPMediaFactory * factory,
gboolean shared) gboolean shared)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory)); g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
factory->shared = shared; factory->shared = shared;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
} }
/** /**
@ -261,15 +271,15 @@ gst_rtsp_media_factory_set_shared (GstRTSPMediaFactory *factory,
* Returns: %TRUE if the media will be shared between clients. * Returns: %TRUE if the media will be shared between clients.
*/ */
gboolean gboolean
gst_rtsp_media_factory_is_shared (GstRTSPMediaFactory *factory) gst_rtsp_media_factory_is_shared (GstRTSPMediaFactory * factory)
{ {
gboolean result; gboolean result;
g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE); g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE);
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
result = factory->shared; result = factory->shared;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
return result; return result;
} }
@ -283,14 +293,14 @@ gst_rtsp_media_factory_is_shared (GstRTSPMediaFactory *factory)
* pipeline before shutdown. * pipeline before shutdown.
*/ */
void void
gst_rtsp_media_factory_set_eos_shutdown (GstRTSPMediaFactory *factory, gst_rtsp_media_factory_set_eos_shutdown (GstRTSPMediaFactory * factory,
gboolean eos_shutdown) gboolean eos_shutdown)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory)); g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
factory->eos_shutdown = eos_shutdown; factory->eos_shutdown = eos_shutdown;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
} }
/** /**
@ -303,31 +313,30 @@ gst_rtsp_media_factory_set_eos_shutdown (GstRTSPMediaFactory *factory,
* Returns: %TRUE if the media will receive EOS before shutdown. * Returns: %TRUE if the media will receive EOS before shutdown.
*/ */
gboolean gboolean
gst_rtsp_media_factory_is_eos_shutdown (GstRTSPMediaFactory *factory) gst_rtsp_media_factory_is_eos_shutdown (GstRTSPMediaFactory * factory)
{ {
gboolean result; gboolean result;
g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE); g_return_val_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory), FALSE);
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
result = factory->eos_shutdown; result = factory->eos_shutdown;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
return result; return result;
} }
static gboolean static gboolean
compare_media (gpointer key, GstRTSPMedia *media1, GstRTSPMedia *media2) compare_media (gpointer key, GstRTSPMedia * media1, GstRTSPMedia * media2)
{ {
return (media1 == media2); return (media1 == media2);
} }
static void static void
media_unprepared (GstRTSPMedia *media, GstRTSPMediaFactory *factory) media_unprepared (GstRTSPMedia * media, GstRTSPMediaFactory * factory)
{ {
g_mutex_lock (factory->medias_lock); g_mutex_lock (factory->medias_lock);
g_hash_table_foreach_remove (factory->medias, (GHRFunc) compare_media, g_hash_table_foreach_remove (factory->medias, (GHRFunc) compare_media, media);
media);
g_mutex_unlock (factory->medias_lock); g_mutex_unlock (factory->medias_lock);
} }
@ -347,7 +356,8 @@ media_unprepared (GstRTSPMedia *media, GstRTSPMediaFactory *factory)
* Returns: a new #GstRTSPMedia if the media could be prepared. * Returns: a new #GstRTSPMedia if the media could be prepared.
*/ */
GstRTSPMedia * GstRTSPMedia *
gst_rtsp_media_factory_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl *url) gst_rtsp_media_factory_construct (GstRTSPMediaFactory * factory,
const GstRTSPUrl * url)
{ {
gchar *key; gchar *key;
GstRTSPMedia *media; GstRTSPMedia *media;
@ -368,8 +378,7 @@ gst_rtsp_media_factory_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl
media = g_hash_table_lookup (factory->medias, key); media = g_hash_table_lookup (factory->medias, key);
if (media) if (media)
g_object_ref (media); g_object_ref (media);
} } else
else
media = NULL; media = NULL;
if (media == NULL) { if (media == NULL) {
@ -392,10 +401,10 @@ gst_rtsp_media_factory_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl
key = NULL; key = NULL;
} }
if (!gst_rtsp_media_is_reusable (media)) { if (!gst_rtsp_media_is_reusable (media)) {
/* when not reusable, connect to the unprepare signal to remove the item /* when not reusable, connect to the unprepare signal to remove the item
* from our cache when it gets unprepared */ * from our cache when it gets unprepared */
g_signal_connect (media, "unprepared", (GCallback) media_unprepared, g_signal_connect (media, "unprepared", (GCallback) media_unprepared,
factory); factory);
} }
} }
} }
@ -410,7 +419,7 @@ gst_rtsp_media_factory_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl
} }
static gchar * static gchar *
default_gen_key (GstRTSPMediaFactory *factory, const GstRTSPUrl *url) default_gen_key (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
{ {
gchar *result; gchar *result;
const gchar *pre_query; const gchar *pre_query;
@ -419,18 +428,19 @@ default_gen_key (GstRTSPMediaFactory *factory, const GstRTSPUrl *url)
pre_query = url->query ? "?" : ""; pre_query = url->query ? "?" : "";
query = url->query ? url->query : ""; query = url->query ? url->query : "";
result = g_strdup_printf ("%u%s%s%s", url->port, url->abspath, pre_query, query); result =
g_strdup_printf ("%u%s%s%s", url->port, url->abspath, pre_query, query);
return result; return result;
} }
static GstElement * static GstElement *
default_get_element (GstRTSPMediaFactory *factory, const GstRTSPUrl *url) default_get_element (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
{ {
GstElement *element; GstElement *element;
GError *error = NULL; GError *error = NULL;
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
/* we need a parse syntax */ /* we need a parse syntax */
if (factory->launch == NULL) if (factory->launch == NULL)
goto no_launch; goto no_launch;
@ -440,7 +450,7 @@ default_get_element (GstRTSPMediaFactory *factory, const GstRTSPUrl *url)
if (element == NULL) if (element == NULL)
goto parse_error; goto parse_error;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
if (error != NULL) { if (error != NULL) {
/* a recoverable error was encountered */ /* a recoverable error was encountered */
@ -452,15 +462,15 @@ default_get_element (GstRTSPMediaFactory *factory, const GstRTSPUrl *url)
/* ERRORS */ /* ERRORS */
no_launch: no_launch:
{ {
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
g_critical ("no launch line specified"); g_critical ("no launch line specified");
return NULL; return NULL;
} }
parse_error: parse_error:
{ {
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
g_critical ("could not parse launch syntax (%s): %s", factory->launch, g_critical ("could not parse launch syntax (%s): %s", factory->launch,
(error ? error->message : "unknown reason")); (error ? error->message : "unknown reason"));
if (error) if (error)
g_error_free (error); g_error_free (error);
return NULL; return NULL;
@ -470,11 +480,11 @@ parse_error:
/* try to find all the payloader elements, they should be named 'pay%d'. for /* try to find all the payloader elements, they should be named 'pay%d'. for
* each of the payloaders we will create a stream and collect the source pad. */ * each of the payloaders we will create a stream and collect the source pad. */
void void
gst_rtsp_media_factory_collect_streams (GstRTSPMediaFactory *factory, const GstRTSPUrl *url, gst_rtsp_media_factory_collect_streams (GstRTSPMediaFactory * factory,
GstRTSPMedia *media) const GstRTSPUrl * url, GstRTSPMedia * media)
{ {
GstElement *element, *elem; GstElement *element, *elem;
GstPad * pad; GstPad *pad;
gint i; gint i;
GstRTSPMediaStream *stream; GstRTSPMediaStream *stream;
gboolean have_elem; gboolean have_elem;
@ -482,7 +492,7 @@ gst_rtsp_media_factory_collect_streams (GstRTSPMediaFactory *factory, const GstR
element = media->element; element = media->element;
have_elem = TRUE; have_elem = TRUE;
for (i = 0; have_elem ; i++) { for (i = 0; have_elem; i++) {
gchar *name; gchar *name;
have_elem = FALSE; have_elem = FALSE;
@ -524,7 +534,7 @@ gst_rtsp_media_factory_collect_streams (GstRTSPMediaFactory *factory, const GstR
} }
static GstRTSPMedia * static GstRTSPMedia *
default_construct (GstRTSPMediaFactory *factory, const GstRTSPUrl *url) default_construct (GstRTSPMediaFactory * factory, const GstRTSPUrl * url)
{ {
GstRTSPMedia *media; GstRTSPMedia *media;
GstElement *element; GstElement *element;
@ -573,8 +583,8 @@ no_pipeline:
} }
} }
static GstElement* static GstElement *
default_create_pipeline (GstRTSPMediaFactory *factory, GstRTSPMedia *media) default_create_pipeline (GstRTSPMediaFactory * factory, GstRTSPMedia * media)
{ {
GstElement *pipeline; GstElement *pipeline;
@ -595,15 +605,15 @@ no_element:
} }
static void static void
default_configure (GstRTSPMediaFactory *factory, GstRTSPMedia *media) default_configure (GstRTSPMediaFactory * factory, GstRTSPMedia * media)
{ {
gboolean shared, eos_shutdown; gboolean shared, eos_shutdown;
/* configure the sharedness */ /* configure the sharedness */
g_mutex_lock (factory->lock); GST_RTSP_MEDIA_FACTORY_LOCK (factory);
shared = factory->shared; shared = factory->shared;
eos_shutdown = factory->eos_shutdown; eos_shutdown = factory->eos_shutdown;
g_mutex_unlock (factory->lock); GST_RTSP_MEDIA_FACTORY_UNLOCK (factory);
gst_rtsp_media_set_shared (media, shared); gst_rtsp_media_set_shared (media, shared);
gst_rtsp_media_set_eos_shutdown (media, eos_shutdown); gst_rtsp_media_set_eos_shutdown (media, eos_shutdown);

View file

@ -40,6 +40,10 @@ G_BEGIN_DECLS
typedef struct _GstRTSPMediaFactory GstRTSPMediaFactory; typedef struct _GstRTSPMediaFactory GstRTSPMediaFactory;
typedef struct _GstRTSPMediaFactoryClass GstRTSPMediaFactoryClass; typedef struct _GstRTSPMediaFactoryClass GstRTSPMediaFactoryClass;
#define GST_RTSP_MEDIA_FACTORY_GET_LOCK(f) (GST_RTSP_MEDIA_FACTORY_CAST(f)->lock)
#define GST_RTSP_MEDIA_FACTORY_LOCK(f) (g_mutex_lock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
#define GST_RTSP_MEDIA_FACTORY_UNLOCK(f) (g_mutex_unlock(GST_RTSP_MEDIA_FACTORY_GET_LOCK(f)))
/** /**
* GstRTSPMediaFactory: * GstRTSPMediaFactory:
* @lock: mutex protecting the datastructure. * @lock: mutex protecting the datastructure.

View file

@ -26,7 +26,8 @@ GST_DEBUG_CATEGORY_EXTERN (rtsp_media_debug);
static void gst_rtsp_media_mapping_finalize (GObject * obj); static void gst_rtsp_media_mapping_finalize (GObject * obj);
static GstRTSPMediaFactory * find_media (GstRTSPMediaMapping *mapping, const GstRTSPUrl *url); static GstRTSPMediaFactory *find_media (GstRTSPMediaMapping * mapping,
const GstRTSPUrl * url);
static void static void
gst_rtsp_media_mapping_class_init (GstRTSPMediaMappingClass * klass) gst_rtsp_media_mapping_class_init (GstRTSPMediaMappingClass * klass)
@ -44,7 +45,7 @@ static void
gst_rtsp_media_mapping_init (GstRTSPMediaMapping * mapping) gst_rtsp_media_mapping_init (GstRTSPMediaMapping * mapping)
{ {
mapping->mappings = g_hash_table_new_full (g_str_hash, g_str_equal, mapping->mappings = g_hash_table_new_full (g_str_hash, g_str_equal,
g_free, g_object_unref); g_free, g_object_unref);
} }
static void static void
@ -68,7 +69,7 @@ gst_rtsp_media_mapping_new (void)
} }
static GstRTSPMediaFactory * static GstRTSPMediaFactory *
find_media (GstRTSPMediaMapping *mapping, const GstRTSPUrl *url) find_media (GstRTSPMediaMapping * mapping, const GstRTSPUrl * url)
{ {
GstRTSPMediaFactory *result; GstRTSPMediaFactory *result;
@ -95,7 +96,8 @@ find_media (GstRTSPMediaMapping *mapping, const GstRTSPUrl *url)
* Returns: the #GstRTSPMediaFactory for @url. g_object_unref() after usage. * Returns: the #GstRTSPMediaFactory for @url. g_object_unref() after usage.
*/ */
GstRTSPMediaFactory * GstRTSPMediaFactory *
gst_rtsp_media_mapping_find_factory (GstRTSPMediaMapping *mapping, const GstRTSPUrl *url) gst_rtsp_media_mapping_find_factory (GstRTSPMediaMapping * mapping,
const GstRTSPUrl * url)
{ {
GstRTSPMediaFactory *result; GstRTSPMediaFactory *result;
GstRTSPMediaMappingClass *klass; GstRTSPMediaMappingClass *klass;
@ -124,8 +126,8 @@ gst_rtsp_media_mapping_find_factory (GstRTSPMediaMapping *mapping, const GstRTSP
* used after calling this function. * used after calling this function.
*/ */
void void
gst_rtsp_media_mapping_add_factory (GstRTSPMediaMapping *mapping, const gchar *path, gst_rtsp_media_mapping_add_factory (GstRTSPMediaMapping * mapping,
GstRTSPMediaFactory *factory) const gchar * path, GstRTSPMediaFactory * factory)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA_MAPPING (mapping)); g_return_if_fail (GST_IS_RTSP_MEDIA_MAPPING (mapping));
g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory)); g_return_if_fail (GST_IS_RTSP_MEDIA_FACTORY (factory));
@ -142,11 +144,11 @@ gst_rtsp_media_mapping_add_factory (GstRTSPMediaMapping *mapping, const gchar *p
* Remove the #GstRTSPMediaFactory associated with @path in @mapping. * Remove the #GstRTSPMediaFactory associated with @path in @mapping.
*/ */
void void
gst_rtsp_media_mapping_remove_factory (GstRTSPMediaMapping *mapping, const gchar *path) gst_rtsp_media_mapping_remove_factory (GstRTSPMediaMapping * mapping,
const gchar * path)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA_MAPPING (mapping)); g_return_if_fail (GST_IS_RTSP_MEDIA_MAPPING (mapping));
g_return_if_fail (path != NULL); g_return_if_fail (path != NULL);
g_hash_table_remove (mapping->mappings, path); g_hash_table_remove (mapping->mappings, path);
} }

View file

@ -56,7 +56,7 @@ struct _GstRTSPMediaMapping {
* GstRTSPMediaMappingClass: * GstRTSPMediaMappingClass:
* @find_media: Create or return a previously cached #GstRTSPMediaFactory object * @find_media: Create or return a previously cached #GstRTSPMediaFactory object
* for the given url. the default implementation will use the mappings * for the given url. the default implementation will use the mappings
* added with gst_rtsp_media_mapping_add_factory (). * added with gst_rtsp_media_mapping_add_factory().
* *
* The class for the media mapping object. * The class for the media mapping object.
*/ */

View file

@ -135,7 +135,8 @@ gst_rtsp_media_init (GstRTSPMedia * media)
} }
/* FIXME. this should be done in multiudpsink */ /* FIXME. this should be done in multiudpsink */
typedef struct { typedef struct
{
gint count; gint count;
gchar *dest; gchar *dest;
gint min, max; gint min, max;
@ -144,14 +145,15 @@ typedef struct {
static gint static gint
dest_compare (RTSPDestination * a, RTSPDestination * b) dest_compare (RTSPDestination * a, RTSPDestination * b)
{ {
if ((a->min == b->min) && (a->max == b->max) && (strcmp (a->dest, b->dest) == 0)) if ((a->min == b->min) && (a->max == b->max)
&& (strcmp (a->dest, b->dest) == 0))
return 0; return 0;
return 1; return 1;
} }
static RTSPDestination * static RTSPDestination *
create_destination (const gchar *dest, gint min, gint max) create_destination (const gchar * dest, gint min, gint max)
{ {
RTSPDestination *res; RTSPDestination *res;
@ -165,14 +167,14 @@ create_destination (const gchar *dest, gint min, gint max)
} }
static void static void
free_destination (RTSPDestination *dest) free_destination (RTSPDestination * dest)
{ {
g_free (dest->dest); g_free (dest->dest);
g_slice_free (RTSPDestination, dest); g_slice_free (RTSPDestination, dest);
} }
void void
gst_rtsp_media_trans_cleanup (GstRTSPMediaTrans *trans) gst_rtsp_media_trans_cleanup (GstRTSPMediaTrans * trans)
{ {
if (trans->transport) { if (trans->transport) {
gst_rtsp_transport_free (trans->transport); gst_rtsp_transport_free (trans->transport);
@ -339,7 +341,7 @@ collect_media_stats (GstRTSPMedia * media)
GST_INFO ("stats: position %" GST_TIME_FORMAT ", duration %" GST_INFO ("stats: position %" GST_TIME_FORMAT ", duration %"
GST_TIME_FORMAT, GST_TIME_ARGS (position), GST_TIME_ARGS (duration)); GST_TIME_FORMAT, GST_TIME_ARGS (position), GST_TIME_ARGS (duration));
if (position == -1) { if (position == -1 || media->active > 0) {
media->range.min.type = GST_RTSP_TIME_NOW; media->range.min.type = GST_RTSP_TIME_NOW;
media->range.min.seconds = -1; media->range.min.seconds = -1;
} else { } else {
@ -466,7 +468,8 @@ gst_rtsp_media_set_protocols (GstRTSPMedia * media, GstRTSPLowerTrans protocols)
GstRTSPLowerTrans GstRTSPLowerTrans
gst_rtsp_media_get_protocols (GstRTSPMedia * media) gst_rtsp_media_get_protocols (GstRTSPMedia * media)
{ {
g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), GST_RTSP_LOWER_TRANS_UNKNOWN); g_return_val_if_fail (GST_IS_RTSP_MEDIA (media),
GST_RTSP_LOWER_TRANS_UNKNOWN);
return media->protocols; return media->protocols;
} }
@ -480,7 +483,7 @@ gst_rtsp_media_get_protocols (GstRTSPMedia * media)
* it is unprepared. * it is unprepared.
*/ */
void void
gst_rtsp_media_set_eos_shutdown (GstRTSPMedia *media, gboolean eos_shutdown) gst_rtsp_media_set_eos_shutdown (GstRTSPMedia * media, gboolean eos_shutdown)
{ {
g_return_if_fail (GST_IS_RTSP_MEDIA (media)); g_return_if_fail (GST_IS_RTSP_MEDIA (media));
@ -497,7 +500,7 @@ gst_rtsp_media_set_eos_shutdown (GstRTSPMedia *media, gboolean eos_shutdown)
* Returns: %TRUE if the media will send EOS before unpreparing. * Returns: %TRUE if the media will send EOS before unpreparing.
*/ */
gboolean gboolean
gst_rtsp_media_is_eos_shutdown (GstRTSPMedia *media) gst_rtsp_media_is_eos_shutdown (GstRTSPMedia * media)
{ {
g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), FALSE); g_return_val_if_fail (GST_IS_RTSP_MEDIA (media), FALSE);
@ -547,7 +550,7 @@ gst_rtsp_media_get_stream (GstRTSPMedia * media, guint idx)
/** /**
* gst_rtsp_media_seek: * gst_rtsp_media_seek:
* @stream: a #GstRTSPMediaStream * @media: a #GstRTSPMedia
* @range: a #GstRTSPTimeRange * @range: a #GstRTSPTimeRange
* *
* Seek the pipeline to @range. * Seek the pipeline to @range.
@ -797,12 +800,12 @@ again:
if (!udpsink1) if (!udpsink1)
goto no_udp_protocol; goto no_udp_protocol;
if (g_object_class_find_property (G_OBJECT_GET_CLASS (udpsink0), "send-duplicates")) { if (g_object_class_find_property (G_OBJECT_GET_CLASS (udpsink0),
"send-duplicates")) {
g_object_set (G_OBJECT (udpsink0), "send-duplicates", FALSE, NULL); g_object_set (G_OBJECT (udpsink0), "send-duplicates", FALSE, NULL);
g_object_set (G_OBJECT (udpsink1), "send-duplicates", FALSE, NULL); g_object_set (G_OBJECT (udpsink1), "send-duplicates", FALSE, NULL);
stream->filter_duplicates = FALSE; stream->filter_duplicates = FALSE;
} } else {
else {
GST_WARNING ("multiudpsink version found without send-duplicates property"); GST_WARNING ("multiudpsink version found without send-duplicates property");
stream->filter_duplicates = TRUE; stream->filter_duplicates = TRUE;
} }
@ -1269,7 +1272,7 @@ unlock_streams (GstRTSPMedia * media)
} }
static void static void
gst_rtsp_media_set_status (GstRTSPMedia *media, GstRTSPMediaStatus status) gst_rtsp_media_set_status (GstRTSPMedia * media, GstRTSPMediaStatus status)
{ {
g_mutex_lock (media->lock); g_mutex_lock (media->lock);
/* never overwrite the error status */ /* never overwrite the error status */
@ -1281,7 +1284,7 @@ gst_rtsp_media_set_status (GstRTSPMedia *media, GstRTSPMediaStatus status)
} }
static GstRTSPMediaStatus static GstRTSPMediaStatus
gst_rtsp_media_get_status (GstRTSPMedia *media) gst_rtsp_media_get_status (GstRTSPMedia * media)
{ {
GstRTSPMediaStatus result; GstRTSPMediaStatus result;
GTimeVal timeout; GTimeVal timeout;
@ -1384,10 +1387,17 @@ default_handle_message (GstRTSPMedia * media, GstMessage * message)
case GST_MESSAGE_STREAM_STATUS: case GST_MESSAGE_STREAM_STATUS:
break; break;
case GST_MESSAGE_ASYNC_DONE: case GST_MESSAGE_ASYNC_DONE:
GST_INFO ("%p: got ASYNC_DONE", media); if (!media->adding) {
collect_media_stats (media); /* when we are dynamically adding pads, the addition of the udpsrc will
* temporarily produce ASYNC_DONE messages. We have to ignore them and
* wait for the final ASYNC_DONE after everything prerolled */
GST_INFO ("%p: got ASYNC_DONE", media);
collect_media_stats (media);
gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_PREPARED); gst_rtsp_media_set_status (media, GST_RTSP_MEDIA_STATUS_PREPARED);
} else {
GST_INFO ("%p: ignoring ASYNC_DONE", media);
}
break; break;
case GST_MESSAGE_EOS: case GST_MESSAGE_EOS:
GST_INFO ("%p: got EOS", media); GST_INFO ("%p: got EOS", media);
@ -1439,6 +1449,8 @@ pad_added_cb (GstElement * element, GstPad * pad, GstRTSPMedia * media)
name = g_strdup_printf ("dynpay%d", i); name = g_strdup_printf ("dynpay%d", i);
media->adding = TRUE;
/* ghost the pad of the payloader to the element */ /* ghost the pad of the payloader to the element */
stream->srcpad = gst_ghost_pad_new (name, pad); stream->srcpad = gst_ghost_pad_new (name, pad);
gst_pad_set_active (stream->srcpad, TRUE); gst_pad_set_active (stream->srcpad, TRUE);
@ -1457,6 +1469,7 @@ pad_added_cb (GstElement * element, GstPad * pad, GstRTSPMedia * media)
gst_element_set_state (stream->selector[i], GST_STATE_PAUSED); gst_element_set_state (stream->selector[i], GST_STATE_PAUSED);
gst_element_set_state (stream->appsrc[i], GST_STATE_PAUSED); gst_element_set_state (stream->appsrc[i], GST_STATE_PAUSED);
} }
media->adding = FALSE;
} }
static void static void
@ -1475,7 +1488,7 @@ no_more_pads_cb (GstElement * element, GstRTSPMedia * media)
/** /**
* gst_rtsp_media_prepare: * gst_rtsp_media_prepare:
* @obj: a #GstRTSPMedia * @media: a #GstRTSPMedia
* *
* Prepare @media for streaming. This function will create the pipeline and * Prepare @media for streaming. This function will create the pipeline and
* other objects to manage the streaming. * other objects to manage the streaming.
@ -1541,6 +1554,8 @@ gst_rtsp_media_prepare (GstRTSPMedia * media)
for (walk = media->dynamic; walk; walk = g_list_next (walk)) { for (walk = media->dynamic; walk; walk = g_list_next (walk)) {
GstElement *elem = walk->data; GstElement *elem = walk->data;
GST_INFO ("adding callbacks for dynamic element %p", elem);
g_signal_connect (elem, "pad-added", (GCallback) pad_added_cb, media); g_signal_connect (elem, "pad-added", (GCallback) pad_added_cb, media);
g_signal_connect (elem, "no-more-pads", (GCallback) no_more_pads_cb, media); g_signal_connect (elem, "no-more-pads", (GCallback) no_more_pads_cb, media);
@ -1612,7 +1627,7 @@ state_failed:
/** /**
* gst_rtsp_media_unprepare: * gst_rtsp_media_unprepare:
* @obj: a #GstRTSPMedia * @media: a #GstRTSPMedia
* *
* Unprepare @media. After this call, the media should be prepared again before * Unprepare @media. After this call, the media should be prepared again before
* it can be used again. If the media is set to be non-reusable, a new instance * it can be used again. If the media is set to be non-reusable, a new instance
@ -1656,7 +1671,7 @@ default_unprepare (GstRTSPMedia * media)
/* ref so that we don't disappear */ /* ref so that we don't disappear */
g_object_ref (media); g_object_ref (media);
media->eos_pending = TRUE; media->eos_pending = TRUE;
gst_element_send_event (media->pipeline, gst_event_new_eos()); gst_element_send_event (media->pipeline, gst_event_new_eos ());
/* we need to go to playing again for the EOS to propagate, normally in this /* we need to go to playing again for the EOS to propagate, normally in this
* state, nothing is receiving data from us anymore so this is ok. */ * state, nothing is receiving data from us anymore so this is ok. */
gst_element_set_state (media->pipeline, GST_STATE_PLAYING); gst_element_set_state (media->pipeline, GST_STATE_PLAYING);
@ -1668,8 +1683,8 @@ default_unprepare (GstRTSPMedia * media)
} }
static void static void
add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, add_udp_destination (GstRTSPMedia * media, GstRTSPMediaStream * stream,
gchar *dest, gint min, gint max) gchar * dest, gint min, gint max)
{ {
gboolean do_add = TRUE; gboolean do_add = TRUE;
RTSPDestination *ndest; RTSPDestination *ndest;
@ -1683,11 +1698,14 @@ add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
fdest.max = max; fdest.max = max;
/* first see if we already added this destination */ /* first see if we already added this destination */
find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); find =
g_list_find_custom (stream->destinations, &fdest,
(GCompareFunc) dest_compare);
if (find) { if (find) {
ndest = (RTSPDestination *) find->data; ndest = (RTSPDestination *) find->data;
GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); GST_INFO ("already streaming to %s:%d-%d with %d clients", dest, min, max,
ndest->count);
ndest->count++; ndest->count++;
do_add = FALSE; do_add = FALSE;
} }
@ -1706,8 +1724,8 @@ add_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
} }
static void static void
remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream, remove_udp_destination (GstRTSPMedia * media, GstRTSPMediaStream * stream,
gchar *dest, gint min, gint max) gchar * dest, gint min, gint max)
{ {
gboolean do_remove = TRUE; gboolean do_remove = TRUE;
RTSPDestination *ndest = NULL; RTSPDestination *ndest = NULL;
@ -1721,14 +1739,17 @@ remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
fdest.max = max; fdest.max = max;
/* first see if we already added this destination */ /* first see if we already added this destination */
find = g_list_find_custom (stream->destinations, &fdest, (GCompareFunc) dest_compare); find =
g_list_find_custom (stream->destinations, &fdest,
(GCompareFunc) dest_compare);
if (!find) if (!find)
return; return;
ndest = (RTSPDestination *) find->data; ndest = (RTSPDestination *) find->data;
if (--ndest->count > 0) { if (--ndest->count > 0) {
do_remove = FALSE; do_remove = FALSE;
GST_INFO ("still streaming to %s:%d-%d with %d clients", dest, min, max, ndest->count); GST_INFO ("still streaming to %s:%d-%d with %d clients", dest, min, max,
ndest->count);
} }
} }
@ -1748,7 +1769,7 @@ remove_udp_destination (GstRTSPMedia *media, GstRTSPMediaStream *stream,
* gst_rtsp_media_set_state: * gst_rtsp_media_set_state:
* @media: a #GstRTSPMedia * @media: a #GstRTSPMedia
* @state: the target state of the media * @state: the target state of the media
* @transports: a GArray of #GstRTSPMediaTrans pointers * @transports: a #GArray of #GstRTSPMediaTrans pointers
* *
* Set the state of @media to @state and for the transports in @transports. * Set the state of @media to @state and for the transports in @transports.
* *
@ -1880,7 +1901,7 @@ gst_rtsp_media_set_state (GstRTSPMedia * media, GstState state,
} }
/* remember where we are */ /* remember where we are */
if (state == GST_STATE_PAUSED) if (state == GST_STATE_PAUSED || old_active != media->active)
collect_media_stats (media); collect_media_stats (media);
return TRUE; return TRUE;

View file

@ -82,7 +82,6 @@ struct _GstRTSPMediaTrans {
/** /**
* GstRTSPMediaStream: * GstRTSPMediaStream:
*
* @srcpad: the srcpad of the stream * @srcpad: the srcpad of the stream
* @payloader: the payloader of the format * @payloader: the payloader of the format
* @prepared: if the stream is prepared for streaming * @prepared: if the stream is prepared for streaming
@ -185,7 +184,7 @@ typedef enum {
* @range: the range of the media being streamed * @range: the range of the media being streamed
* *
* A class that contains the GStreamer element along with a list of * A class that contains the GStreamer element along with a list of
* #GstRTSPediaStream objects that can produce data. * #GstRTSPMediaStream objects that can produce data.
* *
* This object is usually created from a #GstRTSPMediaFactory. * This object is usually created from a #GstRTSPMediaFactory.
*/ */
@ -208,6 +207,7 @@ struct _GstRTSPMedia {
GstRTSPMediaStatus status; GstRTSPMediaStatus status;
gint active; gint active;
gboolean eos_pending; gboolean eos_pending;
gboolean adding;
/* the pipeline for the media */ /* the pipeline for the media */
GstElement *pipeline; GstElement *pipeline;
@ -284,7 +284,7 @@ gboolean gst_rtsp_media_seek (GstRTSPMedia *media, GstR
GstFlowReturn gst_rtsp_media_stream_rtp (GstRTSPMediaStream *stream, GstBuffer *buffer); GstFlowReturn gst_rtsp_media_stream_rtp (GstRTSPMediaStream *stream, GstBuffer *buffer);
GstFlowReturn gst_rtsp_media_stream_rtcp (GstRTSPMediaStream *stream, GstBuffer *buffer); GstFlowReturn gst_rtsp_media_stream_rtcp (GstRTSPMediaStream *stream, GstBuffer *buffer);
gboolean gst_rtsp_media_set_state (GstRTSPMedia *media, GstState state, GArray *trans); gboolean gst_rtsp_media_set_state (GstRTSPMedia *media, GstState state, GArray *transports);
void gst_rtsp_media_remove_elements (GstRTSPMedia *media); void gst_rtsp_media_remove_elements (GstRTSPMedia *media);

View file

@ -32,7 +32,7 @@ gst_rtsp_params_set (GstRTSPClient * client, GstRTSPUrl * uri,
code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD; code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD;
gst_rtsp_message_init_response (response, code, gst_rtsp_message_init_response (response, code,
gst_rtsp_status_as_text (code), request); gst_rtsp_status_as_text (code), request);
return GST_RTSP_OK; return GST_RTSP_OK;
} }
@ -49,7 +49,7 @@ gst_rtsp_params_get (GstRTSPClient * client, GstRTSPUrl * uri,
code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD; code = GST_RTSP_STS_PARAMETER_NOT_UNDERSTOOD;
gst_rtsp_message_init_response (response, code, gst_rtsp_message_init_response (response, code,
gst_rtsp_status_as_text (code), request); gst_rtsp_status_as_text (code), request);
return GST_RTSP_OK; return GST_RTSP_OK;
} }

View file

@ -22,7 +22,7 @@
/** /**
* gst_rtsp_sdp_from_media: * gst_rtsp_sdp_from_media:
* @sdp: a #GstSDPessage * @sdp: a #GstSDPMessage
* @info: info * @info: info
* @media: a #GstRTSPMedia * @media: a #GstRTSPMedia
* *
@ -32,7 +32,8 @@
* Returns: TRUE on success. * Returns: TRUE on success.
*/ */
gboolean gboolean
gst_rtsp_sdp_from_media (GstSDPMessage *sdp, GstSDPInfo *info, GstRTSPMedia * media) gst_rtsp_sdp_from_media (GstSDPMessage * sdp, GstSDPInfo * info,
GstRTSPMedia * media)
{ {
guint i, n_streams; guint i, n_streams;
gchar *rangestr; gchar *rangestr;
@ -85,7 +86,8 @@ gst_rtsp_sdp_from_media (GstSDPMessage *sdp, GstSDPInfo *info, GstRTSPMedia * me
gst_sdp_media_set_proto (smedia, "RTP/AVP"); gst_sdp_media_set_proto (smedia, "RTP/AVP");
/* for the c= line */ /* for the c= line */
gst_sdp_media_add_connection (smedia, "IN", info->server_proto, info->server_ip, 16, 0); gst_sdp_media_add_connection (smedia, "IN", info->server_proto,
info->server_ip, 16, 0);
/* get clock-rate, media type and params for the rtpmap attribute */ /* get clock-rate, media type and params for the rtpmap attribute */
gst_structure_get_int (s, "clock-rate", &caps_rate); gst_structure_get_int (s, "clock-rate", &caps_rate);

View file

@ -49,14 +49,14 @@ G_DEFINE_TYPE (GstRTSPServer, gst_rtsp_server, G_TYPE_OBJECT);
GST_DEBUG_CATEGORY_STATIC (rtsp_server_debug); GST_DEBUG_CATEGORY_STATIC (rtsp_server_debug);
#define GST_CAT_DEFAULT rtsp_server_debug #define GST_CAT_DEFAULT rtsp_server_debug
static void gst_rtsp_server_get_property (GObject *object, guint propid, static void gst_rtsp_server_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec); GValue * value, GParamSpec * pspec);
static void gst_rtsp_server_set_property (GObject *object, guint propid, static void gst_rtsp_server_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec); const GValue * value, GParamSpec * pspec);
static void gst_rtsp_server_finalize (GObject *object); static void gst_rtsp_server_finalize (GObject * object);
static GstRTSPClient * default_accept_client (GstRTSPServer *server, static GstRTSPClient *default_accept_client (GstRTSPServer * server,
GIOChannel *channel); GIOChannel * channel);
static void static void
gst_rtsp_server_class_init (GstRTSPServerClass * klass) gst_rtsp_server_class_init (GstRTSPServerClass * klass)
@ -76,8 +76,9 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
* listen on. * listen on.
*/ */
g_object_class_install_property (gobject_class, PROP_ADDRESS, g_object_class_install_property (gobject_class, PROP_ADDRESS,
g_param_spec_string ("address", "Address", "The address the server uses to listen on", g_param_spec_string ("address", "Address",
DEFAULT_ADDRESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); "The address the server uses to listen on", DEFAULT_ADDRESS,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* GstRTSPServer::service * GstRTSPServer::service
* *
@ -85,7 +86,8 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
* a port number (as a string) the server will listen on. * a port number (as a string) the server will listen on.
*/ */
g_object_class_install_property (gobject_class, PROP_SERVICE, g_object_class_install_property (gobject_class, PROP_SERVICE,
g_param_spec_string ("service", "Service", "The service or port number the server uses to listen on", g_param_spec_string ("service", "Service",
"The service or port number the server uses to listen on",
DEFAULT_SERVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); DEFAULT_SERVICE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* GstRTSPServer::backlog * GstRTSPServer::backlog
@ -97,9 +99,10 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
* request may be ignored so that a later reattempt at connection succeeds. * request may be ignored so that a later reattempt at connection succeeds.
*/ */
g_object_class_install_property (gobject_class, PROP_BACKLOG, g_object_class_install_property (gobject_class, PROP_BACKLOG,
g_param_spec_int ("backlog", "Backlog", "The maximum length to which the queue " g_param_spec_int ("backlog", "Backlog",
"of pending connections may grow", "The maximum length to which the queue "
0, G_MAXINT, DEFAULT_BACKLOG, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); "of pending connections may grow", 0, G_MAXINT, DEFAULT_BACKLOG,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* GstRTSPServer::session-pool * GstRTSPServer::session-pool
* *
@ -110,7 +113,8 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
g_object_class_install_property (gobject_class, PROP_SESSION_POOL, g_object_class_install_property (gobject_class, PROP_SESSION_POOL,
g_param_spec_object ("session-pool", "Session Pool", g_param_spec_object ("session-pool", "Session Pool",
"The session pool to use for client session", "The session pool to use for client session",
GST_TYPE_RTSP_SESSION_POOL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_TYPE_RTSP_SESSION_POOL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* GstRTSPServer::media-mapping * GstRTSPServer::media-mapping
* *
@ -120,7 +124,8 @@ gst_rtsp_server_class_init (GstRTSPServerClass * klass)
g_object_class_install_property (gobject_class, PROP_MEDIA_MAPPING, g_object_class_install_property (gobject_class, PROP_MEDIA_MAPPING,
g_param_spec_object ("media-mapping", "Media Mapping", g_param_spec_object ("media-mapping", "Media Mapping",
"The media mapping to use for client session", "The media mapping to use for client session",
GST_TYPE_RTSP_MEDIA_MAPPING, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); GST_TYPE_RTSP_MEDIA_MAPPING,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
klass->accept_client = default_accept_client; klass->accept_client = default_accept_client;
@ -138,7 +143,7 @@ gst_rtsp_server_init (GstRTSPServer * server)
} }
static void static void
gst_rtsp_server_finalize (GObject *object) gst_rtsp_server_finalize (GObject * object)
{ {
GstRTSPServer *server = GST_RTSP_SERVER (object); GstRTSPServer *server = GST_RTSP_SERVER (object);
@ -174,7 +179,7 @@ gst_rtsp_server_new (void)
* This function must be called before the server is bound. * This function must be called before the server is bound.
*/ */
void void
gst_rtsp_server_set_address (GstRTSPServer *server, const gchar *address) gst_rtsp_server_set_address (GstRTSPServer * server, const gchar * address)
{ {
g_return_if_fail (GST_IS_RTSP_SERVER (server)); g_return_if_fail (GST_IS_RTSP_SERVER (server));
g_return_if_fail (address != NULL); g_return_if_fail (address != NULL);
@ -192,7 +197,7 @@ gst_rtsp_server_set_address (GstRTSPServer *server, const gchar *address)
* Returns: the server address. g_free() after usage. * Returns: the server address. g_free() after usage.
*/ */
gchar * gchar *
gst_rtsp_server_get_address (GstRTSPServer *server) gst_rtsp_server_get_address (GstRTSPServer * server)
{ {
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL); g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL);
@ -211,7 +216,7 @@ gst_rtsp_server_get_address (GstRTSPServer *server)
* This function must be called before the server is bound. * This function must be called before the server is bound.
*/ */
void void
gst_rtsp_server_set_service (GstRTSPServer *server, const gchar *service) gst_rtsp_server_set_service (GstRTSPServer * server, const gchar * service)
{ {
g_return_if_fail (GST_IS_RTSP_SERVER (server)); g_return_if_fail (GST_IS_RTSP_SERVER (server));
g_return_if_fail (service != NULL); g_return_if_fail (service != NULL);
@ -229,7 +234,7 @@ gst_rtsp_server_set_service (GstRTSPServer *server, const gchar *service)
* Returns: the service. use g_free() after usage. * Returns: the service. use g_free() after usage.
*/ */
gchar * gchar *
gst_rtsp_server_get_service (GstRTSPServer *server) gst_rtsp_server_get_service (GstRTSPServer * server)
{ {
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL); g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL);
@ -247,7 +252,7 @@ gst_rtsp_server_get_service (GstRTSPServer *server)
* This function must be called before the server is bound. * This function must be called before the server is bound.
*/ */
void void
gst_rtsp_server_set_backlog (GstRTSPServer *server, gint backlog) gst_rtsp_server_set_backlog (GstRTSPServer * server, gint backlog)
{ {
g_return_if_fail (GST_IS_RTSP_SERVER (server)); g_return_if_fail (GST_IS_RTSP_SERVER (server));
@ -263,7 +268,7 @@ gst_rtsp_server_set_backlog (GstRTSPServer *server, gint backlog)
* Returns: the server backlog. * Returns: the server backlog.
*/ */
gint gint
gst_rtsp_server_get_backlog (GstRTSPServer *server) gst_rtsp_server_get_backlog (GstRTSPServer * server)
{ {
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), -1); g_return_val_if_fail (GST_IS_RTSP_SERVER (server), -1);
@ -278,7 +283,8 @@ gst_rtsp_server_get_backlog (GstRTSPServer *server)
* configure @pool to be used as the session pool of @server. * configure @pool to be used as the session pool of @server.
*/ */
void void
gst_rtsp_server_set_session_pool (GstRTSPServer *server, GstRTSPSessionPool *pool) gst_rtsp_server_set_session_pool (GstRTSPServer * server,
GstRTSPSessionPool * pool)
{ {
GstRTSPSessionPool *old; GstRTSPSessionPool *old;
@ -305,7 +311,7 @@ gst_rtsp_server_set_session_pool (GstRTSPServer *server, GstRTSPSessionPool *poo
* usage. * usage.
*/ */
GstRTSPSessionPool * GstRTSPSessionPool *
gst_rtsp_server_get_session_pool (GstRTSPServer *server) gst_rtsp_server_get_session_pool (GstRTSPServer * server)
{ {
GstRTSPSessionPool *result; GstRTSPSessionPool *result;
@ -325,7 +331,8 @@ gst_rtsp_server_get_session_pool (GstRTSPServer *server)
* configure @mapping to be used as the media mapping of @server. * configure @mapping to be used as the media mapping of @server.
*/ */
void void
gst_rtsp_server_set_media_mapping (GstRTSPServer *server, GstRTSPMediaMapping *mapping) gst_rtsp_server_set_media_mapping (GstRTSPServer * server,
GstRTSPMediaMapping * mapping)
{ {
GstRTSPMediaMapping *old; GstRTSPMediaMapping *old;
@ -353,7 +360,7 @@ gst_rtsp_server_set_media_mapping (GstRTSPServer *server, GstRTSPMediaMapping *m
* usage. * usage.
*/ */
GstRTSPMediaMapping * GstRTSPMediaMapping *
gst_rtsp_server_get_media_mapping (GstRTSPServer *server) gst_rtsp_server_get_media_mapping (GstRTSPServer * server)
{ {
GstRTSPMediaMapping *result; GstRTSPMediaMapping *result;
@ -366,8 +373,8 @@ gst_rtsp_server_get_media_mapping (GstRTSPServer *server)
} }
static void static void
gst_rtsp_server_get_property (GObject *object, guint propid, gst_rtsp_server_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec) GValue * value, GParamSpec * pspec)
{ {
GstRTSPServer *server = GST_RTSP_SERVER (object); GstRTSPServer *server = GST_RTSP_SERVER (object);
@ -393,8 +400,8 @@ gst_rtsp_server_get_property (GObject *object, guint propid,
} }
static void static void
gst_rtsp_server_set_property (GObject *object, guint propid, gst_rtsp_server_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec) const GValue * value, GParamSpec * pspec)
{ {
GstRTSPServer *server = GST_RTSP_SERVER (object); GstRTSPServer *server = GST_RTSP_SERVER (object);
@ -430,19 +437,21 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
struct linger linger; struct linger linger;
#endif #endif
memset(&hints, 0, sizeof(struct addrinfo)); memset (&hints, 0, sizeof (struct addrinfo));
hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */
hints.ai_socktype = SOCK_STREAM; /* stream socket */ hints.ai_socktype = SOCK_STREAM; /* stream socket */
hints.ai_flags = AI_PASSIVE | AI_CANONNAME; /* For wildcard IP address */ hints.ai_flags = AI_PASSIVE | AI_CANONNAME; /* For wildcard IP address */
hints.ai_protocol = 0; /* Any protocol */ hints.ai_protocol = 0; /* Any protocol */
hints.ai_canonname = NULL; hints.ai_canonname = NULL;
hints.ai_addr = NULL; hints.ai_addr = NULL;
hints.ai_next = NULL; hints.ai_next = NULL;
GST_DEBUG_OBJECT (server, "getting address info of %s/%s", server->address, server->service); GST_DEBUG_OBJECT (server, "getting address info of %s/%s", server->address,
server->service);
/* resolve the server IP address */ /* resolve the server IP address */
if ((ret = getaddrinfo (server->address, server->service, &hints, &result)) != 0) if ((ret =
getaddrinfo (server->address, server->service, &hints, &result)) != 0)
goto no_address; goto no_address;
/* create server socket, we loop through all the addresses until we manage to /* create server socket, we loop through all the addresses until we manage to
@ -450,7 +459,8 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
for (rp = result; rp; rp = rp->ai_next) { for (rp = result; rp; rp = rp->ai_next) {
sockfd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol); sockfd = socket (rp->ai_family, rp->ai_socktype, rp->ai_protocol);
if (sockfd == -1) { if (sockfd == -1) {
GST_DEBUG_OBJECT (server, "failed to make socket (%s), try next", g_strerror (errno)); GST_DEBUG_OBJECT (server, "failed to make socket (%s), try next",
g_strerror (errno));
continue; continue;
} }
@ -459,7 +469,8 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
break; break;
} }
GST_DEBUG_OBJECT (server, "failed to bind socket (%s), try next", g_strerror (errno)); GST_DEBUG_OBJECT (server, "failed to bind socket (%s), try next",
g_strerror (errno));
close (sockfd); close (sockfd);
} }
freeaddrinfo (result); freeaddrinfo (result);
@ -514,12 +525,14 @@ gst_rtsp_server_sink_init_send (GstRTSPServer * server)
/* ERRORS */ /* ERRORS */
no_address: no_address:
{ {
GST_ERROR_OBJECT (server, "failed to resolve address: %s", gai_strerror(ret)); GST_ERROR_OBJECT (server, "failed to resolve address: %s",
gai_strerror (ret));
return FALSE; return FALSE;
} }
no_socket: no_socket:
{ {
GST_ERROR_OBJECT (server, "failed to create socket: %s", g_strerror (errno)); GST_ERROR_OBJECT (server, "failed to create socket: %s",
g_strerror (errno));
return FALSE; return FALSE;
} }
reuse_failed: reuse_failed:
@ -529,19 +542,22 @@ reuse_failed:
} }
keepalive_failed: keepalive_failed:
{ {
GST_ERROR_OBJECT (server, "failed to configure keepalive socket: %s", g_strerror (errno)); GST_ERROR_OBJECT (server, "failed to configure keepalive socket: %s",
g_strerror (errno));
goto close_error; goto close_error;
} }
#ifdef USE_SOLINGER #ifdef USE_SOLINGER
linger_failed: linger_failed:
{ {
GST_ERROR_OBJECT (server, "failed to no linger socket: %s", g_strerror (errno)); GST_ERROR_OBJECT (server, "failed to no linger socket: %s",
g_strerror (errno));
goto close_error; goto close_error;
} }
#endif #endif
listen_failed: listen_failed:
{ {
GST_ERROR_OBJECT (server, "failed to listen on socket: %s", g_strerror (errno)); GST_ERROR_OBJECT (server, "failed to listen on socket: %s",
g_strerror (errno));
goto close_error; goto close_error;
} }
close_error: close_error:
@ -557,7 +573,7 @@ close_error:
/* default method for creating a new client object in the server to accept and /* default method for creating a new client object in the server to accept and
* handle a client connection on this server */ * handle a client connection on this server */
static GstRTSPClient * static GstRTSPClient *
default_accept_client (GstRTSPServer *server, GIOChannel *channel) default_accept_client (GstRTSPServer * server, GIOChannel * channel)
{ {
GstRTSPClient *client; GstRTSPClient *client;
@ -580,8 +596,9 @@ default_accept_client (GstRTSPServer *server, GIOChannel *channel)
/* ERRORS */ /* ERRORS */
accept_failed: accept_failed:
{ {
GST_ERROR_OBJECT (server, "Could not accept client on server socket %d: %s (%d)", GST_ERROR_OBJECT (server,
server->server_sock.fd, g_strerror (errno), errno); "Could not accept client on server socket %d: %s (%d)",
server->server_sock.fd, g_strerror (errno), errno);
gst_object_unref (client); gst_object_unref (client);
return NULL; return NULL;
} }
@ -598,7 +615,8 @@ accept_failed:
* Returns: TRUE if the source could be connected, FALSE if an error occured. * Returns: TRUE if the source could be connected, FALSE if an error occured.
*/ */
gboolean gboolean
gst_rtsp_server_io_func (GIOChannel *channel, GIOCondition condition, GstRTSPServer *server) gst_rtsp_server_io_func (GIOChannel * channel, GIOCondition condition,
GstRTSPServer * server)
{ {
GstRTSPClient *client = NULL; GstRTSPClient *client = NULL;
GstRTSPServerClass *klass; GstRTSPServerClass *klass;
@ -615,8 +633,7 @@ gst_rtsp_server_io_func (GIOChannel *channel, GIOCondition condition, GstRTSPSer
/* can unref the client now, when the request is finished, it will be /* can unref the client now, when the request is finished, it will be
* unreffed async. */ * unreffed async. */
gst_object_unref (client); gst_object_unref (client);
} } else {
else {
GST_WARNING_OBJECT (server, "received unknown event %08x", condition); GST_WARNING_OBJECT (server, "received unknown event %08x", condition);
} }
return TRUE; return TRUE;
@ -638,7 +655,7 @@ client_failed:
* Returns: the GIOChannel for @server or NULL when an error occured. * Returns: the GIOChannel for @server or NULL when an error occured.
*/ */
GIOChannel * GIOChannel *
gst_rtsp_server_get_io_channel (GstRTSPServer *server) gst_rtsp_server_get_io_channel (GstRTSPServer * server)
{ {
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL); g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL);
@ -668,7 +685,7 @@ init_failed:
* Returns: the #GSource for @server or NULL when an error occured. * Returns: the #GSource for @server or NULL when an error occured.
*/ */
GSource * GSource *
gst_rtsp_server_create_watch (GstRTSPServer *server) gst_rtsp_server_create_watch (GstRTSPServer * server)
{ {
g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL); g_return_val_if_fail (GST_IS_RTSP_SERVER (server), NULL);
@ -681,10 +698,11 @@ gst_rtsp_server_create_watch (GstRTSPServer *server)
/* create a watch for reads (new connections) and possible errors */ /* create a watch for reads (new connections) and possible errors */
server->io_watch = g_io_create_watch (channel, G_IO_IN | server->io_watch = g_io_create_watch (channel, G_IO_IN |
G_IO_ERR | G_IO_HUP | G_IO_NVAL); G_IO_ERR | G_IO_HUP | G_IO_NVAL);
/* configure the callback */ /* configure the callback */
g_source_set_callback (server->io_watch, (GSourceFunc) gst_rtsp_server_io_func, server, NULL); g_source_set_callback (server->io_watch,
(GSourceFunc) gst_rtsp_server_io_func, server, NULL);
} }
return server->io_watch; return server->io_watch;
@ -709,7 +727,7 @@ no_channel:
* Returns: the ID (greater than 0) for the source within the GMainContext. * Returns: the ID (greater than 0) for the source within the GMainContext.
*/ */
guint guint
gst_rtsp_server_attach (GstRTSPServer *server, GMainContext *context) gst_rtsp_server_attach (GstRTSPServer * server, GMainContext * context)
{ {
guint res; guint res;
GSource *source; GSource *source;

View file

@ -35,6 +35,7 @@
#include "rtsp-session-pool.h" #include "rtsp-session-pool.h"
#include "rtsp-media-mapping.h" #include "rtsp-media-mapping.h"
#include "rtsp-media-factory-uri.h"
#include "rtsp-client.h" #include "rtsp-client.h"
#ifndef __GST_RTSP_SERVER_H__ #ifndef __GST_RTSP_SERVER_H__

View file

@ -33,13 +33,13 @@ enum
GST_DEBUG_CATEGORY (rtsp_session_debug); GST_DEBUG_CATEGORY (rtsp_session_debug);
#define GST_CAT_DEFAULT rtsp_session_debug #define GST_CAT_DEFAULT rtsp_session_debug
static void gst_rtsp_session_pool_get_property (GObject *object, guint propid, static void gst_rtsp_session_pool_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec); GValue * value, GParamSpec * pspec);
static void gst_rtsp_session_pool_set_property (GObject *object, guint propid, static void gst_rtsp_session_pool_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec); const GValue * value, GParamSpec * pspec);
static void gst_rtsp_session_pool_finalize (GObject * object); static void gst_rtsp_session_pool_finalize (GObject * object);
static gchar * create_session_id (GstRTSPSessionPool *pool); static gchar *create_session_id (GstRTSPSessionPool * pool);
G_DEFINE_TYPE (GstRTSPSessionPool, gst_rtsp_session_pool, G_TYPE_OBJECT); G_DEFINE_TYPE (GstRTSPSessionPool, gst_rtsp_session_pool, G_TYPE_OBJECT);
@ -62,7 +62,8 @@ gst_rtsp_session_pool_class_init (GstRTSPSessionPoolClass * klass)
klass->create_session_id = create_session_id; klass->create_session_id = create_session_id;
GST_DEBUG_CATEGORY_INIT (rtsp_session_debug, "rtspsession", 0, "GstRTSPSession"); GST_DEBUG_CATEGORY_INIT (rtsp_session_debug, "rtspsession", 0,
"GstRTSPSession");
} }
static void static void
@ -70,14 +71,14 @@ gst_rtsp_session_pool_init (GstRTSPSessionPool * pool)
{ {
pool->lock = g_mutex_new (); pool->lock = g_mutex_new ();
pool->sessions = g_hash_table_new_full (g_str_hash, g_str_equal, pool->sessions = g_hash_table_new_full (g_str_hash, g_str_equal,
NULL, g_object_unref); NULL, g_object_unref);
pool->max_sessions = DEFAULT_MAX_SESSIONS; pool->max_sessions = DEFAULT_MAX_SESSIONS;
} }
static void static void
gst_rtsp_session_pool_finalize (GObject * object) gst_rtsp_session_pool_finalize (GObject * object)
{ {
GstRTSPSessionPool * pool = GST_RTSP_SESSION_POOL (object); GstRTSPSessionPool *pool = GST_RTSP_SESSION_POOL (object);
g_mutex_free (pool->lock); g_mutex_free (pool->lock);
g_hash_table_unref (pool->sessions); g_hash_table_unref (pool->sessions);
@ -86,8 +87,8 @@ gst_rtsp_session_pool_finalize (GObject * object)
} }
static void static void
gst_rtsp_session_pool_get_property (GObject *object, guint propid, gst_rtsp_session_pool_get_property (GObject * object, guint propid,
GValue *value, GParamSpec *pspec) GValue * value, GParamSpec * pspec)
{ {
GstRTSPSessionPool *pool = GST_RTSP_SESSION_POOL (object); GstRTSPSessionPool *pool = GST_RTSP_SESSION_POOL (object);
@ -102,8 +103,8 @@ gst_rtsp_session_pool_get_property (GObject *object, guint propid,
} }
static void static void
gst_rtsp_session_pool_set_property (GObject *object, guint propid, gst_rtsp_session_pool_set_property (GObject * object, guint propid,
const GValue *value, GParamSpec *pspec) const GValue * value, GParamSpec * pspec)
{ {
GstRTSPSessionPool *pool = GST_RTSP_SESSION_POOL (object); GstRTSPSessionPool *pool = GST_RTSP_SESSION_POOL (object);
@ -143,7 +144,7 @@ gst_rtsp_session_pool_new (void)
* A value of 0 means an unlimited amount of sessions. * A value of 0 means an unlimited amount of sessions.
*/ */
void void
gst_rtsp_session_pool_set_max_sessions (GstRTSPSessionPool *pool, guint max) gst_rtsp_session_pool_set_max_sessions (GstRTSPSessionPool * pool, guint max)
{ {
g_return_if_fail (GST_IS_RTSP_SESSION_POOL (pool)); g_return_if_fail (GST_IS_RTSP_SESSION_POOL (pool));
@ -162,7 +163,7 @@ gst_rtsp_session_pool_set_max_sessions (GstRTSPSessionPool *pool, guint max)
* Returns: the maximum allowed number of sessions. * Returns: the maximum allowed number of sessions.
*/ */
guint guint
gst_rtsp_session_pool_get_max_sessions (GstRTSPSessionPool *pool) gst_rtsp_session_pool_get_max_sessions (GstRTSPSessionPool * pool)
{ {
guint result; guint result;
@ -184,7 +185,7 @@ gst_rtsp_session_pool_get_max_sessions (GstRTSPSessionPool *pool)
* Returns: the amount of active sessions in @pool. * Returns: the amount of active sessions in @pool.
*/ */
guint guint
gst_rtsp_session_pool_get_n_sessions (GstRTSPSessionPool *pool) gst_rtsp_session_pool_get_n_sessions (GstRTSPSessionPool * pool)
{ {
guint result; guint result;
@ -209,7 +210,7 @@ gst_rtsp_session_pool_get_n_sessions (GstRTSPSessionPool *pool)
* not exist. g_object_unref() after usage. * not exist. g_object_unref() after usage.
*/ */
GstRTSPSession * GstRTSPSession *
gst_rtsp_session_pool_find (GstRTSPSessionPool *pool, const gchar *sessionid) gst_rtsp_session_pool_find (GstRTSPSessionPool * pool, const gchar * sessionid)
{ {
GstRTSPSession *result; GstRTSPSession *result;
@ -228,7 +229,7 @@ gst_rtsp_session_pool_find (GstRTSPSessionPool *pool, const gchar *sessionid)
} }
static gchar * static gchar *
create_session_id (GstRTSPSessionPool *pool) create_session_id (GstRTSPSessionPool * pool)
{ {
gchar id[16]; gchar id[16];
gint i; gint i;
@ -249,7 +250,7 @@ create_session_id (GstRTSPSessionPool *pool)
* Returns: a new #GstRTSPSession. * Returns: a new #GstRTSPSession.
*/ */
GstRTSPSession * GstRTSPSession *
gst_rtsp_session_pool_create (GstRTSPSessionPool *pool) gst_rtsp_session_pool_create (GstRTSPSessionPool * pool)
{ {
GstRTSPSession *result = NULL; GstRTSPSession *result = NULL;
GstRTSPSessionPoolClass *klass; GstRTSPSessionPoolClass *klass;
@ -276,7 +277,7 @@ gst_rtsp_session_pool_create (GstRTSPSessionPool *pool)
/* check session limit */ /* check session limit */
if (pool->max_sessions > 0) { if (pool->max_sessions > 0) {
if (g_hash_table_size (pool->sessions) >= pool->max_sessions) if (g_hash_table_size (pool->sessions) >= pool->max_sessions)
goto too_many_sessions; goto too_many_sessions;
} }
/* check if the sessionid existed */ /* check if the sessionid existed */
result = g_hash_table_lookup (pool->sessions, id); result = g_hash_table_lookup (pool->sessions, id);
@ -285,9 +286,8 @@ gst_rtsp_session_pool_create (GstRTSPSessionPool *pool)
result = NULL; result = NULL;
retry++; retry++;
if (retry > 100) if (retry > 100)
goto collision; goto collision;
} } else {
else {
/* not found, create session and insert it in the pool */ /* not found, create session and insert it in the pool */
result = gst_rtsp_session_new (id); result = gst_rtsp_session_new (id);
/* take additional ref for the pool */ /* take additional ref for the pool */
@ -338,7 +338,7 @@ too_many_sessions:
* Returns: %TRUE if the session was found and removed. * Returns: %TRUE if the session was found and removed.
*/ */
gboolean gboolean
gst_rtsp_session_pool_remove (GstRTSPSessionPool *pool, GstRTSPSession *sess) gst_rtsp_session_pool_remove (GstRTSPSessionPool * pool, GstRTSPSession * sess)
{ {
gboolean found; gboolean found;
@ -353,7 +353,7 @@ gst_rtsp_session_pool_remove (GstRTSPSessionPool *pool, GstRTSPSession *sess)
} }
static gboolean static gboolean
cleanup_func (gchar *sessionid, GstRTSPSession *sess, GTimeVal *now) cleanup_func (gchar * sessionid, GstRTSPSession * sess, GTimeVal * now)
{ {
return gst_rtsp_session_is_expired (sess, now); return gst_rtsp_session_is_expired (sess, now);
} }
@ -368,7 +368,7 @@ cleanup_func (gchar *sessionid, GstRTSPSession *sess, GTimeVal *now)
* Returns: the amount of sessions that got removed. * Returns: the amount of sessions that got removed.
*/ */
guint guint
gst_rtsp_session_pool_cleanup (GstRTSPSessionPool *pool) gst_rtsp_session_pool_cleanup (GstRTSPSessionPool * pool)
{ {
guint result; guint result;
GTimeVal now; GTimeVal now;
@ -378,7 +378,9 @@ gst_rtsp_session_pool_cleanup (GstRTSPSessionPool *pool)
g_get_current_time (&now); g_get_current_time (&now);
g_mutex_lock (pool->lock); g_mutex_lock (pool->lock);
result = g_hash_table_foreach_remove (pool->sessions, (GHRFunc) cleanup_func, &now); result =
g_hash_table_foreach_remove (pool->sessions, (GHRFunc) cleanup_func,
&now);
g_mutex_unlock (pool->lock); g_mutex_unlock (pool->lock);
return result; return result;
@ -393,7 +395,7 @@ typedef struct
} FilterData; } FilterData;
static gboolean static gboolean
filter_func (gchar *sessionid, GstRTSPSession *sess, FilterData *data) filter_func (gchar * sessionid, GstRTSPSession * sess, FilterData * data)
{ {
switch (data->func (data->pool, sess, data->user_data)) { switch (data->func (data->pool, sess, data->user_data)) {
case GST_RTSP_FILTER_REMOVE: case GST_RTSP_FILTER_REMOVE:
@ -432,7 +434,7 @@ filter_func (gchar *sessionid, GstRTSPSession *sess, FilterData *data)
* before the list is freed. * before the list is freed.
*/ */
GList * GList *
gst_rtsp_session_pool_filter (GstRTSPSessionPool *pool, gst_rtsp_session_pool_filter (GstRTSPSessionPool * pool,
GstRTSPSessionFilterFunc func, gpointer user_data) GstRTSPSessionFilterFunc func, gpointer user_data)
{ {
FilterData data; FilterData data;
@ -460,12 +462,12 @@ typedef struct
} GstPoolSource; } GstPoolSource;
static void static void
collect_timeout (gchar *sessionid, GstRTSPSession *sess, GstPoolSource *psrc) collect_timeout (gchar * sessionid, GstRTSPSession * sess, GstPoolSource * psrc)
{ {
gint timeout; gint timeout;
GTimeVal now; GTimeVal now;
g_source_get_current_time ((GSource*)psrc, &now); g_source_get_current_time ((GSource *) psrc, &now);
timeout = gst_rtsp_session_next_timeout (sess, &now); timeout = gst_rtsp_session_next_timeout (sess, &now);
GST_INFO ("%p: next timeout: %d", sess, timeout); GST_INFO ("%p: next timeout: %d", sess, timeout);
@ -547,7 +549,7 @@ static GSourceFuncs gst_pool_source_funcs = {
* A GSource that will be dispatched when the session should be cleaned up. * A GSource that will be dispatched when the session should be cleaned up.
*/ */
GSource * GSource *
gst_rtsp_session_pool_create_watch (GstRTSPSessionPool *pool) gst_rtsp_session_pool_create_watch (GstRTSPSessionPool * pool)
{ {
GstPoolSource *source; GstPoolSource *source;
@ -559,4 +561,3 @@ gst_rtsp_session_pool_create_watch (GstRTSPSessionPool *pool)
return (GSource *) source; return (GSource *) source;
} }

View file

@ -77,7 +77,7 @@ struct _GstRTSPSessionPoolClass {
* The function will be called when the pool must be cleaned up because one or * The function will be called when the pool must be cleaned up because one or
* more sessions timed out. * more sessions timed out.
* *
* Returns: %FALSe if the source should be removed. * Returns: %FALSE if the source should be removed.
*/ */
typedef gboolean (*GstRTSPSessionPoolFunc) (GstRTSPSessionPool *pool, gpointer user_data); typedef gboolean (*GstRTSPSessionPoolFunc) (GstRTSPSessionPool *pool, gpointer user_data);

View file

@ -178,10 +178,10 @@ gst_rtsp_session_set_property (GObject * object, guint propid,
/** /**
* gst_rtsp_session_manage_media: * gst_rtsp_session_manage_media:
* @sess: a #GstRTSPSession * @sess: a #GstRTSPSession
* @url: the url for the media * @uri: the uri for the media
* @media: a #GstRTSPMediaObject * @media: a #GstRTSPMedia
* *
* Manage the media object @obj in @sess. @url will be used to retrieve this * Manage the media object @obj in @sess. @uri will be used to retrieve this
* media from the session with gst_rtsp_session_get_media(). * media from the session with gst_rtsp_session_get_media().
* *
* Ownership is taken from @media. * Ownership is taken from @media.
@ -222,7 +222,7 @@ gst_rtsp_session_manage_media (GstRTSPSession * sess, const GstRTSPUrl * uri,
/** /**
* gst_rtsp_session_release_media: * gst_rtsp_session_release_media:
* @sess: a #GstRTSPSession * @sess: a #GstRTSPSession
* @media: a #GstRTSPMediaObject * @media: a #GstRTSPMedia
* *
* Release the managed @media in @sess, freeing the memory allocated by it. * Release the managed @media in @sess, freeing the memory allocated by it.
* *
@ -421,7 +421,7 @@ gst_rtsp_session_touch (GstRTSPSession * session)
} }
void void
gst_rtsp_session_prevent_expire (GstRTSPSession *session) gst_rtsp_session_prevent_expire (GstRTSPSession * session)
{ {
g_return_if_fail (GST_IS_RTSP_SESSION (session)); g_return_if_fail (GST_IS_RTSP_SESSION (session));
@ -429,7 +429,7 @@ gst_rtsp_session_prevent_expire (GstRTSPSession *session)
} }
void void
gst_rtsp_session_allow_expire (GstRTSPSession *session) gst_rtsp_session_allow_expire (GstRTSPSession * session)
{ {
g_atomic_int_add (&session->expire_count, -1); g_atomic_int_add (&session->expire_count, -1);
} }

View file

@ -137,7 +137,7 @@ gboolean gst_rtsp_session_release_media (GstRTSPSession *se
GstRTSPSessionMedia *media); GstRTSPSessionMedia *media);
/* get media in a session */ /* get media in a session */
GstRTSPSessionMedia * gst_rtsp_session_get_media (GstRTSPSession *sess, GstRTSPSessionMedia * gst_rtsp_session_get_media (GstRTSPSession *sess,
const GstRTSPUrl *uri); const GstRTSPUrl *url);
/* control media */ /* control media */
gboolean gst_rtsp_session_media_set_state (GstRTSPSessionMedia *media, GstState state); gboolean gst_rtsp_session_media_set_state (GstRTSPSessionMedia *media, GstState state);