Packages
membrane_rtp_plugin
0.10.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/rtp/header_extension.ex
defmodule Membrane.RTP.Header.Extension do
@moduledoc """
Describes RTP Header Extension defined in [RFC3550](https://tools.ietf.org/html/rfc3550#section-5.3.1)
```
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| defined by profile | length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| header extension |
| .... |
```
"""
alias Membrane.Buffer
alias Membrane.RTP.SessionBin
@enforce_keys [:identifier, :data]
defstruct @enforce_keys
@type identifier_t :: 1..14 | SessionBin.rtp_extension_name_t()
@type t :: %__MODULE__{
identifier: identifier_t(),
data: binary()
}
@spec pop(Buffer.t(), identifier_t()) :: {t() | nil, Buffer.t()}
def pop(buffer, identifier) do
extension = Enum.find(buffer.metadata.rtp.extensions, &(&1.identifier == identifier))
if extension do
buffer =
Bunch.Struct.update_in(
buffer,
[:metadata, :rtp, :extensions],
&delete(&1, identifier)
)
{extension, buffer}
else
{nil, buffer}
end
end
@spec put(Buffer.t(), t()) :: Buffer.t()
def put(buffer, extension) do
Bunch.Struct.update_in(buffer, [:metadata, :rtp, :extensions], &[extension | &1])
end
defp delete(extensions, identifier) do
Enum.reject(extensions, &(&1.identifier == identifier))
end
end