mediasoup 3.26.0 → 3.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (310) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/node/lib/DataConsumer.js +1 -1
  3. package/node/lib/Router.js +1 -1
  4. package/node/lib/Transport.js +15 -15
  5. package/node/lib/fbs/rtp-parameters/encoding-mapping.d.ts +2 -6
  6. package/node/lib/fbs/rtp-parameters/encoding-mapping.d.ts.map +1 -1
  7. package/node/lib/fbs/rtp-parameters/encoding-mapping.js +7 -19
  8. package/node/lib/fbs/rtp-parameters/rtp-encoding-parameters.d.ts +4 -4
  9. package/node/lib/fbs/rtp-parameters/rtp-encoding-parameters.js +2 -2
  10. package/node/lib/fbs/rtp-stream/bitrate-by-layer.d.ts +5 -5
  11. package/node/lib/fbs/rtp-stream/bitrate-by-layer.d.ts.map +1 -1
  12. package/node/lib/fbs/rtp-stream/bitrate-by-layer.js +3 -3
  13. package/node/lib/fbs/rtp-stream/recv-stats.d.ts +5 -5
  14. package/node/lib/fbs/rtp-stream/recv-stats.d.ts.map +1 -1
  15. package/node/lib/fbs/rtp-stream/recv-stats.js +3 -3
  16. package/node/lib/fbs/rtp-stream/send-stats.d.ts +5 -5
  17. package/node/lib/fbs/rtp-stream/send-stats.d.ts.map +1 -1
  18. package/node/lib/fbs/rtp-stream/send-stats.js +3 -3
  19. package/node/lib/fbs/transport/bwe-trace-info.d.ts +23 -23
  20. package/node/lib/fbs/transport/bwe-trace-info.d.ts.map +1 -1
  21. package/node/lib/fbs/transport/bwe-trace-info.js +15 -15
  22. package/node/lib/fbs/transport/options.d.ts +5 -5
  23. package/node/lib/fbs/transport/options.js +2 -2
  24. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.d.ts +5 -5
  25. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.d.ts.map +1 -1
  26. package/node/lib/fbs/transport/set-max-incoming-bitrate-request.js +3 -3
  27. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.d.ts +5 -5
  28. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.d.ts.map +1 -1
  29. package/node/lib/fbs/transport/set-max-outgoing-bitrate-request.js +3 -3
  30. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.d.ts +5 -5
  31. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.d.ts.map +1 -1
  32. package/node/lib/fbs/transport/set-min-outgoing-bitrate-request.js +3 -3
  33. package/node/lib/fbs/transport/stats.d.ts +38 -38
  34. package/node/lib/fbs/transport/stats.d.ts.map +1 -1
  35. package/node/lib/fbs/transport/stats.js +25 -25
  36. package/node/lib/ortc.d.ts +0 -1
  37. package/node/lib/ortc.d.ts.map +1 -1
  38. package/node/lib/ortc.js +1 -2
  39. package/node/lib/rtpParametersFbsUtils.d.ts.map +1 -1
  40. package/node/lib/rtpParametersFbsUtils.js +2 -2
  41. package/package.json +9 -9
  42. package/worker/deps/libwebrtc/libwebrtc/call/rtp_transport_controller_send.cc +10 -10
  43. package/worker/deps/libwebrtc/libwebrtc/mediasoup_helpers.h +6 -6
  44. package/worker/deps/libwebrtc/libwebrtc/modules/congestion_controller/goog_cc/alr_detector.cc +1 -1
  45. package/worker/deps/libwebrtc/libwebrtc/modules/pacing/paced_sender.cc +7 -7
  46. package/worker/deps/libwebrtc/libwebrtc/modules/remote_bitrate_estimator/include/remote_bitrate_estimator.h +1 -1
  47. package/worker/deps/libwebrtc/libwebrtc/modules/remote_bitrate_estimator/remote_bitrate_estimator_abs_send_time.cc +1 -1
  48. package/worker/fbs/rtpParameters.fbs +1 -2
  49. package/worker/fbs/rtpStream.fbs +3 -3
  50. package/worker/fbs/transport.fbs +23 -23
  51. package/worker/fuzzer/include/RTC/FuzzerDtlsTransport.hpp +4 -1
  52. package/worker/fuzzer/src/FuzzerUtils.cpp +5 -3
  53. package/worker/fuzzer/src/RTC/FuzzerDtlsTransport.cpp +8 -5
  54. package/worker/fuzzer/src/RTC/FuzzerRateCalculator.cpp +3 -3
  55. package/worker/fuzzer/src/RTC/FuzzerTrendCalculator.cpp +6 -6
  56. package/worker/fuzzer/src/RTC/RTCP/FuzzerFeedbackRtpTransport.cpp +3 -3
  57. package/worker/fuzzer/src/RTC/RTP/FuzzerPacket.cpp +2 -2
  58. package/worker/fuzzer/src/RTC/RTP/FuzzerRetransmissionBuffer.cpp +5 -5
  59. package/worker/fuzzer/src/RTC/RTP/FuzzerRtpStreamSend.cpp +3 -3
  60. package/worker/fuzzer/src/fuzzer.cpp +4 -0
  61. package/worker/include/Channel/ChannelNotification.hpp +3 -3
  62. package/worker/include/Channel/ChannelRequest.hpp +1 -1
  63. package/worker/include/Channel/ChannelSocket.hpp +11 -0
  64. package/worker/include/DepLibUV.hpp +16 -33
  65. package/worker/include/RTC/ActiveSpeakerObserver.hpp +11 -11
  66. package/worker/include/RTC/AudioLevelObserver.hpp +4 -4
  67. package/worker/include/RTC/BWE/AcknowledgedBitrateEstimatorInterface.hpp +55 -0
  68. package/worker/include/RTC/BWE/AimdRateControl.hpp +190 -0
  69. package/worker/include/RTC/BWE/BweTypes.hpp +211 -0
  70. package/worker/include/RTC/BWE/DelayBasedBwe.hpp +173 -0
  71. package/worker/include/RTC/BWE/FeedbackAdapter.hpp +72 -0
  72. package/worker/include/RTC/BWE/InterArrivalDelta.hpp +106 -0
  73. package/worker/include/RTC/BWE/LinkCapacityEstimator.hpp +84 -0
  74. package/worker/include/RTC/BWE/RobustThroughputEstimator.hpp +94 -0
  75. package/worker/include/RTC/BWE/SendPacketHistory.hpp +137 -0
  76. package/worker/include/RTC/BWE/TrendlineEstimator.hpp +101 -0
  77. package/worker/include/RTC/Consts.hpp +6 -6
  78. package/worker/include/RTC/Consumer.hpp +14 -12
  79. package/worker/include/RTC/DataConsumer.hpp +3 -3
  80. package/worker/include/RTC/DataProducer.hpp +3 -3
  81. package/worker/include/RTC/DtlsTransport.hpp +5 -2
  82. package/worker/include/RTC/ICE/IceCandidate.hpp +2 -2
  83. package/worker/include/RTC/ICE/IceServer.hpp +3 -3
  84. package/worker/include/RTC/KeyFrameRequestManager.hpp +3 -3
  85. package/worker/include/RTC/NEW_RTCP/packet/Packet.hpp +1 -1
  86. package/worker/include/RTC/NackGenerator.hpp +12 -12
  87. package/worker/include/RTC/PipeProducerStreamManager.hpp +3 -4
  88. package/worker/include/RTC/PipeTransport.hpp +18 -5
  89. package/worker/include/RTC/PlainTransport.hpp +18 -5
  90. package/worker/include/RTC/PortManager.hpp +4 -4
  91. package/worker/include/RTC/Producer.hpp +21 -12
  92. package/worker/include/RTC/ProducerStreamManager.hpp +12 -6
  93. package/worker/include/RTC/RTCP/Bye.hpp +2 -2
  94. package/worker/include/RTC/RTCP/FeedbackPsRemb.hpp +4 -4
  95. package/worker/include/RTC/RTCP/FeedbackRtpTmmb.hpp +3 -3
  96. package/worker/include/RTC/RTCP/FeedbackRtpTransport.hpp +54 -39
  97. package/worker/include/RTC/RTCP/Packet.hpp +3 -3
  98. package/worker/include/RTC/RTCP/ReceiverReport.hpp +3 -3
  99. package/worker/include/RTC/RTCP/Sdes.hpp +2 -2
  100. package/worker/include/RTC/RTCP/XR.hpp +2 -2
  101. package/worker/include/RTC/RTCP/XrDelaySinceLastRr.hpp +1 -1
  102. package/worker/include/RTC/RTP/Codecs/H264.hpp +1 -1
  103. package/worker/include/RTC/RTP/Codecs/Opus.hpp +2 -2
  104. package/worker/include/RTC/RTP/Codecs/PayloadDescriptorHandler.hpp +3 -3
  105. package/worker/include/RTC/RTP/Codecs/VP8.hpp +2 -2
  106. package/worker/include/RTC/RTP/Codecs/VP9.hpp +2 -2
  107. package/worker/include/RTC/RTP/HeaderExtensionIds.hpp +12 -12
  108. package/worker/include/RTC/RTP/Packet.hpp +13 -13
  109. package/worker/include/RTC/RTP/ProbationGenerator.hpp +1 -1
  110. package/worker/include/RTC/RTP/RetransmissionBuffer.hpp +7 -7
  111. package/worker/include/RTC/RTP/RtpStream.hpp +37 -51
  112. package/worker/include/RTC/RTP/RtpStreamRecv.hpp +59 -41
  113. package/worker/include/RTC/RTP/RtpStreamSend.hpp +20 -14
  114. package/worker/include/RTC/RTP/RtxStream.hpp +12 -13
  115. package/worker/include/RTC/RateCalculator.hpp +50 -44
  116. package/worker/include/RTC/RemoteCaptureTimeEstimator.hpp +5 -4
  117. package/worker/include/RTC/RemoteClockOffsetEstimator.hpp +11 -11
  118. package/worker/include/RTC/Router.hpp +6 -0
  119. package/worker/include/RTC/RtcLogger.hpp +1 -1
  120. package/worker/include/RTC/RtpDictionaries.hpp +10 -10
  121. package/worker/include/RTC/SCTP/association/Association.hpp +56 -28
  122. package/worker/include/RTC/SCTP/association/HeartbeatHandler.hpp +4 -4
  123. package/worker/include/RTC/SCTP/association/StateCookie.hpp +14 -14
  124. package/worker/include/RTC/SCTP/association/StreamResetHandler.hpp +2 -2
  125. package/worker/include/RTC/SCTP/association/TransmissionControlBlock.hpp +12 -12
  126. package/worker/include/RTC/SCTP/association/TransmissionControlBlockContextInterface.hpp +4 -4
  127. package/worker/include/RTC/SCTP/packet/TLV.hpp +1 -1
  128. package/worker/include/RTC/SCTP/packet/parameters/StateCookieParameter.hpp +3 -3
  129. package/worker/include/RTC/SCTP/public/AssociationInterface.hpp +4 -1
  130. package/worker/include/RTC/SCTP/public/AssociationMetrics.hpp +1 -1
  131. package/worker/include/RTC/SCTP/public/SctpOptions.hpp +12 -12
  132. package/worker/include/RTC/SCTP/public/SctpTypes.hpp +1 -1
  133. package/worker/include/RTC/SCTP/tx/OutstandingData.hpp +15 -16
  134. package/worker/include/RTC/SCTP/tx/RetransmissionQueue.hpp +7 -8
  135. package/worker/include/RTC/SCTP/tx/RetransmissionTimeout.hpp +20 -16
  136. package/worker/include/RTC/SCTP/tx/RoundRobinSendQueue.hpp +5 -6
  137. package/worker/include/RTC/SCTP/tx/SendQueueInterface.hpp +2 -2
  138. package/worker/include/RTC/SCTP/tx/StreamScheduler.hpp +5 -5
  139. package/worker/include/RTC/SctpDictionaries.hpp +3 -3
  140. package/worker/include/RTC/Serializable.hpp +1 -1
  141. package/worker/include/RTC/SimpleProducerStreamManager.hpp +3 -4
  142. package/worker/include/RTC/SimulcastProducerStreamManager.hpp +6 -7
  143. package/worker/include/RTC/SvcProducerStreamManager.hpp +6 -5
  144. package/worker/include/RTC/TcpConnection.hpp +9 -3
  145. package/worker/include/RTC/TcpServer.hpp +3 -0
  146. package/worker/include/RTC/Transport.hpp +52 -45
  147. package/worker/include/RTC/TransportCongestionControlClient.hpp +30 -25
  148. package/worker/include/RTC/TransportCongestionControlServer.hpp +17 -17
  149. package/worker/include/RTC/TrendCalculator.hpp +5 -5
  150. package/worker/include/RTC/UdpSocket.hpp +11 -2
  151. package/worker/include/RTC/WebRtcServer.hpp +20 -5
  152. package/worker/include/RTC/WebRtcTransport.hpp +35 -10
  153. package/worker/include/Settings.hpp +4 -2
  154. package/worker/include/Shared.hpp +5 -20
  155. package/worker/include/SharedInterface.hpp +6 -28
  156. package/worker/include/Utils.hpp +40 -21
  157. package/worker/include/common.hpp +4 -0
  158. package/worker/include/handles/BackoffTimerHandle.hpp +4 -4
  159. package/worker/include/handles/BackoffTimerHandleInterface.hpp +5 -5
  160. package/worker/include/handles/TcpConnectionHandle.hpp +6 -6
  161. package/worker/include/handles/TcpServerHandle.hpp +1 -1
  162. package/worker/include/handles/TimerHandle.hpp +15 -9
  163. package/worker/include/handles/TimerHandleInterface.hpp +10 -4
  164. package/worker/include/handles/UdpSocketHandle.hpp +3 -3
  165. package/worker/include/handles/UnixStreamSocketHandle.hpp +2 -2
  166. package/worker/meson.build +81 -36
  167. package/worker/meson_options.txt +1 -0
  168. package/worker/mocks/include/MockShared.hpp +24 -23
  169. package/worker/mocks/include/RTC/SCTP/association/MockTransmissionControlBlockContext.hpp +51 -27
  170. package/worker/mocks/include/RTC/SCTP/tx/MockSendQueue.hpp +11 -11
  171. package/worker/mocks/include/handles/MockBackoffTimerHandle.hpp +10 -10
  172. package/worker/mocks/include/handles/MockTimerHandle.hpp +60 -22
  173. package/worker/mocks/src/MockShared.cpp +51 -5
  174. package/worker/mocks/src/handles/MockBackoffTimerHandle.cpp +29 -15
  175. package/worker/mocks/src/handles/MockTimerHandle.cpp +117 -0
  176. package/worker/scripts/clang-scripts.mjs +2 -2
  177. package/worker/src/Channel/ChannelNotification.cpp +5 -6
  178. package/worker/src/Channel/ChannelSocket.cpp +20 -2
  179. package/worker/src/DepLibUV.cpp +4 -5
  180. package/worker/src/RTC/ActiveSpeakerObserver.cpp +59 -47
  181. package/worker/src/RTC/AudioLevelObserver.cpp +7 -7
  182. package/worker/src/RTC/BWE/AimdRateControl.cpp +468 -0
  183. package/worker/src/RTC/BWE/BweTypes.cpp +61 -0
  184. package/worker/src/RTC/BWE/DelayBasedBwe.cpp +275 -0
  185. package/worker/src/RTC/BWE/FeedbackAdapter.cpp +148 -0
  186. package/worker/src/RTC/BWE/InterArrivalDelta.cpp +181 -0
  187. package/worker/src/RTC/BWE/LinkCapacityEstimator.cpp +133 -0
  188. package/worker/src/RTC/BWE/RobustThroughputEstimator.cpp +245 -0
  189. package/worker/src/RTC/BWE/SendPacketHistory.cpp +184 -0
  190. package/worker/src/RTC/BWE/TrendlineEstimator.cpp +233 -0
  191. package/worker/src/RTC/Consumer.cpp +48 -35
  192. package/worker/src/RTC/DataConsumer.cpp +4 -4
  193. package/worker/src/RTC/DataProducer.cpp +3 -3
  194. package/worker/src/RTC/DirectTransport.cpp +2 -2
  195. package/worker/src/RTC/DtlsTransport.cpp +14 -11
  196. package/worker/src/RTC/ICE/IceServer.cpp +2 -2
  197. package/worker/src/RTC/KeyFrameRequestManager.cpp +16 -12
  198. package/worker/src/RTC/NackGenerator.cpp +12 -12
  199. package/worker/src/RTC/PipeProducerStreamManager.cpp +6 -6
  200. package/worker/src/RTC/PipeTransport.cpp +16 -13
  201. package/worker/src/RTC/PlainTransport.cpp +25 -16
  202. package/worker/src/RTC/Producer.cpp +50 -36
  203. package/worker/src/RTC/RTCP/FeedbackPsRemb.cpp +13 -6
  204. package/worker/src/RTC/RTCP/FeedbackRtpTmmb.cpp +14 -5
  205. package/worker/src/RTC/RTCP/FeedbackRtpTransport.cpp +76 -50
  206. package/worker/src/RTC/RTP/Codecs/VP8.cpp +1 -1
  207. package/worker/src/RTC/RTP/Codecs/VP9.cpp +4 -4
  208. package/worker/src/RTC/RTP/Packet.cpp +9 -10
  209. package/worker/src/RTC/RTP/RetransmissionBuffer.cpp +6 -6
  210. package/worker/src/RTC/RTP/RtpStream.cpp +19 -19
  211. package/worker/src/RTC/RTP/RtpStreamRecv.cpp +146 -81
  212. package/worker/src/RTC/RTP/RtpStreamSend.cpp +49 -44
  213. package/worker/src/RTC/RTP/RtxStream.cpp +7 -10
  214. package/worker/src/RTC/RateCalculator.cpp +99 -136
  215. package/worker/src/RTC/RemoteCaptureTimeEstimator.cpp +13 -13
  216. package/worker/src/RTC/RemoteClockOffsetEstimator.cpp +18 -17
  217. package/worker/src/RTC/Router.cpp +18 -1
  218. package/worker/src/RTC/RtpDictionaries/RtpEncodingParameters.cpp +5 -2
  219. package/worker/src/RTC/SCTP/association/Association.cpp +131 -102
  220. package/worker/src/RTC/SCTP/association/AssociationListenerDeferrer.cpp +4 -4
  221. package/worker/src/RTC/SCTP/association/Capabilities.cpp +1 -1
  222. package/worker/src/RTC/SCTP/association/HeartbeatHandler.cpp +25 -18
  223. package/worker/src/RTC/SCTP/association/StateCookie.cpp +7 -6
  224. package/worker/src/RTC/SCTP/association/StreamResetHandler.cpp +16 -13
  225. package/worker/src/RTC/SCTP/association/TransmissionControlBlock.cpp +28 -26
  226. package/worker/src/RTC/SCTP/packet/chunks/SackChunk.cpp +0 -1
  227. package/worker/src/RTC/SCTP/packet/parameters/StateCookieParameter.cpp +2 -2
  228. package/worker/src/RTC/SCTP/public/AssociationMetrics.cpp +1 -1
  229. package/worker/src/RTC/SCTP/public/SctpOptions.cpp +13 -13
  230. package/worker/src/RTC/SCTP/rx/DataTracker.cpp +1 -1
  231. package/worker/src/RTC/SCTP/rx/ReassemblyQueue.cpp +5 -5
  232. package/worker/src/RTC/SCTP/tx/OutstandingData.cpp +15 -15
  233. package/worker/src/RTC/SCTP/tx/RetransmissionQueue.cpp +15 -15
  234. package/worker/src/RTC/SCTP/tx/RetransmissionTimeout.cpp +29 -26
  235. package/worker/src/RTC/SCTP/tx/RoundRobinSendQueue.cpp +12 -11
  236. package/worker/src/RTC/SCTP/tx/StreamScheduler.cpp +4 -4
  237. package/worker/src/RTC/SctpDictionaries/SctpStreamParameters.cpp +2 -2
  238. package/worker/src/RTC/SimpleProducerStreamManager.cpp +10 -10
  239. package/worker/src/RTC/SimulcastProducerStreamManager.cpp +39 -37
  240. package/worker/src/RTC/SvcProducerStreamManager.cpp +39 -25
  241. package/worker/src/RTC/TcpConnection.cpp +9 -3
  242. package/worker/src/RTC/TcpServer.cpp +7 -2
  243. package/worker/src/RTC/Transport.cpp +242 -302
  244. package/worker/src/RTC/TransportCongestionControlClient.cpp +78 -71
  245. package/worker/src/RTC/TransportCongestionControlServer.cpp +38 -40
  246. package/worker/src/RTC/TrendCalculator.cpp +3 -3
  247. package/worker/src/RTC/UdpSocket.cpp +14 -3
  248. package/worker/src/RTC/WebRtcServer.cpp +20 -14
  249. package/worker/src/RTC/WebRtcTransport.cpp +35 -30
  250. package/worker/src/Settings.cpp +10 -0
  251. package/worker/src/Shared.cpp +2 -2
  252. package/worker/src/Utils/Crypto.cpp +2 -2
  253. package/worker/src/Worker.cpp +5 -1
  254. package/worker/src/handles/BackoffTimerHandle.cpp +24 -11
  255. package/worker/src/handles/TimerHandle.cpp +74 -25
  256. package/worker/src/lib.cpp +6 -0
  257. package/worker/tasks.py +171 -44
  258. package/worker/test/include/RTC/BWE/helpers/LinkSimulator.hpp +117 -0
  259. package/worker/test/src/RTC/BWE/TestAimdRateControl.cpp +400 -0
  260. package/worker/test/src/RTC/BWE/TestDelayBasedBwe.cpp +568 -0
  261. package/worker/test/src/RTC/BWE/TestFeedbackAdapter.cpp +546 -0
  262. package/worker/test/src/RTC/BWE/TestInterArrivalDelta.cpp +301 -0
  263. package/worker/test/src/RTC/BWE/TestLinkCapacityEstimator.cpp +115 -0
  264. package/worker/test/src/RTC/BWE/TestRobustThroughputEstimator.cpp +433 -0
  265. package/worker/test/src/RTC/BWE/TestSendPacketHistory.cpp +259 -0
  266. package/worker/test/src/RTC/BWE/TestTrendlineEstimator.cpp +137 -0
  267. package/worker/test/src/RTC/BWE/helpers/LinkSimulator.cpp +171 -0
  268. package/worker/test/src/RTC/RTCP/TestFeedbackPsRemb.cpp +1 -1
  269. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTmmb.cpp +1 -1
  270. package/worker/test/src/RTC/RTCP/TestFeedbackRtpTransport.cpp +246 -208
  271. package/worker/test/src/RTC/RTP/TestPacket.cpp +11 -11
  272. package/worker/test/src/RTC/RTP/TestRetransmissionBuffer.cpp +12 -12
  273. package/worker/test/src/RTC/RTP/TestRtpStreamRecv.cpp +23 -16
  274. package/worker/test/src/RTC/RTP/TestRtpStreamSend.cpp +13 -13
  275. package/worker/test/src/RTC/SCTP/association/TestAssociation.cpp +27 -22
  276. package/worker/test/src/RTC/SCTP/association/TestHeartbeatHandler.cpp +21 -15
  277. package/worker/test/src/RTC/SCTP/association/TestStateCookie.cpp +6 -6
  278. package/worker/test/src/RTC/SCTP/association/TestStreamResetHandler.cpp +17 -13
  279. package/worker/test/src/RTC/SCTP/association/TestTransmissionControlBlock.cpp +3 -3
  280. package/worker/test/src/RTC/SCTP/packet/chunks/TestForwardTsnChunk.cpp +2 -2
  281. package/worker/test/src/RTC/SCTP/packet/chunks/TestIForwardTsnChunk.cpp +23 -23
  282. package/worker/test/src/RTC/SCTP/packet/chunks/TestInitChunk.cpp +1 -1
  283. package/worker/test/src/RTC/SCTP/packet/chunks/TestSackChunk.cpp +1 -1
  284. package/worker/test/src/RTC/SCTP/packet/parameters/TestIPv6AddressParameter.cpp +1 -1
  285. package/worker/test/src/RTC/SCTP/rx/TestDataTracker.cpp +37 -37
  286. package/worker/test/src/RTC/SCTP/rx/TestInterleavedReassemblyStreams.cpp +10 -10
  287. package/worker/test/src/RTC/SCTP/rx/TestReassemblyQueue.cpp +1 -1
  288. package/worker/test/src/RTC/SCTP/tx/TestOutstandingData.cpp +93 -93
  289. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionQueue.cpp +247 -247
  290. package/worker/test/src/RTC/SCTP/tx/TestRetransmissionTimeout.cpp +100 -80
  291. package/worker/test/src/RTC/SCTP/tx/TestRoundRobinSendQueue.cpp +163 -163
  292. package/worker/test/src/RTC/SCTP/tx/TestStreamScheduler.cpp +76 -77
  293. package/worker/test/src/RTC/TestConsumer.cpp +8 -3
  294. package/worker/test/src/RTC/TestKeyFrameRequestManager.cpp +3 -3
  295. package/worker/test/src/RTC/TestNackGenerator.cpp +3 -3
  296. package/worker/test/src/RTC/TestPipeProducerStreamManager.cpp +5 -5
  297. package/worker/test/src/RTC/TestRateCalculator.cpp +110 -14
  298. package/worker/test/src/RTC/TestRemoteCaptureTimeEstimator.cpp +22 -17
  299. package/worker/test/src/RTC/TestRemoteClockOffsetEstimator.cpp +87 -85
  300. package/worker/test/src/RTC/TestSimpleProducerStreamManager.cpp +54 -47
  301. package/worker/test/src/RTC/TestSimulcastProducerStreamManager.cpp +83 -69
  302. package/worker/test/src/RTC/TestSvcProducerStreamManager.cpp +76 -65
  303. package/worker/test/src/RTC/TestTransportCongestionControlServer.cpp +72 -66
  304. package/worker/test/src/RTC/TestTransportTuple.cpp +19 -4
  305. package/worker/test/src/TestDepLibUV.cpp +19 -0
  306. package/worker/test/src/Utils/TestTime.cpp +57 -26
  307. package/worker/test/src/testHelpers.cpp +1 -1
  308. package/worker/test/src/tests.cpp +6 -0
  309. package/worker/include/RTC/SenderBandwidthEstimator.hpp +0 -118
  310. package/worker/src/RTC/SenderBandwidthEstimator.cpp +0 -269
