Sophie

Sophie

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

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><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.10 -->
<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_8h.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>
00050 <font class="preprocessor">#ifndef  CCXX_SOCKET_H_</font>
00051 <font class="preprocessor"></font><font class="preprocessor">#include &lt;cc++/socket.h&gt;</font>
00052 <font class="preprocessor">#endif</font>
00053 <font class="preprocessor"></font>
00054 <font class="preprocessor">#ifdef  CCXX_NAMESPACES</font>
00055 <font class="preprocessor"></font><font class="keyword">namespace </font>ost {
00056 <font class="preprocessor">#endif</font>
00057 <font class="preprocessor"></font>
00058 <font class="comment">// RTP version</font>
<a name="l00059"></a><a class="code" href="rtp_8h.html#a0">00059</a> <font class="keyword">const</font> uint8 CCRTP_VERSION = 2;
00060 
00061 <font class="comment">// Time interval expressed in microseconds</font>
<a name="l00062"></a><a class="code" href="rtp_8h.html#a1">00062</a> <font class="keyword">typedef</font> uint32 microtimeout_t;
00063 
00064 <font class="comment">// Time interval expressed in nanoseconds </font>
<a name="l00065"></a><a class="code" href="rtp_8h.html#a2">00065</a> <font class="keyword">typedef</font> uint32 nanotimeout_t;
00066 
00067 <font class="keyword">struct </font><a class="code" href="struct_r_t_c_p_packet.html">RTCPPacket</a>;
00068 <font class="keyword">struct </font><a class="code" href="struct_sender_info.html">SenderInfo</a>;
00069 <font class="keyword">struct </font><a class="code" href="struct_receiver_info.html">ReceiverInfo</a>;
00070 
<a name="l00083"></a><a class="code" href="rtp_8h.html#a75">00083</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00084 {
00085         RTP_PAYLOAD_PCMU = 0,   
00086         RTP_PAYLOAD_1016,       
00087         RTP_PAYLOAD_G726,       
00088         RTP_PAYLOAD_GSM,        
00089         RTP_PAYLOAD_G723,       
00090         RTP_PAYLOAD_DVI4_8000,  
00091         RTP_PAYLOAD_DVI4_16000, 
00092         RTP_PAYLOAD_LPC,        
00093         RTP_PAYLOAD_PCMA,       
00094         RTP_PAYLOAD_G722,       
00095         RTP_PAYLOAD_L16_DUAL,   
00096         RTP_PAYLOAD_L16_MONO,   
00097         RTP_PAYLOAD_QCELP,      
00098         RTP_PAYLOAD_MPA = 14,   
00099         RTP_PAYLOAD_G728,       
00100         RTP_PAYLOAD_DVI4_11025, 
00101         RTP_PAYLOAD_DVI4_22050, 
00102         RTP_PAYLOAD_G729,       
00103         RTP_PAYLOAD_CELB = 25,  
00104         RTP_PAYLOAD_JPEG,       
00105         RTP_PAYLOAD_NV = 28,    
00106         RTP_PAYLOAD_H261 = 31,  
00107         RTP_PAYLOAD_MPV,        
00108         RTP_PAYLOAD_MP2T,       
00109         RTP_PAYLOAD_H263,       
00110         RTP_PAYLOAD_INVALID = 128,
00111         <font class="comment">// the payload types defined down here are allocated dynamically.</font>
00112         RTP_PAYLOAD_G726_40,
00113         RTP_PAYLOAD_G726_24,
00114         RTP_PAYLOAD_G726_16,
00115         RTP_PAYLOAD_G729D,
00116         RTP_PAYLOAD_G729E,
00117         RTP_PAYLOAD_GSM_EFR,
00118         RTP_PAYLOAD_L8,
00119         RTP_PAYLOAD_RED,
00120         RTP_PAYLOAD_VDVI,
00121         RTP_PAYLOAD_BT656,      
00122         RTP_PAYLOAD_H263_1998,  
00123         RTP_PAYLOAD_MP1S,       
00124         RTP_PAYLOAD_MP2P,       
00125         RTP_PAYLOAD_BMPEG,      
00126         RTP_PAYLOAD_EMPTY       
00127 }       rtp_payload_t;
00128 
<a name="l00134"></a><a class="code" href="rtp_8h.html#a76">00134</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00135 {
00136         RTCP_TYPE_SR = 200,             
00137         RTCP_TYPE_RR,                   
00138         RTCP_TYPE_SDES,                 
00139         RTCP_TYPE_BYE,                  
00140         RTCP_TYPE_APP                   
00141 }       rtcp_type_t;
00142 
<a name="l00150"></a><a class="code" href="rtp_8h.html#a77">00150</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00151 {
00152         RTCP_SDES_ITEM_END = 0,         
00153         RTCP_SDES_ITEM_CNAME,           
00154         RTCP_SDES_ITEM_NAME,            
00155         RTCP_SDES_ITEM_EMAIL,           
00156         RTCP_SDES_ITEM_PHONE,           
00157         RTCP_SDES_ITEM_LOC,             
00158         RTCP_SDES_ITEM_TOOL,            
00159         RTCP_SDES_ITEM_NOTE,            
00160         RTCP_SDES_ITEM_PRIV,            
00161         RTCP_SDES_ITEM_H323_CADDR,      
00162 }       sdes_item_type_t;
00163 
<a name="l00182"></a><a class="code" href="rtp_8h.html#a78">00182</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00183 {
00184         BEST_EFFORT_SERVICE,     
00185         ENHANCED_SERVICE         
00186 }       type_of_service_t;
00187 
<a name="l00192"></a><a class="code" href="rtp_8h.html#a79">00192</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00193 {
00194         RTPSOURCE_STATE_PREVALID,
00195         RTPSOURCE_STATE_VALID,
00196         RTPSOURCE_STATE_SAYINGBYE
00197 }       rtpsource_state_t;
00198 
<a name="l00207"></a><a class="code" href="rtp_8h.html#a80">00207</a> <font class="keyword">typedef</font> <font class="keyword">enum</font>
00208 {
00209         RTP_PURGE_SEND,        
00210         RTP_PURGE_RECV,        
00211         RTP_PURGE_BOTH         
00212 }       rtp_purge_t;
00213 
<a name="l00214"></a><a class="code" href="rtp_8h.html#a81">00214</a> <font class="keyword">typedef</font> <font class="keyword">enum</font> {
00215         CAST_MCAST,
00216         CAST_UCAST
00217 }       rtp_cast_t;
00218 
<a name="l00219"></a><a class="code" href="rtp_8h.html#a3">00219</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>;
<a name="l00220"></a><a class="code" href="rtp_8h.html#a4">00220</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_outgoing_r_t_p_pkt.html">OutgoingRTPPkt</a>;
<a name="l00221"></a><a class="code" href="rtp_8h.html#a5">00221</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_queue.html">RTPQueue</a>;
<a name="l00222"></a><a class="code" href="rtp_8h.html#a6">00222</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a>;
<a name="l00223"></a><a class="code" href="rtp_8h.html#a7">00223</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_source.html">RTPSource</a>;
00224 
00237 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_data.html">RTPData</a>
00238 {
00239 
00240 <font class="keyword">public</font>:
00244         RTPData(<font class="keyword">const</font> <a class="code" href="class_r_t_p_data.html">RTPData</a>&amp; origin);
00245 
00252         <a class="code" href="class_r_t_p_data.html">RTPData</a>&amp;
00253         operator=(<font class="keyword">const</font> <a class="code" href="class_r_t_p_data.html">RTPData</a>&amp; source);
00254 
00255         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>*
<a name="l00256"></a><a class="code" href="class_r_t_p_data.html#a2">00256</a>         getData()<font class="keyword"> const</font>
00257 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;data; };
00258 
00259         <font class="keyword">inline</font> size_t
<a name="l00260"></a><a class="code" href="class_r_t_p_data.html#a3">00260</a>         getSize()<font class="keyword"> const</font>
00261 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;size; };
00262 
00263         <font class="keyword">inline</font> rtp_payload_t
<a name="l00264"></a><a class="code" href="class_r_t_p_data.html#a4">00264</a>         getPayloadType()<font class="keyword"> const</font>
00265 <font class="keyword">        </font>{ <font class="keywordflow">return</font> datablock-&gt;pt; }
00266 
00267 <font class="keyword">protected</font>:
00268 
00269         RTPData(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; packet);
00270 
00271         ~RTPData();
00272 
00273 <font class="keyword">private</font>:
00274         <font class="comment">// dataCounter holds the reference counter</font>
00275         <font class="keyword">struct </font>dataCounter {
00276                 uint16 count;
00277                 <font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data;
00278                 <font class="keyword">const</font> size_t size;
00279                 rtp_payload_t pt;
00280                 dataCounter(<font class="keyword">const</font> <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t size, rtp_payload_t pt);
00281                 ~dataCounter();
00282         };
00283 
00284         <font class="keyword">mutable</font> dataCounter* datablock;
00285 
00286 
00287 
00288         <font class="comment">// Who sent this data</font>
00289         <a class="code" href="class_r_t_p_source.html">RTPSource</a>* src;
00290 
<a name="l00291"></a><a class="code" href="class_r_t_p_data.html#l0">00291</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_r_t_p_queue.html">RTPQueue</a>;
00292 };
00293 
00310 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_source.html">RTPSource</a>
00311 {
00312 <font class="keyword">public</font>:
00313         <font class="keywordtype">bool</font> getHello();
00314         <font class="keywordtype">bool</font> getGoodbye();
00315 
<a name="l00316"></a><a class="code" href="class_r_t_p_source.html#a2">00316</a>         uint32 getID()<font class="keyword"> const</font>
00317 <font class="keyword">        </font>{ <font class="keywordflow">return</font> ssrc; };
00318 
00324         uint32 
00325         getRate() <font class="keyword">const</font>;
00326 
00340         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00341"></a><a class="code" href="class_r_t_p_source.html#a4">00341</a>         setKitchenSize(microtimeout_t s)<font class="keyword"></font>
00342 <font class="keyword">        </font>{ kitchensize = ((s / 1000) * getRate() / 1000); };
00343          
00349         <font class="keyword">inline</font> microtimeout_t
<a name="l00350"></a><a class="code" href="class_r_t_p_source.html#a5">00350</a>         getKitchenDuration()<font class="keyword"> const</font>
00351 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((kitchensize * 1000) / getRate())* 1000); };
00352 
00353         <font class="keyword">inline</font> uint32
<a name="l00354"></a><a class="code" href="class_r_t_p_source.html#a6">00354</a>         getKitchenSize()<font class="keyword"> const</font>
00355 <font class="keyword">        </font>{ <font class="keywordflow">return</font> kitchensize; };
00356 
00365         <font class="keyword">inline</font> microtimeout_t
<a name="l00366"></a><a class="code" href="class_r_t_p_source.html#a7">00366</a>         getCurrentKitchenDuration()<font class="keyword"></font>
00367 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((currentkitchen * 1000) / getRate())* 1000); };
00368 
00369         <font class="keyword">inline</font> microtimeout_t
<a name="l00370"></a><a class="code" href="class_r_t_p_source.html#a8">00370</a>         getCurrentKitchenSize()<font class="keyword"></font>
00371 <font class="keyword">        </font>{ <font class="keywordflow">return</font> currentkitchen;};
00372 
00373         <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
00374         getSDESItem(sdes_item_type_t type) <font class="keyword">const</font>;
00375         
00376         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00377"></a><a class="code" href="class_r_t_p_source.html#a10">00377</a>         getCNAME()<font class="keyword"> const</font>
00378 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_CNAME); };
00379 
00380         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00381"></a><a class="code" href="class_r_t_p_source.html#a11">00381</a>         getNAME()<font class="keyword"> const</font>
00382 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_NAME); };
00383 
00384         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00385"></a><a class="code" href="class_r_t_p_source.html#a12">00385</a>         getEMAIL()<font class="keyword"> const</font>
00386 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_EMAIL); };
00387 
00388         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>
<a name="l00389"></a><a class="code" href="class_r_t_p_source.html#a13">00389</a>         getPHONE()<font class="keyword"> const</font>
00390 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_PHONE); };
00391 
00392         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00393"></a><a class="code" href="class_r_t_p_source.html#a14">00393</a>         getLOC()<font class="keyword"> const</font>
00394 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_LOC); };
00395 
00396         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00397"></a><a class="code" href="class_r_t_p_source.html#a15">00397</a>         getTOOL()<font class="keyword"> const</font>
00398 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_TOOL); };
00399 
00400         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00401"></a><a class="code" href="class_r_t_p_source.html#a16">00401</a>         getNOTE()<font class="keyword"> const</font>
00402 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_NOTE); };
00403 
00404         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00405"></a><a class="code" href="class_r_t_p_source.html#a17">00405</a>         getPRIV()<font class="keyword"> const</font>
00406 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_PRIV); };
00407 
00408         <font class="keyword">inline</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> 
<a name="l00409"></a><a class="code" href="class_r_t_p_source.html#a18">00409</a>         getH323_CADDR()<font class="keyword"> const</font>
00410 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSDESItem(RTCP_SDES_ITEM_H323_CADDR); };
00411 
00415         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00416"></a><a class="code" href="class_r_t_p_source.html#a19">00416</a>         isSender()<font class="keyword"> const</font>
00417 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active_sender; };
00418 
<a name="l00419"></a><a class="code" href="class_r_t_p_source.html#a20">00419</a>         <font class="keywordtype">bool</font> isValid()<font class="keyword"> const</font>
00420 <font class="keyword">        </font>{ <font class="keywordflow">return</font> valid; };
00421 
00422         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00423"></a><a class="code" href="class_r_t_p_source.html#a21">00423</a>         operator==(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;rhs)<font class="keyword"> const</font>
00424 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (<font class="keyword">this</font> == &amp;rhs); }
00425 
00426         <font class="keyword">inline</font> <font class="keywordtype">bool</font>
<a name="l00427"></a><a class="code" href="class_r_t_p_source.html#a22">00427</a>         operator!=(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;rhs)<font class="keyword"> const</font>
00428 <font class="keyword">        </font>{ <font class="keywordflow">return</font> !(*<font class="keyword">this</font> == rhs); }
00429 
00433         <a class="code" href="rtp_8h.html#a7">RTPSource</a>(uint32 ssrc); 
00434 
00438         ~RTPSource();
00439 
00443         <a class="code" href="rtp_8h.html#a7">RTPSource</a>(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp; origin);
00444 
00445         <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00446         operator=(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;origin);
00447 
00448 <font class="keyword">protected</font>:
00449                 
00450 <font class="keyword">private</font>:
00458         <font class="keyword">inline</font> <font class="keywordtype">void</font>
00459         setCurrentKitchenSize(uint32 s)<font class="keyword"></font>
00460 <font class="keyword">        </font>{ currentkitchen = s; };
00461 
00465         <font class="keywordtype">void</font> endSource();
00466 
00467         <font class="keywordtype">void</font>
00468         setSDESItem(sdes_item_type_t item, <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> value);
00469 
00478         <font class="keywordtype">void</font> 
00479         recordReception(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; p);
00480 
00490         <font class="keywordtype">void</font> 
00491         recordInsertion(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; p);
00492 
00500         <font class="keywordtype">void</font> 
00501         recordExtraction(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>&amp; p);
00502 
00506         <font class="keyword">inline</font> <font class="keywordtype">void</font>
00507         setSender(<font class="keywordtype">bool</font> active)<font class="keyword"></font>
00508 <font class="keyword">        </font>{ active_sender = active; };
00509 
00515         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
00516         setInitialTimestamp(uint32 ts)<font class="keyword"></font>
00517 <font class="keyword">        </font>{ initial_timestamp = ts; }
00518 
00527         <font class="keyword">inline</font> uint32 
00528         getInitialTimestamp()<font class="keyword"></font>
00529 <font class="keyword">        </font>{<font class="keywordflow">return</font> initial_timestamp; }
00530 
00537         <font class="keyword">inline</font> uint16
00538         getExpectedSeqNum()<font class="keyword"></font>
00539 <font class="keyword">        </font>{ <font class="keywordflow">return</font> expectedseqnum; }
00540 
00547         <font class="keyword">inline</font> <font class="keywordtype">void</font>
00548         setExpectedSeqNum(uint16 n)<font class="keyword"></font>
00549 <font class="keyword">        </font>{ expectedseqnum = n; }
00550 
00551         <font class="keyword">inline</font> <font class="keywordtype">void</font>
00552         setState(rtpsource_state_t st)<font class="keyword"></font>
00553 <font class="keyword">        </font>{ state = st; }
00554 
00555         <font class="comment">// SSRC 32 bit identifier carried in RTP and RTCP packets (in</font>
00556         <font class="comment">// network order)</font>
00557         uint32 ssrc;
00558         <font class="comment">// validity state of this source</font>
00559         rtpsource_state_t state;
00560         <font class="comment">// timestamp of the first packet received from this source</font>
00561         uint32 initial_timestamp;
00562         <font class="comment">// number of packets received from this source</font>
00563         uint32 packet_count;
00564         <font class="comment">// time the last packet was received at</font>
00565         <font class="keyword">struct </font>timeval last_time;
00566         <font class="comment">// required kitchen for this source. Represented as octets,</font>
00567         <font class="comment">// given the current transmission rate</font>
00568         uint32 kitchensize;
00569         <font class="comment">// current kitchen for this source. Represented as octets,</font>
00570         <font class="comment">// given the current transmission rate</font>
00571         uint32 currentkitchen;
00572         <font class="comment">// the expected sequence number of the next packet to be received.</font>
00573         uint16 expectedseqnum;  
00574 
00575         <font class="comment">// this flag assures we only call one gotHello and one gotGoodbye</font>
00576         <font class="comment">// for this src.</font>
00577         <font class="keywordtype">bool</font> flag;
00578 
00579         <font class="comment">// before becoming valid, multiple packets from this source, </font>
00580         <font class="comment">// or an SDES RTCP containing its CNAME should be received.</font>
00581         <font class="keywordtype">bool</font> valid; 
00582         <font class="comment">// A valid source not always is active</font>
00583         <font class="keywordtype">bool</font> active_sender;
00584 
00585         <font class="comment">// Sources located before and after this one in the list</font>
00586         <font class="comment">// of sources.</font>
00587         <a class="code" href="class_r_t_p_source.html">RTPSource</a>* prev, * next;
00588         <font class="comment">// first/last packets from this source in the queue </font>
00589         <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* first, * last;
00590         <font class="comment">// Prev and next inside the collision list</font>
00591         <a class="code" href="class_r_t_p_source.html">RTPSource</a>* nextcollis;  
00592         <font class="comment">// dummy content for undetermined descriptors</font>
00593         <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> unknown;
00594         <font class="comment">// sender info from the last sender report of this source  </font>
00595         <a class="code" href="struct_sender_info.html">SenderInfo</a>* sender_info;
00596         <font class="comment">// dummy content for the last sender info from this source</font>
00597         <font class="keyword">static</font> <font class="keyword">const</font> <a class="code" href="struct_sender_info.html">SenderInfo</a>* dummySI;
00598         <font class="comment">// last report block this source sent about the local source</font>
00599         <a class="code" href="struct_receiver_info.html">ReceiverInfo</a>* receiver_info;
00600         <font class="comment">// dummy content for the last report from this source</font>
00601         <font class="keyword">static</font> <font class="keyword">const</font> <a class="code" href="struct_receiver_info.html">ReceiverInfo</a>* dummyRB;
00602         <font class="comment">// Data extracted from the SDES items sent by this source</font>
00603         <font class="keywordtype">char</font> **sdes_items;
00604 
00605         
<a name="l00606"></a><a class="code" href="class_r_t_p_source.html#l0">00606</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_membership_control.html">MembershipControl</a>;
<a name="l00607"></a><a class="code" href="class_r_t_p_source.html#l1">00607</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_r_t_p_queue.html">RTPQueue</a>;
<a name="l00608"></a><a class="code" href="class_r_t_p_source.html#l2">00608</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a>;
<a name="l00609"></a><a class="code" href="class_r_t_p_source.html#l3">00609</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>;
00610 };
00611 
00612 <font class="comment">// TODO: implement this idea</font>
<a name="l00613"></a><a class="code" href="class_members.html">00613</a> <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_members.html">Members</a>
00614 {
00615 <font class="keyword">public</font>:
00616 
<a name="l00617"></a><a class="code" href="class_members.html#a0">00617</a>         Members() :     
00618                 members(static_cast&lt;uint32&gt;(-1)), 
00619                 <font class="comment">// -1 to counteract dummysource</font>
00620                 active_senders(0)
00621         { };
00622 
00627         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00628"></a><a class="code" href="class_members.html#a1">00628</a>         increaseMembersCount()<font class="keyword"></font>
00629 <font class="keyword">        </font>{ members++; };
00630 
00635         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00636"></a><a class="code" href="class_members.html#a2">00636</a>         decreaseMembersCount()<font class="keyword"></font>
00637 <font class="keyword">        </font>{ members--; };
00638 
00639         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00640"></a><a class="code" href="class_members.html#a3">00640</a>         setMembersCount(uint32 n)<font class="keyword"></font>
00641 <font class="keyword">        </font>{ members = n; };
00642 
00643         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00644"></a><a class="code" href="class_members.html#a4">00644</a>         increaseSendersCount()<font class="keyword"></font>
00645 <font class="keyword">        </font>{ active_senders++; };
00646 
00647         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00648"></a><a class="code" href="class_members.html#a5">00648</a>         decreaseSendersCount()<font class="keyword"></font>
00649 <font class="keyword">        </font>{ active_senders--; };
00650 
00651         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l00652"></a><a class="code" href="class_members.html#a6">00652</a>         setSendersCount(uint32 n)<font class="keyword"></font>
00653 <font class="keyword">        </font>{ active_senders = n; };
00654 
00659         <font class="keyword">inline</font> uint32 
<a name="l00660"></a><a class="code" href="class_members.html#a7">00660</a>         membersCount()<font class="keyword"> const</font>
00661 <font class="keyword">        </font>{ <font class="keywordflow">return</font> members; };
00662         
00663         <font class="keyword">inline</font> uint32
<a name="l00664"></a><a class="code" href="class_members.html#a8">00664</a>         sendersCount()<font class="keyword"> const</font>
00665 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active_senders; };
00666 
00667 
00668         <font class="comment">// number of identified members</font>
<a name="l00669"></a><a class="code" href="class_members.html#m0">00669</a>         uint32 members;
00670         <font class="comment">// number of identified members that currently are active senders</font>
<a name="l00671"></a><a class="code" href="class_members.html#m1">00671</a>         uint32 active_senders;
00672 };
00673 
00698 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_membership_control.html">MembershipControl</a> : <font class="keyword">public</font> <a class="code" href="class_members.html">Members</a>
00699 {
00700 <font class="keyword">public</font>:
00709         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
<a name="l00710"></a><a class="code" href="class_membership_control.html#a0">00710</a>         getSource(uint32 ssrc)<font class="keyword"> const</font>
00711 <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>); }
00712 
00721         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
<a name="l00722"></a><a class="code" href="class_membership_control.html#a1">00722</a>         getOrCreateSource(uint32 ssrc)<font class="keyword"></font>
00723 <font class="keyword">        </font>{ <font class="keywordflow">return</font> getSourceBySSRC(ssrc,<font class="keyword">true</font>); }
00724 
00725 <font class="keyword">protected</font>:
00731         <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00732         addNewSource(uint32 ssrc);
00733 
00747         MembershipControl(uint32 initial_size = 7);
00748 
00754         <font class="keyword">virtual</font>
00755         ~MembershipControl();
00756 
00761         <font class="keywordtype">void</font>
00762         endMembers();
00763 
00773         <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00774         getSourceBySSRC(uint32 ssrc, <font class="keywordtype">bool</font> create = <font class="keyword">false</font>);
00775 
00786         <font class="keywordtype">bool</font>
00787         BYESource(uint32 ssrc);
00788 
00796         <font class="keywordtype">bool</font>
00797         removeSource(uint32 ssrc);
00798 
00799         <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
<a name="l00800"></a><a class="code" href="class_membership_control.html#b7">00800</a>         NullSource()<font class="keyword"> const</font>
00801 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dummysource; };
00802 
00803         <font class="comment">// an empty RTPSource representing unidentified sources</font>
<a name="l00804"></a><a class="code" href="class_membership_control.html#q0">00804</a>         <font class="keyword">const</font> <font class="keyword">static</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> dummysource;
00805 
00806         <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00807         getFirstPlayer();
00808 
00809         <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00810         getLastPlayer();
00811         
00812         <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00813         getNextPlayer();
00814 
00815         <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
00816         getCurrentPlayer();
00817 
00818 <font class="keyword">private</font>:
00819 
00820         MembershipControl(<font class="keyword">const</font> <a class="code" href="class_membership_control.html">MembershipControl</a> &amp;o);
00821 
00822         <a class="code" href="class_membership_control.html">MembershipControl</a>&amp;
00823         operator=(<font class="keyword">const</font> <a class="code" href="class_membership_control.html">MembershipControl</a> &amp;o);
00824 
00825         <font class="comment">// Hash table with sources of RTP and RTCP packets</font>
00826         uint32 SOURCE_BUCKETS; 
00827         <a class="code" href="class_r_t_p_source.html">RTPSource</a>** sources;
00828         <font class="comment">// List of sources, ordered from older to newer</font>
00829         <a class="code" href="class_r_t_p_source.html">RTPSource</a>* first, * last;
00830         <font class="keyword">mutable</font> Mutex playerslock;
00831 };
00832 
00858 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_queue.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_membership_control.html">MembershipControl</a>
00859 {
00860 <font class="keyword">public</font>:
<a name="l00864"></a><a class="code" href="class_r_t_p_queue.html#a0">00864</a>         <font class="keyword">inline</font> <font class="keywordtype">void</font> Start(<font class="keywordtype">void</font>)<font class="keyword"></font>
00865 <font class="keyword">                </font>{Thread::Start();};
00866 
00872         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp; 
<a name="l00873"></a><a class="code" href="class_r_t_p_queue.html#a1">00873</a>         getLocalInfo()<font class="keyword"> const</font>
00874 <font class="keyword">        </font>{ <font class="keywordflow">return</font> *localsrc; };
00875 
00882         <font class="keywordtype">bool</font> 
00883         isWaiting(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource) <font class="keyword">const</font>;
00884 
00893         <font class="keywordtype">bool</font> 
00894         isCookedWaiting(<font class="keywordtype">void</font>) <font class="keyword">const</font>;
00895  
00901         <font class="keywordtype">bool</font> 
00902         isSending(<font class="keywordtype">void</font>) <font class="keyword">const</font>;
00903 
00918         <font class="keywordtype">void</font> 
00919         putPacket(uint32 stamp, rtp_payload_t payload, <font class="keyword">const</font> <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>);
00920 
00979         <font class="keyword">const</font> <a class="code" href="class_r_t_p_data.html">RTPData</a>&amp;
00980         getCookedPacket(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
00981 
00988         uint32 
00989         getFirstTimestamp(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
00990  
00997         uint16 
00998         getFirstSequence(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
00999 
01007         <font class="keyword">const</font> <a class="code" href="class_r_t_p_data.html">RTPData</a>&amp;
01008         getPacket(uint32 stamp, <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
01009 
01021         size_t 
01022         getPacket(uint32 stamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t max,
01023                   <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
01024 
01032         rtp_payload_t 
01033         getPayloadType(uint32 timestamp, <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
01034 
01096         uint32 
01097         getCurrentTimestamp(rtp_payload_t pt) <font class="keyword">const</font>;
01098 
01107         uint32
01108         getTimestampIncrement(size_t packet_size) <font class="keyword">const</font>;
01109 
01117         <font class="keywordtype">void</font>
<a name="l01118"></a><a class="code" href="class_r_t_p_queue.html#a14">01118</a>         setSessionBandwidth(uint32 bw)<font class="keyword"></font>
01119 <font class="keyword">        </font>{ sessionbw = bw; };
01120 
01133         uint32 
01134         getRate(rtp_payload_t pt = RTP_PAYLOAD_EMPTY) <font class="keyword">const</font>;
01135 
01142         rtp_payload_t
01143         getPayloadType(<font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp; src) <font class="keyword">const</font>;
01144 
01153         <font class="keyword">inline</font> <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a>&amp;
<a name="l01154"></a><a class="code" href="class_r_t_p_queue.html#a17">01154</a>         getSource(uint32 ssrc)<font class="keyword"> const</font>
01155 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <a class="code" href="class_membership_control.html#a0">MembershipControl::getSource</a>(htonl(ssrc)); };
01156 
01169         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l01170"></a><a class="code" href="class_r_t_p_queue.html#a18">01170</a>         setTypeOfService(type_of_service_t tos)<font class="keyword"></font>
01171 <font class="keyword">        </font>{ type_of_service = tos; }
01172  
01183         size_t 
01184         setPartial(uint32 timestamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t offset, size_t max);
01185 
01197         size_t 
01198         getPartial(uint32 timestamp, <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* data, size_t offset, size_t max);
01199 
01205         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01206"></a><a class="code" href="class_r_t_p_queue.html#a21">01206</a>         isActive(<font class="keywordtype">void</font>)<font class="keyword"> const</font>
01207 <font class="keyword">        </font>{ <font class="keywordflow">return</font> active; };
01208 
01215         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01216"></a><a class="code" href="class_r_t_p_queue.html#a22">01216</a>         setTimeout(microtimeout_t t)<font class="keyword"></font>
01217 <font class="keyword">        </font>{ timeout = t;};
01218 
01227         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01228"></a><a class="code" href="class_r_t_p_queue.html#a23">01228</a>         setExpired(microtimeout_t t)<font class="keyword"></font>
01229 <font class="keyword">        </font>{ expired = t;};
01230 
01254         <font class="keywordtype">void</font>
01255         setGlobalKitchenDuration(microtimeout_t t);
01256 
01257         <font class="keywordtype">void</font>
01258         setGlobalKitchenSize(uint32 s);
01259 
01268         <font class="keyword">inline</font> microtimeout_t
<a name="l01269"></a><a class="code" href="class_r_t_p_queue.html#a26">01269</a>         getGlobalKitchenDuration()<font class="keyword"> const</font>
01270 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (((kitchensize * 1000) / getRate())*1000); };
01271         
01286         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l01287"></a><a class="code" href="class_r_t_p_queue.html#a27">01287</a>         setEndToEndDelay(microtimeout_t t)<font class="keyword"></font>
01288 <font class="keyword">                </font>{ e2edelay = t; };
01289 
01295         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01296"></a><a class="code" href="class_r_t_p_queue.html#a28">01296</a>         setSegmentSize(size_t size)<font class="keyword"></font>
01297 <font class="keyword">                </font>{segment = size;};
01298 
01309         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01310"></a><a class="code" href="class_r_t_p_queue.html#a29">01310</a>         isComplete()<font class="keyword"></font>
01311 <font class="keyword">        </font>{ <font class="keywordflow">return</font> complete; };
01312 
01321         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l01322"></a><a class="code" href="class_r_t_p_queue.html#a30">01322</a>         isMarked(<font class="keywordtype">void</font>)<font class="keyword"></font>
01323 <font class="keyword">                </font>{<font class="keywordflow">return</font> marked;};
01324 
01328         <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01329"></a><a class="code" href="class_r_t_p_queue.html#a31">01329</a>         setTimeclock(<font class="keywordtype">void</font>)<font class="keyword"></font>
01330 <font class="keyword">                </font>{timeclock.setTimer();};
01331  
01337         <font class="keyword">inline</font> timeout_t 
<a name="l01338"></a><a class="code" href="class_r_t_p_queue.html#a32">01338</a>         getTimeclock(<font class="keywordtype">void</font>)<font class="keyword"></font>
01339 <font class="keyword">                </font>{<font class="keywordflow">return</font> timeclock.getElapsed();};
01340         
01346         <font class="keyword">inline</font> uint32
<a name="l01347"></a><a class="code" href="class_r_t_p_queue.html#a33">01347</a>         RTPSendCount()<font class="keyword"> const</font>
01348 <font class="keyword">        </font>{ <font class="keywordflow">return</font> sendcount;};
01349 
01356         <font class="keyword">inline</font> uint32
<a name="l01357"></a><a class="code" href="class_r_t_p_queue.html#a34">01357</a>         RTPOctetCount()<font class="keyword"> const</font>
01358 <font class="keyword">        </font>{ <font class="keywordflow">return</font> octetcount;};
01359 
01360 <font class="keyword">protected</font>:
01361         
01369         <a class="code" href="rtp_8h.html#a5">RTPQueue</a>(<font class="keywordtype">int</font> pri, uint32 size = 7);
01370 
01387         <a class="code" href="rtp_8h.html#a5">RTPQueue</a>(uint32 ssrc, <font class="keywordtype">int</font> pri, uint32 size = 7);
01388         
01392         <font class="keyword">virtual</font> 
01393         ~RTPQueue(); 
01394 
01401         <font class="keyword">virtual</font> <font class="keyword">inline</font> <font class="keywordtype">void</font> 
<a name="l01402"></a><a class="code" href="class_r_t_p_queue.html#b3">01402</a>         RTCPService(microtimeout_t&amp; wait)<font class="keyword"></font>
01403 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; };
01404 
01408         <font class="keyword">virtual</font> <font class="keywordtype">void</font> 
<a name="l01409"></a><a class="code" href="class_r_t_p_queue.html#b4">01409</a>         Bye(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason)<font class="keyword"></font>
01410 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01411 
<a name="l01415"></a><a class="code" href="class_r_t_p_queue.html#b5">01415</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> timerTick(<font class="keywordtype">void</font>)<font class="keyword"></font>
01416 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; };
01417 
01427         microtimeout_t
01428         getTimeout(<font class="keywordtype">void</font>);
01429 
01437         <font class="keyword">virtual</font> <font class="keywordtype">bool</font>
01438         isPendingData(microtimeout_t timeout) = 0;
01439 
01446         <font class="keywordtype">void</font> Purge(rtp_purge_t flag);
01447 
01454         size_t
01455         sendPacket(<font class="keywordtype">void</font>);
01456 
01466         <font class="keyword">virtual</font> size_t
01467         writeData(<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;
01468 
01475         size_t
01476         recvPacket(<font class="keywordtype">void</font>);
01477 
01487         <font class="keyword">virtual</font> size_t
01488         readData(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len) = 0;
01489 
01498         <font class="keyword">virtual</font> <font class="keywordtype">bool</font>
<a name="l01499"></a><a class="code" href="class_r_t_p_queue.html#b13">01499</a>         gotPacket(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* packet)<font class="keyword"></font>
01500 <font class="keyword">        </font>{ <font class="keywordflow">return</font> <font class="keyword">true</font>; }
01501 
<a name="l01507"></a><a class="code" href="class_r_t_p_queue.html#b14">01507</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> expireSend(<a class="code" href="class_outgoing_r_t_p_pkt.html">OutgoingRTPPkt</a> *packet)<font class="keyword"></font>
01508 <font class="keyword">                </font>{<font class="keywordflow">return</font>;};
01509 
<a name="l01516"></a><a class="code" href="class_r_t_p_queue.html#b15">01516</a>         <font class="keyword">virtual</font> <font class="keywordtype">void</font> expireRecv(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a> *packet)<font class="keyword"></font>
01517 <font class="keyword">                </font>{<font class="keywordflow">return</font> ;};
01518 
01528         <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>*
01529         getWaiting(uint32 timestamp, <font class="keyword">const</font> <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src = dummysource);
01530 
01534         <font class="keywordtype">void</font>
01535         endQueue();
01536 
<a name="l01540"></a><a class="code" href="class_r_t_p_queue.html#b18">01540</a>         <font class="keywordtype">void</font> Final()<font class="keyword"></font>
01541 <font class="keyword">        </font>{ <font class="keyword">delete</font> <font class="keyword">this</font>; };
01542 
01543         <font class="comment">// true if connection "active"</font>
<a name="l01544"></a><a class="code" href="class_r_t_p_queue.html#n0">01544</a>         <font class="keyword">volatile</font> <font class="keywordtype">bool</font> active;       
01545         <font class="comment">// Object representing the local source</font>
<a name="l01546"></a><a class="code" href="class_r_t_p_queue.html#n1">01546</a>         <a class="code" href="class_r_t_p_source.html">RTPSource</a>* localsrc;
01547         <font class="comment">// when the queue is created</font>
<a name="l01548"></a><a class="code" href="class_r_t_p_queue.html#n2">01548</a>         <font class="keyword">struct </font>timeval initial_time;  
<a name="l01549"></a><a class="code" href="class_r_t_p_queue.html#n3">01549</a>         uint32 current_rate;
01550         <font class="comment">// ramdonly generated offset for the timestamp of sent packets</font>
<a name="l01551"></a><a class="code" href="class_r_t_p_queue.html#n4">01551</a>         uint32 initial_timestamp;
01552 
01553 <font class="keyword">private</font>:
<a name="l01554"></a><a class="code" href="class_r_t_p_queue.html#l0">01554</a>         <font class="keyword">friend</font> <font class="keyword">class </font><a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>;
01555 
01556         <a class="code" href="rtp_8h.html#a5">RTPQueue</a>(<font class="keyword">const</font> <a class="code" href="class_r_t_p_queue.html">RTPQueue</a> &amp;o);
01557 
01558         <a class="code" href="class_r_t_p_queue.html">RTPQueue</a>&amp;
01559         operator=(<font class="keyword">const</font> <a class="code" href="class_r_t_p_queue.html">RTPQueue</a> &amp;o);
01560 
01566         <font class="keywordtype">void</font>
01567         initQueue(uint32 localssrc);
01568 
01572         <font class="keywordtype">void</font> 
01573         Run(<font class="keywordtype">void</font>);
01574         
01575 
01581         <font class="keywordtype">void</font> 
01582         RTPService(microtimeout_t&amp; wait);
01583         
01592         <font class="keywordtype">void</font> 
01593         insertRecvPacket(<a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a> *packet);               
01594 
01595         type_of_service_t type_of_service;  
01596         uint32 sessionbw;
01597         rtp_cast_t sessioncast;
01598 
01599         <font class="comment">// packet receive workspace size</font>
01600         <font class="keyword">static</font> <font class="keyword">const</font> size_t RECVBUFFER_SIZE = 8192;     
01601         <font class="comment">// number of packets sent from the beginning</font>
01602         uint32 sendcount;
01603         <font class="comment">// number of payload octets sent from the beginning</font>
01604         uint32 octetcount;
01605 
01606         <font class="comment">// transmission and reception queues</font>
01607         <a class="code" href="class_outgoing_r_t_p_pkt.html">OutgoingRTPPkt</a>* sendfirst, * sendlast; 
01608         <a class="code" href="class_incoming_r_t_p_pkt.html">IncomingRTPPkt</a>* recvfirst, * recvlast;
01609         <font class="keyword">mutable</font> Mutex sendlock, recvlock;
01610         <font class="comment">// the sequence number of the next packet to sent</font>
01611         uint16 sendseq;    
01612         <font class="comment">// contributing sources</font>
01613         uint32 sendsources[16];
01614         <font class="comment">// how many CSRCs to send.</font>
01615         uint16 sendcc;       
01616         <font class="comment">// maximum packet size before fragmenting sends.</font>
01617         <font class="keywordtype">unsigned</font> segment;      
01618         <font class="comment">// bit M in RTP fixed header of the last packet</font>
01619         <font class="keywordtype">bool</font> marked;
01620         <font class="comment">// whether there was not loss</font>
01621         <font class="keywordtype">bool</font> complete;
01622         
01623         TimerPort timeclock;
01624 
01625         <font class="comment">// elapsed time accumulated through successive overflows of</font>
01626         <font class="comment">// the local timestamp field</font>
01627         <font class="keyword">struct </font>timeval overflow_time; 
01628 
01629         <font class="comment">// transmission scheduling timeout for the service thread</font>
01630         microtimeout_t timeout;
01631         <font class="comment">// how old a packet can reach in the sending queue before deletetion</font>
01632         microtimeout_t expired;
01633         
01634         <font class="comment">// Maximun delay allowed between packet timestamping and</font>
01635         <font class="comment">// packet availability for the application.</font>
01636         microtimeout_t e2edelay;  
01637         <font class="comment">// Kitchen (reordering buffer) size in octets, given the</font>
01638         <font class="comment">// current transmission rate.</font>
01639         uint32 kitchensize;
01640 
01641         <font class="comment">// this is a global table holding the </font>
01642         <font class="comment">// `payload_type &lt;-&gt; timestamp_rate' correpondence for </font>
01643         <font class="comment">// the statically assigned payload types</font>
01644         <font class="keyword">static</font> uint32 payload_rate[96];
01645 };
01646 
01666 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a> : <font class="keyword">public</font> <a class="code" href="class_r_t_p_queue.html">RTPQueue</a>
01667 {
01668 <font class="keyword">public</font>:
01686         <font class="keyword">virtual</font> <font class="keywordtype">void</font>
<a name="l01687"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a0">01687</a>         setControlBandwidth(<font class="keywordtype">float</font> fraction)<font class="keyword"></font>
01688 <font class="keyword">        </font>{ controlbw = fraction; };
01689 
01703         <font class="keyword">virtual</font> <font class="keywordtype">void</font>
<a name="l01704"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a1">01704</a>         setSendersControlFraction(<font class="keywordtype">float</font> fraction)<font class="keyword"></font>
01705 <font class="keyword">        </font>{ sendcontrolbw = fraction; recvcontrolbw = 1 - fraction;};
01706 
01712         <font class="keyword">inline</font> uint32
<a name="l01713"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a2">01713</a>         RTCPSendCount()<font class="keyword"> const</font>
01714 <font class="keyword">        </font>{ <font class="keywordflow">return</font> ctrlsendcount; }
01715 
01720         <font class="keywordtype">void</font> <font class="keyword">inline</font>
<a name="l01721"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a3">01721</a>         setNAME(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> name)<font class="keyword"></font>
01722 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_NAME,name); };
01723 
01724         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01725"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a4">01725</a>         setEMAIL(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> email)<font class="keyword"></font>
01726 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_EMAIL,email); };
01727 
<a name="l01728"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a5">01728</a>         <font class="keywordtype">void</font> <font class="keyword">inline</font> setPHONE(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> phone)<font class="keyword"></font>
01729 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_PHONE,phone); };
01730 
01731         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01732"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a6">01732</a>         setLOC(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> loc)<font class="keyword"> </font>
01733 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_LOC,loc); };
01734 
01735         <font class="keywordtype">void</font> <font class="keyword">inline</font>
<a name="l01736"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a7">01736</a>         setTOOL(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> tool)<font class="keyword"></font>
01737 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_TOOL,tool); };
01738 
01739         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01740"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a8">01740</a>         setNOTE(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> note)<font class="keyword"></font>
01741 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_NOTE,note); };
01742 
01743         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01744"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a9">01744</a>         setPRIV(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> priv)<font class="keyword"></font>
01745 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_PRIV,priv); };
01746 
01747         <font class="keywordtype">void</font> <font class="keyword">inline</font> 
<a name="l01748"></a><a class="code" href="class_queue_r_t_c_p_manager.html#a10">01748</a>         setH323_CADDR(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> h323ca)<font class="keyword"></font>
01749 <font class="keyword">        </font>{ localsrc-&gt;setSDESItem(RTCP_SDES_ITEM_H323_CADDR,h323ca); };
01750 
01751 <font class="keyword">protected</font>:
01752         <a class="code" href="rtp_8h.html#a6">QueueRTCPManager</a>(<font class="keywordtype">int</font> pri);
01753 
01754         <font class="keyword">virtual</font> 
01755         ~QueueRTCPManager();
01756 
01757         <font class="keywordtype">void</font>
01758         endQueueRTCPManager();
01759 
01765         <font class="keywordtype">void</font> 
01766         RTCPService(microtimeout_t&amp; wait);
01767 
01775         <font class="keywordtype">void</font> 
01776         Bye(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason = NULL);
01777 
01781         <font class="keyword">virtual</font> <font class="keywordtype">void</font> 
<a name="l01782"></a><a class="code" href="class_queue_r_t_c_p_manager.html#b5">01782</a>         gotHello(<a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src)<font class="keyword"></font>
01783 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01784 
01791         <font class="keyword">virtual</font> <font class="keywordtype">void</font> 
<a name="l01792"></a><a class="code" href="class_queue_r_t_c_p_manager.html#b6">01792</a>         gotGoodbye(<a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;src, <font class="keywordtype">char</font> *reason)<font class="keyword"></font>
01793 <font class="keyword">        </font>{ <font class="keywordflow">return</font>; }
01794 
01798         <font class="keywordtype">void</font>
01799         handleSSRCCollision();
01800 
01813         <font class="keyword">virtual</font> timeval 
01814         computeRTCPInterval();
01815 
01820         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l01821"></a><a class="code" href="class_queue_r_t_c_p_manager.html#b9">01821</a>         setPrevMembersCount(uint32 count)<font class="keyword"></font>
01822 <font class="keyword">        </font>{ rtcp_pmembers = count; };
01823 
01828         <font class="keyword">inline</font> uint32 
<a name="l01829"></a><a class="code" href="class_queue_r_t_c_p_manager.html#b10">01829</a>         PrevMembersCount()<font class="keyword"> const</font>
01830 <font class="keyword">        </font>{ <font class="keywordflow">return</font> rtcp_pmembers; };
01831 
01832 <font class="keyword">private</font>:
01833         <a class="code" href="rtp_8h.html#a6">QueueRTCPManager</a>(<font class="keyword">const</font> <a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a> &amp;o);
01834 
01835         <a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a>&amp;
01836         operator=(<font class="keyword">const</font> <a class="code" href="class_queue_r_t_c_p_manager.html">QueueRTCPManager</a> &amp;o);
01837 
01841         <font class="keywordtype">void</font> 
01842         setSDESItem(sdes_item_type_t type, <font class="keyword">const</font> <font class="keywordtype">char</font> *<font class="keyword">const</font> value);
01843 
01848         <font class="keywordtype">void</font>
01849         findCNAME();
01850 
01855         <font class="keywordtype">void</font>
01856         updateAvgRTCPSize(size_t len);
01857 
01863         <font class="keywordtype">void</font> 
01864         ReverseReconsideration();
01865 
01870         <font class="keywordtype">bool</font>
01871         TimerReconsideration();
01872 
01880         <font class="keywordtype">void</font> 
01881         TimeOutSSRCs();
01882 
01887         <font class="keywordtype">bool</font>
01888         getSDES_APP(<a class="code" href="struct_r_t_c_p_packet.html">RTCPPacket</a> &amp;pkt, uint32 &amp;pointer, size_t len);
01889 
01902         <font class="keywordtype">bool</font>
01903         getBYE(<a class="code" href="struct_r_t_c_p_packet.html">RTCPPacket</a> &amp;pkt, uint32 &amp;pointer, size_t len);
01904 
01908         <font class="keywordtype">void</font>
01909         getOnlyBye();
01910 
01922         <font class="keyword">inline</font> <font class="keyword">virtual</font> uint16
01923         networkHeaderSize()<font class="keyword"></font>
01924 <font class="keyword">        </font>{ <font class="keywordflow">return</font> 20; }
01925 
01937         <font class="keyword">inline</font> <font class="keyword">virtual</font> uint16
01938         transportHeaderSize()<font class="keyword"></font>
01939 <font class="keyword">        </font>{ <font class="keywordflow">return</font> 8; }
01940 
01946         size_t
01947         sendControl(<font class="keywordtype">void</font>);
01948 
01958         <font class="keywordtype">void</font>
01959         recvControl(<font class="keywordtype">void</font>);
01960 
01967         <font class="keywordtype">bool</font>
01968         packReportBlock(uint16&amp; len);
01969 
01985         <font class="keywordtype">bool</font>
01986         tryAnotherRR(<a class="code" href="struct_r_t_c_p_packet.html">RTCPPacket</a>*&amp; pkt, uint16&amp; len, uint16&amp; blocks);
01987 
01994         <font class="keywordtype">void</font> 
01995         packSDES(uint16&amp; len);
01996 
01997         size_t
01998         sendBYE(<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font> reason);
01999 
02004         <font class="keyword">virtual</font> size_t 
02005         writeControl(<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;
02006 
02011         <font class="keyword">virtual</font> size_t 
02012         readControl(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len) = 0;
02013 
02019         <font class="keyword">virtual</font> <font class="keywordtype">bool</font> 
02020         isPendingControl(microtimeout_t timeout) = 0;
02021         
02030         <font class="keywordtype">bool</font>
02031         RTCPHeaderCheck(size_t len);
02032 
02033 
02034         <font class="comment">// path MTU. RTCP packets should not be greater than this</font>
02035         uint16 pathMTU;
02036 
02037         <font class="comment">// buffer to hold RTCP compound packets being sent. Allocated</font>
02038         <font class="comment">// at construction time</font>
02039         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* rtcpsend_buffer;
02040 
02041         <font class="comment">// buffer to hold RTCP compound packets being</font>
02042         <font class="comment">// received. Allocated at construction time</font>
02043         <font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* rtcprecv_buffer;
02044 
02045         <font class="comment">// whether the RTCP service is active</font>
02046         <font class="keywordtype">bool</font> rtcp_active;
02047 
02048         <font class="keywordtype">float</font> controlbw, sendcontrolbw, recvcontrolbw;
02049         <font class="comment">// number of RTCP packets sent since the beginning</font>
02050         uint32 ctrlsendcount;
02051 
02052         <font class="comment">// Network + transport headers size, typically size of IP +</font>
02053         <font class="comment">// UDP headers</font>
02054         uint16 lower_headers_size;
02055         <font class="comment">// state for rtcp timing. Its meaning is defined in RFC ????, 6.3</font>
02056         timeval rtcp_tp, rtcp_tc, rtcp_tn;
02057         uint32 rtcp_pmembers;
02058         uint32 rtcp_bw;
02059         <font class="keywordtype">bool</font> rtcp_we_sent;      
02060         uint16 rtcp_avg_size;
02061         <font class="keywordtype">bool</font> rtcp_initial;
02062         <font class="comment">// last time we checked if there were incoming RTCP packets</font>
02063         timeval rtcp_last_check;
02064         <font class="comment">// interval to check if there are incoming RTCP packets</font>
02065         timeval rtcp_check_interval;
02066         <font class="comment">// next time to check if there are incoming RTCP packets</font>
02067         timeval rtcp_next_check;
02068 
02069         <font class="comment">// value of sendcount at the time of the last RTCP packet transmission</font>
02070         uint32 last_sendcount;
02071 
02072         uint32 prev_nvalid_sources;
02073         timeval rtcp_calculated_interval;
02074         
02075         <font class="comment">// length of CNAME as user@host</font>
02076         size_t CNAME_len;
02077 
02078         <font class="comment">// According to timer reconsideration and reverse reconsideration </font>
02079         <font class="comment">// algorithms, sources do not become valid or deleted as soon as</font>
02080         <font class="comment">// they appear or send BYE. </font>
02081         <font class="comment">// number of not yet valid, but noticed sources </font>
02082         uint32 nprevalid_srcs;
02083         <font class="comment">// number of valid sources</font>
02084         uint32 nvalid_srcs;
02085         <font class="comment">// number of sources having sent a BYE, but not yet deleted </font>
02086         uint32 npredeleted_srcs;
02087         <font class="comment">// number of already deleted sources</font>
02088         uint32 ndeleted_srcs;
02089         <font class="comment">// minimum interval for transmission of RTCP packets</font>
02090         microtimeout_t rtcp_min_interval;
02091 
02092         <font class="comment">// Nember of seconds ellapsed from 1900 to 1970</font>
02093         <font class="keyword">const</font> <font class="keyword">static</font> uint32 NTP_EPOCH_OFFSET = static_cast&lt;uint32&gt;(2208992400u);
02094 
02095         <font class="comment">// masks for RTCP header validation</font>
02096 <font class="preprocessor">#if     __BYTE_ORDER == __BIG_ENDIAN</font>
02097 <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_MASK;
02098         <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_VALUE;
02099 <font class="preprocessor">#else</font>
02100 <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_MASK;
02101         <font class="keyword">static</font> <font class="keyword">const</font> uint16 RTCP_VALID_VALUE;
02102 <font class="preprocessor">#endif</font>
02103 <font class="preprocessor"></font>        <font class="keyword">static</font> <font class="keyword">const</font> uint16 TIMEOUT_MULTIPLIER;
02104         <font class="keyword">static</font> <font class="keyword">const</font> <font class="keywordtype">double</font> RECONSIDERATION_COMPENSATION;
02105 };
02106 
02122 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_u_d_p_i_pv4_socket.html">UDPIPv4Socket</a>: <font class="keyword">private</font> <a class="code" href="class_u_d_p_receive.html">UDPReceive</a>, <font class="keyword">private</font> <a class="code" href="class_u_d_p_transmit.html">UDPTransmit</a> 
02123 {
02124 <font class="keyword">public</font>:
<a name="l02131"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a0">02131</a>         UDPIPv4Socket(<font class="keyword">const</font> InetAddress&amp; ia, tpport_t port) : 
02132                 <a class="code" href="class_u_d_p_receive.html">UDPReceive</a>(ia, port), <a class="code" href="class_u_d_p_transmit.html">UDPTransmit</a>() 
02133         { };
02134 
<a name="l02138"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a1">02138</a>         ~UDPIPv4Socket()<font class="keyword"> </font>
02139 <font class="keyword">        </font>{ };
02140 
02147         sockerror_t
<a name="l02148"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a2">02148</a>         Connect(<font class="keyword">const</font> InetHostAddress&amp; ia, tpport_t port)<font class="keyword"></font>
02149 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPTransmit::Connect(ia,port); };
02150 
02157         sockerror_t
<a name="l02158"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a3">02158</a>         Connect(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port)<font class="keyword"></font>
02159 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPTransmit::Connect(ia,port); };
02160         
02164         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02165"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a4">02165</a>         isPendingPacket(microtimeout_t timeout)<font class="keyword"></font>
02166 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPReceive::isInputReady(timeout/1000); };
02167         
02171         <font class="keyword">inline</font> size_t 
<a name="l02172"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a5">02172</a>         writePacket(<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>
02173 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPTransmit::Transmit((<font class="keyword">const</font> <font class="keywordtype">char</font>* <font class="keyword">const</font>)buffer,len); };
02174 
02178         <font class="keyword">inline</font> size_t
<a name="l02179"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a6">02179</a>         readPacket(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02180 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPReceive::Receive(buffer,len); };
02181 
02185         <font class="keyword">inline</font> sockerror_t 
<a name="l02186"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a7">02186</a>         setMulticast(<font class="keywordtype">bool</font> enable)<font class="keyword"></font>
02187 <font class="keyword">        </font>{ 
02188                 sockerror_t error = UDPReceive::setMulticast(enable);
02189                 <font class="keywordflow">if</font> (error) <font class="keywordflow">return</font> error;
02190                 <font class="keywordflow">else</font> <font class="keywordflow">return</font> UDPTransmit::setMulticast(enable); 
02191         };
02192         
02199         <font class="keyword">inline</font> sockerror_t
<a name="l02200"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a8">02200</a>         joinGroup(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02201 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPReceive::Join(ia); };
02202         
02209         <font class="keyword">inline</font> sockerror_t
<a name="l02210"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a9">02210</a>         leaveGroup(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02211 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPReceive::Drop(ia); }; 
02212 
02219         <font class="keyword">inline</font> sockerror_t
<a name="l02220"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a10">02220</a>         setMcastTTL(uint8 ttl)<font class="keyword"></font>
02221 <font class="keyword">        </font>{ <font class="keywordflow">return</font> UDPTransmit::setTimeToLive(ttl); };
02222 
02226         <font class="keywordtype">void</font> 
<a name="l02227"></a><a class="code" href="class_u_d_p_i_pv4_socket.html#a11">02227</a>         endSocket()<font class="keyword"></font>
02228 <font class="keyword">        </font>{ UDPTransmit::endTransmitter(); UDPReceive::endReceiver(); };
02229 };
02230 
02243 template &lt;typename serviceQueue, typename dataSocket, typename controlSocket&gt;
02244 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_t___r_t_p_socket.html">T_RTPSocket</a>  : <font class="keyword">public</font> serviceQueue
02245 {
02246 <font class="keyword">public</font>:
<a name="l02252"></a><a class="code" href="class_t___r_t_p_socket.html#a0">02252</a>         T_RTPSocket(<font class="keyword">const</font> InetHostAddress&amp; ia, tpport_t port = 5004, <font class="keywordtype">int</font> pri = 0) :
02253                 serviceQueue(pri)
02254         {
02255                 base = even_port(port);
02256                 dso = <font class="keyword">new</font> dataSocket(ia,even_port(port));
02257                 cso = <font class="keyword">new</font> controlSocket(ia,odd_port(port + 1));
02258         };
02259         
<a name="l02265"></a><a class="code" href="class_t___r_t_p_socket.html#a1">02265</a>         T_RTPSocket(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port = 5004, <font class="keywordtype">int</font> pri = 0):             
02266                 serviceQueue(pri)
02267 
02268         {
02269                 base = even_port(port);
02270                 dso = <font class="keyword">new</font> dataSocket(ia,even_port(port));
02271                 cso = <font class="keyword">new</font> controlSocket(ia,odd_port(port + 1));
02272         };
02273 
02277         <font class="keyword">virtual</font> 
<a name="l02278"></a><a class="code" href="class_t___r_t_p_socket.html#a2">02278</a>         ~T_RTPSocket()<font class="keyword"></font>
02279 <font class="keyword">        </font>{ endSocket(); };
02280 
02289         <font class="keyword">inline</font> sockerror_t 
<a name="l02290"></a><a class="code" href="class_t___r_t_p_socket.html#a3">02290</a>         Connect(<font class="keyword">const</font> InetHostAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02291 <font class="keyword">        </font>{ 
02292                 sockerror_t error;
02293                 <font class="keywordflow">if</font> ( !port )
02294                         port = base;
02295                 <font class="keywordflow">if</font> ( active )
02296                         active = <font class="keyword">false</font>;
02297                 <font class="comment">// make both RTP (even) and RTCP (odd) connections</font>
02298                 error = dso-&gt;Connect(ia, even_port(port));
02299                 <font class="keywordflow">if</font> ( error )
02300                         <font class="keywordflow">return</font> error;
02301                 error = cso-&gt;Connect(ia, odd_port(port + 1));
02302                 <font class="keywordflow">if</font> ( error )
02303                         <font class="keywordflow">return</font> error;
02304                 <font class="comment">// Start running the RTP queue service thread</font>
02305                 active = <font class="keyword">true</font>;
02306                 Start();  
02307                 <font class="keywordflow">return</font> SOCKET_SUCCESS;
02308         };
02309 
02315         <font class="keyword">inline</font> sockerror_t 
<a name="l02316"></a><a class="code" href="class_t___r_t_p_socket.html#a4">02316</a>         Connect(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02317 <font class="keyword">        </font>{
02318                 sockerror_t error = dso-&gt;setMulticast(<font class="keyword">true</font>);
02319                 <font class="keywordflow">if</font> (error)
02320                         <font class="keywordflow">return</font> error;
02321                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);
02322                 <font class="keywordflow">if</font> (error)
02323                         <font class="keywordflow">return</font> error;
02324 
02325                 <font class="keywordflow">if</font> ( !port )
02326                         port = base;
02327                 <font class="keywordflow">if</font> ( active )
02328                         active = <font class="keyword">false</font>;
02329                 <font class="comment">// make both RTP (even) and RTCP (odd) connections</font>
02330                 error = dso-&gt;Connect(ia, even_port(port));
02331                 <font class="keywordflow">if</font> ( error )
02332                         <font class="keywordflow">return</font> error;
02333                 error = cso-&gt;Connect(ia, odd_port(port + 1));
02334                 <font class="keywordflow">if</font> ( error )
02335                         <font class="keywordflow">return</font> error;
02336                 <font class="comment">// Start running the RTP queue service thread</font>
02337                 active = <font class="keyword">true</font>;
02338                 Start();  
02339                 <font class="keywordflow">return</font> SOCKET_SUCCESS;
02340         };
02341 
02348         <font class="keyword">inline</font> sockerror_t
<a name="l02349"></a><a class="code" href="class_t___r_t_p_socket.html#a5">02349</a>         joinGroup(<font class="keyword">const</font> InetMcastAddress&amp; ia, tpport_t port = 0)<font class="keyword"></font>
02350 <font class="keyword">        </font>{ 
02351                 sockerror_t error  = dso-&gt;setMulticast(<font class="keyword">true</font>);
02352                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02353                 error = dso-&gt;joinGroup(ia); 
02354                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02355                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);
02356                 <font class="keywordflow">if</font> ( error ) {
02357                         dso-&gt;leaveGroup(ia);
02358                         <font class="keywordflow">return</font> error;
02359                 }
02360                 error = cso-&gt;joinGroup(ia);
02361                 <font class="keywordflow">if</font> ( error ) {
02362                         dso-&gt;leaveGroup(ia);
02363                         <font class="keywordflow">return</font> error;
02364                 }
02365                 <font class="keywordflow">return</font> Connect(ia,port);
02366         };
02367 
02374         <font class="keyword">inline</font> sockerror_t
<a name="l02375"></a><a class="code" href="class_t___r_t_p_socket.html#a6">02375</a>         leaveGroup(<font class="keyword">const</font> InetMcastAddress&amp; ia)<font class="keyword"></font>
02376 <font class="keyword">        </font>{ 
02377                 sockerror_t error = dso-&gt;setMulticast(<font class="keyword">false</font>);
02378                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02379                 error = dso-&gt;leaveGroup(ia); 
02380                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02381                 error = cso-&gt;setMulticast(<font class="keyword">false</font>);
02382                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> errror;
02383                 <font class="keywordflow">return</font> cso-&gt;leaveGroup(ia);
02384         };
02385 
02392         <font class="keyword">inline</font> sockerror_t
<a name="l02393"></a><a class="code" href="class_t___r_t_p_socket.html#a7">02393</a>         setMcastTTL(uint8 ttl)<font class="keyword"></font>
02394 <font class="keyword">        </font>{ 
02395                 sockerror_t error = dso-&gt;setMulticast(<font class="keyword">true</font>);
02396                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02397                 error = dso-&gt;setTimeToLive(ttl); 
02398                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;
02399                 error = cso-&gt;setMulticast(<font class="keyword">true</font>);                
02400                 <font class="keywordflow">if</font> ( error ) <font class="keywordflow">return</font> error;              
02401                 <font class="keywordflow">return</font> cso-&gt;setTimeToLive(ttl);
02402         };
02403         
02404 <font class="keyword">protected</font>:
02408         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02409"></a><a class="code" href="class_t___r_t_p_socket.html#b0">02409</a>         isPendingData(microtimeout_t timeout)<font class="keyword"></font>
02410 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;isPendingPacket(timeout); };
02411 
02416         <font class="keyword">inline</font> size_t 
<a name="l02417"></a><a class="code" href="class_t___r_t_p_socket.html#b1">02417</a>         readData(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font>* buffer, size_t len)<font class="keyword"></font>
02418 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;readPacket(buffer, len); };
02419 
02424         <font class="keyword">inline</font> size_t 
<a name="l02425"></a><a class="code" href="class_t___r_t_p_socket.html#b2">02425</a>         writeData(<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>
02426 <font class="keyword">        </font>{ <font class="keywordflow">return</font> dso-&gt;writePacket(buffer, len); };
02427 
02432         <font class="keyword">inline</font> <font class="keywordtype">bool</font> 
<a name="l02433"></a><a class="code" href="class_t___r_t_p_socket.html#b3">02433</a>         isPendingControl(microtimeout_t timeout)<font class="keyword"></font>
02434 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;isPendingPacket(timeout); };
02435 
02441         <font class="keyword">inline</font> size_t 
<a name="l02442"></a><a class="code" href="class_t___r_t_p_socket.html#b4">02442</a>         readControl(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02443 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;readPacket(buffer,len); };
02444 
02450         <font class="keyword">inline</font> size_t
<a name="l02451"></a><a class="code" href="class_t___r_t_p_socket.html#b5">02451</a>         writeControl(<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>
02452 <font class="keyword">        </font>{ <font class="keywordflow">return</font> cso-&gt;writePacket(buffer,len); };
02453 
02454         <font class="keyword">inline</font> <font class="keywordtype">void</font>
<a name="l02455"></a><a class="code" href="class_t___r_t_p_socket.html#b6">02455</a>         endSocket()<font class="keyword"></font>
02456 <font class="keyword">        </font>{ dso-&gt;endSocket(); cso-&gt;endSocket(); };
02457 
02458 <font class="keyword">private</font>:
02466         <font class="keyword">inline</font> tpport_t
02467         odd_port(tpport_t port)<font class="keyword"></font>
02468 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (port &amp; 0x01)? (port) : (port - 1); };
02469         
02477         <font class="keyword">inline</font> tpport_t 
02478         even_port(tpport_t port)<font class="keyword"></font>
02479 <font class="keyword">        </font>{ <font class="keywordflow">return</font> (port &amp; 0x01)? (port - 1) : (port); };
02480 
02481         tpport_t base;
02482         dataSocket* dso;
02483         controlSocket* cso;
02484 };
02485 
<a name="l02492"></a><a class="code" href="rtp_8h.html#a8">02492</a> <font class="keyword">typedef</font> <a class="code" href="class_t___r_t_p_socket.html">T_RTPSocket&lt;QueueRTCPManager,UDPIPv4Socket,UDPIPv4Socket&gt;</a> <a class="code" href="class_t___r_t_p_socket.html">RTPSocket</a>;
02493 
02504 <font class="keyword">class </font>CCXX_CLASS_EXPORT <a class="code" href="class_r_t_p_duplex.html">RTPDuplex</a> : <font class="keyword">public</font> <a class="code" href="class_r_t_p_queue.html">RTPQueue</a>, <font class="keyword">protected</font> <a class="code" href="class_u_d_p_receive.html">UDPReceive</a>, <font class="keyword">public</font> <a class="code" href="class_u_d_p_transmit.html">UDPTransmit</a>
02505 {
02506 
02507 <font class="keyword">public</font>:
02508 
02515         RTPDuplex(<font class="keyword">const</font> InetAddress &amp;bind, tpport_t local, tpport_t remote, <font class="keywordtype">int</font> pri);
02516 
02520         <font class="keyword">virtual</font>
02521         ~RTPDuplex();
02522 
02529         sockerror_t 
02530         Connect(<font class="keyword">const</font> InetHostAddress &amp;host, tpport_t port = 0);
02531 
02532 <font class="keyword">protected</font>:
02533 
02538         <font class="keywordtype">bool</font> 
<a name="l02539"></a><a class="code" href="class_r_t_p_duplex.html#b0">02539</a>         isPendingData(microtimeout_t timeout)<font class="keyword"></font>
02540 <font class="keyword">        </font>{ <font class="keywordflow">return</font> isPendingReceive(timeout); }
02541 
02547         size_t 
<a name="l02548"></a><a class="code" href="class_r_t_p_duplex.html#b1">02548</a>         writeData(<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>
02549 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Transmit((<font class="keyword">const</font> <font class="keywordtype">char</font> *)buffer, len); }
02550 
02556         size_t 
<a name="l02557"></a><a class="code" href="class_r_t_p_duplex.html#b2">02557</a>         readData(<font class="keywordtype">unsigned</font> <font class="keywordtype">char</font> *buffer, size_t len)<font class="keyword"></font>
02558 <font class="keyword">        </font>{ <font class="keywordflow">return</font> Receive(buffer, len); }
02559 
02563         <a class="code" href="class_r_t_p_source.html">RTPSource</a> &amp;getPeer();
02564 
02565 <font class="keyword">private</font>:
02566 
02567         tpport_t base;
02568 };
02569 
02570 <font class="preprocessor">#ifdef  CCXX_NAMESPACES</font>
02571 <font class="preprocessor"></font>};
02572 <font class="preprocessor">#endif</font>
02573 <font class="preprocessor"></font>
02574 <font class="preprocessor">#endif  //__CCXX_RTP_H__</font>
02575 <font class="preprocessor"></font>
</pre></div><hr><address><small>Generated at Sat Jan 5 09:08:53 2002 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.10 written by <a href="mailto:dimitri@stack.nl">Dimitri van Heesch</a>,
 &copy;&nbsp;1997-2001</small></address>
</body>
</html>