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/stream_receive_bin.ex
defmodule Membrane.RTP.StreamReceiveBin do
@moduledoc """
This bin gets a parsed RTP stream on input and outputs raw media stream.
Its responsibility is to depayload the RTP stream and compensate the
jitter.
"""
use Membrane.Bin
alias Membrane.ParentSpec
def_options srtp_policies: [
spec: [ExLibSRTP.Policy.t()],
default: []
],
secure?: [
type: :boolean,
default: false
],
extensions: [
spec: [Membrane.RTP.SessionBin.extension_t()],
default: []
],
clock_rate: [
type: :integer,
spec: RTP.clock_rate_t()
],
depayloader: [spec: module() | nil],
local_ssrc: [spec: Membrane.RTP.ssrc_t()],
remote_ssrc: [spec: Membrane.RTP.ssrc_t()],
rtcp_report_interval: [spec: Membrane.Time.t() | nil],
telemetry_label: [
spec: [{atom(), any()}],
default: []
]
def_input_pad :input, demand_unit: :buffers, caps: :any
def_output_pad :output, caps: :any, demand_unit: :buffers
@impl true
def handle_init(opts) do
if opts.secure? and not Code.ensure_loaded?(ExLibSRTP),
do: raise("Optional dependency :ex_libsrtp is required when using secure? option")
maybe_link_decryptor =
&to(&1, :decryptor, struct(Membrane.SRTP.Decryptor, %{policies: opts.srtp_policies}))
maybe_link_depayloader_bin =
&to(&1, :depayloader, %Membrane.RTP.DepayloaderBin{
depayloader: opts.depayloader,
clock_rate: opts.clock_rate
})
links = [
link_bin_input()
|> to_extensions(opts.extensions)
|> to(:rtcp_receiver, %Membrane.RTCP.Receiver{
local_ssrc: opts.local_ssrc,
remote_ssrc: opts.remote_ssrc,
report_interval: opts.rtcp_report_interval,
telemetry_label: opts.telemetry_label
})
|> to(:packet_tracker, %Membrane.RTP.InboundPacketTracker{
clock_rate: opts.clock_rate,
repair_sequence_numbers?: true
})
|> then(if opts.secure?, do: maybe_link_decryptor, else: & &1)
|> then(if opts.depayloader, do: maybe_link_depayloader_bin, else: & &1)
|> to_bin_output()
]
spec = %ParentSpec{
links: links
}
{{:ok, spec: spec}, %{}}
end
defp to_extensions(link_builder, extensions) do
Enum.reduce(extensions, link_builder, fn {extension_name, extension}, builder ->
builder |> to(extension_name, extension)
end)
end
end