Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

SRT improvements #2563

Merged
merged 3 commits into from
Aug 17, 2022
Merged

SRT improvements #2563

merged 3 commits into from
Aug 17, 2022

Conversation

toots
Copy link
Member

@toots toots commented Aug 16, 2022

This PR improves the SRT operators:

  • Create ground set socket type
  • Add methods on sockets to:
    • Get some relevant options
    • Get stats
    • Close socket
  • Get rid of stats duppy task and inputs/outputs operator stats() method
  • Export sockets() method in inputs/outputs operators to have direct, per-socket access to stats.
  • Add support for the following options in inputs/outputs
    • pbkeylen and passphrase to enable support for encrypted content
    • streamid and listen_callback to enable support for authentication and more.
  • Fix output in listener mode to:
    • Prevent listening socket from restarting when listening client disconnect
    • Allow more than one listener connected to the output.

Breaking changes

  • The stats method on srt inputs and outputs is gone, replaced by sockets():
# o = output.srt(mode="listener", max_clients=2, %mp3, fallible=true, s);;
# o.socket();;
[("127.0.0.1", <srt_socket>.{bistats = <fun>, bstats = <fun>, close = <fun>, status = <fun>, connection_timeout = <fun>, read_timeout = <fun>, write_timeout = <fun>, enforced_encryption = <fun>, streamid = <fun>, passphrase = <fun>, pbkeylen = <fun>})]

Sockets are indexed by the caller's ip. You can for instance close it:

# let [(_, s)] = o.sockets()
# s.close()

Or gather stats:

# s.bstats();;
{pktRcvFilterLoss = 0, pktRcvFilterSupply = 0, pktRcvFilterExtra = 0, pktSndFilterExtra = 0, pktRcvFilterLossTotal = 0, pktRcvFilterSupplyTotal = 0, pktRcvFilterExtraTotal = 0, pktSndFilterExtraTotal = 0, msRcvTsbPdDelay = 120, msRcvBuf = 0, byteRcvBuf = 0, pktRcvBuf = 0, msSndTsbPdDelay = 120, msSndBuf = 1, byteSndBuf = 1360, pktSndBuf = 1, byteMSS = 1500, mbpsMaxBW = 1000., byteAvailRcvBuf = 12286500, byteAvailSndBuf = 12286500, mbpsBandwidth = 0.144, msRTT = 0.146, pktFlightSize = 0, pktCongestionWindow = 8192, pktFlowWindow = 8090, usPktSndPeriod = 10., byteRcvUndecrypt = 0, byteRcvDrop = 0, byteSndDrop = 0, byteRetrans = 0, byteRecv = 0, byteSent = 1218560, pktRcvUndecrypt = 0, pktRcvDrop = 0, pktSndDrop = 0, pktRcvBelated = 0, pktRcvAvgBelatedTime = -2.18902815023e-230, pktReorderDistance = 0, usSndDuration = 10038345, mbpsRecvRate = 0., mbpsSendRate = 0.132294856276, pktRecvNAK = 0, pktSentNAK = 0, pktRecvACK = 896, pktSentACK = 0, pktRcvRetrans = 0, pktRetrans = 0, pktRcvLoss = 0, pktSndLoss = 0, pktRecv = 0, pktSent = 896, byteRcvUndecryptTotal = 0, byteRcvDropTotal = 0, byteSndDropTotal = 0, byteRetransTotal = 0, byteRecvTotal = 0, byteSentTotal = 1218560, pktRcvUndecryptTotal = 0, pktRcvDropTotal = 0, pktSndDropTotal = 0, usSndDurationTotal = 10038345, pktRecvNAKTotal = 0, pktSentNAKTotal = 0, pktRecvACKTotal = 896, pktSentACKTotal = 0, pktRetransTotal = 0, pktRcvLossTotal = 0, pktSndLossTotal = 0, pktRecvTotal = 0, pktSentTotal = 896, msTimeStamp = 73687}

