session-rtp.tcl
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:7k
源码类别:

通讯编程

开发平台:

Visual C++

  1. #
  2. # Copyright (c) 1997 Regents of the University of California.
  3. # All rights reserved.
  4. # Redistribution and use in source and binary forms, with or without
  5. # modification, are permitted provided that the following conditions
  6. # are met:
  7. # 1. Redistributions of source code must retain the above copyright
  8. #    notice, this list of conditions and the following disclaimer.
  9. # 2. Redistributions in binary form must reproduce the above copyright
  10. #    notice, this list of conditions and the following disclaimer in the
  11. #    documentation and/or other materials provided with the distribution.
  12. # 3. All advertising materials mentioning features or use of this software
  13. #    must display the following acknowledgement:
  14. #  This product includes software developed by the MASH Research
  15. #  Group at the University of California Berkeley.
  16. # 4. Neither the name of the University nor of the Research Group may be
  17. #    used to endorse or promote products derived from this software without
  18. #    specific prior written permission.
  19. # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  20. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  21. # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  22. # ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  23. # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  24. # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  25. # OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  26. # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  27. # LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  28. # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  29. # SUCH DAMAGE.
  30. #
  31. # @(#) $Header: /cvsroot/nsnam/ns-2/tcl/rtp/session-rtp.tcl,v 1.10 2000/08/18 18:34:05 haoboy Exp $
  32. #
  33. proc mvar args {
  34. upvar self _s
  35. uplevel $_s instvar $args
  36. }
  37. Session/RTP set uniq_srcid 0
  38. Session/RTP proc alloc_srcid {} {
  39. set id [Session/RTP set uniq_srcid]
  40. Session/RTP set uniq_srcid [expr $id+1]
  41. return $id
  42. }
  43. Session/RTP instproc init {} {
  44. $self next 
  45. mvar dchan_ cchan_
  46. set cchan_ [new Agent/RTCP]
  47. set dchan_ [new Agent/CBR/RTP]
  48. $dchan_ set packetSize_ 512
  49. $dchan_ session $self
  50. $cchan_ session $self
  51. $self set rtcp_timer_ [new RTCPTimer $self]
  52. mvar srcid_ localsrc_
  53. set srcid_ [Session/RTP alloc_srcid]
  54. set localsrc_ [new RTPSource $srcid_]
  55. $self localsrc $localsrc_
  56. $self set srctab_ $localsrc_
  57. $self set stopped_ 1
  58. }
  59. Session/RTP instproc start {} {
  60. mvar group_
  61. if ![info exists group_] {
  62. puts "error: can't transmit before joining group!"
  63. exit 1
  64. }
  65. mvar cchan_ 
  66. $cchan_ start 
  67. }
  68. Session/RTP instproc stop {} {
  69. $self instvar cchan_ dchan_
  70. $dchan_ stop
  71. $cchan_ stop
  72. $self set stopped_ 1
  73. }
  74. Session/RTP instproc report-interval { i } {
  75. mvar cchan_
  76. $cchan_ set interval_ $i
  77. }
  78. Session/RTP instproc bye {} {
  79. mvar cchan_ dchan_
  80. $dchan_ stop
  81. $cchan_ bye
  82. }
  83. Session/RTP instproc attach-node { node } {
  84. mvar dchan_ cchan_
  85. global ns
  86. $ns attach-agent $node $dchan_
  87. $ns attach-agent $node $cchan_
  88. $self set node_ $node
  89. }
  90. Session/RTP instproc detach-node { node } {
  91. mvar dchan_ cchan_
  92. global ns
  93. $ns detach-agent $node $dchan_
  94. $ns detach-agent $node $cchan_
  95. $self unset node_
  96. }
  97. # Hook to enable easy syncronization with RTCP timeouts.
  98. Session/RTP instproc rtcp_timeout {} {
  99. mvar rtcp_timeout_callback_
  100. if [info exists rtcp_timeout_callback_] {
  101. eval $rtcp_timeout_callback_
  102. }
  103. }
  104. Session/RTP instproc join-group { g } {
  105. set g [expr $g]
  106. $self set group_ $g
  107. mvar node_ dchan_ cchan_ 
  108. $dchan_ set dst_ $g
  109. $node_ join-group $dchan_ $g
  110. incr g
  111. $cchan_ set dst_ $g
  112. $node_ join-group $cchan_ $g
  113. }
  114. Session/RTP instproc leave-group { } {
  115. mvar group_ node_ cchan_ dchan_
  116. $node_ leave-group $dchan_ $group_
  117. $node_ leave-group $cchan_ [expr $group_+1]
  118. $self unset group_
  119. }
  120. Session/RTP instproc session_bw { bspec } {
  121. set b [bw_parse $bspec]
  122. $self set session_bw_ $b
  123.     
  124. mvar rtcp_timer_
  125. $rtcp_timer_ session-bw $b
  126. }
  127. Session/RTP instproc transmit { bspec } {
  128. set b [bw_parse $bspec]
  129. #mvar srcid_
  130. #global ns
  131. #puts "[$ns now] $self $srcid_ transmit $b"
  132. $self set txBW_ $b
  133. $self instvar dchan_ stopped_
  134. if { $b == 0 } {
  135. $dchan_ stop
  136. set stopped_ 1
  137. }
  138. set ps [$dchan_ set packetSize_]
  139. $dchan_ set interval_  [expr 8.*$ps/$b]
  140. if { $stopped_ == 1 } {
  141. $dchan_ start
  142. set stopped_ 0
  143. } else {
  144. $dchan_ rate-change
  145. }
  146. }
  147. Session/RTP instproc sample-size { cc } {
  148. mvar rtcp_timer_
  149. $rtcp_timer_ sample-size $cc
  150. }
  151. Session/RTP instproc adapt-timer { nsrc nrr we_sent } {
  152. mvar rtcp_timer_
  153. $rtcp_timer_ adapt $nsrc $nrr $we_sent
  154. }
  155. Session/RTP instproc new-source { srcid } {
  156. set src [new RTPSource $srcid]
  157. $self enter $src
  158. mvar srctab_
  159. lappend srctab_ $src
  160. return $src
  161. }
  162. Class RTCPTimer 
  163. RTCPTimer instproc init { session } {
  164. $self next
  165. # Could make most of these class instvars.
  166. mvar session_bw_fraction_ min_rpt_time_ inv_sender_bw_fraction_
  167. mvar inv_rcvr_bw_fraction_ size_gain_ avg_size_ inv_bw_
  168. set session_bw_fraction_ 0.05
  169. # XXX just so we see some reports in short sim's...
  170. set min_rpt_time_ 1.   
  171. set sender_bw_fraction 0.25
  172. set rcvr_bw_fraction [expr 1. - $sender_bw_fraction]
  173. set inv_sender_bw_fraction_ [expr 1. / $sender_bw_fraction]
  174. set inv_rcvr_bw_fraction_ [expr 1. / $rcvr_bw_fraction]
  175. set size_gain_ 0.125
  176. set avg_size_ 128.
  177. set inv_bw_ 0.
  178. mvar session_
  179. set session_ $session
  180.         # Schedule a timer for our first report using half the
  181.         # min ctrl interval.  This gives us some time before
  182.         # our first report to learn about other sources so our
  183.         # next report interval will account for them.  The avg
  184.         # ctrl size was initialized to 128 bytes which is
  185.         # conservative (it assumes everyone else is generating
  186.         # SRs instead of RRs).
  187. mvar min_rtp_time_ avg_size_ inv_bw_
  188. set rint [expr 8*$avg_size_ * $inv_bw_]
  189. set t [expr $min_rpt_time_ / 2.]
  190. if { $rint < $t } {
  191. set rint $t
  192. }
  193. $session_ report-interval $rint
  194. }
  195. RTCPTimer instproc sample-size { cc } {
  196. mvar avg_size_ size_gain_
  197. set avg_size_ [expr $avg_size_ + $size_gain_ * ($cc + 28 - $avg_size_)]
  198. }
  199. RTCPTimer instproc adapt { nsrc nrr we_sent } {
  200. mvar inv_bw_ avg_size_ min_rpt_time_
  201. mvar inv_sender_bw_fraction_ inv_rcvr_bw_fraction_
  202.  # Compute the time to the next report.  we do this here
  203.  # because we need to know if there were any active sources
  204.  # during the last report period (nrr above) & if we were
  205.  # a source.  The bandwidth limit for ctrl traffic was set
  206.  # on startup from the session bandwidth.  It is the inverse
  207.  # of bandwidth (ie., ms/byte) to avoid a divide below.
  208. set ibw $inv_bw_
  209. if { $nrr > 0 } {
  210. if { $we_sent } {
  211. set ibw [expr $ibw * $inv_sender_bw_fraction_]
  212. set nsrc $nrr
  213. } else {
  214. set ibw [expr $ibw * $inv_rcvr_bw_fraction_]
  215. incr nsrc -$nrr
  216. }
  217. }
  218. set rint [expr 8*$avg_size_ * $nsrc * $ibw]
  219. if { $rint < $min_rpt_time_ } {
  220. set rint $min_rpt_time_
  221. }
  222. mvar session_
  223. $session_ report-interval $rint
  224. }
  225. RTCPTimer instproc session-bw { b } {
  226. $self set inv_bw_ [expr 1. / $b ]
  227. }
  228. Agent/RTCP set interval_ 0.
  229. Agent/RTCP set random_ 0
  230. Agent/RTCP set class_ 32
  231. RTPSource set srcid_ -1