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
@@ -3,6 +3,9 @@
3
3
 
4
4
  #include "RTC/RTP/RtpStreamRecv.hpp"
5
5
  #include "Logger.hpp"
6
+ #include "RTC/RTCP/FeedbackPsFir.hpp"
7
+ #include "RTC/RTCP/FeedbackPsPli.hpp"
8
+ #include "RTC/RTCP/FeedbackRtpNack.hpp"
6
9
  #include "RTC/RTP/Codecs/Tools.hpp"
7
10
  #include "Utils.hpp"
8
11
 
@@ -12,13 +15,18 @@ namespace RTC
12
15
  {
13
16
  /* Static. */
14
17
 
15
- static constexpr uint64_t InactivityCheckInterval{ 1500u }; // In ms.
16
- static constexpr uint64_t InactivityCheckIntervalWithDtx{ 5000u }; // In ms.
18
+ static constexpr int64_t InactivityCheckIntervalMs{ 1500 };
19
+ static constexpr int64_t InactivityCheckIntervalWithDtxMs{ 5000 };
20
+ // How often the spatial layers of a stream are checked for traffic.
21
+ // NOTE: A layer that stops doesn't report zero bitrate until the window of
22
+ // its counter has fully elapsed, so this interval just adds to that
23
+ // unavoidable detection delay.
24
+ static constexpr int64_t SpatialLayersActivityCheckIntervalMs{ 1500 };
17
25
 
18
26
  /* TransmissionCounter methods. */
19
27
 
20
28
  RtpStreamRecv::TransmissionCounter::TransmissionCounter(
21
- SharedInterface* shared, uint8_t spatialLayers, uint8_t temporalLayers, size_t windowSize)
29
+ SharedInterface* shared, uint8_t spatialLayers, uint8_t temporalLayers, int64_t windowSizeMs)
22
30
  {
23
31
  MS_TRACE();
24
32
 
@@ -27,9 +35,9 @@ namespace RTC
27
35
 
28
36
  for (auto& spatialLayerCounter : this->spatialLayerCounters)
29
37
  {
30
- for (uint8_t tIdx{ 0u }; tIdx < temporalLayers; ++tIdx)
38
+ for (uint8_t tIdx{ 0 }; tIdx < temporalLayers; ++tIdx)
31
39
  {
32
- spatialLayerCounter.emplace_back(shared, /*ignorePaddingOnlyPackets*/ true, windowSize);
40
+ spatialLayerCounter.emplace_back(shared, /*ignorePaddingOnlyPackets*/ true, windowSizeMs);
33
41
  }
34
42
  }
35
43
  }
@@ -54,11 +62,11 @@ namespace RTC
54
62
  counter.Update(packet);
55
63
  }
56
64
 
