merge jrtplib jthread and jrtp4c into 1 library (thanks mikej)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@495 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
parent
647f5e4a30
commit
257a892998
|
@ -18,7 +18,7 @@ AM_LDFLAGS += -Wl,-E
|
|||
endif
|
||||
|
||||
if IS64BITLINUX
|
||||
AM_CFLAGS += -m64 -march=k8
|
||||
AM_CFLAGS += -m64 -march=k8 -fPIC
|
||||
endif
|
||||
|
||||
if ISMAC
|
||||
|
|
|
@ -39,7 +39,7 @@ POST_UNINSTALL = :
|
|||
build_triplet = @build@
|
||||
host_triplet = @host@
|
||||
@ISLINUX_TRUE@am__append_1 = -Wl,-E
|
||||
@IS64BITLINUX_TRUE@am__append_2 = -m64 -march=k8
|
||||
@IS64BITLINUX_TRUE@am__append_2 = -m64 -march=k8 -fPIC
|
||||
@ISMAC_TRUE@am__append_3 = -DMACOSX -DSWAP_LINEAR
|
||||
bin_PROGRAMS = freeswitch$(EXEEXT)
|
||||
DIST_COMMON = README $(am__configure_deps) $(library_include_HEADERS) \
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/* .in. Generated from configure.in by autoheader. */
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define to 1 if your processor stores words with the most significant byte
|
||||
first (like Motorola and SPARC, unlike Intel and VAX). */
|
||||
#undef WORDS_BIGENDIAN
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1,229 @@
|
|||
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.
|
|
@ -0,0 +1,236 @@
|
|||
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' installs the package's commands under
|
||||
`/usr/local/bin', include files under `/usr/local/include', 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
|
||||
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
|
||||
PREFIX as the prefix for installing programs and libraries.
|
||||
Documentation and other data files 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 option `--target=TYPE' 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.
|
||||
|
|
@ -0,0 +1,19 @@
|
|||
|
||||
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.
|
||||
|
|
@ -0,0 +1,21 @@
|
|||
SUBDIRS = src tools doc pkgconfig
|
||||
EXTRA_DIST = LICENSE.MIT ChangeLog README.TXT jrtplib.dsw jrtplib.dsp jrtplib.vcproj \
|
||||
jrtplib.sln jrtplib_wce.vcproj jrtplib_wce.sln
|
||||
|
||||
if IS64BITLINUX
|
||||
AM_CFLAGS = -m64 -march=k8 -fPIC
|
||||
endif
|
||||
|
||||
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
|
|
@ -0,0 +1,637 @@
|
|||
# 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@
|
||||
GST_CFLAGS = @GST_CFLAGS@
|
||||
GST_LIBS = @GST_LIBS@
|
||||
GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
|
||||
GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
IS64BITLINUX_FALSE = @IS64BITLINUX_FALSE@
|
||||
IS64BITLINUX_TRUE = @IS64BITLINUX_TRUE@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
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@
|
||||
ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
|
||||
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 pkgconfig
|
||||
EXTRA_DIST = LICENSE.MIT ChangeLog README.TXT jrtplib.dsw jrtplib.dsp jrtplib.vcproj \
|
||||
jrtplib.sln jrtplib_wce.vcproj jrtplib_wce.sln
|
||||
|
||||
@IS64BITLINUX_TRUE@AM_CFLAGS = -m64 -march=k8 -fPIC
|
||||
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:
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1 @@
|
|||
|
|
@ -0,0 +1,130 @@
|
|||
------------------------------------------------------------------------------
|
||||
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.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
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
|
@ -0,0 +1,444 @@
|
|||
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,¶m);],
|
||||
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 \
|
||||
pkgconfig/Makefile \
|
||||
pkgconfig/jrtplib.pc \
|
||||
pkgconfig/jrtplib-uninstalled.pc \
|
||||
)
|
||||
|
||||
|
||||
AM_CONDITIONAL(IS64BITLINUX, [test `uname -m` = x86_64])
|
|
@ -0,0 +1,530 @@
|
|||
#! /bin/sh
|
||||
# depcomp - compile a program generating dependencies as side-effects
|
||||
|
||||
scriptversion=2005-07-09.11
|
||||
|
||||
# Copyright (C) 1999, 2000, 2003, 2004, 2005 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, 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'.
|
||||
DEPDIR directory where to store dependencies.
|
||||
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 $?
|
||||
;;
|
||||
-v | --v*)
|
||||
echo "depcomp $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
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
|
||||
|
||||
# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.
|
||||
depfile=${depfile-`echo "$object" |
|
||||
sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`}
|
||||
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
|
||||
# With Tru64 cc, shared objects can also be used to make a
|
||||
# static library. This mecanism is used in libtool 1.4 series to
|
||||
# handle both shared and static libraries in a single compilation.
|
||||
# With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d.
|
||||
#
|
||||
# With libtool 1.5 this exception was removed, and libtool now
|
||||
# generates 2 separate objects for the 2 libraries. These two
|
||||
# compilations output dependencies in in $dir.libs/$base.o.d and
|
||||
# in $dir$base.o.d. We have to check for both files, because
|
||||
# one of the two compilations can be disabled. We should prefer
|
||||
# $dir$base.o.d over $dir.libs/$base.o.d because the latter is
|
||||
# automatically cleaned when .libs/ is deleted, while ignoring
|
||||
# the former would cause a distcleancheck panic.
|
||||
tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4
|
||||
tmpdepfile2=$dir$base.o.d # libtool 1.5
|
||||
tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5
|
||||
tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504
|
||||
"$@" -Wc,-MD
|
||||
else
|
||||
tmpdepfile1=$dir$base.o.d
|
||||
tmpdepfile2=$dir$base.d
|
||||
tmpdepfile3=$dir$base.d
|
||||
tmpdepfile4=$dir$base.d
|
||||
"$@" -MD
|
||||
fi
|
||||
|
||||
stat=$?
|
||||
if test $stat -eq 0; then :
|
||||
else
|
||||
rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||
exit $stat
|
||||
fi
|
||||
|
||||
for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4"
|
||||
do
|
||||
test -f "$tmpdepfile" && break
|
||||
done
|
||||
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 -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \
|
||||
-e '/^#line [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:
|
|
@ -0,0 +1,10 @@
|
|||
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}
|
|
@ -0,0 +1,342 @@
|
|||
# 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@
|
||||
GST_CFLAGS = @GST_CFLAGS@
|
||||
GST_LIBS = @GST_LIBS@
|
||||
GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
|
||||
GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
IS64BITLINUX_FALSE = @IS64BITLINUX_FALSE@
|
||||
IS64BITLINUX_TRUE = @IS64BITLINUX_TRUE@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
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@
|
||||
ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
|
||||
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
|
@ -0,0 +1,114 @@
|
|||
\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}
|
||||
|
|
@ -0,0 +1,474 @@
|
|||
# Makefile.in generated by automake 1.9.6 from Makefile.am.
|
||||
# examples/Makefile. Generated from Makefile.in by configure.
|
||||
|
||||
# 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.
|
||||
|
||||
|
||||
|
||||
srcdir = .
|
||||
top_srcdir = ..
|
||||
|
||||
pkgdatadir = $(datadir)/jrtplib
|
||||
pkglibdir = $(libdir)/jrtplib
|
||||
pkgincludedir = $(includedir)/jrtplib
|
||||
top_builddir = ..
|
||||
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
|
||||
INSTALL = /usr/bin/install -c
|
||||
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 = i686-pc-linux-gnu
|
||||
host_triplet = i686-pc-linux-gnu
|
||||
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 = ${SHELL} /nfs/temp/jrtplib/missing --run aclocal-1.9
|
||||
AMDEP_FALSE = #
|
||||
AMDEP_TRUE =
|
||||
AMTAR = ${SHELL} /nfs/temp/jrtplib/missing --run tar
|
||||
AR = ar
|
||||
AUTOCONF = ${SHELL} /nfs/temp/jrtplib/missing --run autoconf
|
||||
AUTOHEADER = ${SHELL} /nfs/temp/jrtplib/missing --run autoheader
|
||||
AUTOMAKE = ${SHELL} /nfs/temp/jrtplib/missing --run automake-1.9
|
||||
AWK = gawk
|
||||
CC = gcc
|
||||
CCDEPMODE = depmode=gcc3
|
||||
CFLAGS = -g -O2
|
||||
CPP = gcc -E
|
||||
CPPFLAGS =
|
||||
CXX = g++
|
||||
CXXCPP = g++ -E
|
||||
CXXDEPMODE = depmode=gcc3
|
||||
CXXFLAGS = -O2
|
||||
CYGPATH_W = echo
|
||||
DEFS = -DPACKAGE_NAME=\"\" -DPACKAGE_TARNAME=\"\" -DPACKAGE_VERSION=\"\" -DPACKAGE_STRING=\"\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE=\"jrtplib\" -DVERSION=\"3.3.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_DLFCN_H=1
|
||||
DEPDIR = .deps
|
||||
ECHO = echo
|
||||
ECHO_C =
|
||||
ECHO_N = -n
|
||||
ECHO_T =
|
||||
EGREP = grep -E
|
||||
EXEEXT =
|
||||
F77 =
|
||||
FFLAGS =
|
||||
GST_CFLAGS =
|
||||
GST_LIBS =
|
||||
GST_PLUGINS_BASE_CFLAGS =
|
||||
GST_PLUGINS_BASE_LIBS =
|
||||
INSTALL_DATA = ${INSTALL} -m 644
|
||||
INSTALL_PROGRAM = ${INSTALL}
|
||||
INSTALL_SCRIPT = ${INSTALL}
|
||||
INSTALL_STRIP_PROGRAM = ${SHELL} $(install_sh) -c -s
|
||||
LDFLAGS =
|
||||
LIBOBJS =
|
||||
LIBS =
|
||||
LIBTOOL = $(SHELL) $(top_builddir)/libtool
|
||||
LN_S = ln -s
|
||||
LTLIBOBJS =
|
||||
MAKEINFO = ${SHELL} /nfs/temp/jrtplib/missing --run makeinfo
|
||||
OBJEXT = o
|
||||
PACKAGE = jrtplib
|
||||
PACKAGE_BUGREPORT =
|
||||
PACKAGE_NAME =
|
||||
PACKAGE_STRING =
|
||||
PACKAGE_TARNAME =
|
||||
PACKAGE_VERSION =
|
||||
PATH_SEPARATOR = :
|
||||
PKG_CONFIG = /usr/bin/pkg-config
|
||||
RANLIB = ranlib
|
||||
RTP_ENDIAN = // Little endian system
|
||||
RTP_FILIO = // Don't have <sys/filio.h>
|
||||
RTP_GSTINCLUDES =
|
||||
RTP_HAVE_SOCKADDR_LEN = // No sa_len member in struct sockaddr
|
||||
RTP_LINKLIBS = -lpthread
|
||||
RTP_SOCKIO = // Don't have <sys/sockio.h>
|
||||
RTP_SOCKLENTYPE_UINT = #define RTP_SOCKLENTYPE_UINT
|
||||
RTP_SUPPORT_GETLOGINR = #define RTP_SUPPORT_GETLOGINR
|
||||
RTP_SUPPORT_GNUDRAND = #define RTP_SUPPORT_GNUDRAND
|
||||
RTP_SUPPORT_GST = // No GStreamer support
|
||||
RTP_SUPPORT_IFADDRS = #define RTP_SUPPORT_IFADDRS
|
||||
RTP_SUPPORT_INLINETEMPLATEPARAM = #define RTP_SUPPORT_INLINETEMPLATEPARAM
|
||||
RTP_SUPPORT_IPV4MULTICAST = #define RTP_SUPPORT_IPV4MULTICAST
|
||||
RTP_SUPPORT_IPV6 = // No IPv6 support
|
||||
RTP_SUPPORT_IPV6MULTICAST = // No IPv6 multicasting support
|
||||
RTP_SUPPORT_PROBATION = #define RTP_SUPPORT_PROBATION
|
||||
RTP_SUPPORT_RANDR = // Not using rand_r
|
||||
RTP_SUPPORT_SDESPRIV = #define RTP_SUPPORT_SDESPRIV
|
||||
RTP_SUPPORT_THREAD = #define RTP_SUPPORT_THREAD
|
||||
SET_MAKE =
|
||||
SHELL = /bin/sh
|
||||
STRIP = strip
|
||||
VERSION = 3.3.0
|
||||
ac_ct_AR = ar
|
||||
ac_ct_CC = gcc
|
||||
ac_ct_CXX = g++
|
||||
ac_ct_F77 =
|
||||
ac_ct_RANLIB = ranlib
|
||||
ac_ct_STRIP = strip
|
||||
ac_pt_PKG_CONFIG = /usr/bin/pkg-config
|
||||
am__fastdepCC_FALSE = #
|
||||
am__fastdepCC_TRUE =
|
||||
am__fastdepCXX_FALSE = #
|
||||
am__fastdepCXX_TRUE =
|
||||
am__include = include
|
||||
am__leading_dot = .
|
||||
am__quote =
|
||||
am__tar = ${AMTAR} chof - "$$tardir"
|
||||
am__untar = ${AMTAR} xf -
|
||||
bindir = ${exec_prefix}/bin
|
||||
build = i686-pc-linux-gnu
|
||||
build_alias =
|
||||
build_cpu = i686
|
||||
build_os = linux-gnu
|
||||
build_vendor = pc
|
||||
datadir = ${prefix}/share
|
||||
exec_prefix = ${prefix}
|
||||
host = i686-pc-linux-gnu
|
||||
host_alias =
|
||||
host_cpu = i686
|
||||
host_os = linux-gnu
|
||||
host_vendor = pc
|
||||
includedir = ${prefix}/include
|
||||
infodir = ${prefix}/info
|
||||
install_sh = /nfs/temp/jrtplib/install-sh
|
||||
libdir = ${exec_prefix}/lib
|
||||
libexecdir = ${exec_prefix}/libexec
|
||||
localstatedir = ${prefix}/var
|
||||
mandir = ${prefix}/man
|
||||
mkdir_p = mkdir -p --
|
||||
oldincludedir = /usr/include
|
||||
prefix = /usr/local
|
||||
program_transform_name = s,x,x,
|
||||
sbindir = ${exec_prefix}/sbin
|
||||
sharedstatedir = ${prefix}/com
|
||||
sysconfdir = ${prefix}/etc
|
||||
target_alias =
|
||||
example1_SOURCES = example1.cpp
|
||||
example2_SOURCES = example2.cpp
|
||||
example3_SOURCES = example3.cpp
|
||||
example4_SOURCES = example4.cpp
|
||||
INCLUDES = @RTP_JTHREADINCLUDES@ -I ../src/
|
||||
LDADD = ../src/.libs/libjrtp.a -lpthread
|
||||
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
|
||||
|
||||
include ./$(DEPDIR)/example1.Po
|
||||
include ./$(DEPDIR)/example2.Po
|
||||
include ./$(DEPDIR)/example3.Po
|
||||
include ./$(DEPDIR)/example4.Po
|
||||
|
||||
.cpp.o:
|
||||
if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
# source='$<' object='$@' libtool=no \
|
||||
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
|
||||
# $(CXXCOMPILE) -c -o $@ $<
|
||||
|
||||
.cpp.obj:
|
||||
if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \
|
||||
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
# source='$<' object='$@' libtool=no \
|
||||
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
|
||||
# $(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
|
||||
|
||||
.cpp.lo:
|
||||
if $(LTCXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
|
||||
then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Plo"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi
|
||||
# source='$<' object='$@' libtool=yes \
|
||||
# DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) \
|
||||
# $(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:
|
|
@ -0,0 +1,10 @@
|
|||
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@
|
||||
|
|
@ -0,0 +1,474 @@
|
|||
# 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@
|
||||
GST_CFLAGS = @GST_CFLAGS@
|
||||
GST_LIBS = @GST_LIBS@
|
||||
GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
|
||||
GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
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@
|
||||
ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
|
||||
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:
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
#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;
|
||||
}
|
||||
|
|
@ -0,0 +1,224 @@
|
|||
/*
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,145 @@
|
|||
/*
|
||||
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
|
||||
|
|
@ -0,0 +1,323 @@
|
|||
#!/bin/sh
|
||||
# install - install a program, script, or datafile
|
||||
|
||||
scriptversion=2005-05-14.22
|
||||
|
||||
# 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}"
|
||||
|
||||
chmodcmd="$chmodprog 0755"
|
||||
chowncmd=
|
||||
chgrpcmd=
|
||||
stripcmd=
|
||||
rmcmd="$rmprog -f"
|
||||
mvcmd="$mvprog"
|
||||
src=
|
||||
dst=
|
||||
dir_arg=
|
||||
dstarg=
|
||||
no_target_directory=
|
||||
|
||||
usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE
|
||||
or: $0 [OPTION]... SRCFILES... DIRECTORY
|
||||
or: $0 [OPTION]... -t DIRECTORY SRCFILES...
|
||||
or: $0 [OPTION]... -d DIRECTORIES...
|
||||
|
||||
In the 1st form, copy SRCFILE to DSTFILE.
|
||||
In the 2nd and 3rd, copy all SRCFILES to DIRECTORY.
|
||||
In the 4th, create DIRECTORIES.
|
||||
|
||||
Options:
|
||||
-c (ignored)
|
||||
-d create directories instead of installing files.
|
||||
-g GROUP $chgrpprog installed files to GROUP.
|
||||
-m MODE $chmodprog installed files to MODE.
|
||||
-o USER $chownprog installed files to USER.
|
||||
-s $stripprog installed files.
|
||||
-t DIRECTORY install into DIRECTORY.
|
||||
-T report an error if DSTFILE is a directory.
|
||||
--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
|
||||
-c) shift
|
||||
continue;;
|
||||
|
||||
-d) dir_arg=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-g) chgrpcmd="$chgrpprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--help) echo "$usage"; exit $?;;
|
||||
|
||||
-m) chmodcmd="$chmodprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-o) chowncmd="$chownprog $2"
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-s) stripcmd=$stripprog
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-t) dstarg=$2
|
||||
shift
|
||||
shift
|
||||
continue;;
|
||||
|
||||
-T) no_target_directory=true
|
||||
shift
|
||||
continue;;
|
||||
|
||||
--version) echo "$0 $scriptversion"; exit $?;;
|
||||
|
||||
*) # When -d is used, all remaining arguments are directories to create.
|
||||
# When -t is used, the destination is already specified.
|
||||
test -n "$dir_arg$dstarg" && 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
|
||||
mkdircmd=:
|
||||
chmodcmd=
|
||||
else
|
||||
mkdircmd=$mkdirprog
|
||||
fi
|
||||
else
|
||||
# Waiting for this to be detected by the "$cpprog $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
|
||||
if test -n "$no_target_directory"; then
|
||||
echo "$0: $dstarg: Is a directory" >&2
|
||||
exit 1
|
||||
fi
|
||||
dst=$dst/`basename "$src"`
|
||||
fi
|
||||
fi
|
||||
|
||||
# This sed command emulates the dirname command.
|
||||
dstdir=`echo "$dst" | sed -e 's,/*$,,;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 x `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'`
|
||||
shift
|
||||
IFS=$oIFS
|
||||
|
||||
pathcomp=
|
||||
|
||||
while test $# -ne 0 ; do
|
||||
pathcomp=$pathcomp$1
|
||||
shift
|
||||
if test ! -d "$pathcomp"; then
|
||||
$mkdirprog "$pathcomp"
|
||||
# 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
|
||||
fi
|
||||
pathcomp=$pathcomp/
|
||||
done
|
||||
fi
|
||||
|
||||
if test -n "$dir_arg"; then
|
||||
$doit $mkdircmd "$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
|
||||
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 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0
|
||||
trap '(exit $?); exit' 1 2 13 15
|
||||
|
||||
# Copy the file name to the temp name.
|
||||
$doit $cpprog "$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 $cpprog $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 1
|
||||
}
|
||||
else
|
||||
:
|
||||
fi
|
||||
} &&
|
||||
|
||||
# Now rename the file to the real destination.
|
||||
$doit $mvcmd "$dsttmp" "$dstdir/$dstfile"
|
||||
}
|
||||
}
|
||||
fi || { (exit 1); exit 1; }
|
||||
done
|
||||
|
||||
# The final little trick to "correctly" pass the exit status to the exit trap.
|
||||
{
|
||||
(exit 0); 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:
|
|
@ -0,0 +1,404 @@
|
|||
# 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
|
|
@ -0,0 +1,29 @@
|
|||
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>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
|
@ -0,0 +1,20 @@
|
|||
|
||||
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
|
|
@ -0,0 +1,477 @@
|
|||
<?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>
|
|
@ -0,0 +1,22 @@
|
|||
|
||||
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
|
|
@ -0,0 +1,482 @@
|
|||
<?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
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,360 @@
|
|||
#! /bin/sh
|
||||
# Common stub for a few missing GNU programs while installing.
|
||||
|
||||
scriptversion=2005-06-08.21
|
||||
|
||||
# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005
|
||||
# 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., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||
# 02110-1301, 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
|
||||
;;
|
||||
|
||||
-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>."
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-v|--v|--ve|--ver|--vers|--versi|--versio|--version)
|
||||
echo "missing $scriptversion (GNU Automake)"
|
||||
exit $?
|
||||
;;
|
||||
|
||||
-*)
|
||||
echo 1>&2 "$0: Unknown \`$1' option"
|
||||
echo 1>&2 "Try \`$0 --help' for more information"
|
||||
exit 1
|
||||
;;
|
||||
|
||||
esac
|
||||
|
||||
# Now exit if we have it, but it failed. Also exit now if we
|
||||
# don't have it and --version was passed (most likely to detect
|
||||
# the program).
|
||||
case "$1" in
|
||||
lex|yacc)
|
||||
# Not GNU programs, they don't have --version.
|
||||
;;
|
||||
|
||||
tar)
|
||||
if test -n "$run"; then
|
||||
echo 1>&2 "ERROR: \`tar' requires --run"
|
||||
exit 1
|
||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
|
||||
*)
|
||||
if test -z "$run" && ($1 --version) > /dev/null 2>&1; then
|
||||
# We have it, but it failed.
|
||||
exit 1
|
||||
elif test "x$2" = "x--version" || test "x$2" = "x--help"; then
|
||||
# Could not run --version or --help. This is probably someone
|
||||
# running `$TOOL --version' or `$TOOL --help' to check whether
|
||||
# $TOOL exists and not knowing $TOOL uses missing.
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
esac
|
||||
|
||||
# If it does not exist, or fails to run (possibly an outdated version),
|
||||
# try to emulate it.
|
||||
case "$1" in
|
||||
aclocal*)
|
||||
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)
|
||||
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)
|
||||
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*)
|
||||
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)
|
||||
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)
|
||||
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)
|
||||
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."
|
||||
# The file to touch is that specified with -o ...
|
||||
file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'`
|
||||
if test -z "$file"; then
|
||||
# ... or it is the one specified with @setfilename ...
|
||||
infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'`
|
||||
file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $infile`
|
||||
# ... or it is derived from the source name (dir/f.texi becomes f.info)
|
||||
test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info
|
||||
fi
|
||||
# If the file does not exist, the user really needs makeinfo;
|
||||
# let's fail without touching anything.
|
||||
test -f $file || exit 1
|
||||
touch $file
|
||||
;;
|
||||
|
||||
tar)
|
||||
shift
|
||||
|
||||
# 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:
|
|
@ -0,0 +1,158 @@
|
|||
#! /bin/sh
|
||||
# mkinstalldirs --- make directory hierarchy
|
||||
|
||||
scriptversion=2005-06-29.22
|
||||
|
||||
# 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 $?
|
||||
;;
|
||||
-m) # -m PERM arg
|
||||
shift
|
||||
test $# -eq 0 && { echo "$usage" 1>&2; exit 1; }
|
||||
dirmode=$1
|
||||
shift
|
||||
;;
|
||||
--version)
|
||||
echo "$0 $scriptversion"
|
||||
exit $?
|
||||
;;
|
||||
--) # 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
|
||||
case $file in
|
||||
/*) pathcomp=/ ;;
|
||||
*) pathcomp= ;;
|
||||
esac
|
||||
oIFS=$IFS
|
||||
IFS=/
|
||||
set fnord $file
|
||||
shift
|
||||
IFS=$oIFS
|
||||
|
||||
for d
|
||||
do
|
||||
test "x$d" = x && continue
|
||||
|
||||
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:
|
|
@ -0,0 +1,129 @@
|
|||
# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*-
|
||||
#
|
||||
# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.
|
||||
#
|
||||
# This program is free software; you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation; either version 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but
|
||||
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
# configuration script generated by Autoconf, you may include it under
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
# PKG_PROG_PKG_CONFIG([MIN-VERSION])
|
||||
# ----------------------------------
|
||||
AC_DEFUN([PKG_PROG_PKG_CONFIG],
|
||||
[m4_pattern_forbid([^_?PKG_[A-Z_]+$])
|
||||
m4_pattern_allow([^PKG_CONFIG(_PATH)?$])
|
||||
AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl
|
||||
if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then
|
||||
AC_PATH_TOOL([PKG_CONFIG], [pkg-config])
|
||||
fi
|
||||
if test -n "$PKG_CONFIG"; then
|
||||
_pkg_min_version=m4_ifval([$1], [$1], [0.9.0])
|
||||
AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])
|
||||
if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then
|
||||
AC_MSG_RESULT([yes])
|
||||
else
|
||||
AC_MSG_RESULT([no])
|
||||
PKG_CONFIG=""
|
||||
fi
|
||||
|
||||
fi[]dnl
|
||||
])# PKG_PROG_PKG_CONFIG
|
||||
|
||||
# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
# Check to see whether a particular set of modules exists. Similar
|
||||
# to PKG_CHECK_MODULES(), but does not set variables or print errors.
|
||||
#
|
||||
#
|
||||
# Similar to PKG_CHECK_MODULES, make sure that the first instance of
|
||||
# this or PKG_CHECK_MODULES is called, or make sure to call
|
||||
# PKG_CHECK_EXISTS manually
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_EXISTS],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
if test -n "$PKG_CONFIG" && \
|
||||
AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then
|
||||
m4_ifval([$2], [$2], [:])
|
||||
m4_ifvaln([$3], [else
|
||||
$3])dnl
|
||||
fi])
|
||||
|
||||
|
||||
# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])
|
||||
# ---------------------------------------------
|
||||
m4_define([_PKG_CONFIG],
|
||||
[if test -n "$PKG_CONFIG"; then
|
||||
PKG_CHECK_EXISTS([$3],
|
||||
[pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null`],
|
||||
[pkg_failed=yes])
|
||||
pkg_failed=untried
|
||||
fi[]dnl
|
||||
])# _PKG_CONFIG
|
||||
|
||||
# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],
|
||||
# [ACTION-IF-NOT-FOUND])
|
||||
#
|
||||
#
|
||||
# Note that if there is a possibility the first call to
|
||||
# PKG_CHECK_MODULES might not happen, you should be sure to include an
|
||||
# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac
|
||||
#
|
||||
#
|
||||
# --------------------------------------------------------------
|
||||
AC_DEFUN([PKG_CHECK_MODULES],
|
||||
[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl
|
||||
AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl
|
||||
AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl
|
||||
|
||||
pkg_failed=no
|
||||
AC_MSG_CHECKING([for $1])
|
||||
|
||||
_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])
|
||||
_PKG_CONFIG([$1][_LIBS], [libs], [$2])
|
||||
|
||||
if test $pkg_failed = yes; then
|
||||
$1[]_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
|
||||
# Put the nasty error message in config.log where it belongs
|
||||
echo "$$1[]_PKG_ERRORS" 1>&AS_MESSAGE_LOG_FD
|
||||
|
||||
ifelse([$4], , [AC_MSG_ERROR(dnl
|
||||
[Package requirements ($2) were not met.
|
||||
Consider adjusting the PKG_CONFIG_PATH environment variable if you
|
||||
installed software in a non-standard prefix.
|
||||
|
||||
Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables
|
||||
to avoid the need to call pkg-config. See the pkg-config man page for
|
||||
more details.])],
|
||||
[$4])
|
||||
elif test $pkg_failed = untried; then
|
||||
ifelse([$4], , [AC_MSG_FAILURE(dnl
|
||||
[The pkg-config script could not be found or is too old. Make sure it
|
||||
is in your PATH or set the PKG_CONFIG environment variable to the full
|
||||
path to pkg-config.
|
||||
|
||||
Alternatively you may set the $1_CFLAGS and $1_LIBS environment variables
|
||||
to avoid the need to call pkg-config. See the pkg-config man page for
|
||||
more details.
|
||||
|
||||
To get pkg-config, see <http://www.freedesktop.org/software/pkgconfig>.])],
|
||||
[$4])
|
||||
else
|
||||
$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS
|
||||
$1[]_LIBS=$pkg_cv_[]$1[]_LIBS
|
||||
ifelse([$3], , :, [$3])
|
||||
fi[]dnl
|
||||
])# PKG_CHECK_MODULES
|
|
@ -0,0 +1,17 @@
|
|||
### 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)
|
|
@ -0,0 +1,388 @@
|
|||
# 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@
|
||||
GST_CFLAGS = @GST_CFLAGS@
|
||||
GST_LIBS = @GST_LIBS@
|
||||
GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
|
||||
GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
IS64BITLINUX_FALSE = @IS64BITLINUX_FALSE@
|
||||
IS64BITLINUX_TRUE = @IS64BITLINUX_TRUE@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
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@
|
||||
ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
|
||||
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:
|
|
@ -0,0 +1,12 @@
|
|||
# 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
|
|
@ -0,0 +1,11 @@
|
|||
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}
|
|
@ -0,0 +1,37 @@
|
|||
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@
|
||||
|
||||
|
|
@ -0,0 +1,601 @@
|
|||
# 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@
|
||||
GST_CFLAGS = @GST_CFLAGS@
|
||||
GST_LIBS = @GST_LIBS@
|
||||
GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
|
||||
GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
|
||||
INSTALL_DATA = @INSTALL_DATA@
|
||||
INSTALL_PROGRAM = @INSTALL_PROGRAM@
|
||||
INSTALL_SCRIPT = @INSTALL_SCRIPT@
|
||||
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
|
||||
IS64BITLINUX_FALSE = @IS64BITLINUX_FALSE@
|
||||
IS64BITLINUX_TRUE = @IS64BITLINUX_TRUE@
|
||||
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@
|
||||
PKG_CONFIG = @PKG_CONFIG@
|
||||
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@
|
||||
ac_pt_PKG_CONFIG = @ac_pt_PKG_CONFIG@
|
||||
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:
|
|
@ -0,0 +1,65 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* 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:
|
||||
*/
|
|
@ -0,0 +1,61 @@
|
|||
/*
|
||||
* 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
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,67 @@
|
|||
/*
|
||||
|
||||
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;
|
||||
}
|
|
@ -0,0 +1,166 @@
|
|||
/*
|
||||
|
||||
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();
|
||||
}
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,98 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,208 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,672 @@
|
|||
/*
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,317 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,71 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,69 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,733 @@
|
|||
/*
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,158 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,381 @@
|
|||
/*
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
@ -0,0 +1,122 @@
|
|||
/*
|
||||
|
||||
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 ¶ms) { 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
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,314 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,197 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,124 @@
|
|||
/*
|
||||
|
||||
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 ¤ttime,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
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
/*
|
||||
|
||||
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 ¤ttime,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
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,72 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,50 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,177 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,223 @@
|
|||
/*
|
||||
|
||||
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");
|
||||
}
|
||||
|
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
|
||||
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
|
@ -0,0 +1,234 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,325 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,282 @@
|
|||
/*
|
||||
|
||||
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;
|
||||
}
|
||||
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,81 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,64 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
|
||||
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
|
|
@ -0,0 +1,106 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,75 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
|
||||
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
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue