Packages
membrane_rtp_plugin
0.5.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/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)
"""
use Bunch
alias Membrane.RTCP.Packet
@type t :: %__MODULE__{
ssrcs: [non_neg_integer()],
reason: String.t() | nil
}
defstruct [:ssrcs, :reason]
@packet_type 203
@behaviour Packet
@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, @packet_type, count}
end
defp make_reason(<<>>), do: nil
defp make_reason(<<_length::8, reason::binary>>), do: reason
end