Packages
membrane_core
1.2.7
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.7
1.2.6
1.2.5
retired
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.2.0-rc1
1.1.2
1.1.1
1.1.0
1.1.0-rc1
1.1.0-rc0
1.0.1
1.0.0
1.0.0-rc1
1.0.0-rc0
0.12.9
0.12.8
0.12.7
0.12.6
0.12.5
0.12.4
0.12.3
0.12.2
0.12.1
0.12.0
retired
0.11.5
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.2
0.10.1
0.10.0
0.9.0
0.8.2
0.8.1
0.8.0
0.7.0
0.6.1
0.6.0
0.5.3
0.5.2
0.5.1
0.5.0
0.4.3
0.4.2
0.4.1
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.1
0.1.0
Membrane Multimedia Framework (Core)
Current section
Files
Jump to
Current section
Files
lib/membrane/tee.ex
defmodule Membrane.Tee do
@moduledoc """
Element for forwarding buffers to at least one output pad
It has one input pad `:input` and 2 output pads:
* `:output` - is a dynamic pad which is always available and works in pull mode
* `:push_output` - is a dynamic pad that can be linked to any number of elements (including 0) and works
in push mode
The `:output` pads dictate the speed of processing data and any element (or elements) connected to
`:push_output` pad will receive the same data as all `:output` instances.
"""
use Membrane.Filter, flow_control_hints?: false
require Membrane.Logger
def_input_pad :input,
availability: :always,
flow_control: :auto,
accepted_format: _any
def_output_pad :output,
availability: :on_request,
flow_control: :auto,
accepted_format: _any
def_output_pad :push_output,
availability: :on_request,
flow_control: :push,
accepted_format: _any
@impl true
def handle_init(_ctx, _opts) do
{[], %{stream_format: nil}}
end
@impl true
def handle_playing(ctx, state) do
if map_size(ctx.pads) < 2 do
Membrane.Logger.debug("""
#{inspect(__MODULE__)} enters :playing playback without any output (:output or :push_output) \
pads linked.
""")
end
{[], state}
end
@impl true
def handle_stream_format(:input, stream_format, _ctx, state) do
{[forward: stream_format], %{state | stream_format: stream_format}}
end
@impl true
def handle_pad_added(Pad.ref(name, _ref) = output_pad, ctx, state)
when name in [:output, :push_output] do
maybe_stream_format =
case state.stream_format do
nil -> []
stream_format -> [stream_format: {output_pad, stream_format}]
end
maybe_eos =
if ctx.pads.input.end_of_stream?,
do: [end_of_stream: output_pad],
else: []
{maybe_stream_format ++ maybe_eos, state}
end
@impl true
def handle_buffer(:input, buffer, _ctx, state) do
{[forward: buffer], state}
end
end