Packages
membrane_rtp_plugin
0.7.1-alpha.3
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(&<<&1::32>>) |> Enum.join()
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