57
- uint32_t RtpStreamRecv::TransmissionCounter::GetBitrate(uint64_t nowMs)
65
+ int64_t RtpStreamRecv::TransmissionCounter::GetBitrate(int64_t nowMs)
58
66
  {
59
67
  MS_TRACE();
60
68
 
61
- uint32_t rate{ 0u };
69
+ int64_t rate{ 0 };
62
70
 
63
71
  for (auto& spatialLayerCounter : this->spatialLayerCounters)
64
72
  {
@@ -71,8 +79,8 @@ namespace RTC
71
79
  return rate;
72
80
  }
73
81
 
74
- uint32_t RtpStreamRecv::TransmissionCounter::GetBitrate(
75
- uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer)
82
+ int64_t RtpStreamRecv::TransmissionCounter::GetBitrate(
83
+ int64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer)
76
84
  {
77
85
  MS_TRACE();
78
86
 
@@ -83,17 +91,17 @@ namespace RTC
83
91
  // Return 0 if specified layers are not being received.
84
92
  auto& counter = this->spatialLayerCounters[spatialLayer][temporalLayer];
85
93
 
86
- if (counter.GetBitrate(nowMs) == 0)
94
+ if (counter.GetBitrate(nowMs) <= 0)
87
95
  {
88
- return 0u;
96
+ return 0;
89
97
  }
90
98
 
91
- uint32_t rate{ 0u };
99
+ int64_t rate{ 0 };
92
100
 
93
101
  // Iterate all temporal layers of spatial layers previous to the given one.
94
- for (uint8_t sIdx{ 0u }; sIdx < spatialLayer; ++sIdx)
102
+ for (uint8_t sIdx{ 0 }; sIdx < spatialLayer; ++sIdx)
95
103
  {
96
- for (size_t tIdx{ 0u }; tIdx < this->spatialLayerCounters[sIdx].size(); ++tIdx)
104
+ for (size_t tIdx{ 0 }; tIdx < this->spatialLayerCounters[sIdx].size(); ++tIdx)
97
105
  {
98
106
  auto& temporalLayerCounter = this->spatialLayerCounters[sIdx][tIdx];
99
107
 
@@ -102,7 +110,7 @@ namespace RTC
102
110
  }
103
111
 
104
112
  // Add the given spatial layer with up to the given temporal layer.
105
- for (uint8_t tIdx{ 0u }; tIdx <= temporalLayer; ++tIdx)
113
+ for (uint8_t tIdx{ 0 }; tIdx <= temporalLayer; ++tIdx)
106
114
  {
107
115
  auto& temporalLayerCounter = this->spatialLayerCounters[spatialLayer][tIdx];
108
116
 
@@ -112,16 +120,15 @@ namespace RTC
112
120
  return rate;
113
121
  }
114
122
 
115
- uint32_t RtpStreamRecv::TransmissionCounter::GetSpatialLayerBitrate(
116
- uint64_t nowMs, uint8_t spatialLayer)
123
+ int64_t RtpStreamRecv::TransmissionCounter::GetSpatialLayerBitrate(int64_t nowMs, uint8_t spatialLayer)
117
124
  {
118
125
  MS_TRACE();
119
126
 
120
127
  MS_ASSERT(spatialLayer < this->spatialLayerCounters.size(), "spatialLayer too high");
121
128
 
122
- uint32_t rate{ 0u };
129
+ int64_t rate{ 0 };
123
130
 
124
- for (size_t tIdx{ 0u }; tIdx < this->spatialLayerCounters[spatialLayer].size(); ++tIdx)
131
+ for (size_t tIdx{ 0 }; tIdx < this->spatialLayerCounters[spatialLayer].size(); ++tIdx)
125
132
  {
126
133
  auto& temporalLayerCounter = this->spatialLayerCounters[spatialLayer][tIdx];
127
134
 
@@ -131,8 +138,8 @@ namespace RTC
131
138
  return rate;
132
139
  }
133
140
 
134
- uint32_t RtpStreamRecv::TransmissionCounter::GetLayerBitrate(
135
- uint64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer)
141
+ int64_t RtpStreamRecv::TransmissionCounter::GetLayerBitrate(
142
+ int64_t nowMs, uint8_t spatialLayer, uint8_t temporalLayer)
136
143
  {
137
144
  MS_TRACE();
138
145
 
@@ -149,7 +156,7 @@ namespace RTC
149
156
  {
150
157
  MS_TRACE();
151
158
 
152
- size_t packetCount{ 0u };
159
+ size_t packetCount{ 0 };
153
160
 
154
161
  for (const auto& spatialLayerCounter : this->spatialLayerCounters)
155
162
  {
@@ -166,7 +173,7 @@ namespace RTC
166
173
  {
167
174
  MS_TRACE();
168
175
 
169
- size_t bytes{ 0u };
176
+ size_t bytes{ 0 };
170
177
 
171
178
  for (const auto& spatialLayerCounter : this->spatialLayerCounters)
172
179
  {
@@ -185,7 +192,7 @@ namespace RTC
185
192
  RTP::RtpStreamRecv::Listener* listener,
186
193
  SharedInterface* shared,
187
194
  RTP::RtpStream::Params& params,
188
- uint32_t sendNackDelayMs,
195
+ int64_t sendNackDelayMs,
189
196
  bool useRtpInactivityCheck)
190
197
  : RTP::RtpStream::RtpStream(listener, shared, params, 10),
191
198
  sendNackDelayMs(sendNackDelayMs),
@@ -207,10 +214,25 @@ namespace RTC
207
214
  {
208
215
  // Run the RTP inactivity periodic timer (use a different timeout if DTX is
209
216
  // enabled).
210
- this->inactivityCheckPeriodicTimer = this->shared->CreateTimer(this);
217
+ this->inactivityCheckPeriodicTimer =
218
+ this->shared->CreateTimer(this, "rtp-stream-recv-inactivity-check");
211
219
 
212
220
  this->inactivityCheckPeriodicTimer->Start(
213
- this->params.useDtx ? InactivityCheckIntervalWithDtx : InactivityCheckInterval);
221
+ this->params.useDtx ? InactivityCheckIntervalWithDtxMs : InactivityCheckIntervalMs);
222
+ }
223
+
224
+ // A stream with more than a spatial layer carries all of them within the
225
+ // same SSRC, so the inactivity check above cannot tell that just one of
226
+ // them stopped. Watch their traffic separately.
227
+ if (GetSpatialLayers() > 1)
228
+ {
229
+ this->spatialLayersActivity.assign(GetSpatialLayers(), false);
230
+
231
+ this->spatialLayersActivityCheckPeriodicTimer =
232
+ this->shared->CreateTimer(this, "rtp-stream-recv-spatial-layers-activity-check");
233
+
234
+ this->spatialLayersActivityCheckPeriodicTimer->Start(
235
+ SpatialLayersActivityCheckIntervalMs, SpatialLayersActivityCheckIntervalMs);
214
236
  }
215
237
  }
216
238
 
@@ -221,6 +243,10 @@ namespace RTC
221
243
  // Close the RTP inactivity check periodic timer.
222
244
  delete this->inactivityCheckPeriodicTimer;
223
245
  this->inactivityCheckPeriodicTimer = nullptr;
246
+
247
+ // Close the spatial layers activity check periodic timer.
248
+ delete this->spatialLayersActivityCheckPeriodicTimer;
249
+ this->spatialLayersActivityCheckPeriodicTimer = nullptr;
224
250
  }
225
251
 
226
252
  flatbuffers::Offset<FBS::RtpStream::Stats> RtpStreamRecv::FillBufferStats(
@@ -228,7 +254,7 @@ namespace RTC
228
254
  {
229
255
  MS_TRACE();
230
256
 
231
- const uint64_t nowMs = this->shared->GetTimeMs();
257
+ const int64_t nowMs = this->shared->GetTimeMs();
232
258
 
233
259
  auto baseStats = RTP::RtpStream::FillBufferStats(builder);
234
260
 
@@ -244,7 +270,7 @@ namespace RTC
244
270
 
245
271
  bitrateByLayer.emplace_back(
246
272
  FBS::RtpStream::CreateBitrateByLayerDirect(
247
- builder, layer.c_str(), GetBitrate(nowMs, sIdx, tIdx)));
273
+ builder, layer.c_str(), static_cast<uint64_t>(GetBitrate(nowMs, sIdx, tIdx))));
248
274
  }
249
275
  }
250
276
  }
@@ -254,13 +280,13 @@ namespace RTC
254
280
  baseStats,
255
281
  this->transmissionCounter.GetPacketCount(),
256
282
  this->transmissionCounter.GetBytes(),
257
- this->transmissionCounter.GetBitrate(nowMs),
283
+ static_cast<uint64_t>(this->transmissionCounter.GetBitrate(nowMs)),
258
284
  &bitrateByLayer);
259
285
 
260
286
  return FBS::RtpStream::CreateStats(builder, FBS::RtpStream::StatsData::RecvStats, stats.Union());
261
287
  }
