1\input texinfo    @c -*-texinfo-*-
2@c %** start of header
3@setfilename ccrtp.info
4@settitle GNU ccRTP Manual
5@afourpaper
6@setchapternewpage odd
7@documentlanguage en
8@documentencoding ISO-8859-1
9@c %** end of header
10
11@set EDITION 1.3
12@set VERSION 1.3
13@set UPDATED Jan 2006
14
15@dircategory Development
16@direntry
17* GNU ccRTP: (ccrtp).        GNU ccRTP Real-Time Transport Protocol Framework.
18@end direntry
19
20
21@c -----------------------------------------------------------------------
22
23@c %** start of summary description and copyright
24@ifnottex
25GNU ccRTP is a C++ class framework for the development of Real Time
26Transport Protocol (@acronym{RTP}) based applications. It is based on
27GNU Common C++.
28
29Copyright @copyright{} 2001, 2002, 2003, 2004, 2005, 2006 Federico Montesino Pouzols
30@email{fedemp@@altern.org}.
31@include fdlnotice.texi
32@end ifnottex
33@c %** end of summary description and copyright
34
35@c -----------------------------------------------------------------------
36
37@c %** start of title and copyright page
38@shorttitlepage @titlefont{GNU ccRTP}
39@titlepage
40@sp 10
41@title GNU ccRTP Manual
42@subtitle A Real-Time Transport Protocol Framework based on GNU Common C++
43@subtitle @value{EDITION}th Edition, covering ccRTP version @value{VERSION}
44@subtitle @value{UPDATED}
45@author Federico Montesino Pouzols
46
47@page
48@vskip 0pt plus 1filll
49@center Copyright @copyright{} 2001, 2002, 2003, 2004, 2005 Federico Montesino Pouzols
50@include fdlnotice.texi
51@page
52@end titlepage
53@c %** end of title and copyright page
54
55
56@c -----------------------------------------------------------------------
57
58@c %** start of top node and master menu
59@ifnottex
60@node Top
61@top
62This manual describes GNU ccRTP, a C++ class framework for the
63development of Real Time Transport Protocol (@acronym{RTP}) based
64applications.
65
66This is the edition @value{EDITION} of this manual and documents
67GNU ccRTP version @value{VERSION}.
68@end ifnottex
69
70
71@contents
72
73
74@menu
75* Introduction::                What @acronym{RTP} and ccRTP are.
76* Distribution::                How to get @acronym{GNU} ccRTP.
77* ccRTP Overview::              The library at a glance.
78* Using ccRTP::                 Programming with GNU ccRTP overview.
79* Specialized Payload Formats:: Supported payload specific extensions.
80* Standards Tracking::          @acronym{IETF} Standards conformance.
81* Upgrading::                   Upgrading applications based on old releases.
82* ccRTP Internals::             How @acronym{GNU} ccRTP is done.
83* Related Work::                Other @acronym{RTP} related libraries and tools.
84* Future Work::                 Future of @acronym{RTP} and ccRTP.
85* Licenses::                    Library and documentation licenses.
86* Class and Data Type Index::   Index of classes and data types in ccRTP.
87* Method and Function Index::   Index of methods and functions in ccRTP.
88* Concept Index::               Index of concepts.
89@end menu
90@c %** end of top node and master menu
91
92@c %** start of body
93
94@c -----------------------------------------------------------------------
95@node Introduction
96@chapter Introduction
97@cindex Introduction
98
99@cindex Common C++
100@cindex C++
101@cindex IETF
102@cindex Internet Ingeneering Task Force
103@cindex Audio/Video Working Group
104@cindex class framework
105ccRTP is a C++ framework for developing applications based on the Real
106Time Transport Protocol (@acronym{RTP} henceforth). @acronym{RTP}
107provides end-to-end delivery services for data with real-time
108characteristics and is being developed by the Audio/Video Working
109Group of the Internet Engineering Task Force (@acronym{IETF}).
110
111ccRTP aims to be an efficient and flexible framework valid for almost
112any kind of application that uses @acronym{RTP}, ranging from high
113loaded servers and gateways to personal phone applications. Default
114constructs and values are provided however for the most common choices
115in the use of @acronym{RTP}. ccRTP conforms to the latest
116@acronym{RTP} specifications (@pxref{Standards Tracking}).
117
118@cindex MD5
119@cindex Common C++
120@cindex system services
121@cindex threading
122@cindex synchronization
123@cindex sockets
124ccRTP is based on the @acronym{GNU} Common C++ framework, though most
125of the library does not require it. Common C++ provides basic system
126services such as threading, synchronization and sockets@footnote{As
127well as other more specialized services, such as MD5 computation.},
128which makes it possible to provide a complete solution for the use of
129@acronym{RTP}. However, although ccRTP provides facilities and
130abstractions useful for the @acronym{RTP} specific components of
131applications that use @acronym{RTP}, such applications generally
132require similar system services for other tasks. Besides supporting
133ccRTP, Common C++ provides a portable and efficient framework for
134these kind of services.
135
136@acronym{RTP} has been defined as an application level protocol
137framework rather than a typical Internet transport protocol such as
138TCP and UDP. Thus, @acronym{RTP} is hardly ever implemented as a layer
139separated from the application. Consequently, @acronym{RTP}
140applications often must customize the adaptable @acronym{RTP} packet
141layout and processing rules, timing constraints, session membership
142rules as well as other @acronym{RTP} and @acronym{RTCP}
143mechanisms. ccRTP aims to provide a framework for the @acronym{RTP}
144framework, rather than being just an @acronym{RTP} packet manipulation
145library.
146
147@cindex signalization
148@cindex RTSP
149@cindex SIP
150@cindex H.323
151As a clarification of the scope of the ccRTP library and the
152@acronym{RTP} protocol, we note that ccRTP exclusively deals with the
153transport of data over the @acronym{RTP} protocol. Once parameters such
154as destination IP address and transport port, payload type identifier
155and timestamp frequency are known, ccRTP can be used to open an
156@acronym{RTP} session and send and receive RTP and RTCP packets. A
157multimedia application will have those parameters previously set or,
158more usually, they can be fetched for example from SDP multimedia
159session descriptions, which can be interchanged (and negotiated) between
160servers and clients by means of some signaling protocol: @acronym{SIP},
161@acronym{RTSP}, or even H.323. Signaling functions are not handled by
162ccRTP.
163
164This document is an introductory programmer's manual, for a more
165exhaustive reference see the reference manual distributed with GNU
166ccRTP. In @ref{ccRTP Overview}, the most important concepts and some
167basic examples are introduced. A deeper and step by step description
168as well as short examples are provided in @ref{Using ccRTP}.
169
170Finally, if after reading this document and/or using ccRTP you think
171it fails to provide some functionality that seems to be needed for
172some application, we encourage you to contact the developers of ccRTP
173and ask or propose them improvements and/or additions. You are also
174encouraged to provide these improvements and to join the development
175team. Bug reports, suggestions and criticisms are gladly accepted.
176
177
178@c -----------------------------------------------------------------------
179@node Distribution
180@chapter Distribution
181@cindex distribution
182
183@cindex free software
184@cindex GNU GPL
185@cindex linking exception
186@cindex GNU FDL
187@cindex philosophy
188@acronym{GNU} ccRTP is free software (see
189@url{http://www.gnu.org/philosophy/philosophy.html}. It is licensed
190under the terms of the @acronym{GNU} General Public License, @xref{GNU
191General Public License}, plus a linking exception, @xref{GNU ccRTP
192Linking Exception}.
193
194The linking exception is the same that is used for gcc libstdc++.  This
195was done in the case of libstdc++ because the language of the LGPL is
196neither clear nor correct if one uses C++ features such as templates and
197method implimentation directly in headers, as the division between the
198C++ library and another's application is no longer purely a linking one.
199From the practical standpoint, the exact effect is the same as the LGPL,
200but with language that matches these C++ features.  This is all
201explained at
202@url{http://gcc.gnu.org/onlinedocs/libstdc++/17_intro/license.html}.
203
204This manual is licensed under the terms of the @acronym{GNU} Free
205Documentation License, @xref{GNU Free Documentation License}.
206
207There are several ways to get @acronym{GNU} ccRTP, refer to
208@url{http://www.gnu.org} and
209@url{http://www.gnu.org/software/ccrtp/}. The development of ccRTP is
210hosted at Savannah @url{http://sv.gnu.org/projects/ccrtp/}.
211
212
213@c -----------------------------------------------------------------------
214@node ccRTP Overview
215@chapter ccRTP Overview
216@cindex ccRTP Overview
217
218At its highest level, ccRTP provides classes for the real-time
219transport of data through @acronym{RTP} sessions, as well as the
220control functions of @acronym{RTCP}.
221
222@cindex packet queue
223The main concept in the ccRTP implementation of @acronym{RTP} sessions
224is the use of packet queues to handle transmission and reception of
225@acronym{RTP} data packets/application data units. In ccRTP, a data
226block is transmitted by putting it into the transmission (outgoing
227packets) queue, and received by getting it from the reception
228(incoming packets) queue.
229
230Starting with 1.0 releases, ccRTP fully supports @acronym{RTP} and
231@acronym{RTCP}. Here is a brief list of some features of ccRTP:
232
233@itemize
234
235@item Highly extensible to specialized stacks.
236
237@item Supports unicast, multi-unicast and multicast. Handles multiple sources (including synchronization sources and contributing sources) and destinations. Also supports symmetric RTP.
238
239@item Automatic RTCP functions handling, such as association of synchronization sources from the same participant or NTP-RTP timestamp mapping.
240
241@item Genericity as for underlying network and transport protocols through templates.
242
243@item It is threadsafe and supports almost any threading model.
244
245@cindex header check
246@cindex header validity
247@item Generic and extensible @acronym{RTP} and @acronym{RTCP} header validity checks.
248
249@item Handles source states and information as well as statistics recording.
250
251@cindex SSRC collision
252@cindex loop detection
253@item Automatically handles SSRC collisions and performs loop detection.
254
255@cindex reconsideration
256@cindex timer reconsideration
257@cindex reverse reconsideration
258@item Implements timer reconsideration and reverse reconsideration.
259
260@cindex Random numbers
261@cindex /dev/urandom
262@cindex MD5
263@item Provides good random numbers, based on @file{/dev/urandom} or, alternatively, on MD5.
264
265@end itemize
266
267@cindex demo program
268@cindex rtphello
269@cindex rtplisten
270@tindex RTPSession
271@findex onGotSR
272@findex getMRSenderInfo
273@cindex SR
274@cindex RTCP SR
275There are several levels of interface (public interface, public or
276protected inheritance, etc) in ccRTP. For instance, the
277@code{rtphello} demo program distributed with ccRTP just uses the
278public interface of the @code{RTPSession} class and does not redefine
279the virtual method @code{onGotSR}, thus what this program knows about
280SR reports is the information conveyed in the last sender report from
281any source, which can be retrieved via the @code{getMRSenderInfo}
282method of the @code{SyncSource} class. On the contrary, the
283@code{rtplisten} demo program redefines @code{onGotSR} by means of
284inheritance and could do specialized processing of these RTCP
285packets. Generally, both data and control packets are not directly
286accessible through the most external interface.
287
288@tindex StaticPayloadType
289@tindex StaticPayloadFormat
290@tindex DynamicPayloadFormat
291@tindex RTPSession
292@tindex AppDataUnit
293@tindex SyncSource
294@tindex Participant
295@tindex AppDataUnit
296All these functions are performed through a few essential classes and
297types. The most basic ones are the enumerated type
298@code{StaticPayloadType}, and the classes @code{StaticPayloadFormat} and
299@code{DynamicPayloadFormat}. The most important ones are the classes
300@code{RTPSession}, @code{SyncSource}, @code{Participant} and
301@code{AppDataUnit}, that represent @acronym{RTP} sessions,
302synchronization sources, participants in an @acronym{RTP} application,
303and application data units conveyed in @acronym{RTP} data packets,
304respectively.
305
306@cindex demo program
307In the next sections, two basic examples are presented. These examples
308are intended to provide a concrete idea of what the code of a ccRTP
309based application looks like, they are not complete or compilable
310programs. You can find some real examples under the demo directory in
311the source distribution of ccRTP.
312
313@menu
314* Simple Transmitter::           Skeleton of a simple transmitter.
315* Simple Receiver::              Skeleton of a simple receiver.
316@end menu
317
318
319@c -----------------------------------------------------------------------
320@node Simple Transmitter
321@section Simple Transmitter
322@cindex Simple Transmitter
323
324The following snippet illustrates the required steps to send an
325application data unit over @acronym{RTP}.
326
327@cartouche
328@example
329RTPSession s(InetHostAddress("127.0.0.1"),8000);  // @r{bind reception socket}
330
331// @r{Initialization}
332cout << "Local SSRC identifier: " << s.getLocalSSRC() << endl;
333s.addDestination("www.example.com",9000); // @r{set one destination for packets}
334s.setPayloadFormat(staticPayloadFormat(sptPCMU));
335s.startRunning(); // @r{start running the packet queue scheduler}
336
337// @r{Send data}
338s.putData(0,buffer,bufferLen); // @r{buffer holds bufferLen payload octets}
339@end example
340@end cartouche
341
342
343@c -----------------------------------------------------------------------
344@node Simple Receiver
345@section Simple Receiver
346@cindex Simple Receiver
347
348The required actions to receive an application data unit over RTP are
349listed in the following code snippet.
350
351@cartouche
352@example
353RTPSession s(InetHostAddress("127.0.0.1"),9000);  // @r{bind reception socket.}
354
355// @r{Initialization.}
356cout << "Local SSRC identifier: " << s.getLocalSSRC() << endl;
357s.setPayloadFormat(staticPayloadFormat(sptPCMU));
358s.startRunning(); // @r{start running the packet queue scheduler.}
359
360// @r{Receive data.}
361const AppDataUnit* adu;
362adu = s.getData(0); // @r{get data with initial -0- timestamp.}
363if ( adu != NULL )
364   // @r{do something with adu.}
365   // adu->getType() @r{provides the payload type.}
366   // adu->getData() @r{provides a const uint8 pointer to a data buffer.}
367   // adu->getSize() @r{provides the number of octets in the buffer.}
368   // @r{see other methods in the class AppDataUnit, such as} getSource().
369@end example
370@end cartouche
371
372
373@c -----------------------------------------------------------------------
374@node Using ccRTP
375@chapter Using ccRTP
376@cindex Using ccRTP
377
378@cindex packet queue
379@cindex thread
380When using ccRTP, both sending and receiving of data transported over
381@acronym{RTP} sessions is done through reception and transmission
382queues handled by the @acronym{RTP} stack. In the most common case, a
383separate execution thread for each @acronym{RTP} session handles the
384queues. This case is the threading model that we will generally assume
385throughout this document. Note however that ccRTP supports other
386threading models, particularly ccRTP supports the use of a single
387execution thread to serve a set of @acronym{RTP} sessions. It is also
388possible to not associate any separate thread with any @acronym{RTP}
389session, manually calling the main data and control service methods
390from whatever other thread.
391
392@cindex reception queue
393@cindex incoming queue
394The basic idea for packet reception with ccRTP is that the application
395does not directly read packets from sockets but gets them from a
396reception queue. The stack is responsible for inserting received
397packets in the reception queue and handling this queue. In general, a
398packet reception and insertion in the reception queue does not occur
399at the same time the application gets it from the queue.
400
401@cindex transmission queue
402@cindex outgoing queue
403Conversely, the basic idea for packet transmission with ccRTP is that
404packets are not directly written to sockets but inserted in a
405transmission queue handled by the stack. In general, packet insertion
406and transmission occur at different times, though it is not necessary.
407
408In order to use ccRTP, you must include the main header
409(@file{#include <ccrtp/rtp.h>}. Two additional headers are provided by
410ccRTP:
411
412@table @code
413
414@item @file{#include <ccrtp/rtppool.h}
415Classes for pools of RTP service threads.
416
417@item @file{#include <ccrtp/rtpext.h>}
418Classes for RTP extensions which are not mature yet.
419
420@end table
421
422You must also link in the library, currently @file{ccrtp1}.
423
424As presented in the last examples, before starting to send or receive
425data, RTP sessions must be created, the payload format to use must be
426set and the stack must be signaled to start running. The following
427sections describe the use of ccRTP during the different phases of RTP
428sessions and RTP applications in general.
429
430@menu
431* RTP Sessions::                 Using ccRTP to establish @acronym{RTP} sessions.
432* Payload Types and Formats::    Payload types and formats.
433* Participants::                 Participants and sources of synchronization.
434* RTP Packets Extensions::       Extensions to @acronym{RTP} data packets handling.
435* RTCP Packets Extensions::      Extensions to @acronym{RTCP} packets handling.
436* Handling Events::              Table of ccRTP plug-ins to react to events.
437@end menu
438
439
440@c -----------------------------------------------------------------------
441@node RTP Sessions
442@section RTP Sessions
443@cindex RTP Sessions
444
445This section discusses the use of @code{RTPSession} objects. Some
446other classes and concepts are also used, these are just briefly
447presented here; deeper explanations are provided in next sections.
448
449@menu
450* Initiating Sessions::          @acronym{RTP} sessions initialization with ccRTP.
451* Sending Data::                 Sending @acronym{RTP} data packets.
452* Receiving Data::               Receiving @acronym{RTP} data packets.
453* Closing Sessions::             Extensions to @acronym{RTP} data packets handling.
454* Types of Sessions::            Choosing a threading and socket model.
455@end menu
456
457
458@c -----------------------------------------------------------------------
459@node Initiating Sessions
460@subsection Initiating Sessions
461@cindex Initiating Sessions
462
463@tindex RTPSession
464@cindex multicast
465@cindex join
466Initiating @acronym{RTP} sessions with ccRTP involves the construction
467of an object of the class @code{RTPSession} and calling some optional
468initialization methods. @code{RTPSession} constructors take two
469mandatory arguments: local network address and local transport port
470(where incoming packets are expected). There are two constructors, one
471of them takes a host address as first parameter, while the other takes
472a multicast address. In the latter case, the application will join to
473a multicast group.
474
475@findex RTPSession::startRunning
476@findex RTPSession::enableStack
477General purpose @acronym{RTP} stacks of ccRTP, such as
478@code{RTPSession} objects, must be signaled to start execution. This
479is done calling the @code{startRunning()} method. Note there is also a
480@code{enableStack()} method, this only activates the stack but does not
481start the execution of the stack thread.
482
483After the steps above, the application can receive data, but will not
484transmit to any destination. This and other session parameters can be
485set as follows:
486
487@itemize
488
489@findex OutgoingDataQueue::addDestination
490@item Add destinations: calling the method @code{addDestination}.
491
492@findex RTPQueueBase::setPayloadFormat
493@cindex static payload type
494@cindex PCMU
495@cindex default value
496@item Set payload format. Method @code{setPayloadFormat}. By default, the static payload type 0 is assumed (PCMU format at 8Khz).
497
498@cindex RTCP packets
499@cindex RTCP compound packets
500@cindex SDES item
501@cindex CNAME
502@cindex default value
503@cindex PRIV
504@findex RTPPApplication::setSDESItem
505@findex RTPApplication::setPRIVPrefix
506@findex defaultApplication
507@item Set local SDES Items. For common applications, the CNAME item value is automatically guessed as user@@host. Other items have no default value and are not sent in RTCP packets unless a value is specified by the application. For those items that should be sent in @acronym{RTCP} packets along with the mandatory CNAME, its values can be set calling the @code{setSDESItem}  and @code{setPRIVPrefix} methods over the object returned by the @code{defaultApplication} global function.
508
509@findex OutgoingDataQueue::setPadding
510@cindex padding
511@item Enable padding of data packets. Calling setPadding(uint8) on outgoing data queues enables transparent padding of data packets to a multiple of the padding maximum length specified. By default, padding is off (maximum length of padding is 0).
512
513@item setting addresses:
514
515
516@findex QueueRTCPMaanger::setControlBandwidth
517@cindex default value
518@cindex default bandwidth
519@cindex RTCP bandwidth
520@item Set session bandwidth calling the @code{setSessionBandwidth} method of the session object. If not called, a default bandwidth of 64Kbps is assumed, and 5% of this bandwidth is used for RTCP. This percentage can be changed through the setControlBandwidth method.
521
522@end itemize
523
524
525@c -----------------------------------------------------------------------
526@node Sending Data
527@subsection Sending Data
528@cindex Sending Data
529
530@findex OutgoingDataQueue::putData
531@cindex RTP timestamp offset
532@cindex timestamp offset
533Data packets are sent through the method @code{putData}, that takes as
534first parameter the RTP timestamp for the data specified as second
535parameter. ccRTP handles the random offset for the RTP timestamp
536internally, so the timestamp value that corresponds to the session
537creation time is 0.
538
539@findex OutgoingDataQueue::setMark
540@cindex default value
541@cindex marker bit
542By default, the marker bit of the sent packets is not set. Its value
543for the next packet (the one that will convey the data provided in the
544next call to @code{putData}) can be set through the @code{setMark}
545method, which takes a boolean as argument.
546
547@findex OutgoingDataQueueBase::setMaxSendSegmentSize
548@findex OutgoingDataQueueBase::getDefaultMaxSendSegmentSize
549@cindex default value
550@cindex segment size
551ccRTP also supports fragmenting data blocks into several RTP
552packets. The @code{setMaxSendSegmentSize} method can be used to
553request that no @acronym{RTP} packet be transmitted with a payload
554length greater than the value specified through
555@code{setMaxSendSegmentSize}. The default value of this parameter can
556be retrieved via @code{getDefaultMaxSendSegmentSize}, which currently
557should return 65536. When data blocks greater than the maximum segment
558size are provided through @code{putData}, two or more packet will be
559inserted in the outgoing packet queue. All these packets but the last
560one will have length equal to the maximum segment size, whereas the
561last one's size will be lower or equal to the maximum segment size.
562
563
564@c -----------------------------------------------------------------------
565@node Receiving Data
566@subsection Receiving Data
567@cindex Receiving Data
568
569@findex IncomingDataQueue::getData
570Received data is retrieved from the incoming packet queue through the
571@code{getData} method, which, given a timestamp and an optional source
572of synchronization. This method returns a pointer to an
573@code{AppDataUnit} object as opposed to a pointer to a memory
574block. In ccRTP application data units are represented through objects
575of the @code{AppDataUnit} class, that provides access to the
576synchronization source of the data and other related properties.
577
578@cindex duplicate packets
579@cindex reordering
580The incoming packet queue takes care of functions such as packet
581reordering or filtering out duplicate packets.
582
583@findex IncomingDataQueue::isWaiting
584You can guess if there are packets in the reception queue calling
585@code{isWaiting}. Both @code{getData} and @code{isWaiting} take an
586optional parameter which selects a particular synchronization source
587of data units. If not specified, data units are returned regardless of
588its source.
589
590
591@c -----------------------------------------------------------------------
592@node Closing Sessions
593@subsection Closing Sessions
594@cindex Closing Sessions
595
596RTP sessions can be closed deleting or destroying @code{RTPSession}
597objects. The stack sends a BYE packet to every destination when the
598destructor of sessions is called. It is also possible to explicitly send
599a BYE packet through the dispatchBYE method, which takes the leaving
600reason string as argument. Note that dispatchBYE will honor a number of
601rules for sending BYE packets specified in the RTP standard: a BYE
602packet is not sent if no RTP/RTCP packet was sent, and BYE floods
603avoiding mechanisms are employed.
604
605Note that when a BYE RTCP packet is received from a remote
606participant, the virtual @code{onGotGoodbye} will be called.
607
608@c -----------------------------------------------------------------------
609@node Types of Sessions
610@subsection Types of Sessions
611@cindex Types of Sessions
612
613@emph{TODO:} explain how to instantiate templates depending on the
614threading model and the number of sockets to use. Also symmetric
615channels/sessions. Describe what's a channel and a session.
616
617
618@c -----------------------------------------------------------------------
619@node Payload Types and Formats
620@section Payload Types and Formats
621@cindex Payload Types
622@cindex Payload Formats
623
624@tindex PayloadType
625@tindex StaticPayloadType
626In the context of @acronym{RTP}, an @acronym{RTP} payload type is a
6277-bit numeric identifier that identifies a payload format.  For
628payload types, GNU ccRTP defines the integer type
629@code{PayloadType}. ccRTP also defines The enumerated type
630@code{StaticPayloadType}, as the enumeration of the @acronym{RTP}
631Payload Types statically assigned for standard audio and video
632formats.
633
634These codes were initially specified in @cite{RFC 1890, ``RTP Profile
635for Audio and Video Conferences with Minimal Control'' (AVP profile)},
636superseded by @cite{RFC 3550}, and are registered as MIME types in
637@cite{RFC 3555}. Codes below 96 may be assigned statically, although
638the default bindings for many of them are already reserverd. Codes in
639the range 96-127 are assigned dinamically by means outside of the
640@acronym{RTP} profile or protocol specification.
641
642@cindex IANA
643@cindex RTP parameters
644See the ``RTP Parameters'' list at @acronym{IANA}
645@url{http://www.iana.org/assignments/rtp-parameters}. Note however
646that registering static payload types is now considered a deprecated
647practice in favor of dynamic payload type negotiation.
648
649@tindex PayloadFormat
650
651@cindex MIME
652@cindex SDP
653@cindex Session Description Protocol
654@cindex H.245
655@cindex clock rate
656@cindex timestamp clock rate
657@cindex RTP clock rate
658The properties of a payload format that, as an @acronym{RTP} stack,
659ccRTP takes into account are the payload type (numeric identifier) and
660the @acronym{RTP} clock rate. Other properties, such as @acronym{MIME}
661type, number of audio channels, ``ptime'' and ``maxptime'' are not
662considered. These are only of interest for higher level protocols,
663such as @acronym{SDP} and H.245.
664
665GNU ccRTP defines a hierarchy of payload format classes. Its root is
666@code{PayloadFormat}, which is a base class for
667@code{StaticPayloadFormat} and @code{DynamicPayloadFormat}.
668
669@tindex StaticPayloadFormat
670@tindex StaticPayloadType
671Static payload format objects are built from a static payload
672code. These are defined in the enumerated type
673@code{StaticPayloadType}. The following example constructs a
674@code{StaticPayloadFormat} object corresponding to the payload type 0
675(statically bounded to PCMA in @cite{RFC 3551}):
676
677@findex StaticPayloadFormat::StaticPayloadFormat
678@example
679StaticPayloadType pt = sptPCMU;
680StaticPayloadFormat* spf = new StaticPayloadFormat(pt);
681@end example
682
683Of course, we could have said:
684
685@example
686StaticPayloadFormat* spf = new StaticPayloadFormat(sptPCMA);
687@end example
688
689StaticPayloadFormat objects build like the ones above hold the
690necessary parameters so that the @acronym{RTP} stack can handle
691incoming and outgoing packets.
692
693@tindex DynamicPayloadFormat
694@findex DynamicPayloadFormat::DynamicPayloadFormat
695Regarding dynamic payload formats, a call to
696@code{DynamicPayloadFormat::DynamicPayloadFormat(100,90000)} like the
697following:
698
699@example
700DynamicPayloadFormat* dpf = new DynamicPayloadFormat(100,90000);
701@end example
702
703Will construct a dynamic payload format object that ties together the
704'100' payload type numeric identifier and an @acronym{RTP} clock rate
705of 90 Khz. Note that the numeric identifier does not have to be in the
706dynamic range. The static payload types are default bindings and MAY
707be overriden, thus, DynamicPayloadFormat(0,90000) is a valid construct
708provided 0 has been established as the payload type through a previous
709negotiation process@footnote{Despite the fact that RFC 3551 defines a
710static binding of the 0 code to mu-law PCM at 8Khz.}.
711
712@cindex Session control
713Whether and how the payload has been negotiated is outside of the
714scope of @acronym{RTP} and ccRTP, so applications must choose between
715@code{StaticPayloadFormat} and @code{DynamicPayloadFormat} accordingly
716to their multimedia session control mechanisms.
717
718
719@c -----------------------------------------------------------------------
720@node Participants
721@section Participants And Sources of Synchronization
722@cindex Source of Synchronization
723@cindex Participant
724
725@tindex RTPApplication
726@tindex Participant
727@tindex SyncSource
728@tindex RTPSession
729In GNU ccRTP, there are classes that represent @acronym{RTP}
730applications (@code{RTPApplication}), participants
731(@code{Participant}), synchronizacion sources (@code{SyncSource}) and
732RTP sessions (@code{RTPSession}). The relations among these entities
733are shown in the following diagram:
734
735@image{srcmodel,8cm,,Relations between applications, participants,
736sources and sessions}
737
738@cindex CNAME
739An @acronym{RTP} application establishes a space of CNAME identifiers,
740whereas an @acronym{RTP} session establishes a space of SSRC
741identifiers.
742
743For each source of synchronization seen in an @acronym{RTP} session, a
744@code{SyncSource} object identified by a SSRC numeric identifier is
745created. Thus, at the beginning of an @acronym{RTP} session there are
746no @code{SyncSource} objects related. Note that, if the local source
747sends packets to itself during an @acronym{RTP} session, a
748@code{SyncSource} object will be created for it.
749
750The list of sources of synchronization identified in an RTP session
751can be retrived through STL-like iterators of type
752@code{RTPSession::SyncSourcesIterator}, as shown in the following
753example.
754
755@cartouche
756@example
757// rx is an RTPSession object
758RTPSession::SyncSourcesIterator it;
759for (it = rx.begin() ; it != rx.end(); it++) @{
760   const SyncSource &s = *it;
761   cout << s.getID();
762   if ( s.isSender() )
763      cout << "is an active sender";
764   cout << endl;
765@}
766@end example
767@end cartouche
768
769@findex RTPSession::SyncSourcesIterator
770@cindex const iterator
771@cindex iterator
772Note @code{RTPSession::SyncSourcesIterator} is a const iterator.
773
774@findex SyncSource::getParticipant()
775@cindex participant
776When using RTCP, it is possible to associate several synchronization
777source objects to a participant in the multimedia session, which is
778represented through the association between @code{Participant} and
779@code{SyncSource} objects. The participant object linked to a source
780of synchronization can be retrieved through the
781@code{SyncSource::getParticipant()} method, as the following examples
782shows:
783
784@cartouche
785@example
786   // s is a source of synchronization object (SyncSource)
787   Participant *p = s.getParticipant();
788   cerr << p->getSDESItem(SDESItemTypeCNAME) << endl;
789@end example
790@end cartouche
791
792When RTCP is not being used or the CNAME identifier corresponding to a
793synchronization source has not been received yet, the participant
794associated with a synchronization source is not known. In these cases,
795the method @code{SyncSource::getParticipant()} will return a NULL
796pointer. On the contrary, a participant is always related to a
797synchronization source at least. It can also be related to more than
798one synchronization source (for instance, when a participant in a
799videoconference sends two video streams from two different
800chameras). Note that, if the local source sends data and control
801packets to itself, a @code{Participant} object will be created for it.
802
803Thus, the @code{SyncSource::getParticipant} provides a facility for
804inter-media synchronization.
805
806@findex defaultApplication
807@findex RTPApplication
808@cindex default value
809@cindex CNAME
810The association of @acronym{RTP} sessions and participants with
811@code{RTPApplication} objects makes it possible to implement several
812``RTP applications'' in the same application or process, each one
813having a separate CNAME space. By default, all @acronym{RTP} sessions
814are associated to an @acronym{RTP} application provided by the global
815method @code{defaultApplication()}. The local CNAME for the default
816application is guessed from the user and machine name, as specified in
817@cite{RFC 3550}.
818
819However, other applications may be created through the constructor
820@code{RTPApplication::RTPApplication(const std::string& cname)}. @acronym{RTP} sessions are associated with applications other
821than the default via an optional constructor parameter.
822
823@findex RTPApplication::ParticipantsIterator
824@cindex const iterator
825@cindex iterator
826Similarly to the list of synchronization sources, the list of
827participants in a session can be retrieved using iterators of type
828@code{RTPApplication::ParticipantsIterator}, see the following
829example, which shows the list of CNAMEs of the participants in the
830default application:
831
832@cartouche
833@example
834   RTPApplication &app = defaultApplication();
835   RTPApplication::ParticipantsIterator ai;
836   for ( ai = app.begin(); ai != app.end(); ai++ ) @{
837      const Participant &p = *ai;
838      cerr << p.getSDESItem(SDESItemTypeCNAME) << endl;
839   @}
840@end example
841@end cartouche
842
843@findex RTPApplication::ParticipantsIterator
844@cindex const iterator
845@cindex iterator
846Note @code{RTPApplication::ParticipantsIterator} is a const iterator.
847
848@emph{TODO: SyncSource states}.
849
850
851@c -----------------------------------------------------------------------
852@node RTP Packets Extensions
853@section RTP Packets Extensions
854@cindex RTP Packets Extensions
855
856@tindex RTPPacket
857@tindex IncomingRTPPkt
858@tindex OutgoingRTPPkt
859@emph{TODO.} Describe @code{RTPPacket}, @code{IncomingRTPPkt} and
860@code{OutgoingRTPPkt} classes. @xref{RTP Packets Arrival}, for a
861discussion of event handling virtuals that allow for specialized
862processing of data packets.
863
864
865@c -----------------------------------------------------------------------
866@node RTCP Packets Extensions
867@section RTCP Packets Extensions
868@cindex RTCP Packets Extensions
869
870@xref{RTCP Packets Arrival}, for a discussion of event handling
871virtuals that allow for specialized processing of control packets.
872
873
874@c -----------------------------------------------------------------------
875@node Handling Events
876@comment  node-name,  next,  previous,  up
877@section Handling Events
878@cindex Handling Events
879
880There are a number of events that may require special response from
881the application. ccRTP defines plug-ins to handle these events.
882
883@menu
884* RTP Packets Arrival::           Filtering and extending @acronym{RTP} packets parsing.
885* RTCP Packets Arrival::          Filtering and extending @acronym{RTCP} packets parsing.
886* Synchronization Source States:: Handling state transitions.
887* SSRC Collisions::               Handling SSRC identifier collisions.
888* RTP Packets Expiration::        Outgoing and incoming @acronym{RTP} packets expiration.
889@end menu
890
891
892@c -----------------------------------------------------------------------
893@node RTP Packets Arrival
894@comment  node-name,  next,  previous,  up
895@subsection RTP Packets Arrival
896@cindex RTP Packet Arrival
897
898@findex IncomingDataQueue::onRTPPacketRecv
899@code{onRTPPacketRecv} is the virtual method that may be redefined in
900any subclass of @code{IncomingDataQueue}, particularly in subclasses
901of @code{RTPSession}. It takes an @code{IncomingRTPPkt} object as
902argument and returns a boolean indicating whether the packet should be
903inserted in the reception queue.
904
905
906@c -----------------------------------------------------------------------
907@node RTP Packets Expiration
908@comment  node-name,  next,  previous,  up
909@subsection RTP Packets Expiration
910@cindex RTP Packets Expiration
911
912@findex OutgoingDataQueue::onExpireSend
913@findex IncomingDataQueue::onExpireRecv
914@code{onExpireSend} and @code{onExpireRecv}
915
916@findex QueueRTCPManager::end2EndDelayed
917@code{end2EndDelayed}
918
919
920@c -----------------------------------------------------------------------
921@node RTCP Packets Arrival
922@comment  node-name,  next,  previous,  up
923@subsection RTCP Packets Arrival
924@cindex RTCP Packet Arrival
925Incoming RTCP packets are automatically handled by ccRTP. However,
926this does not mean you can't track the reception of RTCP packets.
927
928@itemize
929
930@cindex SR
931@cindex RTCP SR
932@findex QueueRTCPManager::onGotSR
933@item @code{onGotSR}
934
935@cindex RR
936@cindex RTCP RR
937@findex QueueRTCPManager::onGotRR
938@item @code{onGotRR}
939
940@cindex SDES
941@cindex RTCP SDES
942@findex QueueRTCPManager::onGotSDESChunk
943@item @code{onGotSDESChunk}
944
945@cindex APP
946@cindex RTCP APP
947@findex QueueRTCPManager::onGotAPP
948@item @code{onGotAPP}
949
950@cindex SRE Extension
951@findex QueueRTCPManager::onGotRRSRExtension
952@item @code{onGotRRSRExtension}
953
954@end itemize
955
956Note that this events correspond to RTCP packets, not RTCP compound
957packets, and probably the reception of a compound packet will trigger
958more than one of these events.
959
960
961@c -----------------------------------------------------------------------
962@node Synchronization Source States
963@comment  node-name,  next,  previous,  up
964@subsection Synchronization Source States
965@cindex Synchronization Source States
966
967@findex IncomingDataQueue::onNewSyncSource
968@code{onNewSyncSource}.
969
970
971@c -----------------------------------------------------------------------
972@node SSRC Collisions
973@comment  node-name,  next,  previous,  up
974@subsection SSRC Collisions
975@cindex SSRC Collision
976
977@cindex collision
978@cindex SSRC collision
979@findex QueueRTCPManager::onSSRCCollision
980@code{onSSRCCollision}.
981
982@c -----------------------------------------------------------------------
983@node Specialized Payload Formats
984@chapter Specialized Payload Formats
985@cindex Specialized Payload Formats
986
987@emph{TODO:} finish 2833bis and CN.
988
989@emph{TODO:} comment H.261 specific RTCP packets: FIR and NACK.
990
991
992@c -----------------------------------------------------------------------
993@node Standards Tracking
994@chapter Standards Tracking
995@cindex Standards tracking
996
997@cindex IETF
998@cindex IETF standards
999
1000@emph{TODO: explain what is done/being done/planned}.
1001
1002@itemize
1003
1004@item @cite{RTP: A Transport Protocol for Real-Time Applications (RFC 3550, which supersedes RFC 1889)}.
1005
1006@item @cite{RTP Profile for Audio and Video Conferences with Minimal Control (RFC 3551, which supersedes RFC 1890)}.
1007
1008@item @cite{MIME Type Registration of RTP Payload Formats (RFC 3555)}.
1009
1010@item @cite{IANA RTP Parameters}.
1011
1012@item @cite{RTP Payload Format for H.261 Video Streams (RFC 2032)}. Defines H.261 specific FIR and NACK RTCP packets.
1013
1014
1015@end itemize
1016
1017@itemize
1018
1019Not yet implemented:
1020
1021@cindex profile
1022@cindex SRTP
1023@cindex Secure RTP
1024@item @cite{The Secure Real-time Transport Protocol}. SRTP provile.
1025
1026@cindex AVPF
1027@cindex RTCP-based feedback
1028@item @cite{Extended RTP Profile for RTCP-based Feedback (RTP/AVPF)}.
1029
1030@cindex AVPF
1031@cindex RTCP-based feedback
1032@item @cite{Extended RTP Profile for RTCP-based Feedback (RTP/AVPF)}.
1033
1034@cindex SAVPF
1035@item @cite{Extended Secure RTP Profile for RTCP-based Feedback (RTP/SAVPF)}.
1036
1037@end itemize
1038
1039
1040@c -----------------------------------------------------------------------
1041@node Upgrading
1042@chapter Upgrading
1043@cindex Upgrading
1044
1045This chapter outlines the main steps required to upgrade applications
1046written for old releases of ccRTP (0.6.x, 0.7.x and 0.9.x series) to
1047the 1.0 series. It is written mostly as a recipe of replacements for
1048old constructs.
1049
1050Replace @code{#include <cc++/rtp.h>} with @code{#include
1051<ccrtp/rtp.h>}@footnote{Note that unfortunately ccRTP 1.0pre0 used
1052@code{#include <cc++/rtp/rtp.h}, which is now deprecated.}.
1053
1054Changes that have to do more with Common C++ 2 than with ccRTP:
1055
1056@table @code
1057
1058@item exit(int)
1059@findex exit
1060Replace with exit()
1061
1062@item Thread::Terminate()
1063@findex Thread::terminate
1064Replace with Thread::terminate()
1065
1066@item ccxx_sleep(timeout_t)
1067@findex ccxx_sleep
1068@findex Thread::sleep
1069Replace with sleep(timeout_t).
1070
1071@item Thread::Run()
1072Replace with Thread::run()
1073
1074@end table
1075
1076Changes required by ccRTP itself:
1077
1078@table @code
1079@item RTPSource
1080@tindex RTPSource
1081@tindex SyncSource
1082Now @code{SyncSource}, and is a somewhat different concept. For
1083instance, calls to RTPSource::getID() must be replaced with calls to
1084SyncSource::getID(), which in most cases will not imply any change to
1085this part of the code.
1086
1087@item RTPQueue::getLocalInfo()->getID()
1088@findex RTPQueue::getLocalInfo
1089@findex RTPQueue::getLocalSSRC
1090Replace with @code{RTPQueueBase::getLocalSSRC()}
1091
1092@item RTPQueue::getCNAME()
1093@findex RTPQueue::getCNAME
1094@findex defaultApplication
1095@findex RTPApplication::getSDESItem
1096Replace with @code{defaultApplication().getSDESItem(SDESItemTypeSDES)}.
1097
1098@item RTPQueue::getPacket()
1099@findex RTPQueue::getPacket
1100@findex IncomingDataQueue::getData
1101@code{getPacket()} has been removed and now there is only a
1102@code{getData()} method in the @acronym{RTP} queues.
1103
1104@item RTPQueue::setTimeout()
1105@findex RTPQueue::setTimeout
1106@findex OutgoingDataQueue::setSchedulingTimeout
1107Replace calls to RTPQueue::setTimeout(microtimeout_t) with calls to
1108OutgoingDataQueue(microtimeout_t), whose purpose and working is
1109exactly the same.
1110
1111@item RTPQueue::putPacket()
1112@findex RTPQueue::putPacket
1113@findex OutgoingDataQueue::putData
1114@cindex payload type
1115@findex RTPQueueBase::setPayloadFormat
1116@code{putPacket()} has been removed and now there is only a
1117@code{putData()} method in the @acronym{RTP} queues. Note also that now the
1118payload type is not specified for each outgoing @acronym{RTP} data block,
1119instead use RTPQueueBase::setPayloadFormat each time the payload type
1120changes.
1121
1122@item PayloadType
1123@tindex DynamicPayloadType
1124@tindex StaticPayloadType
1125The definition of payload types has deeply changed in order to allow
1126all standard uses of dynamic payload negotiation. Refer to
1127@ref{Payload Types and Formats}, for an explanation of the new payload
1128types and formats related classes.
1129
1130For example, @code{RTP_PAYLOAD_PCMU} must be replaced with something
1131like @code{StaticPayloadFormat pcmu(sptPCMU)}, where @code{pcmu} is
1132the name of a static payload object that binds an statically assigned
1133@code{PayloadType} @footnote{The static payload type 0 corresponds to
1134the audio format PCMU, see @cite{RFC 3550}.}. to its corresponding
1135@acronym{RTP} clock rate@footnote{8 khz.}.
1136
1137@cindex destination
1138@cindex redundancy
1139@item RTPSocket::Connect
1140The call connect has been removed. Now, in order to send packets to a
1141destination @code{OutgoingDataQueue::addDestination} must be used. It
1142allows for setting more than one destination. Any destination can
1143actually be added more than one time with addDestination, which can be
1144used a simple trick to perform redundant transmission: each packet -both
1145RTP and RTCP- will be transmitted to the destination as many times as it
1146has been added to the list of destinations through calling
1147addDestination.
1148
1149@item RTPQueue::getCurrentRate
1150@findex RTPQueue::getCurrentRate
1151@findex RTPQueueBase::getCurrentRTPClockRate
1152Replace with @code{RTPQueueBase::getCurrentRTPClockRate()}.
1153
1154@item RTPSocket::Start
1155@findex RTPSocket::Start
1156@findex RTPSession::startRunning
1157Replace with @code{RTPSession::startRunning}.
1158
1159@item RTPQueue::gotHello
1160@findex RTPQueue::gotHello
1161@findex QueueRTCPManager::onNewSyncSource
1162Replace with @code{QueueRTCPManager::onNewSyncSource}.
1163
1164@item RTPQueue::gotGoodbye
1165@findex RTPQueue::gotGoodbye
1166@findex QueueRTCPManager::onGotGoodbye
1167Replace with @code{QueueRTCPManager::onGotGoodbye}.
1168
1169@end table
1170
1171
1172@c -----------------------------------------------------------------------
1173@node ccRTP Internals
1174@comment  node-name,  next,  previous,  up
1175@chapter ccRTP Internals
1176@cindex @acronym{ccRTP} Internals
1177
1178
1179@menu
1180* Internals Overview::          ccRTP internals overview.
1181* Collisions and Loops::        Collision Resolution and Loop Detection.
1182* Algorithms in the Standard::  Implementation of algorithms in the standard.
1183@end menu
1184
1185
1186@c -----------------------------------------------------------------------
1187@node Internals Overview
1188@section Internals Overview
1189@cindex Internals Overview
1190
1191@emph{TODO: Explain where on how timer reconsideration/reverse recons. is
1192performed}.
1193
1194Performance:
1195
1196@itemize
1197@item Zero copy stack.
1198@item RW/R multithreading.
1199@item Fast specialized linked list and hash mechanisms.
1200@end itemize
1201
1202@c -----------------------------------------------------------------------
1203@node Collisions and Loops
1204@section Collisions and Loops
1205@cindex Collisions and Loops
1206
1207ccRTP performs loop detection (following 8.2 in @cite{RFC 3550},
1208though the algorithm in ccRTP differs is structure because of two
1209reasons:
1210
1211@itemize
1212
1213@item ccRTP holds a table of source for which some packet has been received, instead of a table with all the sources in the session (i.e. the local source is not included in the table unless it sends packets to itself).
1214
1215@item RTP and RTCP packets are handled separately whereas the algorithm in 8.2 treats both.
1216
1217Note that the first two conditions in 8.2 (creating new source entries
1218and setting source transport address) are handled in the SSRC
1219bookkeeping methods rather than mixing them with the real collisions
1220and loop handling.
1221
1222Unlike the algorithm given in 8.2, the ccRTP algorithm detects the
1223very rare case when two sources on the same host use the same SSRC
1224identifier and the first @acronym{RTP} packet for that identifier is
1225received from one source and the first RTCP is received from the
1226other.
1227
1228@end itemize
1229
1230@c -----------------------------------------------------------------------
1231@node Algorithms in the Standard
1232@section Algorithms in the Standard
1233@cindex Algoritms in the Standard
1234
1235The following sections summarizes how the algorithms specified in
1236appendixes from @cite{RFC 3550} are implemented in ccRTP. A
1237``mapping'' between routines in the RFC and methods/routines in ccRTP
1238is provided.
1239
1240@menu
1241* A.1::                @acronym{RTP} Data Header Validity Checks.
1242* A.2::                RTCP Header Validity Checks.
1243* A.3::                Determining the Number of @acronym{RTP} Packets Expected and Lost.
1244* A.4::                Generating SDES RTCP Packets.
1245* A.5::                Parsing RTCP SDES Packets.
1246* A.6::                Generating a Random 32-bit Identifier.
1247* A.7::                Computing the RTCP Transmission Interval.
1248* A.8::                Estimating the Interarrival Jitter.
1249@end menu
1250
1251
1252@c -----------------------------------------------------------------------
1253@node A.1
1254@subsection A.1
1255@cindex A.1
1256
1257@findex IncomingDataQueue::checkSSRCInIncomingRTPPkt
1258@findex QueueRTCPManager::checkSSRCInRTCPPkt
1259ccRTP performs @acronym{RTP} data header validity check in two stages:
1260the first stage, performed at the constructor of @code{IncomingRTPPkt}
1261(which is extensible with virtual methods) validates the header fields
1262independent of the source. The second stage, performed at
1263@code{IncomingDataQueue::checkSSRCInIncomingRTPPkt} and
1264@code{QueueRTCPManager::checkSSRCInRTCPPkt}, validates those fields
1265specific to the source of the packet (number sequence, etc).
1266
1267Additionally, the following table specifies which methods of ccRTP
1268implement the functions init_seq and update_seq from A.1.
1269
1270@table @code
1271
1272@item void init_seq(source*, u_int16)
1273void MembershipBookkeeping::SyncSourceLink::initSequence(uint16)
1274
1275@item int update_seq(source*, u_int16)
1276bool RTPQueue::recordReception(SyncSourceLink&, const IncomingRTPPkt&)
1277
1278@end table
1279
1280@c -----------------------------------------------------------------------
1281@node A.2
1282@subsection A.2
1283@cindex A.2
1284
1285@cindex header check
1286@cindex header validity
1287@cindex RTCP header
1288@findex RTCPCompoundHandler::checkCompountRTCPHeader
1289The code in A.2 corresponds to
1290@code{RTCPCompoundHandler::checkCompountRTCPHeader}.
1291
1292
1293@c -----------------------------------------------------------------------
1294@node A.3
1295@subsection A.3
1296@cindex A.3
1297
1298@findex MembershipBookkeeping::SyncSourceLink::computeStats
1299Code in A.3 corresponds to @code{MembershipBookeeping::computeStats}.
1300
1301
1302@c -----------------------------------------------------------------------
1303@node A.4
1304@subsection A.4
1305@cindex A.4
1306
1307@findex QueueRTCPManager::packSDES
1308Code in A.4 is implemented as part of the method
1309@code{QueueRTCPManager::packSDES}.
1310
1311
1312@c -----------------------------------------------------------------------
1313@node A.5
1314@subsection A.5
1315@cindex A.5
1316
1317@findex QueueRTCPManager::onGotSDES
1318Code in A.5 is implemented in the method
1319@code{QueueRTCPManager::onGotSDES}, which calls the virtual method
1320@code{QueueRTCPManager::onGotSDESChunk} to process each SDES chunk.
1321
1322
1323@c -----------------------------------------------------------------------
1324@node A.6
1325@subsection A.6
1326@cindex A.6
1327
1328@cindex Random numbers
1329@cindex /dev/urandom
1330@cindex MD5
1331On POSIX systems, ccRTP uses @file{/dev/urandom} when available. If
1332there is no such device, it defaults to the MD5 based algorithm given
1333in appendix A.6.
1334
1335Code in A.6 corresponds to @code{uint32 MD5BasedRandom32()}, which is
1336called by @code{uint32 random32()} when no random device is available.
1337
1338
1339@c -----------------------------------------------------------------------
1340@node A.7
1341@subsection A.7
1342@cindex A.7
1343
1344Mapping:
1345
1346@table @code
1347
1348@item double rtcp_interval(int, int, double, int, double, int)
1349virtual timeval QueueRTCPManager::computeRTCPInterval(), and in timeval
1350(seconds + microseconds) units, instead of seconds.
1351
1352@item OnExpire(event, int, int, double, int, double, int time_tp, time_tp, int)
1353QueueRTCPManager::runControlService(microtimeout_t) (this method also
1354implements part of SendRTCPReport(e))
1355
1356@item OnReceive(packet, event, int, int, int, double, double, double, double)
1357void QueueRTCPManager::takeInControlPacket() and
1358QueueRTCPManager::runControlService(microtimeout_t)
1359
1360@item Schedule(time, event) and Reschedule(time, event)
1361No equivalent.
1362
1363@findex QueueRTCPManager::dispatchControlPacket
1364@item SendRTCPReport(event)
1365@code{dispatchControlPacket}.
1366
1367@findex QueueRTCPManager::dispatchBYE
1368@item SendBYEPacket(event)
1369@code{QueueRTCPManager::dispatchBYE(const std::string& reason)}.
1370
1371@item TypeOfEvent(event)
1372No equivalent.
1373
1374@item PacketType(p)
1375No equivalent.
1376
1377@findex IncomingDataQueue::takeInDataPacket
1378@item ReceivedPacketSize()
1379@code{size_t IncomingDataQueue::takeInDataPacket()}.
1380
1381@findex OutgoingDataQueue::dispatchDataPacket
1382@findex QueueRTCPManager::dispatchControlPacket
1383@item SentPacketSize()
1384@code{size_t OutgoingDataQueue::dispatchDataPacket()} -data, and
1385@code{size_t QueueRTCPManager::dispatchControlPacket()} -control.
1386
1387@item NewMember(p)
1388
1389@item NewSender(p)
1390
1391@item AddMember() and RemoveMember()
1392
1393@item AddSender() and RemoveSender()
1394
1395@end table
1396
1397
1398@c -----------------------------------------------------------------------
1399@node A.8
1400@subsection A.8
1401@cindex A.8
1402
1403@cindex jitter
1404@cindex interarrival jitter
1405@findex IncomingDataQueue::recordReception
1406Interarrival jitter is estimated as specified in A.8, in
1407@code{recordReception}. Jitter is kept as a float.
1408
1409
1410@c -----------------------------------------------------------------------
1411@node Related Work
1412@comment  node-name,  next,  previous,  up
1413@chapter Related Work
1414@cindex Related work
1415
1416@emph{TODO}.  Other free @acronym{RTP} stacks and tools:
1417
1418@itemize
1419
1420@item jrtplib
1421
1422@item oRTP
1423
1424@item LIVE.COM Streaming Media
1425
1426@item UCL Common Code Library. Note this library is distributed under a BSD license @emph{with} the obnoxious clausule.
1427@end itemize
1428
1429
1430@c -----------------------------------------------------------------------
1431@node Future Work
1432@comment  node-name,  next,  previous,  up
1433@chapter Future Work
1434@cindex Future, Future Work
1435
1436@emph{TODO}.
1437
1438
1439@c %** end of body
1440
1441@c -----------------------------------------------------------------------
1442@node Licenses
1443@appendix Licenses
1444
1445@menu
1446* GNU Free Documentation License::              License for this document.
1447* GNU General Public License::                  ccRTP Base License.
1448* GNU ccRTP Linking Exception::                 ccRTP linking exception.
1449@end menu
1450
1451@include gpl.texi
1452
1453@include fdl.texi
1454
1455
1456@c -----------------------------------------------------------------------
1457@node GNU ccRTP Linking Exception
1458@appendixsec GNU ccRTP Linking Exception
1459@cindex GNU ccRTP Linking Exception
1460
1461As a special exception to the GNU General Public License, permission
1462is granted for additional uses of the text contained in its release of
1463ccRTP.
1464
1465The exception is that, if you link the ccRTP library with other files
1466to produce an executable, this does not by itself cause the resulting
1467executable to be covered by the GNU General Public License.  Your use
1468of that executable is in no way restricted on account of linking the
1469ccRTP library code into it.
1470
1471This exception does not however invalidate any other reasons why the
1472executable file might be covered by the GNU General Public License.
1473
1474This exception applies only to the code released under the name ccRTP.
1475If you copy code from other releases into a copy of ccRTP, as the
1476General Public License permits, the exception does not apply to the
1477code that you add in this way.  To avoid misleading anyone as to the
1478status of such modified files, you must delete this exception notice
1479from them.
1480
1481If you write modifications of your own for ccRTP, it is your choice
1482whether to permit this exception to apply to your modifications.  If
1483you do not wish that, delete this exception notice.
1484
1485
1486
1487
1488@c -----------------------------------------------------------------------
1489
1490@c %** start of end
1491@node Class and Data Type Index
1492@unnumbered Class and Data Type Index
1493
1494@printindex tp
1495
1496@node Method and Function Index
1497@unnumbered Method and Function Index
1498
1499@printindex fn
1500
1501@node Concept Index
1502@unnumbered Concept Index
1503
1504@printindex cp
1505
1506@bye
1507@c %** end of end
1508