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 = <> <> blocks reports_count = report.reports |> length() {body, reports_count} end @impl true def decode(<>, 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