262
288
 
263
- bool RtpStreamRecv::ReceivePacket(RTP::Packet* packet)
289
+ bool RtpStreamRecv::ReceivePacket(RTP::Packet* packet, int64_t receivedAtUs)
264
290
  {
265
291
  MS_TRACE();
266
292
 
@@ -297,7 +323,7 @@ namespace RTC
297
323
  }
298
324
 
299
325
  // Calculate jitter.
300
- CalculateJitter(packet->GetTimestamp());
326
+ CalculateJitter(packet->GetTimestamp(), receivedAtUs);
301
327
 
302
328
  // Store the capture instant if the packet carries it.
303
329
  {
@@ -318,16 +344,16 @@ namespace RTC
318
344
  // of the sender, which is the one this stream is estimated against:
319
345
  //
320
346
  // capture NTP clock = sender NTP clock + capture clock offset
321
- const auto captureMs = static_cast<int64_t>(Utils::Time::Ntp2TimeMs(ntp)) -
322
- Utils::Time::Q32x32ToTimeMs(estimatedCaptureClockOffset);
347
+ const auto captureAtUs =
348
+ Utils::Time::Ntp2TimeUs(ntp) - Utils::Time::Q32x32ToTimeUs(estimatedCaptureClockOffset);
323
349
 
324
350
  // NOTE: A capture instant that is not positive means a capture clock offset
325
351
  // that cannot be true, so there is nothing to store.
326
- if (captureMs > 0)
352
+ if (captureAtUs > 0)
327
353
  {
328
354
  this->lastAbsCaptureTime = AbsCaptureTime{
329
355
  .ts = packet->GetTimestamp(),
330
- .ntpMs = static_cast<uint64_t>(captureMs),
356
+ .ntpUs = captureAtUs,
331
357
  };
332
358
  }
333
359
  }