@@ -0,0 +1,568 @@
1
+ #include "common.hpp"
2
+ #include "RTC/BWE/BweTypes.hpp"
3
+ #include "RTC/BWE/DelayBasedBwe.hpp"
4
+ #include "RTC/BWE/RobustThroughputEstimator.hpp"
5
+ #include "test/include/RTC/BWE/helpers/LinkSimulator.hpp"
6
+ #include <catch2/catch_test_macros.hpp>
7
+ #include <cmath>
8
+
9
+ SCENARIO("BWE DelayBasedBwe", "[bwe][delaybasedbwe]")
10
+ {
11
+ // The clock starts well away from zero so that a mistake taking a time for a
12
+ // duration doesn't go unnoticed.
13
+ constexpr int64_t InitialTimeUs{ 100000000 };
14
+
15
+ // Holds everything a test needs: the link being simulated, the estimators
16
+ // under test, and the latest bitrate they reported.
17
+ struct SimulatedTransport
18
+ {
19
+ /**
20
+ * Feed a single packet, taking it through both estimators.
21
+ */
22
+ void IncomingFeedback(int64_t arrivalTimeUs, int64_t sendTimeUs, size_t payloadSize)
23
+ {
24
+ RTC::BWE::Types::PacketResult packetResult;
25
+
26
+ packetResult.receiveTimeUs = arrivalTimeUs + this->arrivalTimeOffsetUs;
27
+ packetResult.sentPacket.sendTimeUs = sendTimeUs;
28
+ packetResult.sentPacket.size = payloadSize;
29
+ packetResult.sentPacket.sequenceNumber = this->nextSequenceNumber++;
30
+
31
+ RTC::BWE::Types::TransportPacketsFeedback feedback;
32
+
33
+ feedback.feedbackTimeUs = this->nowUs;
34
+ feedback.packetFeedbacks.push_back(packetResult);
35
+
36
+ this->throughputEstimator.IncomingPacketFeedbackVector(feedback.SortedByReceiveTime());
37
+
38
+ const auto result = this->delayBasedBwe.IncomingPacketFeedbackVector(
39
+ feedback,
40
+ this->throughputEstimator.GetBitrate(),
41
+ /*probeBitrate*/ std::nullopt,
42
+ /*networkEstimate*/ std::nullopt,
43
+ /*inAlr*/ false);
44
+
45
+ if (result.updated)
46
+ {
47
+ this->latestBitrate = result.targetBitrate;
48
+ this->updated = true;
49
+ }
50
+ }
51
+
52
+ /**
53
+ * Generate a frame at the given bitrate, push it through the link and give
54
+ * it to the estimators.
55
+ *
56
+ * @returns Whether the estimate dropped below what was being sent, which is
57
+ * how an overuse shows up.
58
+ */
59
+ bool GenerateAndProcessFrame(int64_t bitrateBps)
60
+ {
61
+ this->linkSimulator.SetBitrateBps(bitrateBps);
62
+
63
+ std::vector<RTC::BWE::Types::PacketResult> packetResults;
64
+
65
+ const int64_t nextTimeUs =
66
+ this->linkSimulator.GenerateFrame(this->nowUs, this->nextSequenceNumber, packetResults);
67
+
68
+ if (packetResults.empty())
69
+ {
70
+ return false;
71
+ }
72
+
73
+ bool overuse{ false };
74
+
75
+ this->updated = false;
76
+
77
+ // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
78
+ this->nowUs = packetResults.back().receiveTimeUs.value();
79
+
80
+ for (auto& packetResult : packetResults)
81
+ {
82
+ // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
83
+ packetResult.receiveTimeUs = packetResult.receiveTimeUs.value() + this->arrivalTimeOffsetUs;
84
+ }
85
+
86
+ this->throughputEstimator.IncomingPacketFeedbackVector(packetResults);
87
+
88
+ RTC::BWE::Types::TransportPacketsFeedback feedback;
89
+
90
+ feedback.packetFeedbacks = packetResults;
91
+ feedback.feedbackTimeUs = this->nowUs;
92
+
93
+ const auto result = this->delayBasedBwe.IncomingPacketFeedbackVector(
94
+ feedback,
95
+ this->throughputEstimator.GetBitrate(),
96
+ /*probeBitrate*/ std::nullopt,
97
+ /*networkEstimate*/ std::nullopt,
98
+ /*inAlr*/ false);
99
+
100
+ if (result.updated)
101
+ {
102
+ this->latestBitrate = result.targetBitrate;
103
+ this->updated = true;
104
+
105
+ if (!this->firstUpdate && result.targetBitrate < bitrateBps)
106
+ {
107
+ overuse = true;
108
+ }
109
+
110
+ this->firstUpdate = false;
111
+ }
112
+
113
+ this->nowUs = nextTimeUs;
114
+
115
+ return overuse;
116
+ }
117
+
118
+ /**
119
+ * Feed frames until the estimate settles above `targetBitrate` or the given
120
+ * number of frames is exhausted.
121
+ *
122
+ * @returns The bitrate it settled at.
123
+ */
124
+ int64_t SteadyStateRun(
125
+ int64_t maxNumberOfFrames,
126
+ int64_t startBitrate,
127
+ int64_t minBitrate,
128
+ int64_t maxBitrate,
129
+ int64_t targetBitrate)
130
+ {
131
+ int64_t bitrateBps{ startBitrate };
132
+ bool bitrateUpdateSeen{ false };
133
+
134
+ for (int64_t i{ 0 }; i < maxNumberOfFrames; ++i)
135
+ {
136
+ const bool overuse = GenerateAndProcessFrame(bitrateBps);
137
+
138
+ if (overuse)
139
+ {
140
+ REQUIRE(this->latestBitrate < maxBitrate);
141
+ REQUIRE(this->latestBitrate > minBitrate);
142
+
143
+ bitrateBps = this->latestBitrate;
144
+ bitrateUpdateSeen = true;
145
+ }
146
+ else if (this->updated)
147
+ {
148
+ bitrateBps = this->latestBitrate;
149
+ this->updated = false;
150
+ }
151
+
152
+ if (bitrateUpdateSeen && bitrateBps > targetBitrate)
153
+ {
154
+ break;
155
+ }
156
+ }
157
+
158
+ REQUIRE(bitrateUpdateSeen);
159
+
160
+ return bitrateBps;
161
+ }
162
+
163
+ void AddDefaultStream()
164
+ {
165
+ this->linkSimulator.AddStream(std::make_unique<bweHelpers::RtpStream>(30, 300000));
166
+ }
167
+
168
+ int64_t nowUs{ InitialTimeUs };
169
+ bweHelpers::LinkSimulator linkSimulator{ 1000000, InitialTimeUs };
170
+ RTC::BWE::RobustThroughputEstimator throughputEstimator;
171
+ RTC::BWE::DelayBasedBwe delayBasedBwe;
172
+ int64_t nextSequenceNumber{ 0 };
173
+ int64_t arrivalTimeOffsetUs{ 0 };
174
+ int64_t latestBitrate{ 0 };
175
+ bool updated{ false };
176
+ bool firstUpdate{ true };
177
+ };
178
+
179
+ // Runs the capacity drop scenario: converge at the initial capacity, halve
180
+ // it, and measure how long the estimate takes to follow.
181
+ auto capacityDropTestHelper = [](
182
+ SimulatedTransport& simulatedTransport,
183
+ int64_t numberOfStreams,
184
+ int64_t expectedBitrateDropDeltaUs,
185
+ int64_t receiverClockOffsetChangeUs)
186
+ {
187
+ constexpr int Framerate{ 30 };
188
+ constexpr int64_t StartBitrate{ 900000 };
189
+ constexpr int64_t MinExpectedBitrate{ 800000 };
190
+ constexpr int64_t MaxExpectedBitrate{ 1100000 };
191
+ constexpr int64_t InitialCapacityBps{ 1000000 };
192
+ constexpr int64_t ReducedCapacityBps{ 500000 };
193
+
194
+ int64_t steadyStateSec{ 0 };
195
+
196
+ if (numberOfStreams <= 1)
197
+ {
198
+ steadyStateSec = 10;
199
+
200
+ simulatedTransport.AddDefaultStream();
201
+ }
202
+ else
203
+ {
204
+ steadyStateSec = 10 * numberOfStreams;
205
+
206
+ int64_t bitrateSum{ 0 };
207
+ const int64_t bitrateDenom = numberOfStreams * (numberOfStreams - 1);
208
+
209
+ for (int64_t i{ 0 }; i < numberOfStreams; ++i)
210
+ {
211
+ // The first stream gets half of the bitrate and the rest share the
212
+ // other half.
213
+ int64_t bitrate = StartBitrate / 2;
214
+
215
+ if (i > 0)
216
+ {
217
+ bitrate = ((StartBitrate * i) + (bitrateDenom / 2)) / bitrateDenom;
218
+ }
219
+
220
+ simulatedTransport.linkSimulator.AddStream(
221
+ std::make_unique<bweHelpers::RtpStream>(Framerate, bitrate));
222
+
223
+ bitrateSum += bitrate;
224
+ }
225
+
226
+ REQUIRE(bitrateSum == StartBitrate);
227
+ }
228
+
229
+ // Run in steady state until the estimate converges.
230
+ simulatedTransport.linkSimulator.SetCapacityBps(InitialCapacityBps);
231
+
232
+ int64_t bitrateBps = simulatedTransport.SteadyStateRun(
233
+ steadyStateSec * Framerate,
234
+ StartBitrate,
235
+ MinExpectedBitrate,
236
+ MaxExpectedBitrate,
237
+ InitialCapacityBps);
238
+
239
+ REQUIRE(std::abs(bitrateBps - InitialCapacityBps) < 180000);
240
+
241
+ simulatedTransport.updated = false;
242
+
243
+ // An offset of the remote clock must not throw the estimator off.
244
+ simulatedTransport.arrivalTimeOffsetUs += receiverClockOffsetChangeUs;
245
+
246
+ // Halve the capacity and measure how long the estimate takes to follow.
247
+ simulatedTransport.linkSimulator.SetCapacityBps(ReducedCapacityBps);
248
+
249
+ const int64_t overuseStartTimeUs = simulatedTransport.nowUs;
250
+ int64_t bitrateDropTimeUs{ -1 };
251
+
252
+ for (int64_t i{ 0 }; i < 100 * numberOfStreams; ++i)
253
+ {
254
+ simulatedTransport.GenerateAndProcessFrame(bitrateBps);
255
+
256
+ if (bitrateDropTimeUs == -1 && simulatedTransport.latestBitrate <= ReducedCapacityBps)
257
+ {
258
+ bitrateDropTimeUs = simulatedTransport.nowUs;
259
+ }
260
+
261
+ if (simulatedTransport.updated)
262
+ {
263
+ bitrateBps = simulatedTransport.latestBitrate;
264
+ }
265
+ }
266
+
267
+ // NOTE: The elapsed time is truncated to whole milliseconds, which is the
268
+ // resolution the tolerance below is calibrated for. Truncating each of the
269
+ // two instants instead would make the result depend on where the clock
270
+ // happens to sit within a millisecond, and this scenario lands right at the
271
+ // edge of the tolerance.
272
+ const int64_t bitrateDropDeltaMs = (bitrateDropTimeUs - overuseStartTimeUs) / 1000;
273
+
274
+ REQUIRE(std::abs(bitrateDropDeltaMs - (expectedBitrateDropDeltaUs / 1000)) <= 33);
275
+ };
276
+
277
+ SECTION("a fresh result reports a normal network")
278
+ {
279
+ const RTC::BWE::DelayBasedBwe::Result result;
280
+
281
+ REQUIRE(result.delayDetectorState == RTC::BWE::Types::BandwidthUsage::NORMAL);
282
+ }
283
+
284
+ SECTION("the bitrate climbs to 500 kbps in the expected number of frames")
285
+ {
286
+ SimulatedTransport simulatedTransport;
287
+
288
+ // The threshold corresponds to increasing roughly as
289
+ // bitrate(i) = 1.04 * bitrate(i-1) + 1000 until it passes 500 kbps,
290
+ // starting from about 30 kbps.
291
+ int64_t bitrateBps{ 30000 };
292
+ int iterations{ 0 };
293
+
294
+ simulatedTransport.AddDefaultStream();
295
+
296
+ while (bitrateBps < 500000)
297
+ {
298
+ const bool overuse = simulatedTransport.GenerateAndProcessFrame(bitrateBps);
299
+
300
+ if (overuse)
301
+ {
302
+ REQUIRE(simulatedTransport.latestBitrate > bitrateBps);
303
+
304
+ bitrateBps = simulatedTransport.latestBitrate;
305
+ simulatedTransport.updated = false;
306
+ }
307
+ else if (simulatedTransport.updated)
308
+ {
309
+ bitrateBps = simulatedTransport.latestBitrate;
310
+ simulatedTransport.updated = false;
311
+ }
312
+
313
+ ++iterations;
314
+ }
315
+
316
+ REQUIRE(iterations == 617);
317
+ }
318
+
319
+ SECTION("the estimate follows a capacity drop with one stream")
320
+ {
321
+ SimulatedTransport simulatedTransport;
322
+
323
+ capacityDropTestHelper(
324
+ simulatedTransport,
325
+ /*numberOfStreams*/ 1,
326
+ /*expectedDropDeltaUs*/ 500 * 1000,
327
+ /*clockOffsetUs*/ 0);
328
+ }
329
+
330
+ SECTION("the estimate follows a capacity drop when the remote clock jumps forward")
331
+ {
332
+ SimulatedTransport simulatedTransport;
333
+
334
+ capacityDropTestHelper(
335
+ simulatedTransport,
336
+ /*numberOfStreams*/ 1,
337
+ /*expectedDropDeltaUs*/ 867 * 1000,
338
+ /*clockOffsetUs*/ 30000 * 1000);
339
+ }
340
+
341
+ SECTION("the estimate follows a capacity drop when the remote clock jumps backwards")
342
+ {
343
+ SimulatedTransport simulatedTransport;
344
+
345
+ capacityDropTestHelper(
346
+ simulatedTransport,
347
+ /*numberOfStreams*/ 1,
348
+ /*expectedDropDeltaUs*/ 933 * 1000,
349
+ /*clockOffsetUs*/ -30000 * 1000);
350
+ }
351
+
352
+ SECTION("the estimate follows a capacity drop within a wider margin")
353
+ {
354
+ SimulatedTransport simulatedTransport;
355
+
356
+ // The very same scenario as the first capacity drop, expected against a
357
+ // margin shifted by 33 ms. Upstream keeps both because the measured value
358
+ // falls inside the two, and the parameter that used to tell them apart is
359
+ // no longer read by anything.
360
+ capacityDropTestHelper(
361
+ simulatedTransport,
362
+ /*numberOfStreams*/ 1,
363
+ /*expectedDropDeltaUs*/ 533 * 1000,
364
+ /*clockOffsetUs*/ 0);
365
+ }
366
+
367
+ SECTION("packets sent very close together are treated as one group")
368
+ {
369
+ constexpr int Framerate{ 50 };
370
+ constexpr int64_t FrameIntervalUs{ 1000000 / Framerate };
371
+
372
+ SimulatedTransport simulatedTransport;
373
+
374
+ int64_t sendTimeUs{ 0 };
375
+
376
+ // Six seconds of frames, enough for the first estimate to be produced.
377
+ for (int i{ 0 }; i <= 6 * Framerate; ++i)
378
+ {
379
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 1000);
380
+
381
+ simulatedTransport.nowUs += FrameIntervalUs;
382
+ sendTimeUs += FrameIntervalUs;
383
+ }
384
+
385
+ REQUIRE(simulatedTransport.updated);
386
+ REQUIRE(simulatedTransport.latestBitrate >= 400000);
387
+
388
+ // Batches of frames sent one tick apart, which the estimator must take as
389
+ // a single group, while the time between batches grows to simulate overuse.
390
+ constexpr int TimestampGroupLength{ 15 };
391
+
392
+ for (int i{ 0 }; i < 100; ++i)
393
+ {
394
+ for (int j{ 0 }; j < TimestampGroupLength; ++j)
395
+ {
396
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 100);
397
+
398
+ simulatedTransport.nowUs += FrameIntervalUs / TimestampGroupLength;
399
+ sendTimeUs += 1000;
400
+ }
401
+
402
+ simulatedTransport.nowUs += 10 * 1000;
403
+ sendTimeUs += FrameIntervalUs - (TimestampGroupLength * 1000);
404
+ }
405
+
406
+ REQUIRE(simulatedTransport.updated);
407
+ // The estimate must have been reduced.
408
+ REQUIRE(simulatedTransport.latestBitrate < 400000);
409
+ }
410
+
411
+ SECTION("a short silence doesn't leave the estimate stale")
412
+ {
413
+ SimulatedTransport simulatedTransport;
414
+
415
+ constexpr int Framerate{ 100 };
416
+ constexpr int64_t FrameIntervalUs{ 1000000 / Framerate };
417
+ // A client leaving and rejoining after 35 seconds.
418
+ constexpr int64_t SilenceTimeUs{ 35 * 1000000 };
419
+
420
+ int64_t sendTimeUs{ 0 };
421
+
422
+ for (size_t i{ 0 }; i < 3000; ++i)
423
+ {
424
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 1000);
425
+
426
+ simulatedTransport.nowUs += FrameIntervalUs;
427
+ sendTimeUs += FrameIntervalUs;
428
+ }
429
+
430
+ const auto bitrateBefore = simulatedTransport.delayBasedBwe.GetLatestEstimate();
431
+
432
+ simulatedTransport.nowUs += SilenceTimeUs;
433
+ sendTimeUs += SilenceTimeUs;
434
+
435
+ for (size_t i{ 0 }; i < 24; ++i)
436
+ {
437
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 1000);
438
+
439
+ simulatedTransport.nowUs += 2 * FrameIntervalUs;
440
+ sendTimeUs += FrameIntervalUs;
441
+ }
442
+
443
+ const auto bitrateAfter = simulatedTransport.delayBasedBwe.GetLatestEstimate();
444
+
445
+ REQUIRE(bitrateBefore.has_value());
446
+ REQUIRE(bitrateAfter.has_value());
447
+ // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
448
+ REQUIRE(bitrateAfter.value() < bitrateBefore.value());
449
+ }
450
+
451
+ SECTION("a long silence doesn't leave the estimate stale")
452
+ {
453
+ SimulatedTransport simulatedTransport;
454
+
455
+ constexpr int Framerate{ 100 };
456
+ constexpr int64_t FrameIntervalUs{ 1000000 / Framerate };
457
+ // A client rejoining a multiple of 64 seconds later, which is what used to
458
+ // produce no difference at all in the send times.
459
+ constexpr int64_t SilenceTimeUs{ 10 * 64 * 1000000 };
460
+
461
+ int64_t sendTimeUs{ 0 };
462
+
463
+ for (size_t i{ 0 }; i < 3000; ++i)
464
+ {
465
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 1000);
466
+
467
+ simulatedTransport.nowUs += FrameIntervalUs;
468
+ sendTimeUs += FrameIntervalUs;
469
+ }
470
+
471
+ const auto bitrateBefore = simulatedTransport.delayBasedBwe.GetLatestEstimate();
472
+
473
+ simulatedTransport.nowUs += SilenceTimeUs;
474
+ sendTimeUs += SilenceTimeUs;
475
+
476
+ for (size_t i{ 0 }; i < 24; ++i)
477
+ {
478
+ simulatedTransport.IncomingFeedback(simulatedTransport.nowUs, sendTimeUs, 1000);
479
+
480
+ simulatedTransport.nowUs += 2 * FrameIntervalUs;
481
+ sendTimeUs += FrameIntervalUs;
482
+ }
483
+
484
+ const auto bitrateAfter = simulatedTransport.delayBasedBwe.GetLatestEstimate();
485
+
486
+ REQUIRE(bitrateBefore.has_value());
487
+ REQUIRE(bitrateAfter.has_value());
488
+ // NOLINTNEXTLINE(bugprone-unchecked-optional-access)
489
+ REQUIRE(bitrateAfter.value() < bitrateBefore.value());
490
+ }
491
+
492
+ SECTION("an overuse right at the start is detected")
493
+ {
494
+ constexpr int64_t StartBitrate{ 300000 };
495
+ constexpr int64_t InitialCapacity{ 200000 };
496
+ // A high frame rate so that many packets go out in a short time.
497
+ constexpr int Fps{ 90 };
498
+
499
+ SimulatedTransport simulatedTransport;
500
+
501
+ simulatedTransport.linkSimulator.AddStream(
502
+ std::make_unique<bweHelpers::RtpStream>(Fps, StartBitrate));
503
+ simulatedTransport.linkSimulator.SetCapacityBps(InitialCapacity);
504
+
505
+ // Needed to initialize the rate control.
506
+ simulatedTransport.delayBasedBwe.SetStartBitrate(StartBitrate);
507
+
508
+ int64_t bitrateBps{ StartBitrate };
509
+ bool seenOveruse{ false };
510
+
511
+ // Forty frames, which is a third of a second at this frame rate.
512
+ for (int i{ 0 }; i < 40; ++i)
513
+ {
514
+ const bool overuse = simulatedTransport.GenerateAndProcessFrame(bitrateBps);
515
+
516
+ if (overuse)
517
+ {
518
+ REQUIRE(simulatedTransport.updated);
519
+ REQUIRE(simulatedTransport.latestBitrate <= InitialCapacity);
520
+ REQUIRE(simulatedTransport.latestBitrate > 0.8 * InitialCapacity);
521
+
522
+ seenOveruse = true;
523
+
524
+ break;
525
+ }
526
+ else if (simulatedTransport.updated)
527
+ {
528
+ bitrateBps = simulatedTransport.latestBitrate;
529
+ simulatedTransport.updated = false;
530
+ }
531
+ }
532
+
533
+ REQUIRE(seenOveruse);
534
+ REQUIRE(simulatedTransport.latestBitrate <= InitialCapacity);
535
+ REQUIRE(simulatedTransport.latestBitrate > 0.8 * InitialCapacity);
536
+ }
537
+
538
+ SECTION("sub-millisecond timestamps don't fake a delay build up")
539
+ {
540
+ SimulatedTransport simulatedTransport;
541
+
542
+ // Send times are 0.000, 9.725, 20.000, 29.725... ms and arrival times are
543
+ // 0.500, 10.000, 20.500, 30.000... ms, so the send deltas alternate between
544
+ // 9.750 and 10.250 ms and the arrival ones between 9.500 and 10.500 ms. No
545
+ // delay builds up, so this must never be read as overuse. Rounding the
546
+ // deltas to whole milliseconds would make every send delta 10 ms while some
547
+ // arrival ones would round up to 11 ms, faking exactly that.
548
+ int64_t lastBitrate{ simulatedTransport.latestBitrate };
549
+
550
+ for (int i{ 0 }; i < 1000; ++i)
551
+ {
552
+ simulatedTransport.nowUs += 500;
553
+ simulatedTransport.IncomingFeedback(
554
+ simulatedTransport.nowUs, simulatedTransport.nowUs - 500, 1000);
555
+
556
+ simulatedTransport.nowUs += 9500;
557
+ simulatedTransport.IncomingFeedback(
558
+ simulatedTransport.nowUs, simulatedTransport.nowUs - 250, 1000);
559
+
560
+ simulatedTransport.nowUs += 10000;
561
+
562
+ // The bitrate must never decrease.
563
+ REQUIRE(lastBitrate <= simulatedTransport.latestBitrate);
564
+
565
+ lastBitrate = simulatedTransport.latestBitrate;
566
+ }
567
+ }
568
+ }