Packages
membrane_hls_plugin
2.0.14
3.0.10
3.0.9
3.0.8
3.0.7
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.1.9
2.1.8
2.1.7
2.1.6
2.1.5
2.1.4
2.1.3
2.1.2
2.1.1
2.1.0
2.0.16
2.0.15
2.0.14
2.0.13
2.0.12
2.0.11
2.0.10
2.0.9
2.0.8
2.0.7
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.1.12
1.1.11
1.1.10
1.1.9
1.1.8
1.1.7
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.0
Adaptive live streaming (HLS) plugin for the Membrane Framework.
Current section
Files
Jump to
Current section
Files
lib/membrane/hls/shifter.ex
defmodule Membrane.HLS.Shifter do
use Membrane.Filter
# This is here to make sure we're not creating negative timestamps. A safe
# bet is framerate duration * 16 (maximum frame reordering for h264)
@min_offset Membrane.Time.seconds(2)
def_input_pad(:input,
accepted_format: any_of(Membrane.H264, Membrane.AAC, Membrane.Text, Membrane.RemoteStream)
)
def_output_pad(:output,
accepted_format: any_of(Membrane.H264, Membrane.AAC, Membrane.Text, Membrane.RemoteStream)
)
def_options(
duration: [
spec: Membrane.Time.t(),
description: """
The duration of the track we're adding segments to. Timing will restart from this value.
"""
]
)
def handle_init(_ctx, opts) do
{[], %{offset: max(opts.duration, @min_offset), t_zero: nil}}
end
def handle_buffer(:input, buffer, ctx, state = %{t_zero: nil}) do
state = put_in(state, [:t_zero], Membrane.Buffer.get_dts_or_pts(buffer))
handle_buffer(:input, buffer, ctx, state)
end
def handle_buffer(:input, buffer, _ctx, state) do
shifted_buffer = %{
buffer
| pts: compute_offset(buffer.pts, state),
dts: compute_offset(buffer.dts, state),
metadata: update_metadata(buffer.metadata, state)
}
{[buffer: {:output, shifted_buffer}], state}
end
defp update_metadata(%{to: to} = metadata, state),
do: %{metadata | to: compute_offset(to, state)}
defp update_metadata(metadata, _state), do: metadata
defp compute_delta(t, state), do: t - state.t_zero
defp compute_offset(nil, _state), do: nil
defp compute_offset(t, state) do
state.offset + compute_delta(t, state)
end
end