Packages
membrane_rtp_plugin
0.13.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/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],
rtcp_fir_interval: [spec: Membrane.Time.t() | nil]
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,
fir_interval: opts.rtcp_fir_interval
})
|> 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