Packages
membrane_rtp_plugin
0.15.0-rc.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/header.ex
defmodule Membrane.RTCP.Header do
@moduledoc """
Struct describing 32-bit header common to all RTCP packets
"""
@enforce_keys [:packet_type, :packet_specific]
defstruct @enforce_keys
@type packet_type_t :: 200..206
@type packet_specific_t :: non_neg_integer()
@type t :: %__MODULE__{
packet_specific: packet_specific_t(),
packet_type: packet_type_t()
}
@spec parse(binary()) ::
{:ok, %{header: t(), padding?: boolean, body_size: pos_integer}}
| :error
def parse(<<2::2, padding::1, packet_specific::5, pt::8, length::16>>) do
{:ok,
%{
header: %__MODULE__{
packet_specific: packet_specific,
packet_type: pt
},
padding?: padding == 1,
body_size: length * 4
}}
end
def parse(_binary) do
:error
end
@spec serialize(t(), body_size: pos_integer(), padding?: boolean()) :: binary()
def serialize(%__MODULE__{} = header, opts) do
padding = if Keyword.get(opts, :padding?), do: 1, else: 0
size = Keyword.fetch!(opts, :body_size)
unless rem(size, 4) == 0 do
raise "RTCP packet body size must be divisible by 4, got: #{size}"
end
<<2::2, padding::1, header.packet_specific::5, header.packet_type::8, div(size, 4)::16>>
end
end