Packages
membrane_rtmp_plugin
0.22.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/amf0/encoder.ex
defmodule Membrane.RTMP.AMF0.Encoder do
@moduledoc false
@type basic_object_t :: float() | boolean() | String.t() | map() | :null
@type list_entry_t :: {key :: String.t(), basic_object_t() | nil}
@type object_t :: basic_object_t() | [list_entry_t()]
@object_end_marker <<0x00, 0x00, 0x09>>
@doc """
Encodes a message according to [AMF0](https://en.wikipedia.org/wiki/Action_Message_Format).
"""
@spec encode(object_t() | [object_t()]) :: binary()
def encode(objects) when is_list(objects) do
objects
|> Enum.map(&do_encode_object/1)
|> IO.iodata_to_binary()
end
def encode(object) do
do_encode_object(object)
end
# encode number
defp do_encode_object(object) when is_number(object) do
<<0x00, object::float-size(64)>>
end
# encode boolean
defp do_encode_object(object) when is_boolean(object) do
if object do
<<0x01, 1::8>>
else
<<0x01, 0::8>>
end
end
# encode string
defp do_encode_object(object) when is_binary(object) and byte_size(object) < 65_535 do
<<0x02, byte_size(object)::16, object::binary>>
end
defp do_encode_object(object) when is_map(object) or is_list(object) do
id =
if is_map(object) do
0x03
else
0x08
end
[id, Enum.map(object, &encode_key_value_pair/1), @object_end_marker]
end
defp do_encode_object(:null), do: <<0x05>>
defp encode_key_value_pair({_key, nil}), do: []
defp encode_key_value_pair({<<key::binary>>, value}) when byte_size(key) < 65_535 do
[<<byte_size(key)::16>>, key, do_encode_object(value)]
end
end