Packages
membrane_rtp_plugin
0.15.0-rc.1
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