(that's a lot!)

This should allow to re-implement the old stats behavior using a recurrent task while also allowing more operations.

Full type for a srt socket:

- : srt_socket
    .{
      bistats : (?clear : bool?, ?instantaneous : bool?) ->
                {
                  byteAvailRcvBuf : int,
                  byteAvailSndBuf : int,
                  byteMSS : int,
                  byteRcvBuf : int,
                  byteRcvDrop : int,
                  byteRcvDropTotal : int,
                  byteRcvUndecrypt : int,
                  byteRcvUndecryptTotal : int,
                  byteRecv : int,
                  byteRecvTotal : int,
                  byteRetrans : int,
                  byteRetransTotal : int,
                  byteSent : int,
                  byteSentTotal : int,
                  byteSndBuf : int,
                  byteSndDrop : int,
                  byteSndDropTotal : int,
                  mbpsBandwidth : float,
                  mbpsMaxBW : float,
                  mbpsRecvRate : float,
                  mbpsSendRate : float,
                  msRTT : float,
                  msRcvBuf : int,
                  msRcvTsbPdDelay : int,
                  msSndBuf : int,
                  msSndTsbPdDelay : int,
                  msTimeStamp : int,
                  pktCongestionWindow : int,
                  pktFlightSize : int,
                  pktFlowWindow : int,
                  pktRcvAvgBelatedTime : float,
                  pktRcvBelated : int,
                  pktRcvBuf : int,
                  pktRcvDrop : int,
                  pktRcvDropTotal : int,
                  pktRcvFilterExtra : int,
                  pktRcvFilterExtraTotal : int,
                  pktRcvFilterLoss : int,
                  pktRcvFilterLossTotal : int,
                  pktRcvFilterSupply : int,
                  pktRcvFilterSupplyTotal : int,
                  pktRcvLoss : int,
                  pktRcvLossTotal : int,
                  pktRcvRetrans : int,
                  pktRcvUndecrypt : int,
                  pktRcvUndecryptTotal : int,
                  pktRecv : int,
                  pktRecvACK : int,
                  pktRecvACKTotal : int,
                  pktRecvNAK : int,
                  pktRecvNAKTotal : int,
                  pktRecvTotal : int,
                  pktReorderDistance : int,
                  pktRetrans : int,
                  pktRetransTotal : int,
                  pktSent : int,
                  pktSentACK : int,
                  pktSentACKTotal : int,
                  pktSentNAK : int,
                  pktSentNAKTotal : int,
                  pktSentTotal : int,
                  pktSndBuf : int,
                  pktSndDrop : int,
                  pktSndDropTotal : int,
                  pktSndFilterExtra : int,
                  pktSndFilterExtraTotal : int,
                  pktSndLoss : int,
                  pktSndLossTotal : int,
                  usPktSndPeriod : float,
                  usSndDuration : int,
                  usSndDurationTotal : int},
      bstats : (?clear : bool?) ->
               {
                 byteAvailRcvBuf : int,
                 byteAvailSndBuf : int,
                 byteMSS : int,
                 byteRcvBuf : int,
                 byteRcvDrop : int,
                 byteRcvDropTotal : int,
                 byteRcvUndecrypt : int,
                 byteRcvUndecryptTotal : int,
                 byteRecv : int,
                 byteRecvTotal : int,
                 byteRetrans : int,
                 byteRetransTotal : int,
                 byteSent : int,
                 byteSentTotal : int,
                 byteSndBuf : int,
                 byteSndDrop : int,
                 byteSndDropTotal : int,
                 mbpsBandwidth : float,
                 mbpsMaxBW : float,
                 mbpsRecvRate : float,
                 mbpsSendRate : float,
                 msRTT : float,
                 msRcvBuf : int,
                 msRcvTsbPdDelay : int,
                 msSndBuf : int,
                 msSndTsbPdDelay : int,
                 msTimeStamp : int,
                 pktCongestionWindow : int,
                 pktFlightSize : int,
                 pktFlowWindow : int,
                 pktRcvAvgBelatedTime : float,
                 pktRcvBelated : int,
                 pktRcvBuf : int,
                 pktRcvDrop : int,
                 pktRcvDropTotal : int,
                 pktRcvFilterExtra : int,
                 pktRcvFilterExtraTotal : int,
                 pktRcvFilterLoss : int,
                 pktRcvFilterLossTotal : int,
                 pktRcvFilterSupply : int,
                 pktRcvFilterSupplyTotal : int,
                 pktRcvLoss : int,
                 pktRcvLossTotal : int,
                 pktRcvRetrans : int,
                 pktRcvUndecrypt : int,
                 pktRcvUndecryptTotal : int,
                 pktRecv : int,
                 pktRecvACK : int,
                 pktRecvACKTotal : int,
                 pktRecvNAK : int,
                 pktRecvNAKTotal : int,
                 pktRecvTotal : int,
                 pktReorderDistance : int,
                 pktRetrans : int,
                 pktRetransTotal : int,
                 pktSent : int,
                 pktSentACK : int,
                 pktSentACKTotal : int,
                 pktSentNAK : int,
                 pktSentNAKTotal : int,
                 pktSentTotal : int,
                 pktSndBuf : int,
                 pktSndDrop : int,
                 pktSndDropTotal : int,
                 pktSndFilterExtra : int,
                 pktSndFilterExtraTotal : int,
                 pktSndLoss : int,
                 pktSndLossTotal : int,
                 usPktSndPeriod : float,
                 usSndDuration : int,
                 usSndDurationTotal : int},
      close : () -> unit,
      connection_timeout : () -> int,
      enforced_encryption : () -> bool,
      passphrase : () -> string,
      pbkeylen : () -> int,
      read_timeout : () -> int,
      status : () -> string,
      streamid : () -> string,
      write_timeout : () -> int

Fixes: #2556

@toots toots requested a review from smimram August 16, 2022 06:43
@toots toots merged commit cd78f70 into main Aug 17, 2022
@toots toots deleted the srt-listener-improvements branch August 17, 2022 06:27
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

srt documentation and installation
1 participant