Packages
membrane_rtp_plugin
0.12.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
@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_cycle(number() | nil, number(), number()) :: :current | :previous | :next
def from_which_cycle(previous_value, new_value, cycle_length)
def from_which_cycle(nil, _new, _cycle_length), do: :current
def from_which_cycle(previous_value, new_value, cycle_length) do
# a) current cycle
distance_if_current = abs(previous_value - new_value)
# b) new_value is from the previous cycle
distance_if_previous = abs(previous_value - (new_value - cycle_length))
# c) new_value is in the next cycle
distance_if_next = abs(previous_value - (new_value + cycle_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