Skip to content

Commit

Permalink
feat(srt): add parameters to set latency and connection timeout
Browse files Browse the repository at this point in the history
  • Loading branch information
ThibaultBee committed Dec 12, 2023
1 parent faef9c9 commit 3fa211e
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,23 @@ import java.security.InvalidParameterException
/**
* SRT connection parameters
*
* If the field is null, it will be ignored. The default SRT parameters will be used (see [default SRT options](https://github.com/Haivision/srt/blob/master/docs/API/API-socket-options.md))
* See
*
* @param host server ip
* @param port server port
* @param streamId SRT stream ID
* @param passPhrase SRT passPhrase
* @param latency SRT latency in ms
* @param connectionTimeout SRT connection timeout in ms
*/
data class SrtConnection(
val host: String,
val port: Int,
val streamId: String? = null,
val passPhrase: String? = null
val passPhrase: String? = null,
val latency: Int? = null,
val connectionTimeout: Int? = null,
) {
init {
require(host.isNotBlank()) { "Invalid host $host" }
Expand All @@ -48,10 +55,14 @@ data class SrtConnection(

private const val STREAM_ID_QUERY_PARAMETER = "streamid"
private const val PASS_PHRASE_QUERY_PARAMETER = "passphrase"
private const val LATENCY_QUERY_PARAMETER = "latency"
private const val CONNECTION_TIMEOUT_QUERY_PARAMETER = "connect_timeout"

private val queryParameterList = listOf(
STREAM_ID_QUERY_PARAMETER,
PASS_PHRASE_QUERY_PARAMETER
PASS_PHRASE_QUERY_PARAMETER,
LATENCY_QUERY_PARAMETER,
CONNECTION_TIMEOUT_QUERY_PARAMETER
)

/**
Expand All @@ -68,14 +79,27 @@ data class SrtConnection(
val host = uri.host
?: throw InvalidParameterException("Failed to parse URL $url: unknown host")
val port = uri.port

val streamId = uri.getQueryParameter(STREAM_ID_QUERY_PARAMETER)
val passPhrase = uri.getQueryParameter(PASS_PHRASE_QUERY_PARAMETER)
val latency = uri.getQueryParameter(LATENCY_QUERY_PARAMETER)?.toInt()
val connectionTimeout =
uri.getQueryParameter(CONNECTION_TIMEOUT_QUERY_PARAMETER)?.toInt()

val unknownParameters =
uri.queryParameterNames.find { queryParameterList.contains(it).not() }
if (unknownParameters != null) {
throw InvalidParameterException("Failed to parse URL $url: unknown parameter(s): $unknownParameters")
}
return SrtConnection(host, port, streamId, passPhrase)

return SrtConnection(
host,
port,
streamId,
passPhrase,
latency = latency,
connectionTimeout = connectionTimeout
)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,22 +49,29 @@ class SrtProducer(
*/
var streamId: String
get() = socket.getSockFlag(SockOpt.STREAMID) as String
set(value) = socket.setSockFlag(SockOpt.STREAMID, value)
internal set(value) = socket.setSockFlag(SockOpt.STREAMID, value)

/**
* Get/set SRT stream passPhrase
* It is a set only parameter, so getting the value throws an exception.
*/
var passPhrase: String
get() = socket.getSockFlag(SockOpt.PASSPHRASE) as String
set(value) = socket.setSockFlag(SockOpt.PASSPHRASE, value)
internal set(value) = socket.setSockFlag(SockOpt.PASSPHRASE, value)

/**
* Get/set bidirectional latency in milliseconds
*/
var latency: Int
get() = socket.getSockFlag(SockOpt.LATENCY) as Int
set(value) = socket.setSockFlag(SockOpt.LATENCY, value)
internal set(value) = socket.setSockFlag(SockOpt.LATENCY, value)

/**
* Get/set bidirectional latency in milliseconds
*/
var connectionTimeout: Int
get() = socket.getSockFlag(SockOpt.CONNTIMEO) as Int
internal set(value) = socket.setSockFlag(SockOpt.CONNTIMEO, value)

/**
* Get SRT stats
Expand Down Expand Up @@ -107,6 +114,8 @@ class SrtProducer(

connection.streamId?.let { streamId = it }
connection.passPhrase?.let { passPhrase = it }
connection.latency?.let { latency = it }
connection.connectionTimeout?.let { connectionTimeout = it }

isOnError = false
socket.connect(connection.host, connection.port)
Expand Down

0 comments on commit 3fa211e

Please sign in to comment.