Current section

Files

Jump to
membrane_core lib membrane pipeline spec.ex
Raw

lib/membrane/pipeline/spec.ex

defmodule Membrane.Pipeline.Spec do
@moduledoc """
Structure representing topology of a pipeline. It can be returned from
`Membrane.Pipeline.handle_init/1` callback upon pipeline's initialization.
It will define a topology of children and links that build the pipeline.
## Children
Children that should be spawned when the pipeline starts can be defined
with the `:children` field.
You have to set it to a keyword list, where keys are valid element name
that is unique within this pipeline and values are either element's module or
struct of that module.
Sample definitions:
[
first_element: %Element.With.Options.Struct{option_a: 42},
some_element: Element.Without.Options,
other_element: Element.Using.Default.Options
]
When defining children, some additional parameters can be provided by wrapping
child definition with a tuple and putting keyword list of parameters at the end:
[
first_element: {Element.Bare, indexed: true},
second_element: {%Element{opt_a: 42}, indexed: true}
]
Available params are described in `t:child_property_t/0`
## Links
Links that should be made when the pipeline starts, and children are spawned
can be defined with the `:links` field.
You have to set it to a map, where both keys and values are tuples of
`{element_name, pad_name}`. Values can also have additional options passed by
keyword list at the end (See `t:link_option_t/0`).
Element names have to match names given to the `:children` field.
Once it's done, pipeline will ensure that links are present.
Sample definition:
%{
{:source, :output} => {:converter, :input, pull_buffer: [preferred_size: 20_000]},
{:converter, :output} => {:aggregator, :input},
{:aggregator, :output} => {:sink, :input},
}
"""
alias Membrane.Element
alias Membrane.Core.PullBuffer
alias Element.Pad
@type child_spec_t :: module | struct
@typedoc """
Description of all the children elements inside the pipeline
"""
@type children_spec_t ::
[{Membrane.Element.name_t(), child_spec_t}]
| %{Membrane.Element.name_t() => child_spec_t}
@typedoc """
Options available when linking elements in the pipeline
`:pull_buffer` allows to configure Buffer between elements. See `t:Membrane.Core.PullBuffer.props_t/0`
"""
@type link_option_t :: {:pull_buffer, PullBuffer.props_t()}
@type link_from_spec_t :: {Element.name_t(), Pad.name_t()}
@type link_to_spec_t ::
{Element.name_t(), Pad.name_t()}
| {Element.name_t(), Pad.name_t(), [link_option_t]}
@typedoc """
Map describing links between elements
"""
@type links_spec_t :: %{required(link_from_spec_t) => link_to_spec_t}
@typedoc """
Struct used when launching a pipeline
"""
@type t :: %__MODULE__{
children: children_spec_t,
links: links_spec_t
}
defstruct children: [],
links: %{}
end