Packages
membrane_rtp_plugin
0.6.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/compound_packet.ex
defmodule Membrane.RTCP.CompoundPacket do
@moduledoc """
Parses compound RTCP packets into a list of subpackets.
"""
alias Membrane.RTCP.{Header, Packet}
alias Membrane.RTP.Utils
defstruct [:packets]
@type t :: %__MODULE__{packets: [Packet.t()]}
@spec serialize(t()) :: binary()
def serialize(%__MODULE__{packets: packets}) do
Enum.map_join(packets, &Packet.serialize/1)
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>>, acc) do
with {:ok, result} <- Header.parse(raw_header),
# length includes raw_header size
body_size = result.length - 4,
<<body::binary-size(body_size), rest::binary>> <- body_and_rest,
{:ok, {body, _padding}} <- Utils.strip_padding(body, result.padding?),
{:ok, packet} <- Packet.parse_body(body, result.header) do
do_parse(rest, [packet | acc])
else
{:error, reason} -> {:error, reason}
_error -> {:error, :malformed_packet}
end
end
defp do_parse(_binary, _acc), do: {:error, :malformed_packet}
end