@@ -490,7 +516,7 @@ namespace RTC
490
516
  const uint8_t worstRemoteFractionLost =
491
517
  this->params.useInBandFec ? static_cast<RTP::RtpStreamRecv::Listener*>(this->listener)
492
518
  ->OnRtpStreamNeedWorstRemoteFractionLost(this)
493
- : 0;
519
+ : 0;
494
520
 
495
521
  if (worstRemoteFractionLost > 0)
496
522
  {
@@ -562,13 +588,12 @@ namespace RTC
562
588
  if (this->lastSenderReportTiming.has_value())
563
589
  {
564
590
  const auto& senderReportTiming = this->lastSenderReportTiming.value();
565
- // Get delay in milliseconds.
566
- auto delayMs =
567
- static_cast<uint32_t>(this->shared->GetTimeMs() - senderReportTiming.receivedMs);
591
+ // Get delay in microseconds.
592
+ const int64_t delayUs = this->shared->GetTimeUs() - senderReportTiming.receivedAtUs;
568
593
  // Express delay in units of 1/65536 seconds.
569
- uint32_t dlsr = (delayMs / 1000) << 16;
594
+ auto dlsr = static_cast<uint32_t>((delayUs / 1000000) << 16);
570
595
 
571
- dlsr |= uint32_t{ (delayMs % 1000) * 65536 / 1000 };
596
+ dlsr |= static_cast<uint32_t>(((delayUs % 1000000) * 65536) / 1000000);
572
597
 
573
598
  report->SetDelaySinceLastSenderReport(dlsr);
574
599
  report->SetLastSenderReport(senderReportTiming.compactNtp);
@@ -594,7 +619,7 @@ namespace RTC
594
619
  return nullptr;
595
620
  }
596
621
 
597
- void RtpStreamRecv::ReceiveRtcpSenderReport(RTC::RTCP::SenderReport* report)
622
+ void RtpStreamRecv::ReceiveRtcpSenderReport(RTC::RTCP::SenderReport* report, int64_t receivedAtUs)
598
623
  {
599
624
  MS_TRACE();
600
625
 
@@ -609,8 +634,8 @@ namespace RTC
609
634
  compactNtp += report->GetNtpFrac() >> 16;
610
635
 
611
636
  this->lastSenderReportTiming = SenderReportTiming{
612
- .compactNtp = compactNtp,
613
- .receivedMs = this->shared->GetTimeMs(),
637
+ .compactNtp = compactNtp,
638
+ .receivedAtUs = receivedAtUs,
614
639
  };
615
640
 
616
641
  Utils::Time::Ntp ntp{}; // NOLINT(cppcoreguidelines-pro-type-member-init)
@@ -619,7 +644,7 @@ namespace RTC
619
644
  ntp.fractions = report->GetNtpFrac();
620
645
 
621
646
  this->lastSenderReportMapping = RTP::RtpStream::SenderReportMapping{
622
- .ntpMs = Utils::Time::Ntp2TimeMs(ntp),
647
+ .ntpUs = Utils::Time::Ntp2TimeUs(ntp),
623
648
  .ts = report->GetRtpTs(),
624
649
  };
625
650
  }
@@ -628,27 +653,28 @@ namespace RTC
628
653
  UpdateScore();
629
654
  }
