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