Packages
membrane_rtp_plugin
0.7.1-alpha.2
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 clock_rate: [type: :integer, spec: Membrane.RTP.clock_rate_t()],
srtp_policies: [
spec: [ExLibSRTP.Policy.t()],
default: []
],
secure?: [
type: :boolean,
default: false
],
filters: [
spec: [Membrane.RTP.SessionBin.packet_filter_t()],
default: []
],
depayloader: [type: :module],
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
children = %{
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
},
jitter_buffer: %Membrane.RTP.JitterBuffer{clock_rate: opts.clock_rate},
depayloader: opts.depayloader
}
maybe_link_decryptor =
&to(&1, :decryptor, %Membrane.SRTP.Decryptor{policies: opts.srtp_policies})
links = [
link_bin_input()
|> to_filters(opts.filters)
|> to(:rtcp_receiver)
|> to(:jitter_buffer)
|> then(if opts.secure?, do: maybe_link_decryptor, else: & &1)
|> to(:depayloader)
|> to_bin_output()
]
spec = %ParentSpec{
children: children,
links: links
}
{{:ok, spec: spec}, %{}}
end
defp to_filters(link_builder, filters) do
Enum.reduce(filters, link_builder, fn {filter_name, filter}, builder ->
builder |> to(filter_name, filter)
end)
end
end