Packages
membrane_rtp_plugin
0.7.1-alpha.3
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/receiver_report_packet.ex
defmodule Membrane.RTCP.ReceiverReportPacket do
@moduledoc """
Parses and constructs RTCP Receiver Report defined in
[RFC3550](https://tools.ietf.org/html/rfc3550#section-6.4.2)
"""
@behaviour Membrane.RTCP.Packet
alias Membrane.RTCP.ReportPacketBlock
defstruct [:ssrc, :reports]
@type t :: %__MODULE__{
ssrc: non_neg_integer(),
reports: [ReportPacketBlock.t()]
}
@impl true
def encode(report) do
blocks = report.reports |> Enum.map_join(&ReportPacketBlock.encode/1)
body = <<report.ssrc::32>> <> blocks
reports_count = report.reports |> length()
{body, reports_count}
end
@impl true
def decode(<<ssrc::32, blocks::binary>>, reports_count) do
with {:ok, reports} <- ReportPacketBlock.decode(blocks),
true <- reports_count == length(reports) do
{:ok, %__MODULE__{ssrc: ssrc, reports: reports}}
else
false -> {:error, :invalid_reports_count}
err -> err
end
end
end