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