Packages
membrane_rtp_plugin
0.4.0-alpha
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/compound_packet.ex
defmodule Membrane.RTCP.CompoundPacket do
@moduledoc """
Parses compound RTCP packets into a list of subpackets.
"""
alias Membrane.RTCP.{Header, Packet}
defstruct [:packets]
@type t :: %__MODULE__{packets: [Packet.t()]}
@spec to_binary(t()) :: binary()
def to_binary(%__MODULE__{packets: packets}) do
packets
|> Enum.map(&Packet.to_binary/1)
|> Enum.join()
end
@spec parse(binary()) :: {:ok, t()} | {:error, any()}
def parse(compound_packet) do
with {:ok, packets} <- do_parse(compound_packet, []) do
{:ok, %__MODULE__{packets: packets}}
end
end
defp do_parse(<<>>, acc), do: {:ok, Enum.reverse(acc)}
defp do_parse(<<raw_header::binary-size(4), body_and_rest::binary>>, packets) do
with {:ok, header} <- Header.parse(raw_header),
# length includes raw_header size
body_size = header.length - 4,
<<body::binary-size(body_size), rest::binary>> <- body_and_rest,
body = Packet.strip_padding(body, header.padding?),
{:ok, packet} <- Packet.parse_body(body, header) do
do_parse(rest, [packet | packets])
else
{:error, _reason} = err -> err
_ -> {:error, :invalid_compound_packet}
end
end
end