Packages
membrane_core
0.2.1
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/testing/source.ex
defmodule Membrane.Testing.Source do
@moduledoc """
Testing Element for supplying data based on generator function passed through options.
"""
use Membrane.Element.Base.Source
alias Membrane.Buffer
use Bunch
def_output_pads output: [caps: :any]
def_options actions_generator: [
type: :function,
spec: (non_neg_integer, non_neg_integer -> [Membrane.Action.t()]),
default: &__MODULE__.default_buf_gen/2,
description: """
Function invoked each time `handle_demand` is invoked.
It is an action generator that takes two arguments.
First argument is counter which is incremented by 1 every call
and second argument represents size of demand.
"""
]
@impl true
def handle_init(opts) do
{:ok, opts |> Map.merge(%{cnt: 0})}
end
@impl true
def handle_demand(:output, size, :buffers, _ctx, %{cnt: cnt} = state) do
{actions, cnt} = state.actions_generator.(cnt, size)
{{:ok, actions}, %{state | cnt: cnt}}
end
def default_buf_gen(cnt, size) do
cnt..(size + cnt - 1)
|> Enum.map(fn cnt ->
buf = %Buffer{payload: <<cnt::16>>}
{:buffer, {:output, buf}}
end)
~> {&1, cnt + size}
end
end