delete junk

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@342 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Michael Jerris 2006-01-13 13:05:18 +00:00
parent 95fbd20408
commit bdbfb9875e
127 changed files with 0 additions and 70133 deletions

View File

@ -1,229 +0,0 @@
October 2, 2005
JRTPLIB ChangeLog
-----------
3.3.0 (October 2005)
* Now it is possible to use a user-defined transmission component.
* Added GStreamer transmission component written by Philippe Khalaf
(burger@speedy.org).
3.2.1 (September 2005)
* The library wouldn't compile when probation support was disabled.
Thanks to Herman Bastiaens (herman.bastiaens@student.luc.ac.be) for
bringing this to my attention.
* When parsed from an RTPRawPacket, the receive time is also stored
in the RTPPacket instance.
3.2.0 (September 2005)
* Modified the routine in the RTPSession class which creates the
CNAME. Aparently on some systems, the 'getlogin' call returns
null. As an alternative, the library uses getenv("LOGNAME").
Thanks to Mark Schiffmann (schima@neumann-elektronik.com) for
mentioning this to me.
* Added a OnBYEPacket method to the RTPSession class. Thanks to
Sigrid Thijs (sthijs@androme.be) for suggesting this.
* When probation support is enabled, a probation type can be selected
when the session is created. Supported types are "No probation",
"Use probation, but store packets" and "Use probation and discard
packets received in probation mode". Thanks to Chris Flerackers
(cflerackers@androme.be) for suggesting this feature.
* Added a parameter to WaitForIncomingData which indicates if
data is available when the function returns. Based on a suggestion
by Uwe Andersen (uandersen@mayah.com).
* Now using getifaddrs (if possible) to obtain our own IP addresses
(both in IPv4 version and IPv6 version).
* IPv6 code in Win32 version now works, but Visual Studio 2005 beta
has to be used. Thanks to Yi-Huan Chan (yhchan@csie.nctu.edu.tw)
for contributing some code.
* Added Win32 code for GetLocalIPList_Interfaces (both IPv4 and IPv6).
Thanks to Ivan Makushkin (camry@pisem.net) for pointing out how
this could be done.
* Added an option to use a SR packet when sending a BYE message.
Previously, a RR packet was always used, even if a session is
actually an active sender of data. Thanks to Uwe Andersen
(uandersen@mayah.com) for bringing this to my attention.
* Fixed bug in CNAME creation.
* Added WinCE support. Thanks to Maarten Daniels
(maarten.daniels@uhasselt.be) for supplying patches.
* Changed the CurrentTime implementation for the MS-Windows version.
Thanks to Maarten Daniels (maarten.daniels@uhasselt.be) and Chris
Flerackers (cflerackers@androme.be).
3.1.0 (October 2004)
* Added a callback OnPollThreadStep which is called at the end of
each loop of the poll thread
* Added the examples subdirectory to the package
* Fixed bug in rtpudpv4transmitter.cpp and rtpudpv6transmitter.cpp
which caused an infinite loop in LeaveAllMulticastGroups. Thanks
to Stijn Agten (stijn.agten@luc.ac.be) for pointing this out.
* Added a function GetTransmissionInfo to the RTPTransmitter class
(and subclasses). The function will return some additional
information about the transmitter, like local IP addresses and
socket descriptors.
3.0.2 (September 2004)
* Bugfix in rtpinternalsourcedata.cpp. The bug caused a crash when
duplicate packets were received. Thanks to Dominique Prunier
(dominique.prunier@micromedia-int.com) for informing me about
this.
3.0.1 (September 2004)
* Bugfix in rtpudpv4transmitter.cpp and rtpudpv6transmitter.cpp in
method SetReceiveMode
* Removed unused 'acceptownpackets' variable from
rtpudpv4transmitter.cpp and rtpudpv6transmitter.cpp
* Added a 'Dump' function (for debugging) in RTPUDPv4Transmitter
and RTPUDPv6Transmitter
* Now using JThread 1.1.0
3.0.0 (August 2004)
* Complete rewrite of the library to provide better extensibility
and compliance with RFC 3550
* Changes from the 2.x series:
- The 2.x series was created with the idea that the user
would only need to use the RTPSession class which meant
that the other classes were not very useful by themselves.
This version on the other hand, aims to provide many
useful components to aid the user in building RTP capable
applications.
- In this version, the code which is specific for the
underlying protocol by which RTP packets are transported,
is bundled in a class which inherits its interface from a
class called RTPTransmitter. This makes it easy for
different underlying protocols to be supported. Currently
there is support for UDP over IPv4 and UDP over IPv6.
2.9 (July 2004)
* Fixed bug in rtpsrclist.cpp. Thanks to Lukasz Bobowiec
(bobowiec@icslab.agh.edu.pl)
* Added function in RTPSourceData which returns the IP address
* Changed the random routines. Thanks to Jaap Keuter
(jaap.keuter@xs4all.nl)
* Made the shared library link against libstdc++ if possible.
Thanks to Anatoly Yakovenko (aeyakovenko@yahoo.com) for the
suggestion.
2.8 (January 2004)
* Added code to avoid a crash when receiving a malformed packet
* Fixed a memory leak (forgot to free memory when a malformed
packet was discarded)
* Changed debug routines for memory tracking
2.7b (November 2003)
* Only added --enable-fpic and --enable-fPIC to the configure script
2.7 (December 2002)
* Fixed important bug in rtpsources.cpp. This bug could cause
source information to get lost and could create a memory leak.
* Improved support for AIX in multicasting code (uses _AIX define).
Thanks to Klaus Matuschek (klaus.matuschek@infonova.com)
* Fixed possible buffer overrun in rtpcontributingsources.cpp
2.6 (January 2002)
* This release only contains some minor changes
* An 'install' target was added to the Makefile
* Some newlines were added add the end of certain files to avoid
compiler warnings
* Improved the jitter calculations somewhat
2.5 (December 2000)
* Added the possibility for the user to receive the raw RTCP packets.
* Fixed a bug in RTPContributingSources::CreateLocalCNAME(). In this
routine, the wrong length was passed to 'gethostname'. Thanks to
Sergey V.Shpital (sergey@page.net.ru) for bringing this to my
attention.
* Added a routine to set the Type of Service (ToS) field of the
outgoing packets (both RTP and RTCP). Thank to Philippe Cardon
(philippe.cardon@bt.com) for writing this code.
* Fixed a bug in the 'packets lost' calculation. Thank to Domingo
Cuevas Jr. (dcj@onebox.com) for helping me find this bug.
* Fixed a bug in the sequence number and jitter calculation: when
packets were received out of order, the sequence numbers and
jitter got messed up. Many thanks to Mohammad Tawsheeq Russool
(m.russool@eim.surrey.ac.uk) for helping me track down these
bugs.
* Added the possibility to set the timestamp unit for a particular
source. Previously, it was assumed that their timestamp unit
was the same as that of the local session.
2.4 (July 2000)
* Fixed a bug which caused all CSRS's except one to be incorrect.
* Added RTP header extension support (for both sending and receiving).
* Added some things (which should have been there already) to
RTPPacket.
* Adjusted the way in which the login name is retrieved on unix-like
systems. First I used a call to 'getlogin', but apparently this
function messes with timers through the use of 'alarm' calls (at
least on Linux). Now, I use a combination of 'geteuid' and
'getpwuid' to obtain the necessary information. This does not
have that problem and is a lot cleaner since it doesn't depend
on login info (utmp) like 'getlogin'. Thanks to Roberto Jung Drebes
(drebes@inf.ufrgs.br) for pointing out the timer-problem.
* Made a LaTeX version of the manual and tutorial. Looks a lot nicer.
* Made it possible for the user to specify the local IP address
instead of letting the library figure it out itself.
* Fixed a bug which caused the 'fraction lost' in a RR packet to be
zero all the time. Thanks to Domingo Cuevas Jr. (dcj@onebox.com) for
pointing this out.
* Rewrote the RTCP packet sending routines. Now, they are much cleaner
and much more understandable :)
* Added better support for RTCP 'APP' packets. You can now both send
and receive APP packets.
2.3 (April 2000)
* The routine which creates and sends RTCP packets is now a bit faster.
* Added a sample that demonstrates the round-trip time function.
* Added functions to RTPSourceData: now the time when the last RR or
SR report was received can be retrieved. Also, the round trip time
can be retrieved: this is calculated as suggested in RFC 1889.
* Fixed a bug: the LSR value was not calculated correctly, now it is
(or should be ;-) )
* Instead of specifying defines on the command line, they are now
defined in a config file. The unix version of this file is created
by the configure script.
* Added a member to RTPPacket which I had forgotten (the payload type,
which is obviously important :-) ).
* The library should now be able to work on a VxWorks platform. Thanks
to Dave Osborne (dosborne@argoneng.com) for his help.
* Added a tutorial and a small example application.
* Added some debugging routines (RTPDebug class) to check for memory
leaks. It turned out that there weren't any, so I'm pretty pleased ;)
* I've added a 'configure' script to make compilation a bit easier
across different platforms. Thanks to Qi Han (qh1c4@mizzou.edu) for
helping me to improve the support for the Solaris platform. Also
many thanks to Dario Maggiorini (dario@netdev.usr.dsi.unimi.it) for
helping me test the script on several platforms.
* Added multicasting support.
* A bug in rtpsourcedata.cpp was pointed out and fixed by Ramon Clout
(ramonc@win.tue.nl). Many thanks for this, Ramon.
2.2 (February 2000)
* Extra support for Sun and HP. Thanks to Henry Lau (hlau@nuera.com)
and Justin Matthews (jmatthews@nuera.com) for this information.
* The 'Poll' routine in rtpconnection.cpp has been altered. Now, the
routine should work even if there's that ioctl bug (previously, this
bug was only taken into consideration on a Windows platform).
Thanks to Justin Matthews (jmatthews@nuera.com) for his bugreport.
* Added some routines to RTPSession to get the local IP address and the
port number of the sending socket.
* 'install' rule added to the makefile.
* Added the define 'RTP_SOCKLENTYPE_UINT'. See README.TXT for more
information about this.
2.1 (December 1999)
* First release of jrtplib.
* Added member functions of RTPSession to retrieve the used sockets.
* Made the destination list faster by using a hash table.
2.0 (August 1999)
* First decent implementation of RTP. Entirely rewritten since 1.0.
1.0 (August 1999)
* First implementation of RTP. There were a lot of things that weren't
quite right and the organisation of the classes was quite nasty.
However, I learned a lot about RTP making this version, and so it
allowed me to make a good start on version 2.0.

View File

@ -1,236 +0,0 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005 Free
Software Foundation, Inc.
This file is free documentation; the Free Software Foundation gives
unlimited permission to copy, distribute and modify it.
Basic Installation
==================
These are generic installation instructions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. (Caching is
disabled by default to prevent problems with accidental use of stale
cache files.)
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You only need
`configure.ac' if you want to change it or regenerate `configure' using
a newer version of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system. If you're
using `csh' on an old version of System V, you might need to type
`sh ./configure' instead to prevent `csh' from trying to execute
`configure' itself.
Running `configure' takes awhile. While running, it prints some
messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package.
4. Type `make install' to install the programs and any data files and
documentation.
5. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that the
`configure' script does not know about. Run `./configure --help' for
details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c89 CFLAGS=-O2 LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you must use a version of `make' that
supports the `VPATH' variable, such as GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'.
If you have to use a `make' that does not support the `VPATH'
variable, you have to compile the package for one architecture at a
time in the source code directory. After you have installed the
package for one architecture, use `make distclean' before reconfiguring
for another architecture.
Installation Names
==================
By default, `make install' will install the package's files in
`/usr/local/bin', `/usr/local/man', etc. You can specify an
installation prefix other than `/usr/local' by giving `configure' the
option `--prefix=PREFIX'.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
give `configure' the option `--exec-prefix=PREFIX', the package will
use PREFIX as the prefix for installing programs and libraries.
Documentation and other data files will still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them.
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Optional Features
=================
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Specifying the System Type
==========================
There may be some features `configure' cannot figure out automatically,
but needs to determine by the type of machine the package will run on.
Usually, assuming the package is built to be run on the _same_
architectures, `configure' can figure that out, but if it prints a
message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the `--target=TYPE' option to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share, you
can create a site shell script called `config.site' that gives default
values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script). Here is a another example:
/bin/bash ./configure CONFIG_SHELL=/bin/bash
Here the `CONFIG_SHELL=/bin/bash' operand causes subsequent
configuration-related scripts to be executed by `/bin/bash'.
`configure' Invocation
======================
`configure' recognizes the following options to control how it operates.
`--help'
`-h'
Print a summary of the options to `configure', and exit.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.

View File

@ -1,19 +0,0 @@
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.

View File

@ -1,17 +0,0 @@
SUBDIRS = src tools doc examples pkgconfig
EXTRA_DIST = LICENSE.MIT ChangeLog README.TXT jrtplib.dsw jrtplib.dsp jrtplib.vcproj \
jrtplib.sln jrtplib_wce.vcproj jrtplib_wce.sln
dist-hook: distclean
rm -f $(distdir)/src/rtpconfig_unix.h
rm -f $(distdir)/src/rtptypes_unix.h
mv $(distdir)/jrtplib.dsw $(distdir)/jrtplib.dsw.tmp
mv $(distdir)/jrtplib.dsp $(distdir)/jrtplib.dsp.tmp
todos < $(distdir)/jrtplib.dsw.tmp > $(distdir)/jrtplib.dsw
todos < $(distdir)/jrtplib.dsp.tmp > $(distdir)/jrtplib.dsp
rm $(distdir)/jrtplib.dsw.tmp
rm $(distdir)/jrtplib.dsp.tmp
chmod a-x $(distdir)/jrtplib.vcproj
chmod a-x $(distdir)/jrtplib.sln
chmod a-x $(distdir)/jrtplib_wce.vcproj
chmod a-x $(distdir)/jrtplib_wce.sln

View File

@ -1,628 +0,0 @@
# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = .
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(top_srcdir)/configure AUTHORS COPYING \
ChangeLog INSTALL NEWS TODO config.guess config.sub depcomp \
install-sh ltmain.sh missing mkinstalldirs
subdir = .
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \
configure.lineno configure.status.lineno
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-exec-recursive install-info-recursive \
install-recursive installcheck-recursive installdirs-recursive \
pdf-recursive ps-recursive uninstall-info-recursive \
uninstall-recursive
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
distdir = $(PACKAGE)-$(VERSION)
top_distdir = $(distdir)
am__remove_distdir = \
{ test ! -d $(distdir) \
|| { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \
&& rm -fr $(distdir); }; }
DIST_ARCHIVES = $(distdir).tar.gz
GZIP_ENV = --best
distuninstallcheck_listfiles = find . -type f -print
distcleancheck_listfiles = find . -type f -print
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
RTP_ENDIAN = @RTP_ENDIAN@
RTP_FILIO = @RTP_FILIO@
RTP_GSTINCLUDES = @RTP_GSTINCLUDES@
RTP_HAVE_SOCKADDR_LEN = @RTP_HAVE_SOCKADDR_LEN@
RTP_LINKLIBS = @RTP_LINKLIBS@
RTP_SOCKIO = @RTP_SOCKIO@
RTP_SOCKLENTYPE_UINT = @RTP_SOCKLENTYPE_UINT@
RTP_SUPPORT_GETLOGINR = @RTP_SUPPORT_GETLOGINR@
RTP_SUPPORT_GNUDRAND = @RTP_SUPPORT_GNUDRAND@
RTP_SUPPORT_GST = @RTP_SUPPORT_GST@
RTP_SUPPORT_IFADDRS = @RTP_SUPPORT_IFADDRS@
RTP_SUPPORT_INLINETEMPLATEPARAM = @RTP_SUPPORT_INLINETEMPLATEPARAM@
RTP_SUPPORT_IPV4MULTICAST = @RTP_SUPPORT_IPV4MULTICAST@
RTP_SUPPORT_IPV6 = @RTP_SUPPORT_IPV6@
RTP_SUPPORT_IPV6MULTICAST = @RTP_SUPPORT_IPV6MULTICAST@
RTP_SUPPORT_PROBATION = @RTP_SUPPORT_PROBATION@
RTP_SUPPORT_RANDR = @RTP_SUPPORT_RANDR@
RTP_SUPPORT_SDESPRIV = @RTP_SUPPORT_SDESPRIV@
RTP_SUPPORT_THREAD = @RTP_SUPPORT_THREAD@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
SUBDIRS = src tools doc examples pkgconfig
EXTRA_DIST = LICENSE.MIT ChangeLog README.TXT jrtplib.dsw jrtplib.dsp jrtplib.vcproj \
jrtplib.sln jrtplib_wce.vcproj jrtplib_wce.sln
all: all-recursive
.SUFFIXES:
am--refresh:
@:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \
cd $(srcdir) && $(AUTOMAKE) --gnu \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
echo ' $(SHELL) ./config.status'; \
$(SHELL) ./config.status;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
$(SHELL) ./config.status --recheck
$(top_srcdir)/configure: $(am__configure_deps)
cd $(srcdir) && $(AUTOCONF)
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
mostlyclean-recursive clean-recursive distclean-recursive \
maintainer-clean-recursive:
@failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
(cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
empty_fix=.; \
else \
include_option=--include; \
empty_fix=; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(am__remove_distdir)
mkdir $(distdir)
$(mkdir_p) $(distdir)/pkgconfig $(distdir)/src
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(mkdir_p) "$(distdir)/$$subdir" \
|| exit 1; \
distdir=`$(am__cd) $(distdir) && pwd`; \
top_distdir=`$(am__cd) $(top_distdir) && pwd`; \
(cd $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$$top_distdir" \
distdir="$$distdir/$$subdir" \
distdir) \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
-find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \
! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \
! -type d ! -perm -400 -exec chmod a+r {} \; -o \
! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \
|| chmod -R a+r $(distdir)
dist-gzip: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
dist-bzip2: distdir
tardir=$(distdir) && $(am__tar) | bzip2 -9 -c >$(distdir).tar.bz2
$(am__remove_distdir)
dist-tarZ: distdir
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
$(am__remove_distdir)
dist-shar: distdir
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__remove_distdir)
dist-zip: distdir
-rm -f $(distdir).zip
zip -rq $(distdir).zip $(distdir)
$(am__remove_distdir)
dist dist-all: distdir
tardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz
$(am__remove_distdir)
# This target untars the dist file and tries a VPATH configuration. Then
# it guarantees that the distribution is self-contained by making another
# tarfile.
distcheck: dist
case '$(DIST_ARCHIVES)' in \
*.tar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(am__untar) ;;\
*.tar.bz2*) \
bunzip2 -c $(distdir).tar.bz2 | $(am__untar) ;;\
*.tar.Z*) \
uncompress -c $(distdir).tar.Z | $(am__untar) ;;\
*.shar.gz*) \
GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\
*.zip*) \
unzip $(distdir).zip ;;\
esac
chmod -R a-w $(distdir); chmod a+w $(distdir)
mkdir $(distdir)/_build
mkdir $(distdir)/_inst
chmod a-w $(distdir)
dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& cd $(distdir)/_build \
&& ../configure --srcdir=.. --prefix="$$dc_install_base" \
$(DISTCHECK_CONFIGURE_FLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
&& $(MAKE) $(AM_MAKEFLAGS) install \
&& $(MAKE) $(AM_MAKEFLAGS) installcheck \
&& $(MAKE) $(AM_MAKEFLAGS) uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \
distuninstallcheck \
&& chmod -R a-w "$$dc_install_base" \
&& ({ \
(cd ../.. && umask 077 && mkdir "$$dc_destdir") \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \
&& $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \
distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \
} || { rm -rf "$$dc_destdir"; exit 1; }) \
&& rm -rf "$$dc_destdir" \
&& $(MAKE) $(AM_MAKEFLAGS) dist \
&& rm -rf $(DIST_ARCHIVES) \
&& $(MAKE) $(AM_MAKEFLAGS) distcleancheck
$(am__remove_distdir)
@(echo "$(distdir) archives ready for distribution: "; \
list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \
sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}'
distuninstallcheck:
@cd $(distuninstallcheck_dir) \
&& test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \
|| { echo "ERROR: files left after uninstall:" ; \
if test -n "$(DESTDIR)"; then \
echo " (check DESTDIR support)"; \
fi ; \
$(distuninstallcheck_listfiles) ; \
exit 1; } >&2
distcleancheck: distclean
@if test '$(srcdir)' = . ; then \
echo "ERROR: distcleancheck can only run from a VPATH build" ; \
exit 1 ; \
fi
@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \
|| { echo "ERROR: files left in build directory after distclean:" ; \
$(distcleancheck_listfiles) ; \
exit 1; } >&2
check-am: all-am
check: check-recursive
all-am: Makefile
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-recursive
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool \
distclean-tags
dvi: dvi-recursive
dvi-am:
html: html-recursive
info: info-recursive
info-am:
install-data-am:
install-exec-am:
install-info: install-info-recursive
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f $(am__CONFIG_DISTCLEAN_FILES)
-rm -rf $(top_srcdir)/autom4te.cache
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-recursive
pdf-am:
ps: ps-recursive
ps-am:
uninstall-am: uninstall-info-am
uninstall-info: uninstall-info-recursive
.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \
check-am clean clean-generic clean-libtool clean-recursive \
ctags ctags-recursive dist dist-all dist-bzip2 dist-gzip \
dist-hook dist-shar dist-tarZ dist-zip distcheck distclean \
distclean-generic distclean-libtool distclean-recursive \
distclean-tags distcleancheck distdir distuninstallcheck dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-info install-info-am install-man install-strip \
installcheck installcheck-am installdirs installdirs-am \
maintainer-clean maintainer-clean-generic \
maintainer-clean-recursive mostlyclean mostlyclean-generic \
mostlyclean-libtool mostlyclean-recursive pdf pdf-am ps ps-am \
tags tags-recursive uninstall uninstall-am uninstall-info-am
dist-hook: distclean
rm -f $(distdir)/src/rtpconfig_unix.h
rm -f $(distdir)/src/rtptypes_unix.h
mv $(distdir)/jrtplib.dsw $(distdir)/jrtplib.dsw.tmp
mv $(distdir)/jrtplib.dsp $(distdir)/jrtplib.dsp.tmp
todos < $(distdir)/jrtplib.dsw.tmp > $(distdir)/jrtplib.dsw
todos < $(distdir)/jrtplib.dsp.tmp > $(distdir)/jrtplib.dsp
rm $(distdir)/jrtplib.dsw.tmp
rm $(distdir)/jrtplib.dsp.tmp
chmod a-x $(distdir)/jrtplib.vcproj
chmod a-x $(distdir)/jrtplib.sln
chmod a-x $(distdir)/jrtplib_wce.vcproj
chmod a-x $(distdir)/jrtplib_wce.sln
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,130 +0,0 @@
------------------------------------------------------------------------------
October 2, 2005
JRTPLIB (v3.3.0)
Developed at the The Expertise Centre for
Digital Media (EDM), a research institute
of the Hasselt University
http://www.edm.uhasselt.be/
http://www.uhasselt.be/
LIBRARY LOCATION AND CONTACT
============================
Normally, you should be able to download the latest version of the library
from this url:
http://research.edm.uhasselt.be/jori/jrtplib/jrtplib.html
If you have questions about the library, you can mail me at:
jori@lumumba.uhasselt.be
There is also a mailing list for the library. To subscribe to the list,
send an e-mail with the text 'subscribe jrtplib' as the message body (not
the subject) to majordomo@edm.uhasselt.be and you'll receive further
instructions.
ACKNOWLEDGMENT
==============
I would like thank the people at the Expertise Centre for Digital Media
for giving me the opportunity to create this rewrite of the library.
DISCLAIMER & COPYRIGHT
======================
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
INSTALLATION NOTES
==================
* To compile the library on a unix-like platform, just start the configure
script. This should generate a makefile which you can use to start
building the library using 'make'.
* To compile the library on an MS-Windows platfrom: Visual Studio
workspace files are included. The project will search
for JThread files in ..\jthread-1.1.2
To compile the library without using JThread, comment the line
with RTP_SUPPORT_THREAD in rtpconfig_win.h
Note that for Visual Studio 6, you must have service pack 6 for
installed to be able to compile the library. (NOTE: In this copy
of the lib, jthread has been included and does not need to be included
seperately)
* For a manual about the library, please refer to doc/ subdirectory.
Using 'make doc', a PDF version of the documentation will be built.
Note that you'll need to have the pdflatex LaTeX compiler installed.
Alternatively, you can download the documentation from the homepage:
http://research.edm.uhasselt.be/jori/jrtplib/jrtplib.pdf
* For systems with low memory or for applications which will involve only
a few participants at a time:
You can set the HASHSIZE defines in rtpsources.h, rtpudpv4transmitter.h
and rtpudpv6transmitter.h to a lower value to avoid memory being wasted.
Note that the library will have to be recompiled.
* Used defines:
- WIN32:
For compilation on an Win32 platform.
- _WIN32_WCE:
Define needed for compilation on a WinCE platform
- RTP_HAVE_SYS_FILIO:
Set if <sys/filio.h> exists.
- RTP_HAVE_SYS_SOCKIO:
Set if <sys/sockio.h> exists.
- RTP_BIG_ENDIAN:
If set, assume big-endian byte ordering.
- RTP_SOCKLENTYPE_UINT:
Indicates that getsockname used an unsigned int as its
third parameter.
- RTP_HAVE_SOCKADDR_LEN:
Indicates that struct sockaddr has an sa_len field.
- RTP_SUPPORT_IPV4MULTICAST:
Enables support for IPv4 multicasting.
- RTP_SUPPORT_THREAD:
Enables support for JThread.
- RTP_SUPPORT_SDESPRIV:
Enables support for RTCP SDES private items.
- RTP_SUPPORT_INLINETEMPLATEPARAM:
If set, the compiler should be able to handle an inline
function as a template parameter.
- RTP_SUPPORT_PROBATION:
If set, a few consecutive RTP packets are needed to validate
a member.
- RTP_SUPPORT_GNUDRAND:
If set, the RTPRandom class will use drand48_r and srand48_r
- RTP_SUPPORT_RANDR:
If set and RTP_SUPPORT_GNUDRAND is not set, the RTPRandom
class will use rand_r.
- RTP_SUPPORT_GETLOGINR:
If set, the library will use getlogin_r instead of getlogin.
- RTP_SUPPORT_IPV6:
If set, IPv6 support is enabled.
- RTP_SUPPORT_IPV6MULTICAST:
If set, IPv6 multicasting support is enabled.
- RTP_SUPPORT_GST:
If set, GStreamer support is enabled.
- RTPDEBUG:
Enables some memory tracking functions and some debug routines.
------------------------------------------------------------------------------

View File

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,443 +0,0 @@
AC_INIT(configure.in)
AM_INIT_AUTOMAKE(jrtplib,3.3.0)
RTP_FILIO="// Don't have <sys/filio.h>"
RTP_SOCKIO="// Don't have <sys/sockio.h>"
RTP_ENDIAN="// Little endian system"
RTP_SOCKLENTYPE_UINT="// socklen_t is int'"
RTP_HAVE_SOCKADDR_LEN="// No sa_len member in struct sockaddr"
RTP_SUPPORT_IPV4MULTICAST="// No IPv4 multicasting support"
RTP_SUPPORT_IPV6MULTICAST="// No IPv6 multicasting support"
RTP_SUPPORT_THREAD="// No support for jthread"
RTP_SUPPORT_SDESPRIV="// No support for SDES PRIV items"
RTP_SUPPORT_INLINETEMPLATEPARAM="// Compiler doesn't support inline functions as template parameter"
RTP_SUPPORT_PROBATION="// Do not wait for a number of consecutive packets to validate source"
RTP_SUPPORT_GNUDRAND="// Not using drand48_r and srand48_r"
RTP_SUPPORT_RANDR="// Not using rand_r"
RTP_SUPPORT_GETLOGINR="// Not using getlogin_r"
RTP_SUPPORT_IPV6="// No IPv6 support"
RTP_SUPPORT_IFADDRS="// No ifaddrs support"
RTP_SUPPORT_GST="// No GStreamer support"
RTP_LINKLIBS=""
if test "BLA$CXXFLAGS" = "BLA" ; then
dnl CXXFLAGS="-g -Werror -Wall"
CXXFLAGS="-O2 "
fi
dnl ---------------------------------------------------------------------------
dnl Set language to C++ and do libtool stuff
dnl ---------------------------------------------------------------------------
AC_LANG(C++)
AM_PROG_LIBTOOL
dnl ---------------------------------------------------------------------------
dnl Check for the SDES PRIV support
dnl ---------------------------------------------------------------------------
AC_ARG_ENABLE(sdespriv,[ --disable-sdespriv Disable support for SDES PRIV items],[
if test "$enableval" = yes ; then
privsupport="yes"
else
privsupport="no"
fi],[
privsupport="yes"
])
if test "$privsupport" = "yes" ; then
RTP_SUPPORT_SDESPRIV="#define RTP_SUPPORT_SDESPRIV"
fi
dnl ---------------------------------------------------------------------------
dnl Check for the probation support
dnl ---------------------------------------------------------------------------
AC_ARG_ENABLE(probation,[ --disable-probation Disable support for probation of a new source],[
if test "$enableval" = yes ; then
probsupport="yes"
else
probsupport="no"
fi],[
probsupport="yes"
])
if test "$probsupport" = "yes" ; then
RTP_SUPPORT_PROBATION="#define RTP_SUPPORT_PROBATION"
fi
dnl ---------------------------------------------------------------------------
dnl Check for the jthread headers
dnl ---------------------------------------------------------------------------
RTP_SUPPORT_THREAD="#define RTP_SUPPORT_THREAD"
RTP_LINKLIBS="$RTP_LINKLIBS -lpthread"
dnl ---------------------------------------------------------------------------
dnl Check if sys/filio.h exists (used on solaris)
dnl ---------------------------------------------------------------------------
AC_CHECK_HEADER(sys/filio.h,[RTP_FILIO="#define RTP_HAVE_SYS_FILIO"])
dnl ---------------------------------------------------------------------------
dnl Check if sys/sockio.h exists (used on solaris)
dnl ---------------------------------------------------------------------------
AC_CHECK_HEADER(sys/sockio.h,[RTP_SOCKIO="#define RTP_HAVE_SYS_SOCKIO"])
dnl ---------------------------------------------------------------------------
dnl Check if it's a big endian or little endian system
dnl Note that we must be careful when a cross-compiler is being used...
dnl ---------------------------------------------------------------------------
if test "$cross_compiling" = yes ; then
cat << EOF
ASSUMING TARGET IS BIG ENDIAN:
The script detected a cross-compiler on your system. This can mean that
there really is a cross-compiler installed, or that for some other reason,
a simple program could not be run. You should check the config.log file
to verify this.
Since we are assuming a cross-compiler, we won't be able to actually test
any program. More important, we cannot test if the system is big or little
endian.
For now, big endian is assumed. If this assumption should be wrong, you will
have to comment the appropriate line in 'rtpconfig_unix.h'
EOF
RTP_ENDIAN="#define RTP_BIG_ENDIAN // comment this if the target is a little endian system"
else
AC_C_BIGENDIAN
if test "$ac_cv_c_bigendian" = yes; then
RTP_ENDIAN="#define RTP_BIG_ENDIAN"
fi
fi
dnl ---------------------------------------------------------------------------
dnl Check if compiler supports -Werror -Wall
dnl ---------------------------------------------------------------------------
oldcxxflags="$CXXFLAGS"
CXXFLAGS="$CXXFLAGS -Werror -Wall"
AC_MSG_CHECKING(if compiler supports -Werror -Wall)
AC_TRY_COMPILE([
#include <stdio.h>],[
printf("Hello world\n");],
AC_MSG_RESULT(yes),[
AC_MSG_RESULT(no)
CXXFLAGS="$oldcxxflags"])
dnl ---------------------------------------------------------------------------
dnl Check what the last argument for getsockname is
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(last argument of getsockname)
AC_TRY_COMPILE([#include <sys/types.h>
#include <sys/socket.h>],
[int param;
int sock = 0;
struct sockaddr addr;
getsockname(sock,&addr,&param);],
AC_MSG_RESULT(int),
[
AC_MSG_RESULT(unsigned int)
RTP_SOCKLENTYPE_UINT="#define RTP_SOCKLENTYPE_UINT"
])
CXXFLAGS="$oldcxxflags"
dnl ---------------------------------------------------------------------------
dnl Check if multicast options are known
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if necessary options for IPv4 multicasting are available)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>],[
int testval;
struct ip_mreq mreq,mreq2;
mreq = mreq2; // avoid 'unused variable'
testval = IP_MULTICAST_TTL;
testval = IP_ADD_MEMBERSHIP;
testval = IP_DROP_MEMBERSHIP;],[
AC_MSG_RESULT(yes)
RTP_SUPPORT_IPV4MULTICAST="#define RTP_SUPPORT_IPV4MULTICAST"],
AC_MSG_RESULT(no))
dnl ---------------------------------------------------------------------------
dnl Check if sockaddr has a length field (sa_len)
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if struct sockaddr has sa_len member)
AC_TRY_COMPILE([
#include <sys/types.h>
#include <sys/socket.h>],[
struct sockaddr sa;
sa.sa_len = 0;],[
AC_MSG_RESULT(yes)
RTP_HAVE_SOCKADDR_LEN="#define RTP_HAVE_SOCKADDR_LEN"],
AC_MSG_RESULT(no))
dnl ---------------------------------------------------------------------------
dnl Check if compiler needs -LANG:std (needed on Irix)
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if compiler can compile programs with STL)
AC_TRY_COMPILE([
#include <iostream>],[
std::cout << "Bla" << std::endl; ],
AC_MSG_RESULT(yes),
[AC_MSG_RESULT(no)
AC_MSG_CHECKING(if compiler can compile STL programs with option -LANG:std)
CXXFLAGS="$CXXFLAGS -LANG:std"
AC_TRY_COMPILE([
#include <iostream>],[
std::cout << "Bla" << std::endl; ],
AC_MSG_RESULT(yes),[
AC_MSG_RESULT(no)
AC_MSG_ERROR(Unable to compile a trivial STL program)]
)
])
dnl ---------------------------------------------------------------------------
dnl Check if compiler can handle inline function in template argument
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if compiler supports an inline function as a template argument)
AC_TRY_COMPILE([
#include "src/rtphashtable.h"
inline int GetIndex(const int &elem) { return elem%10; }],[
RTPHashTable<int,GetIndex,10> table; ],
[AC_MSG_RESULT(yes)
RTP_SUPPORT_INLINETEMPLATEPARAM="#define RTP_SUPPORT_INLINETEMPLATEPARAM"],
AC_MSG_RESULT(no)
)
dnl ---------------------------------------------------------------------------
dnl Check for u_int32_t etc
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if types like u_int32_t exist)
AC_TRY_COMPILE([
#include <sys/types.h>],[
u_int32_t x;
x = 0;],
[AC_MSG_RESULT(yes)
echo "#include <sys/types.h>" >src/rtptypes_unix.h
],[
AC_MSG_RESULT(no)
echo "Generating src/rtptypes.h ..."
if ! ( $CXX $CFLAGS -o tools/gettypes tools/gettypes.cpp >/dev/null 2>/dev/null ) ; then
AC_MSG_ERROR(Unable to create src/rtptypes_unix.h)
fi
if ! ( tools/gettypes >src/rtptypes_unix.h ) ; then
AC_MSG_ERROR(Unable to create src/rtptypes_unix.h)
fi
])
dnl ---------------------------------------------------------------------------
dnl Check random functions
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(for drand48_r and srand48_r)
AC_COMPILE_IFELSE([
#include <stdlib.h>
int main(void)
{
struct drand48_data drandbuffer;
double x;
srand48_r(12345,&drandbuffer);
drand48_r(&drandbuffer,&x);
return 0;
}
],
[AC_MSG_RESULT(yes)
RTP_SUPPORT_GNUDRAND="#define RTP_SUPPORT_GNUDRAND"],
[
AC_MSG_RESULT(no)
AC_MSG_CHECKING(for rand_r)
AC_COMPILE_IFELSE([
#include <stdlib.h>
int main(void)
{
unsigned int x;
x = 12345;
rand_r(&x);
return 0;
}
],
[ AC_MSG_RESULT(yes)
RTP_SUPPORT_RANDR="#define RTP_SUPPORT_RANDR"],
[ AC_MSG_RESULT(no)])
])
dnl ---------------------------------------------------------------------------
dnl Check getlogin_r functions
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(for getlogin_r)
AC_COMPILE_IFELSE([
#include <unistd.h>
int main(void)
{
char buf[[256]];
getlogin_r(buf,256);
return 0;
}
],
[AC_MSG_RESULT(yes)
RTP_SUPPORT_GETLOGINR="#define RTP_SUPPORT_GETLOGINR"],
[
AC_MSG_RESULT(no)
])
dnl ---------------------------------------------------------------------------
dnl Check IPv6 support
dnl ---------------------------------------------------------------------------
AC_ARG_ENABLE(IPv6,[ --disable-IPv6 Disable support for IPv6],[
if test "$enableval" = yes ; then
ipv6support="yes"
else
ipv6support="no"
fi],[
ipv6support="yes"
])
if test "$ipv6support" = "yes" ; then
if test "$cross_compiling" = yes ; then
cat << EOF
ABOUT IPv6 SUPPORT:
Can't check if IPv6 support is possible when cross-compiling. For now, lets
assume that you want IPv6 support enabled. To disable it, comment the two
appropriate lines in src/rtpconfig_unix.h before running make.
EOF
else
AC_MSG_CHECKING(IPv6 support)
AC_RUN_IFELSE([
#include <sys/types.h>
#include <sys/socket.h>
int main(void)
{
int s;
s = socket(PF_INET6,SOCK_DGRAM,0);
if (s < 0)
return -1;
return 0;
}
],
[AC_MSG_RESULT(enabled)
RTP_SUPPORT_IPV6="#define RTP_SUPPORT_IPV6"
dnl ---------------------------------------------------------------------------
dnl Check if multicast options are known
dnl ---------------------------------------------------------------------------
AC_MSG_CHECKING(if necessary options for IPv6 multicasting are available)
AC_COMPILE_IFELSE([
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
int main(void)
{
int testval;
struct ipv6_mreq mreq,mreq2;
mreq = mreq2; // avoid 'unused variable'
testval = IPV6_MULTICAST_HOPS;
testval = IPV6_JOIN_GROUP;
testval = IPV6_LEAVE_GROUP;
return 0;
}
],[
AC_MSG_RESULT(yes)
RTP_SUPPORT_IPV6MULTICAST="#define RTP_SUPPORT_IPV6MULTICAST"],
AC_MSG_RESULT(no))],
[
AC_MSG_RESULT(disabled)
])
fi
fi
dnl ---------------------------------------------------------------------------
dnl Check if ifaddrs.h exists so we can use getifaddrs
dnl ---------------------------------------------------------------------------
AC_CHECK_HEADER(ifaddrs.h,[RTP_SUPPORT_IFADDRS="#define RTP_SUPPORT_IFADDRS"])
dnl ---------------------------------------------------------------------------
dnl Check gstreamer support
dnl ---------------------------------------------------------------------------
AC_ARG_ENABLE(gst,[ --disable-gst Disable support GStreamer],[
if test "$enableval" = yes ; then
gstsupport="yes"
else
gstsupport="no"
fi],[
gstsupport="yes"
])
if test "$gstsupport" = "yes" ; then
dnl uninstalled is selected preferentially -- see pkg-config(1)
GST_REQ=0.9
GST_MAJORMINOR=0.9
PKG_CHECK_MODULES(GST, gstreamer-$GST_MAJORMINOR >= $GST_REQ,
HAVE_GST="yes", HAVE_GST="no")
dnl check for gstreamer-plugins-base; uinstalled is selected preferentially
PKG_CHECK_MODULES(GST_PLUGINS_BASE, gstreamer-plugins-base-$GST_MAJORMINOR >= $GST_REQ,
HAVE_GST_PLUGINS="yes", HAVE_GST_PLUGINS="no")
if test "x$HAVE_GST_PLUGINS" = "xyes" && test "x$HAVE_GST" = "xyes"; then
RTP_SUPPORT_GST="#define RTP_SUPPORT_GST"
GST_LIBS="$GST_LIBS -lgstnet-$GST_MAJORMINOR"
fi
RTP_GSTINCLUDES="$GST_CFLAGS $GST_PLUGINS_BASE_CFLAGS"
RTP_LINKLIBS="$RTP_LINKLIBS $GST_LIBS $GST_PLUGIN_BASE_LIBS"
fi
dnl ---------------------------------------------------------------------------
dnl Finish up...
dnl ---------------------------------------------------------------------------
AC_SUBST(RTP_FILIO)
AC_SUBST(RTP_SOCKIO)
AC_SUBST(RTP_ENDIAN)
AC_SUBST(RTP_SOCKLENTYPE_UINT)
AC_SUBST(RTP_HAVE_SOCKADDR_LEN)
AC_SUBST(RTP_SUPPORT_IPV4MULTICAST)
AC_SUBST(RTP_SUPPORT_THREAD)
AC_SUBST(RTP_SUPPORT_SDESPRIV)
AC_SUBST(RTP_SUPPORT_INLINETEMPLATEPARAM)
AC_SUBST(RTP_SUPPORT_PROBATION)
AC_SUBST(RTP_SUPPORT_GNUDRAND)
AC_SUBST(RTP_SUPPORT_RANDR)
AC_SUBST(RTP_SUPPORT_GETLOGINR)
AC_SUBST(RTP_SUPPORT_IPV6)
AC_SUBST(RTP_SUPPORT_IPV6MULTICAST)
AC_SUBST(RTP_SUPPORT_IFADDRS)
AC_SUBST(RTP_SUPPORT_GST)
AC_SUBST(RTP_GSTINCLUDES)
AC_SUBST(RTP_LINKLIBS)
AC_OUTPUT(Makefile \
src/Makefile \
src/rtpconfig_unix.h \
doc/Makefile \
tools/Makefile \
examples/Makefile \
pkgconfig/Makefile \
pkgconfig/jrtplib.pc \
pkgconfig/jrtplib-uninstalled.pc \
)

View File

@ -1,526 +0,0 @@
#! /bin/sh
# depcomp - compile a program generating dependencies as side-effects
scriptversion=2004-04-25.13
# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc.
# 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, 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.
# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.
case $1 in
'')
echo "$0: No command. Try \`$0 --help' for more information." 1>&2
exit 1;
;;
-h | --h*)
cat <<\EOF
Usage: depcomp [--help] [--version] PROGRAM [ARGS]
Run PROGRAMS ARGS to compile a file, generating dependencies
as side-effects.
Environment variables:
depmode Dependency tracking mode.
source Source file read by `PROGRAMS ARGS'.
object Object file output by `PROGRAMS ARGS'.
depfile Dependency file to output.
tmpdepfile Temporary file to use when outputing dependencies.
libtool Whether libtool is used (yes/no).
Report bugs to <bug-automake@gnu.org>.
EOF
exit 0
;;
-v | --v*)
echo "depcomp $scriptversion"
exit 0
;;
esac
if test -z "$depmode" || test -z "$source" || test -z "$object"; then
echo "depcomp: Variables source, object and depmode must be set" 1>&2
exit 1
fi
# `libtool' can also be set to `yes' or `no'.
if test -z "$depfile"; then
base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'`
dir=`echo "$object" | sed 's,/.*$,/,'`
if test "$dir" = "$object"; then
dir=
fi
# FIXME: should be _deps on DOS.
depfile="$dir.deps/$base"
fi
tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`}
rm -f "$tmpdepfile"
# Some modes work just like other modes, but use different flags. We
# parameterize here, but still list the modes in the big case below,
# to make depend.m4 easier to write. Note that we *cannot* use a case
# here, because this file can only contain one case statement.
if test "$depmode" = hp; then
# HP compiler uses -M and no extra arg.
gccflag=-M
depmode=gcc
fi
if test "$depmode" = dashXmstdout; then
# This is just like dashmstdout with a different argument.
dashmflag=-xM
depmode=dashmstdout
fi
case "$depmode" in
gcc3)
## gcc 3 implements dependency tracking that does exactly what
## we want. Yay! Note: for some reason libtool 1.4 doesn't like
## it if -MD -MP comes after the -MF stuff. Hmm.
"$@" -MT "$object" -MD -MP -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
mv "$tmpdepfile" "$depfile"
;;
gcc)
## There are various ways to get dependency output from gcc. Here's
## why we pick this rather obscure method:
## - Don't want to use -MD because we'd like the dependencies to end
## up in a subdir. Having to rename by hand is ugly.
## (We might end up doing this anyway to support other compilers.)
## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like
## -MM, not -M (despite what the docs say).
## - Using -M directly means running the compiler twice (even worse
## than renaming).
if test -z "$gccflag"; then
gccflag=-MD,
fi
"$@" -Wp,"$gccflag$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
echo "$object : \\" > "$depfile"
alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
## The second -e expression handles DOS-style file names with drive letters.
sed -e 's/^[^:]*: / /' \
-e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile"
## This next piece of magic avoids the `deleted header file' problem.
## The problem is that when a header file which appears in a .P file
## is deleted, the dependency causes make to die (because there is
## typically no way to rebuild the header). We avoid this by adding
## dummy dependencies for each header file. Too bad gcc doesn't do
## this for us directly.
tr ' ' '
' < "$tmpdepfile" |
## Some versions of gcc put a space before the `:'. On the theory
## that the space means something, we add a space to the output as
## well.
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
hp)
# This case exists only to let depend.m4 do its work. It works by
# looking at the text of this script. This case will never be run,
# since it is checked for above.
exit 1
;;
sgi)
if test "$libtool" = yes; then
"$@" "-Wp,-MDupdate,$tmpdepfile"
else
"$@" -MDupdate "$tmpdepfile"
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files
echo "$object : \\" > "$depfile"
# Clip off the initial element (the dependent). Don't try to be
# clever and replace this with sed code, as IRIX sed won't handle
# lines with more than a fixed number of characters (4096 in
# IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines;
# the IRIX cc adds comments like `#:fec' to the end of the
# dependency line.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \
tr '
' ' ' >> $depfile
echo >> $depfile
# The second pass generates a dummy entry for each header file.
tr ' ' '
' < "$tmpdepfile" \
| sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \
>> $depfile
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
aix)
# The C for AIX Compiler uses -M and outputs the dependencies
# in a .u file. In older versions, this file always lives in the
# current directory. Also, the AIX compiler puts `$object:' at the
# start of each line; $object doesn't have directory information.
# Version 6 uses the directory in both cases.
stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'`
tmpdepfile="$stripped.u"
if test "$libtool" = yes; then
"$@" -Wc,-M
else
"$@" -M
fi
stat=$?
if test -f "$tmpdepfile"; then :
else
stripped=`echo "$stripped" | sed 's,^.*/,,'`
tmpdepfile="$stripped.u"
fi
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
if test -f "$tmpdepfile"; then
outname="$stripped.o"
# Each line is of the form `foo.o: dependent.h'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile"
sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile"
else
# The sourcefile does not contain any dependencies, so just
# store a dummy comment line, to avoid errors with the Makefile
# "include basename.Plo" scheme.
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
icc)
# Intel's C compiler understands `-MD -MF file'. However on
# icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c
# ICC 7.0 will fill foo.d with something like
# foo.o: sub/foo.c
# foo.o: sub/foo.h
# which is wrong. We want:
# sub/foo.o: sub/foo.c
# sub/foo.o: sub/foo.h
# sub/foo.c:
# sub/foo.h:
# ICC 7.1 will output
# foo.o: sub/foo.c sub/foo.h
# and will wrap long lines using \ :
# foo.o: sub/foo.c ... \
# sub/foo.h ... \
# ...
"$@" -MD -MF "$tmpdepfile"
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile"
exit $stat
fi
rm -f "$depfile"
# Each line is of the form `foo.o: dependent.h',
# or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'.
# Do two passes, one to just change these to
# `$object: dependent.h' and one to simply `dependent.h:'.
sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile"
# Some versions of the HPUX 10.20 sed can't process this invocation
# correctly. Breaking it into two sed invocations is a workaround.
sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" |
sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
tru64)
# The Tru64 compiler uses -MD to generate dependencies as a side
# effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'.
# At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put
# dependencies in `foo.d' instead, so we check for that too.
# Subdirectories are respected.
dir=`echo "$object" | sed -e 's|/[^/]*$|/|'`
test "x$dir" = "x$object" && dir=
base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'`
if test "$libtool" = yes; then
# Dependencies are output in .lo.d with libtool 1.4.
# They are output in .o.d with libtool 1.5.
tmpdepfile1="$dir.libs/$base.lo.d"
tmpdepfile2="$dir.libs/$base.o.d"
tmpdepfile3="$dir.libs/$base.d"
"$@" -Wc,-MD
else
tmpdepfile1="$dir$base.o.d"
tmpdepfile2="$dir$base.d"
tmpdepfile3="$dir$base.d"
"$@" -MD
fi
stat=$?
if test $stat -eq 0; then :
else
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3"
exit $stat
fi
if test -f "$tmpdepfile1"; then
tmpdepfile="$tmpdepfile1"
elif test -f "$tmpdepfile2"; then
tmpdepfile="$tmpdepfile2"
else
tmpdepfile="$tmpdepfile3"
fi
if test -f "$tmpdepfile"; then
sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile"
# That's a tab and a space in the [].
sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile"
else
echo "#dummy" > "$depfile"
fi
rm -f "$tmpdepfile"
;;
#nosideeffect)
# This comment above is used by automake to tell side-effect
# dependency tracking mechanisms from slower ones.
dashmstdout)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout, regardless of -o.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
test -z "$dashmflag" && dashmflag=-M
# Require at least two characters before searching for `:'
# in the target name. This is to cope with DOS-style filenames:
# a dependency such as `c:/foo/bar' could be seen as target `c' otherwise.
"$@" $dashmflag |
sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
tr ' ' '
' < "$tmpdepfile" | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
dashXmstdout)
# This case only exists to satisfy depend.m4. It is never actually
# run, as this mode is specially recognized in the preamble.
exit 1
;;
makedepend)
"$@" || exit $?
# Remove any Libtool call
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# X makedepend
shift
cleared=no
for arg in "$@"; do
case $cleared in
no)
set ""; shift
cleared=yes ;;
esac
case "$arg" in
-D*|-I*)
set fnord "$@" "$arg"; shift ;;
# Strip any option that makedepend may not understand. Remove
# the object too, otherwise makedepend will parse it as a source file.
-*|$object)
;;
*)
set fnord "$@" "$arg"; shift ;;
esac
done
obj_suffix="`echo $object | sed 's/^.*\././'`"
touch "$tmpdepfile"
${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@"
rm -f "$depfile"
cat < "$tmpdepfile" > "$depfile"
sed '1,2d' "$tmpdepfile" | tr ' ' '
' | \
## Some versions of the HPUX 10.20 sed can't process this invocation
## correctly. Breaking it into two sed invocations is a workaround.
sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile"
rm -f "$tmpdepfile" "$tmpdepfile".bak
;;
cpp)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout.
"$@" || exit $?
# Remove the call to Libtool.
if test "$libtool" = yes; then
while test $1 != '--mode=compile'; do
shift
done
shift
fi
# Remove `-o $object'.
IFS=" "
for arg
do
case $arg in
-o)
shift
;;
$object)
shift
;;
*)
set fnord "$@" "$arg"
shift # fnord
shift # $arg
;;
esac
done
"$@" -E |
sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' |
sed '$ s: \\$::' > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
cat < "$tmpdepfile" >> "$depfile"
sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile"
rm -f "$tmpdepfile"
;;
msvisualcpp)
# Important note: in order to support this mode, a compiler *must*
# always write the preprocessed file to stdout, regardless of -o,
# because we must use -o when running libtool.
"$@" || exit $?
IFS=" "
for arg
do
case "$arg" in
"-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI")
set fnord "$@"
shift
shift
;;
*)
set fnord "$@" "$arg"
shift
shift
;;
esac
done
"$@" -E |
sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile"
rm -f "$depfile"
echo "$object : \\" > "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile"
echo " " >> "$depfile"
. "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile"
rm -f "$tmpdepfile"
;;
none)
exec "$@"
;;
*)
echo "Unknown depmode $depmode" 1>&2
exit 1
;;
esac
exit 0
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

View File

@ -1,10 +0,0 @@
EXTRA_DIST = jrtplib.tex manual.tex
doc: jrtplib.pdf
jrtplib.pdf: jrtplib.tex
pdflatex jrtplib.tex
pdflatex jrtplib.tex
clean:
rm -f jrtplib.{toc,aux,log,pdf}

View File

@ -1,334 +0,0 @@
# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = doc
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
RTP_ENDIAN = @RTP_ENDIAN@
RTP_FILIO = @RTP_FILIO@
RTP_GSTINCLUDES = @RTP_GSTINCLUDES@
RTP_HAVE_SOCKADDR_LEN = @RTP_HAVE_SOCKADDR_LEN@
RTP_LINKLIBS = @RTP_LINKLIBS@
RTP_SOCKIO = @RTP_SOCKIO@
RTP_SOCKLENTYPE_UINT = @RTP_SOCKLENTYPE_UINT@
RTP_SUPPORT_GETLOGINR = @RTP_SUPPORT_GETLOGINR@
RTP_SUPPORT_GNUDRAND = @RTP_SUPPORT_GNUDRAND@
RTP_SUPPORT_GST = @RTP_SUPPORT_GST@
RTP_SUPPORT_IFADDRS = @RTP_SUPPORT_IFADDRS@
RTP_SUPPORT_INLINETEMPLATEPARAM = @RTP_SUPPORT_INLINETEMPLATEPARAM@
RTP_SUPPORT_IPV4MULTICAST = @RTP_SUPPORT_IPV4MULTICAST@
RTP_SUPPORT_IPV6 = @RTP_SUPPORT_IPV6@
RTP_SUPPORT_IPV6MULTICAST = @RTP_SUPPORT_IPV6MULTICAST@
RTP_SUPPORT_PROBATION = @RTP_SUPPORT_PROBATION@
RTP_SUPPORT_RANDR = @RTP_SUPPORT_RANDR@
RTP_SUPPORT_SDESPRIV = @RTP_SUPPORT_SDESPRIV@
RTP_SUPPORT_THREAD = @RTP_SUPPORT_THREAD@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
EXTRA_DIST = jrtplib.tex manual.tex
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu doc/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: all all-am check check-am clean clean-generic clean-libtool \
distclean distclean-generic distclean-libtool distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-exec install-exec-am \
install-info install-info-am install-man install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am
doc: jrtplib.pdf
jrtplib.pdf: jrtplib.tex
pdflatex jrtplib.tex
pdflatex jrtplib.tex
clean:
rm -f jrtplib.{toc,aux,log,pdf}
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

File diff suppressed because it is too large Load Diff

View File

@ -1,114 +0,0 @@
\documentclass[a4paper,12pt]{article}
\usepackage{listings}
\lstset{language=C++}
\lstset{tabsize=4}
\begin{document}
\title{JThread manual (v1.1.2)}
\author{Jori Liesenborgs\\
{\tt jori@lumumba.uhasselt.be} }
\date{September 14, 2005}
\maketitle
\section{Introduction}
A lot of projects on which I'm working use threads. To be able to
use the same code on both unix and MS-Windows platforms, I decided
to write some simple wrapper classes for the existing thread functions
on those platforms.
The JThread package is very simple: currently, it only contains two
classes, namely {\tt JThread} and {\tt JMutex}. As their names
suggest, {\tt JThread} represents a thread and {\tt JMutex} a mutex.
The thread class only contains very basic functions, for example to
start or kill a thread.
\section{Copyright \& disclaimer}
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
\section{Usage}
Here follows a description of the {\tt JThread} and {\tt JMutex} classes.
Note that functions with return type {\tt int} always return a value of zero
or more on success and a negative value in case something went wrong.
\subsection{{\tt JMutex}}
The class definition of {\tt JMutex} is shown below. Before you can use an
instance of this type, you must first call the {\tt Init} function. You can
check if the mutex was already initialized by checking the return value
of {\tt IsInitialized}. After the initialization, the mutex can be locked
and unlocked by calling the functions {\tt Lock} and {\tt Unlock} respectively.
\begin{lstlisting}[frame=tb]{}
class JMutex
{
public:
JMutex();
~JMutex();
int Init();
int Lock();
int Unlock();
bool IsInitialized();
};
\end{lstlisting}
\subsection{{\tt JThread}}
To create your own thread, you have to derive a class from {\tt JThread},
which is depicted below. In your derived class, you have to implement
a member function {\tt Thread}, which will be executed in the new thread.
Your own {\tt Thread} implementation should call {\tt ThreadStarted}
immediately.
To start your thread, you simply have to call the {\tt Start} function.
This function finishes when your own {\tt Thread} function has called
{\tt ThreadStarted}. This way, when the {\tt Start} function
finishes, you can be really sure that your own {\tt Thread} implementation
is really running.
You can check if the thread is still running by calling {\tt IsRunning}.
If the thread has finished, you can check its return value by calling
{\tt GetReturnValue}. Finally, in case your thread gets stuck, you can
end it by using the {\tt Kill} function.
You should be careful with this {\tt Kill} function: if you call it when
the thread is working with a mutex (for example an internal mutex), this
mutex can be left in a locked state, which in turn can cause another thread
to block. You should only use the {\tt Kill} function when you're absolutely
sure that the thread is stuck in some loop and cannot be ended otherwise.
\begin{lstlisting}[frame=tb]{}
class JThread
{
public:
JThread();
virtual ~JThread();
int Start();
int Kill();
virtual void *Thread() = 0;
bool IsRunning();
void *GetReturnValue();
protected:
void ThreadStarted();
};
\end{lstlisting}
\end{document}

View File

@ -1,10 +0,0 @@
noinst_PROGRAMS = example1 example2 example3 example4
example1_SOURCES = example1.cpp
example2_SOURCES = example2.cpp
example3_SOURCES = example3.cpp
example4_SOURCES = example4.cpp
INCLUDES = @RTP_JTHREADINCLUDES@ @RTP_GSTINCLUDES@ -I ../src/
LDADD = ../src/.libs/libjrtp.a @RTP_LINKLIBS@

View File

@ -1,468 +0,0 @@
# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
noinst_PROGRAMS = example1$(EXEEXT) example2$(EXEEXT) \
example3$(EXEEXT) example4$(EXEEXT)
subdir = examples
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES =
PROGRAMS = $(noinst_PROGRAMS)
am_example1_OBJECTS = example1.$(OBJEXT)
example1_OBJECTS = $(am_example1_OBJECTS)
example1_LDADD = $(LDADD)
example1_DEPENDENCIES = ../src/.libs/libjrtp.a
am_example2_OBJECTS = example2.$(OBJEXT)
example2_OBJECTS = $(am_example2_OBJECTS)
example2_LDADD = $(LDADD)
example2_DEPENDENCIES = ../src/.libs/libjrtp.a
am_example3_OBJECTS = example3.$(OBJEXT)
example3_OBJECTS = $(am_example3_OBJECTS)
example3_LDADD = $(LDADD)
example3_DEPENDENCIES = ../src/.libs/libjrtp.a
am_example4_OBJECTS = example4.$(OBJEXT)
example4_OBJECTS = $(am_example4_OBJECTS)
example4_LDADD = $(LDADD)
example4_DEPENDENCIES = ../src/.libs/libjrtp.a
DEFAULT_INCLUDES = -I. -I$(srcdir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(example1_SOURCES) $(example2_SOURCES) $(example3_SOURCES) \
$(example4_SOURCES)
DIST_SOURCES = $(example1_SOURCES) $(example2_SOURCES) \
$(example3_SOURCES) $(example4_SOURCES)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
RTP_ENDIAN = @RTP_ENDIAN@
RTP_FILIO = @RTP_FILIO@
RTP_GSTINCLUDES = @RTP_GSTINCLUDES@
RTP_HAVE_SOCKADDR_LEN = @RTP_HAVE_SOCKADDR_LEN@
RTP_LINKLIBS = @RTP_LINKLIBS@
RTP_SOCKIO = @RTP_SOCKIO@
RTP_SOCKLENTYPE_UINT = @RTP_SOCKLENTYPE_UINT@
RTP_SUPPORT_GETLOGINR = @RTP_SUPPORT_GETLOGINR@
RTP_SUPPORT_GNUDRAND = @RTP_SUPPORT_GNUDRAND@
RTP_SUPPORT_GST = @RTP_SUPPORT_GST@
RTP_SUPPORT_IFADDRS = @RTP_SUPPORT_IFADDRS@
RTP_SUPPORT_INLINETEMPLATEPARAM = @RTP_SUPPORT_INLINETEMPLATEPARAM@
RTP_SUPPORT_IPV4MULTICAST = @RTP_SUPPORT_IPV4MULTICAST@
RTP_SUPPORT_IPV6 = @RTP_SUPPORT_IPV6@
RTP_SUPPORT_IPV6MULTICAST = @RTP_SUPPORT_IPV6MULTICAST@
RTP_SUPPORT_PROBATION = @RTP_SUPPORT_PROBATION@
RTP_SUPPORT_RANDR = @RTP_SUPPORT_RANDR@
RTP_SUPPORT_SDESPRIV = @RTP_SUPPORT_SDESPRIV@
RTP_SUPPORT_THREAD = @RTP_SUPPORT_THREAD@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
example1_SOURCES = example1.cpp
example2_SOURCES = example2.cpp
example3_SOURCES = example3.cpp
example4_SOURCES = example4.cpp
INCLUDES = @RTP_JTHREADINCLUDES@ @RTP_GSTINCLUDES@ -I ../src/
LDADD = ../src/.libs/libjrtp.a @RTP_LINKLIBS@
all: all-am
.SUFFIXES:
.SUFFIXES: .cpp .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu examples/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu examples/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
clean-noinstPROGRAMS:
@list='$(noinst_PROGRAMS)'; for p in $$list; do \
f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \
echo " rm -f $$p $$f"; \
rm -f $$p $$f ; \
done
example1$(EXEEXT): $(example1_OBJECTS) $(example1_DEPENDENCIES)
@rm -f example1$(EXEEXT)
$(CXXLINK) $(example1_LDFLAGS) $(example1_OBJECTS) $(example1_LDADD) $(LIBS)
example2$(EXEEXT): $(example2_OBJECTS) $(example2_DEPENDENCIES)
@rm -f example2$(EXEEXT)
$(CXXLINK) $(example2_LDFLAGS) $(example2_OBJECTS) $(example2_LDADD) $(LIBS)
example3$(EXEEXT): $(example3_OBJECTS) $(example3_DEPENDENCIES)
@rm -f example3$(EXEEXT)
$(CXXLINK) $(example3_LDFLAGS) $(example3_OBJECTS) $(example3_LDADD) $(LIBS)
example4$(EXEEXT): $(example4_OBJECTS) $(example4_DEPENDENCIES)
@rm -f example4$(EXEEXT)
$(CXXLINK) $(example4_LDFLAGS) $(example4_OBJECTS) $(example4_LDADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example1.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example2.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example3.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/example4.Po@am__quote@
.cpp.o:
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.lo:
@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(PROGRAMS)
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-libtool distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am:
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-libtool clean-noinstPROGRAMS ctags distclean \
distclean-compile distclean-generic distclean-libtool \
distclean-tags distdir dvi dvi-am html html-am info info-am \
install install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-strip installcheck installcheck-am installdirs \
maintainer-clean maintainer-clean-generic mostlyclean \
mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
pdf pdf-am ps ps-am tags uninstall uninstall-am \
uninstall-info-am
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,149 +0,0 @@
/*
Here's a small IPv4 example: it asks for a portbase and a destination and
starts sending packets to that destination.
*/
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
//
// This function checks if there was a RTP error. If so, it displays an error
// message and exists.
//
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
//
// The main routine
//
int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
RTPSession sess;
u_int16_t portbase,destport;
u_int32_t destip;
std::string ipstr;
int status,i,num;
// First, we'll ask for the necessary information
std::cout << "Enter local portbase:" << std::endl;
std::cin >> portbase;
std::cout << std::endl;
std::cout << "Enter the destination IP address" << std::endl;
std::cin >> ipstr;
destip = inet_addr(ipstr.c_str());
if (destip == INADDR_NONE)
{
std::cerr << "Bad IP address specified" << std::endl;
return -1;
}
// The inet_addr function returns a value in network byte order, but
// we need the IP address in host byte order, so we use a call to
// ntohl
destip = ntohl(destip);
std::cout << "Enter the destination port" << std::endl;
std::cin >> destport;
std::cout << std::endl;
std::cout << "Number of packets you wish to be sent:" << std::endl;
std::cin >> num;
// Now, we'll create a RTP session, set the destination, send some
// packets and poll for incoming data.
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
// IMPORTANT: The local timestamp unit MUST be set, otherwise
// RTCP Sender Report info will be calculated wrong
// In this case, we'll be sending 10 samples each second, so we'll
// put the timestamp unit to (1.0/10.0)
sessparams.SetOwnTimestampUnit(1.0/10.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
status = sess.Create(sessparams,&transparams);
checkerror(status);
RTPIPv4Address addr(destip,destport);
status = sess.AddDestination(addr);
checkerror(status);
for (i = 1 ; i <= num ; i++)
{
printf("\nSending packet %d/%d\n",i,num);
// send the packet
status = sess.SendPacket((void *)"1234567890",10,0,false,10);
checkerror(status);
sess.BeginDataAccess();
// check incoming packets
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = sess.GetNextPacket()) != NULL)
{
// You can examine the data here
printf("Got packet !\n");
// we don't longer need the packet, so
// we'll delete it
delete pack;
}
} while (sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
#ifndef RTP_SUPPORT_THREAD
status = sess.Poll();
checkerror(status);
#endif // RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1,0));
}
sess.BYEDestroy(RTPTime(10,0),0,0);
#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}

View File

@ -1,98 +0,0 @@
#include "rtpsession.h"
#include "rtpsessionparams.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtptimeutilities.h"
#include "rtppacket.h"
#include <stdlib.h>
#include <iostream>
int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
RTPSession session;
RTPSessionParams sessionparams;
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
RTPUDPv4TransmissionParams transparams;
transparams.SetPortbase(8000);
int status = session.Create(sessionparams,&transparams);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
u_int8_t localip[]={127,0,0,1};
RTPIPv4Address addr(localip,9000);
status = session.AddDestination(addr);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
u_int8_t silencebuffer[160];
for (int i = 0 ; i < 160 ; i++)
silencebuffer[i] = 128;
RTPTime delay(0.020);
RTPTime starttime = RTPTime::CurrentTime();
bool done = false;
while (!done)
{
status = session.SendPacket(silencebuffer,160);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
session.BeginDataAccess();
if (session.GotoFirstSource())
{
do
{
RTPPacket *packet = session.GetNextPacket();
if (packet)
{
std::cout << "Got packet with "
<< "extended sequence number "
<< packet->GetExtendedSequenceNumber()
<< " from SSRC " << packet->GetSSRC()
<< std::endl;
delete packet;
}
} while (session.GotoNextSource());
}
session.EndDataAccess();
RTPTime::Wait(delay);
RTPTime t = RTPTime::CurrentTime();
t -= starttime;
if (t > RTPTime(60.0))
done = true;
}
delay = RTPTime(10.0);
session.BYEDestroy(delay,"Time's up",9);
#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}

View File

@ -1,224 +0,0 @@
/*
This IPv4 example listens for incoming packets and automatically adds destinations
for new sources.
*/
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
#include "rtpsourcedata.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
//
// This function checks if there was a RTP error. If so, it displays an error
// message and exists.
//
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
//
// The new class routine
//
class MyRTPSession : public RTPSession
{
protected:
void OnNewSource(RTPSourceData *dat)
{
if (dat->IsOwnSSRC())
return;
u_int32_t ip;
u_int16_t port;
if (dat->GetRTPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort();
}
else if (dat->GetRTCPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort()-1;
}
else
return;
RTPIPv4Address dest(ip,port);
AddDestination(dest);
struct in_addr inaddr;
inaddr.s_addr = htonl(ip);
std::cout << "Adding destination " << std::string(inet_ntoa(inaddr)) << ":" << port << std::endl;
}
void OnBYEPacket(RTPSourceData *dat)
{
if (dat->IsOwnSSRC())
return;
u_int32_t ip;
u_int16_t port;
if (dat->GetRTPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort();
}
else if (dat->GetRTCPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort()-1;
}
else
return;
RTPIPv4Address dest(ip,port);
DeleteDestination(dest);
struct in_addr inaddr;
inaddr.s_addr = htonl(ip);
std::cout << "Deleting destination " << std::string(inet_ntoa(inaddr)) << ":" << port << std::endl;
}
void OnRemoveSource(RTPSourceData *dat)
{
if (dat->IsOwnSSRC())
return;
if (dat->ReceivedBYE())
return;
u_int32_t ip;
u_int16_t port;
if (dat->GetRTPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort();
}
else if (dat->GetRTCPDataAddress() != 0)
{
const RTPIPv4Address *addr = (const RTPIPv4Address *)(dat->GetRTPDataAddress());
ip = addr->GetIP();
port = addr->GetPort()-1;
}
else
return;
RTPIPv4Address dest(ip,port);
DeleteDestination(dest);
struct in_addr inaddr;
inaddr.s_addr = htonl(ip);
std::cout << "Deleting destination " << std::string(inet_ntoa(inaddr)) << ":" << port << std::endl;
}
};
//
// The main routine
//
int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
MyRTPSession sess;
u_int16_t portbase,destport;
u_int32_t destip;
std::string ipstr;
int status,i,num;
// First, we'll ask for the necessary information
std::cout << "Enter local portbase:" << std::endl;
std::cin >> portbase;
std::cout << std::endl;
std::cout << std::endl;
std::cout << "Number of seconds you wish to wait:" << std::endl;
std::cin >> num;
// Now, we'll create a RTP session, set the destination
// and poll for incoming data.
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
// IMPORTANT: The local timestamp unit MUST be set, otherwise
// RTCP Sender Report info will be calculated wrong
// In this case, we'll be just use 8000 samples per second.
sessparams.SetOwnTimestampUnit(1.0/8000.0);
sessparams.SetAcceptOwnPackets(true);
transparams.SetPortbase(portbase);
status = sess.Create(sessparams,&transparams);
checkerror(status);
for (i = 1 ; i <= num ; i++)
{
sess.BeginDataAccess();
// check incoming packets
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
while ((pack = sess.GetNextPacket()) != NULL)
{
// You can examine the data here
printf("Got packet !\n");
// we don't longer need the packet, so
// we'll delete it
delete pack;
}
} while (sess.GotoNextSourceWithData());
}
sess.EndDataAccess();
#ifndef RTP_SUPPORT_THREAD
status = sess.Poll();
checkerror(status);
#endif // RTP_SUPPORT_THREAD
RTPTime::Wait(RTPTime(1,0));
}
sess.BYEDestroy(RTPTime(10,0),0,0);
#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}

View File

@ -1,145 +0,0 @@
/*
This IPv4 example uses the background thread itself to process all packets.
You can use example one to send data to the session that's created in this
example.
*/
#include "rtpsession.h"
#include "rtppacket.h"
#include "rtpudpv4transmitter.h"
#include "rtpipv4address.h"
#include "rtpsessionparams.h"
#include "rtperrors.h"
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
#include "rtpsourcedata.h"
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#ifdef RTP_SUPPORT_THREAD
//
// This function checks if there was a RTP error. If so, it displays an error
// message and exists.
//
void checkerror(int rtperr)
{
if (rtperr < 0)
{
std::cout << "ERROR: " << RTPGetErrorString(rtperr) << std::endl;
exit(-1);
}
}
//
// The new class routine
//
class MyRTPSession : public RTPSession
{
protected:
void OnPollThreadStep();
void ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack);
};
void MyRTPSession::OnPollThreadStep()
{
BeginDataAccess();
// check incoming packets
if (GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
RTPSourceData *srcdat;
srcdat = GetCurrentSourceInfo();
while ((pack = GetNextPacket()) != NULL)
{
ProcessRTPPacket(*srcdat,*pack);
delete pack;
}
} while (GotoNextSourceWithData());
}
EndDataAccess();
}
void MyRTPSession::ProcessRTPPacket(const RTPSourceData &srcdat,const RTPPacket &rtppack)
{
// You can inspect the packet and the source's info here
std::cout << "Got packet " << rtppack.GetExtendedSequenceNumber() << " from SSRC " << srcdat.GetSSRC() << std::endl;
}
//
// The main routine
//
int main(void)
{
#ifdef WIN32
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
#endif // WIN32
MyRTPSession sess;
u_int16_t portbase,destport;
u_int32_t destip;
std::string ipstr;
int status,i,num;
// First, we'll ask for the necessary information
std::cout << "Enter local portbase:" << std::endl;
std::cin >> portbase;
std::cout << std::endl;
std::cout << std::endl;
std::cout << "Number of seconds you wish to wait:" << std::endl;
std::cin >> num;
// Now, we'll create a RTP session, set the destination
// and poll for incoming data.
RTPUDPv4TransmissionParams transparams;
RTPSessionParams sessparams;
// IMPORTANT: The local timestamp unit MUST be set, otherwise
// RTCP Sender Report info will be calculated wrong
// In this case, we'll be just use 8000 samples per second.
sessparams.SetOwnTimestampUnit(1.0/8000.0);
transparams.SetPortbase(portbase);
status = sess.Create(sessparams,&transparams);
checkerror(status);
// Wait a number of seconds
RTPTime::Wait(RTPTime(num,0));
sess.BYEDestroy(RTPTime(10,0),0,0);
#ifdef WIN32
WSACleanup();
#endif // WIN32
return 0;
}
#else
int main(void)
{
std::cerr << "Thread support is required for this example" << std::endl;
return 0;
}
#endif // RTP_SUPPORT_THREAD

View File

@ -1,325 +0,0 @@
#!/bin/sh
# install - install a program, script, or datafile
scriptversion=2004-04-01.17
# This originates from X11R5 (mit/util/scripts/install.sh), which was
# later released in X11R6 (xc/config/util/install.sh) with the
# following copyright and license.
#
# Copyright (C) 1994 X Consortium
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to
# deal in the Software without restriction, including without limitation the
# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
# sell copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-
# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#
# Except as contained in this notice, the name of the X Consortium shall not
# be used in advertising or otherwise to promote the sale, use or other deal-
# ings in this Software without prior written authorization from the X Consor-
# tium.
#
#
# FSF changes to this file are in the public domain.
#
# Calling this script install-sh is preferred over install.sh, to prevent
# `make' implicit rules from creating a file called install from it
# when there is no Makefile.
#
# This script is compatible with the BSD install script, but was written
# from scratch. It can only install one file at a time, a restriction
# shared with many OS's install programs.
# set DOITPROG to echo to test this script
# Don't use :- since 4.3BSD and earlier shells don't like it.
doit="${DOITPROG-}"
# put in absolute paths if you don't have them in your path; or use env. vars.
mvprog="${MVPROG-mv}"
cpprog="${CPPROG-cp}"
chmodprog="${CHMODPROG-chmod}"
chownprog="${CHOWNPROG-chown}"
chgrpprog="${CHGRPPROG-chgrp}"
stripprog="${STRIPPROG-strip}"
rmprog="${RMPROG-rm}"
mkdirprog="${MKDIRPROG-mkdir}"
transformbasename=
transform_arg=
instcmd="$mvprog"
chmodcmd="$chmodprog 0755"
chowncmd=
chgrpcmd=
stripcmd=
rmcmd="$rmprog -f"
mvcmd="$mvprog"
src=
dst=
dir_arg=
usage="Usage: $0 [OPTION]... SRCFILE DSTFILE
or: $0 [OPTION]... SRCFILES... DIRECTORY
or: $0 -d DIRECTORIES...
In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default.
In the second, create the directory path DIR.
Options:
-b=TRANSFORMBASENAME
-c copy source (using $cpprog) instead of moving (using $mvprog).
-d create directories instead of installing files.
-g GROUP $chgrp installed files to GROUP.
-m MODE $chmod installed files to MODE.
-o USER $chown installed files to USER.
-s strip installed files (using $stripprog).
-t=TRANSFORM
--help display this help and exit.
--version display version info and exit.
Environment variables override the default commands:
CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG
"
while test -n "$1"; do
case $1 in
-b=*) transformbasename=`echo $1 | sed 's/-b=//'`
shift
continue;;
-c) instcmd=$cpprog
shift
continue;;
-d) dir_arg=true
shift
continue;;
-g) chgrpcmd="$chgrpprog $2"
shift
shift
continue;;
--help) echo "$usage"; exit 0;;
-m) chmodcmd="$chmodprog $2"
shift
shift
continue;;
-o) chowncmd="$chownprog $2"
shift
shift
continue;;
-s) stripcmd=$stripprog
shift
continue;;
-t=*) transformarg=`echo $1 | sed 's/-t=//'`
shift
continue;;
--version) echo "$0 $scriptversion"; exit 0;;
*) # When -d is used, all remaining arguments are directories to create.
test -n "$dir_arg" && break
# Otherwise, the last argument is the destination. Remove it from $@.
for arg
do
if test -n "$dstarg"; then
# $@ is not empty: it contains at least $arg.
set fnord "$@" "$dstarg"
shift # fnord
fi
shift # arg
dstarg=$arg
done
break;;
esac
done
if test -z "$1"; then
if test -z "$dir_arg"; then
echo "$0: no input file specified." >&2
exit 1
fi
# It's OK to call `install-sh -d' without argument.
# This can happen when creating conditional directories.
exit 0
fi
for src
do
# Protect names starting with `-'.
case $src in
-*) src=./$src ;;
esac
if test -n "$dir_arg"; then
dst=$src
src=
if test -d "$dst"; then
instcmd=:
chmodcmd=
else
instcmd=$mkdirprog
fi
else
# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
# might cause directories to be created, which would be especially bad
# if $src (and thus $dsttmp) contains '*'.
if test ! -f "$src" && test ! -d "$src"; then
echo "$0: $src does not exist." >&2
exit 1
fi
if test -z "$dstarg"; then
echo "$0: no destination specified." >&2
exit 1
fi
dst=$dstarg
# Protect names starting with `-'.
case $dst in
-*) dst=./$dst ;;
esac
# If destination is a directory, append the input filename; won't work
# if double slashes aren't ignored.
if test -d "$dst"; then
dst=$dst/`basename "$src"`
fi
fi
# This sed command emulates the dirname command.
dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
# Make sure that the destination directory exists.
# Skip lots of stat calls in the usual case.
if test ! -d "$dstdir"; then
defaultIFS='
'
IFS="${IFS-$defaultIFS}"
oIFS=$IFS
# Some sh's can't handle IFS=/ for some reason.
IFS='%'
set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
IFS=$oIFS
pathcomp=
while test $# -ne 0 ; do
pathcomp=$pathcomp$1
shift
if test ! -d "$pathcomp"; then
$mkdirprog "$pathcomp" || lasterr=$?
# mkdir can fail with a `File exist' error in case several
# install-sh are creating the directory concurrently. This
# is OK.
test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; }
fi
pathcomp=$pathcomp/
done
fi
if test -n "$dir_arg"; then
$doit $instcmd "$dst" \
&& { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; }
else
# If we're going to rename the final executable, determine the name now.
if test -z "$transformarg"; then
dstfile=`basename "$dst"`
else
dstfile=`basename "$dst" $transformbasename \
| sed $transformarg`$transformbasename
fi
# don't allow the sed command to completely eliminate the filename.
test -z "$dstfile" && dstfile=`basename "$dst"`
# Make a couple of temp file names in the proper directory.
dsttmp=$dstdir/_inst.$$_
rmtmp=$dstdir/_rm.$$_
# Trap to clean up those temp files at exit.
trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0
trap '(exit $?); exit' 1 2 13 15
# Move or copy the file name to the temp name
$doit $instcmd "$src" "$dsttmp" &&
# and set any options; do chmod last to preserve setuid bits.
#
# If any of these fail, we abort the whole thing. If we want to
# ignore errors from any of these, just make sure not to ignore
# errors from the above "$doit $instcmd $src $dsttmp" command.
#
{ test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \
&& { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \
&& { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \
&& { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } &&
# Now rename the file to the real destination.
{ $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \
|| {
# The rename failed, perhaps because mv can't rename something else
# to itself, or perhaps because mv is so ancient that it does not
# support -f.
# Now remove or move aside any old file at destination location.
# We try this two ways since rm can't unlink itself on some
# systems and the destination file might be busy for other
# reasons. In this case, the final cleanup might fail but the new
# file should still install successfully.
{
if test -f "$dstdir/$dstfile"; then
$doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \
|| $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \
|| {
echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2
(exit 1); exit
}
else
:
fi
} &&
# Now rename the file to the real destination.
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
}
}
fi || { (exit 1); exit; }
done
# The final little trick to "correctly" pass the exit status to the exit trap.
{
(exit 0); exit
}
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

View File

@ -1,404 +0,0 @@
# Microsoft Developer Studio Project File - Name="jrtplib" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=jrtplib - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "jrtplib.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "jrtplib.mak" CFG="jrtplib - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "jrtplib - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "jrtplib - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "jrtplib - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\jthread-1.1.2\src" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD BASE RSC /l 0x813 /d "NDEBUG"
# ADD RSC /l 0x813 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ELSEIF "$(CFG)" == "jrtplib - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "..\jthread-1.1.2\src" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD BASE RSC /l 0x813 /d "_DEBUG"
# ADD RSC /l 0x813 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo
!ENDIF
# Begin Target
# Name "jrtplib - Win32 Release"
# Name "jrtplib - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\src\rtcpapppacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpbyepacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpcompoundpacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpcompoundpacketbuilder.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcppacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcppacketbuilder.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcprrpacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpscheduler.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsdesinfo.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsdespacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsrpacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpcollisionlist.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpdebug.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtperrors.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpinternalsourcedata.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv4address.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv6address.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtplibraryversion.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtppacket.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtppacketbuilder.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtppollthread.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtprandom.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpsession.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpsessionparams.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpsessionsources.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpsourcedata.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpsources.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtptimeutilities.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpudpv4transmitter.cpp
# End Source File
# Begin Source File
SOURCE=.\src\jrtp4c.cpp
# End Source File
# Begin Source File
SOURCE=.\src\win32\jmutex.cpp
# End Source File
# Begin Source File
SOURCE=.\src\win32\jthread.cpp
# End Source File
# Begin Source File
SOURCE=.\src\rtpudpv6transmitter.cpp
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\src\rtcpapppacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpbyepacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpcompoundpacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpcompoundpacketbuilder.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcppacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcppacketbuilder.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcprrpacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpscheduler.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsdesinfo.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsdespacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpsrpacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtcpunknownpacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpaddress.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpcollisionlist.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpconfig.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpconfig_win.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpdebug.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpdefines.h
# End Source File
# Begin Source File
SOURCE=.\src\rtperrors.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpeventhandler.h
# End Source File
# Begin Source File
SOURCE=.\src\rtphashtable.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpinternalsourcedata.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv4address.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv4destination.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv6address.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpipv6destination.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpkeyhashtable.h
# End Source File
# Begin Source File
SOURCE=.\src\rtplibraryversion.h
# End Source File
# Begin Source File
SOURCE=.\src\rtppacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtppacketbuilder.h
# End Source File
# Begin Source File
SOURCE=.\src\rtppollthread.h
# End Source File
# Begin Source File
SOURCE=.\src\rtprandom.h
# End Source File
# Begin Source File
SOURCE=.\src\rtprawpacket.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpsession.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpsessionparams.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpsessionsources.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpsourcedata.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpsources.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpstructs.h
# End Source File
# Begin Source File
SOURCE=.\src\rtptimeutilities.h
# End Source File
# Begin Source File
SOURCE=.\src\rtptransmitter.h
# End Source File
# Begin Source File
SOURCE=.\src\rtptypes.h
# End Source File
# Begin Source File
SOURCE=.\src\rtptypes_win.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpudpv4transmitter.h
# End Source File
# Begin Source File
SOURCE=.\src\rtpudpv6transmitter.h
# End Source File
# End Group
# End Target
# End Project

View File

@ -1,29 +0,0 @@
Microsoft Developer Studio Workspace File, Format Version 6.00
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
###############################################################################
Project: "jrtplib"=.\jrtplib.dsp - Package Owner=<4>
Package=<5>
{{{
}}}
Package=<4>
{{{
}}}
###############################################################################
Global:
Package=<5>
{{{
}}}
Package=<3>
{{{
}}}
###############################################################################

View File

@ -1,20 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jrtplib", "jrtplib.vcproj", "{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}.Debug|Win32.ActiveCfg = Debug|Win32
{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}.Debug|Win32.Build.0 = Debug|Win32
{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}.Release|Win32.ActiveCfg = Release|Win32
{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,477 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="jrtplib"
ProjectGUID="{D2A2E3F7-BF5F-4D92-A167-1AF302E20950}"
Keyword="Win32Proj"
>
<Platforms>
<Platform
Name="Win32"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Win32"
OutputDirectory="Debug"
IntermediateDirectory="Debug"
ConfigurationType="4"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
Optimization="0"
AdditionalIncludeDirectories="./src;../jthread-1.1.2/src"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;_DEBUG;_LIB;"
MinimalRebuild="true"
BasicRuntimeChecks="3"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="0"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="4"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
<Configuration
Name="Release|Win32"
OutputDirectory="Release"
IntermediateDirectory="Release"
ConfigurationType="4"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
AdditionalIncludeDirectories="./src;../jthread-1.1.2/src"
PreprocessorDefinitions="_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WIN32;NDEBUG;_LIB;"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="0"
Detect64BitPortabilityProblems="true"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCFxCopTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\src\jmutex.h"
>
</File>
<File
RelativePath=".\src\jrtp4c.h"
>
</File>
<File
RelativePath=".\src\jthread.h"
>
</File>
<File
RelativePath=".\src\rtcpapppacket.h"
>
</File>
<File
RelativePath=".\src\rtcpbyepacket.h"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtcppacket.h"
>
</File>
<File
RelativePath=".\src\rtcppacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtcprrpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpscheduler.h"
>
</File>
<File
RelativePath=".\src\rtcpsdesinfo.h"
>
</File>
<File
RelativePath=".\src\rtcpsdespacket.h"
>
</File>
<File
RelativePath=".\src\rtcpsrpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpunknownpacket.h"
>
</File>
<File
RelativePath=".\src\rtpaddress.h"
>
</File>
<File
RelativePath=".\src\rtpcollisionlist.h"
>
</File>
<File
RelativePath=".\src\rtpconfig.h"
>
</File>
<File
RelativePath=".\src\rtpconfig_win.h"
>
</File>
<File
RelativePath=".\src\rtpdebug.h"
>
</File>
<File
RelativePath=".\src\rtpdefines.h"
>
</File>
<File
RelativePath=".\src\rtperrors.h"
>
</File>
<File
RelativePath=".\src\rtphashtable.h"
>
</File>
<File
RelativePath=".\src\rtpinternalsourcedata.h"
>
</File>
<File
RelativePath=".\src\rtpipv4address.h"
>
</File>
<File
RelativePath=".\src\rtpipv4destination.h"
>
</File>
<File
RelativePath=".\src\rtpipv6address.h"
>
</File>
<File
RelativePath=".\src\rtpipv6destination.h"
>
</File>
<File
RelativePath=".\src\rtpkeyhashtable.h"
>
</File>
<File
RelativePath=".\src\rtplibraryversion.h"
>
</File>
<File
RelativePath=".\src\rtppacket.h"
>
</File>
<File
RelativePath=".\src\rtppacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtppollthread.h"
>
</File>
<File
RelativePath=".\src\rtprandom.h"
>
</File>
<File
RelativePath=".\src\rtprawpacket.h"
>
</File>
<File
RelativePath=".\src\rtpsession.h"
>
</File>
<File
RelativePath=".\src\rtpsessionparams.h"
>
</File>
<File
RelativePath=".\src\rtpsessionsources.h"
>
</File>
<File
RelativePath=".\src\rtpsourcedata.h"
>
</File>
<File
RelativePath=".\src\rtpsources.h"
>
</File>
<File
RelativePath=".\src\rtpstructs.h"
>
</File>
<File
RelativePath=".\src\rtptimeutilities.h"
>
</File>
<File
RelativePath=".\src\rtptransmitter.h"
>
</File>
<File
RelativePath=".\src\rtptypes.h"
>
</File>
<File
RelativePath=".\src\rtptypes_win.h"
>
</File>
<File
RelativePath=".\src\rtpudpv4transmitter.h"
>
</File>
<File
RelativePath=".\src\rtpudpv6transmitter.h"
>
</File>
</Filter>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\src\win32\jmutex.cpp"
>
</File>
<File
RelativePath=".\src\jrtp4c.cpp"
>
</File>
<File
RelativePath=".\src\win32\jthread.cpp"
>
</File>
<File
RelativePath=".\src\rtcpapppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpbyepacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtcppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcppacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtcprrpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpscheduler.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsdesinfo.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsdespacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsrpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtpcollisionlist.cpp"
>
</File>
<File
RelativePath=".\src\rtpdebug.cpp"
>
</File>
<File
RelativePath=".\src\rtperrors.cpp"
>
</File>
<File
RelativePath=".\src\rtpinternalsourcedata.cpp"
>
</File>
<File
RelativePath=".\src\rtpipv4address.cpp"
>
</File>
<File
RelativePath=".\src\rtpipv6address.cpp"
>
</File>
<File
RelativePath=".\src\rtplibraryversion.cpp"
>
</File>
<File
RelativePath=".\src\rtppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtppacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtppollthread.cpp"
>
</File>
<File
RelativePath=".\src\rtprandom.cpp"
>
</File>
<File
RelativePath=".\src\rtpsession.cpp"
>
</File>
<File
RelativePath=".\src\rtpsessionparams.cpp"
>
</File>
<File
RelativePath=".\src\rtpsessionsources.cpp"
>
</File>
<File
RelativePath=".\src\rtpsourcedata.cpp"
>
</File>
<File
RelativePath=".\src\rtpsources.cpp"
>
</File>
<File
RelativePath=".\src\rtptimeutilities.cpp"
>
</File>
<File
RelativePath=".\src\rtpudpv4transmitter.cpp"
>
</File>
<File
RelativePath=".\src\rtpudpv6transmitter.cpp"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

View File

@ -1,22 +0,0 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jrtplib_wce", "jrtplib_wce.vcproj", "{93374307-119F-404E-9B09-3642C6FC96C1}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Pocket PC 2003 (ARMV4) = Debug|Pocket PC 2003 (ARMV4)
Release|Pocket PC 2003 (ARMV4) = Release|Pocket PC 2003 (ARMV4)
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{93374307-119F-404E-9B09-3642C6FC96C1}.Debug|Pocket PC 2003 (ARMV4).ActiveCfg = Debug|Pocket PC 2003 (ARMV4)
{93374307-119F-404E-9B09-3642C6FC96C1}.Debug|Pocket PC 2003 (ARMV4).Build.0 = Debug|Pocket PC 2003 (ARMV4)
{93374307-119F-404E-9B09-3642C6FC96C1}.Debug|Pocket PC 2003 (ARMV4).Deploy.0 = Debug|Pocket PC 2003 (ARMV4)
{93374307-119F-404E-9B09-3642C6FC96C1}.Release|Pocket PC 2003 (ARMV4).ActiveCfg = Release|Pocket PC 2003 (ARMV4)
{93374307-119F-404E-9B09-3642C6FC96C1}.Release|Pocket PC 2003 (ARMV4).Build.0 = Release|Pocket PC 2003 (ARMV4)
{93374307-119F-404E-9B09-3642C6FC96C1}.Release|Pocket PC 2003 (ARMV4).Deploy.0 = Release|Pocket PC 2003 (ARMV4)
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@ -1,482 +0,0 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
Version="8.00"
Name="jrtplib_wce"
ProjectGUID="{93374307-119F-404E-9B09-3642C6FC96C1}"
Keyword="Win32Proj"
SignManifests="true"
>
<Platforms>
<Platform
Name="Pocket PC 2003 (ARMV4)"
/>
</Platforms>
<ToolFiles>
</ToolFiles>
<Configurations>
<Configuration
Name="Debug|Pocket PC 2003 (ARMV4)"
OutputDirectory="$(PlatformName)\Debug"
IntermediateDirectory="$(PlatformName)\Debug"
ConfigurationType="4"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
ExecutionBucket="7"
Optimization="0"
AdditionalIncludeDirectories="../jthread-1.1.2/src"
PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;$(PLATFORMDEFINES);_DEBUG;DEBUG;_LIB;$(ARCHFAM);$(_ARCHFAM_);_UNICODE;UNICODE"
MinimalRebuild="true"
RuntimeLibrary="1"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="_DEBUG;_UNICODE;UNICODE;_WIN32_WCE;UNDER_CE"
Culture="1033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM"
OutputFile="$(OutDir)/jrtplib_wce.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
<DeploymentTool
ForceDirty="-1"
RemoteDirectory=""
RegisterOutput="0"
AdditionalFiles=""
/>
<DebuggerTool
/>
</Configuration>
<Configuration
Name="Release|Pocket PC 2003 (ARMV4)"
OutputDirectory="$(PlatformName)\Release"
IntermediateDirectory="$(PlatformName)\Release"
ConfigurationType="4"
CharacterSet="1"
>
<Tool
Name="VCPreBuildEventTool"
/>
<Tool
Name="VCCustomBuildTool"
/>
<Tool
Name="VCXMLDataGeneratorTool"
/>
<Tool
Name="VCWebServiceProxyGeneratorTool"
/>
<Tool
Name="VCMIDLTool"
/>
<Tool
Name="VCCLCompilerTool"
ExecutionBucket="7"
Optimization="2"
AdditionalIncludeDirectories="../jthread-1.1.2/src"
PreprocessorDefinitions="_WIN32_WCE=$(CEVER);UNDER_CE=$(CEVER);WINCE;$(PLATFORMDEFINES);NDEBUG;_LIB;$(ARCHFAM);$(_ARCHFAM_);_UNICODE;UNICODE"
RuntimeLibrary="0"
UsePrecompiledHeader="0"
WarningLevel="3"
DebugInformationFormat="3"
/>
<Tool
Name="VCManagedResourceCompilerTool"
/>
<Tool
Name="VCResourceCompilerTool"
PreprocessorDefinitions="NDEBUG;_UNICODE;UNICODE;_WIN32_WCE;UNDER_CE"
Culture="1033"
AdditionalIncludeDirectories="$(IntDir)"
/>
<Tool
Name="VCPreLinkEventTool"
/>
<Tool
Name="VCLibrarianTool"
AdditionalOptions=" /subsystem:windowsce,4.20 /machine:ARM"
OutputFile="$(OutDir)/jrtplib_wce.lib"
/>
<Tool
Name="VCALinkTool"
/>
<Tool
Name="VCXDCMakeTool"
/>
<Tool
Name="VCBscMakeTool"
/>
<Tool
Name="VCCodeSignTool"
/>
<Tool
Name="VCPostBuildEventTool"
/>
<DeploymentTool
ForceDirty="-1"
RemoteDirectory=""
RegisterOutput="0"
AdditionalFiles=""
/>
<DebuggerTool
/>
</Configuration>
</Configurations>
<References>
</References>
<Files>
<Filter
Name="Source Files"
Filter="cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx"
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}"
>
<File
RelativePath=".\src\rtcpapppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpbyepacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtcppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcppacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtcprrpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpscheduler.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsdesinfo.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsdespacket.cpp"
>
</File>
<File
RelativePath=".\src\rtcpsrpacket.cpp"
>
</File>
<File
RelativePath=".\src\rtpcollisionlist.cpp"
>
</File>
<File
RelativePath=".\src\rtpdebug.cpp"
>
</File>
<File
RelativePath=".\src\rtperrors.cpp"
>
</File>
<File
RelativePath=".\src\rtpinternalsourcedata.cpp"
>
</File>
<File
RelativePath=".\src\rtpipv4address.cpp"
>
</File>
<File
RelativePath=".\src\rtpipv6address.cpp"
>
</File>
<File
RelativePath=".\src\rtplibraryversion.cpp"
>
</File>
<File
RelativePath=".\src\rtppacket.cpp"
>
</File>
<File
RelativePath=".\src\rtppacketbuilder.cpp"
>
</File>
<File
RelativePath=".\src\rtppollthread.cpp"
>
</File>
<File
RelativePath=".\src\rtprandom.cpp"
>
</File>
<File
RelativePath=".\src\rtpsession.cpp"
>
</File>
<File
RelativePath=".\src\rtpsessionparams.cpp"
>
</File>
<File
RelativePath=".\src\rtpsessionsources.cpp"
>
</File>
<File
RelativePath=".\src\rtpsourcedata.cpp"
>
</File>
<File
RelativePath=".\src\rtpsources.cpp"
>
</File>
<File
RelativePath=".\src\rtptimeutilities.cpp"
>
</File>
<File
RelativePath=".\src\rtpudpv4transmitter.cpp"
>
</File>
<File
RelativePath=".\src\rtpudpv6transmitter.cpp"
>
</File>
</Filter>
<Filter
Name="Header Files"
Filter="h;hpp;hxx;hm;inl;inc;xsd"
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}"
>
<File
RelativePath=".\src\rtcpapppacket.h"
>
</File>
<File
RelativePath=".\src\rtcpbyepacket.h"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpcompoundpacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtcppacket.h"
>
</File>
<File
RelativePath=".\src\rtcppacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtcprrpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpscheduler.h"
>
</File>
<File
RelativePath=".\src\rtcpsdesinfo.h"
>
</File>
<File
RelativePath=".\src\rtcpsdespacket.h"
>
</File>
<File
RelativePath=".\src\rtcpsrpacket.h"
>
</File>
<File
RelativePath=".\src\rtcpunknownpacket.h"
>
</File>
<File
RelativePath=".\src\rtpaddress.h"
>
</File>
<File
RelativePath=".\src\rtpcollisionlist.h"
>
</File>
<File
RelativePath=".\src\rtpconfig.h"
>
</File>
<File
RelativePath=".\src\rtpconfig_win.h"
>
</File>
<File
RelativePath=".\src\rtpdebug.h"
>
</File>
<File
RelativePath=".\src\rtpdefines.h"
>
</File>
<File
RelativePath=".\src\rtperrors.h"
>
</File>
<File
RelativePath=".\src\rtphashtable.h"
>
</File>
<File
RelativePath=".\src\rtpinternalsourcedata.h"
>
</File>
<File
RelativePath=".\src\rtpipv4address.h"
>
</File>
<File
RelativePath=".\src\rtpipv4destination.h"
>
</File>
<File
RelativePath=".\src\rtpipv6address.h"
>
</File>
<File
RelativePath=".\src\rtpipv6destination.h"
>
</File>
<File
RelativePath=".\src\rtpkeyhashtable.h"
>
</File>
<File
RelativePath=".\src\rtplibraryversion.h"
>
</File>
<File
RelativePath=".\src\rtppacket.h"
>
</File>
<File
RelativePath=".\src\rtppacketbuilder.h"
>
</File>
<File
RelativePath=".\src\rtppollthread.h"
>
</File>
<File
RelativePath=".\src\rtprandom.h"
>
</File>
<File
RelativePath=".\src\rtprawpacket.h"
>
</File>
<File
RelativePath=".\src\rtpsession.h"
>
</File>
<File
RelativePath=".\src\rtpsessionparams.h"
>
</File>
<File
RelativePath=".\src\rtpsessionsources.h"
>
</File>
<File
RelativePath=".\src\rtpsourcedata.h"
>
</File>
<File
RelativePath=".\src\rtpsources.h"
>
</File>
<File
RelativePath=".\src\rtpstructs.h"
>
</File>
<File
RelativePath=".\src\rtptimeutilities.h"
>
</File>
<File
RelativePath=".\src\rtptransmitter.h"
>
</File>
<File
RelativePath=".\src\rtptypes.h"
>
</File>
<File
RelativePath=".\src\rtptypes_win.h"
>
</File>
<File
RelativePath=".\src\rtpudpv4transmitter.h"
>
</File>
<File
RelativePath=".\src\rtpudpv6transmitter.h"
>
</File>
</Filter>
</Files>
<Globals>
</Globals>
</VisualStudioProject>

File diff suppressed because it is too large Load Diff

View File

@ -1,360 +0,0 @@
#! /bin/sh
# Common stub for a few missing GNU programs while installing.
scriptversion=2003-09-02.23
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003
# Free Software Foundation, Inc.
# Originally by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.
# 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, 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.
if test $# -eq 0; then
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
fi
run=:
# In the cases where this matters, `missing' is being run in the
# srcdir already.
if test -f configure.ac; then
configure_ac=configure.ac
else
configure_ac=configure.in
fi
msg="missing on your system"
case "$1" in
--run)
# Try to run requested program, and just exit if it succeeds.
run=
shift
"$@" && exit 0
# Exit code 63 means version mismatch. This often happens
# when the user try to use an ancient version of a tool on
# a file that requires a minimum version. In this case we
# we should proceed has if the program had been absent, or
# if --run hadn't been passed.
if test $? = 63; then
run=:
msg="probably too old"
fi
;;
esac
# If it does not exist, or fails to run (possibly an outdated version),
# try to emulate it.
case "$1" in
-h|--h|--he|--hel|--help)
echo "\
$0 [OPTION]... PROGRAM [ARGUMENT]...
Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an
error status if there is no known handling for PROGRAM.
Options:
-h, --help display this help and exit
-v, --version output version information and exit
--run try to run the given command, and emulate it if it fails
Supported PROGRAM values:
aclocal touch file \`aclocal.m4'
autoconf touch file \`configure'
autoheader touch file \`config.h.in'
automake touch all \`Makefile.in' files
bison create \`y.tab.[ch]', if possible, from existing .[ch]
flex create \`lex.yy.c', if possible, from existing .c
help2man touch the output file
lex create \`lex.yy.c', if possible, from existing .c
makeinfo touch the output file
tar try tar, gnutar, gtar, then tar without non-portable flags
yacc create \`y.tab.[ch]', if possible, from existing .[ch]
Send bug reports to <bug-automake@gnu.org>."
;;
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
echo "missing $scriptversion (GNU Automake)"
;;
-*)
echo 1>&2 "$0: Unknown \`$1' option"
echo 1>&2 "Try \`$0 --help' for more information"
exit 1
;;
aclocal*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acinclude.m4' or \`${configure_ac}'. You might want
to install the \`Automake' and \`Perl' packages. Grab them from
any GNU archive site."
touch aclocal.m4
;;
autoconf)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`${configure_ac}'. You might want to install the
\`Autoconf' and \`GNU m4' packages. Grab them from any GNU
archive site."
touch configure
;;
autoheader)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`acconfig.h' or \`${configure_ac}'. You might want
to install the \`Autoconf' and \`GNU m4' packages. Grab them
from any GNU archive site."
files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}`
test -z "$files" && files="config.h"
touch_files=
for f in $files; do
case "$f" in
*:*) touch_files="$touch_files "`echo "$f" |
sed -e 's/^[^:]*://' -e 's/:.*//'`;;
*) touch_files="$touch_files $f.in";;
esac
done
touch $touch_files
;;
automake*)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'.
You might want to install the \`Automake' and \`Perl' packages.
Grab them from any GNU archive site."
find . -type f -name Makefile.am -print |
sed 's/\.am$/.in/' |
while read f; do touch "$f"; done
;;
autom4te)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is needed, but is $msg.
You might have modified some files without having the
proper tools for further handling them.
You can get \`$1' as part of \`Autoconf' from any GNU
archive site."
file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'`
test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'`
if test -f "$file"; then
touch $file
else
test -z "$file" || exec >$file
echo "#! /bin/sh"
echo "# Created by GNU Automake missing as a replacement of"
echo "# $ $@"
echo "exit 0"
chmod +x $file
exit 1
fi
;;
bison|yacc)
echo 1>&2 "\
WARNING: \`$1' $msg. You should only need it if
you modified a \`.y' file. You may need the \`Bison' package
in order for those modifications to take effect. You can get
\`Bison' from any GNU archive site."
rm -f y.tab.c y.tab.h
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.y)
SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.c
fi
SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" y.tab.h
fi
;;
esac
fi
if [ ! -f y.tab.h ]; then
echo >y.tab.h
fi
if [ ! -f y.tab.c ]; then
echo 'main() { return 0; }' >y.tab.c
fi
;;
lex|flex)
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.l' file. You may need the \`Flex' package
in order for those modifications to take effect. You can get
\`Flex' from any GNU archive site."
rm -f lex.yy.c
if [ $# -ne 1 ]; then
eval LASTARG="\${$#}"
case "$LASTARG" in
*.l)
SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'`
if [ -f "$SRCFILE" ]; then
cp "$SRCFILE" lex.yy.c
fi
;;
esac
fi
if [ ! -f lex.yy.c ]; then
echo 'main() { return 0; }' >lex.yy.c
fi
;;
help2man)
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
# We have it, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a dependency of a manual page. You may need the
\`Help2man' package in order for those modifications to take
effect. You can get \`Help2man' from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'`
fi
if [ -f "$file" ]; then
touch $file
else
test -z "$file" || exec >$file
echo ".ab help2man is required to generate this page"
exit 1
fi
;;
makeinfo)
if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then
# We have makeinfo, but it failed.
exit 1
fi
echo 1>&2 "\
WARNING: \`$1' is $msg. You should only need it if
you modified a \`.texi' or \`.texinfo' file, or any other file
indirectly affecting the aspect of the manual. The spurious
call might also be the consequence of using a buggy \`make' (AIX,
DU, IRIX). You might want to install the \`Texinfo' package or
the \`GNU make' package. Grab either from any GNU archive site."
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
if test -z "$file"; then
file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file`
fi
touch $file
;;
tar)
shift
if test -n "$run"; then
echo 1>&2 "ERROR: \`tar' requires --run"
exit 1
fi
# We have already tried tar in the generic part.
# Look for gnutar/gtar before invocation to avoid ugly error
# messages.
if (gnutar --version > /dev/null 2>&1); then
gnutar "$@" && exit 0
fi
if (gtar --version > /dev/null 2>&1); then
gtar "$@" && exit 0
fi
firstarg="$1"
if shift; then
case "$firstarg" in
*o*)
firstarg=`echo "$firstarg" | sed s/o//`
tar "$firstarg" "$@" && exit 0
;;
esac
case "$firstarg" in
*h*)
firstarg=`echo "$firstarg" | sed s/h//`
tar "$firstarg" "$@" && exit 0
;;
esac
fi
echo 1>&2 "\
WARNING: I can't seem to be able to run \`tar' with the given arguments.
You may want to install GNU tar or Free paxutils, or check the
command line arguments."
exit 1
;;
*)
echo 1>&2 "\
WARNING: \`$1' is needed, and is $msg.
You might have modified some files without having the
proper tools for further handling them. Check the \`README' file,
it often tells you about the needed prerequisites for installing
this package. You may also peek at any GNU archive site, in case
some other package would contain this missing \`$1' program."
exit 1
;;
esac
exit 0
# Local variables:
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

View File

@ -1,150 +0,0 @@
#! /bin/sh
# mkinstalldirs --- make directory hierarchy
scriptversion=2004-02-15.20
# Original author: Noah Friedman <friedman@prep.ai.mit.edu>
# Created: 1993-05-16
# Public domain.
#
# This file is maintained in Automake, please report
# bugs to <bug-automake@gnu.org> or send patches to
# <automake-patches@gnu.org>.
errstatus=0
dirmode=""
usage="\
Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ...
Create each directory DIR (with mode MODE, if specified), including all
leading file name components.
Report bugs to <bug-automake@gnu.org>."
# process command line arguments
while test $# -gt 0 ; do
case $1 in
-h | --help | --h*) # -h for help
echo "$usage"
exit 0
;;
-m) # -m PERM arg
shift
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
dirmode=$1
shift
;;
--version)
echo "$0 $scriptversion"
exit 0
;;
--) # stop option processing
shift
break
;;
-*) # unknown option
echo "$usage" 1>&2
exit 1
;;
*) # first non-opt arg
break
;;
esac
done
for file
do
if test -d "$file"; then
shift
else
break
fi
done
case $# in
0) exit 0 ;;
esac
# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and
# mkdir -p a/c at the same time, both will detect that a is missing,
# one will create a, then the other will try to create a and die with
# a "File exists" error. This is a problem when calling mkinstalldirs
# from a parallel make. We use --version in the probe to restrict
# ourselves to GNU mkdir, which is thread-safe.
case $dirmode in
'')
if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
echo "mkdir -p -- $*"
exec mkdir -p -- "$@"
else
# On NextStep and OpenStep, the `mkdir' command does not
# recognize any option. It will interpret all options as
# directories to create, and then abort because `.' already
# exists.
test -d ./-p && rmdir ./-p
test -d ./--version && rmdir ./--version
fi
;;
*)
if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 &&
test ! -d ./--version; then
echo "mkdir -m $dirmode -p -- $*"
exec mkdir -m "$dirmode" -p -- "$@"
else
# Clean up after NextStep and OpenStep mkdir.
for d in ./-m ./-p ./--version "./$dirmode";
do
test -d $d && rmdir $d
done
fi
;;
esac
for file
do
set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'`
shift
pathcomp=
for d
do
pathcomp="$pathcomp$d"
case $pathcomp in
-*) pathcomp=./$pathcomp ;;
esac
if test ! -d "$pathcomp"; then
echo "mkdir $pathcomp"
mkdir "$pathcomp" || lasterr=$?
if test ! -d "$pathcomp"; then
errstatus=$lasterr
else
if test ! -z "$dirmode"; then
echo "chmod $dirmode $pathcomp"
lasterr=""
chmod "$dirmode" "$pathcomp" || lasterr=$?
if test ! -z "$lasterr"; then
errstatus=$lasterr
fi
fi
fi
fi
pathcomp="$pathcomp/"
done
done
exit $errstatus
# Local Variables:
# mode: shell-script
# sh-indentation: 2
# eval: (add-hook 'write-file-hooks 'time-stamp)
# time-stamp-start: "scriptversion="
# time-stamp-format: "%:y-%02m-%02d.%02H"
# time-stamp-end: "$"
# End:

View File

@ -1,17 +0,0 @@
### all of the standard pc files we need to generate
pcfiles = \
jrtplib.pc
pcfiles_uninstalled = \
jrtplib-uninstalled.pc
all-local: $(pcfiles) $(pcfiles_uninstalled)
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pcfiles)
EXTRA_DIST = \
jrtplib.pc.in \
jrtplib-uninstalled.pc.in
CLEANFILES = $(pcfiles) $(pcfiles_uninstalled)

View File

@ -1,380 +0,0 @@
# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = pkgconfig
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/jrtplib-uninstalled.pc.in $(srcdir)/jrtplib.pc.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES = jrtplib.pc jrtplib-uninstalled.pc
SOURCES =
DIST_SOURCES =
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(pkgconfigdir)"
pkgconfigDATA_INSTALL = $(INSTALL_DATA)
DATA = $(pkgconfig_DATA)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
RTP_ENDIAN = @RTP_ENDIAN@
RTP_FILIO = @RTP_FILIO@
RTP_GSTINCLUDES = @RTP_GSTINCLUDES@
RTP_HAVE_SOCKADDR_LEN = @RTP_HAVE_SOCKADDR_LEN@
RTP_LINKLIBS = @RTP_LINKLIBS@
RTP_SOCKIO = @RTP_SOCKIO@
RTP_SOCKLENTYPE_UINT = @RTP_SOCKLENTYPE_UINT@
RTP_SUPPORT_GETLOGINR = @RTP_SUPPORT_GETLOGINR@
RTP_SUPPORT_GNUDRAND = @RTP_SUPPORT_GNUDRAND@
RTP_SUPPORT_GST = @RTP_SUPPORT_GST@
RTP_SUPPORT_IFADDRS = @RTP_SUPPORT_IFADDRS@
RTP_SUPPORT_INLINETEMPLATEPARAM = @RTP_SUPPORT_INLINETEMPLATEPARAM@
RTP_SUPPORT_IPV4MULTICAST = @RTP_SUPPORT_IPV4MULTICAST@
RTP_SUPPORT_IPV6 = @RTP_SUPPORT_IPV6@
RTP_SUPPORT_IPV6MULTICAST = @RTP_SUPPORT_IPV6MULTICAST@
RTP_SUPPORT_PROBATION = @RTP_SUPPORT_PROBATION@
RTP_SUPPORT_RANDR = @RTP_SUPPORT_RANDR@
RTP_SUPPORT_SDESPRIV = @RTP_SUPPORT_SDESPRIV@
RTP_SUPPORT_THREAD = @RTP_SUPPORT_THREAD@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
### all of the standard pc files we need to generate
pcfiles = \
jrtplib.pc
pcfiles_uninstalled = \
jrtplib-uninstalled.pc
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = $(pcfiles)
EXTRA_DIST = \
jrtplib.pc.in \
jrtplib-uninstalled.pc.in
CLEANFILES = $(pcfiles) $(pcfiles_uninstalled)
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu pkgconfig/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu pkgconfig/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
jrtplib.pc: $(top_builddir)/config.status $(srcdir)/jrtplib.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
jrtplib-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/jrtplib-uninstalled.pc.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
install-pkgconfigDATA: $(pkgconfig_DATA)
@$(NORMAL_INSTALL)
test -z "$(pkgconfigdir)" || $(mkdir_p) "$(DESTDIR)$(pkgconfigdir)"
@list='$(pkgconfig_DATA)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(pkgconfigDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
$(pkgconfigDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgconfigdir)/$$f"; \
done
uninstall-pkgconfigDATA:
@$(NORMAL_UNINSTALL)
@list='$(pkgconfig_DATA)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(pkgconfigdir)/$$f'"; \
rm -f "$(DESTDIR)$(pkgconfigdir)/$$f"; \
done
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(DATA) all-local
installdirs:
for dir in "$(DESTDIR)$(pkgconfigdir)"; do \
test -z "$$dir" || $(mkdir_p) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-libtool
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-pkgconfigDATA
install-exec-am:
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am uninstall-pkgconfigDATA
.PHONY: all all-am all-local check check-am clean clean-generic \
clean-libtool distclean distclean-generic distclean-libtool \
distdir dvi dvi-am html html-am info info-am install \
install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am install-man \
install-pkgconfigDATA install-strip installcheck \
installcheck-am installdirs maintainer-clean \
maintainer-clean-generic mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am uninstall uninstall-am \
uninstall-info-am uninstall-pkgconfigDATA
all-local: $(pcfiles) $(pcfiles_uninstalled)
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,12 +0,0 @@
# the standard variables don't make sense for an uninstalled copy
prefix=
exec_prefix=
libdir=${pcfiledir}/..
includedir=${pcfiledir}/..
Name: Jrtplib Uninstalled
Description: Full featured RTP library, Not Installed
Version: @VERSION@
Requires:
Libs: ${libdir}/src/libjrtp.la
Cflags: -I${includedir} -I${includedir}/src

View File

@ -1,11 +0,0 @@
prefix=@prefix@
exec_prefix=@exec_prefix@
libdir=@libdir@
includedir=@includedir@/jrtplib3
Name: Jrtplib
Description: An full featured RTP library
Requires:
Version: @VERSION@
Libs: -L${libdir} -ljrtp
Cflags: -I${includedir}

View File

@ -1,37 +0,0 @@
lib_LTLIBRARIES = libjrtp.la
libjrtp_la_SOURCES = rtpdebug.cpp rtpsession.cpp rtpconfig_win.h \
rtperrors.cpp rtpudpv4transmitter.cpp \
rtcpsdesinfo.cpp rtppollthread.cpp rtppacket.cpp \
rtppacketbuilder.cpp rtpsessionparams.cpp \
rtpsources.cpp rtpinternalsourcedata.cpp \
rtpsourcedata.cpp rtpipv4address.cpp \
rtcpcompoundpacket.cpp jrtp4c.cpp\
rtcpapppacket.cpp rtcpbyepacket.cpp \
rtcprrpacket.cpp rtcpsdespacket.cpp \
rtcpsrpacket.cpp rtplibraryversion.cpp \
rtcppacket.cpp rtcpcompoundpacketbuilder.cpp \
rtprandom.cpp rtcpscheduler.cpp \
rtcppacketbuilder.cpp rtpsessionsources.cpp \
rtpcollisionlist.cpp rtpipv6address.cpp \
rtpudpv6transmitter.cpp rtptimeutilities.cpp \
rtpgsttransmitter.cpp pthread/jmutex.cpp pthread/jthread.cpp
libjrtp_la_LDFLAGS = -release 3.3.0 @RTP_LINKLIBS@
libjrtpinclude_HEADERS = rtcpapppacket.h rtcpbyepacket.h rtcpcompoundpacket.h \
rtcpcompoundpacketbuilder.h rtcppacket.h rtcppacketbuilder.h \
rtcprrpacket.h rtcpscheduler.h rtcpsdesinfo.h rtcpsdespacket.h \
rtcpsrpacket.h rtcpunknownpacket.h rtpaddress.h rtpconfig.h \
rtpconfig_win.h rtpdebug.h rtpdefines.h rtperrors.h rtphashtable.h \
rtpconfig_unix.h rtpinternalsourcedata.h rtpipv4address.h \
rtpipv4destination.h rtpkeyhashtable.h rtplibraryversion.h rtppacket.h \
rtppacketbuilder.h rtppollthread.h rtprandom.h rtprawpacket.h \
rtpsession.h rtpsessionparams.h rtpsourcedata.h rtpsources.h \
rtpstructs.h rtptimeutilities.h rtptransmitter.h \
rtptypes_win.h rtpudpv4transmitter.h rtpsessionsources.h \
rtpcollisionlist.h rtpipv6address.h rtpipv6destination.h \
rtpudpv6transmitter.h rtptypes.h rtptypes_unix.h \
rtpgsttransmitter.h jmutex.h jthread.h jrtp4c.h
EXTRA_DIST = rtpconfig_unix.h.in win32/jthread.cpp win32/jmutex.cpp
libjrtpincludedir = ${includedir}/jrtplib3
INCLUDES = @RTP_GSTINCLUDES@

View File

@ -1,593 +0,0 @@
# Makefile.in generated by automake 1.9.6 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
srcdir = @srcdir@
top_srcdir = @top_srcdir@
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
top_builddir = ..
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
INSTALL = @INSTALL@
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
subdir = src
DIST_COMMON = $(libjrtpinclude_HEADERS) $(srcdir)/Makefile.am \
$(srcdir)/Makefile.in $(srcdir)/rtpconfig_unix.h.in
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/configure.in
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs
CONFIG_CLEAN_FILES = rtpconfig_unix.h
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \
$(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
*) f=$$p;; \
esac;
am__strip_dir = `echo $$p | sed -e 's|^.*/||'`;
am__installdirs = "$(DESTDIR)$(libdir)" \
"$(DESTDIR)$(libjrtpincludedir)"
libLTLIBRARIES_INSTALL = $(INSTALL)
LTLIBRARIES = $(lib_LTLIBRARIES)
libjrtp_la_LIBADD =
am_libjrtp_la_OBJECTS = rtpdebug.lo rtpsession.lo rtperrors.lo \
rtpudpv4transmitter.lo rtcpsdesinfo.lo rtppollthread.lo \
rtppacket.lo rtppacketbuilder.lo rtpsessionparams.lo \
rtpsources.lo rtpinternalsourcedata.lo rtpsourcedata.lo \
rtpipv4address.lo rtcpcompoundpacket.lo jrtp4c.lo \
rtcpapppacket.lo rtcpbyepacket.lo rtcprrpacket.lo \
rtcpsdespacket.lo rtcpsrpacket.lo rtplibraryversion.lo \
rtcppacket.lo rtcpcompoundpacketbuilder.lo rtprandom.lo \
rtcpscheduler.lo rtcppacketbuilder.lo rtpsessionsources.lo \
rtpcollisionlist.lo rtpipv6address.lo rtpudpv6transmitter.lo \
rtptimeutilities.lo rtpgsttransmitter.lo jmutex.lo jthread.lo
libjrtp_la_OBJECTS = $(am_libjrtp_la_OBJECTS)
DEFAULT_INCLUDES = -I. -I$(srcdir)
depcomp = $(SHELL) $(top_srcdir)/depcomp
am__depfiles_maybe = depfiles
CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
LTCXXCOMPILE = $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CXXFLAGS) $(CXXFLAGS)
CXXLD = $(CXX)
CXXLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXXLD) $(AM_CXXFLAGS) \
$(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
LTCOMPILE = $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) \
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
$(AM_CFLAGS) $(CFLAGS)
CCLD = $(CC)
LINK = $(LIBTOOL) --tag=CC --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(AM_LDFLAGS) $(LDFLAGS) -o $@
SOURCES = $(libjrtp_la_SOURCES)
DIST_SOURCES = $(libjrtp_la_SOURCES)
libjrtpincludeHEADERS_INSTALL = $(INSTALL_HEADER)
HEADERS = $(libjrtpinclude_HEADERS)
ETAGS = etags
CTAGS = ctags
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
AMDEP_FALSE = @AMDEP_FALSE@
AMDEP_TRUE = @AMDEP_TRUE@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CXX = @CXX@
CXXCPP = @CXXCPP@
CXXDEPMODE = @CXXDEPMODE@
CXXFLAGS = @CXXFLAGS@
CYGPATH_W = @CYGPATH_W@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
ECHO = @ECHO@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
F77 = @F77@
FFLAGS = @FFLAGS@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
LDFLAGS = @LDFLAGS@
LIBOBJS = @LIBOBJS@
LIBS = @LIBS@
LIBTOOL = @LIBTOOL@
LN_S = @LN_S@
LTLIBOBJS = @LTLIBOBJS@
MAKEINFO = @MAKEINFO@
OBJEXT = @OBJEXT@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
RANLIB = @RANLIB@
RTP_ENDIAN = @RTP_ENDIAN@
RTP_FILIO = @RTP_FILIO@
RTP_GSTINCLUDES = @RTP_GSTINCLUDES@
RTP_HAVE_SOCKADDR_LEN = @RTP_HAVE_SOCKADDR_LEN@
RTP_LINKLIBS = @RTP_LINKLIBS@
RTP_SOCKIO = @RTP_SOCKIO@
RTP_SOCKLENTYPE_UINT = @RTP_SOCKLENTYPE_UINT@
RTP_SUPPORT_GETLOGINR = @RTP_SUPPORT_GETLOGINR@
RTP_SUPPORT_GNUDRAND = @RTP_SUPPORT_GNUDRAND@
RTP_SUPPORT_GST = @RTP_SUPPORT_GST@
RTP_SUPPORT_IFADDRS = @RTP_SUPPORT_IFADDRS@
RTP_SUPPORT_INLINETEMPLATEPARAM = @RTP_SUPPORT_INLINETEMPLATEPARAM@
RTP_SUPPORT_IPV4MULTICAST = @RTP_SUPPORT_IPV4MULTICAST@
RTP_SUPPORT_IPV6 = @RTP_SUPPORT_IPV6@
RTP_SUPPORT_IPV6MULTICAST = @RTP_SUPPORT_IPV6MULTICAST@
RTP_SUPPORT_PROBATION = @RTP_SUPPORT_PROBATION@
RTP_SUPPORT_RANDR = @RTP_SUPPORT_RANDR@
RTP_SUPPORT_SDESPRIV = @RTP_SUPPORT_SDESPRIV@
RTP_SUPPORT_THREAD = @RTP_SUPPORT_THREAD@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
VERSION = @VERSION@
ac_ct_AR = @ac_ct_AR@
ac_ct_CC = @ac_ct_CC@
ac_ct_CXX = @ac_ct_CXX@
ac_ct_F77 = @ac_ct_F77@
ac_ct_RANLIB = @ac_ct_RANLIB@
ac_ct_STRIP = @ac_ct_STRIP@
am__fastdepCC_FALSE = @am__fastdepCC_FALSE@
am__fastdepCC_TRUE = @am__fastdepCC_TRUE@
am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@
am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
datadir = @datadir@
exec_prefix = @exec_prefix@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localstatedir = @localstatedir@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
prefix = @prefix@
program_transform_name = @program_transform_name@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
lib_LTLIBRARIES = libjrtp.la
libjrtp_la_SOURCES = rtpdebug.cpp rtpsession.cpp rtpconfig_win.h \
rtperrors.cpp rtpudpv4transmitter.cpp \
rtcpsdesinfo.cpp rtppollthread.cpp rtppacket.cpp \
rtppacketbuilder.cpp rtpsessionparams.cpp \
rtpsources.cpp rtpinternalsourcedata.cpp \
rtpsourcedata.cpp rtpipv4address.cpp \
rtcpcompoundpacket.cpp jrtp4c.cpp\
rtcpapppacket.cpp rtcpbyepacket.cpp \
rtcprrpacket.cpp rtcpsdespacket.cpp \
rtcpsrpacket.cpp rtplibraryversion.cpp \
rtcppacket.cpp rtcpcompoundpacketbuilder.cpp \
rtprandom.cpp rtcpscheduler.cpp \
rtcppacketbuilder.cpp rtpsessionsources.cpp \
rtpcollisionlist.cpp rtpipv6address.cpp \
rtpudpv6transmitter.cpp rtptimeutilities.cpp \
rtpgsttransmitter.cpp pthread/jmutex.cpp pthread/jthread.cpp
libjrtp_la_LDFLAGS = -release 3.3.0 @RTP_LINKLIBS@
libjrtpinclude_HEADERS = rtcpapppacket.h rtcpbyepacket.h rtcpcompoundpacket.h \
rtcpcompoundpacketbuilder.h rtcppacket.h rtcppacketbuilder.h \
rtcprrpacket.h rtcpscheduler.h rtcpsdesinfo.h rtcpsdespacket.h \
rtcpsrpacket.h rtcpunknownpacket.h rtpaddress.h rtpconfig.h \
rtpconfig_win.h rtpdebug.h rtpdefines.h rtperrors.h rtphashtable.h \
rtpconfig_unix.h rtpinternalsourcedata.h rtpipv4address.h \
rtpipv4destination.h rtpkeyhashtable.h rtplibraryversion.h rtppacket.h \
rtppacketbuilder.h rtppollthread.h rtprandom.h rtprawpacket.h \
rtpsession.h rtpsessionparams.h rtpsourcedata.h rtpsources.h \
rtpstructs.h rtptimeutilities.h rtptransmitter.h \
rtptypes_win.h rtpudpv4transmitter.h rtpsessionsources.h \
rtpcollisionlist.h rtpipv6address.h rtpipv6destination.h \
rtpudpv6transmitter.h rtptypes.h rtptypes_unix.h \
rtpgsttransmitter.h jmutex.h jthread.h jrtp4c.h
EXTRA_DIST = rtpconfig_unix.h.in win32/jthread.cpp win32/jmutex.cpp
libjrtpincludedir = ${includedir}/jrtplib3
INCLUDES = @RTP_GSTINCLUDES@
all: all-am
.SUFFIXES:
.SUFFIXES: .cpp .lo .o .obj
$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \
&& exit 0; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \
cd $(top_srcdir) && \
$(AUTOMAKE) --gnu src/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
rtpconfig_unix.h: $(top_builddir)/config.status $(srcdir)/rtpconfig_unix.h.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
install-libLTLIBRARIES: $(lib_LTLIBRARIES)
@$(NORMAL_INSTALL)
test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)"
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
if test -f $$p; then \
f=$(am__strip_dir) \
echo " $(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \
$(LIBTOOL) --mode=install $(libLTLIBRARIES_INSTALL) $(INSTALL_STRIP_FLAG) "$$p" "$(DESTDIR)$(libdir)/$$f"; \
else :; fi; \
done
uninstall-libLTLIBRARIES:
@$(NORMAL_UNINSTALL)
@set -x; list='$(lib_LTLIBRARIES)'; for p in $$list; do \
p=$(am__strip_dir) \
echo " $(LIBTOOL) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$p'"; \
$(LIBTOOL) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$p"; \
done
clean-libLTLIBRARIES:
-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
@list='$(lib_LTLIBRARIES)'; for p in $$list; do \
dir="`echo $$p | sed -e 's|/[^/]*$$||'`"; \
test "$$dir" != "$$p" || dir=.; \
echo "rm -f \"$${dir}/so_locations\""; \
rm -f "$${dir}/so_locations"; \
done
libjrtp.la: $(libjrtp_la_OBJECTS) $(libjrtp_la_DEPENDENCIES)
$(CXXLINK) -rpath $(libdir) $(libjrtp_la_LDFLAGS) $(libjrtp_la_OBJECTS) $(libjrtp_la_LIBADD) $(LIBS)
mostlyclean-compile:
-rm -f *.$(OBJEXT)
distclean-compile:
-rm -f *.tab.c
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jmutex.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jrtp4c.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jthread.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpapppacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpbyepacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpcompoundpacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpcompoundpacketbuilder.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcppacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcppacketbuilder.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcprrpacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpscheduler.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpsdesinfo.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpsdespacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtcpsrpacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpcollisionlist.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpdebug.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtperrors.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpgsttransmitter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpinternalsourcedata.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpipv4address.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpipv6address.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtplibraryversion.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtppacket.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtppacketbuilder.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtppollthread.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtprandom.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpsession.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpsessionparams.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpsessionsources.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpsourcedata.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpsources.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtptimeutilities.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpudpv4transmitter.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rtpudpv6transmitter.Plo@am__quote@
.cpp.o:
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ $<
.cpp.obj:
@am__fastdepCXX_TRUE@ if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.cpp.lo:
@am__fastdepCXX_TRUE@ if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LTCXXCOMPILE) -c -o $@ $<
jmutex.lo: pthread/jmutex.cpp
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT jmutex.lo -MD -MP -MF "$(DEPDIR)/jmutex.Tpo" -c -o jmutex.lo `test -f 'pthread/jmutex.cpp' || echo '$(srcdir)/'`pthread/jmutex.cpp; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/jmutex.Tpo" "$(DEPDIR)/jmutex.Plo"; else rm -f "$(DEPDIR)/jmutex.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='pthread/jmutex.cpp' object='jmutex.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o jmutex.lo `test -f 'pthread/jmutex.cpp' || echo '$(srcdir)/'`pthread/jmutex.cpp
jthread.lo: pthread/jthread.cpp
@am__fastdepCXX_TRUE@ if $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -MT jthread.lo -MD -MP -MF "$(DEPDIR)/jthread.Tpo" -c -o jthread.lo `test -f 'pthread/jthread.cpp' || echo '$(srcdir)/'`pthread/jthread.cpp; \
@am__fastdepCXX_TRUE@ then mv -f "$(DEPDIR)/jthread.Tpo" "$(DEPDIR)/jthread.Plo"; else rm -f "$(DEPDIR)/jthread.Tpo"; exit 1; fi
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ source='pthread/jthread.cpp' object='jthread.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCXX_FALSE@ $(LIBTOOL) --tag=CXX --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) -c -o jthread.lo `test -f 'pthread/jthread.cpp' || echo '$(srcdir)/'`pthread/jthread.cpp
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
distclean-libtool:
-rm -f libtool
uninstall-info-am:
install-libjrtpincludeHEADERS: $(libjrtpinclude_HEADERS)
@$(NORMAL_INSTALL)
test -z "$(libjrtpincludedir)" || $(mkdir_p) "$(DESTDIR)$(libjrtpincludedir)"
@list='$(libjrtpinclude_HEADERS)'; for p in $$list; do \
if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
f=$(am__strip_dir) \
echo " $(libjrtpincludeHEADERS_INSTALL) '$$d$$p' '$(DESTDIR)$(libjrtpincludedir)/$$f'"; \
$(libjrtpincludeHEADERS_INSTALL) "$$d$$p" "$(DESTDIR)$(libjrtpincludedir)/$$f"; \
done
uninstall-libjrtpincludeHEADERS:
@$(NORMAL_UNINSTALL)
@list='$(libjrtpinclude_HEADERS)'; for p in $$list; do \
f=$(am__strip_dir) \
echo " rm -f '$(DESTDIR)$(libjrtpincludedir)/$$f'"; \
rm -f "$(DESTDIR)$(libjrtpincludedir)/$$f"; \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$tags $$unique; \
fi
ctags: CTAGS
CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
tags=; \
here=`pwd`; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) ' { files[$$0] = 1; } \
END { for (i in files) print i; }'`; \
test -z "$(CTAGS_ARGS)$$tags$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$tags $$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& cd $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) $$here
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
$(mkdir_p) $(distdir)/win32
@srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \
list='$(DISTFILES)'; for file in $$list; do \
case $$file in \
$(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \
$(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \
esac; \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \
if test "$$dir" != "$$file" && test "$$dir" != "."; then \
dir="/$$dir"; \
$(mkdir_p) "$(distdir)$$dir"; \
else \
dir=''; \
fi; \
if test -d $$d/$$file; then \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \
fi; \
cp -pR $$d/$$file $(distdir)$$dir || exit 1; \
else \
test -f $(distdir)/$$file \
|| cp -p $$d/$$file $(distdir)/$$file \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(HEADERS)
installdirs:
for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libjrtpincludedir)"; do \
test -z "$$dir" || $(mkdir_p) "$$dir"; \
done
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
mostlyclean-am
distclean: distclean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \
distclean-libtool distclean-tags
dvi: dvi-am
dvi-am:
html: html-am
info: info-am
info-am:
install-data-am: install-libjrtpincludeHEADERS
install-exec-am: install-libLTLIBRARIES
install-info: install-info-am
install-man:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -rf ./$(DEPDIR)
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool
pdf: pdf-am
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-info-am uninstall-libLTLIBRARIES \
uninstall-libjrtpincludeHEADERS
.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
clean-libLTLIBRARIES clean-libtool ctags distclean \
distclean-compile distclean-generic distclean-libtool \
distclean-tags distdir dvi dvi-am html html-am info info-am \
install install-am install-data install-data-am install-exec \
install-exec-am install-info install-info-am \
install-libLTLIBRARIES install-libjrtpincludeHEADERS \
install-man install-strip installcheck installcheck-am \
installdirs maintainer-clean maintainer-clean-generic \
mostlyclean mostlyclean-compile mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am tags uninstall \
uninstall-am uninstall-info-am uninstall-libLTLIBRARIES \
uninstall-libjrtpincludeHEADERS
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,65 +0,0 @@
/*
This file is a part of the JThread package, which contains some object-
oriented thread wrappers for different thread implementations.
Copyright (c) 2000-2005 Jori Liesenborgs (jori@lumumba.uhasselt.be)
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#ifndef JMUTEX_H
#define JMUTEX_H
#if (defined(WIN32) || defined(_WIN32_WCE))
#ifndef _WIN32_WCE
#include <process.h>
#endif // _WIN32_WCE
#include <winsock2.h>
#include <windows.h>
#else // using pthread
#include <pthread.h>
#endif // WIN32
#define ERR_JMUTEX_ALREADYINIT -1
#define ERR_JMUTEX_NOTINIT -2
#define ERR_JMUTEX_CANTCREATEMUTEX -3
class JMutex
{
public:
JMutex();
~JMutex();
int Init();
int Lock();
int Unlock();
bool IsInitialized() { return initialized; }
private:
#if (defined(WIN32) || defined(_WIN32_WCE))
HANDLE mutex;
#else // pthread mutex
pthread_mutex_t mutex;
#endif // WIN32
bool initialized;
};
#endif // JMUTEX_H

View File

@ -1,173 +0,0 @@
/*
* CCRTP4C (A wrapper for ccRTP so you can use it in C programs)
* Copyright Anthony Minessale II <anthmct@yahoo.com>
*
*/
#include <cstdio>
#include <ctime>
#include <jrtp4c.h>
#ifdef WIN32
static int WSOCKON = 0;
#endif
#ifdef __cplusplus
extern "C" {
#endif
class JRTP4C: public RTPSession {
// add virtuals later
public:
JRTP4C(): RTPSession() {}
};
struct jrtp4c {
JRTP4C *session;
RTPUDPv4TransmissionParams *transparams;
uint32_t ssrc;
int payload;
};
struct jrtp4c *jrtp4c_new(char *rx_ip, int rx_port, char *tx_ip, int tx_port, int payload, int sps, const char **err)
{
struct jrtp4c *jrtp4c = NULL;
uint32_t destip = ntohl(inet_addr(tx_ip));
uint32_t srcip;
RTPIPv4Address addr(destip, tx_port);
RTPSessionParams sessparams;
int status;
#ifdef WIN32
if (!WSOCKON) {
WSADATA dat;
WSAStartup(MAKEWORD(2,2),&dat);
WSOCKON = 1;
}
#endif // WIN32
sessparams.SetOwnTimestampUnit(1.0/sps);
//sessparams.SetAcceptOwnPackets(true);
if (!(jrtp4c = new struct jrtp4c)) {
*err = "Memory Error!\n";
memset(jrtp4c, 0, sizeof(*jrtp4c));
return NULL;
}
if (!(jrtp4c->transparams = new RTPUDPv4TransmissionParams)) {
delete jrtp4c;
*err = "Memory Error!\n";
return NULL;
}
if (rx_ip) {
srcip = ntohl(inet_addr(rx_ip));
jrtp4c->transparams->SetBindIP(srcip);
}
jrtp4c->transparams->SetPortbase(rx_port);
if (!(jrtp4c->session = new JRTP4C)) {
*err = "Memory Error!\n";
delete jrtp4c->transparams;
delete jrtp4c;
return NULL;
}
if ((status = jrtp4c->session->Create(sessparams, jrtp4c->transparams)) < 0) {
*err = RTPGetErrorString(status).c_str();
delete jrtp4c->transparams;
delete jrtp4c;
return NULL;
}
if ((status = jrtp4c->session->AddDestination(addr)) < 0) {
*err = RTPGetErrorString(status).c_str();
jrtp4c_destroy(&jrtp4c);
return NULL;
}
jrtp4c->session->SetDefaultPayloadType(payload);
jrtp4c->payload = payload;
return jrtp4c;
}
void jrtp4c_destroy(struct jrtp4c **jrtp4c)
{
(*jrtp4c)->session->BYEDestroy(RTPTime(10,0),0,0);
delete (*jrtp4c)->session;
delete (*jrtp4c)->transparams;
delete (*jrtp4c);
*jrtp4c = NULL;
}
void jrtp4c_killread(struct jrtp4c *jrtp4c)
{
jrtp4c->session->AbortWait();
}
int jrtp4c_read(struct jrtp4c *jrtp4c, void *data, int datalen)
{
RTPPacket *pack;
int slen = 0;
bool hasdata = 0;
jrtp4c->session->BeginDataAccess();
jrtp4c->session->WaitForIncomingData(RTPTime(.5), &hasdata);
if (!jrtp4c->session->GotoFirstSourceWithData()) {
jrtp4c->session->EndDataAccess();
return 0;
}
if ((pack = jrtp4c->session->GetNextPacket())) {
slen = pack->GetPayloadLength();
if (slen > datalen) {
slen = datalen;
}
memcpy(data, pack->GetPayloadData(), slen);
delete pack;
}
jrtp4c->session->EndDataAccess();
return slen;
}
int jrtp4c_write(struct jrtp4c *jrtp4c, void *data, int datalen, uint32_t ts)
{
return jrtp4c->session->SendPacket(data, datalen, jrtp4c->payload, false, ts);
}
uint32_t jrtp4c_start(struct jrtp4c *jrtp4c)
{
//jrtp4c->session->BeginDataAccess();
return 0;
}
uint32_t jrtp4c_get_ssrc(struct jrtp4c *jrtp4c)
{
return jrtp4c->ssrc;
}
#ifdef __cplusplus
}
#endif
/** EMACS **
* Local variables:
* mode: c++
* c-basic-offset: 4
* End:
*/

View File

@ -1,61 +0,0 @@
/*
* CCRTP4C (A wrapper for ccRTP so you can use it in C programs)
* Copyright Anthony Minessale II <anthmct@yahoo.com>
*
*/
#ifndef CCRTP4C_H
#define CCRTP4C_H
#ifdef __cplusplus
#include <rtpsession.h>
#include <rtppacket.h>
#include <rtpudpv4transmitter.h>
#include <rtpipv4address.h>
#include <rtpsessionparams.h>
#include <rtperrors.h>
#ifndef WIN32
#include <netinet/in.h>
#include <arpa/inet.h>
#else
#include <winsock2.h>
#endif // WIN32
#if 0
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <string>
#endif
extern "C" {
#endif
typedef enum {
SR,
RR,
SDES,
BYE,
APP,
UNK
} jrtp4c_packet_t;
#ifndef uint32_t
#ifdef WIN32
typedef unsigned int uint32_t;
#else
#include <stdint.h>
#endif
#endif
struct jrtp4c;
struct jrtp4c *jrtp4c_new(char *rx_ip, int rx_port, char *tx_ip, int tx_port, int payload, int sps, const char **err);
void jrtp4c_destroy(struct jrtp4c **jrtp4c);
int jrtp4c_read(struct jrtp4c *jrtp4c, void *data, int datalen);
int jrtp4c_write(struct jrtp4c *jrtp4c, void *data, int datalen, uint32_t ts);
uint32_t jrtp4c_start(struct jrtp4c *jrtp4c);
uint32_t jrtp4c_get_ssrc(struct jrtp4c *jrtp4c);
void jrtp4c_killread(struct jrtp4c *jrtp4c);
#ifdef __cplusplus
}
#endif
#endif

View File

@ -1,77 +0,0 @@
/*
This file is a part of the JThread package, which contains some object-
oriented thread wrappers for different thread implementations.
Copyright (c) 2000-2005 Jori Liesenborgs (jori@lumumba.uhasselt.be)
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#ifndef JTHREAD_H
#define JTHREAD_H
#include "jmutex.h"
#define ERR_JTHREAD_CANTINITMUTEX -1
#define ERR_JTHREAD_CANTSTARTTHREAD -2
#define ERR_JTHREAD_THREADFUNCNOTSET -3
#define ERR_JTHREAD_NOTRUNNING -4
#define ERR_JTHREAD_ALREADYRUNNING -5
class JThread
{
public:
JThread();
virtual ~JThread();
int Start();
int Kill();
virtual void *Thread() = 0;
bool IsRunning();
void *GetReturnValue();
protected:
void ThreadStarted();
private:
#if (defined(WIN32) || defined(_WIN32_WCE))
#ifdef _WIN32_WCE
DWORD threadid;
static DWORD WINAPI TheThread(void *param);
#else
static UINT __stdcall TheThread(void *param);
UINT threadid;
#endif // _WIN32_WCE
HANDLE threadhandle;
#else // pthread type threads
static void *TheThread(void *param);
pthread_t threadid;
#endif // WIN32
void *retval;
bool running;
JMutex runningmutex;
JMutex continuemutex,continuemutex2;
bool mutexinit;
};
#endif // JTHREAD_H

View File

@ -1,67 +0,0 @@
/*
This file is a part of the JThread package, which contains some object-
oriented thread wrappers for different thread implementations.
Copyright (c) 2000-2005 Jori Liesenborgs (jori@lumumba.uhasselt.be)
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "jmutex.h"
JMutex::JMutex()
{
initialized = false;
}
JMutex::~JMutex()
{
if (initialized)
pthread_mutex_destroy(&mutex);
}
int JMutex::Init()
{
if (initialized)
return ERR_JMUTEX_ALREADYINIT;
pthread_mutex_init(&mutex,NULL);
initialized = true;
return 0;
}
int JMutex::Lock()
{
if (!initialized)
return ERR_JMUTEX_NOTINIT;
pthread_mutex_lock(&mutex);
return 0;
}
int JMutex::Unlock()
{
if (!initialized)
return ERR_JMUTEX_NOTINIT;
pthread_mutex_unlock(&mutex);
return 0;
}

View File

@ -1,166 +0,0 @@
/*
This file is a part of the JThread package, which contains some object-
oriented thread wrappers for different thread implementations.
Copyright (c) 2000-2005 Jori Liesenborgs (jori@lumumba.uhasselt.be)
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
#include "jthread.h"
#include <stdlib.h>
JThread::JThread()
{
retval = NULL;
mutexinit = false;
running = false;
}
JThread::~JThread()
{
Kill();
}
int JThread::Start()
{
int status;
if (!mutexinit)
{
if (!runningmutex.IsInitialized())
{
if (runningmutex.Init() < 0)
return ERR_JTHREAD_CANTINITMUTEX;
}
if (!continuemutex.IsInitialized())
{
if (continuemutex.Init() < 0)
return ERR_JTHREAD_CANTINITMUTEX;
}
if (!continuemutex2.IsInitialized())
{
if (continuemutex2.Init() < 0)
return ERR_JTHREAD_CANTINITMUTEX;
}
mutexinit = true;
}
runningmutex.Lock();
if (running)
{
runningmutex.Unlock();
return ERR_JTHREAD_ALREADYRUNNING;
}
runningmutex.Unlock();
continuemutex.Lock();
status = pthread_create(&threadid,NULL,TheThread,this);
if (status != 0)
{
continuemutex.Unlock();
return ERR_JTHREAD_CANTSTARTTHREAD;
}
/* Wait until 'running' is set */
runningmutex.Lock();
while (!running)
{
runningmutex.Unlock();
runningmutex.Lock();
}
runningmutex.Unlock();
continuemutex.Unlock();
continuemutex2.Lock();
continuemutex2.Unlock();
return 0;
}
int JThread::Kill()
{
runningmutex.Lock();
if (!running)
{
runningmutex.Unlock();
return ERR_JTHREAD_NOTRUNNING;
}
pthread_cancel(threadid);
running = false;
runningmutex.Unlock();
return 0;
}
bool JThread::IsRunning()
{
bool r;
runningmutex.Lock();
r = running;
runningmutex.Unlock();
return r;
}
void *JThread::GetReturnValue()
{
void *val;
runningmutex.Lock();
if (running)
val = NULL;
else
val = retval;
runningmutex.Unlock();
return val;
}
void *JThread::TheThread(void *param)
{
JThread *jthread;
void *ret;
jthread = (JThread *)param;
jthread->continuemutex2.Lock();
jthread->runningmutex.Lock();
jthread->running = true;
jthread->runningmutex.Unlock();
jthread->continuemutex.Lock();
jthread->continuemutex.Unlock();
ret = jthread->Thread();
jthread->runningmutex.Lock();
jthread->running = false;
jthread->retval = ret;
jthread->runningmutex.Unlock();
return NULL;
}
void JThread::ThreadStarted()
{
continuemutex2.Unlock();
}

View File

@ -1,87 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpapppacket.h"
#ifdef RTPDEBUG
#include <iostream>
#include <string>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTCPAPPPacket::RTCPAPPPacket(u_int8_t *data,size_t datalength)
: RTCPPacket(APP,data,datalength)
{
knownformat = false;
RTCPCommonHeader *hdr;
size_t len = datalength;
hdr = (RTCPCommonHeader *)data;
if (hdr->padding)
{
u_int8_t padcount = data[datalength-1];
if ((padcount & 0x03) != 0) // not a multiple of four! (see rfc 3550 p 37)
return;
if (((size_t)padcount) >= len)
return;
len -= (size_t)padcount;
}
if (len < (sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*2))
return;
len -= (sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*2);
appdatalen = len;
knownformat = true;
}
#ifdef RTPDEBUG
void RTCPAPPPacket::Dump()
{
RTCPPacket::Dump();
if (!IsKnownFormat())
{
std::cout << " Unknown format!" << std::endl;
}
else
{
std::cout << " SSRC: " << GetSSRC() << std::endl;
char str[5];
memcpy(str,GetName(),4);
str[4] = 0;
std::cout << " Name: " << std::string(str).c_str() << std::endl;
std::cout << " Length: " << GetAPPDataLength() << std::endl;
}
}
#endif // RTPDEBUG

View File

@ -1,106 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPAPPPACKET_H
#define RTCPAPPPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
#include "rtpstructs.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTCPCompoundPacket;
class RTCPAPPPacket : public RTCPPacket
{
public:
RTCPAPPPacket(u_int8_t *data,size_t datalen);
~RTCPAPPPacket() { }
u_int8_t GetSubType() const;
u_int32_t GetSSRC() const;
u_int8_t *GetName(); // Note that the name always consists of 4 octets and is not null-terminated
u_int8_t *GetAPPData();
size_t GetAPPDataLength() const;
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
size_t appdatalen;
};
inline u_int8_t RTCPAPPPacket::GetSubType() const
{
if (!knownformat)
return 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
return hdr->count;
}
inline u_int32_t RTCPAPPPacket::GetSSRC() const
{
if (!knownformat)
return 0;
u_int32_t *ssrc = (u_int32_t *)(data+sizeof(RTCPCommonHeader));
return ntohl(*ssrc);
}
inline u_int8_t *RTCPAPPPacket::GetName()
{
if (!knownformat)
return 0;
return (data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t));
}
inline u_int8_t *RTCPAPPPacket::GetAPPData()
{
if (!knownformat)
return 0;
if (appdatalen == 0)
return 0;
return (data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*2);
}
inline size_t RTCPAPPPacket::GetAPPDataLength() const
{
if (!knownformat)
return 0;
return appdatalen;
}
#endif // RTCPAPPPACKET_H

View File

@ -1,98 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpbyepacket.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTCPBYEPacket::RTCPBYEPacket(u_int8_t *data,size_t datalength)
: RTCPPacket(BYE,data,datalength)
{
knownformat = false;
reasonoffset = 0;
RTCPCommonHeader *hdr;
size_t len = datalength;
hdr = (RTCPCommonHeader *)data;
if (hdr->padding)
{
u_int8_t padcount = data[datalength-1];
if ((padcount & 0x03) != 0) // not a multiple of four! (see rfc 3550 p 37)
return;
if (((size_t)padcount) >= len)
return;
len -= (size_t)padcount;
}
size_t ssrclen = ((size_t)(hdr->count))*sizeof(u_int32_t) + sizeof(RTCPCommonHeader);
if (ssrclen > len)
return;
if (ssrclen < len) // there's probably a reason for leaving
{
u_int8_t *reasonlength = (data+ssrclen);
size_t reaslen = (size_t)(*reasonlength);
if (reaslen > (len-ssrclen-1))
return;
reasonoffset = ssrclen;
}
knownformat = true;
}
#ifdef RTPDEBUG
void RTCPBYEPacket::Dump()
{
RTCPPacket::Dump();
if (!IsKnownFormat())
{
std::cout << " Unknown format" << std::endl;
return;
}
int num = GetSSRCCount();
int i;
for (i = 0 ; i < num ; i++)
std::cout << " SSRC: " << GetSSRC(i) << std::endl;
if (HasReasonForLeaving())
{
char str[1024];
memcpy(str,GetReasonData(),GetReasonLength());
str[GetReasonLength()] = 0;
std::cout << " Reason: " << str << std::endl;
}
}
#endif // RTPDEBUG

View File

@ -1,114 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPBYEPACKET_H
#define RTCPBYEPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
#include "rtpstructs.h"
#if ! (defined(WIN32) || defined (_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTCPCompoundPacket;
class RTCPBYEPacket : public RTCPPacket
{
public:
RTCPBYEPacket(u_int8_t *data,size_t datalen);
~RTCPBYEPacket() { }
int GetSSRCCount() const;
u_int32_t GetSSRC(int index) const; // note: no check is performed to see if index is valid!
bool HasReasonForLeaving() const;
size_t GetReasonLength() const;
u_int8_t *GetReasonData();
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
size_t reasonoffset;
};
inline int RTCPBYEPacket::GetSSRCCount() const
{
if (!knownformat)
return 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
return (int)(hdr->count);
}
inline u_int32_t RTCPBYEPacket::GetSSRC(int index) const
{
if (!knownformat)
return 0;
u_int32_t *ssrc = (u_int32_t *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*index);
return ntohl(*ssrc);
}
inline bool RTCPBYEPacket::HasReasonForLeaving() const
{
if (!knownformat)
return false;
if (reasonoffset == 0)
return false;
return true;
}
inline size_t RTCPBYEPacket::GetReasonLength() const
{
if (!knownformat)
return 0;
if (reasonoffset == 0)
return 0;
u_int8_t *reasonlen = (data+reasonoffset);
return (size_t)(*reasonlen);
}
inline u_int8_t *RTCPBYEPacket::GetReasonData()
{
if (!knownformat)
return 0;
if (reasonoffset == 0)
return 0;
u_int8_t *reasonlen = (data+reasonoffset);
if ((*reasonlen) == 0)
return 0;
return (data+reasonoffset+1);
}
#endif // RTCPBYEPACKET_H

View File

@ -1,208 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpcompoundpacket.h"
#include "rtprawpacket.h"
#include "rtperrors.h"
#include "rtpstructs.h"
#include "rtpdefines.h"
#include "rtcpsrpacket.h"
#include "rtcprrpacket.h"
#include "rtcpsdespacket.h"
#include "rtcpbyepacket.h"
#include "rtcpapppacket.h"
#include "rtcpunknownpacket.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
#include "rtpdebug.h"
RTCPCompoundPacket::RTCPCompoundPacket(RTPRawPacket &rawpack)
{
compoundpacket = 0;
compoundpacketlength = 0;
error = 0;
if (rawpack.IsRTP())
{
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
u_int8_t *data = rawpack.GetData();
size_t datalen = rawpack.GetDataLength();
bool first;
if (datalen < sizeof(RTCPCommonHeader))
{
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
first = true;
do
{
RTCPCommonHeader *rtcphdr;
size_t length;
rtcphdr = (RTCPCommonHeader *)data;
if (rtcphdr->version != RTP_VERSION) // check version
{
ClearPacketList();
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
if (first)
{
// Check if first packet is SR or RR
first = false;
if ( ! (rtcphdr->packettype == RTP_RTCPTYPE_SR || rtcphdr->packettype == RTP_RTCPTYPE_RR))
{
ClearPacketList();
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
}
length = (size_t)ntohs(rtcphdr->length);
length++;
length *= sizeof(u_int32_t);
if (length > datalen) // invalid length field
{
ClearPacketList();
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
if (rtcphdr->padding)
{
// check if it's the last packet
if (length != datalen)
{
ClearPacketList();
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return; // not last packet
}
}
RTCPPacket *p;
switch (rtcphdr->packettype)
{
case RTP_RTCPTYPE_SR:
p = new RTCPSRPacket(data,length);
break;
case RTP_RTCPTYPE_RR:
p = new RTCPRRPacket(data,length);
break;
case RTP_RTCPTYPE_SDES:
p = new RTCPSDESPacket(data,length);
break;
case RTP_RTCPTYPE_BYE:
p = new RTCPBYEPacket(data,length);
break;
case RTP_RTCPTYPE_APP:
p = new RTCPAPPPacket(data,length);
break;
default:
p = new RTCPUnknownPacket(data,length);
}
if (p == 0)
{
ClearPacketList();
error = ERR_RTP_OUTOFMEM;
return;
}
rtcppacklist.push_back(p);
datalen -= length;
data += length;
} while (datalen >= (size_t)sizeof(RTCPCommonHeader));
if (datalen != 0) // some remaining bytes
{
ClearPacketList();
error = ERR_RTP_RTCPCOMPOUND_INVALIDPACKET;
return;
}
compoundpacket = rawpack.GetData();
compoundpacketlength = rawpack.GetDataLength();
rawpack.ZeroData();
rtcppackit = rtcppacklist.begin();
}
RTCPCompoundPacket::RTCPCompoundPacket()
{
compoundpacket = 0;
compoundpacketlength = 0;
error = 0;
}
RTCPCompoundPacket::~RTCPCompoundPacket()
{
ClearPacketList();
if (compoundpacket)
delete [] compoundpacket;
}
void RTCPCompoundPacket::ClearPacketList()
{
std::list<RTCPPacket *>::const_iterator it;
for (it = rtcppacklist.begin() ; it != rtcppacklist.end() ; it++)
delete *it;
rtcppacklist.clear();
rtcppackit = rtcppacklist.begin();
}
#ifdef RTPDEBUG
void RTCPCompoundPacket::Dump()
{
std::list<RTCPPacket *>::const_iterator it;
for (it = rtcppacklist.begin() ; it != rtcppacklist.end() ; it++)
{
RTCPPacket *p = *it;
p->Dump();
}
}
#endif // RTPDEBUG

View File

@ -1,79 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPCOMPOUNDPACKET_H
#define RTCPCOMPOUNDPACKET_H
#include "rtpconfig.h"
#include "rtptypes.h"
#include <list>
class RTPRawPacket;
class RTCPPacket;
class RTCPCompoundPacket
{
public:
RTCPCompoundPacket(RTPRawPacket &rawpack);
protected:
RTCPCompoundPacket(); // this is for the compoundpacket builder
public:
virtual ~RTCPCompoundPacket();
int GetCreationError() { return error; }
u_int8_t *GetCompoundPacketData() { return compoundpacket; }
size_t GetCompoundPacketLength() { return compoundpacketlength; }
void GotoFirstPacket() { rtcppackit = rtcppacklist.begin(); }
// Note: the individual RTCPPackets may NOT be deleted!
RTCPPacket *GetNextPacket() { if (rtcppackit == rtcppacklist.end()) return 0; RTCPPacket *p = *rtcppackit; rtcppackit++; return p; }
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
protected:
void ClearPacketList();
int error;
u_int8_t *compoundpacket;
size_t compoundpacketlength;
std::list<RTCPPacket *> rtcppacklist;
std::list<RTCPPacket *>::const_iterator rtcppackit;
};
#endif // RTCPCOMPOUNDPACKET_H

View File

@ -1,672 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpcompoundpacketbuilder.h"
#include "rtcpsrpacket.h"
#include "rtcprrpacket.h"
#include "rtcpsdespacket.h"
#include "rtcpbyepacket.h"
#include "rtcpapppacket.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
#include "rtpdebug.h"
RTCPCompoundPacketBuilder::RTCPCompoundPacketBuilder()
{
byesize = 0;
appsize = 0;
maximumpacketsize = 0;
buffer = 0;
external = false;
arebuilding = false;
}
RTCPCompoundPacketBuilder::~RTCPCompoundPacketBuilder()
{
if (external)
compoundpacket = 0; // make sure RTCPCompoundPacket doesn't delete the external buffer
ClearBuildBuffers();
}
void RTCPCompoundPacketBuilder::ClearBuildBuffers()
{
report.Clear();
sdes.Clear();
std::list<Buffer>::const_iterator it;
for (it = byepackets.begin() ; it != byepackets.end() ; it++)
if ((*it).packetdata)
delete [] (*it).packetdata;
for (it = apppackets.begin() ; it != apppackets.end() ; it++)
if ((*it).packetdata)
delete [] (*it).packetdata;
byepackets.clear();
apppackets.clear();
byesize = 0;
appsize = 0;
}
int RTCPCompoundPacketBuilder::InitBuild(size_t maxpacketsize)
{
if (arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILDING;
if (compoundpacket)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILT;
if (maxpacketsize < RTP_MINPACKETSIZE)
return ERR_RTP_RTCPCOMPPACKBUILDER_MAXPACKETSIZETOOSMALL;
maximumpacketsize = maxpacketsize;
buffer = 0;
external = false;
byesize = 0;
appsize = 0;
arebuilding = true;
return 0;
}
int RTCPCompoundPacketBuilder::InitBuild(void *externalbuffer,size_t buffersize)
{
if (arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILDING;
if (compoundpacket)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILT;
if (buffersize < RTP_MINPACKETSIZE)
return ERR_RTP_RTCPCOMPPACKBUILDER_BUFFERSIZETOOSMALL;
maximumpacketsize = buffersize;
buffer = (u_int8_t *)externalbuffer;
external = true;
byesize = 0;
appsize = 0;
arebuilding = true;
return 0;
}
int RTCPCompoundPacketBuilder::StartSenderReport(u_int32_t senderssrc,const RTPNTPTime &ntptimestamp,u_int32_t rtptimestamp,
u_int32_t packetcount,u_int32_t octetcount)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (report.headerlength != 0)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYGOTREPORT;
size_t totalsize = byesize+appsize+sdes.NeededBytes();
size_t sizeleft = maximumpacketsize-totalsize;
size_t neededsize = sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+sizeof(RTCPSenderReport);
if (neededsize > sizeleft)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
// fill in some things
report.headerlength = sizeof(u_int32_t)+sizeof(RTCPSenderReport);
report.isSR = true;
u_int32_t *ssrc = (u_int32_t *)report.headerdata;
*ssrc = htonl(senderssrc);
RTCPSenderReport *sr = (RTCPSenderReport *)(report.headerdata + sizeof(u_int32_t));
sr->ntptime_msw = htonl(ntptimestamp.GetMSW());
sr->ntptime_lsw = htonl(ntptimestamp.GetLSW());
sr->rtptimestamp = htonl(rtptimestamp);
sr->packetcount = htonl(packetcount);
sr->octetcount = htonl(octetcount);
return 0;
}
int RTCPCompoundPacketBuilder::StartReceiverReport(u_int32_t senderssrc)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (report.headerlength != 0)
return ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYGOTREPORT;
size_t totalsize = byesize+appsize+sdes.NeededBytes();
size_t sizeleft = maximumpacketsize-totalsize;
size_t neededsize = sizeof(RTCPCommonHeader)+sizeof(u_int32_t);
if (neededsize > sizeleft)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
// fill in some things
report.headerlength = sizeof(u_int32_t);
report.isSR = false;
u_int32_t *ssrc = (u_int32_t *)report.headerdata;
*ssrc = htonl(senderssrc);
return 0;
}
int RTCPCompoundPacketBuilder::AddReportBlock(u_int32_t ssrc,u_int8_t fractionlost,int32_t packetslost,u_int32_t exthighestseq,
u_int32_t jitter,u_int32_t lsr,u_int32_t dlsr)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (report.headerlength == 0)
return ERR_RTP_RTCPCOMPPACKBUILDER_REPORTNOTSTARTED;
size_t totalothersize = byesize+appsize+sdes.NeededBytes();
size_t reportsizewithextrablock = report.NeededBytesWithExtraReportBlock();
if ((totalothersize+reportsizewithextrablock) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
u_int8_t *buf = new u_int8_t[sizeof(RTCPReceiverReport)];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
RTCPReceiverReport *rr = (RTCPReceiverReport *)buf;
u_int32_t *packlost = (u_int32_t *)&packetslost;
u_int32_t packlost2 = (*packlost);
rr->ssrc = htonl(ssrc);
rr->fractionlost = fractionlost;
rr->packetslost[2] = (u_int8_t)(packlost2&0xFF);
rr->packetslost[1] = (u_int8_t)((packlost2>>8)&0xFF);
rr->packetslost[0] = (u_int8_t)((packlost2>>16)&0xFF);
rr->exthighseqnr = htonl(exthighestseq);
rr->jitter = htonl(jitter);
rr->lsr = htonl(lsr);
rr->dlsr = htonl(dlsr);
report.reportblocks.push_back(Buffer(buf,sizeof(RTCPReceiverReport)));
return 0;
}
int RTCPCompoundPacketBuilder::AddSDESSource(u_int32_t ssrc)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
size_t totalotherbytes = byesize+appsize+report.NeededBytes();
size_t sdessizewithextrasource = sdes.NeededBytesWithExtraSource();
if ((totalotherbytes + sdessizewithextrasource) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
int status;
if ((status = sdes.AddSSRC(ssrc)) < 0)
return status;
return 0;
}
int RTCPCompoundPacketBuilder::AddSDESNormalItem(RTCPSDESPacket::ItemType t,const void *itemdata,u_int8_t itemlength)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (sdes.sdessources.empty())
return ERR_RTP_RTCPCOMPPACKBUILDER_NOCURRENTSOURCE;
u_int8_t itemid;
switch(t)
{
case RTCPSDESPacket::CNAME:
itemid = RTCP_SDES_ID_CNAME;
break;
case RTCPSDESPacket::NAME:
itemid = RTCP_SDES_ID_NAME;
break;
case RTCPSDESPacket::EMAIL:
itemid = RTCP_SDES_ID_EMAIL;
break;
case RTCPSDESPacket::PHONE:
itemid = RTCP_SDES_ID_PHONE;
break;
case RTCPSDESPacket::LOC:
itemid = RTCP_SDES_ID_LOCATION;
break;
case RTCPSDESPacket::TOOL:
itemid = RTCP_SDES_ID_TOOL;
break;
case RTCPSDESPacket::NOTE:
itemid = RTCP_SDES_ID_NOTE;
break;
default:
return ERR_RTP_RTCPCOMPPACKBUILDER_INVALIDITEMTYPE;
}
size_t totalotherbytes = byesize+appsize+report.NeededBytes();
size_t sdessizewithextraitem = sdes.NeededBytesWithExtraItem(itemlength);
if ((sdessizewithextraitem+totalotherbytes) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
u_int8_t *buf;
size_t len;
buf = new u_int8_t[sizeof(RTCPSDESHeader)+(size_t)itemlength];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
len = sizeof(RTCPSDESHeader)+(size_t)itemlength;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(buf);
sdeshdr->id = itemid;
sdeshdr->length = itemlength;
if (itemlength != 0)
memcpy((buf + sizeof(RTCPSDESHeader)),itemdata,(size_t)itemlength);
sdes.AddItem(buf,len);
return 0;
}
#ifdef RTP_SUPPORT_SDESPRIV
int RTCPCompoundPacketBuilder::AddSDESPrivateItem(const void *prefixdata,u_int8_t prefixlength,const void *valuedata,
u_int8_t valuelength)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (sdes.sdessources.empty())
return ERR_RTP_RTCPCOMPPACKBUILDER_NOCURRENTSOURCE;
size_t itemlength = ((size_t)prefixlength)+1+((size_t)valuelength);
if (itemlength > 255)
return ERR_RTP_RTCPCOMPPACKBUILDER_TOTALITEMLENGTHTOOBIG;
size_t totalotherbytes = byesize+appsize+report.NeededBytes();
size_t sdessizewithextraitem = sdes.NeededBytesWithExtraItem(itemlength);
if ((sdessizewithextraitem+totalotherbytes) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
u_int8_t *buf;
size_t len;
buf = new u_int8_t[sizeof(RTCPSDESHeader)+itemlength];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
len = sizeof(RTCPSDESHeader)+(size_t)itemlength;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(buf);
sdeshdr->id = RTCP_SDES_ID_PRIVATE;
sdeshdr->length = itemlength;
buf[sizeof(RTCPSDESHeader)] = prefixlength;
if (prefixlength != 0)
memcpy((buf+sizeof(RTCPSDESHeader)+1),prefixdata,(size_t)prefixlength);
if (valuelength != 0)
memcpy((buf+sizeof(RTCPSDESHeader)+1+(size_t)prefixlength),valuedata,(size_t)valuelength);
sdes.AddItem(buf,len);
return 0;
}
#endif // RTP_SUPPORT_SDESPRIV
int RTCPCompoundPacketBuilder::AddBYEPacket(u_int32_t *ssrcs,u_int8_t numssrcs,const void *reasondata,u_int8_t reasonlength)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (numssrcs > 31)
return ERR_RTP_RTCPCOMPPACKBUILDER_TOOMANYSSRCS;
size_t packsize = sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*((size_t)numssrcs);
size_t zerobytes = 0;
if (reasonlength > 0)
{
packsize += 1; // 1 byte for the length;
packsize += (size_t)reasonlength;
size_t r = (packsize&0x03);
if (r != 0)
{
zerobytes = 4-r;
packsize += zerobytes;
}
}
size_t totalotherbytes = appsize+byesize+sdes.NeededBytes()+report.NeededBytes();
if ((totalotherbytes + packsize) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
u_int8_t *buf;
size_t numwords;
buf = new u_int8_t[packsize];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)buf;
hdr->version = 2;
hdr->padding = 0;
hdr->count = numssrcs;
numwords = packsize/sizeof(u_int32_t);
hdr->length = htons((u_int16_t)(numwords-1));
hdr->packettype = RTP_RTCPTYPE_BYE;
u_int32_t *sources = (u_int32_t *)(buf+sizeof(RTCPCommonHeader));
u_int8_t srcindex;
for (srcindex = 0 ; srcindex < numssrcs ; srcindex++)
sources[srcindex] = htonl(ssrcs[srcindex]);
if (reasonlength != 0)
{
size_t offset = sizeof(RTCPCommonHeader)+((size_t)numssrcs)*sizeof(u_int32_t);
buf[offset] = reasonlength;
memcpy((buf+offset+1),reasondata,(size_t)reasonlength);
for (size_t i = 0 ; i < zerobytes ; i++)
buf[packsize-1-i] = 0;
}
byepackets.push_back(Buffer(buf,packsize));
byesize += packsize;
return 0;
}
int RTCPCompoundPacketBuilder::AddAPPPacket(u_int8_t subtype,u_int32_t ssrc,const u_int8_t name[4],const void *appdata,size_t appdatalen)
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (subtype > 31)
return ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALSUBTYPE;
if ((appdatalen%4) != 0)
return ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALAPPDATALENGTH;
size_t appdatawords = appdatalen/4;
if ((appdatawords+2) > 65535)
return ERR_RTP_RTCPCOMPPACKBUILDER_APPDATALENTOOBIG;
size_t packsize = sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*2+appdatalen;
size_t totalotherbytes = appsize+byesize+sdes.NeededBytes()+report.NeededBytes();
if ((totalotherbytes + packsize) > maximumpacketsize)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT;
u_int8_t *buf;
buf = new u_int8_t[packsize];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)buf;
hdr->version = 2;
hdr->padding = 0;
hdr->count = subtype;
hdr->length = htons((u_int16_t)(appdatawords+2));
hdr->packettype = RTP_RTCPTYPE_APP;
u_int32_t *source = (u_int32_t *)(buf+sizeof(RTCPCommonHeader));
*source = htonl(ssrc);
buf[sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+0] = name[0];
buf[sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+1] = name[1];
buf[sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+2] = name[2];
buf[sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+3] = name[3];
if (appdatalen > 0)
memcpy((buf+sizeof(RTCPCommonHeader)+sizeof(u_int32_t)*2),appdata,appdatalen);
apppackets.push_back(Buffer(buf,packsize));
appsize += packsize;
return 0;
}
int RTCPCompoundPacketBuilder::EndBuild()
{
if (!arebuilding)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING;
if (report.headerlength == 0)
return ERR_RTP_RTCPCOMPPACKBUILDER_NOREPORTPRESENT;
u_int8_t *buf;
size_t len;
len = appsize+byesize+report.NeededBytes()+sdes.NeededBytes();
if (!external)
{
buf = new u_int8_t[len];
if (buf == 0)
return ERR_RTP_OUTOFMEM;
}
else
buf = buffer;
u_int8_t *curbuf = buf;
RTCPPacket *p;
// first, we'll add all report info
{
bool firstpacket = true;
bool done = false;
std::list<Buffer>::const_iterator it = report.reportblocks.begin();
do
{
RTCPCommonHeader *hdr = (RTCPCommonHeader *)curbuf;
size_t offset;
hdr->version = 2;
hdr->padding = 0;
if (firstpacket && report.isSR)
{
hdr->packettype = RTP_RTCPTYPE_SR;
memcpy((curbuf+sizeof(RTCPCommonHeader)),report.headerdata,report.headerlength);
offset = sizeof(RTCPCommonHeader)+report.headerlength;
}
else
{
hdr->packettype = RTP_RTCPTYPE_RR;
memcpy((curbuf+sizeof(RTCPCommonHeader)),report.headerdata,sizeof(u_int32_t));
offset = sizeof(RTCPCommonHeader)+sizeof(u_int32_t);
}
firstpacket = false;
u_int8_t count = 0;
while (it != report.reportblocks.end() && count < 31)
{
memcpy(curbuf+offset,(*it).packetdata,(*it).packetlength);
offset += (*it).packetlength;
count++;
it++;
}
size_t numwords = offset/sizeof(u_int32_t);
hdr->length = htons((u_int16_t)(numwords-1));
hdr->count = count;
// add entry in parent's list
if (hdr->packettype == RTP_RTCPTYPE_SR)
p = new RTCPSRPacket(curbuf,offset);
else
p = new RTCPRRPacket(curbuf,offset);
if (p == 0)
{
if (!external)
delete [] buf;
ClearPacketList();
return ERR_RTP_OUTOFMEM;
}
rtcppacklist.push_back(p);
curbuf += offset;
if (it == report.reportblocks.end())
done = true;
} while (!done);
}
// then, we'll add the sdes info
if (!sdes.sdessources.empty())
{
bool done = false;
std::list<SDESSource *>::const_iterator sourceit = sdes.sdessources.begin();
do
{
RTCPCommonHeader *hdr = (RTCPCommonHeader *)curbuf;
size_t offset = sizeof(RTCPCommonHeader);
hdr->version = 2;
hdr->padding = 0;
hdr->packettype = RTP_RTCPTYPE_SDES;
u_int8_t sourcecount = 0;
while (sourceit != sdes.sdessources.end() && sourcecount < 31)
{
u_int32_t *ssrc = (u_int32_t *)(curbuf+offset);
*ssrc = htonl((*sourceit)->ssrc);
offset += sizeof(u_int32_t);
std::list<Buffer>::const_iterator itemit,itemend;
itemit = (*sourceit)->items.begin();
itemend = (*sourceit)->items.end();
while (itemit != itemend)
{
memcpy(curbuf+offset,(*itemit).packetdata,(*itemit).packetlength);
offset += (*itemit).packetlength;
itemit++;
}
curbuf[offset] = 0; // end of item list;
offset++;
size_t r = offset&0x03;
if (r != 0) // align to 32 bit boundary
{
size_t num = 4-r;
size_t i;
for (i = 0 ; i < num ; i++)
curbuf[offset+i] = 0;
offset += num;
}
sourceit++;
sourcecount++;
}
size_t numwords = offset/4;
hdr->count = sourcecount;
hdr->length = htons((u_int16_t)(numwords-1));
p = new RTCPSDESPacket(curbuf,offset);
if (p == 0)
{
if (!external)
delete [] buf;
ClearPacketList();
return ERR_RTP_OUTOFMEM;
}
rtcppacklist.push_back(p);
curbuf += offset;
if (sourceit == sdes.sdessources.end())
done = true;
} while (!done);
}
// adding the app data
{
std::list<Buffer>::const_iterator it;
for (it = apppackets.begin() ; it != apppackets.end() ; it++)
{
memcpy(curbuf,(*it).packetdata,(*it).packetlength);
p = new RTCPAPPPacket(curbuf,(*it).packetlength);
if (p == 0)
{
if (!external)
delete [] buf;
ClearPacketList();
return ERR_RTP_OUTOFMEM;
}
rtcppacklist.push_back(p);
curbuf += (*it).packetlength;
}
}
// adding bye packets
{
std::list<Buffer>::const_iterator it;
for (it = byepackets.begin() ; it != byepackets.end() ; it++)
{
memcpy(curbuf,(*it).packetdata,(*it).packetlength);
p = new RTCPBYEPacket(curbuf,(*it).packetlength);
if (p == 0)
{
if (!external)
delete [] buf;
ClearPacketList();
return ERR_RTP_OUTOFMEM;
}
rtcppacklist.push_back(p);
curbuf += (*it).packetlength;
}
}
compoundpacket = buf;
compoundpacketlength = len;
arebuilding = false;
ClearBuildBuffers();
return 0;
}

View File

@ -1,317 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPCOMPOUNDPACKETBUILDER_H
#define RTCPCOMPOUNDPACKETBUILDER_H
#include "rtpconfig.h"
#include "rtcpcompoundpacket.h"
#include "rtptimeutilities.h"
#include "rtcpsdespacket.h"
#include "rtperrors.h"
#include <list>
class RTCPCompoundPacketBuilder : public RTCPCompoundPacket
{
public:
RTCPCompoundPacketBuilder();
~RTCPCompoundPacketBuilder();
int InitBuild(size_t maxpacketsize);
int InitBuild(void *externalbuffer,size_t buffersize);
int StartSenderReport(u_int32_t senderssrc,const RTPNTPTime &ntptimestamp,u_int32_t rtptimestamp,
u_int32_t packetcount,u_int32_t octetcount);
int StartReceiverReport(u_int32_t senderssrc);
int AddReportBlock(u_int32_t ssrc,u_int8_t fractionlost,int32_t packetslost,u_int32_t exthighestseq,
u_int32_t jitter,u_int32_t lsr,u_int32_t dlsr);
int AddSDESSource(u_int32_t ssrc);
int AddSDESNormalItem(RTCPSDESPacket::ItemType t,const void *itemdata,u_int8_t itemlength);
#ifdef RTP_SUPPORT_SDESPRIV
int AddSDESPrivateItem(const void *prefixdata,u_int8_t prefixlength,const void *valuedata,
u_int8_t valuelength);
#endif // RTP_SUPPORT_SDESPRIV
int AddBYEPacket(u_int32_t *ssrcs,u_int8_t numssrcs,const void *reasondata,u_int8_t reasonlength);
// note: appdatalen must be a multiple of 4 (32 bits) !
int AddAPPPacket(u_int8_t subtype,u_int32_t ssrc,const u_int8_t name[4],const void *appdata,size_t appdatalen);
int EndBuild();
private:
class Buffer
{
public:
Buffer():packetdata(0),packetlength(0) { }
Buffer(u_int8_t *data,size_t len):packetdata(data),packetlength(len) { }
u_int8_t *packetdata;
size_t packetlength;
};
class Report
{
public:
Report() { headerdata = (u_int8_t *)headerdata32; isSR = false; headerlength = 0; }
~Report() { Clear(); }
void Clear()
{
std::list<Buffer>::const_iterator it;
for (it = reportblocks.begin() ; it != reportblocks.end() ; it++)
if ((*it).packetdata)
delete [] (*it).packetdata;
reportblocks.clear();
isSR = false;
headerlength = 0;
}
size_t NeededBytes()
{
size_t x,n,d,r;
n = reportblocks.size();
if (n == 0)
{
if (headerlength == 0)
return 0;
x = sizeof(RTCPCommonHeader)+headerlength;
}
else
{
x = n*sizeof(RTCPReceiverReport);
d = n/31; // max 31 reportblocks per report
r = n%31;
if (r != 0)
d++;
x += d*(sizeof(RTCPCommonHeader)+sizeof(u_int32_t)); /* header and SSRC */
if (isSR)
x += sizeof(RTCPSenderReport);
}
return x;
}
size_t NeededBytesWithExtraReportBlock()
{
size_t x,n,d,r;
n = reportblocks.size() + 1; // +1 for the extra block
x = n*sizeof(RTCPReceiverReport);
d = n/31; // max 31 reportblocks per report
r = n%31;
if (r != 0)
d++;
x += d*(sizeof(RTCPCommonHeader)+sizeof(u_int32_t)); /* header and SSRC */
if (isSR)
x += sizeof(RTCPSenderReport);
return x;
}
bool isSR;
u_int8_t *headerdata;
u_int32_t headerdata32[(sizeof(u_int32_t)+sizeof(RTCPSenderReport))/sizeof(u_int32_t)]; // either for ssrc and sender info or just ssrc
size_t headerlength;
std::list<Buffer> reportblocks;
};
class SDESSource
{
public:
SDESSource(u_int32_t s) : ssrc(s),totalitemsize(0) { }
~SDESSource()
{
std::list<Buffer>::const_iterator it;
for (it = items.begin() ; it != items.end() ; it++)
if ((*it).packetdata)
delete [] (*it).packetdata;
items.clear();
}
size_t NeededBytes()
{
size_t x,r;
x = totalitemsize + 1; // +1 for the 0 byte which terminates the item list
r = x%sizeof(u_int32_t);
if (r != 0)
x += (sizeof(u_int32_t)-r); // make sure it ends on a 32 bit boundary
x += sizeof(u_int32_t); // for ssrc
return x;
}
size_t NeededBytesWithExtraItem(u_int8_t itemdatalength)
{
size_t x,r;
x = totalitemsize + sizeof(RTCPSDESHeader) + (size_t)itemdatalength + 1;
r = x%sizeof(u_int32_t);
if (r != 0)
x += (sizeof(u_int32_t)-r); // make sure it ends on a 32 bit boundary
x += sizeof(u_int32_t); // for ssrc
return x;
}
void AddItem(u_int8_t *buf,size_t len)
{
Buffer b(buf,len);
totalitemsize += len;
items.push_back(b);
}
u_int32_t ssrc;
std::list<Buffer> items;
private:
size_t totalitemsize;
};
class SDES
{
public:
SDES() { sdesit = sdessources.end(); }
~SDES() { Clear(); }
void Clear()
{
std::list<SDESSource *>::const_iterator it;
for (it = sdessources.begin() ; it != sdessources.end() ; it++)
delete (*it);
sdessources.clear();
}
int AddSSRC(u_int32_t ssrc)
{
SDESSource *s = new SDESSource(ssrc);
if (s == 0)
return ERR_RTP_OUTOFMEM;
sdessources.push_back(s);
sdesit = sdessources.end();
sdesit--;
return 0;
}
int AddItem(u_int8_t *buf,size_t len)
{
if (sdessources.empty())
return ERR_RTP_RTCPCOMPPACKBUILDER_NOCURRENTSOURCE;
(*sdesit)->AddItem(buf,len);
return 0;
}
size_t NeededBytes()
{
std::list<SDESSource *>::const_iterator it;
size_t x = 0;
size_t n,d,r;
if (sdessources.empty())
return 0;
for (it = sdessources.begin() ; it != sdessources.end() ; it++)
x += (*it)->NeededBytes();
n = sdessources.size();
d = n/31;
r = n%31;
if (r != 0)
d++;
x += d*sizeof(RTCPCommonHeader);
return x;
}
size_t NeededBytesWithExtraItem(u_int8_t itemdatalength)
{
std::list<SDESSource *>::const_iterator it;
size_t x = 0;
size_t n,d,r;
if (sdessources.empty())
return 0;
for (it = sdessources.begin() ; it != sdesit ; it++)
x += (*it)->NeededBytes();
x += (*sdesit)->NeededBytesWithExtraItem(itemdatalength);
n = sdessources.size();
d = n/31;
r = n%31;
if (r != 0)
d++;
x += d*sizeof(RTCPCommonHeader);
return x;
}
size_t NeededBytesWithExtraSource()
{
std::list<SDESSource *>::const_iterator it;
size_t x = 0;
size_t n,d,r;
if (sdessources.empty())
return 0;
for (it = sdessources.begin() ; it != sdessources.end() ; it++)
x += (*it)->NeededBytes();
// for the extra source we'll need at least 8 bytes (ssrc and four 0 bytes)
x += sizeof(u_int32_t)*2;
n = sdessources.size() + 1; // also, the number of sources will increase
d = n/31;
r = n%31;
if (r != 0)
d++;
x += d*sizeof(RTCPCommonHeader);
return x;
}
std::list<SDESSource *> sdessources;
private:
std::list<SDESSource *>::const_iterator sdesit;
};
size_t maximumpacketsize;
u_int8_t *buffer;
bool external;
bool arebuilding;
Report report;
SDES sdes;
std::list<Buffer> byepackets;
size_t byesize;
std::list<Buffer> apppackets;
size_t appsize;
void ClearBuildBuffers();
};
#endif // RTCPCOMPOUNDPACKETBUILDER_H

View File

@ -1,71 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcppacket.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
#ifdef RTPDEBUG
void RTCPPacket::Dump()
{
switch(packettype)
{
case SR:
std::cout << "RTCP Sender Report ";
break;
case RR:
std::cout << "RTCP Receiver Report ";
break;
case SDES:
std::cout << "RTCP Source Description ";
break;
case APP:
std::cout << "RTCP APP Packet ";
break;
case BYE:
std::cout << "RTCP Bye Packet ";
break;
case Unknown:
std::cout << "Unknown RTCP Packet ";
break;
default:
std::cout << "ERROR: Invalid packet type!" << std::endl;
}
std::cout << "Length: " << datalen;
std::cout << std::endl;
}
#endif // RTPDEBUG

View File

@ -1,69 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPPACKET_H
#define RTCPPACKET_H
#include "rtpconfig.h"
#include "rtptypes.h"
class RTCPCompoundPacket;
class RTCPPacket
{
public:
enum PacketType { SR,RR,SDES,BYE,APP,Unknown };
protected:
RTCPPacket(PacketType t,u_int8_t *d,size_t dlen) : data(d),datalen(dlen),packettype(t) { knownformat = false; }
public:
virtual ~RTCPPacket() { }
bool IsKnownFormat() const { return knownformat; }
PacketType GetPacketType() const { return packettype; }
u_int8_t *GetPacketData() { return data; }
size_t GetPacketLength() const { return datalen; }
#ifdef RTPDEBUG
virtual void Dump();
#endif // RTPDEBUG
protected:
u_int8_t *data;
size_t datalen;
bool knownformat;
private:
const PacketType packettype;
};
#endif // RTCPPACKET_H

View File

@ -1,733 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcppacketbuilder.h"
#include "rtpsources.h"
#include "rtppacketbuilder.h"
#include "rtcpscheduler.h"
#include "rtpsourcedata.h"
#include "rtcpcompoundpacketbuilder.h"
#include "rtpdebug.h"
RTCPPacketBuilder::RTCPPacketBuilder(RTPSources &s,RTPPacketBuilder &pb)
: sources(s),rtppacketbuilder(pb),prevbuildtime(0,0)
{
init = false;
#if (defined(WIN32) || defined(_WIN32_WCE))
timeinit.Dummy();
#endif // WIN32 || _WIN32_WCE
}
RTCPPacketBuilder::~RTCPPacketBuilder()
{
Destroy();
}
int RTCPPacketBuilder::Init(size_t maxpacksize,double tsunit,const void *cname,size_t cnamelen)
{
if (init)
return ERR_RTP_RTCPPACKETBUILDER_ALREADYINIT;
if (maxpacksize < RTP_MINPACKETSIZE)
return ERR_RTP_RTCPPACKETBUILDER_ILLEGALMAXPACKSIZE;
if (tsunit < 0.0)
return ERR_RTP_RTCPPACKETBUILDER_ILLEGALTIMESTAMPUNIT;
if (cnamelen>255)
cnamelen = 255;
maxpacketsize = maxpacksize;
timestampunit = tsunit;
int status;
if ((status = ownsdesinfo.SetCNAME((const u_int8_t *)cname,cnamelen)) < 0)
return status;
ClearAllSourceFlags();
interval_name = -1;
interval_email = -1;
interval_location = -1;
interval_phone = -1;
interval_tool = -1;
interval_note = -1;
sdesbuildcount = 0;
firstpacket = true;
processingsdes = false;
init = true;
return 0;
}
void RTCPPacketBuilder::Destroy()
{
if (!init)
return;
ownsdesinfo.Clear();
init = false;
}
int RTCPPacketBuilder::BuildNextPacket(RTCPCompoundPacket **pack)
{
if (!init)
return ERR_RTP_RTCPPACKETBUILDER_NOTINIT;
RTCPCompoundPacketBuilder *rtcpcomppack;
int status;
bool sender = false;
RTPSourceData *srcdat;
*pack = 0;
rtcpcomppack = new RTCPCompoundPacketBuilder();
if (rtcpcomppack == 0)
return ERR_RTP_OUTOFMEM;
if ((status = rtcpcomppack->InitBuild(maxpacketsize)) < 0)
{
delete rtcpcomppack;
return status;
}
if ((srcdat = sources.GetOwnSourceInfo()) != 0)
{
if (srcdat->IsSender())
sender = true;
}
u_int32_t ssrc = rtppacketbuilder.GetSSRC();
RTPTime curtime = RTPTime::CurrentTime();
if (sender)
{
RTPTime rtppacktime = rtppacketbuilder.GetPacketTime();
u_int32_t rtppacktimestamp = rtppacketbuilder.GetPacketTimestamp();
u_int32_t packcount = rtppacketbuilder.GetPacketCount();
u_int32_t octetcount = rtppacketbuilder.GetPayloadOctetCount();
RTPTime diff = curtime;
diff -= rtppacktime;
u_int32_t tsdiff = (u_int32_t)((diff.GetDouble()/timestampunit)+0.5);
u_int32_t rtptimestamp = rtppacktimestamp+tsdiff;
RTPNTPTime ntptimestamp = curtime.GetNTPTime();
if ((status = rtcpcomppack->StartSenderReport(ssrc,ntptimestamp,rtptimestamp,packcount,octetcount)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
}
else
{
if ((status = rtcpcomppack->StartReceiverReport(ssrc)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
}
u_int8_t *owncname;
size_t owncnamelen;
owncname = ownsdesinfo.GetCNAME(&owncnamelen);
if ((status = rtcpcomppack->AddSDESSource(ssrc)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::CNAME,owncname,owncnamelen)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
if (!processingsdes)
{
int added,skipped;
bool full,atendoflist;
if ((status = FillInReportBlocks(rtcpcomppack,curtime,sources.GetTotalCount(),&full,&added,&skipped,&atendoflist)) < 0)
{
delete rtcpcomppack;
return status;
}
if (full && added == 0)
{
delete rtcpcomppack;
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
}
if (!full)
{
processingsdes = true;
sdesbuildcount++;
ClearAllSourceFlags();
doname = false;
doemail = false;
doloc = false;
dophone = false;
dotool = false;
donote = false;
if (interval_name > 0 && ((sdesbuildcount%interval_name) == 0)) doname = true;
if (interval_email > 0 && ((sdesbuildcount%interval_email) == 0)) doemail = true;
if (interval_location > 0 && ((sdesbuildcount%interval_location) == 0)) doloc = true;
if (interval_phone > 0 && ((sdesbuildcount%interval_phone) == 0)) dophone = true;
if (interval_tool > 0 && ((sdesbuildcount%interval_tool) == 0)) dotool = true;
if (interval_note > 0 && ((sdesbuildcount%interval_note) == 0)) donote = true;
bool processedall;
int itemcount;
if ((status = FillInSDES(rtcpcomppack,&full,&processedall,&itemcount)) < 0)
{
delete rtcpcomppack;
return status;
}
if (processedall)
{
processingsdes = false;
ClearAllSDESFlags();
if (!full && skipped > 0)
{
// if the packet isn't full and we skipped some
// sources that we already got in a previous packet,
// we can add some of them now
bool atendoflist;
if ((status = FillInReportBlocks(rtcpcomppack,curtime,skipped,&full,&added,&skipped,&atendoflist)) < 0)
{
delete rtcpcomppack;
return status;
}
}
}
}
}
else // previous sdes processing wasn't finished
{
bool processedall;
int itemcount;
bool full;
if ((status = FillInSDES(rtcpcomppack,&full,&processedall,&itemcount)) < 0)
{
delete rtcpcomppack;
return status;
}
if (itemcount == 0) // Big problem: packet size is too small to let any progress happen
{
delete rtcpcomppack;
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
}
if (processedall)
{
processingsdes = false;
ClearAllSDESFlags();
if (!full)
{
// if the packet isn't full and we skipped some
// we can add some report blocks
int added,skipped;
bool atendoflist;
if ((status = FillInReportBlocks(rtcpcomppack,curtime,sources.GetTotalCount(),&full,&added,&skipped,&atendoflist)) < 0)
{
delete rtcpcomppack;
return status;
}
if (atendoflist) // filled in all possible sources
ClearAllSourceFlags();
}
}
}
if ((status = rtcpcomppack->EndBuild()) < 0)
{
delete rtcpcomppack;
return status;
}
*pack = rtcpcomppack;
firstpacket = false;
prevbuildtime = curtime;
return 0;
}
void RTCPPacketBuilder::ClearAllSourceFlags()
{
if (sources.GotoFirstSource())
{
do
{
RTPSourceData *srcdat = sources.GetCurrentSourceInfo();
srcdat->SetProcessedInRTCP(false);
} while (sources.GotoNextSource());
}
}
int RTCPPacketBuilder::FillInReportBlocks(RTCPCompoundPacketBuilder *rtcpcomppack,const RTPTime &curtime,int maxcount,bool *full,int *added,int *skipped,bool *atendoflist)
{
RTPSourceData *srcdat;
int addedcount = 0;
int skippedcount = 0;
bool done = false;
bool filled = false;
bool atend = false;
int status;
if (sources.GotoFirstSource())
{
do
{
bool shouldprocess = false;
srcdat = sources.GetCurrentSourceInfo();
if (!srcdat->IsOwnSSRC()) // don't send to ourselves
{
if (!srcdat->IsCSRC()) // p 35: no reports should go to CSRCs
{
if (srcdat->INF_HasSentData()) // if this isn't true, INF_GetLastRTPPacketTime() won't make any sense
{
if (firstpacket)
shouldprocess = true;
else
{
// p 35: only if rtp packets were received since the last RTP packet, a report block
// should be added
RTPTime lastrtptime = srcdat->INF_GetLastRTPPacketTime();
if (lastrtptime > prevbuildtime)
shouldprocess = true;
}
}
}
}
if (shouldprocess)
{
if (srcdat->IsProcessedInRTCP()) // already covered this one
{
skippedcount++;
}
else
{
u_int32_t rr_ssrc = srcdat->GetSSRC();
u_int32_t num = srcdat->INF_GetNumPacketsReceivedInInterval();
u_int32_t prevseq = srcdat->INF_GetSavedExtendedSequenceNumber();
u_int32_t curseq = srcdat->INF_GetExtendedHighestSequenceNumber();
u_int32_t expected = curseq-prevseq;
u_int8_t fraclost;
if (expected < num) // got duplicates
fraclost = 0;
else
{
double lost = (double)(expected-num);
double frac = lost/((double)expected);
fraclost = (u_int8_t)(frac*256.0);
}
expected = curseq-srcdat->INF_GetBaseSequenceNumber();
num = srcdat->INF_GetNumPacketsReceived();
u_int32_t diff = expected-num;
int32_t *packlost = (int32_t *)&diff;
u_int32_t jitter = srcdat->INF_GetJitter();
u_int32_t lsr;
u_int32_t dlsr;
if (!srcdat->SR_HasInfo())
{
lsr = 0;
dlsr = 0;
}
else
{
RTPNTPTime srtime = srcdat->SR_GetNTPTimestamp();
u_int32_t m = (srtime.GetMSW()&0xFFFF);
u_int32_t l = ((srtime.GetLSW()>>16)&0xFFFF);
lsr = ((m<<16)|l);
RTPTime diff = curtime;
diff -= srcdat->SR_GetReceiveTime();
double diff2 = diff.GetDouble();
diff2 *= 65536.0;
dlsr = (u_int32_t)diff2;
}
status = rtcpcomppack->AddReportBlock(rr_ssrc,fraclost,*packlost,curseq,jitter,lsr,dlsr);
if (status < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
done = true;
filled = true;
}
else
return status;
}
else
{
addedcount++;
if (addedcount >= maxcount)
{
done = true;
if (!sources.GotoNextSource())
atend = true;
}
srcdat->INF_StartNewInterval();
srcdat->SetProcessedInRTCP(true);
}
}
}
if (!done)
{
if (!sources.GotoNextSource())
{
atend = true;
done = true;
}
}
} while (!done);
}
*added = addedcount;
*skipped = skippedcount;
*full = filled;
if (!atend) // search for available sources
{
bool shouldprocess = false;
do
{
srcdat = sources.GetCurrentSourceInfo();
if (!srcdat->IsOwnSSRC()) // don't send to ourselves
{
if (!srcdat->IsCSRC()) // p 35: no reports should go to CSRCs
{
if (srcdat->INF_HasSentData()) // if this isn't true, INF_GetLastRTPPacketTime() won't make any sense
{
if (firstpacket)
shouldprocess = true;
else
{
// p 35: only if rtp packets were received since the last RTP packet, a report block
// should be added
RTPTime lastrtptime = srcdat->INF_GetLastRTPPacketTime();
if (lastrtptime > prevbuildtime)
shouldprocess = true;
}
}
}
}
if (shouldprocess)
{
if (srcdat->IsProcessedInRTCP())
shouldprocess = false;
}
if (!shouldprocess)
{
if (!sources.GotoNextSource())
atend = true;
}
} while (!atend && !shouldprocess);
}
*atendoflist = atend;
return 0;
}
int RTCPPacketBuilder::FillInSDES(RTCPCompoundPacketBuilder *rtcpcomppack,bool *full,bool *processedall,int *added)
{
int status;
u_int8_t *data;
size_t datalen;
*full = false;
*processedall = false;
*added = 0;
// We don't need to add a SSRC for our own data, this is still set
// from adding the CNAME
if (doname)
{
if (!ownsdesinfo.ProcessedName())
{
data = ownsdesinfo.GetName(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::NAME,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedName(true);
}
}
if (doemail)
{
if (!ownsdesinfo.ProcessedEMail())
{
data = ownsdesinfo.GetEMail(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::EMAIL,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedEMail(true);
}
}
if (doloc)
{
if (!ownsdesinfo.ProcessedLocation())
{
data = ownsdesinfo.GetLocation(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::LOC,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedLocation(true);
}
}
if (dophone)
{
if (!ownsdesinfo.ProcessedPhone())
{
data = ownsdesinfo.GetPhone(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::PHONE,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedPhone(true);
}
}
if (dotool)
{
if (!ownsdesinfo.ProcessedTool())
{
data = ownsdesinfo.GetTool(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::TOOL,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedTool(true);
}
}
if (donote)
{
if (!ownsdesinfo.ProcessedNote())
{
data = ownsdesinfo.GetNote(&datalen);
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::NOTE,data,datalen)) < 0)
{
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
{
*full = true;
return 0;
}
}
(*added)++;
ownsdesinfo.SetProcessedNote(true);
}
}
*processedall = true;
return 0;
}
void RTCPPacketBuilder::ClearAllSDESFlags()
{
ownsdesinfo.ClearFlags();
}
int RTCPPacketBuilder::BuildBYEPacket(RTCPCompoundPacket **pack,const void *reason,size_t reasonlength,bool useSRifpossible)
{
if (!init)
return ERR_RTP_RTCPPACKETBUILDER_NOTINIT;
RTCPCompoundPacketBuilder *rtcpcomppack;
int status;
if (reasonlength > 255)
reasonlength = 255;
*pack = 0;
rtcpcomppack = new RTCPCompoundPacketBuilder();
if (rtcpcomppack == 0)
return ERR_RTP_OUTOFMEM;
if ((status = rtcpcomppack->InitBuild(maxpacketsize)) < 0)
{
delete rtcpcomppack;
return status;
}
u_int32_t ssrc = rtppacketbuilder.GetSSRC();
bool useSR = false;
if (useSRifpossible)
{
RTPSourceData *srcdat;
if ((srcdat = sources.GetOwnSourceInfo()) != 0)
{
if (srcdat->IsSender())
useSR = true;
}
}
if (useSR)
{
RTPTime curtime = RTPTime::CurrentTime();
RTPTime rtppacktime = rtppacketbuilder.GetPacketTime();
u_int32_t rtppacktimestamp = rtppacketbuilder.GetPacketTimestamp();
u_int32_t packcount = rtppacketbuilder.GetPacketCount();
u_int32_t octetcount = rtppacketbuilder.GetPayloadOctetCount();
RTPTime diff = curtime;
diff -= rtppacktime;
u_int32_t tsdiff = (u_int32_t)((diff.GetDouble()/timestampunit)+0.5);
u_int32_t rtptimestamp = rtppacktimestamp+tsdiff;
RTPNTPTime ntptimestamp = curtime.GetNTPTime();
if ((status = rtcpcomppack->StartSenderReport(ssrc,ntptimestamp,rtptimestamp,packcount,octetcount)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
}
else
{
if ((status = rtcpcomppack->StartReceiverReport(ssrc)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
}
u_int8_t *owncname;
size_t owncnamelen;
owncname = ownsdesinfo.GetCNAME(&owncnamelen);
if ((status = rtcpcomppack->AddSDESSource(ssrc)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
if ((status = rtcpcomppack->AddSDESNormalItem(RTCPSDESPacket::CNAME,owncname,owncnamelen)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
u_int32_t ssrcs[1];
ssrcs[0] = ssrc;
if ((status = rtcpcomppack->AddBYEPacket(ssrcs,1,(const u_int8_t *)reason,reasonlength)) < 0)
{
delete rtcpcomppack;
if (status == ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT)
return ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON;
return status;
}
if ((status = rtcpcomppack->EndBuild()) < 0)
{
delete rtcpcomppack;
return status;
}
*pack = rtcpcomppack;
return 0;
}

View File

@ -1,122 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPPACKETBUILDER_H
#define RTCPPACKETBUILDER_H
#include "rtpconfig.h"
#include "rtptypes.h"
#include "rtperrors.h"
#include "rtcpsdesinfo.h"
#include "rtptimeutilities.h"
class RTPSources;
class RTPPacketBuilder;
class RTCPScheduler;
class RTCPCompoundPacket;
class RTCPCompoundPacketBuilder;
class RTCPPacketBuilder
{
public:
RTCPPacketBuilder(RTPSources &sources,RTPPacketBuilder &rtppackbuilder);
~RTCPPacketBuilder();
int Init(size_t maxpacksize,double timestampunit,const void *cname,size_t cnamelen);
void Destroy();
int SetTimestampUnit(double tsunit) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; if (tsunit < 0) return ERR_RTP_RTCPPACKETBUILDER_ILLEGALTIMESTAMPUNIT; timestampunit = tsunit; return 0; }
int SetMaximumPacketSize(size_t maxpacksize) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; if (maxpacksize < RTP_MINPACKETSIZE) return ERR_RTP_RTCPPACKETBUILDER_ILLEGALMAXPACKSIZE; maxpacketsize = maxpacksize; return 0; }
int BuildNextPacket(RTCPCompoundPacket **pack);
int BuildBYEPacket(RTCPCompoundPacket **pack,const void *reason,size_t reasonlength,bool useSRifpossible = true);
void SetNameInterval(int count) { if (!init) return; interval_name = count; }
void SetEMailInterval(int count) { if (!init) return; interval_email = count; }
void SetLocationInterval(int count) { if (!init) return; interval_location = count; }
void SetPhoneInterval(int count) { if (!init) return; interval_phone = count; }
void SetToolInterval(int count) { if (!init) return; interval_tool = count; }
void SetNoteInterval(int count) { if (!init) return; interval_note = count; }
int SetLocalName(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetName((const u_int8_t *)s,len); }
int SetLocalEMail(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetEMail((const u_int8_t *)s,len); }
int SetLocalLocation(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetLocation((const u_int8_t *)s,len); }
int SetLocalPhone(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetPhone((const u_int8_t *)s,len); }
int SetLocalTool(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetTool((const u_int8_t *)s,len); }
int SetLocalNote(const void *s,size_t len) { if (!init) return ERR_RTP_RTCPPACKETBUILDER_NOTINIT; return ownsdesinfo.SetNote((const u_int8_t *)s,len); }
private:
void ClearAllSourceFlags();
int FillInReportBlocks(RTCPCompoundPacketBuilder *pack,const RTPTime &curtime,int maxcount,bool *full,int *added,int *skipped,bool *atendoflist);
int FillInSDES(RTCPCompoundPacketBuilder *pack,bool *full,bool *processedall,int *added);
void ClearAllSDESFlags();
RTPSources &sources;
RTPPacketBuilder &rtppacketbuilder;
bool init;
size_t maxpacketsize;
double timestampunit;
bool firstpacket;
RTPTime prevbuildtime;
class RTCPSDESInfoInternal : public RTCPSDESInfo
{
public:
RTCPSDESInfoInternal() { ClearFlags(); }
void ClearFlags() { pname = false; pemail = false; plocation = false; pphone = false; ptool = false; pnote = false; }
bool ProcessedName() const { return pname; }
bool ProcessedEMail() const { return pemail; }
bool ProcessedLocation() const { return plocation; }
bool ProcessedPhone() const { return pphone; }
bool ProcessedTool() const { return ptool; }
bool ProcessedNote() const { return pnote; }
void SetProcessedName(bool v) { pname = v; }
void SetProcessedEMail(bool v) { pemail = v; }
void SetProcessedLocation(bool v) { plocation = v; }
void SetProcessedPhone(bool v) { pphone = v; }
void SetProcessedTool(bool v) { ptool = v; }
void SetProcessedNote(bool v) { pnote = v; }
private:
bool pname,pemail,plocation,pphone,ptool,pnote;
};
RTCPSDESInfoInternal ownsdesinfo;
int interval_name,interval_email,interval_location;
int interval_phone,interval_tool,interval_note;
bool doname,doemail,doloc,dophone,dotool,donote;
bool processingsdes;
int sdesbuildcount;
};
#endif // RTCPPACKETBUILDER_H

View File

@ -1,94 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcprrpacket.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTCPRRPacket::RTCPRRPacket(u_int8_t *data,size_t datalength)
: RTCPPacket(RR,data,datalength)
{
knownformat = false;
RTCPCommonHeader *hdr;
size_t len = datalength;
size_t expectedlength;
hdr = (RTCPCommonHeader *)data;
if (hdr->padding)
{
u_int8_t padcount = data[datalength-1];
if ((padcount & 0x03) != 0) // not a multiple of four! (see rfc 3550 p 37)
return;
if (((size_t)padcount) >= len)
return;
len -= (size_t)padcount;
}
expectedlength = sizeof(RTCPCommonHeader)+sizeof(u_int32_t);
expectedlength += sizeof(RTCPReceiverReport)*((int)hdr->count);
if (expectedlength != len)
return;
knownformat = true;
}
#ifdef RTPDEBUG
void RTCPRRPacket::Dump()
{
RTCPPacket::Dump();
if (!IsKnownFormat())
std::cout << " Unknown format" << std::endl;
else
{
int num = GetReceptionReportCount();
int i;
std::cout << " SSRC of sender: " << GetSenderSSRC() << std::endl;
for (i = 0 ; i < num ; i++)
{
std::cout << " Report block " << i << std::endl;
std::cout << " SSRC: " << GetSSRC(i) << std::endl;
std::cout << " Fraction lost: " << (u_int32_t)GetFractionLost(i) << std::endl;
std::cout << " Packets lost: " << GetLostPacketCount(i) << std::endl;
std::cout << " Seq. nr.: " << GetExtendedHighestSequenceNumber(i) << std::endl;
std::cout << " Jitter: " << GetJitter(i) << std::endl;
std::cout << " LSR: " << GetLSR(i) << std::endl;
std::cout << " DLSR: " << GetDLSR(i) << std::endl;
}
}
}
#endif // RTPDEBUG

View File

@ -1,158 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPRRPACKET_H
#define RTCPRRPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
#include "rtpstructs.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTCPCompoundPacket;
class RTCPRRPacket : public RTCPPacket
{
public:
RTCPRRPacket(u_int8_t *data,size_t datalen);
~RTCPRRPacket() { }
// Sender info
u_int32_t GetSenderSSRC() const;
// Reportblocks
int GetReceptionReportCount() const;
// Note: the validity of index is NOT checked!
u_int32_t GetSSRC(int index) const;
u_int8_t GetFractionLost(int index) const;
int32_t GetLostPacketCount(int index) const;
u_int32_t GetExtendedHighestSequenceNumber(int index) const;
u_int32_t GetJitter(int index) const;
u_int32_t GetLSR(int index) const;
u_int32_t GetDLSR(int index) const;
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
RTCPReceiverReport *GotoReport(int index) const;
};
inline u_int32_t RTCPRRPacket::GetSenderSSRC() const
{
if (!knownformat)
return 0;
u_int32_t *ssrcptr = (u_int32_t *)(data+sizeof(RTCPCommonHeader));
return ntohl(*ssrcptr);
}
inline int RTCPRRPacket::GetReceptionReportCount() const
{
if (!knownformat)
return 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
return ((int)hdr->count);
}
inline RTCPReceiverReport *RTCPRRPacket::GotoReport(int index) const
{
RTCPReceiverReport *r = (RTCPReceiverReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+index*sizeof(RTCPReceiverReport));
return r;
}
inline u_int32_t RTCPRRPacket::GetSSRC(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->ssrc);
}
inline u_int8_t RTCPRRPacket::GetFractionLost(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return r->fractionlost;
}
inline int32_t RTCPRRPacket::GetLostPacketCount(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
u_int32_t count = ((u_int32_t)r->packetslost[2])|(((u_int32_t)r->packetslost[1])<<8)|(((u_int32_t)r->packetslost[0])<<16);
if ((count&0x00800000) != 0) // test for negative number
count |= 0xFF000000;
int32_t *count2 = (int32_t *)(&count);
return (*count2);
}
inline u_int32_t RTCPRRPacket::GetExtendedHighestSequenceNumber(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->exthighseqnr);
}
inline u_int32_t RTCPRRPacket::GetJitter(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->jitter);
}
inline u_int32_t RTCPRRPacket::GetLSR(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->lsr);
}
inline u_int32_t RTCPRRPacket::GetDLSR(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->dlsr);
}
#endif // RTCPRRPACKET_H

View File

@ -1,381 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpscheduler.h"
#include "rtpsources.h"
#include "rtpdefines.h"
#include "rtcppacket.h"
#include "rtppacket.h"
#include "rtcpcompoundpacket.h"
#include "rtpsourcedata.h"
#include "rtpdebug.h"
#define RTCPSCHED_MININTERVAL 1.0
RTCPSchedulerParams::RTCPSchedulerParams() : mininterval(RTCP_DEFAULTMININTERVAL)
{
bandwidth = 1000; // TODO What is a good value here?
senderfraction = RTCP_DEFAULTSENDERFRACTION;
usehalfatstartup = RTCP_DEFAULTHALFATSTARTUP;
immediatebye = RTCP_DEFAULTIMMEDIATEBYE;
#if (defined(WIN32) || defined(_WIN32_WCE))
timeinit.Dummy();
#endif // WIN32 || _WIN32_WCE
}
RTCPSchedulerParams::~RTCPSchedulerParams()
{
}
int RTCPSchedulerParams::SetRTCPBandwidth(double bw)
{
if (bw < 0.0)
return ERR_RTP_SCHEDPARAMS_INVALIDBANDWIDTH;
bandwidth = bw;
return 0;
}
int RTCPSchedulerParams::SetSenderBandwidthFraction(double fraction)
{
if (fraction < 0.0 || fraction > 1.0)
return ERR_RTP_SCHEDPARAMS_BADFRACTION;
senderfraction = fraction;
return 0;
}
int RTCPSchedulerParams::SetMinimumTransmissionInterval(const RTPTime &t)
{
double t2 = t.GetDouble();
if (t2 < RTCPSCHED_MININTERVAL)
return ERR_RTP_SCHEDPARAMS_BADMINIMUMINTERVAL;
mininterval = t;
return 0;
}
RTCPScheduler::RTCPScheduler(RTPSources &s) : sources(s),nextrtcptime(0,0),prevrtcptime(0,0)
{
Reset();
}
RTCPScheduler::~RTCPScheduler()
{
}
void RTCPScheduler::Reset()
{
headeroverhead = 0; // user has to set this to an appropriate value
hassentrtcp = false;
firstcall = true;
avgrtcppacksize = 1000; // TODO: what is a good value for this?
byescheduled = false;
sendbyenow = false;
}
void RTCPScheduler::AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack)
{
bool isbye = false;
RTCPPacket *p;
rtcpcomppack.GotoFirstPacket();
while (!isbye && ((p = rtcpcomppack.GetNextPacket()) != 0))
{
if (p->GetPacketType() == RTCPPacket::BYE)
isbye = true;
}
if (!isbye)
{
size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();
avgrtcppacksize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgrtcppacksize));
}
else
{
if (byescheduled)
{
size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();
avgbyepacketsize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgbyepacketsize));
byemembers++;
}
}
}
void RTCPScheduler::AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack)
{
bool isbye = false;
RTCPPacket *p;
rtcpcomppack.GotoFirstPacket();
while (!isbye && ((p = rtcpcomppack.GetNextPacket()) != 0))
{
if (p->GetPacketType() == RTCPPacket::BYE)
isbye = true;
}
if (!isbye)
{
size_t packsize = headeroverhead+rtcpcomppack.GetCompoundPacketLength();
avgrtcppacksize = (size_t)((1.0/16.0)*((double)packsize)+(15.0/16.0)*((double)avgrtcppacksize));
}
hassentrtcp = true;
}
RTPTime RTCPScheduler::GetTransmissionDelay()
{
if (firstcall)
{
firstcall = false;
prevrtcptime = RTPTime::CurrentTime();
pmembers = sources.GetActiveMemberCount();
CalculateNextRTCPTime();
}
RTPTime curtime = RTPTime::CurrentTime();
if (curtime > nextrtcptime) // packet should be sent
return RTPTime(0,0);
RTPTime diff = nextrtcptime;
diff -= curtime;
return diff;
}
bool RTCPScheduler::IsTime()
{
if (firstcall)
{
firstcall = false;
prevrtcptime = RTPTime::CurrentTime();
pmembers = sources.GetActiveMemberCount();
CalculateNextRTCPTime();
return false;
}
RTPTime currenttime = RTPTime::CurrentTime();
if (currenttime < nextrtcptime) // timer has not yet expired
return false;
RTPTime checktime(0,0);
if (!byescheduled)
{
bool aresender = false;
RTPSourceData *srcdat;
if ((srcdat = sources.GetOwnSourceInfo()) != 0)
aresender = srcdat->IsSender();
checktime = CalculateTransmissionInterval(aresender);
}
else
checktime = CalculateBYETransmissionInterval();
checktime += prevrtcptime;
if (checktime <= currenttime) // Okay
{
byescheduled = false;
prevrtcptime = currenttime;
pmembers = sources.GetActiveMemberCount();
CalculateNextRTCPTime();
return true;
}
nextrtcptime = checktime;
pmembers = sources.GetActiveMemberCount();
return false;
}
void RTCPScheduler::CalculateNextRTCPTime()
{
bool aresender = false;
RTPSourceData *srcdat;
if ((srcdat = sources.GetOwnSourceInfo()) != 0)
aresender = srcdat->IsSender();
nextrtcptime = RTPTime::CurrentTime();
nextrtcptime += CalculateTransmissionInterval(aresender);
}
RTPTime RTCPScheduler::CalculateDeterministicInterval(bool sender /* = false */)
{
int numsenders = sources.GetSenderCount();
int numtotal = sources.GetActiveMemberCount();
// Try to avoid division by zero:
if (numtotal == 0)
numtotal++;
double sfraction = ((double)numsenders)/((double)numtotal);
double C,n;
if (sfraction <= schedparams.GetSenderBandwidthFraction())
{
if (sender)
{
C = ((double)avgrtcppacksize)/(schedparams.GetSenderBandwidthFraction()*schedparams.GetRTCPBandwidth());
n = (double)numsenders;
}
else
{
C = ((double)avgrtcppacksize)/((1.0-schedparams.GetSenderBandwidthFraction())*schedparams.GetRTCPBandwidth());
n = (double)(numtotal-numsenders);
}
}
else
{
C = ((double)avgrtcppacksize)/schedparams.GetRTCPBandwidth();
n = (double)numtotal;
}
RTPTime Tmin = schedparams.GetMinimumTransmissionInterval();
double tmin = Tmin.GetDouble();
if (!hassentrtcp && schedparams.GetUseHalfAtStartup())
tmin /= 2.0;
double ntimesC = n*C;
double Td = (tmin>ntimesC)?tmin:ntimesC;
return RTPTime(Td);
}
RTPTime RTCPScheduler::CalculateTransmissionInterval(bool sender)
{
RTPTime Td = CalculateDeterministicInterval(sender);
double td,mul,T;
td = Td.GetDouble();
mul = rtprand.GetRandomDouble()+0.5; // gives random value between 0.5 and 1.5
T = (td*mul)/1.21828; // see RFC 3550 p 30
return RTPTime(T);
}
void RTCPScheduler::PerformReverseReconsideration()
{
if (firstcall)
return;
double diff1,diff2;
int members = sources.GetActiveMemberCount();
RTPTime tc = RTPTime::CurrentTime();
RTPTime tn_min_tc = nextrtcptime;
tn_min_tc -= tc;
RTPTime tc_min_tp = tc;
tc_min_tp -= prevrtcptime;
if (pmembers == 0) // avoid division by zero
pmembers++;
diff1 = (((double)members)/((double)pmembers))*tn_min_tc.GetDouble();
diff2 = (((double)members)/((double)pmembers))*tc_min_tp.GetDouble();
nextrtcptime = tc;
prevrtcptime = tc;
nextrtcptime += RTPTime(diff1);
prevrtcptime -= RTPTime(diff2);
pmembers = members;
}
void RTCPScheduler::ScheduleBYEPacket(size_t packetsize)
{
if (byescheduled)
return;
if (firstcall)
{
firstcall = false;
pmembers = sources.GetActiveMemberCount();
}
byescheduled = true;
avgbyepacketsize = packetsize+headeroverhead;
// For now, we will always use the BYE backoff algorithm as described in rfc 3550 p 33
byemembers = 1;
pbyemembers = 1;
if (schedparams.GetRequestImmediateBYE() && sources.GetActiveMemberCount() < 50) // p 34 (top)
sendbyenow = true;
else
sendbyenow = false;
prevrtcptime = RTPTime::CurrentTime();
nextrtcptime = prevrtcptime;
nextrtcptime += CalculateBYETransmissionInterval();
}
void RTCPScheduler::ActiveMemberDecrease()
{
if (sources.GetActiveMemberCount() < pmembers)
PerformReverseReconsideration();
}
RTPTime RTCPScheduler::CalculateBYETransmissionInterval()
{
if (!byescheduled)
return RTPTime(0,0);
if (sendbyenow)
return RTPTime(0,0);
double C,n;
C = ((double)avgbyepacketsize)/((1.0-schedparams.GetSenderBandwidthFraction())*schedparams.GetRTCPBandwidth());
n = (double)byemembers;
RTPTime Tmin = schedparams.GetMinimumTransmissionInterval();
double tmin = Tmin.GetDouble();
if (schedparams.GetUseHalfAtStartup())
tmin /= 2.0;
double ntimesC = n*C;
double Td = (tmin>ntimesC)?tmin:ntimesC;
double mul = rtprand.GetRandomDouble()+0.5; // gives random value between 0.5 and 1.5
double T = (Td*mul)/1.21828; // see RFC 3550 p 30
return RTPTime(T);
}

View File

@ -1,122 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPSCHEDULER_H
#define RTCPSCHEDULER_H
#include "rtpconfig.h"
#include "rtptimeutilities.h"
#include "rtprandom.h"
class RTCPCompoundPacket;
class RTPPacket;
class RTPSources;
class RTCPSchedulerParams
{
public:
RTCPSchedulerParams();
~RTCPSchedulerParams();
int SetRTCPBandwidth(double bw); // bandwidth is in bytes per second
double GetRTCPBandwidth() const { return bandwidth; }
int SetSenderBandwidthFraction(double fraction);
double GetSenderBandwidthFraction() const { return senderfraction; }
int SetMinimumTransmissionInterval(const RTPTime &t);
RTPTime GetMinimumTransmissionInterval() const { return mininterval; }
void SetUseHalfAtStartup(bool usehalf) { usehalfatstartup = usehalf; }
bool GetUseHalfAtStartup() const { return usehalfatstartup; }
void SetRequestImmediateBYE(bool v) { immediatebye = v; }
bool GetRequestImmediateBYE() const { return immediatebye; }
private:
double bandwidth;
double senderfraction;
RTPTime mininterval;
bool usehalfatstartup;
bool immediatebye;
};
class RTCPScheduler
{
public:
RTCPScheduler(RTPSources &sources);
~RTCPScheduler();
void Reset();
void SetParameters(const RTCPSchedulerParams &params) { schedparams = params; }
RTCPSchedulerParams GetParameters() const { return schedparams; }
void SetHeaderOverhead(size_t numbytes) { headeroverhead = numbytes; }
size_t GetHeaderOverhead() const { return headeroverhead; }
void AnalyseIncoming(RTCPCompoundPacket &rtcpcomppack);
void AnalyseOutgoing(RTCPCompoundPacket &rtcpcomppack);
// is to be called when a source times out or when a bye packet was received
void ActiveMemberDecrease();
void ScheduleBYEPacket(size_t packetsize);
RTPTime GetTransmissionDelay();
// Returns true is it is time to send a packet and then recalculates the next rtcp time
// So, if the function would be called immediately after it returned true, it would then
// return false
bool IsTime();
RTPTime CalculateDeterministicInterval(bool sender = false);
private:
void CalculateNextRTCPTime();
void PerformReverseReconsideration();
RTPTime CalculateBYETransmissionInterval();
RTPTime CalculateTransmissionInterval(bool sender);
RTPSources &sources;
RTCPSchedulerParams schedparams;
size_t headeroverhead;
size_t avgrtcppacksize;
bool hassentrtcp;
bool firstcall;
RTPTime nextrtcptime;
RTPTime prevrtcptime;
int pmembers;
// for BYE packet scheduling
bool byescheduled;
int byemembers,pbyemembers;
size_t avgbyepacketsize;
bool sendbyenow;
RTPRandom rtprand;
};
#endif // RTCPSCHEDULER_H

View File

@ -1,177 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpsdesinfo.h"
#include "rtpdebug.h"
void RTCPSDESInfo::Clear()
{
#ifdef RTP_SUPPORT_SDESPRIV
std::list<SDESPrivateItem *>::const_iterator it;
for (it = privitems.begin() ; it != privitems.end() ; ++it)
delete *it;
privitems.clear();
#endif // RTP_SUPPORT_SDESPRIV
}
#ifdef RTP_SUPPORT_SDESPRIV
int RTCPSDESInfo::SetPrivateValue(const u_int8_t *prefix,size_t prefixlen,const u_int8_t *value,size_t valuelen)
{
std::list<SDESPrivateItem *>::const_iterator it;
bool found;
found = false;
it = privitems.begin();
while (!found && it != privitems.end())
{
u_int8_t *p;
size_t l;
p = (*it)->GetPrefix(&l);
if (l == prefixlen)
{
if (l <= 0)
found = true;
else if (memcmp(prefix,p,l) == 0)
found = true;
else
++it;
}
else
++it;
}
SDESPrivateItem *item;
if (found) // replace the value for this entry
item = *it;
else // no entry for this prefix found... add it
{
if (privitems.size() >= RTP_MAXPRIVITEMS) // too many items present, just ignore it
return ERR_RTP_SDES_MAXPRIVITEMS;
int status;
item = new SDESPrivateItem();
if (item == 0)
return ERR_RTP_OUTOFMEM;
if ((status = item->SetPrefix(prefix,prefixlen)) < 0)
{
delete item;
return status;
}
privitems.push_front(item);
}
return item->SetInfo(value,valuelen);
}
int RTCPSDESInfo::DeletePrivatePrefix(const u_int8_t *prefix,size_t prefixlen)
{
std::list<SDESPrivateItem *>::iterator it;
bool found;
found = false;
it = privitems.begin();
while (!found && it != privitems.end())
{
u_int8_t *p;
size_t l;
p = (*it)->GetPrefix(&l);
if (l == prefixlen)
{
if (l <= 0)
found = true;
else if (memcmp(prefix,p,l) == 0)
found = true;
else
++it;
}
else
++it;
}
if (!found)
return ERR_RTP_SDES_PREFIXNOTFOUND;
delete (*it);
privitems.erase(it);
return 0;
}
void RTCPSDESInfo::GotoFirstPrivateValue()
{
curitem = privitems.begin();
}
bool RTCPSDESInfo::GetNextPrivateValue(u_int8_t **prefix,size_t *prefixlen,u_int8_t **value,size_t *valuelen)
{
if (curitem == privitems.end())
return false;
*prefix = (*curitem)->GetPrefix(prefixlen);
*value = (*curitem)->GetInfo(valuelen);
++curitem;
return true;
}
bool RTCPSDESInfo::GetPrivateValue(const u_int8_t *prefix,size_t prefixlen,u_int8_t **value,size_t *valuelen) const
{
std::list<SDESPrivateItem *>::const_iterator it;
bool found;
found = false;
it = privitems.begin();
while (!found && it != privitems.end())
{
u_int8_t *p;
size_t l;
p = (*it)->GetPrefix(&l);
if (l == prefixlen)
{
if (l <= 0)
found = true;
else if (memcmp(prefix,p,l) == 0)
found = true;
else
++it;
}
else
++it;
}
if (found)
*value = (*it)->GetInfo(valuelen);
return found;
}
#endif // RTP_SUPPORT_SDESPRIV

View File

@ -1,138 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPSDESINFO_H
#define RTCPSDESINFO_H
#include "rtpconfig.h"
#include "rtperrors.h"
#include "rtpdefines.h"
#include "rtptypes.h"
#include <string.h>
#include <list>
class RTCPSDESInfo
{
public:
RTCPSDESInfo() { }
virtual ~RTCPSDESInfo() { Clear(); }
void Clear();
int SetCNAME(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_CNAME-1,s,l); }
int SetName(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_NAME-1,s,l); }
int SetEMail(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_EMAIL-1,s,l); }
int SetPhone(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_PHONE-1,s,l); }
int SetLocation(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_LOCATION-1,s,l); }
int SetTool(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_TOOL-1,s,l); }
int SetNote(const u_int8_t *s,size_t l) { return SetNonPrivateItem(RTCP_SDES_ID_NOTE-1,s,l); }
#ifdef RTP_SUPPORT_SDESPRIV
int SetPrivateValue(const u_int8_t *prefix,size_t prefixlen,const u_int8_t *value,size_t valuelen);
int DeletePrivatePrefix(const u_int8_t *s,size_t len);
#endif // RTP_SUPPORT_SDESPRIV
u_int8_t *GetCNAME(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_CNAME-1,len); }
u_int8_t *GetName(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_NAME-1,len); }
u_int8_t *GetEMail(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_EMAIL-1,len); }
u_int8_t *GetPhone(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_PHONE-1,len); }
u_int8_t *GetLocation(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_LOCATION-1,len); }
u_int8_t *GetTool(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_TOOL-1,len); }
u_int8_t *GetNote(size_t *len) const { return GetNonPrivateItem(RTCP_SDES_ID_NOTE-1,len); }
#ifdef RTP_SUPPORT_SDESPRIV
void GotoFirstPrivateValue();
bool GetNextPrivateValue(u_int8_t **prefix,size_t *prefixlen,u_int8_t **value,size_t *valuelen);
bool GetPrivateValue(const u_int8_t *prefix,size_t prefixlen,u_int8_t **value,size_t *valuelen) const;
#endif // RTP_SUPPORT_SDESPRIV
private:
int SetNonPrivateItem(int itemno,const u_int8_t *s,size_t l) { if (l > RTCP_SDES_MAXITEMLENGTH) return ERR_RTP_SDES_LENGTHTOOBIG; return nonprivateitems[itemno].SetInfo(s,l); }
u_int8_t *GetNonPrivateItem(int itemno,size_t *len) const { return nonprivateitems[itemno].GetInfo(len); }
class SDESItem
{
public:
SDESItem() { str = 0; length = 0; }
~SDESItem() { if (str) delete [] str; }
u_int8_t *GetInfo(size_t *len) const { *len = length; return str; }
int SetInfo(const u_int8_t *s,size_t len) { return SetString(&str,&length,s,len); }
protected:
static int SetString(u_int8_t **dest,size_t *destlen,const u_int8_t *s,size_t len)
{
if (len <= 0)
{
if (*dest)
delete [] (*dest);
*dest = 0;
*destlen = 0;
}
else
{
len = (len>RTCP_SDES_MAXITEMLENGTH)?RTCP_SDES_MAXITEMLENGTH:len;
u_int8_t *str2 = new u_int8_t[len];
if (str2 == 0)
return ERR_RTP_OUTOFMEM;
memcpy(str2,s,len);
*destlen = len;
if (*dest)
delete [] (*dest);
*dest = str2;
}
return 0;
}
private:
u_int8_t *str;
size_t length;
};
SDESItem nonprivateitems[RTCP_SDES_NUMITEMS_NONPRIVATE];
#ifdef RTP_SUPPORT_SDESPRIV
class SDESPrivateItem : public SDESItem
{
public:
SDESPrivateItem() { prefixlen = 0; prefix = 0; }
~SDESPrivateItem() { if (prefix) delete [] prefix; }
u_int8_t *GetPrefix(size_t *len) const { *len = prefixlen; return prefix; }
int SetPrefix(const u_int8_t *s,size_t len) { return SetString(&prefix,&prefixlen,s,len); }
private:
u_int8_t *prefix;
size_t prefixlen;
};
std::list<SDESPrivateItem *> privitems;
std::list<SDESPrivateItem *>::const_iterator curitem;
#endif // RTP_SUPPORT_SDESPRIV
};
#endif // RTCPSDESINFO_H

View File

@ -1,230 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpsdespacket.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTCPSDESPacket::RTCPSDESPacket(u_int8_t *data,size_t datalength)
: RTCPPacket(SDES,data,datalength)
{
knownformat = false;
currentchunk = 0;
itemoffset = 0;
curchunknum = 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
size_t len = datalength;
if (hdr->padding)
{
u_int8_t padcount = data[datalength-1];
if ((padcount & 0x03) != 0) // not a multiple of four! (see rfc 3550 p 37)
return;
if (((size_t)padcount) >= len)
return;
len -= (size_t)padcount;
}
if (hdr->count == 0)
{
if (len != sizeof(RTCPCommonHeader))
return;
}
else
{
int ssrccount = (int)(hdr->count);
u_int8_t *chunk;
int chunkoffset;
if (len < sizeof(RTCPCommonHeader))
return;
len -= sizeof(RTCPCommonHeader);
chunk = data+sizeof(RTCPCommonHeader);
while ((ssrccount > 0) && (len > 0))
{
chunkoffset = 0;
if (len < (sizeof(u_int32_t)*2)) // chunk must contain at least a SSRC identifier
return; // and a (possibly empty) item
len -= sizeof(u_int32_t);
chunkoffset = sizeof(u_int32_t);
bool done = false;
while (!done)
{
if (len < 1) // at least a zero byte (end of item list) should be there
return;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(chunk+chunkoffset);
if (sdeshdr->id == 0) // end of item list
{
len--;
chunkoffset++;
size_t r = (chunkoffset&0x03);
if (r != 0)
{
size_t addoffset = 4-r;
if (addoffset > len)
return;
len -= addoffset;
chunkoffset += addoffset;
}
done = true;
}
else
{
if (len < sizeof(RTCPSDESHeader))
return;
len -= sizeof(RTCPSDESHeader);
chunkoffset += sizeof(RTCPSDESHeader);
size_t itemlen = (size_t)(sdeshdr->length);
if (itemlen > len)
return;
len -= itemlen;
chunkoffset += itemlen;
}
}
ssrccount--;
chunk += chunkoffset;
}
// check for remaining bytes
if (len > 0)
return;
if (ssrccount > 0)
return;
}
knownformat = true;
}
#ifdef RTPDEBUG
void RTCPSDESPacket::Dump()
{
RTCPPacket::Dump();
if (!IsKnownFormat())
{
std::cout << " Unknown format" << std::endl;
return;
}
if (!GotoFirstChunk())
{
std::cout << " No chunks present" << std::endl;
return;
}
do
{
std::cout << " SDES Chunk for SSRC: " << GetChunkSSRC() << std::endl;
if (!GotoFirstItem())
std::cout << " No items found" << std::endl;
else
{
do
{
std::cout << " ";
switch (GetItemType())
{
case None:
std::cout << "None ";
break;
case CNAME:
std::cout << "CNAME ";
break;
case NAME:
std::cout << "NAME ";
break;
case EMAIL:
std::cout << "EMAIL ";
break;
case PHONE:
std::cout << "PHONE ";
break;
case LOC:
std::cout << "LOC ";
break;
case TOOL:
std::cout << "TOOL ";
break;
case NOTE:
std::cout << "NOTE ";
break;
case PRIV:
std::cout << "PRIV ";
break;
case Unknown:
default:
std::cout << "Unknown ";
}
std::cout << "Length: " << GetItemLength() << std::endl;
if (GetItemType() != PRIV)
{
char str[1024];
memcpy(str,GetItemData(),GetItemLength());
str[GetItemLength()] = 0;
std::cout << " Value: " << str << std::endl;
}
#ifdef RTP_SUPPORT_SDESPRIV
else // PRIV item
{
char str[1024];
memcpy(str,GetPRIVPrefixData(),GetPRIVPrefixLength());
str[GetPRIVPrefixLength()] = 0;
std::cout << " Prefix: " << str << std::endl;
std::cout << " Length: " << GetPRIVPrefixLength() << std::endl;
memcpy(str,GetPRIVValueData(),GetPRIVValueLength());
str[GetPRIVValueLength()] = 0;
std::cout << " Value: " << str << std::endl;
std::cout << " Length: " << GetPRIVValueLength() << std::endl;
}
#endif // RTP_SUPPORT_SDESPRIV
} while (GotoNextItem());
}
} while (GotoNextChunk());
}
#endif // RTPDEBUG

View File

@ -1,314 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPSDESPACKET_H
#define RTCPSDESPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
#include "rtpstructs.h"
#include "rtpdefines.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTCPCompoundPacket;
class RTCPSDESPacket : public RTCPPacket
{
public:
enum ItemType { None,CNAME,NAME,EMAIL,PHONE,LOC,TOOL,NOTE,PRIV,Unknown };
RTCPSDESPacket(u_int8_t *data,size_t datalen);
~RTCPSDESPacket() { }
int GetChunkCount() const;
bool GotoFirstChunk();
bool GotoNextChunk();
u_int32_t GetChunkSSRC() const;
bool GotoFirstItem();
bool GotoNextItem();
ItemType GetItemType() const;
size_t GetItemLength() const;
u_int8_t *GetItemData();
#ifdef RTP_SUPPORT_SDESPRIV
size_t GetPRIVPrefixLength() const;
u_int8_t *GetPRIVPrefixData();
size_t GetPRIVValueLength() const;
u_int8_t *GetPRIVValueData();
#endif // RTP_SUPPORT_SDESPRIV
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
u_int8_t *currentchunk;
int curchunknum;
size_t itemoffset;
};
inline int RTCPSDESPacket::GetChunkCount() const
{
if (!knownformat)
return 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
return ((int)hdr->count);
}
inline bool RTCPSDESPacket::GotoFirstChunk()
{
if (GetChunkCount() == 0)
{
currentchunk = 0;
return false;
}
currentchunk = data+sizeof(RTCPCommonHeader);
curchunknum = 1;
itemoffset = sizeof(u_int32_t);
return true;
}
inline bool RTCPSDESPacket::GotoNextChunk()
{
if (!knownformat)
return false;
if (currentchunk == 0)
return false;
if (curchunknum == GetChunkCount())
return false;
size_t offset = sizeof(u_int32_t);
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+sizeof(u_int32_t));
while (sdeshdr->id != 0)
{
offset += sizeof(RTCPSDESHeader);
offset += (size_t)(sdeshdr->length);
sdeshdr = (RTCPSDESHeader *)(currentchunk+offset);
}
offset++; // for the zero byte
if ((offset&0x03) != 0)
offset += (4-(offset&0x03));
currentchunk += offset;
curchunknum++;
itemoffset = sizeof(u_int32_t);
return true;
}
inline u_int32_t RTCPSDESPacket::GetChunkSSRC() const
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
u_int32_t *ssrc = (u_int32_t *)currentchunk;
return ntohl(*ssrc);
}
inline bool RTCPSDESPacket::GotoFirstItem()
{
if (!knownformat)
return false;
if (currentchunk == 0)
return false;
itemoffset = sizeof(u_int32_t);
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id == 0)
return false;
return true;
}
inline bool RTCPSDESPacket::GotoNextItem()
{
if (!knownformat)
return false;
if (currentchunk == 0)
return false;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id == 0)
return false;
size_t offset = itemoffset;
offset += sizeof(RTCPSDESHeader);
offset += (size_t)(sdeshdr->length);
sdeshdr = (RTCPSDESHeader *)(currentchunk+offset);
if (sdeshdr->id == 0)
return false;
itemoffset = offset;
return true;
}
inline RTCPSDESPacket::ItemType RTCPSDESPacket::GetItemType() const
{
if (!knownformat)
return None;
if (currentchunk == 0)
return None;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
switch (sdeshdr->id)
{
case 0:
return None;
case RTCP_SDES_ID_CNAME:
return CNAME;
case RTCP_SDES_ID_NAME:
return NAME;
case RTCP_SDES_ID_EMAIL:
return EMAIL;
case RTCP_SDES_ID_PHONE:
return PHONE;
case RTCP_SDES_ID_LOCATION:
return LOC;
case RTCP_SDES_ID_TOOL:
return TOOL;
case RTCP_SDES_ID_NOTE:
return NOTE;
case RTCP_SDES_ID_PRIVATE:
return PRIV;
default:
return Unknown;
}
return Unknown;
}
inline size_t RTCPSDESPacket::GetItemLength() const
{
if (!knownformat)
return None;
if (currentchunk == 0)
return None;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id == 0)
return 0;
return (size_t)(sdeshdr->length);
}
inline u_int8_t *RTCPSDESPacket::GetItemData()
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id == 0)
return 0;
return (currentchunk+itemoffset+sizeof(RTCPSDESHeader));
}
#ifdef RTP_SUPPORT_SDESPRIV
inline size_t RTCPSDESPacket::GetPRIVPrefixLength() const
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id != RTCP_SDES_ID_PRIVATE)
return 0;
if (sdeshdr->length == 0)
return 0;
u_int8_t *preflen = currentchunk+itemoffset+sizeof(RTCPSDESHeader);
size_t prefixlength = (size_t)(*preflen);
if (prefixlength > (size_t)((sdeshdr->length)-1))
return 0;
return prefixlength;
}
inline u_int8_t *RTCPSDESPacket::GetPRIVPrefixData()
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id != RTCP_SDES_ID_PRIVATE)
return 0;
if (sdeshdr->length == 0)
return 0;
u_int8_t *preflen = currentchunk+itemoffset+sizeof(RTCPSDESHeader);
size_t prefixlength = (size_t)(*preflen);
if (prefixlength > (size_t)((sdeshdr->length)-1))
return 0;
if (prefixlength == 0)
return 0;
return (currentchunk+itemoffset+sizeof(RTCPSDESHeader)+1);
}
inline size_t RTCPSDESPacket::GetPRIVValueLength() const
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id != RTCP_SDES_ID_PRIVATE)
return 0;
if (sdeshdr->length == 0)
return 0;
u_int8_t *preflen = currentchunk+itemoffset+sizeof(RTCPSDESHeader);
size_t prefixlength = (size_t)(*preflen);
if (prefixlength > (size_t)((sdeshdr->length)-1))
return 0;
return ((size_t)(sdeshdr->length))-prefixlength-1;
}
inline u_int8_t *RTCPSDESPacket::GetPRIVValueData()
{
if (!knownformat)
return 0;
if (currentchunk == 0)
return 0;
RTCPSDESHeader *sdeshdr = (RTCPSDESHeader *)(currentchunk+itemoffset);
if (sdeshdr->id != RTCP_SDES_ID_PRIVATE)
return 0;
if (sdeshdr->length == 0)
return 0;
u_int8_t *preflen = currentchunk+itemoffset+sizeof(RTCPSDESHeader);
size_t prefixlength = (size_t)(*preflen);
if (prefixlength > (size_t)((sdeshdr->length)-1))
return 0;
size_t valuelen = ((size_t)(sdeshdr->length))-prefixlength-1;
if (valuelen == 0)
return 0;
return (currentchunk+itemoffset+sizeof(RTCPSDESHeader)+1+prefixlength);
}
#endif // RTP_SUPPORT_SDESPRIV
#endif // RTCPSDESPACKET_H

View File

@ -1,101 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtcpsrpacket.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTCPSRPacket::RTCPSRPacket(u_int8_t *data,size_t datalength)
: RTCPPacket(SR,data,datalength)
{
knownformat = false;
RTCPCommonHeader *hdr;
size_t len = datalength;
size_t expectedlength;
hdr = (RTCPCommonHeader *)data;
if (hdr->padding)
{
u_int8_t padcount = data[datalength-1];
if ((padcount & 0x03) != 0) // not a multiple of four! (see rfc 3550 p 37)
return;
if (((size_t)padcount) >= len)
return;
len -= (size_t)padcount;
}
expectedlength = sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+sizeof(RTCPSenderReport);
expectedlength += sizeof(RTCPReceiverReport)*((int)hdr->count);
if (expectedlength != len)
return;
knownformat = true;
}
#ifdef RTPDEBUG
void RTCPSRPacket::Dump()
{
RTCPPacket::Dump();
if (!IsKnownFormat())
std::cout << " Unknown format" << std::endl;
else
{
int num = GetReceptionReportCount();
int i;
RTPNTPTime t = GetNTPTimestamp();
std::cout << " SSRC of sender: " << GetSenderSSRC() << std::endl;
std::cout << " Sender info:" << std::endl;
std::cout << " NTP timestamp: " << t.GetMSW() << ":" << t.GetLSW() << std::endl;
std::cout << " RTP timestamp: " << GetRTPTimestamp() << std::endl;
std::cout << " Packet count: " << GetSenderPacketCount() << std::endl;
std::cout << " Octet count: " << GetSenderOctetCount() << std::endl;
for (i = 0 ; i < num ; i++)
{
std::cout << " Report block " << i << std::endl;
std::cout << " SSRC: " << GetSSRC(i) << std::endl;
std::cout << " Fraction lost: " << (u_int32_t)GetFractionLost(i) << std::endl;
std::cout << " Packets lost: " << GetLostPacketCount(i) << std::endl;
std::cout << " Seq. nr.: " << GetExtendedHighestSequenceNumber(i) << std::endl;
std::cout << " Jitter: " << GetJitter(i) << std::endl;
std::cout << " LSR: " << GetLSR(i) << std::endl;
std::cout << " DLSR: " << GetDLSR(i) << std::endl;
}
}
}
#endif // RTPDEBUG

View File

@ -1,197 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPSRPACKET_H
#define RTCPSRPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
#include "rtptimeutilities.h"
#include "rtpstructs.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTCPCompoundPacket;
class RTCPSRPacket : public RTCPPacket
{
public:
RTCPSRPacket(u_int8_t *data,size_t datalength);
~RTCPSRPacket() { }
// Sender info
u_int32_t GetSenderSSRC() const;
RTPNTPTime GetNTPTimestamp() const;
u_int32_t GetRTPTimestamp() const;
u_int32_t GetSenderPacketCount() const;
u_int32_t GetSenderOctetCount() const;
// Reportblocks
int GetReceptionReportCount() const;
// Note: the validity of index is NOT checked!
u_int32_t GetSSRC(int index) const;
u_int8_t GetFractionLost(int index) const;
int32_t GetLostPacketCount(int index) const;
u_int32_t GetExtendedHighestSequenceNumber(int index) const;
u_int32_t GetJitter(int index) const;
u_int32_t GetLSR(int index) const;
u_int32_t GetDLSR(int index) const;
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
RTCPReceiverReport *GotoReport(int index) const;
};
inline u_int32_t RTCPSRPacket::GetSenderSSRC() const
{
if (!knownformat)
return 0;
u_int32_t *ssrcptr = (u_int32_t *)(data+sizeof(RTCPCommonHeader));
return ntohl(*ssrcptr);
}
inline RTPNTPTime RTCPSRPacket::GetNTPTimestamp() const
{
if (!knownformat)
return RTPNTPTime(0,0);
RTCPSenderReport *sr = (RTCPSenderReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t));
return RTPNTPTime(ntohl(sr->ntptime_msw),ntohl(sr->ntptime_lsw));
}
inline u_int32_t RTCPSRPacket::GetRTPTimestamp() const
{
if (!knownformat)
return 0;
RTCPSenderReport *sr = (RTCPSenderReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t));
return ntohl(sr->rtptimestamp);
}
inline u_int32_t RTCPSRPacket::GetSenderPacketCount() const
{
if (!knownformat)
return 0;
RTCPSenderReport *sr = (RTCPSenderReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t));
return ntohl(sr->packetcount);
}
inline u_int32_t RTCPSRPacket::GetSenderOctetCount() const
{
if (!knownformat)
return 0;
RTCPSenderReport *sr = (RTCPSenderReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t));
return ntohl(sr->octetcount);
}
inline int RTCPSRPacket::GetReceptionReportCount() const
{
if (!knownformat)
return 0;
RTCPCommonHeader *hdr = (RTCPCommonHeader *)data;
return ((int)hdr->count);
}
inline RTCPReceiverReport *RTCPSRPacket::GotoReport(int index) const
{
RTCPReceiverReport *r = (RTCPReceiverReport *)(data+sizeof(RTCPCommonHeader)+sizeof(u_int32_t)+sizeof(RTCPSenderReport)+index*sizeof(RTCPReceiverReport));
return r;
}
inline u_int32_t RTCPSRPacket::GetSSRC(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->ssrc);
}
inline u_int8_t RTCPSRPacket::GetFractionLost(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return r->fractionlost;
}
inline int32_t RTCPSRPacket::GetLostPacketCount(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
u_int32_t count = ((u_int32_t)r->packetslost[2])|(((u_int32_t)r->packetslost[1])<<8)|(((u_int32_t)r->packetslost[0])<<16);
if ((count&0x00800000) != 0) // test for negative number
count |= 0xFF000000;
int32_t *count2 = (int32_t *)(&count);
return (*count2);
}
inline u_int32_t RTCPSRPacket::GetExtendedHighestSequenceNumber(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->exthighseqnr);
}
inline u_int32_t RTCPSRPacket::GetJitter(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->jitter);
}
inline u_int32_t RTCPSRPacket::GetLSR(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->lsr);
}
inline u_int32_t RTCPSRPacket::GetDLSR(int index) const
{
if (!knownformat)
return 0;
RTCPReceiverReport *r = GotoReport(index);
return ntohl(r->dlsr);
}
#endif // RTCPSRPACKET_H

View File

@ -1,55 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTCPUNKNOWNPACKET_H
#define RTCPUNKNOWNPACKET_H
#include "rtpconfig.h"
#include "rtcppacket.h"
class RTCPCompoundPacket;
class RTCPUnknownPacket : public RTCPPacket
{
public:
RTCPUnknownPacket(u_int8_t *data,size_t datalen) :
RTCPPacket(Unknown,data,datalen)
{
// Since we don't expect a format, we'll trivially put knownformat = true
knownformat = true;
}
~RTCPUnknownPacket() { }
};
#endif // RTCPUNKNOWNPACKET_H

View File

@ -1,64 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPADDRESS_H
#define RTPADDRESS_H
#include "rtpconfig.h"
#include <string>
class RTPAddress
{
public:
enum AddressType { IPv4Address, IPv6Address, UserDefinedAddress };
AddressType GetAddressType() const { return addresstype; }
virtual RTPAddress *CreateCopy() const = 0;
// note: these functions should be able to handle a NULL argument
virtual bool IsSameAddress(const RTPAddress *addr) const = 0;
virtual bool IsFromSameHost(const RTPAddress *addr) const = 0;
#ifdef RTPDEBUG
virtual std::string GetAddressString() const = 0;
#endif // RTPDEBUG
virtual ~RTPAddress() { }
protected:
RTPAddress(const AddressType t) : addresstype(t) { } // only allow subclasses to be created
private:
const AddressType addresstype;
};
#endif // RTPADDRESS_H

View File

@ -1,124 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtpcollisionlist.h"
#include "rtperrors.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTPCollisionList::RTPCollisionList()
{
#if (defined(WIN32) || defined(_WIN32_WCE))
timeinit.Dummy();
#endif // WIN32 || _WIN32_WCE
}
void RTPCollisionList::Clear()
{
std::list<AddressAndTime>::iterator it;
for (it = addresslist.begin() ; it != addresslist.end() ; it++)
delete (*it).addr;
addresslist.clear();
}
int RTPCollisionList::UpdateAddress(const RTPAddress *addr,const RTPTime &receivetime,bool *created)
{
if (addr == 0)
return ERR_RTP_COLLISIONLIST_BADADDRESS;
std::list<AddressAndTime>::iterator it;
for (it = addresslist.begin() ; it != addresslist.end() ; it++)
{
if (((*it).addr)->IsSameAddress(addr))
{
(*it).recvtime = receivetime;
*created = false;
return 0;
}
}
RTPAddress *newaddr = addr->CreateCopy();
if (newaddr == 0)
return ERR_RTP_OUTOFMEM;
addresslist.push_back(AddressAndTime(newaddr,receivetime));
*created = true;
return 0;
}
bool RTPCollisionList::HasAddress(const RTPAddress *addr) const
{
std::list<AddressAndTime>::const_iterator it;
for (it = addresslist.begin() ; it != addresslist.end() ; it++)
{
if (((*it).addr)->IsSameAddress(addr))
return true;
}
return false;
}
void RTPCollisionList::Timeout(const RTPTime &currenttime,const RTPTime &timeoutdelay)
{
std::list<AddressAndTime>::iterator it;
RTPTime checktime = currenttime;
checktime -= timeoutdelay;
it = addresslist.begin();
while(it != addresslist.end())
{
if ((*it).recvtime < checktime) // timeout
{
delete (*it).addr;
it = addresslist.erase(it);
}
else
it++;
}
}
#ifdef RTPDEBUG
void RTPCollisionList::Dump()
{
std::list<AddressAndTime>::const_iterator it;
for (it = addresslist.begin() ; it != addresslist.end() ; it++)
std::cout << "Address: " << ((*it).addr)->GetAddressString() << "\tTime: " << (*it).recvtime.GetSeconds() << std::endl;
}
#endif // RTPDEBUG

View File

@ -1,70 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPCOLLISIONLIST_H
#define RTPCOLLISIONLIST_H
#include "rtpconfig.h"
#include "rtpaddress.h"
#include "rtptimeutilities.h"
#include <list>
class RTPAddress;
class RTPCollisionList
{
public:
RTPCollisionList();
~RTPCollisionList() { Clear(); }
void Clear();
int UpdateAddress(const RTPAddress *addr,const RTPTime &receivetime,bool *created);
bool HasAddress(const RTPAddress *addr) const;
void Timeout(const RTPTime &currenttime,const RTPTime &timeoutdelay);
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
class AddressAndTime
{
public:
AddressAndTime(RTPAddress *a,const RTPTime &t) : addr(a),recvtime(t) { }
RTPAddress *addr;
RTPTime recvtime;
};
std::list<AddressAndTime> addresslist;
};
#endif // RTPCOLLISIONLIST_H

View File

@ -1,45 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPCONFIG_H
#define RTPCONFIG_H
#if (defined(WIN32) || defined(_WIN32_WCE))
#include "rtpconfig_win.h"
#else
#include "rtpconfig_unix.h"
#endif // WIN32
// #define RTPDEBUG
#endif // RTPCONFIG_H

View File

@ -1,72 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPCONFIG_UNIX_H
#define RTPCONFIG_UNIX_H
@RTP_FILIO@
@RTP_SOCKIO@
@RTP_ENDIAN@
@RTP_SOCKLENTYPE_UINT@
@RTP_HAVE_SOCKADDR_LEN@
@RTP_SUPPORT_IPV4MULTICAST@
@RTP_SUPPORT_THREAD@
@RTP_SUPPORT_SDESPRIV@
@RTP_SUPPORT_INLINETEMPLATEPARAM@
@RTP_SUPPORT_PROBATION@
@RTP_SUPPORT_GNUDRAND@
@RTP_SUPPORT_RANDR@
@RTP_SUPPORT_GETLOGINR@
@RTP_SUPPORT_IPV6@
@RTP_SUPPORT_IPV6MULTICAST@
@RTP_SUPPORT_IFADDRS@
@RTP_SUPPORT_GST@
#endif // RTPCONFIG_UNIX_H

View File

@ -1,50 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPCONFIG_WIN_H
#define RTPCONFIG_WIN_H
#define RTP_SUPPORT_IPV4MULTICAST
#define RTP_SUPPORT_THREAD
#define RTP_SUPPORT_PROBATION
#define RTP_SUPPORT_SDESPRIV
//#define RTP_SUPPORT_IPV6
//#define RTP_SUPPORT_IPV6MULTICAST
#endif // RTPCONFIG_WIN_H

View File

@ -1,177 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtpconfig.h"
#ifdef RTPDEBUG
#include "rtptypes.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
struct MemoryInfo
{
void *ptr;
size_t size;
int lineno;
char *filename;
MemoryInfo *next;
};
class MemoryTracker
{
public:
MemoryTracker() { firstblock = NULL; }
~MemoryTracker()
{
MemoryInfo *tmp;
int count = 0;
printf("Checking for memory leaks...\n");fflush(stdout);
while(firstblock)
{
count++;
printf("Unfreed block %p of %d bytes (file '%s', line %d)\n",firstblock->ptr,(int)firstblock->size,firstblock->filename,firstblock->lineno);;
tmp = firstblock->next;
free(firstblock->ptr);
if (firstblock->filename)
free(firstblock->filename);
free(firstblock);
firstblock = tmp;
}
if (count == 0)
printf("No memory leaks found\n");
else
printf("%d leaks found\n",count);
}
MemoryInfo *firstblock;
};
static MemoryTracker memtrack;
void *donew(size_t s,char filename[],int line)
{
void *p;
MemoryInfo *meminf;
p = malloc(s);
meminf = (MemoryInfo *)malloc(sizeof(MemoryInfo));
meminf->ptr = p;
meminf->size = s;
meminf->lineno = line;
meminf->filename = (char *)malloc(strlen(filename)+1);
strcpy(meminf->filename,filename);
meminf->next = memtrack.firstblock;
memtrack.firstblock = meminf;
return p;
}
void dodelete(void *p)
{
MemoryInfo *tmp,*tmpprev;
bool found;
tmpprev = NULL;
tmp = memtrack.firstblock;
found = false;
while (tmp != NULL && !found)
{
if (tmp->ptr == p)
found = true;
else
{
tmpprev = tmp;
tmp = tmp->next;
}
}
if (!found)
{
printf("Couldn't free block %p!\n",p);
fflush(stdout);
}
else
{
MemoryInfo *n;
fflush(stdout);
n = tmp->next;
free(tmp->ptr);
if (tmp->filename)
free(tmp->filename);
free(tmp);
if (tmpprev)
tmpprev->next = n;
else
memtrack.firstblock = n;
}
}
void *operator new(size_t s)
{
return donew(s,"UNKNOWN FILE",0);
}
void *operator new[](size_t s)
{
return donew(s,"UNKNOWN FILE",0);
}
void *operator new(size_t s,char filename[],int line)
{
return donew(s,filename,line);
}
void *operator new[](size_t s,char filename[],int line)
{
return donew(s,filename,line);
}
void operator delete(void *p)
{
dodelete(p);
}
void operator delete[](void *p)
{
dodelete(p);
}
#endif // RTPDEBUG

View File

@ -1,52 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPDEBUG_H
#define RTPDEBUG_H
#include "rtpconfig.h"
#ifdef RTPDEBUG
#include "rtptypes.h"
void *operator new(size_t s,char filename[],int line);
#if ! (defined(WIN32) || defined(_WIN32_WCE))
void *operator new[](size_t s,char filename[],int line);
#define new new (__FILE__,__LINE__)
#else
#define new new (__FILE__,__LINE__)
#endif // WIN32
#endif // RTPDEBUG
#endif // RTPDEBUG_H

View File

@ -1,75 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPDEFINES_H
#define RTPDEFINES_H
#define RTP_VERSION 2
#define RTP_MAXCSRCS 15
#define RTP_MINPACKETSIZE 600
#define RTP_DEFAULTPACKETSIZE 1400
#define RTP_PROBATIONCOUNT 2
#define RTP_MAXPRIVITEMS 256
#define RTP_SENDERTIMEOUTMULTIPLIER 2
#define RTP_BYETIMEOUTMULTIPLIER 1
#define RTP_MEMBERTIMEOUTMULTIPLIER 5
#define RTP_COLLISIONTIMEOUTMULTIPLIER 10
#define RTP_NOTETTIMEOUTMULTIPLIER 25
#define RTP_DEFAULTSESSIONBANDWIDTH 10000.0
#define RTP_RTCPTYPE_SR 200
#define RTP_RTCPTYPE_RR 201
#define RTP_RTCPTYPE_SDES 202
#define RTP_RTCPTYPE_BYE 203
#define RTP_RTCPTYPE_APP 204
#define RTCP_SDES_ID_CNAME 1
#define RTCP_SDES_ID_NAME 2
#define RTCP_SDES_ID_EMAIL 3
#define RTCP_SDES_ID_PHONE 4
#define RTCP_SDES_ID_LOCATION 5
#define RTCP_SDES_ID_TOOL 6
#define RTCP_SDES_ID_NOTE 7
#define RTCP_SDES_ID_PRIVATE 8
#define RTCP_SDES_NUMITEMS_NONPRIVATE 7
#define RTCP_SDES_MAXITEMLENGTH 255
#define RTCP_BYE_MAXREASONLENGTH 255
#define RTCP_DEFAULTMININTERVAL 5.0
#define RTCP_DEFAULTBANDWIDTHFRACTION 0.05
#define RTCP_DEFAULTSENDERFRACTION 0.25
#define RTCP_DEFAULTHALFATSTARTUP true
#define RTCP_DEFAULTIMMEDIATEBYE true
#define RTCP_DEFAULTSRBYE true
#endif // RTPDEFINES_H

View File

@ -1,223 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtperrors.h"
#include "rtpdebug.h"
struct RTPErrorInfo
{
int code;
char *description;
};
static RTPErrorInfo ErrorDescriptions[]=
{
{ ERR_RTP_OUTOFMEM,"Out of memory" },
{ ERR_RTP_NOTHREADSUPPORT, "No JThread support was compiled in"},
{ ERR_RTP_COLLISIONLIST_BADADDRESS, "Passed invalid address (null) to collision list"},
{ ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS, "Element already exists in hash table"},
{ ERR_RTP_HASHTABLE_ELEMENTNOTFOUND, "Element not found in hash table"},
{ ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX, "Function returned an illegal hash index"},
{ ERR_RTP_HASHTABLE_NOCURRENTELEMENT, "No current element selected in hash table"},
{ ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX, "Function returned an illegal hash index"},
{ ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS, "Key value already exists in key hash table"},
{ ERR_RTP_KEYHASHTABLE_KEYNOTFOUND, "Key value not found in key hash table"},
{ ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT, "No current element selected in key hash table"},
{ ERR_RTP_PACKBUILD_ALREADYINIT, "RTP packet builder is already initialized"},
{ ERR_RTP_PACKBUILD_CSRCALREADYINLIST, "The specified CSRC is already in the RTP packet builder's CSRC list"},
{ ERR_RTP_PACKBUILD_CSRCLISTFULL, "The RTP packet builder's CSRC list already contains 15 entries"},
{ ERR_RTP_PACKBUILD_CSRCNOTINLIST, "The specified CSRC was not found in the RTP packet builder's CSRC list"},
{ ERR_RTP_PACKBUILD_DEFAULTMARKNOTSET, "The RTP packet builder's default mark flag is not set"},
{ ERR_RTP_PACKBUILD_DEFAULTPAYLOADTYPENOTSET, "The RTP packet builder's default payload type is not set"},
{ ERR_RTP_PACKBUILD_DEFAULTTSINCNOTSET, "The RTP packet builder's default timestamp increment is not set"},
{ ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE, "The specified maximum packet size for the RTP packet builder is invalid"},
{ ERR_RTP_PACKBUILD_NOTINIT, "The RTP packet builder is not initialized"},
{ ERR_RTP_PACKET_BADPAYLOADTYPE, "Invalid payload type"},
{ ERR_RTP_PACKET_DATAEXCEEDSMAXSIZE, "Tried to create an RTP packet which whould exceed the specified maximum packet size"},
{ ERR_RTP_PACKET_EXTERNALBUFFERNULL, "Illegal value (null) passed as external buffer for the RTP packet"},
{ ERR_RTP_PACKET_ILLEGALBUFFERSIZE, "Illegal buffer size specified for the RTP packet"},
{ ERR_RTP_PACKET_INVALIDPACKET, "Invalid RTP packet format"},
{ ERR_RTP_PACKET_TOOMANYCSRCS, "More than 15 CSRCs specified for the RTP packet"},
{ ERR_RTP_POLLTHREAD_ALREADYRUNNING, "Poll thread is already running"},
{ ERR_RTP_POLLTHREAD_CANTINITMUTEX, "Can't initialize a mutex for the poll thread"},
{ ERR_RTP_POLLTHREAD_CANTSTARTTHREAD, "Can't start the poll thread"},
{ ERR_RTP_RTCPCOMPOUND_INVALIDPACKET, "Invalid RTCP compound packet format"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILDING, "Already building this RTCP compound packet"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILT, "This RTCP compound packet is already built"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYGOTREPORT, "There's already a SR or RR in this RTCP compound packet"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_APPDATALENTOOBIG, "The specified APP data length for the RTCP compound packet is too big"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_BUFFERSIZETOOSMALL, "The specified buffer size for the RTCP comound packet is too small"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALAPPDATALENGTH, "The APP data length must be a multiple of four"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALSUBTYPE, "The APP packet subtype must be smaller than 32"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_INVALIDITEMTYPE, "Invalid SDES item type specified for the RTCP compound packet"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_MAXPACKETSIZETOOSMALL, "The specified maximum packet size for the RTCP compound packet is too small"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_NOCURRENTSOURCE, "Tried to add an SDES item to the RTCP compound packet when no SSRC was present"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_NOREPORTPRESENT, "An RTCP compound packet must contain a SR or RR"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING, "The RTCP compound packet builder is not initialized"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT, "Adding this data would exceed the specified maximum RTCP compound packet size"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_REPORTNOTSTARTED, "Tried to add a report block to the RTCP compound packet when no SR or RR was started"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_TOOMANYSSRCS, "Only 31 SSRCs will fit into a BYE packet for the RTCP compound packet"},
{ ERR_RTP_RTCPCOMPPACKBUILDER_TOTALITEMLENGTHTOOBIG, "The total data for the SDES PRIV item exceeds the maximum size (255 bytes) of an SDES item"},
{ ERR_RTP_RTCPPACKETBUILDER_ALREADYINIT, "The RTCP packet builder is already initialized"},
{ ERR_RTP_RTCPPACKETBUILDER_ILLEGALMAXPACKSIZE, "The specified maximum packet size for the RTCP packet builder is too small"},
{ ERR_RTP_RTCPPACKETBUILDER_ILLEGALTIMESTAMPUNIT, "Speficied an illegal timestamp unit for the the RTCP packet builder"},
{ ERR_RTP_RTCPPACKETBUILDER_NOTINIT, "The RTCP packet builder was not initialized"},
{ ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON, "The RTCP compound packet filled sooner than expected"},
{ ERR_RTP_SCHEDPARAMS_BADFRACTION, "Illegal sender bandwidth fraction specified"},
{ ERR_RTP_SCHEDPARAMS_BADMINIMUMINTERVAL, "The minimum RTCP interval specified for the scheduler is too small"},
{ ERR_RTP_SCHEDPARAMS_INVALIDBANDWIDTH, "Invalid RTCP bandwidth specified for the RTCP scheduler"},
{ ERR_RTP_SDES_LENGTHTOOBIG, "Specified size for the SDES item exceeds 255 bytes"},
{ ERR_RTP_SDES_PREFIXNOTFOUND, "The specified SDES PRIV prefix was not found"},
{ ERR_RTP_SESSION_ALREADYCREATED, "The session is already created"},
{ ERR_RTP_SESSION_CANTGETLOGINNAME, "Can't retrieve login name"},
{ ERR_RTP_SESSION_CANTINITMUTEX, "A mutex for the RTP session couldn't be initialized"},
{ ERR_RTP_SESSION_MAXPACKETSIZETOOSMALL, "The maximum packet size specified for the RTP session is too small"},
{ ERR_RTP_SESSION_NOTCREATED, "The RTP session was not created"},
{ ERR_RTP_SESSION_UNSUPPORTEDTRANSMISSIONPROTOCOL, "The requested transmission protocol for the RTP session is not supported"},
{ ERR_RTP_SESSION_USINGPOLLTHREAD, "This function is not available when using the RTP poll thread feature"},
{ ERR_RTP_SESSION_USERDEFINEDTRANSMITTERNULL, "A user-defined transmitter was requested but the supplied transmitter component is NULL"},
{ ERR_RTP_SOURCES_ALREADYHAVEOWNSSRC, "Only one source can be marked as own SSRC in the source table"},
{ ERR_RTP_SOURCES_DONTHAVEOWNSSRC, "No source was marked as own SSRC in the source table"},
{ ERR_RTP_SOURCES_ILLEGALSDESTYPE, "Illegal SDES type specified for processing into the source table"},
{ ERR_RTP_SOURCES_SSRCEXISTS, "Can't create own SSRC because this SSRC identifier is already in the source table"},
{ ERR_RTP_UDPV4TRANS_ALREADYCREATED, "The transmitter was already created"},
{ ERR_RTP_UDPV4TRANS_ALREADYINIT, "The transmitter was already initialize"},
{ ERR_RTP_UDPV4TRANS_ALREADYWAITING, "The transmitter is already waiting for incoming data"},
{ ERR_RTP_UDPV4TRANS_CANTBINDRTCPSOCKET, "The 'bind' call for the RTCP socket failed"},
{ ERR_RTP_UDPV4TRANS_CANTBINDRTPSOCKET, "The 'bind' call for the RTP socket failed"},
{ ERR_RTP_UDPV4TRANS_CANTCALCULATELOCALIP, "The local IP addresses could not be determined"},
{ ERR_RTP_UDPV4TRANS_CANTCREATEABORTDESCRIPTORS, "Couldn't create the sockets used to abort waiting for incoming data"},
{ ERR_RTP_UDPV4TRANS_CANTCREATEPIPE, "Couldn't create the pipe used to abort waiting for incoming data"},
{ ERR_RTP_UDPV4TRANS_CANTCREATESOCKET, "Couldn't create the RTP or RTCP socket"},
{ ERR_RTP_UDPV4TRANS_CANTINITMUTEX, "Failed to initialize a mutex used by the transmitter"},
{ ERR_RTP_UDPV4TRANS_CANTSETRTCPRECEIVEBUF, "Couldn't set the receive buffer size for the RTCP socket"},
{ ERR_RTP_UDPV4TRANS_CANTSETRTCPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTCP socket"},
{ ERR_RTP_UDPV4TRANS_CANTSETRTPRECEIVEBUF, "Couldn't set the receive buffer size for the RTP socket"},
{ ERR_RTP_UDPV4TRANS_CANTSETRTPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTP socket"},
{ ERR_RTP_UDPV4TRANS_COULDNTJOINMULTICASTGROUP, "Unable to join the specified multicast group"},
{ ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE, "The function called doens't match the current receive mode"},
{ ERR_RTP_UDPV4TRANS_ERRORINSELECT, "Error in the transmitter's 'select' call"},
{ ERR_RTP_UDPV4TRANS_ILLEGALPARAMETERS, "Illegal parameters type passed to the transmitter"},
{ ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE, "Specified address type isn't compatible with this transmitter"},
{ ERR_RTP_UDPV4TRANS_NOLOCALIPS, "Couldn't determine the local host name since the local IP list is empty"},
{ ERR_RTP_UDPV4TRANS_NOMULTICASTSUPPORT, "Multicast support is not available"},
{ ERR_RTP_UDPV4TRANS_NOSUCHENTRY, "Specified entry could not be found"},
{ ERR_RTP_UDPV4TRANS_NOTAMULTICASTADDRESS, "The specified address is not a multicast address"},
{ ERR_RTP_UDPV4TRANS_NOTCREATED, "The 'Create' call for this transmitter has not been called"},
{ ERR_RTP_UDPV4TRANS_NOTINIT, "The 'Init' call for this transmitter has not been called"},
{ ERR_RTP_UDPV4TRANS_NOTWAITING, "The transmitter is not waiting for incoming data"},
{ ERR_RTP_UDPV4TRANS_PORTBASENOTEVEN, "The specified port base is not an even number"},
{ ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG, "The maximum packet size is too big for this transmitter"},
{ ERR_RTP_UDPV6TRANS_ALREADYCREATED, "The transmitter was already created"},
{ ERR_RTP_UDPV6TRANS_ALREADYINIT, "The transmitter was already initialize"},
{ ERR_RTP_UDPV6TRANS_ALREADYWAITING, "The transmitter is already waiting for incoming data"},
{ ERR_RTP_UDPV6TRANS_CANTBINDRTCPSOCKET, "The 'bind' call for the RTCP socket failed"},
{ ERR_RTP_UDPV6TRANS_CANTBINDRTPSOCKET, "The 'bind' call for the RTP socket failed"},
{ ERR_RTP_UDPV6TRANS_CANTCALCULATELOCALIP, "The local IP addresses could not be determined"},
{ ERR_RTP_UDPV6TRANS_CANTCREATEABORTDESCRIPTORS, "Couldn't create the sockets used to abort waiting for incoming data"},
{ ERR_RTP_UDPV6TRANS_CANTCREATEPIPE, "Couldn't create the pipe used to abort waiting for incoming data"},
{ ERR_RTP_UDPV6TRANS_CANTCREATESOCKET, "Couldn't create the RTP or RTCP socket"},
{ ERR_RTP_UDPV6TRANS_CANTINITMUTEX, "Failed to initialize a mutex used by the transmitter"},
{ ERR_RTP_UDPV6TRANS_CANTSETRTCPRECEIVEBUF, "Couldn't set the receive buffer size for the RTCP socket"},
{ ERR_RTP_UDPV6TRANS_CANTSETRTCPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTCP socket"},
{ ERR_RTP_UDPV6TRANS_CANTSETRTPRECEIVEBUF, "Couldn't set the receive buffer size for the RTP socket"},
{ ERR_RTP_UDPV6TRANS_CANTSETRTPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTP socket"},
{ ERR_RTP_UDPV6TRANS_COULDNTJOINMULTICASTGROUP, "Unable to join the specified multicast group"},
{ ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE, "The function called doens't match the current receive mode"},
{ ERR_RTP_UDPV6TRANS_ERRORINSELECT, "Error in the transmitter's 'select' call"},
{ ERR_RTP_UDPV6TRANS_ILLEGALPARAMETERS, "Illegal parameters type passed to the transmitter"},
{ ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE, "Specified address type isn't compatible with this transmitter"},
{ ERR_RTP_UDPV6TRANS_NOLOCALIPS, "Couldn't determine the local host name since the local IP list is empty"},
{ ERR_RTP_UDPV6TRANS_NOMULTICASTSUPPORT, "Multicast support is not available"},
{ ERR_RTP_UDPV6TRANS_NOSUCHENTRY, "Specified entry could not be found"},
{ ERR_RTP_UDPV6TRANS_NOTAMULTICASTADDRESS, "The specified address is not a multicast address"},
{ ERR_RTP_UDPV6TRANS_NOTCREATED, "The 'Create' call for this transmitter has not been called"},
{ ERR_RTP_UDPV6TRANS_NOTINIT, "The 'Init' call for this transmitter has not been called"},
{ ERR_RTP_UDPV6TRANS_NOTWAITING, "The transmitter is not waiting for incoming data"},
{ ERR_RTP_UDPV6TRANS_PORTBASENOTEVEN, "The specified port base is not an even number"},
{ ERR_RTP_UDPV6TRANS_SPECIFIEDSIZETOOBIG, "The maximum packet size is too big for this transmitter"},
{ ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL,"The hostname is larger than the specified buffer size"},
{ ERR_RTP_SDES_MAXPRIVITEMS,"The maximum number of SDES private item prefixes was reached"},
{ ERR_RTP_INTERNALSOURCEDATA_INVALIDPROBATIONTYPE,"An invalid probation type was specified"},
{ ERR_RTP_GSTV4TRANS_ALREADYCREATED, "The transmitter was already created"},
{ ERR_RTP_GSTV4TRANS_ALREADYINIT, "The transmitter was already initialize"},
{ ERR_RTP_GSTV4TRANS_ALREADYWAITING, "The transmitter is already waiting for incoming data"},
{ ERR_RTP_GSTV4TRANS_CANTBINDRTCPSOCKET, "The 'bind' call for the RTCP socket failed"},
{ ERR_RTP_GSTV4TRANS_CANTBINDRTPSOCKET, "The 'bind' call for the RTP socket failed"},
{ ERR_RTP_GSTV4TRANS_CANTCALCULATELOCALIP, "The local IP addresses could not be determined"},
{ ERR_RTP_GSTV4TRANS_CANTCREATEABORTDESCRIPTORS, "Couldn't create the sockets used to abort waiting for incoming data"},
{ ERR_RTP_GSTV4TRANS_CANTCREATEPIPE, "Couldn't create the pipe used to abort waiting for incoming data"},
{ ERR_RTP_GSTV4TRANS_CANTCREATESOCKET, "Couldn't create the RTP or RTCP socket"},
{ ERR_RTP_GSTV4TRANS_CANTINITMUTEX, "Failed to initialize a mutex used by the transmitter"},
{ ERR_RTP_GSTV4TRANS_CANTSETRTCPRECEIVEBUF, "Couldn't set the receive buffer size for the RTCP socket"},
{ ERR_RTP_GSTV4TRANS_CANTSETRTCPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTCP socket"},
{ ERR_RTP_GSTV4TRANS_CANTSETRTPRECEIVEBUF, "Couldn't set the receive buffer size for the RTP socket"},
{ ERR_RTP_GSTV4TRANS_CANTSETRTPTRANSMITBUF, "Couldn't set the transmission buffer size for the RTP socket"},
{ ERR_RTP_GSTV4TRANS_COULDNTJOINMULTICASTGROUP, "Unable to join the specified multicast group"},
{ ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE, "The function called doens't match the current receive mode"},
{ ERR_RTP_GSTV4TRANS_ERRORINSELECT, "Error in the transmitter's 'select' call"},
{ ERR_RTP_GSTV4TRANS_ILLEGALPARAMETERS, "Illegal parameters type passed to the transmitter"},
{ ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE, "Specified address type isn't compatible with this transmitter"},
{ ERR_RTP_GSTV4TRANS_NOLOCALIPS, "Couldn't determine the local host name since the local IP list is empty"},
{ ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT, "Multicast support is not available"},
{ ERR_RTP_GSTV4TRANS_NOSUCHENTRY, "Specified entry could not be found"},
{ ERR_RTP_GSTV4TRANS_NOTAMULTICASTADDRESS, "The specified address is not a multicast address"},
{ ERR_RTP_GSTV4TRANS_NOTCREATED, "The 'Create' call for this transmitter has not been called"},
{ ERR_RTP_GSTV4TRANS_NOTINIT, "The 'Init' call for this transmitter has not been called"},
{ ERR_RTP_GSTV4TRANS_NOTWAITING, "The transmitter is not waiting for incoming data"},
{ ERR_RTP_GSTV4TRANS_PORTBASENOTEVEN, "The specified port base is not an even number"},
{ ERR_RTP_GSTV4TRANS_SPECIFIEDSIZETOOBIG, "The maximum packet size is too big for this transmitter"},
{ ERR_RTP_GSTV4TRANS_INVALIDEVENT, "Expecting UNKNOWN_EVENT to set source address but got another type of event"},
{ ERR_RTP_GSTV4TRANS_SRCADDRNOTSET, "Got packet but src address information was not set, returning"},
{ ERR_RTP_GSTV4TRANS_NOTNETBUFFER, "Received buffer is not a GstNetBuffer"},
{ ERR_RTP_GSTV4TRANS_WAITNOTIMPLEMENTED, "The WaitForIncomingData is not implemented in the Gst transmitter"},
{ 0,0 }
};
std::string RTPGetErrorString(int errcode)
{
int i;
if (errcode >= 0)
return std::string("No error");
i = 0;
while (ErrorDescriptions[i].code != 0)
{
if (ErrorDescriptions[i].code == errcode)
return std::string(ErrorDescriptions[i].description);
i++;
}
return std::string("Unknown error code");
}

View File

@ -1,202 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPERRORS_H
#define RTPERRORS_H
#include <string>
std::string RTPGetErrorString(int errcode);
#define ERR_RTP_OUTOFMEM -1
#define ERR_RTP_NOTHREADSUPPORT -2
#define ERR_RTP_COLLISIONLIST_BADADDRESS -3
#define ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS -4
#define ERR_RTP_HASHTABLE_ELEMENTNOTFOUND -5
#define ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX -6
#define ERR_RTP_HASHTABLE_NOCURRENTELEMENT -7
#define ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX -8
#define ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS -9
#define ERR_RTP_KEYHASHTABLE_KEYNOTFOUND -10
#define ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT -11
#define ERR_RTP_PACKBUILD_ALREADYINIT -12
#define ERR_RTP_PACKBUILD_CSRCALREADYINLIST -13
#define ERR_RTP_PACKBUILD_CSRCLISTFULL -14
#define ERR_RTP_PACKBUILD_CSRCNOTINLIST -15
#define ERR_RTP_PACKBUILD_DEFAULTMARKNOTSET -16
#define ERR_RTP_PACKBUILD_DEFAULTPAYLOADTYPENOTSET -17
#define ERR_RTP_PACKBUILD_DEFAULTTSINCNOTSET -18
#define ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE -19
#define ERR_RTP_PACKBUILD_NOTINIT -20
#define ERR_RTP_PACKET_BADPAYLOADTYPE -21
#define ERR_RTP_PACKET_DATAEXCEEDSMAXSIZE -22
#define ERR_RTP_PACKET_EXTERNALBUFFERNULL -23
#define ERR_RTP_PACKET_ILLEGALBUFFERSIZE -24
#define ERR_RTP_PACKET_INVALIDPACKET -25
#define ERR_RTP_PACKET_TOOMANYCSRCS -26
#define ERR_RTP_POLLTHREAD_ALREADYRUNNING -27
#define ERR_RTP_POLLTHREAD_CANTINITMUTEX -28
#define ERR_RTP_POLLTHREAD_CANTSTARTTHREAD -29
#define ERR_RTP_RTCPCOMPOUND_INVALIDPACKET -30
#define ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILDING -31
#define ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYBUILT -32
#define ERR_RTP_RTCPCOMPPACKBUILDER_ALREADYGOTREPORT -33
#define ERR_RTP_RTCPCOMPPACKBUILDER_APPDATALENTOOBIG -34
#define ERR_RTP_RTCPCOMPPACKBUILDER_BUFFERSIZETOOSMALL -35
#define ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALAPPDATALENGTH -36
#define ERR_RTP_RTCPCOMPPACKBUILDER_ILLEGALSUBTYPE -37
#define ERR_RTP_RTCPCOMPPACKBUILDER_INVALIDITEMTYPE -38
#define ERR_RTP_RTCPCOMPPACKBUILDER_MAXPACKETSIZETOOSMALL -39
#define ERR_RTP_RTCPCOMPPACKBUILDER_NOCURRENTSOURCE -40
#define ERR_RTP_RTCPCOMPPACKBUILDER_NOREPORTPRESENT -41
#define ERR_RTP_RTCPCOMPPACKBUILDER_NOTBUILDING -42
#define ERR_RTP_RTCPCOMPPACKBUILDER_NOTENOUGHBYTESLEFT -43
#define ERR_RTP_RTCPCOMPPACKBUILDER_REPORTNOTSTARTED -44
#define ERR_RTP_RTCPCOMPPACKBUILDER_TOOMANYSSRCS -45
#define ERR_RTP_RTCPCOMPPACKBUILDER_TOTALITEMLENGTHTOOBIG -46
#define ERR_RTP_RTCPPACKETBUILDER_ALREADYINIT -47
#define ERR_RTP_RTCPPACKETBUILDER_ILLEGALMAXPACKSIZE -48
#define ERR_RTP_RTCPPACKETBUILDER_ILLEGALTIMESTAMPUNIT -49
#define ERR_RTP_RTCPPACKETBUILDER_NOTINIT -50
#define ERR_RTP_RTCPPACKETBUILDER_PACKETFILLEDTOOSOON -51
#define ERR_RTP_SCHEDPARAMS_BADFRACTION -52
#define ERR_RTP_SCHEDPARAMS_BADMINIMUMINTERVAL -53
#define ERR_RTP_SCHEDPARAMS_INVALIDBANDWIDTH -54
#define ERR_RTP_SDES_LENGTHTOOBIG -55
#define ERR_RTP_SDES_MAXPRIVITEMS -56
#define ERR_RTP_SDES_PREFIXNOTFOUND -57
#define ERR_RTP_SESSION_ALREADYCREATED -58
#define ERR_RTP_SESSION_CANTGETLOGINNAME -59
#define ERR_RTP_SESSION_CANTINITMUTEX -60
#define ERR_RTP_SESSION_MAXPACKETSIZETOOSMALL -61
#define ERR_RTP_SESSION_NOTCREATED -62
#define ERR_RTP_SESSION_UNSUPPORTEDTRANSMISSIONPROTOCOL -63
#define ERR_RTP_SESSION_USINGPOLLTHREAD -64
#define ERR_RTP_SOURCES_ALREADYHAVEOWNSSRC -65
#define ERR_RTP_SOURCES_DONTHAVEOWNSSRC -66
#define ERR_RTP_SOURCES_ILLEGALSDESTYPE -67
#define ERR_RTP_SOURCES_SSRCEXISTS -68
#define ERR_RTP_TRANS_BUFFERLENGTHTOOSMALL -69
#define ERR_RTP_UDPV4TRANS_ALREADYCREATED -70
#define ERR_RTP_UDPV4TRANS_ALREADYINIT -71
#define ERR_RTP_UDPV4TRANS_ALREADYWAITING -72
#define ERR_RTP_UDPV4TRANS_CANTBINDRTCPSOCKET -73
#define ERR_RTP_UDPV4TRANS_CANTBINDRTPSOCKET -74
#define ERR_RTP_UDPV4TRANS_CANTCALCULATELOCALIP -75
#define ERR_RTP_UDPV4TRANS_CANTCREATEABORTDESCRIPTORS -76
#define ERR_RTP_UDPV4TRANS_CANTCREATEPIPE -77
#define ERR_RTP_UDPV4TRANS_CANTCREATESOCKET -78
#define ERR_RTP_UDPV4TRANS_CANTINITMUTEX -79
#define ERR_RTP_UDPV4TRANS_CANTSETRTCPRECEIVEBUF -80
#define ERR_RTP_UDPV4TRANS_CANTSETRTCPTRANSMITBUF -81
#define ERR_RTP_UDPV4TRANS_CANTSETRTPRECEIVEBUF -82
#define ERR_RTP_UDPV4TRANS_CANTSETRTPTRANSMITBUF -83
#define ERR_RTP_UDPV4TRANS_COULDNTJOINMULTICASTGROUP -84
#define ERR_RTP_UDPV4TRANS_DIFFERENTRECEIVEMODE -85
#define ERR_RTP_UDPV4TRANS_ERRORINSELECT -86
#define ERR_RTP_UDPV4TRANS_ILLEGALPARAMETERS -87
#define ERR_RTP_UDPV4TRANS_INVALIDADDRESSTYPE -88
#define ERR_RTP_UDPV4TRANS_NOLOCALIPS -89
#define ERR_RTP_UDPV4TRANS_NOMULTICASTSUPPORT -90
#define ERR_RTP_UDPV4TRANS_NOSUCHENTRY -91
#define ERR_RTP_UDPV4TRANS_NOTAMULTICASTADDRESS -92
#define ERR_RTP_UDPV4TRANS_NOTCREATED -93
#define ERR_RTP_UDPV4TRANS_NOTINIT -94
#define ERR_RTP_UDPV4TRANS_NOTWAITING -95
#define ERR_RTP_UDPV4TRANS_PORTBASENOTEVEN -96
#define ERR_RTP_UDPV4TRANS_SPECIFIEDSIZETOOBIG -97
#define ERR_RTP_UDPV6TRANS_ALREADYCREATED -98
#define ERR_RTP_UDPV6TRANS_ALREADYINIT -99
#define ERR_RTP_UDPV6TRANS_ALREADYWAITING -100
#define ERR_RTP_UDPV6TRANS_CANTBINDRTCPSOCKET -101
#define ERR_RTP_UDPV6TRANS_CANTBINDRTPSOCKET -102
#define ERR_RTP_UDPV6TRANS_CANTCALCULATELOCALIP -103
#define ERR_RTP_UDPV6TRANS_CANTCREATEABORTDESCRIPTORS -104
#define ERR_RTP_UDPV6TRANS_CANTCREATEPIPE -105
#define ERR_RTP_UDPV6TRANS_CANTCREATESOCKET -106
#define ERR_RTP_UDPV6TRANS_CANTINITMUTEX -107
#define ERR_RTP_UDPV6TRANS_CANTSETRTCPRECEIVEBUF -108
#define ERR_RTP_UDPV6TRANS_CANTSETRTCPTRANSMITBUF -109
#define ERR_RTP_UDPV6TRANS_CANTSETRTPRECEIVEBUF -110
#define ERR_RTP_UDPV6TRANS_CANTSETRTPTRANSMITBUF -111
#define ERR_RTP_UDPV6TRANS_COULDNTJOINMULTICASTGROUP -112
#define ERR_RTP_UDPV6TRANS_DIFFERENTRECEIVEMODE -113
#define ERR_RTP_UDPV6TRANS_ERRORINSELECT -114
#define ERR_RTP_UDPV6TRANS_ILLEGALPARAMETERS -115
#define ERR_RTP_UDPV6TRANS_INVALIDADDRESSTYPE -116
#define ERR_RTP_UDPV6TRANS_NOLOCALIPS -117
#define ERR_RTP_UDPV6TRANS_NOMULTICASTSUPPORT -118
#define ERR_RTP_UDPV6TRANS_NOSUCHENTRY -119
#define ERR_RTP_UDPV6TRANS_NOTAMULTICASTADDRESS -120
#define ERR_RTP_UDPV6TRANS_NOTCREATED -121
#define ERR_RTP_UDPV6TRANS_NOTINIT -122
#define ERR_RTP_UDPV6TRANS_NOTWAITING -123
#define ERR_RTP_UDPV6TRANS_PORTBASENOTEVEN -124
#define ERR_RTP_UDPV6TRANS_SPECIFIEDSIZETOOBIG -125
#define ERR_RTP_INTERNALSOURCEDATA_INVALIDPROBATIONTYPE -126
#define ERR_RTP_SESSION_USERDEFINEDTRANSMITTERNULL -127
#define ERR_RTP_GSTV4TRANS_ALREADYCREATED -128
#define ERR_RTP_GSTV4TRANS_ALREADYINIT -129
#define ERR_RTP_GSTV4TRANS_ALREADYWAITING -130
#define ERR_RTP_GSTV4TRANS_CANTBINDRTCPSOCKET -131
#define ERR_RTP_GSTV4TRANS_CANTBINDRTPSOCKET -132
#define ERR_RTP_GSTV4TRANS_CANTCALCULATELOCALIP -133
#define ERR_RTP_GSTV4TRANS_CANTCREATEABORTDESCRIPTORS -134
#define ERR_RTP_GSTV4TRANS_CANTCREATEPIPE -135
#define ERR_RTP_GSTV4TRANS_CANTCREATESOCKET -136
#define ERR_RTP_GSTV4TRANS_CANTINITMUTEX -137
#define ERR_RTP_GSTV4TRANS_CANTSETRTCPRECEIVEBUF -138
#define ERR_RTP_GSTV4TRANS_CANTSETRTCPTRANSMITBUF -139
#define ERR_RTP_GSTV4TRANS_CANTSETRTPRECEIVEBUF -140
#define ERR_RTP_GSTV4TRANS_CANTSETRTPTRANSMITBUF -141
#define ERR_RTP_GSTV4TRANS_COULDNTJOINMULTICASTGROUP -142
#define ERR_RTP_GSTV4TRANS_DIFFERENTRECEIVEMODE -143
#define ERR_RTP_GSTV4TRANS_ERRORINSELECT -144
#define ERR_RTP_GSTV4TRANS_ILLEGALPARAMETERS -145
#define ERR_RTP_GSTV4TRANS_INVALIDADDRESSTYPE -146
#define ERR_RTP_GSTV4TRANS_NOLOCALIPS -147
#define ERR_RTP_GSTV4TRANS_NOMULTICASTSUPPORT -148
#define ERR_RTP_GSTV4TRANS_NOSUCHENTRY -149
#define ERR_RTP_GSTV4TRANS_NOTAMULTICASTADDRESS -150
#define ERR_RTP_GSTV4TRANS_NOTCREATED -151
#define ERR_RTP_GSTV4TRANS_NOTINIT -152
#define ERR_RTP_GSTV4TRANS_NOTWAITING -153
#define ERR_RTP_GSTV4TRANS_PORTBASENOTEVEN -154
#define ERR_RTP_GSTV4TRANS_SPECIFIEDSIZETOOBIG -155
#define ERR_RTP_GSTV4TRANS_INVALIDEVENT -156
#define ERR_RTP_GSTV4TRANS_SRCADDRNOTSET -157
#define ERR_RTP_GSTV4TRANS_NOTNETBUFFER -158
#define ERR_RTP_GSTV4TRANS_WAITNOTIMPLEMENTED -159
#endif // RTPERRORS_H

File diff suppressed because it is too large Load Diff

View File

@ -1,234 +0,0 @@
/*
This class allows for jrtp to send GstBuffers. Allows for integration of RTP
into gstreamer.
Copyright (c) 2005 Philippe Khalaf <burger@speedy.org>
This file is a part of JRTPLIB
Copyright (c) 1999-2004 Jori Liesenborgs
Contact: jori@lumumba.luc.ac.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.luc.ac.be), a research center of the "Limburgs Universitair
Centrum" (http://www.luc.ac.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPGSTV4TRANSMITTER_H
#define RTPGSTV4TRANSMITTER_H
#include "rtpconfig.h"
#ifdef RTP_SUPPORT_GST
#include "rtptransmitter.h"
#include "rtpipv4destination.h"
#include "rtphashtable.h"
#include "rtpkeyhashtable.h"
#include <list>
#include <gst/gst.h>
#include <gst/net/gstnetbuffer.h>
#ifdef RTP_SUPPORT_THREAD
#include <jmutex.h>
#endif // RTP_SUPPORT_THREAD
#define RTPGSTv4TRANS_HASHSIZE 8317
#define RTPGSTv4TRANS_DEFAULTPORTBASE 5000
class RTPGSTv4TransmissionParams : public RTPTransmissionParams
{
public:
RTPGSTv4TransmissionParams():RTPTransmissionParams(RTPTransmitter::IPv4GSTProto) { portbase = RTPGSTv4TRANS_DEFAULTPORTBASE; bindIP = 0; multicastTTL = 1; rtpsrcpad = NULL, rtcpsrcpad = NULL; currentdata = NULL;}
void SetBindIP(u_int32_t ip) { bindIP = ip; }
void SetPortbase(u_int16_t pbase) { portbase = pbase; }
void SetMulticastTTL(u_int8_t mcastTTL) { multicastTTL = mcastTTL; }
void SetLocalIPList(std::list<u_int32_t> &iplist) { localIPs = iplist; }
void ClearLocalIPList() { localIPs.clear(); }
void SetGstRTPSrc(GstPad *src) { rtpsrcpad = src; }
void SetGstRTCPSrc(GstPad *src) { rtcpsrcpad = src; }
void SetCurrentData(GstNetBuffer *data) { currentdata = data; }
void SetCurrentDataType(bool type) { currentdatatype = type; }
u_int32_t GetBindIP() const { return bindIP; }
u_int16_t GetPortbase() const { return portbase; }
u_int8_t GetMulticastTTL() const { return multicastTTL; }
const std::list<u_int32_t> &GetLocalIPList() const { return localIPs; }
GstPad* GetGstRTPSrc() const { return rtpsrcpad; }
GstPad* GetGstRTCPSrc() const { return rtcpsrcpad; }
GstNetBuffer* GetCurrentData() const { return currentdata; }
bool GetCurrentDataType() const { return currentdatatype; }
private:
u_int16_t portbase;
u_int32_t bindIP;
std::list<u_int32_t> localIPs;
u_int8_t multicastTTL;
GstPad *rtpsrcpad;
GstPad *rtcpsrcpad;
bool currentdatatype;
GstNetBuffer* currentdata;
};
class RTPGSTv4TransmissionInfo : public RTPTransmissionInfo
{
public:
RTPGSTv4TransmissionInfo(std::list<u_int32_t> iplist,
GstPad* rtpsrc, GstPad* rtcpsrc, RTPGSTv4TransmissionParams *transparams) :
RTPTransmissionInfo(RTPTransmitter::IPv4GSTProto)
{ localIPlist = iplist; rtpsrcpad = rtpsrc;
rtcpsrcpad = rtcpsrc; params = transparams; }
~RTPGSTv4TransmissionInfo() { }
std::list<u_int32_t> GetLocalIPList() const { return localIPlist; }
GstPad* GetGstRTPSrc() { return rtpsrcpad; }
GstPad* GetGstRTCPSrc() { return rtcpsrcpad; }
RTPGSTv4TransmissionParams* GetTransParams() { return params; }
private:
std::list<u_int32_t> localIPlist;
GstPad *rtpsrcpad;
GstPad *rtcpsrcpad;
RTPGSTv4TransmissionParams *params;
};
#ifdef RTP_SUPPORT_INLINETEMPLATEPARAM
inline int RTPGSTv4Trans_GetHashIndex_IPv4Dest(const RTPIPv4Destination &d) { return d.GetIP_HBO()%RTPGSTv4TRANS_HASHSIZE; }
inline int RTPGSTv4Trans_GetHashIndex_u_int32_t(const u_int32_t &k) { return k%RTPGSTv4TRANS_HASHSIZE; }
#else // No support for inline function as template parameter
int RTPGSTv4Trans_GetHashIndex_IPv4Dest(const RTPIPv4Destination &d);
int RTPGSTv4Trans_GetHashIndex_u_int32_t(const u_int32_t &k);
#endif // RTP_SUPPORT_INLINETEMPLATEPARAM
#define RTPGSTv4TRANS_HEADERSIZE (20+8)
class RTPGSTv4Transmitter : public RTPTransmitter
{
public:
RTPGSTv4Transmitter();
~RTPGSTv4Transmitter();
int Init(bool treadsafe);
int Create(size_t maxpacksize,const RTPTransmissionParams *transparams);
void Destroy();
RTPTransmissionInfo *GetTransmissionInfo();
int GetLocalHostName(u_int8_t *buffer,size_t *bufferlength);
bool ComesFromThisTransmitter(const RTPAddress *addr);
size_t GetHeaderOverhead() { return RTPGSTv4TRANS_HEADERSIZE; }
int Poll();
int WaitForIncomingData(const RTPTime &delay,bool *dataavailable = 0);
int AbortWait();
int SendRTPData(const void *data,size_t len);
int SendRTCPData(const void *data,size_t len);
void ResetPacketCount();
u_int32_t GetNumRTPPacketsSent();
u_int32_t GetNumRTCPPacketsSent();
int AddDestination(const RTPAddress &addr);
int DeleteDestination(const RTPAddress &addr);
void ClearDestinations();
bool SupportsMulticasting();
int JoinMulticastGroup(const RTPAddress &addr);
int LeaveMulticastGroup(const RTPAddress &addr);
void LeaveAllMulticastGroups();
int SetReceiveMode(RTPTransmitter::ReceiveMode m);
int AddToIgnoreList(const RTPAddress &addr);
int DeleteFromIgnoreList(const RTPAddress &addr);
void ClearIgnoreList();
int AddToAcceptList(const RTPAddress &addr);
int DeleteFromAcceptList(const RTPAddress &addr);
void ClearAcceptList();
int SetMaximumPacketSize(size_t s);
bool NewDataAvailable();
RTPRawPacket *GetNextPacket();
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
int CreateLocalIPList();
bool GetLocalIPList_Interfaces();
void GetLocalIPList_DNS();
void AddLoopbackAddress();
void FlushPackets();
int FakePoll();
int ProcessAddAcceptIgnoreEntry(u_int32_t ip,u_int16_t port);
int ProcessDeleteAcceptIgnoreEntry(u_int32_t ip,u_int16_t port);
#ifdef RTP_SUPPORT_IPV4MULTICAST
bool SetMulticastTTL(u_int8_t ttl);
#endif // RTP_SUPPORT_IPV4MULTICAST
bool ShouldAcceptData(u_int32_t srcip,u_int16_t srcport);
void ClearAcceptIgnoreInfo();
RTPGSTv4TransmissionParams *params;
bool init;
bool created;
bool waitingfordata;
std::list<u_int32_t> localIPs;
u_int16_t portbase;
u_int8_t multicastTTL;
RTPTransmitter::ReceiveMode receivemode;
u_int8_t *localhostname;
size_t localhostnamelength;
RTPHashTable<const RTPIPv4Destination,RTPGSTv4Trans_GetHashIndex_IPv4Dest,RTPGSTv4TRANS_HASHSIZE> destinations;
#ifdef RTP_SUPPORT_IPV4MULTICAST
// RTPHashTable<const u_int32_t,RTPGSTv4Trans_GetHashIndex_u_int32_t,RTPGSTv4TRANS_HASHSIZE> multicastgroups;
#endif // RTP_SUPPORT_IPV4MULTICAST
std::list<RTPRawPacket*> rawpacketlist;
bool supportsmulticasting;
size_t maxpacksize;
class PortInfo
{
public:
PortInfo() { all = false; }
bool all;
std::list<u_int16_t> portlist;
};
RTPKeyHashTable<const u_int32_t,PortInfo*,RTPGSTv4Trans_GetHashIndex_u_int32_t,RTPGSTv4TRANS_HASHSIZE> acceptignoreinfo;
int CreateAbortDescriptors();
void DestroyAbortDescriptors();
void AbortWaitInternal();
#ifdef RTP_SUPPORT_THREAD
JMutex mainmutex,waitmutex;
int threadsafe;
#endif // RTP_SUPPORT_THREAD
u_int32_t rtppackcount,rtcppackcount;
};
#endif // RTP_SUPPORT_GST
#endif // RTPGSTv4TRANSMITTER_H

View File

@ -1,325 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPHASHTABLE_H
#define RTPHASHTABLE_H
#include "rtperrors.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
template<class Element,int GetIndex(const Element &k),int hashsize>
class RTPHashTable
{
public:
RTPHashTable();
~RTPHashTable() { Clear(); }
void GotoFirstElement() { curhashelem = firsthashelem; }
void GotoLastElement() { curhashelem = lasthashelem; }
bool HasCurrentElement() { return (curhashelem == 0)?false:true; }
int DeleteCurrentElement();
Element &GetCurrentElement() { return curhashelem->GetElement(); }
int GotoElement(const Element &e);
bool HasElement(const Element &e);
void GotoNextElement();
void GotoPreviousElement();
void Clear();
int AddElement(const Element &elem);
int DeleteElement(const Element &elem);
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
class HashElement
{
public:
HashElement(const Element &e,int index):element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
int GetHashIndex() { return hashindex; }
Element &GetElement() { return element; }
#ifdef RTPDEBUG
void Dump() { std::cout << "\tHash index " << hashindex << " | Element " << element << std::endl; }
#endif // RTPDEBUG
private:
int hashindex;
Element element;
public:
HashElement *hashprev,*hashnext;
HashElement *listprev,*listnext;
};
HashElement *table[hashsize];
HashElement *firsthashelem,*lasthashelem;
HashElement *curhashelem;
};
template<class Element,int GetIndex(const Element &e),int hashsize>
inline RTPHashTable<Element,GetIndex,hashsize>::RTPHashTable()
{
for (int i = 0 ; i < hashsize ; i++)
table[i] = 0;
firsthashelem = 0;
lasthashelem = 0;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteCurrentElement()
{
if (curhashelem)
{
HashElement *tmp1,*tmp2;
int index;
// First, relink elements in current hash bucket
index = curhashelem->GetHashIndex();
tmp1 = curhashelem->hashprev;
tmp2 = curhashelem->hashnext;
if (tmp1 == 0) // no previous element in hash bucket
{
table[index] = tmp2;
if (tmp2 != 0)
tmp2->hashprev = 0;
}
else // there is a previous element in the hash bucket
{
tmp1->hashnext = tmp2;
if (tmp2 != 0)
tmp2->hashprev = 0;
}
// Relink elements in list
tmp1 = curhashelem->listprev;
tmp2 = curhashelem->listnext;
if (tmp1 == 0) // curhashelem is first in list
{
firsthashelem = tmp2;
if (tmp2 != 0)
tmp2->listprev = 0;
else // curhashelem is also last in list
lasthashelem = 0;
}
else
{
tmp1->listnext = tmp2;
if (tmp2 != 0)
tmp2->listprev = tmp1;
else // curhashelem is last in list
lasthashelem = tmp1;
}
// finally, with everything being relinked, we can delete curhashelem
delete curhashelem;
curhashelem = tmp2; // Set to next element in the list
}
else
return ERR_RTP_HASHTABLE_NOCURRENTELEMENT;
return 0;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline int RTPHashTable<Element,GetIndex,hashsize>::GotoElement(const Element &e)
{
int index;
bool found;
index = GetIndex(e);
if (index >= hashsize)
return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
curhashelem = table[index];
found = false;
while(!found && curhashelem != 0)
{
if (curhashelem->GetElement() == e)
found = true;
else
curhashelem = curhashelem->hashnext;
}
if (!found)
return ERR_RTP_HASHTABLE_ELEMENTNOTFOUND;
return 0;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline bool RTPHashTable<Element,GetIndex,hashsize>::HasElement(const Element &e)
{
int index;
bool found;
HashElement *tmp;
index = GetIndex(e);
if (index >= hashsize)
return false;
tmp = table[index];
found = false;
while(!found && tmp != 0)
{
if (tmp->GetElement() == e)
found = true;
else
tmp = tmp->hashnext;
}
return found;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline void RTPHashTable<Element,GetIndex,hashsize>::GotoNextElement()
{
if (curhashelem)
curhashelem = curhashelem->listnext;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline void RTPHashTable<Element,GetIndex,hashsize>::GotoPreviousElement()
{
if (curhashelem)
curhashelem = curhashelem->listprev;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline void RTPHashTable<Element,GetIndex,hashsize>::Clear()
{
HashElement *tmp1,*tmp2;
for (int i = 0 ; i < hashsize ; i++)
table[i] = 0;
tmp1 = firsthashelem;
while (tmp1 != 0)
{
tmp2 = tmp1->listnext;
delete tmp1;
tmp1 = tmp2;
}
firsthashelem = 0;
lasthashelem = 0;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline int RTPHashTable<Element,GetIndex,hashsize>::AddElement(const Element &elem)
{
int index;
bool found;
HashElement *e,*newelem;
index = GetIndex(elem);
if (index >= hashsize)
return ERR_RTP_HASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
e = table[index];
found = false;
while(!found && e != 0)
{
if (e->GetElement() == elem)
found = true;
else
e = e->hashnext;
}
if (found)
return ERR_RTP_HASHTABLE_ELEMENTALREADYEXISTS;
// Okay, the key doesn't exist, so we can add the new element in the hash table
newelem = new HashElement(elem,index);
if (newelem == 0)
return ERR_RTP_OUTOFMEM;
e = table[index];
table[index] = newelem;
newelem->hashnext = e;
if (e != 0)
e->hashprev = newelem;
// Now, we still got to add it to the linked list
if (firsthashelem == 0)
{
firsthashelem = newelem;
lasthashelem = newelem;
}
else // there already are some elements in the list
{
lasthashelem->listnext = newelem;
newelem->listprev = lasthashelem;
lasthashelem = newelem;
}
return 0;
}
template<class Element,int GetIndex(const Element &e),int hashsize>
inline int RTPHashTable<Element,GetIndex,hashsize>::DeleteElement(const Element &elem)
{
int status;
status = GotoElement(elem);
if (status < 0)
return status;
return DeleteCurrentElement();
}
#ifdef RTPDEBUG
template<class Element,int GetIndex(const Element &e),int hashsize>
inline void RTPHashTable<Element,GetIndex,hashsize>::Dump()
{
HashElement *e;
std::cout << "DUMPING TABLE CONTENTS:" << std::endl;
for (int i = 0 ; i < hashsize ; i++)
{
e = table[i];
while (e != 0)
{
e->Dump();
e = e->hashnext;
}
}
std::cout << "DUMPING LIST CONTENTS:" << std::endl;
e = firsthashelem;
while (e != 0)
{
e->Dump();
e = e->listnext;
}
}
#endif // RTPDEBUG
#endif // RTPHASHTABLE_H

View File

@ -1,282 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtpinternalsourcedata.h"
#include "rtppacket.h"
#include <string.h>
#include "rtpdebug.h"
#define RTPINTERNALSOURCEDATA_MAXPROBATIONPACKETS 32
RTPInternalSourceData::RTPInternalSourceData(u_int32_t ssrc,RTPSources::ProbationType probtype):RTPSourceData(ssrc)
{
#ifdef RTP_SUPPORT_PROBATION
probationtype = probtype;
#endif // RTP_SUPPORT_PROBATION
}
RTPInternalSourceData::~RTPInternalSourceData()
{
}
// The following function should delete rtppack if necessary
int RTPInternalSourceData::ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,bool *stored)
{
bool accept,onprobation,applyprobation;
double tsunit;
*stored = false;
if (timestampunit < 0)
tsunit = INF_GetEstimatedTimestampUnit();
else
tsunit = timestampunit;
#ifdef RTP_SUPPORT_PROBATION
if (validated) // If the source is our own process, we can already be validated. No
applyprobation = false; // probation should be applied in that case.
else
{
if (probationtype == RTPSources::NoProbation)
applyprobation = false;
else
applyprobation = true;
}
#else
applyprobation = false;
#endif // RTP_SUPPORT_PROBATION
stats.ProcessPacket(rtppack,receivetime,tsunit,ownssrc,&accept,applyprobation,&onprobation);
#ifdef RTP_SUPPORT_PROBATION
switch (probationtype)
{
case RTPSources::ProbationStore:
if (!(onprobation || accept))
return 0;
if (accept)
validated = true;
break;
case RTPSources::ProbationDiscard:
case RTPSources::NoProbation:
if (!accept)
return 0;
validated = true;
break;
default:
return ERR_RTP_INTERNALSOURCEDATA_INVALIDPROBATIONTYPE;
}
#else
if (!accept)
return 0;
validated = true;
#endif // RTP_SUPPORT_PROBATION;
if (validated && !ownssrc) // for own ssrc these variables depend on the outgoing packets, not on the incoming
issender = true;
// Now, we can place the packet in the queue
if (packetlist.empty())
{
*stored = true;
packetlist.push_back(rtppack);
return 0;
}
if (!validated) // still on probation
{
// Make sure that we don't buffer too much packets to avoid wasting memory
// on a bad source. Delete the packet in the queue with the lowest sequence
// number.
if (packetlist.size() == RTPINTERNALSOURCEDATA_MAXPROBATIONPACKETS)
{
RTPPacket *p = *(packetlist.begin());
packetlist.pop_front();
delete p;
}
}
// find the right position to insert the packet
std::list<RTPPacket*>::iterator it,start;
bool done = false;
u_int32_t newseqnr = rtppack->GetExtendedSequenceNumber();
it = packetlist.end();
--it;
start = packetlist.begin();
while (!done)
{
RTPPacket *p;
u_int32_t seqnr;
p = *it;
seqnr = p->GetExtendedSequenceNumber();
if (seqnr > newseqnr)
{
if (it != start)
--it;
else // we're at the start of the list
{
*stored = true;
done = true;
packetlist.push_front(rtppack);
}
}
else if (seqnr < newseqnr) // insert after this packet
{
++it;
packetlist.insert(it,rtppack);
done = true;
*stored = true;
}
else // they're equal !! Drop packet
{
done = true;
}
}
return 0;
}
int RTPInternalSourceData::ProcessSDESItem(u_int8_t id,const u_int8_t *data,size_t itemlen,const RTPTime &receivetime,bool *cnamecollis)
{
*cnamecollis = false;
stats.SetLastMessageTime(receivetime);
switch(id)
{
case RTCP_SDES_ID_CNAME:
{
size_t curlen;
u_int8_t *oldcname;
// NOTE: we're going to make sure that the CNAME is only set once.
oldcname = SDESinf.GetCNAME(&curlen);
if (curlen == 0)
{
// if CNAME is set, the source is validated
SDESinf.SetCNAME(data,itemlen);
validated = true;
}
else // check if this CNAME is equal to the one that is already present
{
if (curlen != itemlen)
*cnamecollis = true;
else
{
if (memcmp(data,oldcname,itemlen) != 0)
*cnamecollis = true;
}
}
}
break;
case RTCP_SDES_ID_NAME:
{
u_int8_t *oldname;
size_t oldlen;
oldname = SDESinf.GetName(&oldlen);
if (oldlen == 0) // Name not set
return SDESinf.SetName(data,itemlen);
}
break;
case RTCP_SDES_ID_EMAIL:
{
u_int8_t *oldemail;
size_t oldlen;
oldemail = SDESinf.GetEMail(&oldlen);
if (oldlen == 0)
return SDESinf.SetEMail(data,itemlen);
}
break;
case RTCP_SDES_ID_PHONE:
return SDESinf.SetPhone(data,itemlen);
case RTCP_SDES_ID_LOCATION:
return SDESinf.SetLocation(data,itemlen);
case RTCP_SDES_ID_TOOL:
{
u_int8_t *oldtool;
size_t oldlen;
oldtool = SDESinf.GetTool(&oldlen);
if (oldlen == 0)
return SDESinf.SetTool(data,itemlen);
}
break;
case RTCP_SDES_ID_NOTE:
stats.SetLastNoteTime(receivetime);
return SDESinf.SetNote(data,itemlen);
}
return 0;
}
#ifdef RTP_SUPPORT_SDESPRIV
int RTPInternalSourceData::ProcessPrivateSDESItem(const u_int8_t *prefix,size_t prefixlen,const u_int8_t *value,size_t valuelen,const RTPTime &receivetime)
{
int status;
stats.SetLastMessageTime(receivetime);
status = SDESinf.SetPrivateValue(prefix,prefixlen,value,valuelen);
if (status == ERR_RTP_SDES_MAXPRIVITEMS)
return 0; // don't stop processing just because the number of items is full
return status;
}
#endif // RTP_SUPPORT_SDESPRIV
int RTPInternalSourceData::ProcessBYEPacket(const u_int8_t *reason,size_t reasonlen,const RTPTime &receivetime)
{
if (byereason)
{
delete [] byereason;
byereason = 0;
byereasonlen = 0;
}
byetime = receivetime;
byereason = new u_int8_t[reasonlen];
if (byereason == 0)
return ERR_RTP_OUTOFMEM;
memcpy(byereason,reason,reasonlen);
byereasonlen = reasonlen;
receivedbye = true;
stats.SetLastMessageTime(receivetime);
return 0;
}

View File

@ -1,126 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPINTERNALSOURCEDATA_H
#define RTPINTERNALSOURCEDATA_H
#include "rtpconfig.h"
#include "rtpsourcedata.h"
#include "rtpaddress.h"
#include "rtptimeutilities.h"
#include "rtpsources.h"
class RTPInternalSourceData : public RTPSourceData
{
public:
RTPInternalSourceData(u_int32_t ssrc, RTPSources::ProbationType probtype);
~RTPInternalSourceData();
int ProcessRTPPacket(RTPPacket *rtppack,const RTPTime &receivetime,bool *stored);
void ProcessSenderInfo(const RTPNTPTime &ntptime,u_int32_t rtptime,u_int32_t packetcount,
u_int32_t octetcount,const RTPTime &receivetime) { SRprevinf = SRinf; SRinf.Set(ntptime,rtptime,packetcount,octetcount,receivetime); stats.SetLastMessageTime(receivetime); }
void ProcessReportBlock(u_int8_t fractionlost,int32_t lostpackets,u_int32_t exthighseqnr,
u_int32_t jitter,u_int32_t lsr,u_int32_t dlsr,
const RTPTime &receivetime) { RRprevinf = RRinf; RRinf.Set(fractionlost,lostpackets,exthighseqnr,jitter,lsr,dlsr,receivetime); stats.SetLastMessageTime(receivetime); }
void UpdateMessageTime(const RTPTime &receivetime) { stats.SetLastMessageTime(receivetime); }
int ProcessSDESItem(u_int8_t id,const u_int8_t *data,size_t itemlen,const RTPTime &receivetime,bool *cnamecollis);
#ifdef RTP_SUPPORT_SDESPRIV
int ProcessPrivateSDESItem(const u_int8_t *prefix,size_t prefixlen,const u_int8_t *value,size_t valuelen,const RTPTime &receivetime);
#endif // RTP_SUPPORT_SDESPRIV
int ProcessBYEPacket(const u_int8_t *reason,size_t reasonlen,const RTPTime &receivetime);
int SetRTPDataAddress(const RTPAddress *a);
int SetRTCPDataAddress(const RTPAddress *a);
void ClearSenderFlag() { issender = false; }
void SentRTPPacket() { if (!ownssrc) return; RTPTime t = RTPTime::CurrentTime(); issender = true; stats.SetLastRTPPacketTime(t); stats.SetLastMessageTime(t); }
void SetOwnSSRC() { ownssrc = true; validated = true; }
void SetCSRC() { validated = true; iscsrc = true; }
void ClearNote() { SDESinf.SetNote(0,0); }
#ifdef RTP_SUPPORT_PROBATION
private:
RTPSources::ProbationType probationtype;
#endif // RTP_SUPPORT_PROBATION
};
inline int RTPInternalSourceData::SetRTPDataAddress(const RTPAddress *a)
{
if (a == 0)
{
if (rtpaddr)
{
delete rtpaddr;
rtpaddr = 0;
}
}
else
{
RTPAddress *newaddr = a->CreateCopy();
if (newaddr == 0)
return ERR_RTP_OUTOFMEM;
if (rtpaddr && a != rtpaddr)
delete rtpaddr;
rtpaddr = newaddr;
}
isrtpaddrset = true;
return 0;
}
inline int RTPInternalSourceData::SetRTCPDataAddress(const RTPAddress *a)
{
if (a == 0)
{
if (rtcpaddr)
{
delete rtcpaddr;
rtcpaddr = 0;
}
}
else
{
RTPAddress *newaddr = a->CreateCopy();
if (newaddr == 0)
return ERR_RTP_OUTOFMEM;
if (rtcpaddr && a != rtcpaddr)
delete rtcpaddr;
rtcpaddr = newaddr;
}
isrtcpaddrset = true;
return 0;
}
#endif // RTPINTERNALSOURCEDATA_H

View File

@ -1,81 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtpipv4address.h"
#ifdef RTPDEBUG
#include <stdio.h>
#endif // RTPDEBUG
#include "rtpdebug.h"
bool RTPIPv4Address::IsSameAddress(const RTPAddress *addr) const
{
if (addr == 0)
return false;
if (addr->GetAddressType() != IPv4Address)
return false;
const RTPIPv4Address *addr2 = (const RTPIPv4Address *)addr;
if (addr2->GetIP() == ip && addr2->GetPort() == port)
return true;
return false;
}
bool RTPIPv4Address::IsFromSameHost(const RTPAddress *addr) const
{
if (addr == 0)
return false;
if (addr->GetAddressType() != IPv4Address)
return false;
const RTPIPv4Address *addr2 = (const RTPIPv4Address *)addr;
if (addr2->GetIP() == ip)
return true;
return false;
}
RTPAddress *RTPIPv4Address::CreateCopy() const
{
RTPIPv4Address *a = new RTPIPv4Address(ip,port);
return a;
}
#ifdef RTPDEBUG
std::string RTPIPv4Address::GetAddressString() const
{
char str[1024];
sprintf(str,"%d.%d.%d.%d:%d",(int)((ip>>24)&0xFF),(int)((ip>>16)&0xFF),(int)((ip>>8)&0xFF),
(int)(ip&0xFF),(int)port);
return std::string(str);
}
#endif // RTPDEBUG

View File

@ -1,64 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPIPV4ADDRESS_H
#define RTPIPV4ADDRESS_H
#include "rtpconfig.h"
#include "rtpaddress.h"
#include "rtptypes.h"
class RTPIPv4Address : public RTPAddress
{
public:
RTPIPv4Address(u_int32_t ip = 0, u_int16_t port = 0):RTPAddress(IPv4Address) { RTPIPv4Address::ip = ip; RTPIPv4Address::port = port; }
RTPIPv4Address(const u_int8_t ip[4],u_int16_t port = 0):RTPAddress(IPv4Address) { RTPIPv4Address::ip = (u_int32_t)ip[3]; RTPIPv4Address::ip |= (((u_int32_t)ip[2])<<8); RTPIPv4Address::ip |= (((u_int32_t)ip[1])<<16); RTPIPv4Address::ip |= (((u_int32_t)ip[0])<<24); RTPIPv4Address::port = port; }
~RTPIPv4Address() { }
void SetIP(u_int32_t ip) { RTPIPv4Address::ip = ip; }
void SetIP(const u_int8_t ip[4]) { RTPIPv4Address::ip = (u_int32_t)ip[3]; RTPIPv4Address::ip |= (((u_int32_t)ip[2])<<8); RTPIPv4Address::ip |= (((u_int32_t)ip[1])<<16); RTPIPv4Address::ip |= (((u_int32_t)ip[0])<<24); }
void SetPort(u_int16_t port) { RTPIPv4Address::port = port; }
u_int32_t GetIP() const { return ip; }
u_int16_t GetPort() const { return port; }
RTPAddress *CreateCopy() const;
bool IsSameAddress(const RTPAddress *addr) const;
bool IsFromSameHost(const RTPAddress *addr) const;
#ifdef RTPDEBUG
std::string GetAddressString() const;
#endif // RTPDEBUG
private:
u_int32_t ip;
u_int16_t port;
};
#endif // RTPIPV4ADDRESS_H

View File

@ -1,79 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPIPV4DESTINATION
#define RTPIPV4DESTINATION
#include "rtpconfig.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
#ifdef RTPDEBUG
#include <stdio.h>
#include <string>
#endif // RTPDEBUG
class RTPIPv4Destination
{
public:
// (nbo = network byte order, hbo = host byte order)
RTPIPv4Destination(u_int32_t ip,u_int16_t rtpportbase) { ipaddr_hbo = ip; ipaddr_nbo = htonl(ip); rtpport_nbo = htons(rtpportbase); rtcpport_nbo = htons(rtpportbase+1); }
u_int32_t GetIP_HBO() const { return ipaddr_hbo; }
u_int32_t GetIP_NBO() const { return ipaddr_nbo; }
u_int16_t GetRTPPort_NBO() const { return rtpport_nbo; }
u_int16_t GetRTCPPort_NBO() const { return rtcpport_nbo; }
bool operator==(const RTPIPv4Destination &src) const { if (src.ipaddr_nbo == ipaddr_nbo && src.rtpport_nbo == rtpport_nbo) return true; return false; } // NOTE: I only check IP and portbase
#ifdef RTPDEBUG
std::string GetDestinationString() const;
#endif // RTPDEBUG
private:
u_int32_t ipaddr_hbo;
u_int32_t ipaddr_nbo;
u_int16_t rtpport_nbo;
u_int16_t rtcpport_nbo;
};
#ifdef RTPDEBUG
inline std::string RTPIPv4Destination::GetDestinationString() const
{
char str[1024];
u_int32_t ip = ipaddr_hbo;
u_int16_t portbase = ntohs(rtpport_nbo);
sprintf(str,"%d.%d.%d.%d:%d",(int)((ip>>24)&0xFF),(int)((ip>>16)&0xFF),(int)((ip>>8)&0xFF),(int)(ip&0xFF),(int)(portbase));
return std::string(str);
}
#endif // RTPDEBUG
#endif // RTPIPV4DESTINATION

View File

@ -1,106 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtpipv6address.h"
#ifdef RTP_SUPPORT_IPV6
#ifdef RTPDEBUG
#include <stdio.h>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTPAddress *RTPIPv6Address::CreateCopy() const
{
RTPIPv6Address *newaddr = new RTPIPv6Address(ip,port);
return newaddr;
}
bool RTPIPv6Address::IsSameAddress(const RTPAddress *addr) const
{
if (addr == 0)
return false;
if (addr->GetAddressType() != RTPAddress::IPv6Address)
return false;
const RTPIPv6Address *addr2 = (const RTPIPv6Address *)addr;
const u_int8_t *ip2 = addr2->ip.s6_addr;
if (port != addr2->port)
return false;
for (int i = 0 ; i < 16 ; i++)
{
if (ip.s6_addr[i] != ip2[i])
return false;
}
return true;
}
bool RTPIPv6Address::IsFromSameHost(const RTPAddress *addr) const
{
if (addr == 0)
return false;
if (addr->GetAddressType() != RTPAddress::IPv6Address)
return false;
const RTPIPv6Address *addr2 = (const RTPIPv6Address *)addr;
const u_int8_t *ip2 = addr2->ip.s6_addr;
for (int i = 0 ; i < 16 ; i++)
{
if (ip.s6_addr[i] != ip2[i])
return false;
}
return true;
}
#ifdef RTPDEBUG
std::string RTPIPv6Address::GetAddressString() const
{
char str[256];
u_int16_t ip16[8];
int i,j;
for (i = 0,j = 0 ; j < 8 ; j++,i += 2)
{
ip16[j] = (((u_int16_t)ip.s6_addr[i])<<8);
ip16[j] |= ((u_int16_t)ip.s6_addr[i+1]);
}
sprintf(str,"%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X - %d",(int)ip16[0],(int)ip16[1],(int)ip16[2],(int)ip16[3],(int)ip16[4],(int)ip16[5],(int)ip16[6],(int)ip16[7],(int)port);
return std::string(str);
}
#endif // RTPDEBUG
#endif // RTP_SUPPORT_IPV6

View File

@ -1,75 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPIPV6ADDRESS_H
#define RTPIPV6ADDRESS_H
#include "rtpconfig.h"
#ifdef RTP_SUPPORT_IPV6
#include "rtpaddress.h"
#include "rtptypes.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
class RTPIPv6Address : public RTPAddress
{
public:
RTPIPv6Address():RTPAddress(IPv6Address) { for (int i = 0 ; i < 16 ; i++) ip.s6_addr[i] = 0; port = 0; }
RTPIPv6Address(const u_int8_t ip[16],u_int16_t port = 0):RTPAddress(IPv6Address) { SetIP(ip); RTPIPv6Address::port = port; }
RTPIPv6Address(in6_addr ip,u_int16_t port = 0):RTPAddress(IPv6Address) { RTPIPv6Address::ip = ip; RTPIPv6Address::port = port; }
~RTPIPv6Address() { }
void SetIP(in6_addr ip) { RTPIPv6Address::ip = ip; }
void SetIP(const u_int8_t ip[16]) { for (int i = 0 ; i < 16 ; i++) RTPIPv6Address::ip.s6_addr[i] = ip[i]; }
void SetPort(u_int16_t port) { RTPIPv6Address::port = port; }
void GetIP(u_int8_t ip[16]) const { for (int i = 0 ; i < 16 ; i++) ip[i] = RTPIPv6Address::ip.s6_addr[i]; }
in6_addr GetIP() const { return ip; }
u_int16_t GetPort() const { return port; }
RTPAddress *CreateCopy() const;
bool IsSameAddress(const RTPAddress *addr) const;
bool IsFromSameHost(const RTPAddress *addr) const;
#ifdef RTPDEBUG
std::string GetAddressString() const;
#endif // RTPDEBUG
private:
in6_addr ip;
u_int16_t port;
};
#endif // RTP_SUPPORT_IPV6
#endif // RTPIPV6ADDRESS_H

View File

@ -1,83 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPIPV6DESTINATION
#define RTPIPV6DESTINATION
#include "rtpconfig.h"
#ifdef RTP_SUPPORT_IPV6
#include "rtptypes.h"
#include <string.h>
#ifndef WIN32
#include <netinet/in.h>
#endif // WIN32
#ifdef RTPDEBUG
#include <stdio.h>
#include <string>
#endif // RTPDEBUG
class RTPIPv6Destination
{
public:
RTPIPv6Destination(in6_addr ip,u_int16_t portbase) { RTPIPv6Destination::ip = ip; rtpport_nbo = htons(portbase); rtcpport_nbo = htons(portbase+1); }
in6_addr GetIP() const { return ip; }
u_int16_t GetRTPPort_NBO() const { return rtpport_nbo; }
u_int16_t GetRTCPPort_NBO() const { return rtcpport_nbo; }
bool operator==(const RTPIPv6Destination &src) const { if (src.rtpport_nbo == rtpport_nbo && (memcmp(&(src.ip),&ip,sizeof(in6_addr)) == 0)) return true; return false; } // NOTE: I only check IP and portbase
#ifdef RTPDEBUG
std::string GetDestinationString() const;
#endif // RTPDEBUG
private:
in6_addr ip;
u_int16_t rtpport_nbo,rtcpport_nbo;
};
#ifdef RTPDEBUG
inline std::string RTPIPv6Destination::GetDestinationString() const
{
u_int16_t ip16[8];
char str[1024];
u_int16_t portbase = ntohs(rtpport_nbo);
int i,j;
for (i = 0,j = 0 ; j < 8 ; j++,i += 2) { ip16[j] = (((u_int16_t)ip.s6_addr[i])<<8); ip16[j] |= ((u_int16_t)ip.s6_addr[i+1]); }
sprintf(str,"%04X:%04X:%04X:%04X:%04X:%04X:%04X:%04X/%d",(int)ip16[0],(int)ip16[1],(int)ip16[2],(int)ip16[3],(int)ip16[4],(int)ip16[5],(int)ip16[6],(int)ip16[7],(int)portbase);
return std::string(str);
}
#endif // RTPDEBUG
#endif // RTP_SUPPORT_IPV6
#endif // RTPIPV6DESTINATION

View File

@ -1,328 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPKEYHASHTABLE_H
#define RTPKEYHASHTABLE_H
#include "rtpconfig.h"
#include "rtperrors.h"
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
class RTPKeyHashTable
{
public:
RTPKeyHashTable();
~RTPKeyHashTable() { Clear(); }
void GotoFirstElement() { curhashelem = firsthashelem; }
void GotoLastElement() { curhashelem = lasthashelem; }
bool HasCurrentElement() { return (curhashelem == 0)?false:true; }
int DeleteCurrentElement();
Element &GetCurrentElement() { return curhashelem->GetElement(); }
Key &GetCurrentKey() { return curhashelem->GetKey(); }
int GotoElement(const Key &k);
bool HasElement(const Key &k);
void GotoNextElement();
void GotoPreviousElement();
void Clear();
int AddElement(const Key &k,const Element &elem);
int DeleteElement(const Key &k);
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
private:
class HashElement
{
public:
HashElement(const Key &k,const Element &e,int index):key(k),element(e) { hashprev = 0; hashnext = 0; listnext = 0; listprev = 0; hashindex = index; }
int GetHashIndex() { return hashindex; }
Key &GetKey() { return key; }
Element &GetElement() { return element; }
#ifdef RTPDEBUG
void Dump() { std::cout << "\tHash index " << hashindex << " | Key " << key << " | Element " << element << std::endl; }
#endif // RTPDEBUG
private:
int hashindex;
Key key;
Element element;
public:
HashElement *hashprev,*hashnext;
HashElement *listprev,*listnext;
};
HashElement *table[hashsize];
HashElement *firsthashelem,*lasthashelem;
HashElement *curhashelem;
};
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline RTPKeyHashTable<Key,Element,GetIndex,hashsize>::RTPKeyHashTable()
{
for (int i = 0 ; i < hashsize ; i++)
table[i] = 0;
firsthashelem = 0;
lasthashelem = 0;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteCurrentElement()
{
if (curhashelem)
{
HashElement *tmp1,*tmp2;
int index;
// First, relink elements in current hash bucket
index = curhashelem->GetHashIndex();
tmp1 = curhashelem->hashprev;
tmp2 = curhashelem->hashnext;
if (tmp1 == 0) // no previous element in hash bucket
{
table[index] = tmp2;
if (tmp2 != 0)
tmp2->hashprev = 0;
}
else // there is a previous element in the hash bucket
{
tmp1->hashnext = tmp2;
if (tmp2 != 0)
tmp2->hashprev = 0;
}
// Relink elements in list
tmp1 = curhashelem->listprev;
tmp2 = curhashelem->listnext;
if (tmp1 == 0) // curhashelem is first in list
{
firsthashelem = tmp2;
if (tmp2 != 0)
tmp2->listprev = 0;
else // curhashelem is also last in list
lasthashelem = 0;
}
else
{
tmp1->listnext = tmp2;
if (tmp2 != 0)
tmp2->listprev = tmp1;
else // curhashelem is last in list
lasthashelem = tmp1;
}
// finally, with everything being relinked, we can delete curhashelem
delete curhashelem;
curhashelem = tmp2; // Set to next element in list
}
else
return ERR_RTP_KEYHASHTABLE_NOCURRENTELEMENT;
return 0;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoElement(const Key &k)
{
int index;
bool found;
index = GetIndex(k);
if (index >= hashsize)
return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
curhashelem = table[index];
found = false;
while(!found && curhashelem != 0)
{
if (curhashelem->GetKey() == k)
found = true;
else
curhashelem = curhashelem->hashnext;
}
if (!found)
return ERR_RTP_KEYHASHTABLE_KEYNOTFOUND;
return 0;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline bool RTPKeyHashTable<Key,Element,GetIndex,hashsize>::HasElement(const Key &k)
{
int index;
bool found;
HashElement *tmp;
index = GetIndex(k);
if (index >= hashsize)
return false;
tmp = table[index];
found = false;
while(!found && tmp != 0)
{
if (tmp->GetKey() == k)
found = true;
else
tmp = tmp->hashnext;
}
return found;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoNextElement()
{
if (curhashelem)
curhashelem = curhashelem->listnext;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::GotoPreviousElement()
{
if (curhashelem)
curhashelem = curhashelem->listprev;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Clear()
{
HashElement *tmp1,*tmp2;
for (int i = 0 ; i < hashsize ; i++)
table[i] = 0;
tmp1 = firsthashelem;
while (tmp1 != 0)
{
tmp2 = tmp1->listnext;
delete tmp1;
tmp1 = tmp2;
}
firsthashelem = 0;
lasthashelem = 0;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::AddElement(const Key &k,const Element &elem)
{
int index;
bool found;
HashElement *e,*newelem;
index = GetIndex(k);
if (index >= hashsize)
return ERR_RTP_KEYHASHTABLE_FUNCTIONRETURNEDINVALIDHASHINDEX;
e = table[index];
found = false;
while(!found && e != 0)
{
if (e->GetKey() == k)
found = true;
else
e = e->hashnext;
}
if (found)
return ERR_RTP_KEYHASHTABLE_KEYALREADYEXISTS;
// Okay, the key doesn't exist, so we can add the new element in the hash table
newelem = new HashElement(k,elem,index);
if (newelem == 0)
return ERR_RTP_OUTOFMEM;
e = table[index];
table[index] = newelem;
newelem->hashnext = e;
if (e != 0)
e->hashprev = newelem;
// Now, we still got to add it to the linked list
if (firsthashelem == 0)
{
firsthashelem = newelem;
lasthashelem = newelem;
}
else // there already are some elements in the list
{
lasthashelem->listnext = newelem;
newelem->listprev = lasthashelem;
lasthashelem = newelem;
}
return 0;
}
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline int RTPKeyHashTable<Key,Element,GetIndex,hashsize>::DeleteElement(const Key &k)
{
int status;
status = GotoElement(k);
if (status < 0)
return status;
return DeleteCurrentElement();
}
#ifdef RTPDEBUG
template<class Key,class Element,int GetIndex(const Key &k),int hashsize>
inline void RTPKeyHashTable<Key,Element,GetIndex,hashsize>::Dump()
{
HashElement *e;
std::cout << "DUMPING TABLE CONTENTS:" << std::endl;
for (int i = 0 ; i < hashsize ; i++)
{
e = table[i];
while (e != 0)
{
e->Dump();
e = e->hashnext;
}
}
std::cout << "DUMPING LIST CONTENTS:" << std::endl;
e = firsthashelem;
while (e != 0)
{
e->Dump();
e = e->listnext;
}
}
#endif // RTPDEBUG
#endif // RTPKEYHASHTABLE_H

View File

@ -1,39 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtplibraryversion.h"
RTPLibraryVersion RTPLibraryVersion::GetVersion()
{
return RTPLibraryVersion(3,3,0);
}

View File

@ -1,65 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPLIBRARYVERSION_H
#define RTPLIBRARYVERSION_H
#include <string>
#include <stdio.h>
class RTPLibraryVersion
{
public:
static RTPLibraryVersion GetVersion();
private:
RTPLibraryVersion(int major,int minor,int debug) { majornr = major; minornr = minor; debugnr = debug; }
public:
int GetMajorNumber() const { return majornr; }
int GetMinorNumber() const { return minornr; }
int GetDebugNumber() const { return debugnr; }
std::string GetVersionString() const;
private:
int debugnr,minornr,majornr;
};
inline std::string RTPLibraryVersion::GetVersionString() const
{
char str[16];
sprintf(str,"%d.%d.%d",majornr,minornr,debugnr);
return std::string(str);
}
#endif // RTPLIBRARYVERSION_H

View File

@ -1,344 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtppacket.h"
#include "rtpstructs.h"
#include "rtpdefines.h"
#include "rtperrors.h"
#include "rtprawpacket.h"
#if ! (defined(WIN32) || defined(_WIN32_WCE))
#include <netinet/in.h>
#endif // WIN32
#ifdef RTPDEBUG
#include <stdio.h>
#endif // RTPDEBUG
#include "rtpdebug.h"
void RTPPacket::Clear()
{
hasextension = false;
hasmarker = false;
numcsrcs = 0;
payloadtype = 0;
extseqnr = 0;
timestamp = 0;
ssrc = 0;
packet = 0;
payload = 0;
packetlength = 0;
payloadlength = 0;
extid = 0;
extension = 0;
extensionlength = 0;
error = 0;
externalbuffer = false;
}
RTPPacket::RTPPacket(RTPRawPacket &rawpack) : receivetime(rawpack.GetReceiveTime())
{
Clear();
error = ParseRawPacket(rawpack);
}
RTPPacket::RTPPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
size_t maxpacksize /* = 0 */ ) : receivetime(0,0)
{
Clear();
error = BuildPacket(payloadtype,payloaddata,payloadlen,seqnr,timestamp,ssrc,gotmarker,numcsrcs,
csrcs,gotextension,extensionid,extensionlen_numwords,extensiondata,0,maxpacksize);
}
RTPPacket::RTPPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
void *buffer,size_t buffersize) : receivetime(0,0)
{
Clear();
if (buffer == 0)
error = ERR_RTP_PACKET_EXTERNALBUFFERNULL;
else if (buffersize <= 0)
error = ERR_RTP_PACKET_ILLEGALBUFFERSIZE;
else
error = BuildPacket(payloadtype,payloaddata,payloadlen,seqnr,timestamp,ssrc,gotmarker,numcsrcs,
csrcs,gotextension,extensionid,extensionlen_numwords,extensiondata,buffer,buffersize);
}
int RTPPacket::ParseRawPacket(RTPRawPacket &rawpack)
{
u_int8_t *packetbytes;
size_t packetlen;
u_int8_t payloadtype;
RTPHeader *rtpheader;
bool marker;
int csrccount;
bool hasextension;
int payloadoffset,payloadlength;
int numpadbytes;
RTPExtensionHeader *rtpextheader;
u_int16_t exthdrlen;
if (!rawpack.IsRTP()) // If we didn't receive it on the RTP port, we'll ignore it
return ERR_RTP_PACKET_INVALIDPACKET;
// The length should be at least the size of the RTP header
packetlen = rawpack.GetDataLength();
if (packetlen < sizeof(RTPHeader))
return ERR_RTP_PACKET_INVALIDPACKET;
packetbytes = (u_int8_t *)rawpack.GetData();
rtpheader = (RTPHeader *)packetbytes;
// The version number should be correct
if (rtpheader->version != RTP_VERSION)
return ERR_RTP_PACKET_INVALIDPACKET;
// We'll check if this is possibly a RTCP packet. For this to be possible
// the marker bit and payload type combined should be either an SR or RR
// identifier
marker = (rtpheader->marker == 0)?false:true;
payloadtype = rtpheader->payloadtype;
if (marker)
{
if (payloadtype == (RTP_RTCPTYPE_SR & 127)) // don't check high bit (this was the marker!!)
return ERR_RTP_PACKET_INVALIDPACKET;
if (payloadtype == (RTP_RTCPTYPE_RR & 127))
return ERR_RTP_PACKET_INVALIDPACKET;
}
csrccount = rtpheader->csrccount;
payloadoffset = sizeof(RTPHeader)+(int)(csrccount*sizeof(u_int32_t));
if (rtpheader->padding) // adjust payload length to take padding into account
{
numpadbytes = (int)packetbytes[packetlen-1]; // last byte contains number of padding bytes
if (numpadbytes <= 0)
return ERR_RTP_PACKET_INVALIDPACKET;
}
else
numpadbytes = 0;
hasextension = (rtpheader->extension == 0)?false:true;
if (hasextension) // got header extension
{
rtpextheader = (RTPExtensionHeader *)(packetbytes+payloadoffset);
payloadoffset += sizeof(RTPExtensionHeader);
exthdrlen = ntohs(rtpextheader->length);
payloadoffset += ((int)exthdrlen)*sizeof(u_int32_t);
}
else
{
rtpextheader = 0;
exthdrlen = 0;
}
payloadlength = packetlen-numpadbytes-payloadoffset;
if (payloadlength < 0)
return ERR_RTP_PACKET_INVALIDPACKET;
// Now, we've got a valid packet, so we can create a new instance of RTPPacket
// and fill in the members
RTPPacket::hasextension = hasextension;
if (hasextension)
{
RTPPacket::extid = ntohs(rtpextheader->id);
RTPPacket::extensionlength = ((int)ntohs(rtpextheader->length))*sizeof(u_int32_t);
RTPPacket::extension = ((u_int8_t *)rtpextheader)+sizeof(RTPExtensionHeader);
}
RTPPacket::hasmarker = marker;
RTPPacket::numcsrcs = csrccount;
RTPPacket::payloadtype = payloadtype;
// Note: we don't fill in the EXTENDED sequence number here, since we
// don't have information about the source here. We just fill in the low
// 16 bits
RTPPacket::extseqnr = (u_int32_t)ntohs(rtpheader->sequencenumber);
RTPPacket::timestamp = ntohl(rtpheader->timestamp);
RTPPacket::ssrc = ntohl(rtpheader->ssrc);
RTPPacket::packet = packetbytes;
RTPPacket::payload = packetbytes+payloadoffset;
RTPPacket::packetlength = packetlen;
RTPPacket::payloadlength = payloadlength;
// We'll zero the data of the raw packet, since we're using it here now!
rawpack.ZeroData();
return 0;
}
u_int32_t RTPPacket::GetCSRC(int num) const
{
if (num >= numcsrcs)
return 0;
u_int8_t *csrcpos;
u_int32_t *csrcval_nbo;
u_int32_t csrcval_hbo;
csrcpos = packet+sizeof(RTPHeader)+num*sizeof(u_int32_t);
csrcval_nbo = (u_int32_t *)csrcpos;
csrcval_hbo = ntohl(*csrcval_nbo);
return csrcval_hbo;
}
int RTPPacket::BuildPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
void *buffer,size_t maxsize)
{
if (numcsrcs > RTP_MAXCSRCS)
return ERR_RTP_PACKET_TOOMANYCSRCS;
if (payloadtype > 127) // high bit should not be used
return ERR_RTP_PACKET_BADPAYLOADTYPE;
if (payloadtype == 72 || payloadtype == 73) // could cause confusion with rtcp types
return ERR_RTP_PACKET_BADPAYLOADTYPE;
packetlength = sizeof(RTPHeader);
packetlength += sizeof(u_int32_t)*((size_t)numcsrcs);
if (gotextension)
{
packetlength += sizeof(RTPExtensionHeader);
packetlength += sizeof(u_int32_t)*((size_t)extensionlen_numwords);
}
packetlength += payloadlen;
if (maxsize > 0 && packetlength > maxsize)
{
packetlength = 0;
return ERR_RTP_PACKET_DATAEXCEEDSMAXSIZE;
}
// Ok, now we'll just fill in...
RTPHeader *rtphdr;
if (buffer == 0)
{
packet = new u_int8_t [packetlength];
if (packet == 0)
{
packetlength = 0;
return ERR_RTP_OUTOFMEM;
}
externalbuffer = false;
}
else
{
packet = (u_int8_t *)buffer;
externalbuffer = true;
}
RTPPacket::hasmarker = gotmarker;
RTPPacket::hasextension = gotextension;
RTPPacket::numcsrcs = numcsrcs;
RTPPacket::payloadtype = payloadtype;
RTPPacket::extseqnr = (u_int32_t)seqnr;
RTPPacket::timestamp = timestamp;
RTPPacket::ssrc = ssrc;
RTPPacket::payloadlength = payloadlen;
RTPPacket::extid = extensionid;
RTPPacket::extensionlength = ((size_t)extensionlen_numwords)*sizeof(u_int32_t);
rtphdr = (RTPHeader *)packet;
rtphdr->version = RTP_VERSION;
rtphdr->padding = 0;
if (gotmarker)
rtphdr->marker = 1;
else
rtphdr->marker = 0;
if (gotextension)
rtphdr->extension = 1;
else
rtphdr->extension = 0;
rtphdr->csrccount = numcsrcs;
rtphdr->payloadtype = payloadtype&127; // make sure high bit isn't set
rtphdr->sequencenumber = htons(seqnr);
rtphdr->timestamp = htonl(timestamp);
rtphdr->ssrc = htonl(ssrc);
u_int32_t *curcsrc;
int i;
curcsrc = (u_int32_t *)(packet+sizeof(RTPHeader));
for (i = 0 ; i < numcsrcs ; i++,curcsrc++)
*curcsrc = htonl(csrcs[i]);
payload = packet+sizeof(RTPHeader)+((size_t)numcsrcs)*sizeof(u_int32_t);
if (gotextension)
{
RTPExtensionHeader *rtpexthdr = (RTPExtensionHeader *)payload;
rtpexthdr->id = htons(extensionid);
rtpexthdr->length = htons((u_int16_t)extensionlen_numwords);
payload += sizeof(RTPExtensionHeader);
memcpy(payload,extensiondata,RTPPacket::extensionlength);
payload += RTPPacket::extensionlength;
}
memcpy(payload,payloaddata,payloadlen);
return 0;
}
#ifdef RTPDEBUG
void RTPPacket::Dump()
{
int i;
printf("Payload type: %d\n",(int)GetPayloadType());
printf("Extended sequence number: 0x%08x\n",GetExtendedSequenceNumber());
printf("Timestamp: 0x%08x\n",GetTimestamp());
printf("SSRC: 0x%08x\n",GetSSRC());
printf("Marker: %s\n",HasMarker()?"yes":"no");
printf("CSRC count: %d\n",GetCSRCCount());
for (i = 0 ; i < GetCSRCCount() ; i++)
printf(" CSRC[%02d]: 0x%08x\n",i,GetCSRC(i));
printf("Payload: %s\n",GetPayloadData());
printf("Payload length: %d\n",GetPayloadLength());
printf("Packet length: %d\n",GetPacketLength());
printf("Extension: %s\n",HasExtension()?"yes":"no");
if (HasExtension())
{
printf(" Extension ID: 0x%04x\n",GetExtensionID());
printf(" Extension data: %s\n",GetExtensionData());
printf(" Extension length: %d\n",GetExtensionLength());
}
}
#endif // RTPDEBUG

View File

@ -1,124 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPPACKET_H
#define RTPPACKET_H
#include "rtpconfig.h"
#include "rtptypes.h"
#include "rtptimeutilities.h"
class RTPRawPacket;
class RTPPacket
{
public:
// If successfull, the data is moved from the raw packet to the RTPPacket instance
RTPPacket(RTPRawPacket &rawpack);
// if maxpacksize == 0, it is ignored
RTPPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
size_t maxpacksize = 0);
// pretty much the same function, except that here the data is placed in an external buffer
RTPPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
void *buffer,size_t buffersize);
virtual ~RTPPacket() { if (packet && !externalbuffer) delete [] packet; }
int GetCreationError() const { return error; }
bool HasExtension() const { return hasextension; }
bool HasMarker() const { return hasmarker; }
int GetCSRCCount() const { return numcsrcs; }
u_int32_t GetCSRC(int num) const;
u_int8_t GetPayloadType() const { return payloadtype; }
// On reception, this is actually a 16 bit value. The high 16 bits
// are filled in when the packet is processed in the source
// table
u_int32_t GetExtendedSequenceNumber() const { return extseqnr; }
u_int16_t GetSequenceNumber() const { return (u_int16_t)(extseqnr&0x0000FFFF); }
void SetExtendedSequenceNumber(u_int32_t seq) { extseqnr = seq; }
u_int32_t GetTimestamp() const { return timestamp; }
u_int32_t GetSSRC() const { return ssrc; }
u_int8_t *GetPacketData() const { return packet; }
u_int8_t *GetPayloadData() const { return payload; }
size_t GetPacketLength() const { return packetlength; }
size_t GetPayloadLength() const { return payloadlength; }
u_int16_t GetExtensionID() const { return extid; }
u_int8_t *GetExtensionData() const { return extension; }
size_t GetExtensionLength() const { return extensionlength; }
#ifdef RTPDEBUG
void Dump();
#endif // RTPDEBUG
// If parsed from a raw packet, the receive time is also copied.
// This function can be used to retrieve it.
RTPTime GetReceiveTime() const { return receivetime; }
private:
void Clear();
int ParseRawPacket(RTPRawPacket &rawpack);
int BuildPacket(u_int8_t payloadtype,const void *payloaddata,size_t payloadlen,u_int16_t seqnr,
u_int32_t timestamp,u_int32_t ssrc,bool gotmarker,u_int8_t numcsrcs,const u_int32_t *csrcs,
bool gotextension,u_int16_t extensionid,u_int16_t extensionlen_numwords,const void *extensiondata,
void *buffer,size_t maxsize);
int error;
bool hasextension,hasmarker;
int numcsrcs;
u_int8_t payloadtype;
u_int32_t extseqnr,timestamp,ssrc;
u_int8_t *packet,*payload;
size_t packetlength,payloadlength;
u_int16_t extid;
u_int8_t *extension;
size_t extensionlength;
bool externalbuffer;
RTPTime receivetime;
};
#endif // RTPPACKET_H

View File

@ -1,269 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtppacketbuilder.h"
#include "rtperrors.h"
#include "rtppacket.h"
#include "rtpsources.h"
#include <time.h>
#include <stdlib.h>
#ifdef RTPDEBUG
#include <iostream>
#endif // RTPDEBUG
#include "rtpdebug.h"
RTPPacketBuilder::RTPPacketBuilder() : lastwallclocktime(0,0)
{
init = false;
#if (defined(WIN32) || defined(_WIN32_WCE))
timeinit.Dummy();
#endif // WIN32 || _WIN32_WCE
}
RTPPacketBuilder::~RTPPacketBuilder()
{
Destroy();
}
int RTPPacketBuilder::Init(size_t max)
{
if (init)
return ERR_RTP_PACKBUILD_ALREADYINIT;
if (max <= 0)
return ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE;
maxpacksize = max;
buffer = new u_int8_t [max];
if (buffer == 0)
return ERR_RTP_OUTOFMEM;
packetlength = 0;
CreateNewSSRC();
deftsset = false;
defptset = false;
defmarkset = false;
numcsrcs = 0;
init = true;
return 0;
}
void RTPPacketBuilder::Destroy()
{
if (!init)
return;
delete [] buffer;
init = false;
}
int RTPPacketBuilder::SetMaximumPacketSize(size_t max)
{
u_int8_t *newbuf;
if (max <= 0)
return ERR_RTP_PACKBUILD_INVALIDMAXPACKETSIZE;
newbuf = new u_int8_t[max];
if (newbuf == 0)
return ERR_RTP_OUTOFMEM;
delete [] buffer;
buffer = newbuf;
maxpacksize = max;
return 0;
}
int RTPPacketBuilder::AddCSRC(u_int32_t csrc)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
if (numcsrcs >= RTP_MAXCSRCS)
return ERR_RTP_PACKBUILD_CSRCLISTFULL;
int i;
for (i = 0 ; i < numcsrcs ; i++)
{
if (csrcs[i] == csrc)
return ERR_RTP_PACKBUILD_CSRCALREADYINLIST;
}
csrcs[numcsrcs] = csrc;
numcsrcs++;
return 0;
}
int RTPPacketBuilder::DeleteCSRC(u_int32_t csrc)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
int i = 0;
bool found = false;
while (!found && i < numcsrcs)
{
if (csrcs[i] == csrc)
found = true;
else
i++;
}
if (!found)
return ERR_RTP_PACKBUILD_CSRCNOTINLIST;
// move the last csrc in the place of the deleted one
numcsrcs--;
if (numcsrcs > 0 && numcsrcs != i)
csrcs[i] = csrcs[numcsrcs];
return 0;
}
void RTPPacketBuilder::ClearCSRCList()
{
if (!init)
return;
numcsrcs = 0;
}
u_int32_t RTPPacketBuilder::CreateNewSSRC()
{
ssrc = rtprnd.GetRandom32();
timestamp = rtprnd.GetRandom32();
seqnr = rtprnd.GetRandom16();
// p 38: the count SHOULD be reset if the sender changes its SSRC identifier
numpayloadbytes = 0;
numpackets = 0;
return ssrc;
}
u_int32_t RTPPacketBuilder::CreateNewSSRC(RTPSources &sources)
{
bool found;
do
{
ssrc = rtprnd.GetRandom32();
found = sources.GotEntry(ssrc);
} while (found);
timestamp = rtprnd.GetRandom32();
seqnr = rtprnd.GetRandom16();
// p 38: the count SHOULD be reset if the sender changes its SSRC identifier
numpayloadbytes = 0;
numpackets = 0;
return ssrc;
}
int RTPPacketBuilder::BuildPacket(const void *data,size_t len)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
if (!defptset)
return ERR_RTP_PACKBUILD_DEFAULTPAYLOADTYPENOTSET;
if (!defmarkset)
return ERR_RTP_PACKBUILD_DEFAULTMARKNOTSET;
if (!deftsset)
return ERR_RTP_PACKBUILD_DEFAULTTSINCNOTSET;
return PrivateBuildPacket(data,len,defaultpayloadtype,defaultmark,defaulttimestampinc,false);
}
int RTPPacketBuilder::BuildPacket(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
return PrivateBuildPacket(data,len,pt,mark,timestampinc,false);
}
int RTPPacketBuilder::BuildPacketEx(const void *data,size_t len,
u_int16_t hdrextID,const void *hdrextdata,size_t numhdrextwords)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
if (!defptset)
return ERR_RTP_PACKBUILD_DEFAULTPAYLOADTYPENOTSET;
if (!defmarkset)
return ERR_RTP_PACKBUILD_DEFAULTMARKNOTSET;
if (!deftsset)
return ERR_RTP_PACKBUILD_DEFAULTTSINCNOTSET;
return PrivateBuildPacket(data,len,defaultpayloadtype,defaultmark,defaulttimestampinc,true,hdrextID,hdrextdata,numhdrextwords);
}
int RTPPacketBuilder::BuildPacketEx(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc,
u_int16_t hdrextID,const void *hdrextdata,size_t numhdrextwords)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
return PrivateBuildPacket(data,len,pt,mark,timestampinc,true,hdrextID,hdrextdata,numhdrextwords);
}
int RTPPacketBuilder::PrivateBuildPacket(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc,bool gotextension,
u_int16_t hdrextID,const void *hdrextdata,size_t numhdrextwords)
{
RTPPacket p(pt,data,len,seqnr,timestamp,ssrc,mark,numcsrcs,csrcs,gotextension,hdrextID,
(u_int16_t)numhdrextwords,hdrextdata,buffer,maxpacksize);
int status = p.GetCreationError();
if (status < 0)
return status;
packetlength = p.GetPacketLength();
if (numpackets == 0) // first packet
{
lastwallclocktime = RTPTime::CurrentTime();
lastrtptimestamp = timestamp;
prevrtptimestamp = timestamp;
}
else if (timestamp != prevrtptimestamp)
{
lastwallclocktime = RTPTime::CurrentTime();
lastrtptimestamp = timestamp;
prevrtptimestamp = timestamp;
}
numpayloadbytes += (u_int32_t)p.GetPayloadLength();
numpackets++;
timestamp += timestampinc;
seqnr++;
return 0;
}

View File

@ -1,165 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPPACKETBUILDER_H
#define RTPPACKETBUILDER_H
#include "rtpconfig.h"
#include "rtperrors.h"
#include "rtpdefines.h"
#include "rtprandom.h"
#include "rtptimeutilities.h"
#include "rtptypes.h"
class RTPSources;
class RTPPacketBuilder
{
public:
RTPPacketBuilder();
~RTPPacketBuilder();
int Init(size_t maxpacksize);
void Destroy();
u_int32_t GetPacketCount() { if (!init) return 0; return numpackets; }
u_int32_t GetPayloadOctetCount() { if (!init) return 0; return numpayloadbytes; }
int SetMaximumPacketSize(size_t maxpacksize);
int AddCSRC(u_int32_t csrc);
int DeleteCSRC(u_int32_t csrc);
void ClearCSRCList();
int BuildPacket(const void *data,size_t len);
int BuildPacket(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc);
int BuildPacketEx(const void *data,size_t len,
u_int16_t hdrextID,const void *hdrextdata,size_t numhdrextwords);
int BuildPacketEx(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc,
u_int16_t hdrextID,const void *hdrextdata,size_t numhdrextwords);
u_int8_t *GetPacket() { if (!init) return 0; return buffer; }
size_t GetPacketLength() { if (!init) return 0; return packetlength; }
int SetDefaultPayloadType(u_int8_t pt);
int SetDefaultMark(bool m);
int SetDefaultTimestampIncrement(u_int32_t timestampinc);
int IncrementTimestamp(u_int32_t inc);
int IncrementTimestampDefault();
u_int32_t CreateNewSSRC();
u_int32_t CreateNewSSRC(RTPSources &sources);
u_int32_t GetSSRC() const { if (!init) return 0; return ssrc; }
u_int32_t GetTimestamp() const { if (!init) return 0; return timestamp; }
u_int16_t GetSequenceNumber() const { if (!init) return 0; return seqnr; }
// note: these are not necessarily from the last packet!
RTPTime GetPacketTime() const { if (!init) return RTPTime(0,0); return lastwallclocktime; }
u_int32_t GetPacketTimestamp() const { if (!init) return 0; return lastrtptimestamp; }
private:
int PrivateBuildPacket(const void *data,size_t len,
u_int8_t pt,bool mark,u_int32_t timestampinc,bool gotextension,
u_int16_t hdrextID = 0,const void *hdrextdata = 0,size_t numhdrextwords = 0);
RTPRandom rtprnd;
size_t maxpacksize;
u_int8_t *buffer;
size_t packetlength;
u_int32_t numpayloadbytes;
u_int32_t numpackets;
bool init;
u_int32_t ssrc;
u_int32_t timestamp;
u_int16_t seqnr;
u_int32_t defaulttimestampinc;
u_int8_t defaultpayloadtype;
bool defaultmark;
bool deftsset,defptset,defmarkset;
u_int32_t csrcs[RTP_MAXCSRCS];
int numcsrcs;
RTPTime lastwallclocktime;
u_int32_t lastrtptimestamp;
u_int32_t prevrtptimestamp;
};
inline int RTPPacketBuilder::SetDefaultPayloadType(u_int8_t pt)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
defptset = true;
defaultpayloadtype = pt;
return 0;
}
inline int RTPPacketBuilder::SetDefaultMark(bool m)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
defmarkset = true;
defaultmark = m;
return 0;
}
inline int RTPPacketBuilder::SetDefaultTimestampIncrement(u_int32_t timestampinc)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
deftsset = true;
defaulttimestampinc = timestampinc;
return 0;
}
inline int RTPPacketBuilder::IncrementTimestamp(u_int32_t inc)
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
timestamp += inc;
return 0;
}
inline int RTPPacketBuilder::IncrementTimestampDefault()
{
if (!init)
return ERR_RTP_PACKBUILD_NOTINIT;
if (!deftsset)
return ERR_RTP_PACKBUILD_DEFAULTTSINCNOTSET;
timestamp += defaulttimestampinc;
return 0;
}
#endif // RTPPACKETBUILDER_H

View File

@ -1,169 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtppollthread.h"
#ifdef RTP_SUPPORT_THREAD
#include "rtpsession.h"
#include "rtcpscheduler.h"
#include "rtperrors.h"
#include "rtprawpacket.h"
#include <time.h>
#ifndef _WIN32_WCE
#include <iostream>
#endif // _WIN32_WCE
#include "rtpdebug.h"
RTPPollThread::RTPPollThread(RTPSession &session,RTCPScheduler &sched):rtpsession(session),rtcpsched(sched)
{
stop = false;
transmitter = 0;
#if (defined(WIN32) || defined(_WIN32_WCE))
timeinit.Dummy();
#endif // WIN32 || _WIN32_WCE
}
RTPPollThread::~RTPPollThread()
{
Stop();
}
int RTPPollThread::Start(RTPTransmitter *trans)
{
if (JThread::IsRunning())
return ERR_RTP_POLLTHREAD_ALREADYRUNNING;
transmitter = trans;
if (!stopmutex.IsInitialized())
{
if (stopmutex.Init() < 0)
return ERR_RTP_POLLTHREAD_CANTINITMUTEX;
}
stop = false;
if (JThread::Start() < 0)
return ERR_RTP_POLLTHREAD_CANTSTARTTHREAD;
return 0;
}
void RTPPollThread::Stop()
{
if (!IsRunning())
return;
stopmutex.Lock();
stop = true;
stopmutex.Unlock();
if (transmitter)
transmitter->AbortWait();
RTPTime thetime = RTPTime::CurrentTime();
bool done = false;
while (JThread::IsRunning() && !done)
{
// wait max 5 sec
RTPTime curtime = RTPTime::CurrentTime();
if ((curtime.GetDouble()-thetime.GetDouble()) > 5.0)
done = true;
RTPTime::Wait(RTPTime(0,10000));
}
if (JThread::IsRunning())
{
#ifndef _WIN32_WCE
std::cerr << "RTPPollThread: Warning! Having to kill thread!" << std::endl;
#endif // _WIN32_WCE
JThread::Kill();
}
stop = false;
transmitter = 0;
}
void *RTPPollThread::Thread()
{
JThread::ThreadStarted();
bool stopthread;
stopmutex.Lock();
stopthread = stop;
stopmutex.Unlock();
while (!stopthread)
{
int status;
rtpsession.schedmutex.Lock();
rtpsession.sourcesmutex.Lock();
RTPTime rtcpdelay = rtcpsched.GetTransmissionDelay();
rtpsession.sourcesmutex.Unlock();
rtpsession.schedmutex.Unlock();
if ((status = transmitter->WaitForIncomingData(rtcpdelay)) < 0)
{
stopthread = true;
rtpsession.OnPollThreadError(status);
}
else
{
if ((status = transmitter->Poll()) < 0)
{
stopthread = true;
rtpsession.OnPollThreadError(status);
}
else
{
if ((status = rtpsession.ProcessPolledData()) < 0)
{
stopthread = true;
rtpsession.OnPollThreadError(status);
}
else
{
rtpsession.OnPollThreadStep();
stopmutex.Lock();
stopthread = stop;
stopmutex.Unlock();
}
}
}
}
return 0;
}
#endif // RTP_SUPPORT_THREAD

View File

@ -1,70 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#ifndef RTPPOLLTHREAD_H
#define RTPPOLLTHREAD_H
#include "rtpconfig.h"
#ifdef RTP_SUPPORT_THREAD
#include "rtptransmitter.h"
#include <jthread.h>
#include <jmutex.h>
#include <list>
class RTPSession;
class RTCPScheduler;
class RTPPollThread : private JThread
{
public:
RTPPollThread(RTPSession &session,RTCPScheduler &rtcpsched);
~RTPPollThread();
int Start(RTPTransmitter *trans);
void Stop();
private:
void *Thread();
bool stop;
JMutex stopmutex;
RTPTransmitter *transmitter;
RTPSession &rtpsession;
RTCPScheduler &rtcpsched;
};
#endif // RTP_SUPPORT_THREAD
#endif // RTPPOLLTHREAD_H

View File

@ -1,213 +0,0 @@
/*
This file is a part of JRTPLIB
Copyright (c) 1999-2005 Jori Liesenborgs
Contact: jori@lumumba.uhasselt.be
This library was developed at the "Expertisecentrum Digitale Media"
(http://www.edm.uhasselt.be), a research center of the Hasselt University
(http://www.uhasselt.be). The library is based upon work done for
my thesis at the School for Knowledge Technology (Belgium/The Netherlands).
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation
the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the
Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
*/
#include "rtprandom.h"
#include <time.h>
#ifndef WIN32
#include <unistd.h>
#else
#ifndef _WIN32_WCE
#include <process.h>
#else
#include <windows.h>
#include <kfuncs.h>
#endif // _WIN32_WINCE
#include <stdlib.h>
#endif // WIN32
#include "rtpdebug.h"
#if !defined(RTP_SUPPORT_GNUDRAND) && !defined(RTP_SUPPORT_RANDR)
bool RTPRandom::init = false;
#endif // WIN32
RTPRandom::RTPRandom()
{
#if defined(RTP_SUPPORT_GNUDRAND) || defined(RTP_SUPPORT_RANDR)
u_int32_t x;
x = (u_int32_t)getpid();
x += (u_int32_t)time(0);
x -= (u_int32_t)clock();
x ^= (u_int32_t)(this);
#ifdef RTP_SUPPORT_GNUDRAND
srand48_r(x,&drandbuffer);
#else
state = (unsigned int)x;
#endif
#else // use simple rand and srand functions
if (init)
return;
u_int32_t x;
#ifndef _WIN32_WCE
x = (u_int32_t)getpid();
x += (u_int32_t)time(0);
x -= (u_int32_t)clock();
#else
x = (u_int32_t)GetCurrentProcessId();
FILETIME ft;
SYSTEMTIME st;
GetSystemTime(&st);
SystemTimeToFileTime(&st,&ft);
x += ft.dwLowDateTime;
#endif // _WIN32_WCE
x ^= (u_int32_t)(this);
srand((unsigned int)x);
init = true;
#endif
}
RTPRandom::~RTPRandom()
{
}
#ifdef RTP_SUPPORT_GNUDRAND
u_int8_t RTPRandom::GetRandom8()
{
double x;
drand48_r(&drandbuffer,&x);
u_int8_t y = (u_int8_t)(x*256.0);
return y;
}
u_int16_t RTPRandom::GetRandom16()
{
double x;
drand48_r(&drandbuffer,&x);
u_int16_t y = (u_int16_t)(x*65536.0);
return y;
}
u_int32_t RTPRandom::GetRandom32()
{
u_int32_t a = GetRandom16();
u_int32_t b = GetRandom16();
u_int32_t y = (a << 16)|b;
return y;
}
double RTPRandom::GetRandomDouble()
{
double x;
drand48_r(&drandbuffer,&x);
return x;
}
#else
#ifdef RTP_SUPPORT_RANDR
u_int8_t RTPRandom::GetRandom8()
{
u_int8_t x;
x = (u_int8_t)(256.0*((double)rand_r(&state))/((double)RAND_MAX+1.0));
return x;
}
u_int16_t RTPRandom::GetRandom16()
{
u_int16_t x;
x = (u_int16_t)(65536.0*((double)rand_r(&state))/((double)RAND_MAX+1.0));
return x;
}
u_int32_t RTPRandom::GetRandom32()
{
u_int32_t x,y;
x = (u_int32_t)(65536.0*((double)rand_r(&state))/((double)RAND_MAX+1.0));
y = x;
x = (u_int32_t)(65536.0*((double)rand_r(&state))/((double)RAND_MAX+1.0));
y ^= (x<<8);
x = (u_int32_t)(65536.0*((double)rand_r(&state))/((double)RAND_MAX+1.0));
y ^= (x<<16);
return y;
}
double RTPRandom::GetRandomDouble()
{
double x = ((double)rand_r(&state))/((double)RAND_MAX+1.0);
return x;
}
#else
u_int8_t RTPRandom::GetRandom8()
{
u_int8_t x;
x = (u_int8_t)(256.0*((double)rand())/((double)RAND_MAX+1.0));
return x;
}
u_int16_t RTPRandom::GetRandom16()
{
u_int16_t x;
x = (u_int16_t)(65536.0*((double)rand())/((double)RAND_MAX+1.0));
return x;
}
u_int32_t RTPRandom::GetRandom32()
{
u_int32_t x,y;
x = (u_int32_t)(65536.0*((double)rand())/((double)RAND_MAX+1.0));
y = x;
x = (u_int32_t)(65536.0*((double)rand())/((double)RAND_MAX+1.0));
y ^= (x<<8);
x = (u_int32_t)(65536.0*((double)rand())/((double)RAND_MAX+1.0));
y ^= (x<<16);
return y;
}
double RTPRandom::GetRandomDouble()
{
double x = ((double)rand())/((double)RAND_MAX+1.0);
return x;
}
#endif // RTP_SUPPORT_RANDR
#endif // RTP_SUPPORT_GNUDRAND

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