Packages
membrane_rtmp_plugin
0.14.0
0.29.5
0.29.4
0.29.3
0.29.2
0.29.1
0.29.0
0.28.1
0.28.0
0.27.3
0.27.2
0.27.0
0.26.0
0.25.0
0.24.0
0.23.3
0.23.2
0.23.1
0.23.0
0.22.1
0.22.0
0.21.0
0.20.2
0.20.1
0.20.0
0.19.3
0.19.2
retired
0.19.1
0.19.0
0.18.0
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.2
0.13.1
0.13.0
0.12.1
0.12.0
0.11.3
0.11.2
0.11.1
0.11.0
0.10.0
0.9.1
0.9.0
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.0
0.4.1
0.4.0
0.3.0
0.2.1
0.2.0
0.1.1
0.1.0
RTMP Plugin for Membrane Multimedia Framework
Current section
Files
Jump to
Current section
Files
lib/membrane_rtmp_plugin/rtmp/source/amf/parser.ex
defmodule Membrane.RTMP.AMF.Parser do
@moduledoc false
@doc """
Parses message from AMF format to elixir data types.
"""
@spec parse(binary()) :: list()
def parse(binary) do
do_parse(binary, [])
end
defp do_parse(<<>>, acc), do: Enum.reverse(acc)
defp do_parse(payload, acc) do
{value, rest} = parse_value(payload)
do_parse(rest, [value | acc])
end
# parsing a number
defp parse_value(<<0x00, number::float-size(64), rest::binary>>) do
{number, rest}
end
# parsing a boolean
defp parse_value(<<0x01, boolean::8, rest::binary>>) do
{boolean == 1, rest}
end
# parsing a string
defp parse_value(<<0x02, size::16, string::binary-size(size), rest::binary>>) do
{string, rest}
end
# parsing a key-value object
defp parse_value(<<0x03, rest::binary>>) do
{acc, rest} = parse_object_pairs(rest, [])
{Map.new(acc), rest}
end
# parsing a null value
defp parse_value(<<0x05, rest::binary>>) do
{:null, rest}
end
defp parse_value(<<0x08, _array_size::32, rest::binary>>) do
parse_object_pairs(rest, [])
end
defp parse_value(_data) do
raise "Unknown data type"
end
# we reached object end
defp parse_object_pairs(<<0x00, 0x00, 0x09, rest::binary>>, acc) do
{Enum.reverse(acc), rest}
end
defp parse_object_pairs(
<<key_size::16, key::binary-size(key_size), rest::binary>>,
acc
) do
{value, rest} = parse_value(rest)
parse_object_pairs(rest, [{key, value} | acc])
end
end