Packages
membrane_rtp_plugin
0.31.5
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