630
655
 
631
- void RtpStreamRecv::ReceiveRtxRtcpSenderReport(RTC::RTCP::SenderReport* report)
656
+ void RtpStreamRecv::ReceiveRtxRtcpSenderReport(RTC::RTCP::SenderReport* report, int64_t receivedAtUs)
632
657
  {
633
658
  MS_TRACE();
634
659
 
635
660
  if (HasRtx())
636
661
  {
637
- this->rtxStream->ReceiveRtcpSenderReport(report);
662
+ this->rtxStream->ReceiveRtcpSenderReport(report, receivedAtUs);
638
663
  }
639
664
  }
640
665
 
641
- void RtpStreamRecv::ReceiveRtcpXrDelaySinceLastRr(RTC::RTCP::DelaySinceLastRr::SsrcInfo* ssrcInfo)
666
+ void RtpStreamRecv::ReceiveRtcpXrDelaySinceLastRr(
667
+ RTC::RTCP::DelaySinceLastRr::SsrcInfo* ssrcInfo, int64_t receivedAtUs)
642
668
  {
643
669
  MS_TRACE();
644
670
 
645
671
  /* Calculate RTT. */
646
672
 
647
- // Get the NTP representation of the current timestamp.
648
- const uint64_t nowMs = this->shared->GetTimeMs();
649
- auto ntp = Utils::Time::TimeMs2Ntp(nowMs + this->shared->GetNtpOffsetMs());
673
+ // Get the NTP representation of the time at which the report arrived, which
674
+ // is what the round trip is measured against.
675
+ auto ntp = Utils::Time::TimeUs2Ntp(receivedAtUs + this->shared->GetNtpOffsetUs());
650
676
 
651
- // Get the compact NTP representation of the current timestamp.
677
+ // Get the compact NTP representation of the arrival time.
652
678
  uint32_t compactNtp = (ntp.seconds & 0x0000FFFF) << 16;
653
679
 
654
680
  compactNtp |= (ntp.fractions & 0xFFFF0000) >> 16;
@@ -657,30 +683,29 @@ namespace RTC
657
683
  const uint32_t dlrr = ssrcInfo->GetDelaySinceLastReceiverReport();
658
684
 
659
685
  // RTT in 1/2^16 second fractions.
660
- uint32_t rtt{ 0 };
686
+ uint32_t rttCompactNtp{ 0 };
661
687
 
662
688
  // If no Receiver Extended Report was received by the remote endpoint yet,
663
689
  // ignore lastRr and dlrr values in the Sender Extended Report.
664
690
  if (lastRr && dlrr && (compactNtp > dlrr + lastRr))
665
691
  {
666
- rtt = compactNtp - dlrr - lastRr;
692
+ rttCompactNtp = compactNtp - dlrr - lastRr;
667
693
  }
668
694
 
669
- // RTT in milliseconds.
670
- this->rtt = static_cast<float>(rtt >> 16) * 1000;
671
- this->rtt += (static_cast<float>(rtt & 0x0000FFFF) / 65536) * 1000;
695
+ this->rttMs = static_cast<float>(rttCompactNtp >> 16) * 1000;
696
+ this->rttMs += (static_cast<float>(rttCompactNtp & 0x0000FFFF) / 65536) * 1000;
672
697
 
673
698
  // Avoid negative RTT value since it doesn't make sense.
674
- this->rtt = std::max(this->rtt, 0.0f);
699
+ this->rttMs = std::max(this->rttMs, 0.0f);
675
700
 
676
701
  // Tell it to the NackGenerator.
677
702
  if (this->params.useNack)
678
703
  {
679
- this->nackGenerator->UpdateRtt(static_cast<uint32_t>(this->rtt));
704
+ this->nackGenerator->UpdateRttMs(static_cast<int64_t>(this->rttMs));
680
705
  }
681
706
  }
