Current section
Files
Jump to
Current section
Files
lib/sdp/attribute/rtp_mapping.ex
defmodule Membrane.Protocol.SDP.Attribute.RTPMapping do
@moduledoc """
This module represents RTP mapping.
"""
@enforce_keys [:payload_type, :encoding, :clock_rate, :params]
defstruct @enforce_keys
@type t :: %__MODULE__{
payload_type: 96..127,
encoding: binary(),
clock_rate: non_neg_integer(),
params: [any()]
}
@spec parse(binary(), atom | binary()) ::
{:ok, t()} | {:error, :invalid_attribute | :invalid_param}
def parse(mapping, type) do
with [payload_type, encoding | _] <- String.split(mapping, " "),
[encoding_name, clock_rate | params] <- String.split(encoding, "/"),
{payload_type, ""} <- Integer.parse(payload_type),
{clock_rate, ""} <- Integer.parse(clock_rate) do
mapping = %__MODULE__{
payload_type: payload_type,
encoding: encoding_name,
clock_rate: clock_rate,
params: parse_params(type, params)
}
{:ok, mapping}
else
_ -> {:error, :invalid_attribute}
end
end
defp parse_params(:audio, [raw_channels]) do
case Integer.parse(raw_channels) do
{channels, ""} -> [{:channels, channels}]
_ -> {:error, :invalid_param}
end
end
defp parse_params(:audio, []), do: [{:channels, 1}]
defp parse_params(_, params), do: params
end