Packages
membrane_rtp_plugin
0.22.1
0.31.5
0.31.4
0.31.3
0.31.2
0.31.1
0.31.0
0.30.0
0.29.1
0.29.0
0.28.0
0.27.1
0.27.0
0.26.0
0.25.0
0.24.1
0.24.0
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.1
0.17.0
0.16.0
0.15.0
0.15.0-rc.1
0.14.0
0.13.0
0.12.2
0.12.1
0.12.0
0.11.0
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.1-alpha.3
0.7.1-alpha.2
0.7.0-alpha.2
0.7.0-alpha.1
0.7.0-alpha
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0-alpha
Membrane Multimedia Framework plugin for RTP
Current section
Files
Jump to
Current section
Files
lib/membrane/rtp/utils.ex
defmodule Membrane.RTP.Utils do
@moduledoc false
alias Membrane.RTP.Packet
@spec strip_padding(binary, padding_present? :: boolean) ::
{:ok, {binary, padding_size :: non_neg_integer()}} | :error
def strip_padding(binary, padding_present?)
def strip_padding(binary, false), do: {:ok, {binary, 0}}
def strip_padding(binary, true) do
with size when size > 0 <- byte_size(binary),
padding_size = :binary.last(binary),
payload_size = byte_size(binary) - padding_size,
<<stripped_payload::binary-size(payload_size), _::binary-size(padding_size)>> <- binary do
{:ok, {stripped_payload, padding_size}}
else
_error -> :error
end
end
@spec generate_padding(Packet.padding_size()) :: binary()
def generate_padding(0), do: <<>>
def generate_padding(padding_size) when padding_size in 1..255 do
zeros_no = padding_size - 1
<<0::size(zeros_no)-unit(8), padding_size>>
end
@spec from_which_rollover(number() | nil, number(), number()) :: :current | :previous | :next
def from_which_rollover(previous_value, new_value, rollover_length)
def from_which_rollover(nil, _new, _rollover_length), do: :current
def from_which_rollover(previous_value, new_value, rollover_length) do
# a) current rollover
distance_if_current = abs(previous_value - new_value)
# b) new_value is from the previous rollover
distance_if_previous = abs(previous_value - (new_value - rollover_length))
# c) new_value is in the next rollover
distance_if_next = abs(previous_value - (new_value + rollover_length))
[
{:current, distance_if_current},
{:previous, distance_if_previous},
{:next, distance_if_next}
]
|> Enum.min_by(fn {_atom, distance} -> distance end)
|> then(fn {result, _value} -> result end)
end
end