682
707
 
683
- std::optional<uint64_t> RtpStreamRecv::GetRemoteCaptureMsFromAbsCaptureTime(uint32_t ts) const
708
+ std::optional<int64_t> RtpStreamRecv::GetRemoteCaptureAtUsFromAbsCaptureTime(uint32_t ts) const
684
709
  {
685
710
  MS_TRACE();
686
711
 
@@ -691,11 +716,14 @@ namespace RTC
691
716
 
692
717
  const auto& absCaptureTime = this->lastAbsCaptureTime.value();
693
718
 
694
- return InterpolateRemoteCaptureMs(
695
- absCaptureTime.ntpMs, absCaptureTime.ts, ts, RtpStreamRecv::MaxAbsCaptureTimeInterpolationMs);
719
+ return InterpolateRemoteCaptureAtUs(
720
+ absCaptureTime.ntpUs,
721
+ absCaptureTime.ts,
722
+ ts,
723
+ RtpStreamRecv::MaxAbsCaptureTimeInterpolationMs * 1000);
696
724
  }
697
725
 
698
- std::optional<uint64_t> RtpStreamRecv::GetRemoteCaptureMsFromSenderReport(uint32_t ts) const
726
+ std::optional<int64_t> RtpStreamRecv::GetRemoteCaptureAtUsFromSenderReport(uint32_t ts) const
699
727
  {
700
728
  MS_TRACE();
701
729
 
@@ -706,15 +734,15 @@ namespace RTC
706
734
 
707
735
  const auto& senderReportMapping = this->lastSenderReportMapping.value();
708
736
 
709
- return InterpolateRemoteCaptureMs(
710
- senderReportMapping.ntpMs,
737
+ return InterpolateRemoteCaptureAtUs(
738
+ senderReportMapping.ntpUs,
711
739
  senderReportMapping.ts,
712
740
  ts,
713
- RtpStreamRecv::MaxSenderReportInterpolationMs);
741
+ RtpStreamRecv::MaxSenderReportInterpolationMs * 1000);
714
742
  }
715
743
 
716
- std::optional<uint64_t> RtpStreamRecv::InterpolateRemoteCaptureMs(
717
- uint64_t referenceNtpMs, uint32_t referenceTs, uint32_t ts, uint64_t maxDistanceMs) const
744
+ std::optional<int64_t> RtpStreamRecv::InterpolateRemoteCaptureAtUs(
745
+ int64_t referenceNtpUs, uint32_t referenceTs, uint32_t ts, int64_t maxDistanceUs) const
718
746
  {
719
747
  MS_TRACE();
720
748
 
@@ -727,29 +755,29 @@ namespace RTC
727
755
 
728
756
  // Distance in RTP timestamp units, taking wrap around into account.
729
757
  const auto distanceTs = static_cast<int64_t>(static_cast<int32_t>(ts - referenceTs));
730
- const int64_t distanceMs = (distanceTs * 1000) / static_cast<int64_t>(clockRate);
731
- // NOTE: The negation is safe since `distanceMs` comes from a 32 bits
758
+ const int64_t distanceUs = (distanceTs * 1000000) / static_cast<int64_t>(clockRate);
759
+ // NOTE: The negation is safe since `distanceUs` comes from a 32 bits
732
760
  // distance scaled down by the clock rate.
733
- const auto absDistanceMs = static_cast<uint64_t>(distanceMs < 0 ? -distanceMs : distanceMs);
761
+ const int64_t absDistanceUs = distanceUs < 0 ? -distanceUs : distanceUs;
734
762
 
735
- if (absDistanceMs > maxDistanceMs)
763
+ if (absDistanceUs > maxDistanceUs)
736
764
  {
737
765
  return std::nullopt;
738
766
  }
739
767
 
740
- const int64_t captureMs = static_cast<int64_t>(referenceNtpMs) + distanceMs;
768
+ const int64_t captureAtUs = referenceNtpUs + distanceUs;
741
769
 
742
770
  // The reference does not map into a valid capture instant, so the remote
743
771
  // endpoint is reporting nonsense.
744
- if (captureMs < 0)
772
+ if (captureAtUs < 0)
745
773
  {
746
774
  MS_WARN_2TAGS(
747
- rtp, rtcp, "invalid interpolated capture instant [distanceMs:%" PRIi64 "]", distanceMs);
775
+ rtp, rtcp, "invalid interpolated capture instant [distanceUs:%" PRIi64 "]", distanceUs);
748
776
 
749
777
  return std::nullopt;
750
778
  }
