Packages
membrane_rtp_plugin
0.20.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 [RFC8285](https://datatracker.ietf.org/doc/html/rfc8285)
and provides common functions for interacting with extensions placed in buffers.
```
0 1 2
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
| ID | len | data (len+1 bytes) ...
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-
```
"""
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 find(Buffer.t(), identifier_t()) :: t() | nil
def find(%Buffer{metadata: %{rtp: %{extensions: extensions}}}, identifier) do
Enum.find(extensions, &(&1.identifier == identifier))
end
@spec put(Buffer.t(), t()) :: Buffer.t()
def put(buffer, extension) do
Bunch.Struct.update_in(buffer, [:metadata, :rtp, :extensions], &[extension | &1])
end
@spec delete(Buffer.t(), identifier_t()) :: Buffer.t()
def delete(buffer, identifier) do
Bunch.Struct.update_in(
buffer,
[:metadata, :rtp, :extensions],
&Enum.reject(&1, fn extension -> extension.identifier == identifier end)
)
end
@spec pop(Buffer.t(), identifier_t()) :: {t() | nil, Buffer.t()}
def pop(buffer, identifier) do
case find(buffer, identifier) do
nil -> {nil, buffer}
extension -> {extension, delete(buffer, identifier)}
end
end
end