Sophie

Sophie

distrib > PLD > ac > amd64 > media > dist > by-pkgid > 4cd3fba015b84aa8198c12116a5f41ed > files > 224

ccrtp-devel-1.3.6-1.amd64.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>ccRTP: iqueue.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body>
<!-- Generated by Doxygen 1.4.4 -->
<div class="qindex"><a class="qindex" href="index.html">Main&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="hierarchy.html">Class&nbsp;Hierarchy</a> | <a class="qindex" href="classes.html">Alphabetical&nbsp;List</a> | <a class="qindex" href="annotated.html">Class&nbsp;List</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Class&nbsp;Members</a> | <a class="qindex" href="globals.html">File&nbsp;Members</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a> | <a class="qindex" href="examples.html">Examples</a></div>
<div class="nav">
<a class="el" href="dir_000000.html">src</a>&nbsp;&raquo&nbsp;<a class="el" href="dir_000001.html">ccrtp</a></div>
<h1>iqueue.h</h1><a href="iqueue_8h.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">// Copyright (C) 2001,2002,2004 Federico Montesino Pouzols &lt;fedemp@altern.org&gt;.</span>
<a name="l00002"></a>00002 <span class="comment">// </span>
<a name="l00003"></a>00003 <span class="comment">// This program is free software; you can redistribute it and/or modify</span>
<a name="l00004"></a>00004 <span class="comment">// it under the terms of the GNU General Public License as published by</span>
<a name="l00005"></a>00005 <span class="comment">// the Free Software Foundation; either version 2 of the License, or</span>
<a name="l00006"></a>00006 <span class="comment">// (at your option) any later version.</span>
<a name="l00007"></a>00007 <span class="comment">// </span>
<a name="l00008"></a>00008 <span class="comment">// This program is distributed in the hope that it will be useful,</span>
<a name="l00009"></a>00009 <span class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
<a name="l00010"></a>00010 <span class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span>
<a name="l00011"></a>00011 <span class="comment">// GNU General Public License for more details.</span>
<a name="l00012"></a>00012 <span class="comment">// </span>
<a name="l00013"></a>00013 <span class="comment">// You should have received a copy of the GNU General Public License</span>
<a name="l00014"></a>00014 <span class="comment">// along with this program; if not, write to the Free Software </span>
<a name="l00015"></a>00015 <span class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</span>
<a name="l00016"></a>00016 <span class="comment">// </span>
<a name="l00017"></a>00017 <span class="comment">// As a special exception, you may use this file as part of a free software</span>
<a name="l00018"></a>00018 <span class="comment">// library without restriction.  Specifically, if other files instantiate</span>
<a name="l00019"></a>00019 <span class="comment">// templates or use macros or inline functions from this file, or you compile</span>
<a name="l00020"></a>00020 <span class="comment">// this file and link it with other files to produce an executable, this</span>
<a name="l00021"></a>00021 <span class="comment">// file does not by itself cause the resulting executable to be covered by</span>
<a name="l00022"></a>00022 <span class="comment">// the GNU General Public License.  This exception does not however    </span>
<a name="l00023"></a>00023 <span class="comment">// invalidate any other reasons why the executable file might be covered by</span>
<a name="l00024"></a>00024 <span class="comment">// the GNU General Public License.    </span>
<a name="l00025"></a>00025 <span class="comment">//</span>
<a name="l00026"></a>00026 <span class="comment">// This exception applies only to the code released under the name GNU</span>
<a name="l00027"></a>00027 <span class="comment">// ccRTP.  If you copy code from other releases into a copy of GNU</span>
<a name="l00028"></a>00028 <span class="comment">// ccRTP, as the General Public License permits, the exception does</span>
<a name="l00029"></a>00029 <span class="comment">// not apply to the code that you add in this way.  To avoid misleading</span>
<a name="l00030"></a>00030 <span class="comment">// anyone as to the status of such modified files, you must delete</span>
<a name="l00031"></a>00031 <span class="comment">// this exception notice from them.</span>
<a name="l00032"></a>00032 <span class="comment">//</span>
<a name="l00033"></a>00033 <span class="comment">// If you write modifications of your own for GNU ccRTP, it is your choice</span>
<a name="l00034"></a>00034 <span class="comment">// whether to permit this exception to apply to your modifications.</span>
<a name="l00035"></a>00035 <span class="comment">// If you do not wish that, delete this exception notice.</span>
<a name="l00036"></a>00036 <span class="comment">//</span>
<a name="l00037"></a>00037 
<a name="l00044"></a>00044 <span class="preprocessor">#ifndef CCXX_RTP_IQUEUE_H_</span>
<a name="l00045"></a>00045 <span class="preprocessor"></span><span class="preprocessor">#define CCXX_RTP_IQUEUE_H_</span>
<a name="l00046"></a>00046 <span class="preprocessor"></span>
<a name="l00047"></a>00047 <span class="preprocessor">#include &lt;<a class="code" href="queuebase_8h.html">ccrtp/queuebase.h</a>&gt;</span>
<a name="l00048"></a>00048 
<a name="l00049"></a>00049 <span class="preprocessor">#ifdef  CCXX_NAMESPACES</span>
<a name="l00050"></a>00050 <span class="preprocessor"></span><span class="keyword">namespace </span>ost {
<a name="l00051"></a>00051 <span class="preprocessor">#endif</span>
<a name="l00052"></a>00052 <span class="preprocessor"></span>
<a name="l00067"></a><a class="code" href="class_members.html">00067</a> <span class="keyword">class </span>__EXPORT Members
<a name="l00068"></a>00068 {
<a name="l00069"></a>00069 <span class="keyword">public</span>:
<a name="l00070"></a>00070         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00071"></a><a class="code" href="class_members.html#a0">00071</a>         setMembersCount(uint32 n)
<a name="l00072"></a>00072         { members = n; }
<a name="l00073"></a>00073 
<a name="l00074"></a>00074         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00075"></a><a class="code" href="class_members.html#a1">00075</a>         increaseMembersCount()
<a name="l00076"></a>00076         { members++; }
<a name="l00077"></a>00077 
<a name="l00078"></a>00078         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00079"></a><a class="code" href="class_members.html#a2">00079</a>         decreaseMembersCount()
<a name="l00080"></a>00080         { members--; }
<a name="l00081"></a>00081 
<a name="l00082"></a>00082         <span class="keyword">inline</span> uint32
<a name="l00083"></a><a class="code" href="class_members.html#a3">00083</a>         getMembersCount()<span class="keyword"> const</span>
<a name="l00084"></a>00084 <span class="keyword">        </span>{ <span class="keywordflow">return</span> members; }
<a name="l00085"></a>00085         
<a name="l00086"></a>00086         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00087"></a><a class="code" href="class_members.html#a4">00087</a>         setSendersCount(uint32 n)
<a name="l00088"></a>00088         { activeSenders = n; }
<a name="l00089"></a>00089 
<a name="l00090"></a>00090         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00091"></a><a class="code" href="class_members.html#a5">00091</a>         increaseSendersCount()
<a name="l00092"></a>00092         { activeSenders++; }
<a name="l00093"></a>00093 
<a name="l00094"></a>00094         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00095"></a><a class="code" href="class_members.html#a6">00095</a>         decreaseSendersCount()
<a name="l00096"></a>00096         { activeSenders--; }
<a name="l00097"></a>00097 
<a name="l00098"></a>00098         <span class="keyword">inline</span> uint32
<a name="l00099"></a><a class="code" href="class_members.html#a7">00099</a>         getSendersCount()<span class="keyword"> const</span>
<a name="l00100"></a>00100 <span class="keyword">        </span>{ <span class="keywordflow">return</span> activeSenders; }
<a name="l00101"></a>00101 
<a name="l00102"></a>00102 <span class="keyword">protected</span>:
<a name="l00103"></a><a class="code" href="class_members.html#b0">00103</a>         Members() :     
<a name="l00104"></a>00104                 members(0), 
<a name="l00105"></a>00105                 activeSenders(0)
<a name="l00106"></a>00106         { }
<a name="l00107"></a>00107 
<a name="l00108"></a><a class="code" href="class_members.html#b1">00108</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> ~Members()
<a name="l00109"></a>00109         { }
<a name="l00110"></a>00110 
<a name="l00111"></a>00111 <span class="keyword">private</span>:
<a name="l00113"></a>00113         uint32 members;
<a name="l00115"></a>00115         uint32 activeSenders;
<a name="l00116"></a>00116 };
<a name="l00117"></a>00117 
<a name="l00124"></a><a class="code" href="class_sync_source_handler.html">00124</a> <span class="keyword">class </span>__EXPORT SyncSourceHandler
<a name="l00125"></a>00125 {
<a name="l00126"></a>00126 <span class="keyword">public</span>:
<a name="l00133"></a>00133         <span class="keyword">inline</span> <span class="keywordtype">void</span>*
<a name="l00134"></a><a class="code" href="class_sync_source_handler.html#a0">00134</a>         getLink(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>&amp; source)<span class="keyword"> const</span>
<a name="l00135"></a>00135 <span class="keyword">        </span>{ <span class="keywordflow">return</span> source.<a class="code" href="class_sync_source.html#d7">getLink</a>(); }
<a name="l00136"></a>00136 
<a name="l00137"></a>00137         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00138"></a><a class="code" href="class_sync_source_handler.html#a1">00138</a>         setLink(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, <span class="keywordtype">void</span>* link)
<a name="l00139"></a>00139         { source.<a class="code" href="class_sync_source.html#d6">setLink</a>(link); }
<a name="l00140"></a>00140 
<a name="l00141"></a>00141         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00142"></a><a class="code" href="class_sync_source_handler.html#a2">00142</a>         setParticipant(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, <a class="code" href="class_participant.html">Participant</a>&amp; p)
<a name="l00143"></a>00143         { source.<a class="code" href="class_sync_source.html#d2">setParticipant</a>(p); }
<a name="l00144"></a>00144 
<a name="l00145"></a>00145         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00146"></a><a class="code" href="class_sync_source_handler.html#a3">00146</a>         setState(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, <a class="code" href="class_sync_source.html#w5">SyncSource::State</a> ns)
<a name="l00147"></a>00147         { source.<a class="code" href="class_sync_source.html#d0">setState</a>(ns); }
<a name="l00148"></a>00148 
<a name="l00149"></a>00149         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00150"></a><a class="code" href="class_sync_source_handler.html#a4">00150</a>         setSender(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, <span class="keywordtype">bool</span> active)
<a name="l00151"></a>00151         { source.<a class="code" href="class_sync_source.html#d1">setSender</a>(active); }
<a name="l00152"></a>00152 
<a name="l00153"></a>00153         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00154"></a><a class="code" href="class_sync_source_handler.html#a5">00154</a>         setDataTransportPort(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, tpport_t p)
<a name="l00155"></a>00155         { source.<a class="code" href="class_sync_source.html#d3">setDataTransportPort</a>(p); }
<a name="l00156"></a>00156 
<a name="l00157"></a>00157         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00158"></a><a class="code" href="class_sync_source_handler.html#a6">00158</a>         setControlTransportPort(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, tpport_t p)
<a name="l00159"></a>00159         { source.<a class="code" href="class_sync_source.html#d4">setControlTransportPort</a>(p); }
<a name="l00160"></a>00160         
<a name="l00161"></a>00161         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00162"></a><a class="code" href="class_sync_source_handler.html#a7">00162</a>         setNetworkAddress(<a class="code" href="class_sync_source.html">SyncSource</a>&amp; source, InetAddress addr)
<a name="l00163"></a>00163         { source.<a class="code" href="class_sync_source.html#d5">setNetworkAddress</a>(addr); }
<a name="l00164"></a>00164         
<a name="l00165"></a>00165 <span class="keyword">protected</span>:
<a name="l00166"></a><a class="code" href="class_sync_source_handler.html#b0">00166</a>         SyncSourceHandler()
<a name="l00167"></a>00167         { }
<a name="l00168"></a>00168 
<a name="l00169"></a><a class="code" href="class_sync_source_handler.html#b1">00169</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> ~SyncSourceHandler() 
<a name="l00170"></a>00170         { }
<a name="l00171"></a>00171 };
<a name="l00172"></a>00172 
<a name="l00179"></a><a class="code" href="class_participant_handler.html">00179</a> <span class="keyword">class </span>__EXPORT ParticipantHandler
<a name="l00180"></a>00180 {
<a name="l00181"></a>00181 <span class="keyword">public</span>:
<a name="l00182"></a>00182         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00183"></a><a class="code" href="class_participant_handler.html#a0">00183</a>         setSDESItem(<a class="code" href="class_participant.html">Participant</a>* part, <a class="code" href="group__rtcppacket.html#ga2">SDESItemType</a> item, 
<a name="l00184"></a>00184                     <span class="keyword">const</span> std::string&amp; val)
<a name="l00185"></a>00185         { part-&gt;<a class="code" href="class_participant.html#d0">setSDESItem</a>(item,val); }
<a name="l00186"></a>00186 
<a name="l00187"></a>00187         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00188"></a><a class="code" href="class_participant_handler.html#a1">00188</a>         setPRIVPrefix(<a class="code" href="class_participant.html">Participant</a>* part, <span class="keyword">const</span> std::string val)
<a name="l00189"></a>00189         { part-&gt;<a class="code" href="class_participant.html#d1">setPRIVPrefix</a>(val); }
<a name="l00190"></a>00190 
<a name="l00191"></a>00191 <span class="keyword">protected</span>:
<a name="l00192"></a><a class="code" href="class_participant_handler.html#b0">00192</a>         ParticipantHandler()
<a name="l00193"></a>00193         { }
<a name="l00194"></a>00194 
<a name="l00195"></a><a class="code" href="class_participant_handler.html#b1">00195</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> ~ParticipantHandler()
<a name="l00196"></a>00196         { }
<a name="l00197"></a>00197 };
<a name="l00198"></a>00198 
<a name="l00205"></a><a class="code" href="class_application_handler.html">00205</a> <span class="keyword">class </span>__EXPORT ApplicationHandler
<a name="l00206"></a>00206 {
<a name="l00207"></a>00207 <span class="keyword">public</span>:
<a name="l00208"></a>00208         <span class="keyword">inline</span> <span class="keywordtype">void</span> 
<a name="l00209"></a><a class="code" href="class_application_handler.html#a0">00209</a>         addParticipant(<a class="code" href="class_r_t_p_application.html">RTPApplication</a>&amp; app, <a class="code" href="class_participant.html">Participant</a>&amp; part)
<a name="l00210"></a>00210         { app.<a class="code" href="class_r_t_p_application.html#d0">addParticipant</a>(part); }
<a name="l00211"></a>00211                 
<a name="l00212"></a>00212         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00213"></a><a class="code" href="class_application_handler.html#a1">00213</a>         removeParticipant(<a class="code" href="class_r_t_p_application.html">RTPApplication</a>&amp; app, 
<a name="l00214"></a>00214                           RTPApplication::ParticipantLink* pl)
<a name="l00215"></a>00215         { app.<a class="code" href="class_r_t_p_application.html#d1">removeParticipant</a>(pl); }
<a name="l00216"></a>00216 
<a name="l00217"></a>00217 <span class="keyword">protected</span>:
<a name="l00218"></a><a class="code" href="class_application_handler.html#b0">00218</a>         ApplicationHandler()
<a name="l00219"></a>00219         { }
<a name="l00220"></a>00220 
<a name="l00221"></a><a class="code" href="class_application_handler.html#b1">00221</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> ~ApplicationHandler()
<a name="l00222"></a>00222         { }
<a name="l00223"></a>00223 };
<a name="l00224"></a>00224 
<a name="l00232"></a><a class="code" href="class_conflict_handler.html">00232</a> <span class="keyword">class </span>__EXPORT ConflictHandler
<a name="l00233"></a>00233 { 
<a name="l00234"></a>00234 <span class="keyword">public</span>:
<a name="l00235"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">00235</a>         <span class="keyword">struct </span><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>
<a name="l00236"></a>00236         { 
<a name="l00237"></a>00237                 <a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>(InetAddress na,
<a name="l00238"></a>00238                                             tpport_t dtp, tpport_t ctp);
<a name="l00239"></a>00239 
<a name="l00240"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#a1">00240</a>                 <span class="keywordtype">void</span> setNext(<a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>* nc)
<a name="l00241"></a>00241                 { next = nc; }
<a name="l00242"></a>00242 
<a name="l00243"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#a2">00243</a>                 <span class="keyword">inline</span> <span class="keyword">const</span> InetAddress&amp; getNetworkAddress( )<span class="keyword"> const</span>
<a name="l00244"></a>00244 <span class="keyword">                </span>{ <span class="keywordflow">return</span> networkAddress; }
<a name="l00245"></a>00245 
<a name="l00246"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#a3">00246</a>                 <span class="keyword">inline</span> tpport_t getDataTransportPort()<span class="keyword"> const</span>
<a name="l00247"></a>00247 <span class="keyword">                </span>{ <span class="keywordflow">return</span> dataTransportPort; }
<a name="l00248"></a>00248 
<a name="l00249"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#a4">00249</a>                 <span class="keyword">inline</span> tpport_t getControlTransportPort()<span class="keyword"> const</span>
<a name="l00250"></a>00250 <span class="keyword">                </span>{ <span class="keywordflow">return</span> controlTransportPort; }
<a name="l00251"></a>00251 
<a name="l00252"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o0">00252</a>                 InetAddress networkAddress;
<a name="l00253"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o1">00253</a>                 tpport_t dataTransportPort;
<a name="l00254"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o2">00254</a>                 tpport_t controlTransportPort;
<a name="l00255"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o3">00255</a>                 <a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>* next;
<a name="l00256"></a>00256                 <span class="comment">// arrival time of last data or control packet.</span>
<a name="l00257"></a><a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o4">00257</a>                 timeval lastPacketTime;
<a name="l00258"></a>00258         };
<a name="l00259"></a>00259         
<a name="l00264"></a>00264         <a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>* searchDataConflict(InetAddress na,
<a name="l00265"></a>00265                                                         tpport_t dtp);
<a name="l00270"></a>00270         <a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>* searchControlConflict(InetAddress na,
<a name="l00271"></a>00271                                                            tpport_t ctp);
<a name="l00272"></a>00272 
<a name="l00273"></a><a class="code" href="class_conflict_handler.html#a2">00273</a>         <span class="keywordtype">void</span> updateConflict(<a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>&amp; ca)
<a name="l00274"></a>00274         { gettimeofday(&amp;(ca.<a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html#o4">lastPacketTime</a>),NULL); }
<a name="l00275"></a>00275 
<a name="l00276"></a>00276         <span class="keywordtype">void</span> addConflict(<span class="keyword">const</span> InetAddress&amp; na, tpport_t dtp, tpport_t ctp);
<a name="l00277"></a>00277 
<a name="l00278"></a>00278 <span class="keyword">protected</span>:
<a name="l00279"></a><a class="code" href="class_conflict_handler.html#b0">00279</a>         ConflictHandler()
<a name="l00280"></a>00280         { firstConflict = lastConflict = NULL; }
<a name="l00281"></a>00281         
<a name="l00282"></a><a class="code" href="class_conflict_handler.html#b1">00282</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> ~ConflictHandler()
<a name="l00283"></a>00283         { }
<a name="l00284"></a>00284 
<a name="l00285"></a><a class="code" href="class_conflict_handler.html#p1">00285</a>         <a class="code" href="struct_conflict_handler_1_1_conflicting_transport_address.html">ConflictingTransportAddress</a>* firstConflict, * lastConflict;
<a name="l00286"></a>00286 };
<a name="l00287"></a>00287 
<a name="l00298"></a><a class="code" href="class_membership_bookkeeping.html">00298</a> <span class="keyword">class </span>__EXPORT MembershipBookkeeping : 
<a name="l00299"></a>00299         <span class="keyword">public</span> SyncSourceHandler,
<a name="l00300"></a>00300         <span class="keyword">public</span> ParticipantHandler,
<a name="l00301"></a>00301         <span class="keyword">public</span> ApplicationHandler,
<a name="l00302"></a>00302         <span class="keyword">public</span> ConflictHandler,
<a name="l00303"></a>00303         <span class="keyword">private</span> Members
<a name="l00304"></a>00304 {
<a name="l00305"></a>00305 <span class="keyword">public</span>:
<a name="l00306"></a><a class="code" href="class_membership_bookkeeping.html#a0">00306</a>         <span class="keyword">inline</span> size_t getDefaultMembersHashSize()
<a name="l00307"></a>00307         { <span class="keywordflow">return</span> defaultMembersHashSize; }
<a name="l00308"></a>00308 
<a name="l00309"></a>00309 <span class="keyword">protected</span>:
<a name="l00310"></a>00310 
<a name="l00324"></a>00324         MembershipBookkeeping(uint32 initialSize = defaultMembersHashSize);
<a name="l00325"></a>00325 
<a name="l00330"></a>00330         <span class="keyword">inline</span> <span class="keyword">virtual</span>
<a name="l00331"></a><a class="code" href="class_membership_bookkeeping.html#b1">00331</a>         ~MembershipBookkeeping()
<a name="l00332"></a>00332         { endMembers(); }
<a name="l00333"></a>00333 
<a name="l00334"></a>00334         <span class="keyword">struct </span>SyncSourceLink;
<a name="l00335"></a>00335 
<a name="l00336"></a><a class="code" href="class_membership_bookkeeping.html#b2">00336</a>         <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getLink(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>&amp; source)<span class="keyword"> const</span>
<a name="l00337"></a>00337 <span class="keyword">        </span>{ <span class="keywordflow">return</span> static_cast&lt;SyncSourceLink*&gt;(<a class="code" href="class_sync_source_handler.html#a0">SyncSourceHandler::getLink</a>(source)); }
<a name="l00342"></a><a class="code" href="class_membership_bookkeeping.html#b3">00342</a>         <span class="keyword">inline</span> <span class="keywordtype">bool</span> isMine(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>&amp; source)<span class="keyword"> const</span>
<a name="l00343"></a>00343 <span class="keyword">        </span>{ <span class="keywordflow">return</span> getLink(source)-&gt;getMembership() == <span class="keyword">this</span>; }
<a name="l00344"></a>00344 
<a name="l00351"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">00351</a>         <span class="keyword">struct </span><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>
<a name="l00352"></a>00352         {
<a name="l00353"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a0">00353</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* pkt, <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* sLink,
<a name="l00354"></a>00354                                    <span class="keyword">struct</span> timeval&amp; recv_ts,
<a name="l00355"></a>00355                                    uint32 shifted_ts,
<a name="l00356"></a>00356                                    <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* sp, 
<a name="l00357"></a>00357                                    <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* sn,
<a name="l00358"></a>00358                                    <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* p,
<a name="l00359"></a>00359                                    <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* n) :
<a name="l00360"></a>00360                         packet(pkt), 
<a name="l00361"></a>00361                         sourceLink(sLink),
<a name="l00362"></a>00362                         prev(p), next(n),
<a name="l00363"></a>00363                         srcPrev(sp), srcNext(sn),
<a name="l00364"></a>00364                         receptionTime(recv_ts),
<a name="l00365"></a>00365                         shiftedTimestamp(shifted_ts)
<a name="l00366"></a>00366                 { }
<a name="l00367"></a>00367 
<a name="l00368"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a1">00368</a>                 ~<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>()
<a name="l00369"></a>00369                 { }
<a name="l00370"></a>00370 
<a name="l00371"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a2">00371</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getSourceLink()<span class="keyword"> const</span>
<a name="l00372"></a>00372 <span class="keyword">                </span>{ <span class="keywordflow">return</span> sourceLink; }
<a name="l00373"></a>00373 
<a name="l00374"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a3">00374</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setSourceLink(<a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* src)
<a name="l00375"></a>00375                 { sourceLink = src; }
<a name="l00376"></a>00376 
<a name="l00377"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a4">00377</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getNext()<span class="keyword"> const</span>
<a name="l00378"></a>00378 <span class="keyword">                </span>{ <span class="keywordflow">return</span> next; }
<a name="l00379"></a>00379 
<a name="l00380"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a5">00380</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setNext(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* nl)
<a name="l00381"></a>00381                 { next = nl; }
<a name="l00382"></a>00382 
<a name="l00383"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a6">00383</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getPrev()<span class="keyword"> const</span>
<a name="l00384"></a>00384 <span class="keyword">                </span>{ <span class="keywordflow">return</span> prev; }
<a name="l00385"></a>00385 
<a name="l00386"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a7">00386</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setPrev(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* pl)
<a name="l00387"></a>00387                 { prev = pl; }
<a name="l00388"></a>00388 
<a name="l00389"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a8">00389</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getSrcNext()<span class="keyword"> const</span>
<a name="l00390"></a>00390 <span class="keyword">                </span>{ <span class="keywordflow">return</span> srcNext; }
<a name="l00391"></a>00391 
<a name="l00392"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a9">00392</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setSrcNext(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* sn)
<a name="l00393"></a>00393                 { srcNext = sn; }
<a name="l00394"></a>00394 
<a name="l00395"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a10">00395</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getSrcPrev()<span class="keyword"> const</span>
<a name="l00396"></a>00396 <span class="keyword">                </span>{ <span class="keywordflow">return</span> srcPrev; }
<a name="l00397"></a>00397 
<a name="l00398"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a11">00398</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setSrcPrev(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* sp)
<a name="l00399"></a>00399                 { srcPrev = sp; }
<a name="l00400"></a>00400 
<a name="l00401"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a12">00401</a>                 <span class="keyword">inline</span> <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* getPacket()<span class="keyword"> const</span>
<a name="l00402"></a>00402 <span class="keyword">                </span>{ <span class="keywordflow">return</span> packet; }
<a name="l00403"></a>00403 
<a name="l00404"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a13">00404</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setPacket(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* pkt)
<a name="l00405"></a>00405                 { packet = pkt; }
<a name="l00406"></a>00406 
<a name="l00414"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a14">00414</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setRecvTime(<span class="keyword">const</span> timeval &amp;t)
<a name="l00415"></a>00415                 { receptionTime = t; }
<a name="l00416"></a>00416 
<a name="l00420"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a15">00420</a>                 <span class="keyword">inline</span> timeval getRecvTime()<span class="keyword"> const</span>
<a name="l00421"></a>00421 <span class="keyword">                </span>{ <span class="keywordflow">return</span> receptionTime; }
<a name="l00422"></a>00422 
<a name="l00431"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a16">00431</a>                 <span class="keyword">inline</span> uint32 getTimestamp()<span class="keyword"> const</span>
<a name="l00432"></a>00432 <span class="keyword">                </span>{ <span class="keywordflow">return</span> shiftedTimestamp; };
<a name="l00433"></a>00433 
<a name="l00434"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#a17">00434</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setTimestamp(uint32 ts)
<a name="l00435"></a>00435                 { shiftedTimestamp = ts;}
<a name="l00436"></a>00436 
<a name="l00437"></a>00437                 <span class="comment">// the packet this link refers to.</span>
<a name="l00438"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o0">00438</a>                 <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* packet; 
<a name="l00439"></a>00439                 <span class="comment">// the synchronization source this packet comes from.</span>
<a name="l00440"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o1">00440</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* sourceLink;
<a name="l00441"></a>00441                 <span class="comment">// global incoming packet queue links.</span>
<a name="l00442"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o2">00442</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* prev, * next;
<a name="l00443"></a>00443                 <span class="comment">// source specific incoming packet queue links.</span>
<a name="l00444"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o4">00444</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* srcPrev, * srcNext;
<a name="l00445"></a>00445                 <span class="comment">// time this packet was received at</span>
<a name="l00446"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o6">00446</a>                 <span class="keyword">struct </span>timeval receptionTime;
<a name="l00447"></a>00447                 <span class="comment">// timestamp of the packet in host order and after</span>
<a name="l00448"></a>00448                 <span class="comment">// substracting the initial timestamp for its source</span>
<a name="l00449"></a>00449                 <span class="comment">// (it is an increment from the initial timestamp).</span>
<a name="l00450"></a><a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html#o7">00450</a>                 uint32 shiftedTimestamp;
<a name="l00451"></a>00451         };
<a name="l00452"></a>00452 
<a name="l00469"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">00469</a>         <span class="keyword">struct </span><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>
<a name="l00470"></a>00470         {
<a name="l00471"></a>00471                 <span class="comment">// 2^16</span>
<a name="l00472"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#s0">00472</a>                 <span class="keyword">static</span> <span class="keyword">const</span> uint32 SEQNUMMOD;
<a name="l00473"></a>00473 
<a name="l00474"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a0">00474</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>(MembershipBookkeeping* m,
<a name="l00475"></a>00475                                <a class="code" href="class_sync_source.html">SyncSource</a>* s,
<a name="l00476"></a>00476                                <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* fp = NULL,
<a name="l00477"></a>00477                                <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* lp = NULL,
<a name="l00478"></a>00478                                <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* ps = NULL,
<a name="l00479"></a>00479                                <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* ns = NULL,
<a name="l00480"></a>00480                                <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* ncollis = NULL) :
<a name="l00481"></a>00481                         membership(m), source(s), first(fp), last(lp),
<a name="l00482"></a>00482                         prev(ps), next(ns), nextCollis(ncollis), 
<a name="l00483"></a>00483                         prevConflict(NULL)
<a name="l00484"></a>00484                 { m-&gt;<a class="code" href="class_sync_source_handler.html#a1">setLink</a>(*s,<span class="keyword">this</span>); <span class="comment">// record that the source is associated</span>
<a name="l00485"></a>00485                   initStats();         <span class="comment">// to this link.</span>
<a name="l00486"></a>00486                 }
<a name="l00487"></a>00487 
<a name="l00491"></a>00491                 ~<a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>();
<a name="l00492"></a>00492 
<a name="l00493"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a2">00493</a>                 <span class="keyword">inline</span> MembershipBookkeeping* getMembership() 
<a name="l00494"></a>00494                 { <span class="keywordflow">return</span> membership; }
<a name="l00495"></a>00495                 
<a name="l00500"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a3">00500</a>                 <span class="keyword">inline</span> <a class="code" href="class_sync_source.html">SyncSource</a>* getSource() { <span class="keywordflow">return</span> source; }
<a name="l00501"></a>00501 
<a name="l00506"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a4">00506</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getFirst()
<a name="l00507"></a>00507                 { <span class="keywordflow">return</span> first; }
<a name="l00508"></a>00508 
<a name="l00509"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a5">00509</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setFirst(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* fp)
<a name="l00510"></a>00510                 { first = fp; }
<a name="l00511"></a>00511 
<a name="l00516"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a6">00516</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* getLast()
<a name="l00517"></a>00517                 { <span class="keywordflow">return</span> last; }
<a name="l00518"></a>00518 
<a name="l00519"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a7">00519</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setLast(<a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* lp)
<a name="l00520"></a>00520                 { last = lp; }
<a name="l00521"></a>00521 
<a name="l00525"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a8">00525</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getPrev()
<a name="l00526"></a>00526                 { <span class="keywordflow">return</span> prev; }
<a name="l00527"></a>00527 
<a name="l00528"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a9">00528</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setPrev(<a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* ps)
<a name="l00529"></a>00529                 { prev = ps; }
<a name="l00530"></a>00530                 
<a name="l00534"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a10">00534</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getNext()
<a name="l00535"></a>00535                 { <span class="keywordflow">return</span> next; }
<a name="l00536"></a>00536 
<a name="l00537"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a11">00537</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setNext(<a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a> *ns)
<a name="l00538"></a>00538                 { next = ns; }
<a name="l00539"></a>00539 
<a name="l00546"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a12">00546</a>                 <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getNextCollis()
<a name="l00547"></a>00547                 { <span class="keywordflow">return</span> nextCollis; }
<a name="l00548"></a>00548                 
<a name="l00549"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a13">00549</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setNextCollis(<a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* ns)
<a name="l00550"></a>00550                 { nextCollis = ns; }
<a name="l00551"></a>00551 
<a name="l00552"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a14">00552</a>                 <span class="keyword">inline</span> ConflictingTransportAddress* getPrevConflict()<span class="keyword"> const</span>
<a name="l00553"></a>00553 <span class="keyword">                </span>{ <span class="keywordflow">return</span> prevConflict; }
<a name="l00554"></a>00554                 
<a name="l00558"></a>00558                 <span class="keywordtype">void</span> setPrevConflict(InetAddress&amp; addr, tpport_t dataPort,
<a name="l00559"></a>00559                                      tpport_t controlPort);
<a name="l00560"></a>00560                 
<a name="l00561"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a16">00561</a>                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* getSenderInfo()
<a name="l00562"></a>00562                 { <span class="keywordflow">return</span> senderInfo; }
<a name="l00563"></a>00563                 
<a name="l00564"></a>00564                 <span class="keywordtype">void</span> setSenderInfo(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* si);
<a name="l00565"></a>00565 
<a name="l00566"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a18">00566</a>                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* getReceiverInfo()
<a name="l00567"></a>00567                 { <span class="keywordflow">return</span> receiverInfo; }
<a name="l00568"></a>00568                 
<a name="l00569"></a>00569                 <span class="keywordtype">void</span> setReceiverInfo(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* ri);
<a name="l00570"></a>00570 
<a name="l00571"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a20">00571</a>                 <span class="keyword">inline</span> timeval getLastPacketTime()<span class="keyword"> const</span>
<a name="l00572"></a>00572 <span class="keyword">                </span>{ <span class="keywordflow">return</span> lastPacketTime; }
<a name="l00573"></a>00573 
<a name="l00574"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a21">00574</a>                 <span class="keyword">inline</span> timeval getLastRTCPPacketTime()<span class="keyword"> const</span>
<a name="l00575"></a>00575 <span class="keyword">                </span>{ <span class="keywordflow">return</span> lastRTCPPacketTime; }
<a name="l00576"></a>00576 
<a name="l00577"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a22">00577</a>                 <span class="keyword">inline</span> timeval getLastRTCPSRTime()<span class="keyword"> const</span>
<a name="l00578"></a>00578 <span class="keyword">                </span>{ <span class="keywordflow">return</span> lastRTCPSRTime; }
<a name="l00579"></a>00579 
<a name="l00584"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a23">00584</a>                 <span class="keyword">inline</span> uint32 getObservedPacketCount()<span class="keyword"> const</span>
<a name="l00585"></a>00585 <span class="keyword">                </span>{ <span class="keywordflow">return</span> obsPacketCount; }
<a name="l00586"></a>00586                 
<a name="l00587"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a24">00587</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> incObservedPacketCount()
<a name="l00588"></a>00588                 { obsPacketCount++; }
<a name="l00589"></a>00589 
<a name="l00594"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a25">00594</a>                 <span class="keyword">inline</span> uint32 getObservedOctetCount()<span class="keyword"> const</span>
<a name="l00595"></a>00595 <span class="keyword">                </span>{ <span class="keywordflow">return</span> obsOctetCount; }
<a name="l00596"></a>00596 
<a name="l00597"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a26">00597</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> incObservedOctetCount(uint32 n)
<a name="l00598"></a>00598                 { obsOctetCount += n; }
<a name="l00599"></a>00599 
<a name="l00603"></a>00603                 uint16
<a name="l00604"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a27">00604</a>                 getMaxSeqNum()<span class="keyword"> const</span>
<a name="l00605"></a>00605 <span class="keyword">                </span>{ <span class="keywordflow">return</span> maxSeqNum; }
<a name="l00606"></a>00606 
<a name="l00611"></a>00611                 <span class="keywordtype">void</span>
<a name="l00612"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a28">00612</a>                 setMaxSeqNum(uint16 max)
<a name="l00613"></a>00613                 { maxSeqNum = max; }
<a name="l00614"></a>00614 
<a name="l00615"></a>00615                 <span class="keyword">inline</span> uint32
<a name="l00616"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a29">00616</a>                 getExtendedMaxSeqNum()<span class="keyword"> const</span>
<a name="l00617"></a>00617 <span class="keyword">                </span>{ <span class="keywordflow">return</span> extendedMaxSeqNum; }
<a name="l00618"></a>00618 
<a name="l00619"></a>00619                 <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00620"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a30">00620</a>                 setExtendedMaxSeqNum(uint32 seq)
<a name="l00621"></a>00621                 { extendedMaxSeqNum = seq; }
<a name="l00622"></a>00622 
<a name="l00623"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a31">00623</a>                 <span class="keyword">inline</span> uint32 getCumulativePacketLost()<span class="keyword"> const</span>
<a name="l00624"></a>00624 <span class="keyword">                </span>{ <span class="keywordflow">return</span> cumulativePacketLost; }
<a name="l00625"></a>00625 
<a name="l00626"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a32">00626</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setCumulativePacketLost(uint32 pl)
<a name="l00627"></a>00627                 { cumulativePacketLost = pl; }
<a name="l00628"></a>00628 
<a name="l00629"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a33">00629</a>                 <span class="keyword">inline</span> uint8 getFractionLost()<span class="keyword"> const</span>
<a name="l00630"></a>00630 <span class="keyword">                </span>{ <span class="keywordflow">return</span> fractionLost; }
<a name="l00631"></a>00631 
<a name="l00632"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a34">00632</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setFractionLost(uint8 fl)
<a name="l00633"></a>00633                 { fractionLost = fl; }
<a name="l00634"></a>00634 
<a name="l00635"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a35">00635</a>                 <span class="keyword">inline</span> uint32 getLastPacketTransitTime()
<a name="l00636"></a>00636                 { <span class="keywordflow">return</span> lastPacketTransitTime; }
<a name="l00637"></a>00637                 
<a name="l00638"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a36">00638</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setLastPacketTransitTime(uint32 time)
<a name="l00639"></a>00639                 { lastPacketTransitTime = time; }
<a name="l00640"></a>00640 
<a name="l00641"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a37">00641</a>                 <span class="keyword">inline</span> <span class="keywordtype">float</span> getJitter()<span class="keyword"> const</span>
<a name="l00642"></a>00642 <span class="keyword">                </span>{ <span class="keywordflow">return</span> jitter; }
<a name="l00643"></a>00643 
<a name="l00644"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a38">00644</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setJitter(<span class="keywordtype">float</span> j)
<a name="l00645"></a>00645                 { jitter = j; }
<a name="l00646"></a>00646 
<a name="l00647"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a39">00647</a>                 <span class="keyword">inline</span> uint32 getInitialDataTimestamp()<span class="keyword"> const </span>
<a name="l00648"></a>00648 <span class="keyword">                </span>{ <span class="keywordflow">return</span> initialDataTimestamp; }
<a name="l00649"></a>00649 
<a name="l00650"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a40">00650</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setInitialDataTimestamp(uint32 ts) 
<a name="l00651"></a>00651                 { initialDataTimestamp = ts; }
<a name="l00652"></a>00652 
<a name="l00653"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a41">00653</a>                 <span class="keyword">inline</span> timeval getInitialDataTime()<span class="keyword"> const</span>
<a name="l00654"></a>00654 <span class="keyword">                </span>{ <span class="keywordflow">return</span> initialDataTime; }
<a name="l00655"></a>00655 
<a name="l00656"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a42">00656</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setInitialDataTime(timeval it)
<a name="l00657"></a>00657                 { initialDataTime = it; }
<a name="l00658"></a>00658                 
<a name="l00666"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a43">00666</a>                 <span class="keywordtype">bool</span> getGoodbye()
<a name="l00667"></a>00667                 {
<a name="l00668"></a>00668                         <span class="keywordflow">if</span>(!flag)
<a name="l00669"></a>00669                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00670"></a>00670                         flag = <span class="keyword">false</span>;
<a name="l00671"></a>00671                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00672"></a>00672                 }
<a name="l00673"></a>00673                 
<a name="l00680"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a44">00680</a>                 <span class="keywordtype">bool</span> getHello() {
<a name="l00681"></a>00681                         <span class="keywordflow">if</span>(flag)
<a name="l00682"></a>00682                                 <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00683"></a>00683                         flag = <span class="keyword">true</span>;
<a name="l00684"></a>00684                         <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00685"></a>00685                 }
<a name="l00686"></a>00686 
<a name="l00687"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a45">00687</a>                 <span class="keyword">inline</span> uint32 getBadSeqNum()<span class="keyword"> const</span>
<a name="l00688"></a>00688 <span class="keyword">                </span>{ <span class="keywordflow">return</span> badSeqNum; }
<a name="l00689"></a>00689                 
<a name="l00690"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a46">00690</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setBadSeqNum(uint32 seq)
<a name="l00691"></a>00691                 { badSeqNum = seq; }
<a name="l00692"></a>00692 
<a name="l00693"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a47">00693</a>                 uint8 getProbation()<span class="keyword"> const</span>
<a name="l00694"></a>00694 <span class="keyword">                </span>{ <span class="keywordflow">return</span> probation; }
<a name="l00695"></a>00695 
<a name="l00696"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a48">00696</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> setProbation(uint8 p)
<a name="l00697"></a>00697                 { probation = p; }
<a name="l00698"></a>00698 
<a name="l00699"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a49">00699</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> decProbation()
<a name="l00700"></a>00700                 { --probation; }
<a name="l00701"></a>00701 
<a name="l00702"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a50">00702</a>                 <span class="keywordtype">bool</span> isValid()<span class="keyword"> const</span>
<a name="l00703"></a>00703 <span class="keyword">                </span>{ <span class="keywordflow">return</span> 0 == probation; }
<a name="l00704"></a>00704 
<a name="l00705"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a51">00705</a>                 <span class="keyword">inline</span> uint16 getBaseSeqNum()<span class="keyword"> const</span>
<a name="l00706"></a>00706 <span class="keyword">                </span>{ <span class="keywordflow">return</span> baseSeqNum; }
<a name="l00707"></a>00707 
<a name="l00708"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a52">00708</a>                 <span class="keyword">inline</span> uint32 getSeqNumAccum()<span class="keyword"> const</span>
<a name="l00709"></a>00709 <span class="keyword">                </span>{ <span class="keywordflow">return</span> seqNumAccum; }
<a name="l00710"></a>00710 
<a name="l00711"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a53">00711</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> incSeqNumAccum()
<a name="l00712"></a>00712                 { seqNumAccum += SEQNUMMOD; }
<a name="l00713"></a>00713 
<a name="l00717"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#a54">00717</a>                 <span class="keyword">inline</span> <span class="keywordtype">void</span> initSequence(uint16 seqnum)
<a name="l00718"></a>00718                 { maxSeqNum = seqNumAccum = seqnum; }
<a name="l00719"></a>00719                 
<a name="l00730"></a>00730                 <span class="keywordtype">void</span> recordInsertion(<span class="keyword">const</span> <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>&amp; pl);
<a name="l00731"></a>00731 
<a name="l00732"></a>00732                 <span class="keywordtype">void</span> initStats();
<a name="l00733"></a>00733 
<a name="l00738"></a>00738                 <span class="keywordtype">void</span> computeStats();
<a name="l00739"></a>00739 
<a name="l00740"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o0">00740</a>                 MembershipBookkeeping* membership;
<a name="l00741"></a>00741                 <span class="comment">// The source this link object refers to.</span>
<a name="l00742"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o1">00742</a>                 <a class="code" href="class_sync_source.html">SyncSource</a>* source;             
<a name="l00743"></a>00743                 <span class="comment">// first/last packets from this source in the queue.</span>
<a name="l00744"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o3">00744</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_incoming_r_t_p_pkt_link.html">IncomingRTPPktLink</a>* first, * last; 
<a name="l00745"></a>00745                 <span class="comment">// Links for synchronization sources located before</span>
<a name="l00746"></a>00746                 <span class="comment">// and after this one in the list of sources.</span>
<a name="l00747"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o4">00747</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* prev, * next;
<a name="l00748"></a>00748                 <span class="comment">// Prev and next inside the hash table collision list.</span>
<a name="l00749"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o6">00749</a>                 <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* nextCollis;
<a name="l00750"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o7">00750</a>                 ConflictingTransportAddress* prevConflict;
<a name="l00751"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o8">00751</a>                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* senderInfo; 
<a name="l00752"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o9">00752</a>                 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* receiverInfo;
<a name="l00753"></a>00753                 <span class="comment">// time the last RTP packet from this source was</span>
<a name="l00754"></a>00754                 <span class="comment">// received at.</span>
<a name="l00755"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o10">00755</a>                 timeval lastPacketTime;
<a name="l00756"></a>00756                 <span class="comment">// time the last RTCP packet was received.</span>
<a name="l00757"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o11">00757</a>                 timeval lastRTCPPacketTime;
<a name="l00758"></a>00758                 <span class="comment">// time the lasrt RTCP SR was received. Required for</span>
<a name="l00759"></a>00759                 <span class="comment">// DLSR computation.</span>
<a name="l00760"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o12">00760</a>                 timeval lastRTCPSRTime;
<a name="l00761"></a>00761 
<a name="l00762"></a>00762                 <span class="comment">// for outgoing RR reports.</span>
<a name="l00763"></a>00763                 <span class="comment">// number of packets received from this source.</span>
<a name="l00764"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o13">00764</a>                 uint32 obsPacketCount;
<a name="l00765"></a>00765                 <span class="comment">// number of octets received from this source.</span>
<a name="l00766"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o14">00766</a>                 uint32 obsOctetCount;
<a name="l00767"></a>00767                 <span class="comment">// the higher sequence number seen from this source</span>
<a name="l00768"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o15">00768</a>                 uint16 maxSeqNum;
<a name="l00769"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o16">00769</a>                 uint32 extendedMaxSeqNum;
<a name="l00770"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o17">00770</a>                 uint32 cumulativePacketLost;
<a name="l00771"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o18">00771</a>                 uint8 fractionLost;
<a name="l00772"></a>00772                 <span class="comment">// for interarrivel jitter computation</span>
<a name="l00773"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o19">00773</a>                 uint32 lastPacketTransitTime;
<a name="l00774"></a>00774                 <span class="comment">// interarrival jitter of packets from this source.</span>
<a name="l00775"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o20">00775</a>                 <span class="keywordtype">float</span> jitter;
<a name="l00776"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o21">00776</a>                 uint32 initialDataTimestamp;
<a name="l00777"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o22">00777</a>                 timeval initialDataTime;
<a name="l00778"></a>00778 
<a name="l00779"></a>00779                 <span class="comment">// this flag assures we only call one gotHello and one</span>
<a name="l00780"></a>00780                 <span class="comment">// gotGoodbye for this src.</span>
<a name="l00781"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o23">00781</a>                 <span class="keywordtype">bool</span> flag;
<a name="l00782"></a>00782 
<a name="l00783"></a>00783                 <span class="comment">// for source validation:</span>
<a name="l00784"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o24">00784</a>                 uint32 badSeqNum;
<a name="l00785"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o25">00785</a>                 uint8 probation;  <span class="comment">// packets in sequence before valid.</span>
<a name="l00786"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o26">00786</a>                 uint16 baseSeqNum;
<a name="l00787"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o27">00787</a>                 uint32 expectedPrior;
<a name="l00788"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o28">00788</a>                 uint32 receivedPrior;
<a name="l00789"></a><a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html#o29">00789</a>                 uint32 seqNumAccum;
<a name="l00790"></a>00790         };
<a name="l00791"></a>00791 
<a name="l00796"></a>00796         <span class="keywordtype">bool</span>
<a name="l00797"></a>00797         isRegistered(uint32 ssrc);
<a name="l00798"></a>00798 
<a name="l00807"></a>00807         <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>*
<a name="l00808"></a>00808         getSourceBySSRC(uint32 ssrc, <span class="keywordtype">bool</span>&amp; created);
<a name="l00809"></a>00809 
<a name="l00820"></a>00820         <span class="keywordtype">bool</span>
<a name="l00821"></a>00821         BYESource(uint32 ssrc);
<a name="l00822"></a>00822 
<a name="l00830"></a>00830         <span class="keywordtype">bool</span>
<a name="l00831"></a>00831         removeSource(uint32 ssrc);
<a name="l00832"></a>00832 
<a name="l00833"></a><a class="code" href="class_membership_bookkeeping.html#b8">00833</a>         <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getFirst()
<a name="l00834"></a>00834         { <span class="keywordflow">return</span> first; }
<a name="l00835"></a>00835 
<a name="l00836"></a><a class="code" href="class_membership_bookkeeping.html#b9">00836</a>         <span class="keyword">inline</span> <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* getLast()
<a name="l00837"></a>00837         { <span class="keywordflow">return</span> last; }
<a name="l00838"></a>00838 
<a name="l00839"></a>00839         <span class="keyword">inline</span> uint32
<a name="l00840"></a><a class="code" href="class_membership_bookkeeping.html#b10">00840</a>         getMembersCount()
<a name="l00841"></a>00841         { <span class="keywordflow">return</span> <a class="code" href="class_members.html#a3">Members::getMembersCount</a>(); }
<a name="l00842"></a>00842 
<a name="l00843"></a>00843         <span class="keyword">inline</span> <span class="keywordtype">void</span>
<a name="l00844"></a><a class="code" href="class_membership_bookkeeping.html#b11">00844</a>         setMembersCount(uint32 n)
<a name="l00845"></a>00845         { <a class="code" href="class_members.html#a0">Members::setMembersCount</a>(n); }
<a name="l00846"></a>00846 
<a name="l00847"></a>00847         <span class="keyword">inline</span> uint32
<a name="l00848"></a><a class="code" href="class_membership_bookkeeping.html#b12">00848</a>         getSendersCount()
<a name="l00849"></a>00849         { <span class="keywordflow">return</span> <a class="code" href="class_members.html#a7">Members::getSendersCount</a>(); }
<a name="l00850"></a>00850 
<a name="l00851"></a><a class="code" href="class_membership_bookkeeping.html#t0">00851</a>         <span class="keyword">static</span> <span class="keyword">const</span> size_t defaultMembersHashSize;
<a name="l00852"></a><a class="code" href="class_membership_bookkeeping.html#t1">00852</a>         <span class="keyword">static</span> <span class="keyword">const</span> uint32 SEQNUMMOD;
<a name="l00853"></a>00853 
<a name="l00854"></a>00854 <span class="keyword">private</span>:
<a name="l00855"></a>00855         MembershipBookkeeping(<span class="keyword">const</span> MembershipBookkeeping &amp;o);
<a name="l00856"></a>00856 
<a name="l00857"></a>00857         MembershipBookkeeping&amp;
<a name="l00858"></a>00858         operator=(<span class="keyword">const</span> MembershipBookkeeping &amp;o);
<a name="l00859"></a>00859         
<a name="l00864"></a>00864         <span class="keywordtype">void</span>
<a name="l00865"></a>00865         endMembers();
<a name="l00866"></a>00866         
<a name="l00867"></a>00867         <span class="comment">// Hash table with sources of RTP and RTCP packets</span>
<a name="l00868"></a>00868         uint32 sourceBucketsNum; 
<a name="l00869"></a>00869         <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>** sourceLinks;
<a name="l00870"></a>00870         <span class="comment">// List of sources, ordered from older to newer</span>
<a name="l00871"></a>00871         <a class="code" href="struct_membership_bookkeeping_1_1_sync_source_link.html">SyncSourceLink</a>* first, * last;
<a name="l00872"></a>00872 };
<a name="l00873"></a>00873 
<a name="l00880"></a><a class="code" href="class_incoming_data_queue.html">00880</a> <span class="keyword">class </span>__EXPORT IncomingDataQueue: <span class="keyword">public</span> <a class="code" href="class_incoming_data_queue_base.html">IncomingDataQueueBase</a>,
<a name="l00881"></a>00881         <span class="keyword">protected</span> MembershipBookkeeping
<a name="l00882"></a>00882 {
<a name="l00883"></a>00883 <span class="keyword">public</span>:
<a name="l00889"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">00889</a>         <span class="keyword">class </span><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>
<a name="l00890"></a>00890         {
<a name="l00891"></a>00891         <span class="keyword">public</span>:
<a name="l00892"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#w0">00892</a>                 <span class="keyword">typedef</span> std::forward_iterator_tag iterator_category;
<a name="l00893"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#w1">00893</a>                 <span class="keyword">typedef</span> <a class="code" href="class_sync_source.html">SyncSource</a> <a class="code" href="class_sync_source.html">value_type</a>;
<a name="l00894"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#w2">00894</a>                 <span class="keyword">typedef</span> ptrdiff_t difference_type;
<a name="l00895"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#w3">00895</a>                 <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>* <a class="code" href="class_sync_source.html">pointer</a>;
<a name="l00896"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#w4">00896</a>                 <span class="keyword">typedef</span> <span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>&amp; <a class="code" href="class_sync_source.html">reference</a>;
<a name="l00897"></a>00897                 
<a name="l00898"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a0">00898</a>                 <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>(SyncSourceLink* l = NULL) :
<a name="l00899"></a>00899                         link(l)
<a name="l00900"></a>00900                 { }
<a name="l00901"></a>00901                 
<a name="l00902"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a1">00902</a>                 <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>(<span class="keyword">const</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; si) :
<a name="l00903"></a>00903                         link(si.link)
<a name="l00904"></a>00904                 { }
<a name="l00905"></a>00905 
<a name="l00906"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a2">00906</a>                 <a class="code" href="class_sync_source.html">reference</a> operator*()<span class="keyword"> const</span>
<a name="l00907"></a>00907 <span class="keyword">                </span>{ <span class="keywordflow">return</span> *(link-&gt;getSource()); }
<a name="l00908"></a>00908 
<a name="l00909"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a3">00909</a>                 <a class="code" href="class_sync_source.html">pointer</a> operator-&gt;()<span class="keyword"> const</span>
<a name="l00910"></a>00910 <span class="keyword">                </span>{ <span class="keywordflow">return</span> link-&gt;getSource(); }
<a name="l00911"></a>00911 
<a name="l00912"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a4">00912</a>                 <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; operator++() {
<a name="l00913"></a>00913                         link = link-&gt;getNext();
<a name="l00914"></a>00914                         <span class="keywordflow">return</span> *<span class="keyword">this</span>;
<a name="l00915"></a>00915                 }
<a name="l00916"></a>00916 
<a name="l00917"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#a5">00917</a>                 <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a> operator++(<span class="keywordtype">int</span>) {
<a name="l00918"></a>00918                         <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a> result(*<span class="keyword">this</span>);
<a name="l00919"></a>00919                         ++(*this);
<a name="l00920"></a>00920                         <span class="keywordflow">return</span> result;
<a name="l00921"></a>00921                 }
<a name="l00922"></a>00922 
<a name="l00923"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#n0">00923</a>                 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator==(<span class="keyword">const</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; l,
<a name="l00924"></a>00924                                        <span class="keyword">const</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; r)
<a name="l00925"></a>00925                 { <span class="keywordflow">return</span> l.<a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#r0">link</a> == r.<a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#r0">link</a>; }
<a name="l00926"></a>00926 
<a name="l00927"></a><a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#n1">00927</a>                 <span class="keyword">friend</span> <span class="keywordtype">bool</span> operator!=(<span class="keyword">const</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; l,
<a name="l00928"></a>00928                                        <span class="keyword">const</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>&amp; r)
<a name="l00929"></a>00929                 { <span class="keywordflow">return</span> l.<a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#r0">link</a> != r.<a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html#r0">link</a>; }
<a name="l00930"></a>00930 
<a name="l00931"></a>00931         <span class="keyword">private</span>:
<a name="l00932"></a>00932                 SyncSourceLink *link;
<a name="l00933"></a>00933         };
<a name="l00934"></a>00934 
<a name="l00935"></a><a class="code" href="class_incoming_data_queue.html#a0">00935</a>         <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a> begin()
<a name="l00936"></a>00936         { <span class="keywordflow">return</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>(<a class="code" href="class_membership_bookkeeping.html#b8">MembershipBookkeeping::getFirst</a>()); }
<a name="l00937"></a>00937         
<a name="l00938"></a><a class="code" href="class_incoming_data_queue.html#a1">00938</a>         <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a> end()
<a name="l00939"></a>00939         { <span class="keywordflow">return</span> <a class="code" href="class_incoming_data_queue_1_1_sync_sources_iterator.html">SyncSourcesIterator</a>(NULL); }
<a name="l00940"></a>00940 
<a name="l00949"></a>00949         <span class="keyword">const</span> <a class="code" href="class_app_data_unit.html">AppDataUnit</a>*
<a name="l00950"></a>00950         getData(uint32 stamp, <span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>* src = NULL);
<a name="l00951"></a>00951 
<a name="l00952"></a>00952 
<a name="l00959"></a>00959         <span class="keywordtype">bool</span>
<a name="l00960"></a>00960         isWaiting(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>* src = NULL) <span class="keyword">const</span>;
<a name="l00961"></a>00961 
<a name="l00968"></a>00968         uint32 
<a name="l00969"></a>00969         getFirstTimestamp(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>* src = NULL) <span class="keyword">const</span>;
<a name="l00970"></a>00970  
<a name="l00993"></a>00993         <span class="keywordtype">void</span>
<a name="l00994"></a><a class="code" href="class_incoming_data_queue.html#a5">00994</a>         setMinValidPacketSequence(uint8 packets)
<a name="l00995"></a>00995         { minValidPacketSequence = packets; }
<a name="l00996"></a>00996 
<a name="l00997"></a>00997         uint8
<a name="l00998"></a><a class="code" href="class_incoming_data_queue.html#a6">00998</a>         getDefaultMinValidPacketSequence()<span class="keyword"> const</span>
<a name="l00999"></a>00999 <span class="keyword">        </span>{ <span class="keywordflow">return</span> defaultMinValidPacketSequence; }
<a name="l01000"></a>01000 
<a name="l01005"></a>01005         uint8
<a name="l01006"></a><a class="code" href="class_incoming_data_queue.html#a7">01006</a>         getMinValidPacketSequence()<span class="keyword"> const</span>
<a name="l01007"></a>01007 <span class="keyword">        </span>{ <span class="keywordflow">return</span> minValidPacketSequence; }
<a name="l01008"></a>01008 
<a name="l01009"></a>01009         <span class="keywordtype">void</span> 
<a name="l01010"></a><a class="code" href="class_incoming_data_queue.html#a8">01010</a>         setMaxPacketMisorder(uint16 packets)
<a name="l01011"></a>01011         { maxPacketMisorder = packets; }
<a name="l01012"></a>01012         
<a name="l01013"></a>01013         uint16 
<a name="l01014"></a><a class="code" href="class_incoming_data_queue.html#a9">01014</a>         getDefaultMaxPacketMisorder()<span class="keyword"> const</span>
<a name="l01015"></a>01015 <span class="keyword">        </span>{ <span class="keywordflow">return</span> defaultMaxPacketMisorder; }
<a name="l01016"></a>01016 
<a name="l01017"></a>01017         uint16 
<a name="l01018"></a><a class="code" href="class_incoming_data_queue.html#a10">01018</a>         getMaxPacketMisorder()<span class="keyword"> const</span>
<a name="l01019"></a>01019 <span class="keyword">        </span>{ <span class="keywordflow">return</span> maxPacketMisorder; }
<a name="l01020"></a>01020 
<a name="l01026"></a>01026         <span class="keywordtype">void</span>
<a name="l01027"></a><a class="code" href="class_incoming_data_queue.html#a11">01027</a>         setMaxPacketDropout(uint16 packets) <span class="comment">// default: 3000.</span>
<a name="l01028"></a>01028         { maxPacketDropout = packets; }
<a name="l01029"></a>01029 
<a name="l01030"></a>01030         uint16
<a name="l01031"></a><a class="code" href="class_incoming_data_queue.html#a12">01031</a>         getDefaultMaxPacketDropout()<span class="keyword"> const</span>
<a name="l01032"></a>01032 <span class="keyword">        </span>{ <span class="keywordflow">return</span> defaultMaxPacketDropout; }
<a name="l01033"></a>01033 
<a name="l01034"></a>01034         uint16
<a name="l01035"></a><a class="code" href="class_incoming_data_queue.html#a13">01035</a>         getMaxPacketDropout()<span class="keyword"> const</span>
<a name="l01036"></a>01036 <span class="keyword">        </span>{ <span class="keywordflow">return</span> maxPacketDropout; }
<a name="l01037"></a>01037 
<a name="l01038"></a>01038         <span class="comment">// default value for constructors that allow to specify</span>
<a name="l01039"></a>01039         <span class="comment">// members table s\ize</span>
<a name="l01040"></a>01040         <span class="keyword">inline</span> <span class="keyword">static</span> size_t
<a name="l01041"></a><a class="code" href="class_incoming_data_queue.html#e0">01041</a>         getDefaultMembersSize()
<a name="l01042"></a>01042         { <span class="keywordflow">return</span> defaultMembersSize; }
<a name="l01043"></a>01043 
<a name="l01044"></a>01044 <span class="keyword">protected</span>:
<a name="l01048"></a>01048         IncomingDataQueue(uint32 size);
<a name="l01049"></a>01049 
<a name="l01050"></a><a class="code" href="class_incoming_data_queue.html#b1">01050</a>         <span class="keyword">virtual</span> ~IncomingDataQueue()
<a name="l01051"></a>01051         { }
<a name="l01052"></a>01052 
<a name="l01065"></a>01065         <span class="keywordtype">bool</span> checkSSRCInIncomingRTPPkt(SyncSourceLink&amp; sourceLink, 
<a name="l01066"></a>01066                                        <span class="keywordtype">bool</span> is_new, InetAddress&amp; na, 
<a name="l01067"></a>01067                                        tpport_t tp);
<a name="l01068"></a>01068 
<a name="l01084"></a><a class="code" href="class_incoming_data_queue.html#b3">01084</a>         <span class="keywordtype">void</span> setSourceExpirationPeriod(uint8 intervals)
<a name="l01085"></a>01085         { sourceExpirationPeriod = intervals; }
<a name="l01086"></a>01086 
<a name="l01093"></a>01093         size_t
<a name="l01094"></a>01094         takeInDataPacket();
<a name="l01095"></a>01095 
<a name="l01096"></a>01096         <span class="keywordtype">void</span> renewLocalSSRC();
<a name="l01097"></a>01097 
<a name="l01107"></a>01107         IncomingDataQueue::IncomingRTPPktLink*
<a name="l01108"></a>01108         getWaiting(uint32 timestamp, <span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a> *src = NULL);
<a name="l01109"></a>01109 
<a name="l01125"></a>01125         <span class="keywordtype">bool</span>
<a name="l01126"></a>01126         recordReception(SyncSourceLink&amp; srcLink, <span class="keyword">const</span> <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; pkt,
<a name="l01127"></a>01127                         <span class="keyword">const</span> timeval recvtime);
<a name="l01128"></a>01128 
<a name="l01135"></a>01135         <span class="keywordtype">void</span> 
<a name="l01136"></a>01136         recordExtraction(<span class="keyword">const</span> <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; pkt);
<a name="l01137"></a>01137         
<a name="l01138"></a>01138         <span class="keywordtype">void</span> purgeIncomingQueue();
<a name="l01139"></a>01139 
<a name="l01146"></a>01146         <span class="keyword">inline</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span>
<a name="l01147"></a><a class="code" href="class_incoming_data_queue.html#b10">01147</a>         onNewSyncSource(<span class="keyword">const</span> <a class="code" href="class_sync_source.html">SyncSource</a>&amp;)
<a name="l01148"></a>01148         { }
<a name="l01149"></a>01149 
<a name="l01150"></a>01150 <span class="keyword">protected</span>:
<a name="l01167"></a>01167         <span class="keyword">inline</span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span>
<a name="l01168"></a><a class="code" href="class_incoming_data_queue.html#b11">01168</a>         onRTPPacketRecv(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp;)
<a name="l01169"></a>01169         { <span class="keywordflow">return</span> <span class="keyword">true</span>; }
<a name="l01170"></a>01170         
<a name="l01179"></a><a class="code" href="class_incoming_data_queue.html#b12">01179</a>         <span class="keyword">inline</span> <span class="keyword">virtual</span> <span class="keywordtype">void</span> onExpireRecv(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp;)
<a name="l01180"></a>01180         { <span class="keywordflow">return</span>; }
<a name="l01181"></a>01181         
<a name="l01182"></a>01182         <span class="keyword">inline</span> <span class="keyword">virtual</span> <span class="keywordtype">bool</span>
<a name="l01183"></a><a class="code" href="class_incoming_data_queue.html#b13">01183</a>         end2EndDelayed(IncomingRTPPktLink&amp;)
<a name="l01184"></a>01184         { <span class="keywordflow">return</span> <span class="keyword">false</span>; }
<a name="l01185"></a>01185         
<a name="l01201"></a>01201         <span class="keywordtype">bool</span>
<a name="l01202"></a>01202         insertRecvPacket(IncomingRTPPktLink* packetLink);
<a name="l01203"></a>01203 
<a name="l01215"></a>01215         <span class="keyword">virtual</span> size_t
<a name="l01216"></a>01216         recvData(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* buffer, size_t length, 
<a name="l01217"></a>01217                  InetHostAddress&amp; host, tpport_t&amp; port) = 0;
<a name="l01218"></a>01218 
<a name="l01219"></a>01219         <span class="keyword">virtual</span> size_t
<a name="l01220"></a>01220         getNextDataPacketSize() <span class="keyword">const </span>= 0;
<a name="l01221"></a>01221 
<a name="l01222"></a><a class="code" href="class_incoming_data_queue.html#p0">01222</a>         <span class="keyword">mutable</span> ThreadLock recvLock;
<a name="l01223"></a>01223         <span class="comment">// reception queue</span>
<a name="l01224"></a><a class="code" href="class_incoming_data_queue.html#p2">01224</a>         IncomingRTPPktLink* recvFirst, * recvLast;
<a name="l01225"></a>01225         <span class="comment">// values for packet validation.</span>
<a name="l01226"></a><a class="code" href="class_incoming_data_queue.html#t0">01226</a>         <span class="keyword">static</span> <span class="keyword">const</span> uint8 defaultMinValidPacketSequence;
<a name="l01227"></a><a class="code" href="class_incoming_data_queue.html#t1">01227</a>         <span class="keyword">static</span> <span class="keyword">const</span> uint16 defaultMaxPacketMisorder;
<a name="l01228"></a><a class="code" href="class_incoming_data_queue.html#t2">01228</a>         <span class="keyword">static</span> <span class="keyword">const</span> uint16 defaultMaxPacketDropout;
<a name="l01229"></a><a class="code" href="class_incoming_data_queue.html#p3">01229</a>         uint8 minValidPacketSequence;
<a name="l01230"></a><a class="code" href="class_incoming_data_queue.html#p4">01230</a>         uint16 maxPacketMisorder;
<a name="l01231"></a><a class="code" href="class_incoming_data_queue.html#p5">01231</a>         uint16 maxPacketDropout;
<a name="l01232"></a><a class="code" href="class_incoming_data_queue.html#t3">01232</a>         <span class="keyword">static</span> <span class="keyword">const</span> size_t defaultMembersSize;
<a name="l01233"></a><a class="code" href="class_incoming_data_queue.html#p6">01233</a>         uint8 sourceExpirationPeriod;
<a name="l01234"></a>01234 };      
<a name="l01235"></a>01235  <span class="comment">// iqueue</span>
<a name="l01237"></a>01237 
<a name="l01238"></a>01238 <span class="preprocessor">#ifdef  CCXX_NAMESPACES</span>
<a name="l01239"></a>01239 <span class="preprocessor"></span>}
<a name="l01240"></a>01240 <span class="preprocessor">#endif</span>
<a name="l01241"></a>01241 <span class="preprocessor"></span>
<a name="l01242"></a>01242 <span class="preprocessor">#endif  //CCXX_RTP_IQUEUE_H_</span>
<a name="l01243"></a>01243 <span class="preprocessor"></span>
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Dec 9 22:32:03 2005 for ccRTP by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.4 </small></address>
</body>
</html>