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