Packages
membrane_core
0.12.0
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)
Retired package: Deprecated - Package has an API change that will be no longer supported, use version 0.12.1 instead of this one
Current section
Files
Jump to
Current section
Files
lib/membrane/core/element/state.ex
defmodule Membrane.Core.Element.State do
@moduledoc false
# Structure representing state of an Core.Element. It is a part of the private API.
# It does not represent state of elements you construct, it's a state used
# internally in Membrane.
use Bunch.Access
alias Membrane.{Clock, Element, Pad, Sync}
alias Membrane.Core.Timer
alias Membrane.Core.Child.{PadModel, PadSpecHandler}
alias Membrane.Core.Element.EffectiveFlowController
require Membrane.Pad
@type t :: %__MODULE__{
module: module,
type: Element.type(),
name: Element.name(),
internal_state: Element.state() | nil,
pads_info: PadModel.pads_info() | nil,
pads_data: PadModel.pads_data() | nil,
parent_pid: pid,
supplying_demand?: boolean(),
delayed_demands: MapSet.t({Pad.ref(), :supply | :redemand}),
handle_demand_loop_counter: non_neg_integer(),
synchronization: %{
timers: %{Timer.id() => Timer.t()},
parent_clock: Clock.t(),
latency: Membrane.Time.non_neg(),
stream_sync: Sync.t(),
clock: Clock.t() | nil
},
initialized?: boolean(),
playback: Membrane.Playback.t(),
playback_queue: Membrane.Core.Element.PlaybackQueue.t(),
resource_guard: Membrane.ResourceGuard.t(),
subprocess_supervisor: pid,
terminating?: boolean(),
setup_incomplete?: boolean(),
effective_flow_control: EffectiveFlowController.effective_flow_control()
}
defstruct [
:module,
:type,
:name,
:internal_state,
:pads_info,
:pads_data,
:parent_pid,
:supplying_demand?,
:delayed_demands,
:handle_demand_loop_counter,
:synchronization,
:demand_size,
:initialized?,
:playback,
:playback_queue,
:resource_guard,
:subprocess_supervisor,
:terminating?,
:setup_incomplete?,
:effective_flow_control
]
@doc """
Initializes new state.
"""
@spec new(%{
module: module,
name: Element.name(),
parent_clock: Clock.t(),
sync: Sync.t(),
parent: pid,
resource_guard: Membrane.ResourceGuard.t(),
subprocess_supervisor: pid()
}) :: t
def new(options) do
%__MODULE__{
module: options.module,
type: options.module.membrane_element_type(),
name: options.name,
internal_state: nil,
parent_pid: options.parent,
supplying_demand?: false,
delayed_demands: MapSet.new(),
handle_demand_loop_counter: 0,
synchronization: %{
parent_clock: options.parent_clock,
timers: %{},
clock: nil,
stream_sync: options.sync,
latency: 0
},
initialized?: false,
playback: :stopped,
playback_queue: [],
resource_guard: options.resource_guard,
subprocess_supervisor: options.subprocess_supervisor,
terminating?: false,
setup_incomplete?: false,
effective_flow_control: :push
}
|> PadSpecHandler.init_pads()
end
end