Sophie

Sophie

distrib > Mandriva > 8.2 > i586 > media > contrib > by-pkgid > 56ebf73a8cc21535297a85df4640d63b > files > 170

libccrtp0.7-0.7.2-1mdk.i586.rpm

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><meta name="robots" content="noindex">
<meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1">
<title>rtp.h Source File</title>
<link href="doxygen.css" rel="stylesheet" type="text/css">
</head><body bgcolor="#ffffff">
<!-- Generated by Doxygen 1.2.5 on Fri Oct 5 10:28:25 2001 -->
<center>
<a class="qindex" href="index.html">Main Page</a> &nbsp; <a class="qindex" href="hierarchy.html">Class Hierarchy</a> &nbsp; <a class="qindex" href="classes.html">Alphabetical List</a> &nbsp; <a class="qindex" href="annotated.html">Compound List</a> &nbsp; <a class="qindex" href="files.html">File List</a> &nbsp; <a class="qindex" href="functions.html">Compound Members</a> &nbsp; <a class="qindex" href="globals.html">File Members</a> &nbsp; <a class="qindex" href="pages.html">Related Pages</a> &nbsp; <a class="qindex" href="examples.html">Examples</a> &nbsp; </center>
<hr><h1>rtp.h</h1><a href="rtp_h.html">Go to the documentation of this file.</a><div class="fragment"><pre>00001 <font class="comment">// Copyright (C) 1999-2001 Open Source Telecom Corporation.</font>
00002 <font class="comment">// </font>
00003 <font class="comment">// This program is free software; you can redistribute it and/or modify</font>
00004 <font class="comment">// it under the terms of the GNU General Public License as published by</font>
00005 <font class="comment">// the Free Software Foundation; either version 2 of the License, or</font>
00006 <font class="comment">// (at your option) any later version.</font>
00007 <font class="comment">// </font>
00008 <font class="comment">// This program is distributed in the hope that it will be useful,</font>
00009 <font class="comment">// but WITHOUT ANY WARRANTY; without even the implied warranty of</font>
00010 <font class="comment">// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</font>
00011 <font class="comment">// GNU General Public License for more details.</font>
00012 <font class="comment">// </font>
00013 <font class="comment">// You should have received a copy of the GNU General Public License</font>
00014 <font class="comment">// along with this program; if not, write to the Free Software </font>
00015 <font class="comment">// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.</font>
00016 <font class="comment">// </font>
00017 <font class="comment">// As a special exception to the GNU General Public License, permission is </font>
00018 <font class="comment">// granted for additional uses of the text contained in its release </font>
00019 <font class="comment">// of ccRTP.</font>
00020 <font class="comment">// </font>
00021 <font class="comment">// The exception is that, if you link the ccRTP library with other</font>
00022 <font class="comment">// files to produce an executable, this does not by itself cause the</font>
00023 <font class="comment">// resulting executable to be covered by the GNU General Public License.</font>
00024 <font class="comment">// Your use of that executable is in no way restricted on account of</font>
00025 <font class="comment">// linking the ccRTP library code into it.</font>
00026 <font class="comment">// </font>
00027 <font class="comment">// This exception does not however invalidate any other reasons why</font>
00028 <font class="comment">// the executable file might be covered by the GNU General Public License.</font>
00029 <font class="comment">// </font>
00030 <font class="comment">// This exception applies only to the code released under the </font>
00031 <font class="comment">// name ccRTP.  If you copy code from other releases into a copy of</font>
00032 <font class="comment">// ccRTP, as the General Public License permits, the exception does</font>
00033 <font class="comment">// not apply to the code that you add in this way.  To avoid misleading</font>
00034 <font class="comment">// anyone as to the status of such modified files, you must delete</font>
00035 <font class="comment">// this exception notice from them.</font>
00036 <font class="comment">// </font>
00037 <font class="comment">// If you write modifications of your own for ccRTP, it is your choice</font>
00038 <font class="comment">// whether to permit this exception to apply to your modifications.</font>
00039 <font class="comment">// If you do not wish that, delete this exception notice.  </font>
00040 
00047 <font class="preprocessor">#ifndef __CCXX_RTP_H__</font>
00048 <font class="preprocessor"></font><font class="preprocessor">#   define   __CCXX_RTP_H__</font>
00049 <font class="preprocessor"></font><font class="preprocessor">#   ifndef   __CCXX_SOCKET_H__</font>
00050 <font class="preprocessor"></font><font class="preprocessor">#      include &lt;cc++/socket.h&gt;</font>
00051 <font class="preprocessor">#   else</font>
00052 <font class="preprocessor"></font><font class="preprocessor">#      ifdef   __CCXX_NAMESPACE_H__</font>
00053 <font class="preprocessor"></font><font class="preprocessor">#         include &lt;cc++/macros.h&gt;</font>
00054 <font class="preprocessor">#      endif //__CCXX_NAMESPACE_H__</font>
00055 <font class="preprocessor"></font><font class="preprocessor">#   endif  //__CCXX_SOCKET_H__</font>
00056 <font class="preprocessor"></font>
00057 <font class="comment">// RTP version</font>
<a name="l00058"></a><a class="code" href="rtp_h.html#a0">00058</a> <font class="keyword">const</font> uint8 RTP_VERSION = 2;
00059 
00060 <font class="comment">// Time interval expressed in microseconds</font>
<a name="l00061"></a><a class="code" href="rtp_h.html#a1">00061</a> <font class="keyword">typedef</font> uint32 microtimeout_t;
00062 
00063 <font class="comment">// Time interval expressed in nanoseconds </font>
<a name="l00064"></a><a class="code" href="rtp_h.html#a2">00064</a> <font class="keyword">typedef</font> uint32 nanotimeout_t;
00065 
00066 <font class="keyword">struct </font><a class="code" href="struct_RTCPPacket.html">RTCPPacket</a>;
00067 <font class="keyword">struct </font><a class="code" href="struct_SenderInfo.html">SenderInfo</a>;
00068 <font class="keyword">struct </font><a class="code" href="struct_ReceiverInfo.html">ReceiverInfo</a>;
00069 
<a name="l00082"></a><a class="code" href="rtp_h.html#a67">00082</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00083 {
00084         RTP_PAYLOAD_PCMU = 0,   
00085         RTP_PAYLOAD_1016,       
00086         RTP_PAYLOAD_G726,       
00087         RTP_PAYLOAD_GSM,        
00088         RTP_PAYLOAD_G723,       
00089         RTP_PAYLOAD_DVI4_8000,  
00090         RTP_PAYLOAD_DVI4_16000, 
00091         RTP_PAYLOAD_LPC,        
00092         RTP_PAYLOAD_PCMA,       
00093         RTP_PAYLOAD_G722,       
00094         RTP_PAYLOAD_L16_DUAL,   
00095         RTP_PAYLOAD_L16_MONO,   
00096         RTP_PAYLOAD_QCELP,      
00097         RTP_PAYLOAD_MPA = 14,   
00098         RTP_PAYLOAD_G728,       
00099         RTP_PAYLOAD_DVI4_11025, 
00100         RTP_PAYLOAD_DVI4_22050, 
00101         RTP_PAYLOAD_G729,       
00102         RTP_PAYLOAD_CELB = 25,  
00103         RTP_PAYLOAD_JPEG,       
00104         RTP_PAYLOAD_NV = 28,    
00105         RTP_PAYLOAD_H261 = 31,  
00106         RTP_PAYLOAD_MPV,        
00107         RTP_PAYLOAD_MP2T,       
00108         RTP_PAYLOAD_H263,       
00109         RTP_PAYLOAD_INVALID = 128,
00110         <font class="comment">// the payload types defined down here are allocated dynamically.</font>
00111         RTP_PAYLOAD_G726_40,
00112         RTP_PAYLOAD_G726_24,
00113         RTP_PAYLOAD_G726_16,
00114         RTP_PAYLOAD_G729D,
00115         RTP_PAYLOAD_G729E,
00116         RTP_PAYLOAD_GSM_EFR,
00117         RTP_PAYLOAD_L8,
00118         RTP_PAYLOAD_RED,
00119         RTP_PAYLOAD_VDVI,
00120         RTP_PAYLOAD_BT656,      
00121         RTP_PAYLOAD_H263_1998,  
00122         RTP_PAYLOAD_MP1S,       
00123         RTP_PAYLOAD_MP2P,       
00124         RTP_PAYLOAD_BMPEG,      
00125         RTP_PAYLOAD_EMPTY       
00126 }       rtp_payload_t;
00127 
<a name="l00133"></a><a class="code" href="rtp_h.html#a68">00133</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00134 {
00135         RTCP_TYPE_SR = 200,             
00136         RTCP_TYPE_RR,                   
00137         RTCP_TYPE_SDES,                 
00138         RTCP_TYPE_BYE,                  
00139         RTCP_TYPE_APP                   
00140 }       rtcp_type_t;
00141 
<a name="l00149"></a><a class="code" href="rtp_h.html#a69">00149</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00150 {
00151         RTCP_SDES_ITEM_END = 0,         
00152         RTCP_SDES_ITEM_CNAME,           
00153         RTCP_SDES_ITEM_NAME,            
00154         RTCP_SDES_ITEM_EMAIL,           
00155         RTCP_SDES_ITEM_PHONE,           
00156         RTCP_SDES_ITEM_LOC,             
00157         RTCP_SDES_ITEM_TOOL,            
00158         RTCP_SDES_ITEM_NOTE,            
00159         RTCP_SDES_ITEM_PRIV,            
00160         RTCP_SDES_ITEM_H323_CADDR,      
00161 }       sdes_item_type_t;
00162 
<a name="l00181"></a><a class="code" href="rtp_h.html#a70">00181</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00182 {
00183         BEST_EFFORT_SERVICE,     
00184         ENHANCED_SERVICE         
00185 }       type_of_service_t;
00186 
<a name="l00195"></a><a class="code" href="rtp_h.html#a71">00195</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00196 {
00197         RTP_PURGE_SEND,        
00198         RTP_PURGE_RECV,        
00199         RTP_PURGE_BOTH         
00200 }       rtp_purge_t;
00201 
<a name="l00202"></a><a class="code" href="rtp_h.html#a72">00202</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> {
00203         CAST_MCAST,
00204         CAST_UCAST
00205 }       rtp_cast_t;
00206 
00207 <font class="keyword">class </font><a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>;
00208 <font class="keyword">class </font><a class="code" href="class_OutgoingRTPPkt.html">OutgoingRTPPkt</a>;
00209 <font class="keyword">class </font><a class="code" href="class_RTPQueue.html">RTPQueue</a>;
00210 <font class="keyword">class </font><a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a>;
00211 <font class="keyword">class </font><a class="code" href="class_RTPSource.html">RTPSource</a>;
00212 
<a name="l00225"></a><a class="code" href="class_RTPData.html">00225</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_RTPData.html">RTPData</a>
00226 {
00227 
00228 <font class="keyword">public</font>:
00232         <a class="code" href="class_RTPData.html#a0">RTPData</a>(<font class="keyword">const</font> <a class="code" href="class_RTPData.html">RTPData</a>&amp; origin);
00233 
00240         <a class="code" href="class_RTPData.html">RTPData</a>&amp;
00241         <a class="code" href="class_RTPData.html#a1">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_RTPData.html">RTPData</a>&amp; source);
00242 
00243         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*
<a name="l00244"></a><a class="code" href="class_RTPData.html#a2">00244</a>         <a class="code" href="class_RTPData.html#a2">getData</a>()<font class="keyword"> const</font>
00245 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;data; };
00246 
00247         <font class="keyword">inline</font> size_t
<a name="l00248"></a><a class="code" href="class_RTPData.html#a3">00248</a>         <a class="code" href="class_RTPData.html#a3">getSize</a>()<font class="keyword"> const</font>
00249 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;size; };
00250 
00251         <font class="keyword">inline</font> rtp_payload_t
<a name="l00252"></a><a class="code" href="class_RTPData.html#a4">00252</a>         <a class="code" href="class_RTPData.html#a4">getPayloadType</a>()<font class="keyword"> const</font>
00253 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;pt; }
00254 
00255 <font class="keyword">protected</font>:
00256 
00257         <a class="code" href="class_RTPData.html#a0">RTPData</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>&amp; packet);
00258 
00259         <a class="code" href="class_RTPData.html#b1">~RTPData</a>();
00260 
00261 <font class="keyword">private</font>:
00262         <font class="comment">// dataCounter holds the reference counter</font>
<a name="l00263"></a><a class="code" href="struct_RTPData__dataCounter.html">00263</a>         <font class="keyword">struct </font>dataCounter {
<a name="l00264"></a><a class="code" href="struct_RTPData__dataCounter.html#m0">00264</a>                 uint16 count;
<a name="l00265"></a><a class="code" href="struct_RTPData__dataCounter.html#m1">00265</a>                 <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data;
<a name="l00266"></a><a class="code" href="struct_RTPData__dataCounter.html#m2">00266</a>                 <font class="keyword">const</font> size_t size;
<a name="l00267"></a><a class="code" href="struct_RTPData__dataCounter.html#m3">00267</a>                 rtp_payload_t pt;
00268                 <a class="code" href="struct_RTPData__dataCounter.html#a0">dataCounter</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t size, rtp_payload_t pt);
00269                 <a class="code" href="struct_RTPData__dataCounter.html#a1">~dataCounter</a>();
00270         };
00271 
<a name="l00272"></a><a class="code" href="class_RTPData.html#o0">00272</a>         <font class="keyword">mutable</font> dataCounter* datablock;
00273 
00274 
00275 
00276         <font class="comment">// Who sent this data</font>
<a name="l00277"></a><a class="code" href="class_RTPData.html#o1">00277</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>* src;
00278 
<a name="l00279"></a><a class="code" href="class_RTPData.html#o2">00279</a>         <font class="keyword">friend</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a>;
00280 };
00281 
<a name="l00297"></a><a class="code" href="class_RTPSource.html">00297</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_RTPSource.html">RTPSource</a>
00298 {
00299 
00300 <font class="keyword">public</font>:
<a name="l00301"></a><a class="code" href="class_RTPSource.html#a0">00301</a>         uint32 <a class="code" href="class_RTPSource.html#a0">getID</a>()<font class="keyword"> const</font>
00302 <font class="keyword">        </font>{ <font class="keywordflow">return</font> ssrc; };
00303 
00309         uint32 
00310         <a class="code" href="class_RTPSource.html#a1">getRate</a>() <font class="keyword">const</font>;
00311 
00325         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00326"></a><a class="code" href="class_RTPSource.html#a2">00326</a>         <a class="code" href="class_RTPSource.html#a2">setKitchenSize</a>(microtimeout_t s)<font class="keyword"></font>
00327 <font class="keyword">        </font>{ kitchensize = ((s / 1000) * <a class="code" href="class_RTPSource.html#a1">getRate</a>() / 1000); };
00328          
00334         <font class="keyword">inline</font> microtimeout_t
<a name="l00335"></a><a class="code" href="class_RTPSource.html#a3">00335</a>         <a class="code" href="class_RTPSource.html#a3">getKitchenDuration</a>()<font class="keyword"> const</font>
00336 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((kitchensize * 1000) / <a class="code" href="class_RTPSource.html#a1">getRate</a>())* 1000); };
00337 
00338         <font class="keyword">inline</font> uint32
<a name="l00339"></a><a class="code" href="class_RTPSource.html#a4">00339</a>         <a class="code" href="class_RTPSource.html#a4">getKitchenSize</a>()<font class="keyword"> const</font>
00340 <font class="keyword">        </font>{ <font class="keywordflow">return</font> kitchensize; };
00341 
00350         <font class="keyword">inline</font> microtimeout_t
<a name="l00351"></a><a class="code" href="class_RTPSource.html#a5">00351</a>         <a class="code" href="class_RTPSource.html#a5">getCurrentKitchenDuration</a>()<font class="keyword"></font>
00352 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((currentkitchen * 1000) / <a class="code" href="class_RTPSource.html#a1">getRate</a>())* 1000); };
00353 
00354         <font class="keyword">inline</font> microtimeout_t
<a name="l00355"></a><a class="code" href="class_RTPSource.html#a6">00355</a>         <a class="code" href="class_RTPSource.html#a6">getCurrentKitchenSize</a>()<font class="keyword"></font>
00356 <font class="keyword">        </font>{ <font class="keywordflow">return</font> currentkitchen;};
00357 
00358         <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
00359         <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(sdes_item_type_t type) <font class="keyword">const</font>;
00360         
00361         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00362"></a><a class="code" href="class_RTPSource.html#a8">00362</a>         <a class="code" href="class_RTPSource.html#a8">getCNAME</a>()<font class="keyword"> const</font>
00363 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_CNAME); };
00364 
00365         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00366"></a><a class="code" href="class_RTPSource.html#a9">00366</a>         <a class="code" href="class_RTPSource.html#a9">getNAME</a>()<font class="keyword"> const</font>
00367 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_NAME); };
00368 
00369         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00370"></a><a class="code" href="class_RTPSource.html#a10">00370</a>         <a class="code" href="class_RTPSource.html#a10">getEMAIL</a>()<font class="keyword"> const</font>
00371 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_EMAIL); };
00372 
00373         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00374"></a><a class="code" href="class_RTPSource.html#a11">00374</a>         <a class="code" href="class_RTPSource.html#a11">getPHONE</a>()<font class="keyword"> const</font>
00375 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_PHONE); };
00376 
00377         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00378"></a><a class="code" href="class_RTPSource.html#a12">00378</a>         <a class="code" href="class_RTPSource.html#a12">getLOC</a>()<font class="keyword"> const</font>
00379 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_LOC); };
00380 
00381         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00382"></a><a class="code" href="class_RTPSource.html#a13">00382</a>         <a class="code" href="class_RTPSource.html#a13">getTOOL</a>()<font class="keyword"> const</font>
00383 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_TOOL); };
00384 
00385         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00386"></a><a class="code" href="class_RTPSource.html#a14">00386</a>         <a class="code" href="class_RTPSource.html#a14">getNOTE</a>()<font class="keyword"> const</font>
00387 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_NOTE); };
00388 
00389         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00390"></a><a class="code" href="class_RTPSource.html#a15">00390</a>         <a class="code" href="class_RTPSource.html#a15">getPRIV</a>()<font class="keyword"> const</font>
00391 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_PRIV); };
00392 
00393         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00394"></a><a class="code" href="class_RTPSource.html#a16">00394</a>         <a class="code" href="class_RTPSource.html#a16">getH323_CADDR</a>()<font class="keyword"> const</font>
00395 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_RTPSource.html#a7">getSDESItem</a>(RTCP_SDES_ITEM_H323_CADDR); };
00396 
00400         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00401"></a><a class="code" href="class_RTPSource.html#a17">00401</a>         <a class="code" href="class_RTPSource.html#a17">isSender</a>()<font class="keyword"> const</font>
00402 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active_sender; };
00403 
<a name="l00404"></a><a class="code" href="class_RTPSource.html#a18">00404</a>         <font class="keywordtype">bool</font> <a class="code" href="class_RTPSource.html#a18">isValid</a>()<font class="keyword"> const</font>
00405 <font class="keyword">        </font>{ <font class="keywordflow">return</font> valid; };
00406 
00407         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00408"></a><a class="code" href="class_RTPSource.html#a19">00408</a>         <a class="code" href="class_RTPSource.html#a19">operator==</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;rhs)<font class="keyword"> const</font>
00409 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (<font class="keyword">this</font> == &amp;rhs); }
00410 
00411         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00412"></a><a class="code" href="class_RTPSource.html#a20">00412</a>         <a class="code" href="class_RTPSource.html#a20">operator!=</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;rhs)<font class="keyword"> const</font>
00413 <font class="keyword">        </font>{ <font class="keywordflow">return</font> !(*<font class="keyword">this</font> == rhs); }
00414 
00415 <font class="keyword">protected</font>:
00416                 
00417 <font class="keyword">private</font>:
00421         <a class="code" href="class_RTPSource.html#c0">RTPSource</a>(uint32 ssrc); 
00422 
00426         <a class="code" href="class_RTPSource.html#c1">~RTPSource</a>();
00427 
00431         <a class="code" href="class_RTPSource.html#c0">RTPSource</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp; origin);
00432 
00433         <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
00434         <a class="code" href="class_RTPSource.html#c3">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;origin);
00435 
00443         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00444"></a><a class="code" href="class_RTPSource.html#c4">00444</a>         <a class="code" href="class_RTPSource.html#c4">setCurrentKitchenSize</a>(uint32 s)<font class="keyword"></font>
00445 <font class="keyword">        </font>{ currentkitchen = s; };
00446 
00450         <font class="keywordtype">void</font> <a class="code" href="class_RTPSource.html#c5">endSource</a>();
00451 
00452         <font class="keywordtype">void</font>
00453         <a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(sdes_item_type_t item, <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> value);
00454 
00463         <font class="keywordtype">void</font> 
00464         <a class="code" href="class_RTPSource.html#c7">recordReception</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>&amp; p);
00465 
00475         <font class="keywordtype">void</font> 
00476         <a class="code" href="class_RTPSource.html#c8">recordInsertion</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>&amp; p);
00477 
00485         <font class="keywordtype">void</font> 
00486         <a class="code" href="class_RTPSource.html#c9">recordExtraction</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>&amp; p);
00487 
00491         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00492"></a><a class="code" href="class_RTPSource.html#c10">00492</a>         <a class="code" href="class_RTPSource.html#c10">setSender</a>(<font class="keywordtype">bool</font> active)<font class="keyword"></font>
00493 <font class="keyword">        </font>{ active_sender = active; };
00494 
00500         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l00501"></a><a class="code" href="class_RTPSource.html#c11">00501</a>         <a class="code" href="class_RTPSource.html#c11">setInitialTimestamp</a>(uint32 ts)<font class="keyword"></font>
00502 <font class="keyword">        </font>{ initial_timestamp = ts; }
00503 
00512         <font class="keyword">inline</font> uint32 
<a name="l00513"></a><a class="code" href="class_RTPSource.html#c12">00513</a>         <a class="code" href="class_RTPSource.html#c12">getInitialTimestamp</a>()<font class="keyword"></font>
00514 <font class="keyword">        </font>{<font class="keywordflow">return</font> initial_timestamp; }
00515 
00522         <font class="keyword">inline</font> uint16
<a name="l00523"></a><a class="code" href="class_RTPSource.html#c13">00523</a>         <a class="code" href="class_RTPSource.html#c13">getExpectedSeqNum</a>()<font class="keyword"></font>
00524 <font class="keyword">        </font>{ <font class="keywordflow">return</font> expectedseqnum; }
00525 
00532         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00533"></a><a class="code" href="class_RTPSource.html#c14">00533</a>         <a class="code" href="class_RTPSource.html#c14">setExpectedSeqNum</a>(uint16 n)<font class="keyword"></font>
00534 <font class="keyword">        </font>{ expectedseqnum = n; }
00535 
00536         <font class="comment">// SSRC 32 bit identifier carried in RTP and RTCP packets (in</font>
00537         <font class="comment">// network order)</font>
<a name="l00538"></a><a class="code" href="class_RTPSource.html#o0">00538</a>         uint32 ssrc;
00539         <font class="comment">// timestamp of the first packet received from this source</font>
<a name="l00540"></a><a class="code" href="class_RTPSource.html#o1">00540</a>         uint32 initial_timestamp; 
00541         <font class="comment">// number of packets received from this source</font>
<a name="l00542"></a><a class="code" href="class_RTPSource.html#o2">00542</a>         uint32 packet_count;
00543         <font class="comment">// time the last packet was received at</font>
<a name="l00544"></a><a class="code" href="class_RTPSource.html#o3">00544</a>         <font class="keyword">struct </font>timeval last_time;
00545         <font class="comment">// required kitchen for this source. Represented as octets,</font>
00546         <font class="comment">// given the current transmission rate</font>
<a name="l00547"></a><a class="code" href="class_RTPSource.html#o4">00547</a>         uint32 kitchensize;
00548         <font class="comment">// current kitchen for this source. Represented as octets,</font>
00549         <font class="comment">// given the current transmission rate</font>
<a name="l00550"></a><a class="code" href="class_RTPSource.html#o5">00550</a>         uint32 currentkitchen;
00551         <font class="comment">// the expected sequence number of the next packet to be received.</font>
<a name="l00552"></a><a class="code" href="class_RTPSource.html#o6">00552</a>         uint16 expectedseqnum;  
00553 
00554         <font class="comment">// before becoming valid, multiple packets from this source, </font>
00555         <font class="comment">// or an SDES RTCP containing its CNAME should be received.</font>
<a name="l00556"></a><a class="code" href="class_RTPSource.html#o7">00556</a>         <font class="keywordtype">bool</font> valid; 
00557         <font class="comment">// A valid source not always is active</font>
<a name="l00558"></a><a class="code" href="class_RTPSource.html#o8">00558</a>         <font class="keywordtype">bool</font> active_sender;
00559 
00560         <font class="comment">// Sources located before and after this one in the list</font>
00561         <font class="comment">// of sources.</font>
<a name="l00562"></a><a class="code" href="class_RTPSource.html#o9">00562</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>* prev, * next;
00563         <font class="comment">// first/last packets from this source in the queue </font>
<a name="l00564"></a><a class="code" href="class_RTPSource.html#o12">00564</a>         <a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>* first, * last;
00565         <font class="comment">// Prev and next inside the collision list</font>
<a name="l00566"></a><a class="code" href="class_RTPSource.html#o13">00566</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>* nextcollis;  
00567         <font class="comment">// dummy content for undetermined descriptors</font>
<a name="l00568"></a><a class="code" href="class_RTPSource.html#r0">00568</a>         <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> unknown;
00569         <font class="comment">// sender info from the last sender report of this source  </font>
<a name="l00570"></a><a class="code" href="class_RTPSource.html#o14">00570</a>         <a class="code" href="struct_SenderInfo.html">SenderInfo</a>* sender_info;
00571         <font class="comment">// dummy content for the last sender info from this source</font>
<a name="l00572"></a><a class="code" href="class_RTPSource.html#r1">00572</a>         <font class="keyword">static</font> <font class="keyword">const</font> <a class="code" href="struct_SenderInfo.html">SenderInfo</a>* dummySI;
00573         <font class="comment">// last report block this source sent about the local source</font>
<a name="l00574"></a><a class="code" href="class_RTPSource.html#o15">00574</a>         <a class="code" href="struct_ReceiverInfo.html">ReceiverInfo</a>* receiver_info;
00575         <font class="comment">// dummy content for the last report from this source</font>
<a name="l00576"></a><a class="code" href="class_RTPSource.html#r2">00576</a>         <font class="keyword">static</font> <font class="keyword">const</font> <a class="code" href="struct_ReceiverInfo.html">ReceiverInfo</a>* dummyRB;
00577         <font class="comment">// Data extracted from the SDES items sent by this source</font>
<a name="l00578"></a><a class="code" href="class_RTPSource.html#o16">00578</a>         <font class="keywordtype">char</font> **sdes_items;
00579         
<a name="l00580"></a><a class="code" href="class_RTPSource.html#l0">00580</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_MembershipControl.html">MembershipControl</a>;
<a name="l00581"></a><a class="code" href="class_RTPSource.html#o17">00581</a>         <font class="keyword">friend</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a>;
<a name="l00582"></a><a class="code" href="class_RTPSource.html#o18">00582</a>         <font class="keyword">friend</font> <a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a>;
<a name="l00583"></a><a class="code" href="class_RTPSource.html#o19">00583</a>         <font class="keyword">friend</font> <a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>;
00584 };
00585 
00586 <font class="comment">// TODO: implement this idea</font>
<a name="l00587"></a><a class="code" href="class_Members.html">00587</a> <font class="keyword">class </font><a class="code" href="class_Members.html">Members</a>
00588 {
00589 <font class="keyword">public</font>:
00590 
<a name="l00591"></a><a class="code" href="class_Members.html#a0">00591</a>         <a class="code" href="class_Members.html#a0">Members</a>() :     
00592                 members(static_cast&lt;uint32&gt;(-1)), <font class="comment">// -1 to counteract dummysource</font>
00593                 active_senders(0)
00594         { };
00599         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00600"></a><a class="code" href="class_Members.html#a1">00600</a>         <a class="code" href="class_Members.html#a1">increaseMembersCount</a>()<font class="keyword"></font>
00601 <font class="keyword">        </font>{ members++; };
00602 
00607         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00608"></a><a class="code" href="class_Members.html#a2">00608</a>         <a class="code" href="class_Members.html#a2">decreaseMembersCount</a>()<font class="keyword"></font>
00609 <font class="keyword">        </font>{ members--; };
00610 
00611         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00612"></a><a class="code" href="class_Members.html#a3">00612</a>         <a class="code" href="class_Members.html#a3">setMembersCount</a>(uint32 n)<font class="keyword"></font>
00613 <font class="keyword">        </font>{ members = n; };
00614 
00615         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00616"></a><a class="code" href="class_Members.html#a4">00616</a>         <a class="code" href="class_Members.html#a4">increaseSendersCount</a>()<font class="keyword"></font>
00617 <font class="keyword">        </font>{ active_senders++; };
00618 
00619         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00620"></a><a class="code" href="class_Members.html#a5">00620</a>         <a class="code" href="class_Members.html#a5">decreaseSendersCount</a>()<font class="keyword"></font>
00621 <font class="keyword">        </font>{ active_senders--; };
00622 
00623         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00624"></a><a class="code" href="class_Members.html#a6">00624</a>         <a class="code" href="class_Members.html#a6">setSendersCount</a>(uint32 n)<font class="keyword"></font>
00625 <font class="keyword">        </font>{ active_senders = n; };
00626 
00627 
00632         <font class="keyword">inline</font> uint32 
<a name="l00633"></a><a class="code" href="class_Members.html#a7">00633</a>         <a class="code" href="class_Members.html#a7">membersCount</a>()<font class="keyword"> const</font>
00634 <font class="keyword">        </font>{ <font class="keywordflow">return</font> members; };
00635         
00636         <font class="keyword">inline</font> uint32
<a name="l00637"></a><a class="code" href="class_Members.html#a8">00637</a>         <a class="code" href="class_Members.html#a8">sendersCount</a>()<font class="keyword"> const</font>
00638 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active_senders; };
00639 
00640 
00641         <font class="comment">// number of identified members</font>
<a name="l00642"></a><a class="code" href="class_Members.html#m0">00642</a>         uint32 members;
00643         <font class="comment">// number of identified members that currently are active senders</font>
<a name="l00644"></a><a class="code" href="class_Members.html#m1">00644</a>         uint32 active_senders;
00645 };
00646 
<a name="l00671"></a><a class="code" href="class_MembershipControl.html">00671</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_MembershipControl.html">MembershipControl</a> : <font class="keyword">public</font> <a class="code" href="class_Members.html">Members</a>
00672 {
00673 <font class="keyword">public</font>:
00682         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
<a name="l00683"></a><a class="code" href="class_MembershipControl.html#a0">00683</a>         <a class="code" href="class_MembershipControl.html#a0">getSource</a>(uint32 ssrc)<font class="keyword"> const</font>
00684 <font class="keyword">        </font>{ <font class="keywordflow">return</font> const_cast&lt;MembershipControl*&gt;(<font class="keyword">this</font>)-&gt;getSourceBySSRC(ssrc,<font class="keyword">false</font>); }
00685 
00694         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
<a name="l00695"></a><a class="code" href="class_MembershipControl.html#a1">00695</a>         <a class="code" href="class_MembershipControl.html#a1">getOrCreateSource</a>(uint32 ssrc)<font class="keyword"></font>
00696 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_MembershipControl.html#b4">getSourceBySSRC</a>(ssrc,<font class="keyword">true</font>); }
00697 
00698 <font class="keyword">protected</font>:
00704         <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
00705         <a class="code" href="class_MembershipControl.html#b0">addNewSource</a>(uint32 ssrc);
00706 
00720         <a class="code" href="class_MembershipControl.html#b1">MembershipControl</a>(uint32 initial_size = 7);
00721 
00727         <font class="keyword">virtual</font>
00728         <a class="code" href="class_MembershipControl.html#b2">~MembershipControl</a>();
00729 
00734         <font class="keywordtype">void</font>
00735         <a class="code" href="class_MembershipControl.html#b3">endMembers</a>();
00736 
00746         <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
00747         <a class="code" href="class_MembershipControl.html#b4">getSourceBySSRC</a>(uint32 ssrc, <font class="keywordtype">bool</font> create = <font class="keyword">false</font>);
00748 
00756         <font class="keywordtype">bool</font>
00757         <a class="code" href="class_MembershipControl.html#b5">removeSource</a>(uint32 ssrc);
00758 
00759         <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
<a name="l00760"></a><a class="code" href="class_MembershipControl.html#b6">00760</a>         <a class="code" href="class_MembershipControl.html#b6">NullSource</a>()<font class="keyword"> const</font>
00761 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dummysource; };
00762 
00763         <font class="comment">// an empty RTPSource representing unidentified sources</font>
<a name="l00764"></a><a class="code" href="class_MembershipControl.html#q0">00764</a>         <font class="keyword">const</font> <font class="keyword">static</font> <a class="code" href="class_RTPSource.html">RTPSource</a> dummysource;
00765 
00766 <font class="keyword">private</font>:
00767 
00768         <a class="code" href="class_MembershipControl.html#b1">MembershipControl</a>(<font class="keyword">const</font> <a class="code" href="class_MembershipControl.html">MembershipControl</a> &amp;o);
00769 
00770         <a class="code" href="class_MembershipControl.html">MembershipControl</a>&amp;
00771         <a class="code" href="class_MembershipControl.html#c1">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_MembershipControl.html">MembershipControl</a> &amp;o);
00772 
00773         <font class="comment">// Hash table with sources of RTP and RTCP packets</font>
<a name="l00774"></a><a class="code" href="class_MembershipControl.html#o0">00774</a>         uint32 SOURCE_BUCKETS; 
<a name="l00775"></a><a class="code" href="class_MembershipControl.html#o1">00775</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>** sources;
00776         <font class="comment">// List of sources, ordered from older to newer</font>
<a name="l00777"></a><a class="code" href="class_MembershipControl.html#o3">00777</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>* first, * last;
00778 };
00779 
<a name="l00805"></a><a class="code" href="class_RTPQueue.html">00805</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_RTPQueue.html">RTPQueue</a> : <font class="keyword">protected</font> <a class="code" href="class_Thread.html">Thread</a>, <font class="keyword">protected</font> <a class="code" href="class_MembershipControl.html">MembershipControl</a>
00806 {
00807 <font class="keyword">public</font>:
00813         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp; 
<a name="l00814"></a><a class="code" href="class_RTPQueue.html#a0">00814</a>         <a class="code" href="class_RTPQueue.html#a0">getLocalInfo</a>()<font class="keyword"> const</font>
00815 <font class="keyword">        </font>{ <font class="keywordflow">return</font> *localsrc; };
00816 
00823         <font class="keywordtype">bool</font> 
00824         <a class="code" href="class_RTPQueue.html#a1">isWaiting</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource) <font class="keyword">const</font>;
00825 
00834         <font class="keywordtype">bool</font> 
00835         <a class="code" href="class_RTPQueue.html#a2">isCookedWaiting</a>(<font class="keywordtype">void</font>) <font class="keyword">const</font>;
00836  
00842         <font class="keywordtype">bool</font> 
00843         <a class="code" href="class_RTPQueue.html#a3">isSending</a>(<font class="keywordtype">void</font>) <font class="keyword">const</font>;
00844 
00859         <font class="keywordtype">void</font> 
00860         <a class="code" href="class_RTPQueue.html#a4">putPacket</a>(uint32 stamp, rtp_payload_t payload, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data = NULL, size_t len = 0, <font class="keywordtype">bool</font> mark = <font class="keyword">false</font>);
00861 
00920         <font class="keyword">const</font> <a class="code" href="class_RTPData.html">RTPData</a>&amp;
00921         <a class="code" href="class_RTPQueue.html#a5">getCookedPacket</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00922 
00929         uint32 
00930         <a class="code" href="class_RTPQueue.html#a6">getFirstTimestamp</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00931  
00938         uint16 
00939         <a class="code" href="class_RTPQueue.html#a7">getFirstSequence</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00940 
00948         <font class="keyword">const</font> <a class="code" href="class_RTPData.html">RTPData</a>&amp;
00949         <a class="code" href="class_RTPQueue.html#a8">getPacket</a>(uint32 stamp, <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00950 
00962         size_t 
00963         <a class="code" href="class_RTPQueue.html#a8">getPacket</a>(uint32 stamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t max,
00964                   <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00965 
00973         rtp_payload_t 
00974         <a class="code" href="class_RTPQueue.html#a10">getPayloadType</a>(uint32 timestamp, <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
00975 
01037         uint32 
01038         <a class="code" href="class_RTPQueue.html#a11">getCurrentTimestamp</a>(rtp_payload_t pt) <font class="keyword">const</font>;
01039 
01048         uint32
01049         <a class="code" href="class_RTPQueue.html#a12">getTimestampIncrement</a>(size_t packet_size) <font class="keyword">const</font>;
01050 
01058         <font class="keywordtype">void</font>
<a name="l01059"></a><a class="code" href="class_RTPQueue.html#a13">01059</a>         <a class="code" href="class_RTPQueue.html#a13">setSessionBandwidth</a>(uint32 bw)<font class="keyword"></font>
01060 <font class="keyword">        </font>{ sessionbw = bw; };
01061 
01074         uint32 
01075         <a class="code" href="class_RTPQueue.html#a14">getRate</a>(rtp_payload_t pt = RTP_PAYLOAD_EMPTY) <font class="keyword">const</font>;
01076 
01083         rtp_payload_t
01084         <a class="code" href="class_RTPQueue.html#a10">getPayloadType</a>(<font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp; src) <font class="keyword">const</font>;
01085 
01094         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a>&amp;
<a name="l01095"></a><a class="code" href="class_RTPQueue.html#a16">01095</a>         <a class="code" href="class_MembershipControl.html#a0">getSource</a>(uint32 ssrc)<font class="keyword"> const</font>
01096 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_MembershipControl.html#a0">MembershipControl::getSource</a>(htonl(ssrc)); };
01097 
01110         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l01111"></a><a class="code" href="class_RTPQueue.html#a17">01111</a>         <a class="code" href="class_RTPQueue.html#a17">setTypeOfService</a>(type_of_service_t tos)<font class="keyword"></font>
01112 <font class="keyword">        </font>{ type_of_service = tos; }
01113  
01124         size_t 
01125         <a class="code" href="class_RTPQueue.html#a18">setPartial</a>(uint32 timestamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t offset, size_t max);
01126 
01138         size_t 
01139         <a class="code" href="class_RTPQueue.html#a19">getPartial</a>(uint32 timestamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t offset, size_t max);
01140 
01146         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01147"></a><a class="code" href="class_RTPQueue.html#a20">01147</a>         <a class="code" href="class_RTPQueue.html#a20">isActive</a>(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
01148 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active; };
01149 
01156         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01157"></a><a class="code" href="class_RTPQueue.html#a21">01157</a>         <a class="code" href="class_RTPQueue.html#a21">setTimeout</a>(microtimeout_t t)<font class="keyword"></font>
01158 <font class="keyword">        </font>{ timeout = t;};
01159 
01168         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01169"></a><a class="code" href="class_RTPQueue.html#a22">01169</a>         <a class="code" href="class_RTPQueue.html#a22">setExpired</a>(microtimeout_t t)<font class="keyword"></font>
01170 <font class="keyword">        </font>{ expired = t;};
01171 
01195         <font class="keywordtype">void</font>
01196         <a class="code" href="class_RTPQueue.html#a23">setGlobalKitchenDuration</a>(microtimeout_t t);
01197 
01198         <font class="keywordtype">void</font>
01199         <a class="code" href="class_RTPQueue.html#a24">setGlobalKitchenSize</a>(uint32 s);
01200 
01209         <font class="keyword">inline</font> microtimeout_t
<a name="l01210"></a><a class="code" href="class_RTPQueue.html#a25">01210</a>         <a class="code" href="class_RTPQueue.html#a25">getGlobalKitchenDuration</a>()<font class="keyword"> const</font>
01211 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((kitchensize * 1000) / <a class="code" href="class_RTPQueue.html#a14">getRate</a>())*1000); };
01212         
01227         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l01228"></a><a class="code" href="class_RTPQueue.html#a26">01228</a>         <a class="code" href="class_RTPQueue.html#a26">setEndToEndDelay</a>(microtimeout_t t)<font class="keyword"></font>
01229 <font class="keyword">                </font>{ e2edelay = t; };
01230 
01236         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01237"></a><a class="code" href="class_RTPQueue.html#a27">01237</a>         <a class="code" href="class_RTPQueue.html#a27">setSegmentSize</a>(size_t size)<font class="keyword"></font>
01238 <font class="keyword">                </font>{segment = size;};
01239 
01250         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01251"></a><a class="code" href="class_RTPQueue.html#a28">01251</a>         <a class="code" href="class_RTPQueue.html#a28">isComplete</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01252 <font class="keyword">                </font>{<font class="keywordflow">return</font> complete;};
01253 
01262         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01263"></a><a class="code" href="class_RTPQueue.html#a29">01263</a>         <a class="code" href="class_RTPQueue.html#a29">isMarked</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01264 <font class="keyword">                </font>{<font class="keywordflow">return</font> marked;};
01265 
01269         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01270"></a><a class="code" href="class_RTPQueue.html#a30">01270</a>         <a class="code" href="class_RTPQueue.html#a30">setTimeclock</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01271 <font class="keyword">                </font>{timeclock.setTimer();};
01272  
01278         <font class="keyword">inline</font> timeout_t 
<a name="l01279"></a><a class="code" href="class_RTPQueue.html#a31">01279</a>         <a class="code" href="class_RTPQueue.html#a31">getTimeclock</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01280 <font class="keyword">                </font>{<font class="keywordflow">return</font> timeclock.getElapsed();};
01281         
01287         <font class="keyword">inline</font> uint32
<a name="l01288"></a><a class="code" href="class_RTPQueue.html#a32">01288</a>         <a class="code" href="class_RTPQueue.html#a32">RTPSendCount</a>()<font class="keyword"> const</font>
01289 <font class="keyword">        </font>{ <font class="keywordflow">return</font> sendcount;};
01290 
01297         <font class="keyword">inline</font> uint32
<a name="l01298"></a><a class="code" href="class_RTPQueue.html#a33">01298</a>         <a class="code" href="class_RTPQueue.html#a33">RTPOctetCount</a>()<font class="keyword"> const</font>
01299 <font class="keyword">        </font>{ <font class="keywordflow">return</font> octetcount;};
01300 
01301 <font class="keyword">protected</font>:
01302         
01310         <a class="code" href="class_RTPQueue.html#b0">RTPQueue</a>(<font class="keywordtype">int</font> pri, uint32 size = 7);
01311 
01328         <a class="code" href="class_RTPQueue.html#b0">RTPQueue</a>(uint32 ssrc, <font class="keywordtype">int</font> pri, uint32 size = 7);
01329         
01333         <font class="keyword">virtual</font> 
01334         <a class="code" href="class_RTPQueue.html#b2">~RTPQueue</a>(); 
01335 
01342         <font class="keyword">virtual</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01343"></a><a class="code" href="class_RTPQueue.html#b3">01343</a>         <a class="code" href="class_RTPQueue.html#b3">RTCPService</a>(microtimeout_t&amp; wait)<font class="keyword"></font>
01344 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; };
01345 
01349         <font class="keyword">virtual</font> <font class="keywordtype">void</font> 
<a name="l01350"></a><a class="code" href="class_RTPQueue.html#b4">01350</a>         <a class="code" href="class_RTPQueue.html#b4">Bye</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason)<font class="keyword"></font>
01351 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01352 
<a name="l01356"></a><a class="code" href="class_RTPQueue.html#b5">01356</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_RTPQueue.html#b5">timerTick</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01357 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; };
01358 
01368         microtimeout_t
01369         <a class="code" href="class_RTPQueue.html#b6">getTimeout</a>(<font class="keywordtype">void</font>);
01370 
01378         <font class="keyword">virtual</font> <font class="keywordtype">bool</font>
01379         <a class="code" href="class_RTPQueue.html#b7">isPendingData</a>(microtimeout_t timeout) = 0;
01380 
01387         <font class="keywordtype">void</font> <a class="code" href="class_RTPQueue.html#b8">Purge</a>(rtp_purge_t flag);
01388 
01395         size_t
01396         <a class="code" href="class_RTPQueue.html#b9">sendPacket</a>(<font class="keywordtype">void</font>);
01397 
01407         <font class="keyword">virtual</font> size_t
01408         <a class="code" href="class_RTPQueue.html#b10">writeData</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> packet, size_t len) = 0;
01409 
01416         size_t
01417         <a class="code" href="class_RTPQueue.html#b11">recvPacket</a>(<font class="keywordtype">void</font>);
01418 
01428         <font class="keyword">virtual</font> size_t
01429         <a class="code" href="class_RTPQueue.html#b12">readData</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len) = 0;
01430 
01439         <font class="keyword">virtual</font> <font class="keywordtype">bool</font>
<a name="l01440"></a><a class="code" href="class_RTPQueue.html#b13">01440</a>         <a class="code" href="class_RTPQueue.html#b13">gotPacket</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>* packet)<font class="keyword"></font>
01441 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <font class="keyword">true</font>; }
01442 
<a name="l01448"></a><a class="code" href="class_RTPQueue.html#b14">01448</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_RTPQueue.html#b14">expireSend</a>(<a class="code" href="class_OutgoingRTPPkt.html">OutgoingRTPPkt</a> *packet)<font class="keyword"></font>
01449 <font class="keyword">                </font>{<font class="keywordflow">return</font>;};
01450 
<a name="l01457"></a><a class="code" href="class_RTPQueue.html#b15">01457</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> <a class="code" href="class_RTPQueue.html#b15">expireRecv</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a> *packet)<font class="keyword"></font>
01458 <font class="keyword">                </font>{<font class="keywordflow">return</font> ;};
01459 
01469         <a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>*
01470         <a class="code" href="class_RTPQueue.html#b16">getWaiting</a>(uint32 timestamp, <font class="keyword">const</font> <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;src = dummysource);
01471 
01475         <font class="keywordtype">void</font>
01476         <a class="code" href="class_RTPQueue.html#b17">endQueue</a>();
01477 
<a name="l01481"></a><a class="code" href="class_RTPQueue.html#b18">01481</a>         <font class="keywordtype">void</font> <a class="code" href="class_RTPQueue.html#b18">Final</a>()<font class="keyword"></font>
01482 <font class="keyword">        </font>{ <font class="keyword">delete</font> <font class="keyword">this</font>; };
01483 
01484         <font class="comment">// true if connection "active"</font>
<a name="l01485"></a><a class="code" href="class_RTPQueue.html#n0">01485</a>         <font class="keyword">volatile</font> <font class="keywordtype">bool</font> active;       
01486         <font class="comment">// Object representing the local source</font>
<a name="l01487"></a><a class="code" href="class_RTPQueue.html#n1">01487</a>         <a class="code" href="class_RTPSource.html">RTPSource</a>* localsrc;
01488         <font class="comment">// when the queue is created</font>
<a name="l01489"></a><a class="code" href="class_RTPQueue.html#n2">01489</a>         <font class="keyword">struct </font>timeval initial_time;  
<a name="l01490"></a><a class="code" href="class_RTPQueue.html#n3">01490</a>         uint32 current_rate;
01491         <font class="comment">// ramdonly generated offset for the timestamp of sent packets</font>
<a name="l01492"></a><a class="code" href="class_RTPQueue.html#n4">01492</a>         uint32 initial_timestamp;
01493 
01494 <font class="keyword">private</font>:
<a name="l01495"></a><a class="code" href="class_RTPQueue.html#o0">01495</a>         <font class="keyword">friend</font> <a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>;
01496 
01497         <a class="code" href="class_RTPQueue.html#b0">RTPQueue</a>(<font class="keyword">const</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a> &amp;o);
01498 
01499         <a class="code" href="class_RTPQueue.html">RTPQueue</a>&amp;
01500         <a class="code" href="class_MembershipControl.html#c1">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a> &amp;o);
01501 
01507         <font class="keywordtype">void</font>
01508         <a class="code" href="class_RTPQueue.html#c2">initQueue</a>(uint32 localssrc);
01509 
01513         <font class="keywordtype">void</font> 
01514         <a class="code" href="class_RTPQueue.html#c3">Run</a>(<font class="keywordtype">void</font>);
01515         
01516 
01522         <font class="keywordtype">void</font> 
01523         <a class="code" href="class_RTPQueue.html#c4">RTPService</a>(microtimeout_t&amp; wait);
01524         
01533         <font class="keywordtype">void</font> 
01534         <a class="code" href="class_RTPQueue.html#c5">insertRecvPacket</a>(<a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a> *packet);               
01535 
<a name="l01536"></a><a class="code" href="class_RTPQueue.html#o1">01536</a>         type_of_service_t type_of_service;  
<a name="l01537"></a><a class="code" href="class_RTPQueue.html#o2">01537</a>         uint32 sessionbw;
<a name="l01538"></a><a class="code" href="class_RTPQueue.html#o3">01538</a>         rtp_cast_t sessioncast;
01539 
01540         <font class="comment">// packet receive workspace size</font>
<a name="l01541"></a><a class="code" href="class_RTPQueue.html#r0">01541</a>         <font class="keyword">static</font> <font class="keyword">const</font> size_t RECVBUFFER_SIZE = 8192;     
01542         <font class="comment">// number of packets sent from the beginning</font>
<a name="l01543"></a><a class="code" href="class_RTPQueue.html#o4">01543</a>         uint32 sendcount;
01544         <font class="comment">// number of payload octets sent from the beginning</font>
<a name="l01545"></a><a class="code" href="class_RTPQueue.html#o5">01545</a>         uint32 octetcount;
01546 
01547         <font class="comment">// transmission and reception queues</font>
<a name="l01548"></a><a class="code" href="class_RTPQueue.html#o7">01548</a>         <a class="code" href="class_OutgoingRTPPkt.html">OutgoingRTPPkt</a>* sendfirst, * sendlast; 
<a name="l01549"></a><a class="code" href="class_RTPQueue.html#o9">01549</a>         <a class="code" href="class_IncomingRTPPkt.html">IncomingRTPPkt</a>* recvfirst, * recvlast;
<a name="l01550"></a><a class="code" href="class_RTPQueue.html#o10">01550</a>         <font class="keyword">mutable</font> Mutex sendlock, recvlock;
01551         <font class="comment">// the sequence number of the next packet to sent</font>
<a name="l01552"></a><a class="code" href="class_RTPQueue.html#o12">01552</a>         uint16 sendseq;    
01553         <font class="comment">// contributing sources</font>
<a name="l01554"></a><a class="code" href="class_RTPQueue.html#o13">01554</a>         uint32 sendsources[16];
01555         <font class="comment">// how many CSRCs to send.</font>
<a name="l01556"></a><a class="code" href="class_RTPQueue.html#o14">01556</a>         <font class="keywordtype">unsigned</font> sendcc;       
01557         <font class="comment">// maximum packet size before fragmenting sends.</font>
<a name="l01558"></a><a class="code" href="class_RTPQueue.html#o15">01558</a>         <font class="keywordtype">unsigned</font> segment;      
01559         <font class="comment">// bit M in RTP fixed header of the last packet</font>
<a name="l01560"></a><a class="code" href="class_RTPQueue.html#o16">01560</a>         <font class="keywordtype">bool</font> marked;
01561         <font class="comment">// whether there was not loss</font>
<a name="l01562"></a><a class="code" href="class_RTPQueue.html#o17">01562</a>         <font class="keywordtype">bool</font> complete;
01563         
<a name="l01564"></a><a class="code" href="class_RTPQueue.html#o18">01564</a>         TimerPort timeclock;
01565 
01566         <font class="comment">// elapsed time accumulated through successive overflows of</font>
01567         <font class="comment">// the local timestamp field</font>
<a name="l01568"></a><a class="code" href="class_RTPQueue.html#o19">01568</a>         <font class="keyword">struct </font>timeval overflow_time; 
01569 
01570         <font class="comment">// transmission scheduling timeout for the service thread</font>
<a name="l01571"></a><a class="code" href="class_RTPQueue.html#o20">01571</a>         microtimeout_t timeout;
01572         <font class="comment">// how old a packet can reach in the sending queue before deletetion</font>
<a name="l01573"></a><a class="code" href="class_RTPQueue.html#o21">01573</a>         microtimeout_t expired;
01574         
01575         <font class="comment">// Maximun delay allowed between packet timestamping and</font>
01576         <font class="comment">// packet availability for the application.</font>
<a name="l01577"></a><a class="code" href="class_RTPQueue.html#o22">01577</a>         microtimeout_t e2edelay;  
01578         <font class="comment">// Kitchen (reordering buffer) size in octets, given the</font>
01579         <font class="comment">// current transmission rate.</font>
<a name="l01580"></a><a class="code" href="class_RTPQueue.html#o23">01580</a>         uint32 kitchensize;
01581 
01582         <font class="comment">// this is a global table holding the </font>
01583         <font class="comment">// `payload_type &lt;-&gt; timestamp_rate' correpondence for </font>
01584         <font class="comment">// the statically assigned payload types</font>
<a name="l01585"></a><a class="code" href="class_RTPQueue.html#r1">01585</a>         <font class="keyword">static</font> uint32 payload_rate[96];
01586 };
01587 
<a name="l01607"></a><a class="code" href="class_QueueRTCPManager.html">01607</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a> : <font class="keyword">public</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a>
01608 {
01609 <font class="keyword">public</font>:
01627         <font class="keyword">virtual</font> <font class="keywordtype">void</font>
<a name="l01628"></a><a class="code" href="class_QueueRTCPManager.html#a0">01628</a>         <a class="code" href="class_QueueRTCPManager.html#a0">setControlBandwidth</a>(<font class="keywordtype">float</font> fraction)<font class="keyword"></font>
01629 <font class="keyword">        </font>{ controlbw = fraction; };
01630 
01644         <font class="keyword">virtual</font> <font class="keywordtype">void</font>
<a name="l01645"></a><a class="code" href="class_QueueRTCPManager.html#a1">01645</a>         <a class="code" href="class_QueueRTCPManager.html#a1">setSendersControlFraction</a>(<font class="keywordtype">float</font> fraction)<font class="keyword"></font>
01646 <font class="keyword">        </font>{ sendcontrolbw = fraction; recvcontrolbw = 1 - fraction;};
01647 
01653         <font class="keyword">inline</font> uint32
<a name="l01654"></a><a class="code" href="class_QueueRTCPManager.html#a2">01654</a>         <a class="code" href="class_QueueRTCPManager.html#a2">RTCPSendCount</a>()<font class="keyword"> const</font>
01655 <font class="keyword">        </font>{ <font class="keywordflow">return</font> ctrlsendcount; }
01656 
01661         <font class="keywordtype">void</font> <font class="keyword">inline</font>
<a name="l01662"></a><a class="code" href="class_QueueRTCPManager.html#a3">01662</a>         <a class="code" href="class_QueueRTCPManager.html#a3">setNAME</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> name)<font class="keyword"></font>
01663 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_NAME,name); };
01664 
01665         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01666"></a><a class="code" href="class_QueueRTCPManager.html#a4">01666</a>         <a class="code" href="class_QueueRTCPManager.html#a4">setEMAIL</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> email)<font class="keyword"></font>
01667 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_EMAIL,email); };
01668 
<a name="l01669"></a><a class="code" href="class_QueueRTCPManager.html#a5">01669</a>         <font class="keywordtype">void</font> <font class="keyword">inline</font> <a class="code" href="class_QueueRTCPManager.html#a5">setPHONE</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> phone)<font class="keyword"></font>
01670 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_PHONE,phone); };
01671 
01672         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01673"></a><a class="code" href="class_QueueRTCPManager.html#a6">01673</a>         <a class="code" href="class_QueueRTCPManager.html#a6">setLOC</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> loc)<font class="keyword"> </font>
01674 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_LOC,loc); };
01675 
01676         <font class="keywordtype">void</font> <font class="keyword">inline</font>
<a name="l01677"></a><a class="code" href="class_QueueRTCPManager.html#a7">01677</a>         <a class="code" href="class_QueueRTCPManager.html#a7">setTOOL</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> tool)<font class="keyword"></font>
01678 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_TOOL,tool); };
01679 
01680         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01681"></a><a class="code" href="class_QueueRTCPManager.html#a8">01681</a>         <a class="code" href="class_QueueRTCPManager.html#a8">setNOTE</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> note)<font class="keyword"></font>
01682 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_NOTE,note); };
01683 
01684         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01685"></a><a class="code" href="class_QueueRTCPManager.html#a9">01685</a>         <a class="code" href="class_QueueRTCPManager.html#a9">setPRIV</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> priv)<font class="keyword"></font>
01686 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_PRIV,priv); };
01687 
01688         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01689"></a><a class="code" href="class_QueueRTCPManager.html#a10">01689</a>         <a class="code" href="class_QueueRTCPManager.html#a10">setH323_CADDR</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> h323ca)<font class="keyword"></font>
01690 <font class="keyword">        </font>{ localsrc-&gt;<a class="code" href="class_RTPSource.html#c6">setSDESItem</a>(RTCP_SDES_ITEM_H323_CADDR,h323ca); };
01691 
01692 <font class="keyword">protected</font>:
01693         <a class="code" href="class_QueueRTCPManager.html#b0">QueueRTCPManager</a>(<font class="keywordtype">int</font> pri);
01694 
01695         <font class="keyword">virtual</font> 
01696         <a class="code" href="class_QueueRTCPManager.html#b1">~QueueRTCPManager</a>();
01697 
01698         <font class="keywordtype">void</font>
01699         <a class="code" href="class_QueueRTCPManager.html#b2">endQueueRTCPManager</a>();
01700 
01706         <font class="keywordtype">void</font> 
01707         <a class="code" href="class_RTPQueue.html#b3">RTCPService</a>(microtimeout_t&amp; wait);
01708 
01716         <font class="keywordtype">void</font> 
01717         <a class="code" href="class_RTPQueue.html#b4">Bye</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason = NULL);
01718 
01722         <font class="keywordtype">void</font> 
<a name="l01723"></a><a class="code" href="class_QueueRTCPManager.html#b5">01723</a>         <a class="code" href="class_QueueRTCPManager.html#b5">gotHello</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* sdes)<font class="keyword"> </font>
01724 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01725  
01729         <font class="keywordtype">void</font> 
<a name="l01730"></a><a class="code" href="class_QueueRTCPManager.html#b6">01730</a>         <a class="code" href="class_QueueRTCPManager.html#b6">gotGoodbye</a>(<font class="keywordtype">void</font>)<font class="keyword"></font>
01731 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01732 
01736         <font class="keywordtype">void</font>
01737         <a class="code" href="class_QueueRTCPManager.html#b7">handleSSRCCollision</a>();
01738 
01751         <font class="keyword">virtual</font> timeval 
01752         <a class="code" href="class_QueueRTCPManager.html#b8">computeRTCPInterval</a>();
01753 
01754 <font class="keyword">private</font>:
01755         <a class="code" href="class_QueueRTCPManager.html#b0">QueueRTCPManager</a>(<font class="keyword">const</font> <a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a> &amp;o);
01756 
01757         <a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a>&amp;
01758         <a class="code" href="class_MembershipControl.html#c1">operator=</a>(<font class="keyword">const</font> <a class="code" href="class_QueueRTCPManager.html">QueueRTCPManager</a> &amp;o);
01759 
01763         <font class="keywordtype">void</font> 
01764         <a class="code" href="class_QueueRTCPManager.html#c2">setSDESItem</a>(sdes_item_type_t type, <font class="keyword">const</font> <font class="keywordtype">char</font> *<font class="keyword">const</font> value);
01765 
01770         <font class="keywordtype">void</font>
01771         <a class="code" href="class_QueueRTCPManager.html#c3">findCNAME</a>();
01772 
01777         <font class="keywordtype">void</font>
01778         <a class="code" href="class_QueueRTCPManager.html#c4">updateAvgRTCPSize</a>(uint16 len);
01779 
01785         <font class="keywordtype">void</font> 
01786         <a class="code" href="class_QueueRTCPManager.html#c5">ReverseReconsideration</a>();
01787 
01792         <font class="keywordtype">bool</font>
01793         <a class="code" href="class_QueueRTCPManager.html#c6">TimerReconsideration</a>();
01794 
01802         <font class="keywordtype">void</font> 
01803         <a class="code" href="class_QueueRTCPManager.html#c7">TimeOutSSRCs</a>();
01804 
01809         <font class="keywordtype">bool</font>
01810         <a class="code" href="class_QueueRTCPManager.html#c8">getSDES_APP</a>(<a class="code" href="struct_RTCPPacket.html">RTCPPacket</a> &amp;pkt, uint16 &amp;pointer, uint16 len);
01811 
01821         <font class="keywordtype">bool</font>
01822         <a class="code" href="class_QueueRTCPManager.html#c9">getBYE</a>(<a class="code" href="struct_RTCPPacket.html">RTCPPacket</a> &amp;pkt, uint16 &amp;pointer, uint16 len);
01823 
01827         <font class="keywordtype">void</font>
01828         <a class="code" href="class_QueueRTCPManager.html#c10">getOnlyBye</a>();
01829 
01841         <font class="keyword">inline</font> <font class="keyword">virtual</font> uint16
<a name="l01842"></a><a class="code" href="class_QueueRTCPManager.html#c11">01842</a>         <a class="code" href="class_QueueRTCPManager.html#c11">networkHeaderSize</a>()<font class="keyword"></font>
01843 <font class="keyword">        </font>{ <font class="keywordflow">return</font> 20; }
01844 
01856         <font class="keyword">inline</font> <font class="keyword">virtual</font> uint16
<a name="l01857"></a><a class="code" href="class_QueueRTCPManager.html#c12">01857</a>         <a class="code" href="class_QueueRTCPManager.html#c12">transportHeaderSize</a>()<font class="keyword"></font>
01858 <font class="keyword">        </font>{ <font class="keywordflow">return</font> 8; }
01859 
01865         size_t
01866         <a class="code" href="class_QueueRTCPManager.html#c13">sendControl</a>(<font class="keywordtype">void</font>);
01867 
01877         <font class="keywordtype">void</font>
01878         <a class="code" href="class_QueueRTCPManager.html#c14">recvControl</a>(<font class="keywordtype">void</font>);
01879 
01886         <font class="keywordtype">bool</font>
01887         <a class="code" href="class_QueueRTCPManager.html#c15">packReportBlock</a>(uint16&amp; len);
01888 
01904         <font class="keywordtype">bool</font>
01905         <a class="code" href="class_QueueRTCPManager.html#c16">tryAnotherRR</a>(<a class="code" href="struct_RTCPPacket.html">RTCPPacket</a>*&amp; pkt, uint16&amp; len, uint16&amp; blocks);
01906 
01913         <font class="keywordtype">void</font> 
01914         <a class="code" href="class_QueueRTCPManager.html#c17">packSDES</a>(uint16&amp; len);
01915 
01916         size_t
01917         <a class="code" href="class_QueueRTCPManager.html#c18">sendBYE</a>(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason);
01918 
01923         <font class="keyword">virtual</font> size_t 
01924         <a class="code" href="class_QueueRTCPManager.html#c19">writeControl</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> buffer, size_t len) = 0;
01925 
01930         <font class="keyword">virtual</font> size_t 
01931         <a class="code" href="class_QueueRTCPManager.html#c20">readControl</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len) = 0;
01932 
01938         <font class="keyword">virtual</font> <font class="keywordtype">bool</font> 
01939         <a class="code" href="class_QueueRTCPManager.html#c21">isPendingControl</a>(microtimeout_t timeout) = 0;
01940         
01949         <font class="keywordtype">bool</font>
01950         <a class="code" href="class_QueueRTCPManager.html#c22">RTCPHeaderCheck</a>(size_t len);
01951 
01952 
01953         <font class="comment">// path MTU. RTCP packets should not be greater than this</font>
<a name="l01954"></a><a class="code" href="class_QueueRTCPManager.html#o0">01954</a>         uint16 pathMTU;
01955 
01956         <font class="comment">// buffer to hold RTCP compound packets being sent. Allocated</font>
01957         <font class="comment">// at construction time</font>
<a name="l01958"></a><a class="code" href="class_QueueRTCPManager.html#o1">01958</a>         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* rtcpsend_buffer;
01959 
01960         <font class="comment">// buffer to hold RTCP compound packets being</font>
01961         <font class="comment">// received. Allocated at construction time</font>
<a name="l01962"></a><a class="code" href="class_QueueRTCPManager.html#o2">01962</a>         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* rtcprecv_buffer;
01963 
01964         <font class="comment">// whether the RTCP service is active</font>
<a name="l01965"></a><a class="code" href="class_QueueRTCPManager.html#o3">01965</a>         <font class="keywordtype">bool</font> rtcp_active;
01966 
<a name="l01967"></a><a class="code" href="class_QueueRTCPManager.html#o5">01967</a>         <font class="keywordtype">float</font> controlbw, sendcontrolbw, recvcontrolbw;
01968         <font class="comment">// number of RTCP packets sent since the beginning</font>
<a name="l01969"></a><a class="code" href="class_QueueRTCPManager.html#o7">01969</a>         uint32 ctrlsendcount;
01970 
01971         <font class="comment">// Network + transport headers size, typically size of IP +</font>
01972         <font class="comment">// UDP headers</font>
<a name="l01973"></a><a class="code" href="class_QueueRTCPManager.html#o8">01973</a>         uint16 lower_headers_size;
01974         <font class="comment">// state for rtcp timing. Its meaning is defined in RFC ????, 6.3</font>
<a name="l01975"></a><a class="code" href="class_QueueRTCPManager.html#o9">01975</a>         timeval rtcp_tp, rtcp_tc, rtcp_tn;
<a name="l01976"></a><a class="code" href="class_QueueRTCPManager.html#o12">01976</a>         uint32 rtcp_pmembers;
<a name="l01977"></a><a class="code" href="class_QueueRTCPManager.html#o13">01977</a>         uint32 rtcp_bw;
<a name="l01978"></a><a class="code" href="class_QueueRTCPManager.html#o14">01978</a>         <font class="keywordtype">bool</font> rtcp_we_sent;      
<a name="l01979"></a><a class="code" href="class_QueueRTCPManager.html#o15">01979</a>         uint16 rtcp_avg_size;
<a name="l01980"></a><a class="code" href="class_QueueRTCPManager.html#o16">01980</a>         <font class="keywordtype">bool</font> rtcp_initial;
01981         <font class="comment">// last time we checked if there were incoming RTCP packets</font>
<a name="l01982"></a><a class="code" href="class_QueueRTCPManager.html#o17">01982</a>         timeval rtcp_last_check;
01983         <font class="comment">// interval to check if there are incoming RTCP packets</font>
<a name="l01984"></a><a class="code" href="class_QueueRTCPManager.html#o18">01984</a>         timeval rtcp_check_interval;
01985         <font class="comment">// next time to check if there are incoming RTCP packets</font>
<a name="l01986"></a><a class="code" href="class_QueueRTCPManager.html#o19">01986</a>         timeval rtcp_next_check;
01987 
01988         <font class="comment">// value of sendcount at the time of the last RTCP packet transmission</font>
<a name="l01989"></a><a class="code" href="class_QueueRTCPManager.html#o20">01989</a>         uint32 last_sendcount;
01990 
<a name="l01991"></a><a class="code" href="class_QueueRTCPManager.html#o21">01991</a>         uint32 prev_nvalid_sources;
<a name="l01992"></a><a class="code" href="class_QueueRTCPManager.html#o22">01992</a>         timeval rtcp_calculated_interval;
01993         
01994         <font class="comment">// length of CNAME as user@host</font>
<a name="l01995"></a><a class="code" href="class_QueueRTCPManager.html#o23">01995</a>         size_t CNAME_len;
01996 
01997         <font class="comment">// According to timer reconsideration and reverse reconsideration </font>
01998         <font class="comment">// algorithms, sources do not become valid or deleted as soon as</font>
01999         <font class="comment">// they appear or send BYE. </font>
02000         <font class="comment">// number of not yet valid, but noticed sources </font>
<a name="l02001"></a><a class="code" href="class_QueueRTCPManager.html#o24">02001</a>         uint32 nprevalid_srcs;
02002         <font class="comment">// number of valid sources</font>
<a name="l02003"></a><a class="code" href="class_QueueRTCPManager.html#o25">02003</a>         uint32 nvalid_srcs;
02004         <font class="comment">// number of sources having sent a BYE, but not yet deleted</font>
<a name="l02005"></a><a class="code" href="class_QueueRTCPManager.html#o26">02005</a>         uint32 npredeleted_srcs;
02006         <font class="comment">// number of already deleted sources</font>
<a name="l02007"></a><a class="code" href="class_QueueRTCPManager.html#o27">02007</a>         uint32 ndeleted_srcs;
02008         <font class="comment">// minimum interval for transmission of RTCP packets</font>
<a name="l02009"></a><a class="code" href="class_QueueRTCPManager.html#o28">02009</a>         microtimeout_t rtcp_min_interval;
02010 
02011         <font class="comment">// Nember of seconds ellapsed from 1900 to 1970</font>
<a name="l02012"></a><a class="code" href="class_QueueRTCPManager.html#r0">02012</a>         <font class="keyword">const</font> <font class="keyword">static</font> uint32 NTP_EPOCH_OFFSET = static_cast&lt;uint32&gt;(2208992400u);
02013 
02014         <font class="comment">// masks for RTCP header validation</font>
02015 <font class="preprocessor">#if     __BYTE_ORDER == __BIG_ENDIAN</font>
02016 <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_MASK = (0xc000 | 0x2000  | 0xfe);
02017         <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_VALUE = ((RTP_VERSION &lt;&lt; 14) | 
02018                                                 RTCP_TYPE_SR);
02019 <font class="preprocessor">#else</font>
<a name="l02020"></a><a class="code" href="class_QueueRTCPManager.html#r1">02020</a> <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_MASK = (0x00c0 | 0x0020 | 0xfe00);
<a name="l02021"></a><a class="code" href="class_QueueRTCPManager.html#r2">02021</a>         <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_VALUE = ((RTP_VERSION &lt;&lt; 6) | 
02022                                                 (RTCP_TYPE_SR &lt;&lt; 8));
02023 <font class="preprocessor">#endif</font>
<a name="l02024"></a><a class="code" href="class_QueueRTCPManager.html#r3">02024</a> <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 TIMEOUT_MULTIPLIER = 5;
<a name="l02025"></a><a class="code" href="class_QueueRTCPManager.html#r4">02025</a>         <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">double</font> RECONSIDERATION_COMPENSATION = 2.718281828 - 1.5;
02026 };
02027 
<a name="l02040"></a><a class="code" href="class_UDPIPv4Socket.html">02040</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_UDPIPv4Socket.html">UDPIPv4Socket</a>: <font class="keyword">protected</font> <a class="code" href="class_UDPSocket.html">UDPSocket</a> 
02041 {
02042 <font class="keyword">public</font>:
<a name="l02049"></a><a class="code" href="class_UDPIPv4Socket.html#a0">02049</a>         <a class="code" href="class_UDPIPv4Socket.html#a0">UDPIPv4Socket</a>(<font class="keyword">const</font> InetAddress&amp; ia, tpport_t port) : 
02050                 <a class="code" href="class_UDPSocket.html">UDPSocket</a>(ia, port) 
02051         { };
02052 
<a name="l02056"></a><a class="code" href="class_UDPIPv4Socket.html#a1">02056</a>         <a class="code" href="class_UDPIPv4Socket.html#a1">~UDPIPv4Socket</a>()<font class="keyword"> </font>
02057 <font class="keyword">        </font>{ };
02058 
02065         sockerror_t
02066         <a class="code" href="class_UDPIPv4Socket.html#a2">Connect</a>(<font class="keyword">const</font> InetAddress&amp; ia, tpport_t port);
02067         
02071         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02072"></a><a class="code" href="class_UDPIPv4Socket.html#a3">02072</a>         <a class="code" href="class_UDPIPv4Socket.html#a3">isPendingPacket</a>(microtimeout_t timeout)<font class="keyword"></font>
02073 <font class="keyword">        </font>{ <font class="keywordflow">return</font> isPending(SOCKET_PENDING_INPUT, timeout/1000);};
02074         
02078         <font class="keyword">inline</font> size_t 
<a name="l02079"></a><a class="code" href="class_UDPIPv4Socket.html#a4">02079</a>         <a class="code" href="class_UDPIPv4Socket.html#a4">writePacket</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> buffer, size_t len)<font class="keyword"></font>
02080 <font class="keyword">        </font>{return ::send(so, buffer, len, MSG_DONTWAIT);};
02081 
02085         <font class="keyword">inline</font> size_t
<a name="l02086"></a><a class="code" href="class_UDPIPv4Socket.html#a5">02086</a>         <a class="code" href="class_UDPIPv4Socket.html#a5">readPacket</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02087 <font class="keyword">        </font>{return ::read(so, buffer, len);};
02088 
02092         <font class="keyword">inline</font> sockerror_t 
<a name="l02093"></a><a class="code" href="class_UDPIPv4Socket.html#a6">02093</a>         <a class="code" href="class_UDPIPv4Socket.html#a6">setMulticast</a>(<font class="keywordtype">bool</font> enable)<font class="keyword"></font>
02094 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_UDPIPv4Socket.html#a6">setMulticast</a>(enable); };
02095 
02102         <font class="keyword">inline</font> sockerror_t
<a name="l02103"></a><a class="code" href="class_UDPIPv4Socket.html#a7">02103</a>         <a class="code" href="class_UDPIPv4Socket.html#a7">joinGroup</a>(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02104 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Join(ia); };
02105 
02112         <font class="keyword">inline</font> sockerror_t
<a name="l02113"></a><a class="code" href="class_UDPIPv4Socket.html#a8">02113</a>         <a class="code" href="class_UDPIPv4Socket.html#a8">leaveGroup</a>(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02114 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Drop(ia); }; 
02115 
02122         <font class="keyword">inline</font> sockerror_t
<a name="l02123"></a><a class="code" href="class_UDPIPv4Socket.html#a9">02123</a>         <a class="code" href="class_UDPIPv4Socket.html#a9">setMcastTTL</a>(uint8 ttl)<font class="keyword"></font>
02124 <font class="keyword">        </font>{ setTimeToLive(ttl); };
02125 
02129         <font class="keywordtype">void</font> 
<a name="l02130"></a><a class="code" href="class_UDPIPv4Socket.html#a10">02130</a>         <a class="code" href="class_UDPIPv4Socket.html#a10">endSocket</a>()<font class="keyword"></font>
02131 <font class="keyword">        </font>{ UDPSocket::endSocket(); };
02132 };
02133 
02146 template &lt;typename serviceQueue, typename dataSocket, typename controlSocket&gt;
<a name="l02147"></a><a class="code" href="class_T_RTPSocket.html">02147</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_T_RTPSocket.html">T_RTPSocket</a>  : <font class="keyword">public</font> <a class="code" href="class_serviceQueue.html">serviceQueue</a>
02148 {
02149 <font class="keyword">public</font>:
<a name="l02155"></a><a class="code" href="class_T_RTPSocket.html#a0">02155</a>         <a class="code" href="class_T_RTPSocket.html#a0">T_RTPSocket</a>(<font class="keyword">const</font> InetAddress&amp; ia, tpport_t port = 5004, <font class="keywordtype">int</font> pri = 0) :
02156                 <a class="code" href="class_serviceQueue.html">serviceQueue</a>(pri)
02157         {
02158                 base = <a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(port);
02159                 dso = <font class="keyword">new</font> dataSocket(ia,<a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(port));
02160                 cso = <font class="keyword">new</font> controlSocket(ia,<a class="code" href="class_T_RTPSocket.html#c1">odd_port</a>(port + 1));
02161         };
02162         
<a name="l02168"></a><a class="code" href="class_T_RTPSocket.html#a1">02168</a>         <a class="code" href="class_T_RTPSocket.html#a0">T_RTPSocket</a>(<font class="keyword">const</font> InetMcastAddress&amp; bind, tpport_t port = 5004, <font class="keywordtype">int</font> pri = 0)<font class="keyword"></font>
02169 <font class="keyword">        </font>{
02170                 base = <a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(port);
02171                 dso = <font class="keyword">new</font> dataSocket(ia,<a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(port));
02172                 cso = <font class="keyword">new</font> controlSocket(ia,<a class="code" href="class_T_RTPSocket.html#c1">odd_port</a>(port + 1));
02173         };
02174 
<a name="l02178"></a><a class="code" href="class_T_RTPSocket.html#a2">02178</a>         <a class="code" href="class_T_RTPSocket.html#a2">~T_RTPSocket</a>()<font class="keyword"></font>
02179 <font class="keyword">        </font>{ <a class="code" href="class_T_RTPSocket.html#b6">endSocket</a>(); };
02180 
02186         <font class="keyword">inline</font> sockerror_t 
<a name="l02187"></a><a class="code" href="class_T_RTPSocket.html#a3">02187</a>         <a class="code" href="class_T_RTPSocket.html#a3">Connect</a>(<font class="keyword">const</font> InetHostAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02188 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_T_RTPSocket.html#c0">connect</a>(ia,port); };
02189 
02195         <font class="keyword">inline</font> sockerror_t 
<a name="l02196"></a><a class="code" href="class_T_RTPSocket.html#a4">02196</a>         <a class="code" href="class_T_RTPSocket.html#a3">Connect</a>(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02197 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_T_RTPSocket.html#c0">connect</a>(ia,port); };
02198 
02205         <font class="keyword">inline</font> sockerror_t
<a name="l02206"></a><a class="code" href="class_T_RTPSocket.html#a5">02206</a>         <a class="code" href="class_T_RTPSocket.html#a5">joinGroup</a>(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02207 <font class="keyword">        </font>{ 
02208                 sockerror_t error  = dso-&gt;setMulticast(<font class="keyword">true</font>);
02209                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02210                 error = dso-&gt;joinGroup(ia); 
02211                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02212                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);
02213                 <font class="keywordflow">if</font> ( error ) {
02214                         dso-&gt;leaveGroup(ia);
02215                         <font class="keywordflow">return</font> error;
02216                 }
02217                 error = cso-&gt;joinGroup(ia);
02218                 <font class="keywordflow">if</font> ( error ) {
02219                         dso-&gt;leaveGroup(ia);
02220                         <font class="keywordflow">return</font> error;
02221                 }
02222                 <font class="keywordflow">return</font> <a class="code" href="class_T_RTPSocket.html#a3">Connect</a>(ia,port);
02223         };
02224 
02231         <font class="keyword">inline</font> sockerror_t
<a name="l02232"></a><a class="code" href="class_T_RTPSocket.html#a6">02232</a>         <a class="code" href="class_T_RTPSocket.html#a6">leaveGroup</a>(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02233 <font class="keyword">        </font>{ 
02234                 sockerror_t error = dso-&gt;setMulticast(<font class="keyword">true</font>);
02235                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02236                 error = dso-&gt;leaveGroup(ia); 
02237                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02238                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);
02239                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> errror;
02240                 <font class="keywordflow">return</font> cso-&gt;leaveGroup(ia);
02241         };
02242 
02249         <font class="keyword">inline</font> sockerror_t
<a name="l02250"></a><a class="code" href="class_T_RTPSocket.html#a7">02250</a>         <a class="code" href="class_T_RTPSocket.html#a7">setMcastTTL</a>(uint8 ttl)<font class="keyword"></font>
02251 <font class="keyword">        </font>{ 
02252                 sockerror_t error = dso-&gt;setMulticast(<font class="keyword">true</font>);
02253                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02254                 error = dso-&gt;setTimeToLive(ttl); 
02255                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02256                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);                
02257                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;              
02258                 <font class="keywordflow">return</font> cso-&gt;setTimeToLive(ttl);
02259         };
02260         
02261 <font class="keyword">protected</font>:
02265         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02266"></a><a class="code" href="class_T_RTPSocket.html#b0">02266</a>         <a class="code" href="class_RTPQueue.html#b7">isPendingData</a>(microtimeout_t timeout)<font class="keyword"></font>
02267 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;isPendingPacket(timeout); };
02268 
02273         <font class="keyword">inline</font> size_t 
<a name="l02274"></a><a class="code" href="class_T_RTPSocket.html#b1">02274</a>         <a class="code" href="class_RTPQueue.html#b12">readData</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len)<font class="keyword"></font>
02275 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;readPacket(buffer, len); };
02276 
02281         <font class="keyword">inline</font> size_t 
<a name="l02282"></a><a class="code" href="class_T_RTPSocket.html#b2">02282</a>         <a class="code" href="class_RTPQueue.html#b10">writeData</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> buffer, size_t len)<font class="keyword"></font>
02283 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;writePacket(buffer, len); };
02284 
02289         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02290"></a><a class="code" href="class_T_RTPSocket.html#b3">02290</a>         <a class="code" href="class_T_RTPSocket.html#b3">isPendingControl</a>(microtimeout_t timeout)<font class="keyword"></font>
02291 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;isPendingPacket(timeout); };
02292 
02298         <font class="keyword">inline</font> size_t 
<a name="l02299"></a><a class="code" href="class_T_RTPSocket.html#b4">02299</a>         <a class="code" href="class_T_RTPSocket.html#b4">readControl</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02300 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;readPacket(buffer,len); };
02301 
02307         <font class="keyword">inline</font> size_t
<a name="l02308"></a><a class="code" href="class_T_RTPSocket.html#b5">02308</a>         <a class="code" href="class_T_RTPSocket.html#b5">writeControl</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> buffer, size_t len)<font class="keyword"></font>
02309 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;writePacket(buffer,len); };
02310 
02311         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l02312"></a><a class="code" href="class_T_RTPSocket.html#b6">02312</a>         <a class="code" href="class_T_RTPSocket.html#b6">endSocket</a>()<font class="keyword"></font>
02313 <font class="keyword">        </font>{ dso-&gt;endSocket(); cso-&gt;endSocket(); };
02314 
02315 <font class="keyword">private</font>:
02324         sockerror_t 
<a name="l02325"></a><a class="code" href="class_T_RTPSocket.html#c0">02325</a>         <a class="code" href="class_T_RTPSocket.html#c0">connect</a>(<font class="keyword">const</font> InetAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02326 <font class="keyword">        </font>{
02327                 sockerror_t error;
02328                 <font class="keywordflow">if</font> ( !port )
02329                         port = base;
02330                 <font class="keywordflow">if</font> ( active )
02331                         active = <font class="keyword">false</font>;
02332                 <font class="comment">// make both RTP (even) and RTCP (odd) connections</font>
02333                 error = dso-&gt;Connect(ia, <a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(port));
02334                 <font class="keywordflow">if</font> ( error )
02335                         <font class="keywordflow">return</font> error;
02336                 error = cso-&gt;Connect(ia, <a class="code" href="class_T_RTPSocket.html#c1">odd_port</a>(port + 1));
02337                 <font class="keywordflow">if</font> ( error )
02338                         <font class="keywordflow">return</font> error;
02339                 <font class="comment">// Start running the RTP queue service thread</font>
02340                 active = <font class="keyword">true</font>;
02341                 Start();  
02342                 <font class="keywordflow">return</font> SOCKET_SUCCESS;
02343         };
02344 
02352         <font class="keyword">inline</font> tpport_t
<a name="l02353"></a><a class="code" href="class_T_RTPSocket.html#c1">02353</a>         <a class="code" href="class_T_RTPSocket.html#c1">odd_port</a>(tpport_t port)<font class="keyword"></font>
02354 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (port &amp; 0x01)? (port) : (port - 1); };
02355         
02363         <font class="keyword">inline</font> tpport_t 
<a name="l02364"></a><a class="code" href="class_T_RTPSocket.html#c2">02364</a>         <a class="code" href="class_T_RTPSocket.html#c2">even_port</a>(tpport_t port)<font class="keyword"></font>
02365 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (port &amp; 0x01)? (port - 1) : (port); };
02366 
<a name="l02367"></a><a class="code" href="class_T_RTPSocket.html#o0">02367</a>         tpport_t base;
<a name="l02368"></a><a class="code" href="class_T_RTPSocket.html#o1">02368</a>         dataSocket* dso;
<a name="l02369"></a><a class="code" href="class_T_RTPSocket.html#o2">02369</a>         controlSocket* cso;
02370 };
02371 
<a name="l02378"></a><a class="code" href="rtp_h.html#a3">02378</a> <font class="keyword">typedef</font> <a class="code" href="class_T_RTPSocket.html">T_RTPSocket&lt;QueueRTCPManager,UDPIPv4Socket,UDPIPv4Socket&gt;</a> <a class="code" href="class_T_RTPSocket.html">RTPSocket</a>;
02379 
<a name="l02390"></a><a class="code" href="class_RTPDuplex.html">02390</a> <font class="keyword">class </font>__EXPORT <a class="code" href="class_RTPDuplex.html">RTPDuplex</a> : <font class="keyword">public</font> <a class="code" href="class_RTPQueue.html">RTPQueue</a>, <font class="keyword">protected</font> <a class="code" href="class_UDPReceive.html">UDPReceive</a>, <font class="keyword">public</font> <a class="code" href="class_UDPTransmit.html">UDPTransmit</a>
02391 {
02392 
02393 <font class="keyword">public</font>:
02394 
02401         <a class="code" href="class_RTPDuplex.html#a0">RTPDuplex</a>(<font class="keyword">const</font> InetAddress &amp;bind, tpport_t local, tpport_t remote, <font class="keywordtype">int</font> pri);
02402 
02406         <font class="keyword">virtual</font>
02407         <a class="code" href="class_RTPDuplex.html#a1">~RTPDuplex</a>();
02408 
02415         sockerror_t 
02416         <a class="code" href="class_RTPDuplex.html#a2">Connect</a>(<font class="keyword">const</font> InetHostAddress &amp;host, tpport_t port = 0);
02417 
02418 <font class="keyword">protected</font>:
02419 
02424         <font class="keywordtype">bool</font> 
<a name="l02425"></a><a class="code" href="class_RTPDuplex.html#b0">02425</a>         <a class="code" href="class_RTPQueue.html#b7">isPendingData</a>(microtimeout_t timeout)<font class="keyword"></font>
02426 <font class="keyword">        </font>{ <font class="keywordflow">return</font> isPendingReceive(timeout); }
02427 
02433         size_t 
<a name="l02434"></a><a class="code" href="class_RTPDuplex.html#b1">02434</a>         <a class="code" href="class_RTPQueue.html#b10">writeData</a>(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *<font class="keyword">const</font> buffer, size_t len)<font class="keyword"></font>
02435 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Transmit((<font class="keyword">const</font> <font class="keywordtype">char</font> *)buffer, len); }
02436 
02442         size_t 
<a name="l02443"></a><a class="code" href="class_RTPDuplex.html#b2">02443</a>         <a class="code" href="class_RTPQueue.html#b12">readData</a>(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02444 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Receive(buffer, len); }
02445 
02449         <a class="code" href="class_RTPSource.html">RTPSource</a> &amp;<a class="code" href="class_RTPDuplex.html#b3">getPeer</a>();
02450 
02451 <font class="keyword">private</font>:
02452 
<a name="l02453"></a><a class="code" href="class_RTPDuplex.html#o0">02453</a>         tpport_t base;
02454 };
02455 
02456 <font class="preprocessor">#endif  //__CCXX_RTP_H__</font>
02457 <font class="preprocessor"></font>
</div></pre><hr><address><small>Generated at Fri Oct 5 10:28:26 2001 for ccRTP by
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.gif" alt="doxygen" align="middle" border=0 
width=110 height=53></a>1.2.5 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>,
 &copy;&nbsp;1997-2001</small></address>
</body>
</html>