Packages
membrane_rtp_plugin
0.14.0
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
@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 align(payload :: binary, align_to :: pos_integer()) ::
{binary, padding_size :: non_neg_integer()}
def align(payload, align_to) do
case rem(byte_size(payload), align_to) do
0 ->
{payload, 0}
padding_size ->
zeros_no = padding_size - 1
{<<payload::binary, 0::size(zeros_no)-unit(8), padding_size>>, padding_size}
end
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