freeswitch/libs/test/jrtplib/doc/jrtplib.tex

2676 lines
138 KiB
TeX

\documentclass[12pt,a4paper]{article}
\newcommand{\jversion}{3.3.0}
\newcommand{\headerfile}[1]{\marginpar{\scriptsize Header:\\{\tt #1}}}
\newcommand{\inherits}[1]{\marginpar{\scriptsize Inherits:\\{\tt #1}}}
\newcommand{\Paragraph}[1]{\paragraph{#1}\ \\\addcontentsline{toc}{subsection}{\ \hspace{3cm}\ {#1}}}
%\newcommand{\headerfile}[1]{\marginpar{\pdfannot width 10cm depth 7cm{/Subtype/Text/Contents(Header: #1)}}}
\usepackage{listings}
\lstset{language=C++}
\lstset{tabsize=4}
\setlength{\hoffset}{-1.0in}
\addtolength{\hoffset}{1.5cm}
\setlength{\textwidth}{14.5cm}
\setlength{\voffset}{-1.0in}
\addtolength{\voffset}{1.0cm}
\setlength{\textheight}{23.5cm}
\setlength{\topmargin}{0.5cm}
\setlength{\footskip}{2.0cm}
\begin{document}
\title{\ \vspace{3.5cm}\ \\{\bf JRTPLIB \jversion}}
\author{Jori Liesenborgs\\{\tt jori@lumumba.uhasselt.be}}
\date{October 2, 2005\\\vspace{0.5cm}\ \\
{\small{\em Developed at the The Expertise Centre for \\Digital Media (EDM),
a research institute\\of the Hasselt University}\\\ \\
{\tt http://www.edm.uhasselt.be/}\\
{\tt http://www.uhasselt.be/}}}
\maketitle
\newpage
\tableofcontents
\setlength{\parindent}{0cm}
\setlength{\parskip}{0.3cm}
\newpage
\section*{Acknowledgment}\addcontentsline{toc}{section}{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.
\newpage
\section{Introduction}
This document describes JRTPLIB version \jversion, an object-oriented
library written in C++ which aims to help developers in using the
Real-time Transport Protocol (RTP) as described in RFC 3550.
The library makes it possible for the user to send and receive data
using RTP, without worrying about SSRC collisions, scheduling and
transmitting RTCP data etc. The user only needs to provide the library
with the payload data to be sent and the library gives the user access
to incoming RTP and RTCP data.
\subsection{Design idea}
The library provides several classes which can be helpful in
creating RTP applications. Most users will probably need just the
{\tt RTPSession} class for building an application. This class
provides the necessary functions for sending RTP data and handles
the RTCP part internally.
For applications such as a mixer or translator using the {\tt
RTPSession} class will not be a good solution. Other components can
be used for this purpose: a transmission component, an SSRC table,
an RTCP scheduler etc. Using these, it should be much easier to
build all kinds of applications.
\subsection{Changes from version 2.x}
One of the most important changes is probably the fact that this
version is based on RFC 3550 and the 2.x versions were based upon
RFC 1889 which is now obsolete.
Also, the 2.x series was created with the idea that the user would
only need to use the {\tt 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 {\tt
RTPTransmitter}. This makes it easy for different underlying
protocols to be supported. Currently there is support for UDP over
IPv4 and UDP over IPv6.
\section{Copyright license}
The library code uses the following copyright license:
{\em 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.}
There are two reason for using this license. First, since this is the
license of the 2.x series, it only seemed natural that this rewrite
would contain the same license. Second, since the RTP protocol is
deliberately incomplete RTP profiles can, for example, define additional
header fields. The best way to deal with this is to adapt the library
code itself and that's why I like to keep the license as free as
possible.
\section{Using JRTPLIB \jversion}
This section gives information about how to use the library. First, some
simple examples will be given which illustrate how you can work with the
{\tt RTPSession} class. Afterwards, a complete description of the API
will be given.
\subsection{Getting started with the {\tt RTPSession} class}
To use RTP, you'll have to create an {\tt RTPSession} object. The
constructor of the {\tt RTPSession} class takes a parameter of
type {\tt RTPTrans\-mitter::Trans\-mission\-Protocol} and defaults
to {\tt RTPTrans\-mitter::IPv4UDPProto}. This means that unless
specified otherwise, the UDP over IPv4 transmission component will
be used. Let's suppose that this is the kind of session you want to
create, then this is our code so far:
\begin{lstlisting}[frame=tb]{}
RTPSession session;
\end{lstlisting}
To actually create the session, you'll have to call the {\tt Create}
member function which takes two arguments: the first one is of type
{\tt RTPSession\-Params} and specifies the general options for
the session. One parameter of this class must be set explicitly,
otherwise the session will not be created successfully. This
parameter is the timestamp unit of the data you intend to send and
can be calculated by dividing a certain time interval (in seconds)
by the number of samples in that interval. So, assuming that we'll
send $8000 Hz$ voice data, we can use this code:
\begin{lstlisting}[frame=tb]{}
RTPSessionParams sessionparams;
sessionparams.SetOwnTimestampUnit(1.0/8000.0);
\end{lstlisting}
The other parameters will probably depend on the actual RTP profile
you intend to work with. For a complete description of the {\tt
RTPSession\-Params} class, see section \ref{rtpsessionparams}.
The second argument of the {\tt Create} function is a pointer to
an {\tt RTPTrans\-mission\-Params} instance and describes the
parameters for the transmission component. Since there can be
several transmission components, you'll have to use a class which
inherits {\tt RTPTrans\-mission\-Params} and which is appropriate
for the component you've chosen. For our UDP over IPv4 component,
the class to be used is {\tt RTPUDPv4Trans\-mission\-Params}.
Assuming that we want our RTP portbase to be $8000$, we can do the
following:
\begin{lstlisting}[frame=tb]{}
RTPUDPv4TransmissionParams transparams;
transparams.SetPortbase(8000);
\end{lstlisting}
Now, we're ready to call the {\tt Create} member function of
{\tt RTPSession}. The return value is stored in the integer {\tt
status} so we can check if something went wrong. If this value is
negative, it indicates that some error occurred. A description
of what this error code means can be retrieved by calling {\tt
RTPGetErrorString}:
\begin{lstlisting}[frame=tb]{}
int status = session.Create(sessionparams,&transparams);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
\end{lstlisting}
If the session was created with success, this is probably a good
point to specify to which destinations RTP and RTCP data should be
sent. This is done by a call to the {\tt RTPSession} member function
{\tt AddDestination}. This function takes an argument of type {\tt
RTPAddress}. This is an abstract class and for the UDP over IPv4
transmitter the actual class to be used is {\tt RTPIPv4Address}.
Suppose that we want to send our data to a process running on the
same host at port $9000$, we can do the following:
\begin{lstlisting}[frame=tb]{}
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);
}
\end{lstlisting}
If the library was compiled with JThread support, incoming data is
processed in the background. If JThread support was not enabled at
compile time or if you specified in the session parameters that no
poll thread should be used, you'll have to call the {\tt RTPSession}
member function {\tt Poll} regularly to process incoming data and
to send RTCP data when necessary. For now, let's assume that we're
working with the poll thread enabled.
Lets suppose that for a duration of one minute, we want to send
packets containing $20 ms$ (or $160$ samples) of silence and we want
to indicate when a packet from someone else has been received. Also
suppose we have $L8$ data as defined in RFC 3551 and want to use
payload type $96$. First, we'll set some default values:
\begin{lstlisting}[frame=tb]{}
session.SetDefaultPayloadType(96);
session.SetDefaultMark(false);
session.SetDefaultTimestampIncrement(160);
\end{lstlisting}
Next, we'll create the buffer which contains $160$ silence samples
and create an {\tt RTPTime} instance which indicates $20 ms$ or
$0.020$ seconds. We'll also store the current time so we'll know
when one minute has passed.
\begin{lstlisting}[frame=tb]{}
u_int8_t silencebuffer[160];
for (int i = 0 ; i < 160 ; i++)
silencebuffer[i] = 128;
RTPTime delay(0.020);
RTPTime starttime = RTPTime::CurrentTime();
\end{lstlisting}
Next, the main loop will be shown. In this loop, a packet containing
$160$ bytes of payload data will be sent. Then, data handling can
take place but this part is described later in the text. Finally,
we'll wait $20 ms$ and check if sixty seconds have passed:
\begin{lstlisting}[frame=tb]{}
bool done = false;
while (!done)
{
status = session.SendPacket(silencebuffer,160);
if (status < 0)
{
std::cerr << RTPGetErrorString(status) << std::endl;
exit(-1);
}
//
// Inspect incoming data here
//
RTPTime::Wait(delay);
RTPTime t = RTPTime::CurrentTime();
t -= starttime;
if (t > RTPTime(60.0))
done = true;
}
\end{lstlisting}
Information about participants in the session, packet retrieval
etc, has to be done between calls to the {\tt RTPSession} member
functions {\tt BeginDataAccess} and {\tt EndDataAccess}. This
ensures that the background thread doesn't try to change the same
data you're trying to access. We'll iterate over the participants
using the {\tt GotoFirstSource} and {\tt GotoNextSource} member
functions. Packets from the currently selected participant can
be retrieved using the {\tt GetNextPacket} member function which
returns a pointer to an instance of the {\tt RTPPacket} class.
When you don't need the packet anymore, it has to be deleted. The
processing of incoming data will then be as follows:
\begin{lstlisting}[frame=tb]{}
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();
\end{lstlisting}
Information about the currently selected source can be obtained
by using the {\tt GetCurrentSourceInfo} member function of
the {\tt RTPSession} class. This function returns a pointer to
an instance of {\tt RTPSourceData} which contains all information
about that source: sender reports from that source, receiver
reports, SDES info etc. The {\tt RTPSourceData} class is described
in detail in section \ref{rtpsourcedata}.
When the main loop is finished, we'll send a BYE packet to
inform other participants of our departure and clean up the {\tt
RTPSession} class. Also, we want to wait at most $10$ seconds for
the BYE packet to be sent, otherwise we'll just leave the session
without sending a BYE packet.
\begin{lstlisting}[frame=tb]{}
delay = RTPTime(10.0);
session.BYEDestroy(delay,"Time's up",9);
\end{lstlisting}
The complete code of the program is given in {\tt example2.cpp} and
is shown on the following pages. More detailed information about
the {\tt RTPSession} class can be found in section \ref{rtpsession}.
\newpage
\lstinputlisting{../examples/example2.cpp}
\newpage
\subsection{The complete API}
Here, the complete API of the library will be explained. This
will be done in a more or less bottom-to-top fashion.
\subsubsection{Library version}\headerfile{rtplibraryversion.h}
The {\tt RTPLibraryVersion} class has a static member which
creates an instance of this class:
\begin{verbatim}
static RTPLibraryVersion GetVersion();
\end{verbatim}
The user can access the version data using the following
member functions:
\begin{itemize}
\item {\tt int GetMajorNumber() const}\\
Returns the major version number.
\item {\tt int GetMinorNumber() const}\\
Returns the minor version number.
\item {\tt int GetDebugNumber() const}\\
Returns the debug version number.
\item {\tt std::string GetVersionString() const}\\
Returns a string describing the library version.
\end{itemize}
\subsubsection{Error codes}\headerfile{rtperrors.h}
Unless specified otherwise, functions with a return type {\tt int}
will return a negative value when an error occurred and zero or a
positive value upon success. A description of the error code can
be obtained by using the following function:
\begin{verbatim}
std::string RTPGetErrorString(int errcode)
\end{verbatim}
\subsubsection{Time utilities}\headerfile{rtptimeutilities.h}
\Paragraph{\tt RTPNTPTime}
This is a simple wrapper for the most significant word (MSW)
and least significant word (LSW) of an NTP timestamp. The
class has the following members:
\begin{itemize}
\item {\tt RTPNTPTime(u\_int32\_t m, u\_int32\_t l)}\\
This constructor creates and instance with MSW {\tt m}
and LSW {\tt l}.
\item {\tt u\_int32\_t GetMSW() const}\\
Returns the most significant word.
\item {\tt u\_int32\_t GetLSW() const}\\
Returns the least significant word.
\end{itemize}
\Paragraph{\tt RTPTime}
This class is used to specify wallclock time, delay intervals
etc. It stores a number of seconds and a number of microseconds and
it has the following interface:
\begin{itemize}
\item {\tt RTPTime(u\_int32\_t seconds, u\_int32\_t microseconds)}\\
Creates an instance corresponding to {\tt seconds} and
{\tt microseconds}.
\item {\tt RTPTime(double t)}\\
Creates an {\tt RTPTime} instance representing {\tt t} which
is expressed in units of seconds.
\item {\tt RTPTime(RTPNTPTime ntptime)}\\
Creates an instance that corresponds to {\tt ntptime}. If
the conversion cannot be made, both the seconds and the
microseconds are set to zero.
\item {\tt u\_int32\_t GetSeconds() const}\\
Returns the number of seconds stored in this instance.
\item {\tt u\_int32\_t GetMicroSeconds() const}\\
Returns the number of microseconds stored in this instance.
\item {\tt double GetDouble() const}\\
Returns the time stored in this instance, expressed in
units of seconds.
\item {\tt RTPNTPTime GetNTPTime() const}\\
Returns the NTP time corresponding to the time stored in
this instance.
\item {\tt static RTPTime CurrentTime()}\\
Returns an RTPTime instance representing the current
wallclock time. This is expressed as a number of seconds
since 00:00:00 UTC, January 1, 1970.
\item {\tt static void Wait(const RTPTime \&delay)}\\
This function waits the amount of time specified in
{\tt delay}.
\end{itemize}
The following operators are defined in the {\tt RTPTime} class:
\begin{itemize}
\item {\tt operator-=}
\item {\tt operator+=}
\item {\tt operator<}
\item {\tt operator>}
\item {\tt operator<=}
\item {\tt operator>=}
\end{itemize}
\subsubsection{\tt RTPRandom}\headerfile{rtprandom.h}
The {\tt RTPRandom} class can be used to generate random numbers.
It has the following member functions:
\begin{itemize}
\item {\tt u\_int8\_t GetRandom8()}\\
Returns a random eight bit value.
\item {\tt u\_int16\_t GetRandom16()}\\
Returns a random sixteen bit value.
\item {\tt u\_int32\_t GetRandom32()}\\
Returns a random thirty-two bit value.
\item {\tt double GetRandomDouble()}\\
Returns a random number between $0.0$ and $1.0$.
\end{itemize}
\subsubsection{\tt RTCPSDESInfo}\headerfile{rtcpsdesinfo.h}
The class {\tt RTCPSDESInfo} is a container for RTCP SDES
information. The interface is the following:
\begin{itemize}
\item {\tt void Clear()}\\
Clears all SDES information.
\item {\tt int SetCNAME(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES CNAME item to {\tt s} with length {\tt l}.
\item {\tt int SetName(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES name item to {\tt s} with length {\tt l}.
\item {\tt int SetEMail(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES e-mail item to {\tt s} with length {\tt l}.
\item {\tt int SetPhone(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES phone item to {\tt s} with length {\tt l}.
\item {\tt int SetLocation(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES location item to {\tt s} with length {\tt l}.
\item {\tt int SetTool(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES tool item to {\tt s} with length {\tt l}.
\item {\tt int SetNote(const u\_int8\_t *s, size\_t l)}\\
Sets the SDES note item to {\tt s} with length {\tt l}.
\item {\tt u\_int8\_t *GetCNAME(size\_t *len) const}\\
Returns the SDES CNAME item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetName(size\_t *len) const}\\
Returns the SDES name item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetEMail(size\_t *len) const}\\
Returns the SDES e-mail item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetPhone(size\_t *len) const}\\
Returns the SDES phone item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetLocation(size\_t *len) const}\\
Returns the SDES location item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetTool(size\_t *len) const}\\
Returns the SDES tool item and stores its length in {\tt len}.
\item {\tt u\_int8\_t *GetNote(size\_t *len) const }\\
Returns the SDES note item and stores its length in {\tt len}.
\end{itemize}
If SDES private item support was enabled at compile time, the following
member functions are also available:
\begin{itemize}
\item {\tt int SetPrivateValue(const u\_int8\_t *prefix, size\_t prefixlen, const u\_int8\_t *value, size\_t valuelen)}\\
Sets the entry for the prefix string specified by {\tt prefix} with
length {\tt prefixlen} to contain the value string specified by
{\tt value} with length {\tt valuelen}. If the maximum allowed
number of prefixes was reached, the error code
{\tt ERR\_\-RTP\_\-SDES\_\-MAX\-PRIV\-ITEMS} is returned.
\item {\tt int DeletePrivatePrefix(const u\_int8\_t *s, size\_t len)}\\
Deletes the entry for the prefix specified by {\tt s} with length
{\tt len}.
\item {\tt void GotoFirstPrivateValue()}\\
Starts the iteration over the stored SDES private item prefixes
and their associated values.
\item {\tt bool GetNextPrivateValue(u\_int8\_t **prefix, size\_t *prefixlen, u\_int8\_t **value, size\_t *valuelen)}\\
If available, returns {\tt true} and stores the next SDES
private item prefix in {\tt prefix} and its length in
{\tt prefixlen}. The associated value and its length are
then stored in {\tt value} and {\tt valuelen}. Otherwise,
it returns {\tt false}.
\item {\tt bool GetPrivateValue(const u\_int8\_t *prefix, size\_t prefixlen, u\_int8\_t **value, size\_t *valuelen) const}\\
Looks for the entry which corresponds to the SDES private
item prefix {\tt prefix} with length {\tt prefixlen}. If found,
the function returns {\tt true} and stores the associated
value and its length in {\tt value} and {\tt valuelen}
respectively.
\end{itemize}
\subsubsection{\tt RTPTransmitter}\headerfile{rtptransmitter.h}
The abstract class {\tt RTPTransmitter} specifies the interface for
actual transmission components. Currently, three implementations exist:
an UDP over IPv4 transmitter, an UDP over IPv6 transmitter and a
GStreamer transmission component. The {\tt TransmissionProtocol} type
is used to specify a specific kind of transmitter:
\begin{verbatim}
enum TransmissionProtocol { IPv4UDPProto, IPv6UDPProto,
IPv4GSTProto, UserDefinedProto };
\end{verbatim}
The {\tt UserDefinedProto} can be used to select your own transmission
component when using the {\tt RTPSession} class. In this case, you'll
have to implement the {\tt RTPSession} member function
{\tt NewUserDefinedTransmitter()} which should return a pointer to your
own {\tt RTPTransmitter} implementation.
Three kind of receive modes can be specified using the {\tt ReceiveMode}
type:
\begin{verbatim}
enum ReceiveMode { AcceptAll, AcceptSome, IgnoreSome };
\end{verbatim}
Depending on the mode set, incoming data is processed differently:
\begin{itemize}
\item {\tt AcceptAll}\\
All incoming data is accepted, no matter where it originated
from.
\item {\tt AcceptSome}\\
Only data coming from specific sources will be accepted.
\item {\tt IgnoreSome}\\
All incoming data is accepted, except for data coming from
a specific set of sources.
\end{itemize}
The interface defined by the {\tt RTPTransmission} class is the
following:
\begin{itemize}
\item {\tt int Init(bool threadsafe)}
This function must be called before the transmission component
can be used. Depending on the value of {\tt threadsafe}, the
component will be created for thread-safe usage or not.
\item {\tt int Create(size\_t maxpacksize, const RTPTransmissionParams *transparams)}\\
Prepares the component to be used. The parameter {\tt maxpacksize}
specifies the maximum size a packet can have: if the packet
is larger it will not be transmitted. The {\tt transparams}
parameter specifies a pointer to an {\tt RTPTransmissionParams}
instance. This is also an abstract class and each actual
component will define its own parameters by inheriting a
a class from {\tt RTPTransmissionParams}. If {\tt transparams}
is NULL, the default transmission parameters for the component
will be used.
\item {\tt int Destroy()}\\
By calling this function, buffers are cleared and the component
cannot be used anymore. Only when the {\tt Create} function is
called again can the component be used again.
\item {\tt RTPTransmissionInfo *GetTransmissionInfo()}\\
This function returns an instance of a subclass of {\tt RTPTransmissionInfo}
which will give some additional information about the transmitter
(a list of local IP addresses for example). Currently, either
an instance of {\tt RTP\-UDPv4\-Trans\-mission\-Info} or {\tt RTP\-UDPv6\-Trans\-mission\-Info}
is returned, depending on the type of the transmitter. The user
has to delete the returned instance when it is no longer needed.
\item {\tt int GetLocalHostName(u\_int8\_t *buffer, size\_t *bufferlength)}\\
Looks up the local host name based upon internal information about
the local host's addresses. This function might take some time
since a DNS query might be done. {\tt bufferlength} should initially
contain the number of bytes that may be stored in {\tt buffer}.
If the function succeeds, {\tt bufferlength} is set to the
number of bytes stored in {\tt buffer}. Note that the data in
{\tt buffer} is not NULL-terminated. If the function fails because
the buffer isn't large enough, it returns {\tt ERR\_RTP\_TRANS\_BUFFERLENGTHTOOSMALL}
and stores the number of bytes needed in {\tt bufferlength}.
\item {\tt bool ComesFromThisTransmitter(const RTPAddress *addr)}\\
Returns {\tt true} if the address specified by {\tt addr} is one
of the addresses of the transmitter.
\item {\tt size\_t GetHeaderOverhead()}\\
Returns the amount of bytes that will be added to the RTP packet
by the underlying layers (excluding the link layer).
\item {\tt int Poll()}\\
Checks for incoming data and stores it.
\item {\tt bool NewDataAvailable()}
Returns {\tt true} if packets can be obtained using the
{\tt GetNextPacket} member function.
\item {\tt RTPRawPacket *GetNextPacket()}\\
Returns the raw data of a received RTP packet (received during
the {\tt Poll} function) in an {\tt RTPRawPacket} instance.
\item {\tt int WaitForIncomingData(const RTPTime \&delay,bool *dataavailable = 0)}\\
Waits at most a time {\tt delay} until incoming data has
been detected. If {\tt dataavailable} is not {\tt NULL}, it should
be set to {\tt true} if data was actually read and to {\tt false}
otherwise.
\item {\tt int AbortWait()}\\
If the previous function has been called, this one aborts
the waiting.
\item {\tt int SendRTPData(const void *data, size\_t len)}\\
Send a packet with length {\tt len} containing {\tt data}
to all RTP addresses of the current destination list.
\item {\tt int SendRTCPData(const void *data, size\_t len)}\\
Send a packet with length {\tt len} containing {\tt data}
to all RTCP addresses of the current destination list.
\item {\tt void ResetPacketCount()}\\
The transmitter keeps track of the amount of RTP and RTCP
packets that were sent. This functions resets those counts.
\item {\tt u\_int32\_t GetNumRTPPacketsSent()}\\
Returns the number of RTP packets sent.
\item {\tt u\_int32\_t GetNumRTCPPacketsSent()}\\
Returns the number of RTCP packets sent.
\item {\tt int AddDestination(const RTPAddress \&addr)}\\
Adds the address specified by {\tt addr} to the list of
destinations.
\item {\tt int DeleteDestination(const RTPAddress \&addr)}\\
Deletes the address specified by {\tt addr} from the list
of destinations.
\item {\tt void ClearDestinations()}\\
Clears the list of destinations.
\item {\tt bool SupportsMulticasting()}\\
Returns {\tt true} if the transmission component supports
multicasting.
\item {\tt int JoinMulticastGroup(const RTPAddress \&addr)}\\
Joins the multicast group specified by {\tt addr}.
\item {\tt int LeaveMulticastGroup(const RTPAddress \&addr)}\\
Leaves the multicast group specified by {\tt addr}.
\item {\tt void LeaveAllMulticastGroups()}\\
Leaves all the multicast groups that have been joined.
\item {\tt int SetReceiveMode(RTPTransmitter::ReceiveMode m)}\\
Sets the receive mode to m, which is one of the following:
{\tt RTPTrans\-mitter::\-Accept\-All}, {\tt RTPTrans\-mitter::\-Accept\-Some},
{\tt RTPTrans\-mitter::\-Ignore\-Some}. Note that if the receive
mode is changed, all information about the addresses to ignore
or to accept is lost.
\item {\tt int AddToIgnoreList(const RTPAddress \&addr)}\\
Adds {\tt addr} to the list of addresses to ignore.
\item {\tt int DeleteFromIgnoreList(const RTPAddress \&addr)}\\
Deletes {\tt addr} from the list of addresses to ignore.
\item {\tt void ClearIgnoreList()}\\
Clears the list of addresses to ignore.
\item {\tt int AddToAcceptList(const RTPAddress \&addr)}\\
Adds {\tt addr} to the list of addresses to accept.
\item {\tt int DeleteFromAcceptList(const RTPAddress \&addr)}\\
Deletes {\tt addr} from the list of addresses to accept.
\item {\tt void ClearAcceptList()}\\
Clears the list of addresses to accept.
\item {\tt int SetMaximumPacketSize(size\_t s)}\\
Sets the maximum packet size which the transmitter should
allow to {\tt s}.
\end{itemize}
\Paragraph{UDP over IPv4 transmitter}\headerfile{rtpudpv4transmitter.h}\inherits{RTPTransmitter}
The class {\tt RTPUDPv4Transmitter} inherits the {\tt RTPTransmitter}
interface and implements a transmission component which user UDP
over IPv4 to send and receive RTP and RTCP data.
The component's parameters are described by the class
{\tt RTPUDPv4Trans\-mission\-Params} and is described in section
\ref{rtpudpv4transmissionparams}. The functions which have
an {\tt RTPAddress} argument require an argument of
type {\tt RTPIPv4Address} which is described in section
\ref{rtpipv4address}. The {\tt Get\-Trans\-mission\-Info} member function
of the {\tt RTP\-UDPv4\-Trans\-mitter} class returns an instance
of type {\tt RTP\-UDPv4\-Trans\-mission\-Info} which is described
in section \ref{rtpudpv4transmissioninfo}.
\Paragraph{UDP over IPv6 transmitter}\headerfile{rtpudpv6transmitter.h}\inherits{RTPTransmitter}
The class {\tt RTPUDPv6Transmitter} inherits the {\tt RTPTransmitter}
interface and implements a transmission component which user UDP
over IPv6 to send and receive RTP and RTCP data.
The component's parameters are described by the class
{\tt RTPUDPv6Trans\-mission\-Params} and is described in section
\ref{rtpudpv6transmissionparams}. The functions which have
an {\tt RTPAddress} argument require an argument of
type {\tt RTPIPv6Address} which is described in section
\ref{rtpipv6address}. The {\tt Get\-Trans\-mission\-Info} member function
of the {\tt RTP\-UDPv6\-Trans\-mitter} class returns an instance
of type {\tt RTP\-UDPv6\-Trans\-mission\-Info} which is described
in section \ref{rtpudpv6transmissioninfo}.
\subsubsection{\tt RTPTransmissionParams}\headerfile{rtptransmitter.h}
The {\tt RTPTransmissionParams} class is an abstract class which
will have a specific implementation for a specific kind of
transmission component. All actual implementations inherit the
following function which identify the component type for which
these parameters are valid:
\begin{verbatim}
RTPTransmitter::TransmissionProtocol GetTransmissionProtocol()
\end{verbatim}
\Paragraph{Parameters for the UDP over IPv4 transmitter}\headerfile{rtpudpv4transmitter.h}\inherits{RTPTransmissionParams}
\label{rtpudpv4transmissionparams}
The {\tt RTPUDPv4TransmissionParams} class represents the
parameters used by the UDP over IPv4 transmission component.
By default, the multicast TTL is set to $1$ and the portbase
is set to $5000$. The interface of this class is the following:
\begin{itemize}
\item {\tt void SetBindIP(u\_int32\_t ip)}\\
Sets the IP address which is used to bind the sockets
to {\tt ip}.
\item {\tt void SetPortbase(u\_int16\_t pbase)}\\
Sets the RTP portbase to {\tt pbase}. This has to be
an even number.
\item {\tt void SetMulticastTTL(u\_int8\_t mcastTTL)}\\
Sets the multicast TTL to be used to {\tt mcastTTL}.
\item {\tt void SetLocalIPList(std::list<u\_int32\_t> \&iplist)}\\
Passes a list of IP addresses which will be used as
the local IP addresses.
\item {\tt void ClearLocalIPList()}\\
Clears the list of local IP addresses. An empty list
will make the transmission component itself determine the
local IP addresses.
\item {\tt u\_int32\_t GetBindIP() const}\\
Returns the IP address which will be used to bind the
sockets.
\item {\tt u\_int16\_t GetPortbase() const}\\
Returns the RTP portbase which will be used.
\item {\tt u\_int8\_t GetMulticastTTL() const}\\
Returns the multicast TTL which will be used.
\item {\tt const std::list<u\_int32\_t> \&GetLocalIPList() const}\\
Returns the list of local IP addresses.
\end{itemize}
\Paragraph{Parameters for the UDP over IPv6 transmitter}\headerfile{rtpudpv6transmitter.h}\inherits{RTPTransmissionParams}
\label{rtpudpv6transmissionparams}
The {\tt RTPUDPv6TransmissionParams} class represents the
parameters used by the UDP over IPv6 transmission component.
By default, the multicast TTL is set to $1$ and the portbase
is set to $5000$. The interface of this class is the following:
\begin{itemize}
\item {\tt void SetBindIP(in6\_addr ip)}\\
Sets the IP address which is used to bind the sockets
to {\tt ip}.
\item {\tt void SetPortbase(u\_int16\_t pbase)}\\
Sets the RTP portbase to {\tt pbase}. This has to be
an even number.
\item {\tt void SetMulticastTTL(u\_int8\_t mcastTTL)}\\
Sets the multicast TTL to be used to {\tt mcastTTL}.
\item {\tt void SetLocalIPList(std::list<in6\_addr> \&iplist)}\\
Passes a list of IP addresses which will be used as
the local IP addresses.
\item {\tt void ClearLocalIPList()}\\
Clears the list of local IP addresses. An empty list
will make the transmission component itself determine the
local IP addresses.
\item {\tt in6\_addr GetBindIP() const}\\
Returns the IP address which will be used to bind the
sockets.
\item {\tt u\_int16\_t GetPortbase() const}\\
Returns the RTP portbase which will be used.
\item {\tt u\_int8\_t GetMulticastTTL() const}\\
Returns the multicast TTL which will be used.
\item {\tt const std::list<in6\_addr> \&GetLocalIPList() const}\\
Returns the list of local IP addresses.
\end{itemize}
\subsubsection{\tt RTPTransmissionInfo}\headerfile{rtptransmitter.h}
The {\tt RTPTransmissionInfo} class is an abstract class which
will have a specific implementation for a specific kind of
transmission component. All actual implementations inherit the
following function which identify the component type for which
these parameters are valid:
\begin{verbatim}
RTPTransmitter::TransmissionProtocol GetTransmissionProtocol()
\end{verbatim}
\Paragraph{Info about the UDP over IPv4 transmitter}\headerfile{rtpudpv4transmitter.h}
\label{rtpudpv4transmissioninfo}
The class {\tt RTPUDPv4TransmissionInfo} gives some additional
information about the UDP over IPv4 transmission component. The
following member functions are available:
\begin{itemize}
\item {\tt std::list<u\_int32\_t> GetLocalIPList() const}\\
Returns the list of IPv4 addresses the transmitter
considers to be the local IP addresses.
\item {\tt int GetRTPSocket() const}\\
Returns the socket descriptor used for receiving and transmitting
RTP packets.
\item {\tt int GetRTCPSocket() const}\\
Returns the socket descriptor used for receiving and transmitting
RTCP packets.
\end{itemize}
\Paragraph{Info about the UDP over IPv6 transmitter}\headerfile{rtpudpv6transmitter.h}
\label{rtpudpv6transmissioninfo}
The class {\tt RTPUDPv6TransmissionInfo} gives some additional
information about the UDP over IPv6 transmission component. The
following member functions are available:
\begin{itemize}
\item {\tt std::list<in6\_addr> GetLocalIPList() const}\\
Returns the list of IPv4 addresses the transmitter
considers to be the local IP addresses.
\item {\tt int GetRTPSocket() const}\\
Returns the socket descriptor used for receiving and transmitting
RTP packets.
\item {\tt int GetRTCPSocket() const}\\
Returns the socket descriptor used for receiving and transmitting
RTCP packets.
\end{itemize}
\subsubsection{\tt RTPAddress}\headerfile{rtpaddress.h}
The class {\tt RTPAddress} is an abstract class which is used to
specify destinations, multicast groups etc. To check which actual
implementation is used, the class defines the following type:
\begin{verbatim}
enum AddressType { IPv4Address, IPv6Address, UserDefinedAddress };
\end{verbatim}
The type {\tt RTPAddress::IPv4Address} is used by the UDP over IPv4
transmitter; {\tt RTPAddress::IPv6Address} is used by the UDP over
IPv6 transmitter. The {\tt RTPAddress::UserDefinedAddress} type can
be useful when using a user-defined transmission component.
The class defines the following interface:
\begin{itemize}
\item {\tt AddressType GetAddressType() const}\\
Returns the type of address the actual implementation
represents.
\item {\tt RTPAddress *CreateCopy() const}\\
Creates a copy of the {\tt RTPAddress} instance.
\item {\tt bool IsSameAddress(const RTPAddress *addr) const}\\
Checks if the address {\tt addr} is the same address as
the one this instance represents. Implementations must be
able ti handle a NULL argument.
\item {\tt bool IsFromSameHost(const RTPAddress *addr) const}\\
Checks if the address {\tt addr} represents the same host
as this instance. Implementations must be able to handle
a NULL argument.
\end{itemize}
\Paragraph{\tt RTPIPv4Address}\headerfile{rtpipv4address.h}\inherits{RTPAddress}
\label{rtpipv4address}
This class is used by the UDP over IPv4 transmission component.
The following member functions are defined in this class:
\begin{itemize}
\item {\tt RTPIPv4Address(u\_int32\_t ip = 0, u\_int16\_t port = 0)}\\
Creates an instance with IP address {\tt ip} and port number {\tt port}.
Both are interpreted in host byte order.
\item {\tt RTPIPv4Address(const u\_int8\_t ip[4], u\_int16\_t port = 0)}\\
Creates an instance with IP address {\tt ip} and port {\tt port}.
The port number is interpreted in host byte order.
\item {\tt void SetIP(u\_int32\_t ip)}\\
Sets the IP address for this instance to {\tt ip} which is
assumed to be in host byte order.
\item {\tt void SetIP(const u\_int8\_t ip[4])}\\
Sets the IP address of this instance to {\tt ip}.
\item {\tt void SetPort(u\_int16\_t port)}\\
Sets the port number for this instance to {\tt port} which
is interpreted in host byte order.
\item {\tt u\_int32\_t GetIP() const}\\
Returns the IP address contained in this instance in
host byte order.
\item {\tt u\_int16\_t GetPort() const}\\
Returns the port number of this instance in host byte
order.
\end{itemize}
When an {\tt RTPIPv4Address} is used in one of the multicast
functions of the transmitter, the port number is ignored. When
an instance is used in one of the accept or ignore functions
of the transmitter, a zero port number represents all ports
for the specified IP address.
\Paragraph{\tt RTPIPv6Address}\headerfile{rtpipv6address.h}\inherits{RTPAddress}
\label{rtpipv6address}
This class is used by the UDP over IPv4 transmission component.
The following member functions are defined:
\begin{itemize}
\item {\tt RTPIPv6Address()}\\
Creates an instance with IP address and port number set to
zero.
\item {\tt RTPIPv6Address(const u\_int8\_t ip[16], u\_int16\_t port = 0)}\\
Creates an instance with IP address {\tt ip} and port
number {\tt port}. The port number is assumed to be in
host byte order.
\item {\tt RTPIPv6Address(in6\_addr ip, u\_int16\_t port = 0)}\\
Creates an instance with IP address {\tt ip} and port
number {\tt port}. The port number is assumed to be in
host byte order.
\item {\tt void SetIP(in6\_addr ip)}\\
Sets the IP address for this instance to {\tt ip}.
\item {\tt void SetIP(const u\_int8\_t ip[16])}\\
Sets the IP address for this instance to {\tt ip}.
\item {\tt void SetPort(u\_int16\_t port)}\\
Sets the port number for this instance to {\tt port}, which
is interpreted in host byte order.
\item {\tt void GetIP(u\_int8\_t ip[16]) const}\\
Copies the IP address of this instance in {\tt ip}.
\item {\tt in6\_addr GetIP() const}\\
Returns the IP address of this instance.
\item {\tt u\_int16\_t GetPort() const}\\
Returns the port number contained in this instance in
host byte order.
\end{itemize}
When an {\tt RTPIPv6Address} is used in one of the multicast
functions of the transmitter, the port number is ignored. When
an instance is used in one of the accept or ignore functions
of the transmitter, a zero port number represents all ports
for the specified IP address.
\subsubsection{\tt RTPRawPacket}\headerfile{rtprawpacket.h}
The {\tt RTPRawPacket} class is used by the transmission component
to store the incoming RTP and RTCP data in. It has the following
interface:
\begin{itemize}
\item {\tt RTPRawPacket(u\_int8\_t *data, size\_t datalen, RTPAddress *address, RTPTime \&recvtime, bool rtp)}\\
Creates an instance which stores data from {\tt data} with
length {\tt datalen}. Only the pointer to the data is stored,
no actual copy is made! The address from which this packet
originated is set to {\tt address} and the time at which
the packet was received is set to {\tt recvtime}. The flag
which indicates whether this data is RTP or RTCP data is set
to {\tt rtp}.
\item {\tt u\_int8\_t *GetData()}\\
Returns the pointer to the data which is contained in this
packet.
\item {\tt size\_t GetDataLength() const}\\
Returns the length of the packet described by this instance.
\item {\tt RTPTime GetReceiveTime() const}\\
Returns the time at which this packet was received.
\item {\tt const RTPAddress *GetSenderAddress() const}\\
Returns the address stored in this packet.
\item {\tt bool IsRTP() const}\\
Returns {\tt true} if this data is RTP data, {\tt false} if it is RTCP
data.
\item {\tt void ZeroData()}\\
Sets the pointer to the data stored in this packet to zero.
This will prevent a {\tt delete} call for the actual data when
the destructor of {\tt RTPRawPacket} is called. This function
is used by the {\tt RTPPacket} and {\tt RTCPCompoundPacket}
classes to obtain the packet data (without having to copy it)
and to make sure the data isn't deleted when the destructor
of {\tt RTPRawPacket} is called.
\end{itemize}
\subsubsection{\tt RTPPacket}\headerfile{rtppacket.h}
The {\tt RTPPacket} class can be used to parse a {\tt RTPRawPacket}
instance if it represents RTP data. The class can also be used to
create a new RTP packet according to the parameters specified by
the user. The interface of this class is the following:
\begin{itemize}
\item {\tt RTPPacket(RTPRawPacket \&rawpack)}\\
Creates an RTPPacket instance based upon the data in
{\tt rawpack}.
\item {\tt RTPPacket(u\_int8\_t payloadtype, const void *payloaddata, size\_t payloadlen, u\_int16\_t seqnr,
u\_int32\_t timestamp, u\_int32\_t ssrc, bool gotmarker, u\_int8\_t numcsrcs, const u\_int32\_t *csrcs,
bool gotextension, u\_int16\_t extensionid, u\_int16\_t extensionlen\_numwords, const void *extensiondata,
size\_t maxpacksize = 0)}\\
Creates an new buffer for an RTP packet and fills in the fields
according to the specified parameters. If {\tt maxpacksize} is
not equal to zero, an error is generated if the total packet size
would exceed {\tt maxpacksize}. The arguments of the constructor
are self-explanatory. Note that the size of a header extension is
specified in a number of $32$-bit words.
\item {\tt RTPPacket(u\_int8\_t payloadtype, const void *payloaddata, size\_t payloadlen, u\_int16\_t seqnr,
u\_int32\_t timestamp, u\_int32\_t ssrc, bool gotmarker, u\_int8\_t numcsrcs, const u\_int32\_t *csrcs,
bool gotextension, u\_int16\_t extensionid, u\_int16\_t extensionlen\_numwords, const void *extensiondata,
void *buffer, size\_t buffersize)}\\
Pretty much the same function as the previous one, except that data is stored
in an external buffer {\tt buffer} with buffer size {\tt buffersize}.
\item {\tt int GetCreationError() const}\\
If an error occurred in one of the constructors, this function
returns the error code.
\item {\tt bool HasExtension() const}\\
Returns {\tt true} if the RTP packet has a header extension and
{\tt false} otherwise.
\item {\tt bool HasMarker() const}\\
Returns {\tt true} is the marker bit was set and {\tt false}
otherwise.
\item {\tt int GetCSRCCount() const}\\
Returns the number of CSRCs contained in this packet.
\item {\tt u\_int32\_t GetCSRC(int num) const}\\
Returns a specific CSRC identifier. The parameter {\tt num}
can go from $0$ to {\tt GetCSRCCount()}-$1$.
\item {\tt u\_int8\_t GetPayloadType() const}\\
Returns the payload type of the packet.
\item {\tt u\_int32\_t GetExtendedSequenceNumber() const}\\
Returns the extended sequence number of the packet. When
the packet is just received, only the low $16$ bits will
be set. The high $16$ bits can be filled in later.
\item {\tt u\_int16\_t GetSequenceNumber() const}\\
Returns the sequence number of this packet.
\item {\tt void SetExtendedSequenceNumber(u\_int32\_t seq)}\\
Sets the extended sequence number of this packet to {\tt seq}.
\item {\tt u\_int32\_t GetTimestamp() const}\\
Returns the timestamp of this packet.
\item {\tt u\_int32\_t GetSSRC() const}\\
Returns the SSRC identifier stored in this packet.
\item {\tt u\_int8\_t *GetPacketData() const}\\
Returns a pointer to the data of the entire packet.
\item {\tt u\_int8\_t *GetPayloadData() const}\\
Returns a pointer to the actual payload data.
\item {\tt size\_t GetPacketLength() const}\\
Returns the length of the entire packet.
\item {\tt size\_t GetPayloadLength() const}\\
Returns the payload length.
\item {\tt u\_int16\_t GetExtensionID() const}\\
If a header extension is present, this function
returns the extension identifier.
\item {\tt u\_int8\_t *GetExtensionData() const}\\
Returns a pointer to the header extension data.
\item {\tt size\_t GetExtensionLength() const}\\
Returns the length of the header extension data.
\item {\tt RTPTime GetReceiveTime() const}\\
When an {\tt RTPPacket} instance is created from
an {\tt RTPRawPacket} instance, the raw packet's
reception time is stored in the {\tt RTPPacket}
instance. This function then retrieves that time.
\end{itemize}
\subsubsection{\tt RTCPCompoundPacket}\headerfile{rtpcompoundpacket.h}
This class describes an RTCP compound packet and has the following
interface:
\begin{itemize}
\item {\tt RTCPCompoundPacket(RTPRawPacket \&rawpack)}\\
Creates an {\tt RTCPCompoundPacket} instance from the
data in {\tt rawpack}.
\item {\tt int GetCreationError()}\\
If the raw packet data in the constructor could not
be parsed, this function returns the error code of
what went wrong. If the packet had an invalid format,
the return value is {\tt ERR\_\-RTP\_\-RTCPCOMPOUND\_\-INVALID\-PACKET}.
\item {\tt u\_int8\_t *GetCompoundPacketData()}\\
Returns a pointer to the data of the entire RTCP compound packet.
\item {\tt size\_t GetCompoundPacketLength()}\\
Returns the size of the entire RTCP compound packet
\item {\tt void GotoFirstPacket()}\\
Starts the iteration over the individual RTCP packets in
the RTCP compound packet.
\item {\tt RTCPPacket *GetNextPacket()}\\
Returns a pointer to the next individual RTCP packet. Note
that no {\tt delete} call may be done on the {\tt RTCPPacket}
instance which is returned. The {\tt RTCPPacket} class is
described below.
\end{itemize}
\Paragraph{\tt RTCPPacket}\headerfile{rtcppacket.h}
The class {\tt RTCPPacket} is a base class for specific types
of RTCP packets. The following type in the {\tt RTCPPacket}
class identifies the different packet types:
\begin{verbatim}
enum PacketType { SR, RR, SDES, BYE, APP, Unknown };
\end{verbatim}
The class contains the following member functions:
\begin{itemize}
\item {\tt bool IsKnownFormat() const}\\
Returns {\tt true} if the subclass was able to interpret
the data and {\tt false} otherwise.
\item {\tt PacketType GetPacketType() const}\\
Returns the actual packet type which the subclass
implements:
\begin{itemize}
\item {\tt RTCPPacket::SR}: indicates an {\tt RTCPSRPacket} instance
\item {\tt RTCPPacket::RR}: indicates an {\tt RTCPRRPacket} instance
\item {\tt RTCPPacket::SDES}: indicates an {\tt RTCPSDESPacket} instance
\item {\tt RTCPPacket::BYE}: indicates an {\tt RTCPBYEPacket} instance
\item {\tt RTCPPacket::APP}: indicates an {\tt RTCPAPPPacket} instance
\item {\tt RTCPPacket::Unknown}: indicates an {\tt RTCPUnknownPacket} instance
\end{itemize}
\item {\tt u\_int8\_t *GetPacketData()}\\
Returns a pointer to the data of this RTCP packet.
\item {\tt size\_t GetPacketLength() const}\\
Returns the length of this RTCP packet.
\end{itemize}
\Paragraph{\tt RTCPSRPacket}\headerfile{rtcpsrpacket.h}\inherits{RTCPPacket}
This class describes an RTCP sender report packet. The interface
is the following:
\begin{itemize}
\item {\tt RTCPSRPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\item {\tt u\_int32\_t GetSenderSSRC() const}\\
Returns the SSRC of the participant who sent this packet.
\item {\tt RTPNTPTime GetNTPTimestamp() const}\\
Returns the NTP timestamp contained in the sender report.
\item {\tt u\_int32\_t GetRTPTimestamp() const}\\
Returns the RTP timestamp contained in the sender report.
\item {\tt u\_int32\_t GetSenderPacketCount() const}\\
Returns the sender's packet count contained in the
sender report.
\item {\tt u\_int32\_t GetSenderOctetCount() const}\\
Returns the sender's octet count contained in the sender
report.
\item {\tt int GetReceptionReportCount() const}\\
Returns the number of reception report blocks present
in this packet.
\item {\tt u\_int32\_t GetSSRC(int index) const}\\
Returns the SSRC of the reception report block described
by {\tt index} which may have a value from $0$ to
{\tt GetReceptionReportCount()}-$1$. Note that no
check is performed to see if {\tt index} is valid.
\item {\tt u\_int8\_t GetFractionLost(int index) const}\\
Returns the `fraction lost' field of the reception
report described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt int32\_t GetLostPacketCount(int index) const}\\
Returns the number of lost packets in the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetExtendedHighestSequenceNumber(int index) const}\\
Returns the extended highest sequence number of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReception\-Report\-Count()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetJitter(int index) const}\\
Returns the jitter field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetLSR(int index) const}\\
Returns the LSR field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetDLSR(int index) const}\\
Returns the DLSR field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\end{itemize}
\Paragraph{\tt RTCPRRPacket}\headerfile{rtcprrpacket.h}\inherits{RTCPPacket}
This class describes an RTCP receiver report packet. The interface
is the following:
\begin{itemize}
\item {\tt RTCPRRPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\item {\tt u\_int32\_t GetSenderSSRC() const}\\
Returns the SSRC of the participant who sent this packet.
\item {\tt int GetReceptionReportCount() const}\\
Returns the number of reception report blocks present
in this packet.
\item {\tt u\_int32\_t GetSSRC(int index) const}\\
Returns the SSRC of the reception report block described
by {\tt index} which may have a value from $0$ to
{\tt GetReceptionReportCount()}-$1$. Note that no
check is performed to see if {\tt index} is valid.
\item {\tt u\_int8\_t GetFractionLost(int index) const}\\
Returns the `fraction lost' field of the reception
report described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt int32\_t GetLostPacketCount(int index) const}\\
Returns the number of lost packets in the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetExtendedHighestSequenceNumber(int index) const}\\
Returns the extended highest sequence number of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReception\-Report\-Count()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetJitter(int index) const}\\
Returns the jitter field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetLSR(int index) const}\\
Returns the LSR field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt u\_int32\_t GetDLSR(int index) const}\\
Returns the DLSR field of the reception
report block described by {\tt index} which may have a value
from $0$ to {\tt GetReceptionReportCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\end{itemize}
\Paragraph{\tt RTCPSDESPacket}\headerfile{rtcpsdespacket.h}\inherits{RTCPPacket}
This class describes an RTCP SDES packet. In the {\tt RTCP\-SDES\-Packet}
class, the following type is defined:
\begin{verbatim}
enum ItemType { None, CNAME, NAME, EMAIL, PHONE,
LOC, TOOL, NOTE, PRIV, Unknown };
\end{verbatim}
This type is used to identify the type of an SDES item. The type
{\tt None} is used when the iteration over the items has finished;
{\tt Unknown} is used when there really is an item present, but
the type is not a standard type.
The class interface is the following:
\begin{itemize}
\item {\tt RTCPSDESPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\item {\tt int GetChunkCount() const}\\
Returns the number of SDES chunks in the SDES packet.
Each chunk has its own SSRC identifier.
\item {\tt bool GotoFirstChunk()}\\
Starts the iteration. If no SDES chunks are present,
the function returns {\tt false}. Otherwise, it
returns {\tt true} and sets the current chunk to be
the first chunk.
\item {\tt bool GotoNextChunk()}\\
Sets the current chunk to the next available chunk.
If no next chunk is present, this function returns
{\tt false}, otherwise it returns {\tt true}.
\item {\tt u\_int32\_t GetChunkSSRC() const}\\
Returns the SSRC identifier of the current chunk.
\item {\tt bool GotoFirstItem()}\\
Starts the iteration over the SDES items in the current
chunk. If no SDES items are present, the function returns
{\tt false}. Otherwise, the function sets the current item
to be the first one and returns {\tt true}.
\item {\tt bool GotoNextItem()}\\
If there's another item in the chunk, the current item
is set to be the next one and the function returns {\tt true}.
Otherwise, the function returns {\tt false}.
\item {\tt ItemType GetItemType() const}\\
Returns the SDES item type of the current item in the current
chunk.
\item {\tt size\_t GetItemLength() const}\\
Returns the item length of the current item in the current
chunk.
\item {\tt u\_int8\_t *GetItemData()}\\
Returns the item data of the current item in the current
chunk.
\end{itemize}
If SDES private item support was enabled at compile-time, the following
members can be used if the current item is an SDES private item.
\begin{itemize}
\item {\tt size\_t GetPRIVPrefixLength()}\\
Returns the length of the prefix string of the private
item.
\item {\tt u\_int8\_t *GetPRIVPrefixData()}\\
Returns the actual data of the prefix string.
\item {\tt size\_t GetPRIVValueLength()}\\
Returns the length of the value string of the private
item.
\item {\tt u\_int8\_t *GetPRIVValueData()}\\
Returns the actual value data of the private item.
\end{itemize}
\Paragraph{\tt RTCPAPPPacket}\headerfile{rtcpapppacket.h}\inherits{RTCPPacket}
The class {\tt RTCPAPPPacket} describes an RTCP APP packet.
The following member functions are available:
\begin{itemize}
\item {\tt RTCPAPPPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\item {\tt u\_int8\_t GetSubType() const}\\
Returns the subtype contained in the APP packet.
\item {\tt u\_int32\_t GetSSRC() const}\\
Returns the SSRC of the source which sent this packet.
\item {\tt u\_int8\_t *GetName()}\\
Returns the name contained in the APP packet. This always
consists of four bytes and is not NULL-terminated.
\item {\tt u\_int8\_t *GetAPPData()}\\
Returns a pointer to the actual data.
\item {\tt size\_t GetAPPDataLength() const}\\
Returns the length of the actual data.
\end{itemize}
\Paragraph{\tt RTCPBYEPacket}\headerfile{rtcpbyepacket.h}\inherits{RTCPPacket}
An RTCP BYE packet is represented by the class {\tt RTCPBYEPacket}
which has the following member functions:
\begin{itemize}
\item {\tt RTCPBYEPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\item {\tt int GetSSRCCount() const}\\
Returns the number of SSRC identifiers present in this
BYE packet.
\item {\tt u\_int32\_t GetSSRC(int index) const}\\
Returns the SSRC described by {\tt index} which may have a value
from $0$ to {\tt GetSSRCCount()}-$1$. Note that
no check is performed to see if {\tt index} is valid.
\item {\tt bool HasReasonForLeaving() const}\\
Returns true if the BYE packet contains a reason for
leaving.
\item {\tt size\_t GetReasonLength() const}\\
Returns the length of the string which describes why
the source(s) left.
\item {\tt u\_int8\_t *GetReasonData()}\\
Returns the actual reason data.
\end{itemize}
\Paragraph{\tt RTCPUnknownPacket}\headerfile{rtcpunknownpacket.h}\inherits{RTCPPacket}
This class doesn't have any extra member functions besides
the ones it inherited. Note that since an unknown packet type
doesn't have any format to check against, the {\tt IsKnownFormat}
function will trivially return {\tt true}. Only the following
constructor is available:
\begin{itemize}
\item {\tt RTCPUnknownPacket(u\_int8\_t *data, size\_t datalen)}\\
Creates an instance based on the data in {\tt data} with
length {\tt datalen}. Since the {\tt data} pointer
is referenced inside the class (no copy of the data is
made) one must make sure that the memory it points to is
valid as long as the class instance exists.
\end{itemize}
\subsubsection{\tt RTCPCompoundPacketBuilder}\headerfile{rtpcompoundpacket\-builder.h}\inherits{RTCPCompoundPacket}
The {\tt RTCPCompoundPacketBuilder} class can be used to
construct an RTCP compound packet. It inherits the member
functions of {\tt RTCP\-Compound\-Packet} which can be used
to access the information in the compound packet once it has
been built successfully. The member functions described below
return {\tt ERR\_\-RTP\_\-RTCPCOMP\-PACK\-BUILDER\_\-NOT\-ENOUGH\-BYTES\-LEFT}
if the action would cause the maximum allowed size to be
exceeded.
\begin{itemize}
\item {\tt int InitBuild(size\_t maxpacketsize)}\\
Starts building an RTCP compound packet with maximum size {\tt maxpacketsize}.
New memory will be allocated to store the packet.
\item {\tt int InitBuild(void *externalbuffer, size\_t buffersize)}\\
Starts building a packet. Data will be stored in {\tt externalbuffer} which
can contain {\tt buffersize} bytes.
\item {\tt int StartSenderReport(u\_int32\_t senderssrc, const RTPNTPTime \&ntptimestamp, u\_int32\_t rtptimestamp,
u\_int32\_t packetcount, u\_int32\_t octetcount)}\\
Tells the packet builder that the packet should start with a sender report which
will contain the sender information specified by this function's
arguments. Once the sender report is started, report blocks can be
added using the {\tt AddReportBlock} function.
\item {\tt int StartReceiverReport(u\_int32\_t senderssrc)}\\
Tells the packet builder that the packet should start with a receiver report which
will contain the sender SSRC {\tt senderssrc}. Once the sender report is started,
report blocks can be added using the {\tt AddReportBlock} function.
\item {\tt 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)}\\
Adds the report block information specified by the function's
arguments. If more than 31 report blocks are added, the builder
will automatically use a new RTCP receiver report packet.
\item {\tt int AddSDESSource(u\_int32\_t ssrc)}\\
Starts an SDES chunk for participant {\tt ssrc}.
\item {\tt int AddSDESNormalItem(RTCPSDESPacket::ItemType t, const void *itemdata, u\_int8\_t itemlength)}\\
Adds a normal (non-private) SDES item of type {\tt t} to the current SDES
chunk. The item's value will have length {\tt itemlength} and will contain
the data {\tt itemdata}.
\item {\tt int AddBYEPacket(u\_int32\_t *ssrcs, u\_int8\_t numssrcs, const void *reasondata, u\_int8\_t reasonlength)}\\
Adds a BYE packet to the compound packet. It will contain {\tt numssrcs}
source identifiers specified in {\tt ssrcs} and will indicate
as reason for leaving the string of length {\tt reasonlength}
containing data {\tt reasondata}.
\item {\tt int AddAPPPacket(u\_int8\_t subtype, u\_int32\_t ssrc, const u\_int8\_t name[4], const void *appdata, size\_t appdatalen)}\\
Adds the APP packet specified by the arguments to the
compound packet. Note that {\tt appdatalen} has to be
a multiple of four.
\item {\tt int EndBuild()}\\
Finished building the compound packet. If successful, the
{\tt RTCPCompoundPacket} member functions can be used to
access the RTCP packet data.
\end{itemize}
If the library was compiled with SDES private item support, the
following member function is also available:
\begin{itemize}
\item {\tt int AddSDESPrivateItem(const void *prefixdata, u\_int8\_t prefixlength, const void *valuedata,
u\_int8\_t valuelength)}\\
Adds an SDES PRIV item described by the function's arguments
to the current SDES chunk.
\end{itemize}
\subsubsection{\tt RTPSources}\headerfile{rtpsources.h}
The {\tt RTPSources} class represents a table in which information
about the participating sources is kept. The class has member
functions to process RTP and RTCP data and to iterate over the
participants. Note that a NULL address is used to identify packets
from our own session. The class also provides some overridable
functions which can be used to catch certain events (new SSRC,
SSRC collision, \ldots).
When probation support is enabled, you can select one of
three probation types:
\begin{verbatim}
enum ProbationType { NoProbation, ProbationDiscard, ProbationStore };
\end{verbatim}
When {\tt NoProbation} is selected, the probation algorithm will
not be used to validate new sources. When {\tt ProbationDiscard}
is used, the probation algorithm is activated but received packets
will be discarded until the source is validated. To activate the
probation routine and store the packets which are received before
the source is validated, the mode {\tt ProbationStore} can be
selected.
The RTPSources class interface is the following:
\begin{itemize}
\item {\tt RTPSources(ProbationType probationtype = ProbationStore)}\\
In the constructor you can select the probation type you'd like
to use. This only makes a difference when probation support was
enabled at compilation time.
\item {\tt void Clear()}\\
Clears the source table.
\item {\tt int CreateOwnSSRC(u\_int32\_t ssrc)}\\
Creates an entry for our own SSRC identifier.
\item {\tt int DeleteOwnSSRC()}\\
Deletes the entry for our own SSRC identifier.
\item {\tt void SentRTPPacket()}\\
For our own SSRC entry, the sender flag is updated based
upon outgoing packets instead of incoming packets. This
function should be called if our own session has sent an
RTP packet.
\item {\tt int ProcessRawPacket(RTPRawPacket *rawpack, RTPTransmitter *trans, bool acceptownpackets)}\\
Processes a raw packet {\tt rawpack}. The instance {\tt trans} will be used to
check if this packet is one of our own packets. The flag {\tt acceptownpackets}
indicates whether own packets should be accepted or ignored.
\item {\tt int ProcessRawPacket(RTPRawPacket *rawpack, RTPTransmitter *trans[], int numtrans, bool acceptownpackets)}\\
Same function as the previous one, except that every transmitter
in the array {\tt trans} of length {\tt numtrans} is used
to check if the packet is from our own session.
\item {\tt int ProcessRTPPacket(RTPPacket *rtppack, const RTPTime \&receivetime, const RTPAddress *senderaddress, bool *stored)}\\
Processes an {\tt RTPPacket} instance {\tt rtppack} which was
received at time {\tt receivetime}. And which originated from
{\tt senderaddress}. The {\tt senderaddress} parameter must
be NULL if the packet was sent by the local participant. The
flag {\tt stored} indicates whether the packet was stored in
the table or not. If so, the {\tt rtppack} instance may not
be deleted.
\item {\tt int ProcessRTCPCompoundPacket(RTCPCompoundPacket *rtcpcomppack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Processes the RTCP compound packet {\tt rtcpcomppack}
which was received at time {\tt receivetime} from {\tt
senderaddress}. The {\tt senderaddress} parameter must
be NULL if the packet was sent by the local participant.
\item {\tt int ProcessRTCPSenderInfo(u\_int32\_t ssrc, const RTPNTPTime \&ntptime, u\_int32\_t rtptime,
u\_int32\_t packetcount, u\_int32\_t octetcount, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Process the sender information of SSRC {\tt ssrc} into
the source table. The information was received at time
{\tt receivetime} from address {\tt senderaddress}. The
{\tt senderaddress} parameter must be NULL if the packet
was sent by the local participant.
\item {\tt int ProcessRTCPReportBlock(u\_int32\_t ssrc, 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, const RTPAddress *senderaddress)}\\
Processes the report block information which was sent
by participant {\tt ssrc} into the source table. The
information was received at time {\tt receivetime} from
address {\tt senderaddress}. The {\tt senderaddress}
parameter must be NULL if the packet was sent by the
local participant.
\item {\tt int ProcessSDESNormalItem(u\_int32\_t ssrc, RTCPSDESPacket::ItemType t, size\_t itemlength,
const void *itemdata, const RTPTime \&receivetime, const RTPAddress *senderaddress)}\\
Processes the non-private SDES item from source {\tt
ssrc} into the source table. The information was
received at time {\tt receivetime} from address {\tt
senderaddress}. The {\tt senderaddress} parameter must
be NULL if the packet was sent by the local participant.
\item {\tt int ProcessBYE(u\_int32\_t ssrc, size\_t reasonlength, const void *reasondata, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Processes the BYE message for SSRC {\tt ssrc}. The
information was received at time {\tt receivetime} from
address {\tt senderaddress}. The {\tt senderaddress}
parameter must be NULL if the packet was sent by the
local participant.
\item {\tt int UpdateReceiveTime(u\_int32\_t ssrc, const RTPTime \&receivetime, const RTPAddress *senderaddress)}\\
If we heard from source {\tt ssrc}, but no actual
data was added to the source table (for example, if
no report block was meant for us), this function can
be used to indicate that something was received from
this source. This will prevent a premature timeout for
this participant. The message was received at time {\tt
receivetime} from address {\tt senderaddress}. The {\tt
senderaddress} parameter must be NULL if the packet was
sent by the local participant.
\item {\tt bool GotoFirstSource()}\\
Starts the iteration over the participants by going to the
first member in the table. If a member was found, the function
returns {\tt true}, otherwise it returns {\tt false}.
\item {\tt bool GotoNextSource()}\\
Sets the current source to be the next source in the table.
If we're already at the last source, the function returns
{\tt false}, otherwise it returns {\tt true}.
\item {\tt bool GotoPreviousSource()}\\
Sets the current source to be the previous source in the table.
If we're at the first source, the function returns
{\tt false}, otherwise it returns {\tt true}.
\item {\tt bool GotoFirstSourceWithData()}\\
Sets the current source to be the first source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt bool GotoNextSourceWithData()}\\
Sets the current source to be the next source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt bool GotoPreviousSourceWithData()}\\
Sets the current source to be the previous source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt RTPSourceData *GetCurrentSourceInfo()}\\
Returns the {\tt RTPSourceData} instance for the currently
selected participant.
\item {\tt RTPSourceData *GetSourceInfo(u\_int32\_t ssrc)}\\
Returns the {\tt RTPSourceData} instance for the participant
identified by {\tt ssrc}, or NULL if no such entry exists.
\item {\tt RTPPacket *GetNextPacket()}\\
Extracts the next packet from the received packets queue
of the current participant.
\item {\tt bool GotEntry(u\_int32\_t ssrc)}\\
Returns {\tt true} if an entry for participant {\tt ssrc} exists
and {\tt false} otherwise.
\item {\tt RTPSourceData *GetOwnSourceInfo()}\\
If present, it returns the {\tt RTPSourceData} instance of
the entry which was created by {\tt CreateOwnSSRC}.
\item {\tt void Timeout(const RTPTime \&curtime, const RTPTime \&timeoutdelay)}\\
Assuming that the current time is {\tt curtime}, time out the
members from whom we haven't heard during the previous time
interval {\tt timeoutdelay}.
\item {\tt void SenderTimeout(const RTPTime \&curtime, const RTPTime \&timeoutdelay)}\\
Assuming that the current time is {\tt curtime}, remove the
sender flag for senders from whom we haven't received any RTP
packets during the previous time interval {\tt timeoutdelay}.
\item {\tt void BYETimeout(const RTPTime \&curtime, const RTPTime \&timeoutdelay)}\\
Assuming that the current time is {\tt curtime}, remove the
members who sent a BYE packet more than the time interval
{\tt timeoutdelay} ago.
\item {\tt void NoteTimeout(const RTPTime \&curtime, const RTPTime \&timeoutdelay)}\\
Assuming that the current time is {\tt curtime}, clear the SDES
NOTE items which haven't been updated in during the previous
time interval {\tt timeoutdelay}.
\item {\tt void MultipleTimeouts(const RTPTime \&curtime, const RTPTime \&sendertimeout,
const RTPTime \&byetimeout, const RTPTime \&generaltimeout,
const RTPTime \&notetimeout)}\\
Combines the previous four functions. This is more efficient
than calling all four functions since only one iteration
is needed in this function.
\item {\tt int GetSenderCount() const}\\
Returns the number of participants which are marked as a
sender.
\item {\tt int GetTotalCount() const}\\
Returns the total number of entries in the source table.
\item {\tt int GetActiveMemberCount() const}\\
Returns the number of members which have been validated and
which haven't sent a BYE packet yet.
\end{itemize}
If SDES private item support was enabled at compile-time, the following
member function is also available:
\begin{itemize}
\item {\tt int ProcessSDESPrivateItem(u\_int32\_t ssrc, size\_t prefixlen, const void *prefixdata,
size\_t valuelen, const void *valuedata, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Processes the SDES private item from source {\tt ssrc}
into the source table. The information was received at
time {\tt receivetime} from address {\tt senderaddress}.
The {\tt senderaddress} parameter must be NULL if the
packet was sent by the local participant.
\end{itemize}
By inheriting your own class from {\tt RTPSources} and overriding
one or more of the functions below, your application can be informed
of certain events:
\begin{itemize}
\item {\tt void OnRTPPacket(RTPPacket *pack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an RTP packet is about to be processed.
\item {\tt void OnRTCPCompoundPacket(RTCPCompoundPacket *pack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an RTCP packet is about to be processed.
\item {\tt void OnSSRCCollision(RTPSourceData *srcdat, const RTPAddress *senderaddress, bool isrtp)}\\
Is called when an SSRC collision was detected. The instance
{\tt srcdat} is the one present in the table, the address
{\tt senderaddress} is the one that collided with one of the
addresses and {\tt isrtp} indicates against which address of
{\tt srcdat} the check failed.
\item {\tt void OnCNAMECollision(RTPSourceData *srcdat, const RTPAddress *senderaddress,
const u\_int8\_t *cname, size\_t cnamelength)}\\
Is called when another CNAME was received than the one
already present for source {\tt srcdat}.
\item {\tt void OnNewSource(RTPSourceData *srcdat)}\\
Is called when a new entry {\tt srcdat} is added to the source
table.
\item {\tt void OnRemoveSource(RTPSourceData *srcdat)}\\
Is called when the entry {\tt srcdat} is about to be
deleted from the source table.
\item {\tt void OnTimeout(RTPSourceData *srcdat)}\\
Is called when participant {\tt srcdat} is timed out.
\item {\tt void OnBYETimeout(RTPSourceData *srcdat)}\\
Is called when participant {\tt srcdat} is timed after
having sent a BYE packet.
\item {\tt void OnBYEPacket(RTPSourceData *srcdat)}\\
Is called when a BYE packet has been processed for source
{\tt srcdat}.
\item {\tt void OnAPPPacket(RTCPAPPPacket *apppacket, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
In called when an RTCP APP packet {\tt apppacket} has been received
at time {\tt receivetime} from address {\tt senderaddress}.
\item {\tt void OnUnknownPacketType(RTCPPacket *rtcppack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an unknown RTCP packet type was detected.
\item {\tt void OnUnknownPacketFormat(RTCPPacket *rtcppack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an unknown packet format for a known packet
type was detected.
\item {\tt void OnNoteTimeout(RTPSourceData *srcdat)}\\
Is called when the SDES NOTE item for source {\tt srcdat}
has been timed out.
\end{itemize}
\subsubsection{\tt RTPSourceData}\headerfile{rtpsourcedata.h}
\label{rtpsourcedata}
The {\tt RTPSourceData} class contains all information about a member
of the session. The interface is the following:
\begin{itemize}
\item {\tt u\_int32\_t GetSSRC() const}\\
Returns the SSRC identifier for this member.
\item {\tt bool HasData() const}\\
Returns {\tt true} if there are RTP packets which can be extracted.
\item {\tt RTPPacket *GetNextPacket()}\\
Extracts the first packet of this participants RTP packet queue.
\item {\tt void FlushPackets()}\\
Clears the participant's RTP packet list.
\item {\tt bool IsOwnSSRC() const}\\
Returns {\tt true} if the participant was added using the
{\tt RTPSources} member function {\tt CreateOwnSSRC} and
returns {\tt false} otherwise.
\item {\tt bool IsCSRC() const}\\
Returns true if the source identifier is actually a CSRC from
an RTP packet.
\item {\tt bool IsSender() const}\\
Returns {\tt true} if this member is marked as a sender and
{\tt false} if not.
\item {\tt bool IsValidated() const}\\
Returns {\tt true} if the participant is validated: this is so
if a number of consecutive RTP packets have been received or if
a CNAME item has been received for this participant.
\item {\tt bool IsActive() const}\\
Returns {\tt true} if the source was validated and had not yet
sent a BYE packet.
\item {\tt void SetProcessedInRTCP(bool v)}\\
This function is used by the {\tt RTCPPacketBuilder} class to mark
whether this participant's information has been processed in a
report block or not.
\item {\tt bool IsProcessedInRTCP() const}\\
This function is used by the {\tt RTCPPacketBuilder} class and
returns whether this participant has been processed in a report
block or not.
\item {\tt bool IsRTPAddressSet() const}\\
Returns {\tt true} if the address from which this participant's RTP packets
originate has already been set.
\item {\tt bool IsRTCPAddressSet() const}\\
Returns {\tt true} if the address from which this participant's RTCP packets
originate has already been set.
\item {\tt const RTPAddress *GetRTPDataAddress() const}\\
Returns the address from which this participant's RTP packet originate. If the
address has been set and the returned value is NULL, this indicates that it
originated from the local participant.
\item {\tt const RTPAddress *GetRTCPDataAddress() const}\\
Returns the address from which this participant's RTCP packet originate. If the
address has been set and the returned value is NULL, this indicates that it
originated from the local participant.
\item {\tt bool ReceivedBYE() const}\\
Returns {\tt true} if we received a BYE message for this participant and
{\tt false} otherwise.
\item {\tt u\_int8\_t *GetBYEReason(size\_t *len) const}\\
Returns the reason for leaving contained in the BYE packet of this participant.
The length of the reason is stored in {\tt len}.
\item {\tt RTPTime GetBYETime() const}\\
Returns the time at which the BYE packet was received.
\item {\tt void SetTimestampUnit(double tsu)}\\
Sets the value for the timestamp unit to be used in jitter calculations
for data received from this participant. If not set, the library uses an
approximation for the timestamp unit which is calculated from two consecutive
RTCP sender reports. The timestamp unit is defined as a time interval divided
by the number of samples in that interval: for $8000 Hz$ audio this would be
$1.0/8000.0$.
\item {\tt double GetTimestampUnit() const}\\
Returns the timestamp unit used for this participant.
\item {\tt bool SR\_HasInfo() const}\\
Returns {\tt true} if an RTCP sender report has been received from this participant.
\item {\tt RTPNTPTime SR\_GetNTPTimestamp() const}\\
Returns the NTP timestamp contained in the last sender report.
\item {\tt u\_int32\_t SR\_GetRTPTimestamp() const}\\
Returns the RTP timestamp contained in the last sender report.
\item {\tt u\_int32\_t SR\_GetPacketCount() const}\\
Returns the packet count contained in the last sender report.
\item {\tt u\_int32\_t SR\_GetByteCount() const}\\
Returns the octet count contained in the last sender report.
\item {\tt RTPTime SR\_GetReceiveTime() const}\\
Returns the time at which the last sender report was received.
\item {\tt bool SR\_Prev\_HasInfo() const}\\
Returns {\tt true} if more than one RTCP sender report has been received.
\item {\tt RTPNTPTime SR\_Prev\_GetNTPTimestamp() const}\\
Returns the NTP timestamp contained in the second to last sender report.
\item {\tt u\_int32\_t SR\_Prev\_GetRTPTimestamp() const}\\
Returns the RTP timestamp contained in the second to last sender report.
\item {\tt u\_int32\_t SR\_Prev\_GetPacketCount() const}\\
Returns the packet count contained in the second to last sender report.
\item {\tt u\_int32\_t SR\_Prev\_GetByteCount() const}\\
Returns the octet count contained in the second to last sender report.
\item {\tt RTPTime SR\_Prev\_GetReceiveTime() const}\\
Returns the time at which the second to last sender report was received.
\item {\tt bool RR\_HasInfo() const}\\
Returns {\tt true} if this participant sent a receiver report with information
about the reception of our data.
\item {\tt double RR\_GetFractionLost() const}\\
Returns the fraction lost value from the last report.
\item {\tt int32\_t RR\_GetPacketsLost() const}\\
Returns the number of lost packets contained in the last report.
\item {\tt u\_int32\_t RR\_GetExtendedHighestSequenceNumber() const}\\
Returns the extended highest sequence number contained in the last report.
\item {\tt u\_int32\_t RR\_GetJitter() const}\\
Returns the jitter value from the last report.
\item {\tt u\_int32\_t RR\_GetLastSRTimestamp() const}\\
Returns the LSR value from the last report.
\item {\tt u\_int32\_t RR\_GetDelaySinceLastSR() const}\\
Returns the DLSR value from the last report.
\item {\tt RTPTime RR\_GetReceiveTime() const}\\
Returns the time at which the last report was received.
\item {\tt bool RR\_Prev\_HasInfo() const}\\
Returns {\tt true} if this participant sent more than one receiver report with information
about the reception of our data.
\item {\tt double RR\_Prev\_GetFractionLost() const}\\
Returns the fraction lost value from the second to last report.
\item {\tt int32\_t RR\_Prev\_GetPacketsLost() const}\\
Returns the number of lost packets contained in the second to last report.
\item {\tt u\_int32\_t RR\_Prev\_GetExtendedHighestSequenceNumber() const}\\
Returns the extended highest sequence number contained in the second to last report.
\item {\tt u\_int32\_t RR\_Prev\_GetJitter() const}\\
Returns the jitter value from the second to last report.
\item {\tt u\_int32\_t RR\_Prev\_GetLastSRTimestamp() const}\\
Returns the LSR value from the second to last report.
\item {\tt u\_int32\_t RR\_Prev\_GetDelaySinceLastSR() const}\\
Returns the DLSR value from the second to last report.
\item {\tt RTPTime RR\_Prev\_GetReceiveTime() const}\\
Returns the time at which the second to last report was received.
\item {\tt bool INF\_HasSentData() const}\\
Returns {\tt true} if validated RTP packets have been received from this
participant.
\item {\tt int32\_t INF\_GetNumPacketsReceived() const}\\
Returns the total number of received packets from this participant.
\item {\tt u\_int32\_t INF\_GetBaseSequenceNumber() const}\\
Returns the base sequence number of this participant.
\item {\tt u\_int32\_t INF\_GetExtendedHighestSequenceNumber() const}\\
Returns the extended highest sequence number received from this
participant.
\item {\tt u\_int32\_t INF\_GetJitter() const}\\
Returns the current jitter value for this participant.
\item {\tt RTPTime INF\_GetLastMessageTime() const}\\
Returns the time at which something was last heard from this member.
\item {\tt RTPTime INF\_GetLastRTPPacketTime() const}\\
Returns the time at which the last RTP packet was received.
\item {\tt double INF\_GetEstimatedTimestampUnit() const}\\
Returns the estimated timestamp unit. The estimate is made from two
consecutive sender reports.
\item {\tt u\_int32\_t INF\_GetNumPacketsReceivedInInterval() const}\\
Returns the number of packets received since a new interval was
started with {\tt INF\_StartNewInterval}.
\item {\tt u\_int32\_t INF\_GetSavedExtendedSequenceNumber() const}\\
Returns the extended sequence number which was stored by the
{\tt INF\_StartNewInterval} call.
\item {\tt void INF\_StartNewInterval()}\\
Starts a new interval to count received packets in. This also stores
the current extended highest sequence number to be able to calculate
the packet loss during the interval.
\item {\tt RTPTime INF\_GetRoundtripTime() const}\\
Estimates the round trip time by using the LSR and DLSR info from the
last receiver report.
\item {\tt RTPTime INF\_GetLastSDESNoteTime() const}\\
Returns the time at which the last SDES NOTE item was received.
\item {\tt u\_int8\_t *SDES\_GetCNAME(size\_t *len) const}\\
Returns a pointer to the SDES CNAME item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetName(size\_t *len) const}\\
Returns a pointer to the SDES name item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetEMail(size\_t *len) const}\\
Returns a pointer to the SDES e-mail item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetPhone(size\_t *len) const}\\
Returns a pointer to the SDES phone item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetLocation(size\_t *len) const}\\
Returns a pointer to the SDES location item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetTool(size\_t *len) const}\\
Returns a pointer to the SDES tool item of this participant and stores
its length in {\tt len}.
\item {\tt u\_int8\_t *SDES\_GetNote(size\_t *len) const}\\
Returns a pointer to the SDES note item of this participant and stores
its length in {\tt len}.
\end{itemize}
If SDES private item support was enabled at compile-time, the following
member functions are also available:
\begin{itemize}
\item {\tt void SDES\_GotoFirstPrivateValue()}\\
Starts the iteration over the stored SDES private item prefixes
and their associated values.
\item {\tt bool SDES\_GetNextPrivateValue(u\_int8\_t **prefix, size\_t *prefixlen, u\_int8\_t **value, size\_t *valuelen) }\\
If available, returns {\tt true} and stores the next SDES
private item prefix in {\tt prefix} and its length in
{\tt prefixlen}. The associated value and its length are
then stored in {\tt value} and {\tt valuelen}. Otherwise,
it returns {\tt false}.
\item {\tt bool SDES\_GetPrivateValue(u\_int8\_t *prefix, size\_t prefixlen, u\_int8\_t **value, size\_t *valuelen) const}\\
Looks for the entry which corresponds to the SDES private
item prefix {\tt prefix} with length {\tt prefixlen}. If found,
the function returns {\tt true} and stores the associated
value and its length in {\tt value} and {\tt valuelen}
respectively.
\end{itemize}
\subsubsection{\tt RTPPacketBuilder}\headerfile{rtppacketbuilder.h}
This class can be used to build RTP packets and is a bit more
high-level than the {\tt RTPPacket} class: it generates an SSRC
identifier, keeps track of timestamp and sequence number etc.
The interface is the following:
\begin{itemize}
\item {\tt int Init(size\_t maxpacksize)}\\
Initializes the builder to only allow packets with a size
below {\tt maxpacksize}
\item {\tt void Destroy()}\\
Cleans up the builder.
\item {\tt u\_int32\_t GetPacketCount()}\\
Returns the number of packets which have been created with
the current SSRC identifier.
\item {\tt u\_int32\_t GetPayloadOctetCount()}\\
Returns the number of payload octets which have been generated
with this SSRC identifier.
\item {\tt int SetMaximumPacketSize(size\_t maxpacksize)}\\
Sets the maximum allowed packet size to {\tt maxpacksize}.
\item {\tt int AddCSRC(u\_int32\_t csrc)}\\
Adds a CSRC to the CSRC list which will be stored in the
RTP packets.
\item {\tt int DeleteCSRC(u\_int32\_t csrc)}\\
Deletes a CSRC from the list which will be stored in the
RTP packets.
\item {\tt void ClearCSRCList()}\\
Clears the CSRC list.
\item {\tt int BuildPacket(const void *data, size\_t len)}\\
Builds a packet with payload {\tt data} and payload length
{\tt len}. The payload type, marker and timestamp increment
used will be those that have been set using the
{\tt SetDefault} functions below.
\item {\tt int BuildPacket(const void *data, size\_t len,
u\_int8\_t pt, bool mark, u\_int32\_t timestampinc)}\\
Builds a packet with payload {\tt data} and payload length
{\tt len}. The payload type will be set to {\tt pt}, the
marker bit to {\tt mark} and after building this packet,
the timestamp will be incremented with {\tt timestamp}.
\item {\tt int BuildPacketEx(const void *data, size\_t len,
u\_int16\_t hdrextID, const void *hdrextdata, size\_t numhdrextwords)}\\
Builds a packet with payload {\tt data} and payload length
{\tt len}. The payload type, marker and timestamp increment
used will be those that have been set using the
{\tt SetDefault} functions below. This packet will also contain
an RTP header extension with identifier {\tt hdrextID} and data
{\tt hdrextdata}. The length of the header extension data
is given by {\tt numhdrextwords} which expresses the length
in a number of $32$-bit words.
\item {\tt int BuildPacketEx(const void *data, size\_t len,
u\_int8\_t pt, bool mark, u\_int32\_t timestampinc,
u\_int16\_t hdrextID, const void *hdrextdata, size\_t numhdrextwords)}\\
Builds a packet with payload {\tt data} and payload
length {\tt len}. The payload type will be set to {\tt
pt}, the marker bit to {\tt mark} and after building
this packet, the timestamp will be incremented with {\tt
timestamp}. This packet will also contain an RTP header
extension with identifier {\tt hdrextID} and data {\tt
hdrextdata}. The length of the header extension data is
given by {\tt numhdrextwords} which expresses the length
in a number of $32$-bit words.
\item {\tt u\_int8\_t *GetPacket()}\\
Returns a pointer to the last built RTP packet data.
\item {\tt size\_t GetPacketLength()}\\
Returns the size of the last built RTP packet.
\item {\tt int SetDefaultPayloadType(u\_int8\_t pt)}\\
Sets the default payload type to {\tt pt}.
\item {\tt int SetDefaultMark(bool m)}\\
Sets the default marker bit to {\tt m}.
\item {\tt int SetDefaultTimestampIncrement(u\_int32\_t timestampinc)}\\
Sets the default timestamp increment to {\tt timestampinc}.
\item {\tt int IncrementTimestamp(u\_int32\_t inc)}\\
This function increments the timestamp with the amount
given by {\tt inc}. This can be useful if, for example,
a packet was not sent because it contained only silence.
Then, this function should be called to increment the
timestamp with the appropriate amount so that the next
packets will still be played at the correct time at
other hosts.
\item {\tt int IncrementTimestampDefault()}\\
This function increments the timestamp with the amount
given set by the {\tt SetDefaultTimestampIncrement}
member function. This can be useful if, for example,
a packet was not sent because it contained only silence.
Then, this function should be called to increment the
timestamp with the appropriate amount so that the next
packets will still be played at the correct time at
other hosts.
\item {\tt u\_int32\_t CreateNewSSRC()}\\
Creates a new SSRC to be used in generated packets. This
will also generate new timestamp and sequence number
offsets.
\item {\tt u\_int32\_t CreateNewSSRC(RTPSources \&sources)}\\
Creates a new SSRC to be used in generated packets. This
will also generate new timestamp and sequence number
offsets. The source table {\tt sources} is used to make
sure that the chosen SSRC isn't used by another participant
yet.
\item {\tt u\_int32\_t GetSSRC()}\\
Returns the current SSRC identifier.
\item {\tt u\_int32\_t GetTimestamp()}\\
Returns the current RTP timestamp.
\item {\tt u\_int16\_t GetSequenceNumber()}\\
Returns the current sequence number.
\item {\tt RTPTime GetPacketTime()}\\
Returns the time at which a packet was generated. This
is not necessarily the time at which the last RTP packet
was generated: if the timestamp increment was zero, the
time is not updated.
\item {\tt u\_int32\_t GetPacketTimestamp()}\\
Returns the RTP timestamp which corresponds to the time
returned by the previous function.
\end{itemize}
\subsubsection{\tt RTCPPacketBuilder}\headerfile{rtcppacketbuilder.h}
The class {\tt RTCPPacketBuilder} can be used to build RTCP
compound packets. This class is more high-level than the
{\tt RTCPCompoundPacketBuilder} class: it uses the information
of an {\tt RTPPacketBuilder} instance and of a {\tt RTPSources}
instance to automatically generate the next compound packet which should
be sent. It also provides functions to determine when SDES items
other than the CNAME item should be sent.
Its class interface is the following:
\begin{itemize}
\item {\tt RTCPPacketBuilder(RTPSources \&sources,RTPPacketBuilder \&rtppackbuilder)}\\
Creates an instance which will use the source table
{\tt sources} and the RTP packet builder {\tt rtppackbuilder}
to determine the information for the next RTCP compound packet.
\item {\tt int Init(size\_t maxpacksize, double timestampunit, const void *cname, size\_t cnamelen)}\\
Initializes the builder to use the maximum allowed
packet size {\tt maxpacksize}, timestamp unit {\tt
timestampunit} and the SDES CNAME item specified by {\tt
cname} with length {\tt cnamelen}. The timestamp unit
is defined as a time interval divided by the number of
samples in that interval: for $8000 Hz$ audio this would
be $1.0/8000.0$.
\item {\tt void Destroy()}\\
Cleans up the builder.
\item {\tt int SetTimestampUnit(double tsunit)}\\
Sets the timestamp unit to be used to {\tt tsunit}. The
timestamp unit is defined as a time interval divided
by the number of samples in that interval: for $8000 Hz$
audio this would be $1.0/8000.0$.
\item {\tt int SetMaximumPacketSize(size\_t maxpacksize)}\\
Sets the maximum size allowed size of an RTCP compound
packet to {\tt maxpacksize}.
\item {\tt int BuildNextPacket(RTCPCompoundPacket **pack)}\\
Builds the next RTCP compound packet which should be
sent and stores it in {\tt pack}.
\item {\tt int BuildBYEPacket(RTCPCompoundPacket **pack, const void *reason, size\_t reasonlength,bool useSRifpossible = true)}\\
Builds a BYE packet with reason for leaving
specified by {\tt reason} and length
{\tt reasonlength}. If {\tt useSRifpossible} is set to {\tt true},
the RTCP compound packet will start with a sender report if
allowed. Otherwise, a receiver report is used.
\item {\tt void SetNameInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES name
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetEMailInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES e-mail
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetLocationInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES location
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetPhoneInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES phone
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetToolInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES tool
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetNoteInterval(int count)}\\
After all possible sources in the source table have been
processed, the class will check if other SDES items
need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES note
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt int SetLocalName(const void *s, size\_t len)}\\
Sets the SDES name item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalEMail(const void *s, size\_t len)}\\
Sets the SDES e-mail item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalLocation(const void *s, size\_t len)}\\
Sets the SDES location item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalPhone(const void *s, size\_t len)}\\
Sets the SDES phone item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalTool(const void *s, size\_t len)}\\
Sets the SDES tool item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalNote(const void *s, size\_t len)}\\
Sets the SDES note item for the local participant to the value {\tt s}
with length {\tt len}.
\end{itemize}
\subsubsection{\tt RTPCollisionList}\headerfile{rtpcollisionlist.h}
This class represents a list of addresses from which SSRC collisions were
detected. Its interface is this:
\begin{itemize}
\item {\tt void Clear()}\\
Clears the list of addresses.
\item {\tt int UpdateAddress(const RTPAddress *addr, const RTPTime \&receivetime, bool *created)}\\
Updates the entry for address {\tt addr} to indicate that a collision
was detected at time {\tt receivetime}. If the entry did not exist yet, the
flag {\tt created} is set to {\tt true}, otherwise it is set to {\tt false}.
\item {\tt bool HasAddress(const RTPAddress *addr) const}\\
Returns {\tt true} if the address {\tt addr} appears in the list.
\item {\tt void Timeout(const RTPTime \&currenttime, const RTPTime \&timeoutdelay)}\\
Assuming that the current time is given by {\tt currenttime}, this function
times out entries which haven't been updated in the previous time interval
specified by {\tt timeoutdelay}.
\end{itemize}
\subsubsection{\tt RTCPScheduler}\headerfile{rtcpscheduler.h}
This class determines when RTCP compound packets should be sent. It has
the following interface:
\begin{itemize}
\item {\tt RTCPScheduler(RTPSources \&sources)}\\
Creates an instance which will use the source table {\tt RTPSources} to
determine when RTCP compound packets should be scheduled. Note that
for correct operation the {\tt sources} instance should have information
about the own SSRC (added by {\tt CreateOwnSSRC}).
\item {\tt void Reset()}\\
Resets the scheduler.
\item {\tt void SetParameters(const RTCPSchedulerParams \&params)}\\
Sets the scheduler parameters to be used to {\tt params}. The
{\tt RTCPSchedulerParams} class is described below.
\item {\tt RTCPSchedulerParams GetParameters() const}\\
Returns the currently used scheduler parameters.
\item {\tt void SetHeaderOverhead(size\_t numbytes)}\\
Sets the header overhead from underlying protocols (for example UDP and
IP) to {\tt numbytes}.
\item {\tt size\_t GetHeaderOverhead() const}\\
Returns the currently used header overhead.
\item {\tt void AnalyseIncoming(RTCPCompoundPacket \&rtcpcomppack)}\\
For each incoming RTCP compound packet, this function has to be
called for the scheduler to work correctly.
\item {\tt void AnalyseOutgoing(RTCPCompoundPacket \&rtcpcomppack)}\\
For each outgoing RTCP compound packet, this function has to be
called for the scheduler to work correctly.
\item {\tt void ActiveMemberDecrease()}\\
This function has to be called each time a member times out or
sends a BYE packet.
\item {\tt void ScheduleBYEPacket(size\_t packetsize)}\\
Asks the scheduler to schedule an RTCP compound packet containing a
BYE packet. The compound packet has size {\tt packetsize}.
\item {\tt RTPTime GetTransmissionDelay()}\\
Returns the delay after which an RTCP compound will possibly have to
be sent. The {\tt IsTime} member function should be called afterwards to
make sure that it actually is time to send an RTCP compound packet.
\item {\tt bool IsTime()}\\
This function returns {\tt true} if it's time to send an RTCP compound packet
and {\tt false} otherwise. If the function returns {\tt true} it will also
have calculated the next time at which a packet should be sent, so if it
is called again right away, it will return {\tt false}.
\item {\tt RTPTime CalculateDeterministicInterval(bool sender = false)}\\
Calculates the deterministic interval at this time. This is used -- together
with a certain multiplier -- to time out members, senders etc.
\end{itemize}
\Paragraph{Scheduler parameters}\headerfile{rtcpscheduler.h}
The {\tt RTCPSchedulerParams} class describes the parameters to be used by the
scheduler. Its interface is the following:
\begin{itemize}
\item {\tt int SetRTCPBandwidth(double bw)}\\
Sets the RTCP bandwidth to be used to {\tt bw} (in bytes per second).
\item {\tt double GetRTCPBandwidth() const}\\
Returns the used RTCP bandwidth in bytes per second.
\item {\tt int SetSenderBandwidthFraction(double fraction)}\\
Sets the fraction of the RTCP bandwidth reserved for senders
to {\tt fraction}.
\item {\tt double GetSenderBandwidthFraction() const}\\
Returns the fraction of the RTCP bandwidth reserved for senders.
\item {\tt int SetMinimumTransmissionInterval(const RTPTime \&t)}\\
Sets the minimum (deterministic) interval between RTCP compound packets
to {\tt t}.
\item {\tt RTPTime GetMinimumTransmissionInterval() const}\\
Returns the minimum RTCP transmission interval.
\item {\tt void SetUseHalfAtStartup(bool usehalf)}\\
If {\tt usehalf} is {\tt true}, only use half the minimum interval
before sending the first RTCP compound packet.
\item {\tt bool GetUseHalfAtStartup() const}\\
Returns if only half the minimum interval should be used before sending
the first RTCP compound packet.
\item {\tt void SetRequestImmediateBYE(bool v)}\\
If {\tt v} is {\tt true}, the scheduler will schedule a BYE packet
to be sent immediately if allowed.
\item {\tt bool GetRequestImmediateBYE()}\\
Returns if the scheduler will schedule a BYE packet to be sent immediately
if allowed.
\end{itemize}
The parameters default to the following values:
\begin{itemize}
\item RTCP bandwidth: 1000 bytes per second
\item Sender bandwidth fraction: 25\%
\item Minimum interval: 5 seconds
\item Use half minimum interval at startup: yes
\item Send BYE packet immediately if possible: yes
\end{itemize}
\subsubsection{\tt RTPSessionParams}\headerfile{rtpsessionparams.h}
\label{rtpsessionparams}
Describes the parameters for to be used by an {\tt RTPSession}
instance. Note that the own timestamp unit must be set to a
valid number, otherwise the session can't be created.
The interface of this class is the following:
\begin{itemize}
\item {\tt int SetUsePollThread(bool usethread)}\\
If {\tt usethread} is {\tt true}, the session will
use a poll thread to automatically process incoming
data and to send RTCP packets when necessary.
\item {\tt bool IsUsingPollThread() const}\\
Returns whether the session should use a poll thread
or not.
\item {\tt void SetMaximumPacketSize(size\_t max)}\\
Sets the maximum allowed packet size for the session.
\item {\tt size\_t GetMaximumPacketSize() const}\\
Returns the maximum allowed packet size.
\item {\tt void SetAcceptOwnPackets(bool accept)}\\
If the argument is {\tt true}, the session should accept
its own packets and store them accordingly in the source
table.
\item {\tt bool AcceptOwnPackets() const}\\
Returns {\tt true} if the session should accept its
own packets.
\item {\tt void SetReceiveMode(RTPTransmitter::ReceiveMode recvmode)}\\
Sets the receive mode to be used by the session.
\item {\tt RTPTransmitter::ReceiveMode GetReceiveMode() const}\\
Returns the currently set receive mode.
\item {\tt void SetOwnTimestampUnit(double tsunit)}\\
Sets the timestamp unit for our own data. The timestamp
unit is defined as a time interval in seconds divided by
the number of samples in that interval. For example, for
$8000 Hz audio$, the timestamp unit would be $1.0/8000.0$.
Since this value is initially set to an illegal value, the
user must set this to an allowed value to be able to create
a session.
\item {\tt double GetOwnTimestampUnit() const}\\
Returns the currently set timestamp unit.
\item {\tt void SetResolveLocalHostname(bool v)}\\
If {\tt v} is set to {\tt true}, the session will ask
the transmitter to find a host name based upon the IP
addresses in its list of local IP addresses. If set to
{\tt false}, a call to {\tt gethostname} or something
similar will be used to find the local hostname. Note
that the first method might take some time.
\item {\tt bool GetResolveLocalHostname() const}\\
Returns whether the local hostname should be determined
from the transmitter's list of local IP addresses or not.
\item {\tt void SetProbationType(RTPSources::ProbationType probtype)}\\
If probation support is enabled, this function sets the
probation type to be used.
\item {\tt RTPSources::ProbationType GetProbationType() const}\\
Returns the probation type which will be used.
\item {\tt void SetSessionBandwidth(double sessbw)}\\
Sets the session bandwidth in bytes per second.
\item {\tt double GetSessionBandwidth() const}\\
Returns the session bandwidth in bytes per second.
\item {\tt void SetControlTrafficFraction(double frac)}\\
Sets the fraction of the session bandwidth to be used
for control traffic.
\item {\tt double GetControlTrafficFraction() const}\\
Returns the fraction of the session bandwidth that will
be used for control traffic.
\item {\tt void SetSenderControlBandwidthFraction(double frac)}\\
Sets the minimum fraction of the control traffic that
will be used by senders.
\item {\tt double GetSenderControlBandwidthFraction() const}\\
Returns the minimum fraction of the control traffic that
will be used by senders.
\item {\tt void SetMinimumRTCPTransmissionInterval(const RTPTime \&t)}\\
Set the minimal time interval between sending RTCP packets.
\item {\tt RTPTime GetMinimumRTCPTransmissionInterval() const}\\
Returns the minimal time interval between sending RTCP packets.
\item {\tt void SetUseHalfRTCPIntervalAtStartup(bool usehalf)}\\
If {\tt usehalf} is set to {\tt true}, the session will only
wait half of the calculated RTCP interval before sending its
first RTCP packet.
\item {\tt bool GetUseHalfRTCPIntervalAtStartup() const}\\
Returns whether the session will only
wait half of the calculated RTCP interval before sending its
first RTCP packet or not.
\item {\tt void SetRequestImmediateBYE(bool v) }\\
If {\tt v} is {\tt true}, the session will send a BYE
packet immediately if this is allowed.
\item {\tt bool GetRequestImmediateBYE() const}\\
Returns whether the session should send a BYE packet immediately
(if allowed) or not.
\item {\tt void SetSenderReportForBYE(bool v)}\\
When sending a BYE packet, this indicates whether it will be part
of an RTCP compound packet that begins with a sender report or a
receiver report. Of course, a sender report will only be used if
allowed.
\item {\tt bool GetSenderReportForBYE() const}\\
Returns {\tt true} if a BYE packet will be sent in an RTCP compound
packet which starts with a sender report. If a receiver report will
be used, the function returns {\tt false}.
\item {\tt void SetSenderTimeoutMultiplier(double m)}\\
Sets the multiplier to be used when timing out senders.
\item {\tt double GetSenderTimeoutMultiplier() const}\\
Returns the multiplier to be used when timing out senders.
\item {\tt void SetSourceTimeoutMultiplier(double m)}\\
Sets the multiplier to be used when timing out members.
\item {\tt double GetSourceTimeoutMultiplier() const}\\
Returns the multiplier to be used when timing out members.
\item {\tt void SetBYETimeoutMultiplier(double m)}\\
Sets the multiplier to be used when timing out a member after
it has sent a BYE packet.
\item {\tt double GetBYETimeoutMultiplier() const}\\
Returns the multiplier to be used when timing out a member after
it has sent a BYE packet.
\item {\tt void SetCollisionTimeoutMultiplier(double m)}\\
Sets the multiplier to be used when timing out entries
in the collision table.
\item {\tt double GetCollisionTimeoutMultiplier() const}\\
Returns the multiplier to be used when timing out entries
in the collision table.
\item {\tt void SetNoteTimeoutMultiplier(double m)}\\
Sets the multiplier to be used when timing out SDES NOTE
information.
\item {\tt double GetNoteTimeoutMultiplier() const}\\
Returns the multiplier to be used when timing out SDES NOTE
information.
\end{itemize}
The default values for the parameters are the following:
\begin{itemize}
\item Use poll thread: yes
\item Maximum packet size: 1400 bytes
\item Accept own packets: no
\item Receive mode: accept all packets
\item Resolve local hostname: no
\item Probation type: {\tt ProbationStore}
\item Session bandwidth: 10000 bytes per second
\item Control traffic fraction: 5\%
\item Sender's fraction of control traffic: 25\%
\item Minimum RTCP interval: 5 seconds
\item Use half minimum interval at startup: yes
\item Send BYE packet immediately if allowed: yes
\item Use sender report for BYE packet: yes
\item Sender timeout multiplier: 2
\item Member timeout multiplier: 5
\item Timeout multiplier after BYE packet: 1
\item Timeout multiplier for entries in collision table: 10
\item Timeout multiplier for SDES NOTE items: 25
\end{itemize}
\subsubsection{\tt RTPSession}\headerfile{rtpsession.h}
\label{rtpsession}
For most RTP based applications, the {\tt RTPSession} class
will probably be the one to use. It handles the RTCP part
completely internally, so the user can focus on sending and
receiving the actual data.
Note that the {\tt RTPSession} class is not meant to be thread
safe. The user should use some kind of locking mechanism to prevent
different threads from using the same {\tt RTPSession} instance.
The {\tt RTPSession} class interface is the following:
\begin{itemize}
\item {\tt RTPSession(RTPTransmitter::Transmission\-Protocol proto = RTP\-Trans\-mitter::IPv4\-UDPProto)}\\
Creates an instance which will use the transmission component given
by {\tt proto}. When {\tt proto} indicates the a user-defined
transmitter, the {\tt NewUserDefinedTransmitter()} member
function should be implemented.
\item {\tt int Create(const RTPSessionParams \&sessparams, const RTPTransmissionParams *transparams = 0)}\\
Creates the session with parameters {\tt sessparams} and transmission parameters {\tt transparams}.
If {\tt transparams} is NULL, the defaults for the requested transmitter will
be used.
\item {\tt void Destroy()}\\
Leaves the session without sending a BYE packet.
\item {\tt void BYEDestroy(const RTPTime \&maxwaittime, const void *reason, size\_t reasonlength)}\\
Sends a BYE packet and leaves the session. At most a time {\tt maxwaittime} will
be waited to send the BYE packet. If this time expires, the session will be
left without sending a BYE packet. The BYE packet will contain as reason for
leaving {\tt reason} with length {\tt reasonlength}.
\item {\tt bool IsActive()}\\
Returns whether the session has been created or not.
\item {\tt u\_int32\_t GetLocalSSRC()}\\
Returns our own SSRC.
\item {\tt int AddDestination(const RTPAddress \&addr)}\\
Adds {\tt addr} to the list of destinations.
\item {\tt int DeleteDestination(const RTPAddress \&addr)}\\
Deletes {\tt addr} from the list of destinations.
\item {\tt void ClearDestinations()}\\
Clears the list of destination.
\item {\tt bool SupportsMulticasting()}\\
Returns {\tt true} if multicasting is supported.
\item {\tt int JoinMulticastGroup(const RTPAddress \&addr)}\\
Joins the multicast group specified by {\tt addr}.
\item {\tt int LeaveMulticastGroup(const RTPAddress \&addr)}\\
Leaves the multicast group specified by {\tt addr}.
\item {\tt void LeaveAllMulticastGroups()}\\
Leaves all multicast groups.
\item {\tt int SendPacket(const void *data, size\_t len)}\\
Sends the RTP packet with payload {\tt data} which has length {\tt len}.
The used payload type, marker and timestamp increment will be those that
have been set using the {\tt SetDefault} member functions.
\item {\tt int SendPacket(const void *data, size\_t len,
u\_int8\_t pt, bool mark, u\_int32\_t timestampinc)}\\
Sends the RTP packet with payload {\tt data} which has length {\tt len}.
It will use payload type {\tt pt}, marker {\tt mark} and after the packet
has been built, the timestamp will be incremented by {\tt timestampinc}.
\item {\tt int SendPacketEx(const void *data, size\_t len,
u\_int16\_t hdrextID, const void *hdrextdata, size\_t numhdrextwords)}\\
Sends the RTP packet with payload {\tt data} which has length {\tt len}.
The packet will contain a header extension with identifier {\tt hdrextID} and
containing data {\tt hdrextdata}. The length of this data is given by
{\tt numhdrextwords} and is specified in a number of 32-bit words.
The used payload type, marker and timestamp increment will be those that
have been set using the {\tt SetDefault} member functions.
\item {\tt int SendPacketEx(const void *data, size\_t len,
u\_int8\_t pt, bool mark, u\_int32\_t timestampinc,
u\_int16\_t hdrextID, const void *hdrextdata, size\_t numhdrextwords)}\\
Sends the RTP packet with payload {\tt data} which has length {\tt len}.
It will use payload type {\tt pt}, marker {\tt mark} and after the packet
has been built, the timestamp will be incremented by {\tt timestampinc}.
The packet will contain a header extension with identifier {\tt hdrextID} and
containing data {\tt hdrextdata}. The length of this data is given by
{\tt numhdrextwords} and is specified in a number of 32-bit words.
\item {\tt int SetDefaultPayloadType(u\_int8\_t pt)}\\
Sets the default payload type for RTP packets to {\tt pt}.
\item {\tt int SetDefaultMark(bool m)}\\
Sets the default marker for RTP packets to {\tt m}.
\item {\tt int SetDefaultTimestampIncrement(u\_int32\_t timestampinc)}\\
Sets the default value to increment the timestamp with to
{\tt timestampinc}.
\item {\tt int IncrementTimestamp(u\_int32\_t inc)}\\
This function increments the timestamp with the amount
given by {\tt inc}. This can be useful if, for example,
a packet was not sent because it contained only silence.
Then, this function should be called to increment the
timestamp with the appropriate amount so that the next
packets will still be played at the correct time at
other hosts.
\item {\tt int IncrementTimestampDefault()}\\
This function increments the timestamp with the amount
given set by the {\tt SetDefaultTimestampIncrement}
member function. This can be useful if, for example,
a packet was not sent because it contained only silence.
Then, this function should be called to increment the
timestamp with the appropriate amount so that the next
packets will still be played at the correct time at
other hosts.
\item {\tt RTPTransmissionInfo *GetTransmissionInfo()}\\
This function returns an instance of a subclass of {\tt RTPTransmissionInfo}
which will give some additional information about the transmitter
(a list of local IP addresses for example). The user
has to delete the returned instance when it is no longer needed.
\item {\tt int Poll()}\\
If you're not using the poll thread, this function
must be called regularly to process incoming data
and to send RTCP data when necessary.
\item {\tt int WaitForIncomingData(const RTPTime \&delay,bool *dataavailable = 0)}\\
Waits at most a time {\tt delay} until incoming data has
been detected. Only works when you're not using the poll
thread. If {\tt dataavailable} is not {\tt NULL}, it should
be set to {\tt true} if data was actually read and to {\tt false}
otherwise.
\item {\tt int AbortWait()}\\
If the previous function has been called, this one aborts
the waiting. Only works when you're not using the poll
thread.
\item {\tt RTPTime GetRTCPDelay()}\\
Returns the time interval after which an RTCP compound
packet may have to be sent. Only works when you're not using
the poll thread.
\item {\tt int BeginDataAccess()}\\
The following member functions (till {\tt EndDataAccess})
need to be accessed between a call to {\tt BeginDataAccess}
and {\tt EndDataAccess}. The {\tt BeginDataAccess} makes
sure that the poll thread won't access the source table
at the same time. When the {\tt EndDataAccess} is called,
the lock on the source table is freed again.
\item {\tt bool GotoFirstSource()}\\
Starts the iteration over the participants by going to the
first member in the table. If a member was found, the function
returns {\tt true}, otherwise it returns {\tt false}.
\item {\tt bool GotoNextSource()}\\
Sets the current source to be the next source in the table.
If we're already at the last source, the function returns
{\tt false}, otherwise it returns {\tt true}.
\item {\tt bool GotoPreviousSource()}\\
Sets the current source to be the previous source in the table.
If we're at the first source, the function returns
{\tt false}, otherwise it returns {\tt true}.
\item {\tt bool GotoFirstSourceWithData()}\\
Sets the current source to be the first source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt bool GotoNextSourceWithData()}\\
Sets the current source to be the next source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt bool GotoPreviousSourceWithData()}\\
Sets the current source to be the previous source in the table
which has {\tt RTPPacket} instances that we haven't extracted
yet. If no such member was found, the function returns {\tt false},
otherwise it returns {\tt true}.
\item {\tt RTPSourceData *GetCurrentSourceInfo()}\\
Returns the {\tt RTPSourceData} instance for the currently
selected participant.
\item {\tt RTPSourceData *GetSourceInfo(u\_int32\_t ssrc)}\\
Returns the {\tt RTPSourceData} instance for the participant
identified by {\tt ssrc}, or NULL if no such entry exists.
\item {\tt RTPPacket *GetNextPacket()}\\
Extracts the next packet from the received packets queue
of the current participant.
\item {\tt int EndDataAccess()}\\
See {\tt BeginDataAccess}.
\item {\tt int SetReceiveMode(RTPTransmitter::ReceiveMode m)}\\
Sets the receive mode to {\tt m}, which can be one of the
following:
\begin{itemize}
\item {\tt RTPTransmitter::AcceptAll}\\
All incoming data is accepted, no matter where it originated
from.
\item {\tt RTPTransmitter::AcceptSome}\\
Only data coming from specific sources will be accepted.
\item {\tt RTPTransmitter::IgnoreSome}\\
All incoming data is accepted, except for data coming from
a specific set of sources.
\end{itemize}
Note that when the receive mode is changed, the list of addressed
to be ignored or accepted will be cleared.
\item {\tt int AddToIgnoreList(const RTPAddress \&addr)}\\
Adds {\tt addr} to the list of addresses to ignore.
\item {\tt int DeleteFromIgnoreList(const RTPAddress \&addr)}\\
Deletes {\tt addr} from the list of addresses to ignore.
\item {\tt void ClearIgnoreList()}\\
Clears the list of addresses to ignore.
\item {\tt int AddToAcceptList(const RTPAddress \&addr)}\\
Adds {\tt addr} to the list of addresses to accept.
\item {\tt int DeleteFromAcceptList(const RTPAddress \&addr)}\\
Deletes {\tt addr} from the list of addresses to accept.
\item {\tt void ClearAcceptList()}\\
Clears the list of addresses to accept.
\item {\tt int SetMaximumPacketSize(size\_t s)}\\
Sets the maximum allowed packet size to {\tt s}.
\item {\tt int SetSessionBandwidth(double bw)}\\
Sets the session bandwidth to {\tt bw}, which is specified
in bytes per second.
\item {\tt int SetTimestampUnit(double u)}\\
Sets our own timestamp unit to {\tt u}. The timestamp unit
is defined as a time interval divided by the number of
samples in that interval: for $8000 Hz$ audio this would
be $1.0/8000.0$.
\item {\tt void SetNameInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES name
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetEMailInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES e-mail
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetLocationInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES location
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetPhoneInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES phone
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetToolInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES tool
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt void SetNoteInterval(int count)}\\
After all possible sources in the source table have been
processed, the RTCP packet builder will check if other (non-CNAME) SDES
items need to be sent. If {\tt count} is zero or negative, nothing
will happen. If {\tt count} is positive, an SDES note
item will be added after the sources in the source table have
been processed {\tt count} times.
\item {\tt int SetLocalName(const void *s, size\_t len)}\\
Sets the SDES name item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalEMail(const void *s, size\_t len)}\\
Sets the SDES e-mail item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalLocation(const void *s, size\_t len)}\\
Sets the SDES location item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalPhone(const void *s, size\_t len)}\\
Sets the SDES phone item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalTool(const void *s, size\_t len)}\\
Sets the SDES tool item for the local participant to the value {\tt s}
with length {\tt len}.
\item {\tt int SetLocalNote(const void *s, size\_t len)}\\
Sets the SDES note item for the local participant to the value {\tt s}
with length {\tt len}.
\end{itemize}
In case you specified in the constructor that you want to use your own
transmission component, you should override the following function:
\begin{itemize}
\item {\tt RTPTransmitter *NewUserDefinedTransmitter()}
\end{itemize}
The {\tt RTPTransmitter} instance returned by this function will then
be used to send and receive RTP and RTCP packets. Note that when the
session is destroyed, this {\tt RTPTransmitter} instance will be destroyed
with a {\tt delete} call.
By inheriting your own class from {\tt RTPSession} and overriding
one or more of the functions below, certain events can be detected:
\begin{itemize}
\item {\tt void OnRTPPacket(RTPPacket *pack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an RTP packet is about to be processed.
\item {\tt void OnRTCPCompoundPacket(RTCPCompoundPacket *pack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an RTCP packet is about to be processed.
\item {\tt void OnSSRCCollision(RTPSourceData *srcdat, const RTPAddress *senderaddress, bool isrtp)}\\
Is called when an SSRC collision was detected. The instance
{\tt srcdat} is the one present in the table, the address
{\tt senderaddress} is the one that collided with one of the
addresses and {\tt isrtp} indicates against which address of
{\tt srcdat} the check failed.
\item {\tt void OnCNAMECollision(RTPSourceData *srcdat, const RTPAddress *senderaddress,
const u\_int8\_t *cname, size\_t cnamelength)}\\
Is called when another CNAME was received than the one
already present for source {\tt srcdat}.
\item {\tt void OnNewSource(RTPSourceData *srcdat)}\\
Is called when a new entry {\tt srcdat} is added to the source
table.
\item {\tt void OnRemoveSource(RTPSourceData *srcdat)}\\
Is called when the entry {\tt srcdat} is about to be
deleted from the source table.
\item {\tt void OnTimeout(RTPSourceData *srcdat)}\\
Is called when participant {\tt srcdat} is timed out.
\item {\tt void OnBYETimeout(RTPSourceData *srcdat)}\\
Is called when participant {\tt srcdat} is timed after
having sent a BYE packet.
\item {\tt void OnBYEPacket(RTPSourceData *srcdat)}\\
Is called when a BYE packet has been processed for source
{\tt srcdat}.
\item {\tt void OnAPPPacket(RTCPAPPPacket *apppacket, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
In called when an RTCP APP packet {\tt apppacket} has been received
at time {\tt receivetime} from address {\tt senderaddress}.
\item {\tt void OnUnknownPacketType(RTCPPacket *rtcppack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an unknown RTCP packet type was detected.
\item {\tt void OnUnknownPacketFormat(RTCPPacket *rtcppack, const RTPTime \&receivetime,
const RTPAddress *senderaddress)}\\
Is called when an unknown packet format for a known packet
type was detected.
\item {\tt void OnNoteTimeout(RTPSourceData *srcdat)}\\
Is called when the SDES NOTE item for source {\tt srcdat}
has been timed out.
\item {\tt void OnPollThreadError(int errcode)}\\
Is called when error {\tt errcode} was detected in the
poll thread.
\item {\tt void OnPollThreadStep()}\\
Is called each time the poll thread loops. This happens when
incoming data was detected or when its time to send an RTCP
compound packet.
\end{itemize}
\section{Contact}
If you have any questions, remarks or requests about the library or
if you think you've discovered a bug, you can contact me at:
\begin{verbatim}
jori@lumumba.uhasselt.be
\end{verbatim}
The home page of the library is:
\begin{verbatim}
http://research.edm.uhasselt.be/jori/jrtplib/jrtplib.html
\end{verbatim}
There is also a mailing list for the library. To subscribe to the list,
send an e-mail with the text {\tt subscribe jrtplib} as the message body (not
the subject) to {\tt majordomo@edm.uhasselt.be} and you'll receive further
instructions.
\end{document}