Packages
membrane_rtp_plugin
0.16.0
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/feedback_packet.ex
defmodule Membrane.RTCP.FeedbackPacket do
@moduledoc """
Abstraction and generic encoding/decoding functionality for
[RTCP payload-specific feedback packets](https://datatracker.ietf.org/doc/html/rfc5104#section-4.3).
"""
@behaviour Membrane.RTCP.Packet
alias Membrane.RTP
@enforce_keys [:origin_ssrc, :payload]
defstruct @enforce_keys ++ [target_ssrc: 0]
@type t :: %__MODULE__{
origin_ssrc: RTP.ssrc_t(),
target_ssrc: RTP.ssrc_t(),
payload: struct
}
@callback decode(binary()) :: {:ok, struct()} | {:error, any()}
@callback encode(struct()) :: binary()
@packet_type_payload BiMap.new(%{
1 => __MODULE__.PLI,
4 => __MODULE__.FIR,
15 => __MODULE__.AFB
})
@impl true
def decode(<<origin_ssrc::32, target_ssrc::32, payload::binary>>, packet_type) do
with {:ok, module} <- BiMap.fetch(@packet_type_payload, packet_type),
{:ok, payload} <- module.decode(payload) do
{:ok, %__MODULE__{origin_ssrc: origin_ssrc, target_ssrc: target_ssrc, payload: payload}}
else
:error -> {:error, {:unknown_feedback_packet_type, packet_type}}
{:error, reason} -> {:error, reason}
end
end
@impl true
def decode(_binary, _packet_type) do
{:error, :malformed_packet}
end
@impl true
def encode(%__MODULE__{} = packet) do
%module{} = packet.payload
packet_type = BiMap.fetch_key!(@packet_type_payload, module)
{<<packet.origin_ssrc::32, packet.target_ssrc::32, module.encode(packet.payload)::binary>>,
packet_type}
end
end