Packages
membrane_rtp_plugin
0.7.0-alpha.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/feedback_packet.ex
defmodule Membrane.RTCP.FeedbackPacket do
@moduledoc """
Abstraction and generic encoding and decoding functionality for [RTCP feedback packets](https://datatracker.ietf.org/doc/html/rfc5104).
"""
@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__.TWCC
})
@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