751
779
 
752
- return static_cast<uint64_t>(captureMs);
780
+ return captureAtUs;
753
781
  }
754
782
 
755
783
  void RtpStreamRecv::RequestKeyFrame()
@@ -821,19 +849,28 @@ namespace RTC
821
849
  }
822
850
  }
823
851
 
824
- void RtpStreamRecv::CalculateJitter(uint32_t rtpTimestamp)
852
+ void RtpStreamRecv::CalculateJitter(uint32_t rtpTimestamp, int64_t receivedAtUs)
825
853
  {
826
854
  MS_TRACE();
827
855
 
828
- if (GetClockRate() == 0u)
856
+ if (GetClockRate() == 0)
829
857
  {
830
858
  return;
831
859
  }
832
860
 
861
+ // The arrival time expressed in the clock rate of the stream, which is
862
+ // the R of RFC 3550 section 6.4.1.
863
+ //
864
+ // NOTE: The seconds and the sub-second parts are converted separately
865
+ // because a single multiplication of the whole time by the clock rate
866
+ // would overflow on a long lived host.
867
+ const auto arrivalTs =
868
+ static_cast<uint32_t>((receivedAtUs / 1000000) * GetClockRate()) +
869
+ static_cast<uint32_t>(((receivedAtUs % 1000000) * GetClockRate()) / 1000000);
870
+
833
871
  // NOTE: Based on https://github.com/versatica/mediasoup/issues/1018.
834
- auto transit =
835
- static_cast<int>((this->shared->GetTimeMs() * GetClockRate() / 1000) - rtpTimestamp);
836
- int d = transit - this->transit;
872
+ auto transit = static_cast<int>(arrivalTs - rtpTimestamp);
873
+ int d = transit - this->transit;
837
874
 
838
875
  // First transit calculation, save and return.
839
876
  if (this->transit == 0)
@@ -1003,6 +1040,34 @@ namespace RTC
1003
1040
 
1004
1041
  ResetScore(0, /*notify*/ true);
1005
1042
  }
1043
+ else if (timer == this->spatialLayersActivityCheckPeriodicTimer)
1044
+ {
1045
+ const int64_t nowMs = this->shared->GetTimeMs();
1046
+
1047
+ for (uint8_t spatialLayer{ 0 }; spatialLayer < GetSpatialLayers(); ++spatialLayer)
1048
+ {
1049
+ const bool isActive =
1050
+ this->transmissionCounter.GetSpatialLayerBitrate(nowMs, spatialLayer) > 0;
1051
+
1052
+ if (isActive == this->spatialLayersActivity[spatialLayer])
1053
+ {
1054
+ continue;
1055
+ }
1056
+
1057
+ this->spatialLayersActivity[spatialLayer] = isActive;
1058
+
1059
+ MS_DEBUG_2TAGS(
1060
+ rtp,
1061
+ svc,
1062
+ "spatial layer activity changed [ssrc:%" PRIu32 ", spatialLayer:%" PRIu8 ", isActive:%s]",
1063
+ GetSsrc(),
1064
+ spatialLayer,
1065
+ isActive ? "true" : "false");
1066
+
1067
+ static_cast<RTP::RtpStreamRecv::Listener*>(this->listener)
1068
+ ->OnRtpStreamSpatialLayerActivityChanged(this, spatialLayer, isActive);
1069
+ }
1070
+ }
1006
1071
  }
1007
1072
 
1008
1073
  inline void RtpStreamRecv::OnNackGeneratorNackRequired(const std::vector<uint16_t>& seqNumbers)