Packages
membrane_rtp_plugin
0.7.0-alpha.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/report_packet_block.ex
defmodule Membrane.RTCP.ReportPacketBlock do
@moduledoc """
Parses and constructs report blocks, which are parts of RTCP Sender and Receiver Reports
defined in [RFC3550](https://tools.ietf.org/html/rfc3550#section-6.4)
"""
@enforce_keys [
:ssrc,
:fraction_lost,
:total_lost,
:highest_seq_num,
:interarrival_jitter,
:last_sr_timestamp,
:delay_since_sr
]
defstruct @enforce_keys
@type t() :: %__MODULE__{
ssrc: non_neg_integer(),
fraction_lost: float(),
total_lost: non_neg_integer(),
highest_seq_num: non_neg_integer(),
interarrival_jitter: non_neg_integer(),
last_sr_timestamp: non_neg_integer(),
delay_since_sr: non_neg_integer()
}
@spec encode(t()) :: binary()
def encode(block) do
%{
ssrc: ssrc,
fraction_lost: fraction_lost,
total_lost: total_lost,
highest_seq_num: max_seq_num,
interarrival_jitter: jitter,
last_sr_timestamp: last_sr_timestamp,
delay_since_sr: delay_since_sr
} = block
fixed_point_fraction = round(fraction_lost * 256)
<<ssrc::32, fixed_point_fraction::8, total_lost::24, max_seq_num::32, jitter::32,
last_sr_timestamp::32, delay_since_sr::32>>
end
@spec decode(binary()) :: {:ok, [t()]} | {:error, :invalid_report_block}
def decode(blocks), do: decode(blocks, [])
defp decode(<<>>, acc), do: {:ok, acc}
defp decode(
<<ssrc::32, fraction_lost::8, total_lost::24, max_seq_num::32, jitter::32,
last_sr_timestamp::32, delay_since_sr::32, rest::binary>>,
acc
) do
data = %__MODULE__{
ssrc: ssrc,
fraction_lost: fraction_lost / 256,
total_lost: total_lost,
highest_seq_num: max_seq_num,
interarrival_jitter: jitter,
last_sr_timestamp: last_sr_timestamp,
delay_since_sr: delay_since_sr
}
decode(rest, [data | acc])
end
defp decode(_blocks, _acc), do: {:error, :invalid_report_block}
end