lib/membrane/rtcp/feedback_packet/fir.ex

defmodule Membrane.RTCP.FeedbackPacket.FIR do
  @moduledoc """
  Encodes and decodes [Full Intra Request](https://datatracker.ietf.org/doc/html/rfc5104#section-4.3.1) packets.
  """
  @behaviour Membrane.RTCP.FeedbackPacket

  @enforce_keys [:target_ssrc, :seq_num]
  defstruct @enforce_keys

  @impl true
  def encode(%__MODULE__{} = packet) do
    <<packet.target_ssrc::32, packet.seq_num, 0::24>>
  end

  @impl true
  def encode(packets) when is_list(packets) do
    Enum.map_join(packets, &encode/1)
  end

  @impl true
  def decode(binary) do
    do_decode(binary, [])
  end

  defp do_decode(<<>>, acc) do
    {:ok, Enum.reverse(acc)}
  end

  defp do_decode(<<target_ssrc::32, seq_num, 0::24, rest::binary>>, acc) do
    do_decode(rest, [%__MODULE__{target_ssrc: target_ssrc, seq_num: seq_num} | acc])
  end

  defp do_decode(_binary, _acc) do
    {:error, :malformed_packet}
  end
end