Packages
membrane_rtp_plugin
0.31.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/rtcp/bye_packet.ex
defmodule Membrane.RTCP.ByePacket do
@moduledoc """
Parses and constructs RTCP BYE packets defined in
[RFC3550](https://tools.ietf.org/html/rfc3550#section-6.6)
"""
@behaviour Membrane.RTCP.Packet
@type t :: %__MODULE__{
ssrcs: [non_neg_integer()],
reason: String.t() | nil
}
defstruct [:ssrcs, :reason]
@impl true
def decode(packet, count) do
ssrcs_size = count * 4
<<ssrcs::binary-size(ssrcs_size), reason::binary>> = packet
ssrcs =
ssrcs
|> Bunch.Binary.chunk_every(4)
|> Enum.map(&:binary.decode_unsigned(&1))
result = %__MODULE__{ssrcs: ssrcs, reason: make_reason(reason)}
{:ok, result}
end
@impl true
def encode(%{ssrcs: ssrcs, reason: reason}) do
count = ssrcs |> length()
ssrcs = ssrcs |> Enum.map_join(&<<&1::32>>)
reason =
case reason do
nil ->
<<>>
other ->
length = String.length(other)
<<length::8, other::binary>>
end
{ssrcs <> reason, count}
end
defp make_reason(<<>>), do: nil
defp make_reason(<<_length::8, reason::binary>>), do: reason
end