Packages
membrane_hls_plugin
3.0.3
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/cmaf_sink.ex
defmodule Membrane.HLS.CMAFSink do
use Membrane.Sink
def_input_pad(
:input,
accepted_format: Membrane.CMAF.Track
)
def_options(
track_id: [
spec: String.t(),
description: "ID of the track."
],
build_stream: [
spec: (Membrane.CMAF.Track.t() -> HLS.VariantStream.t() | HLS.AlternativeRendition.t()),
description: "Build the stream with the given stream format"
],
target_segment_duration: [
spec: Membrane.Time.t()
]
)
@impl true
def handle_init(_context, opts) do
{[], %{opts: opts, next_pts: nil}}
end
def handle_stream_format(:input, format, _ctx, state) do
track_id = state.opts.track_id
target_segment_duration =
Membrane.Time.as_seconds(state.opts.target_segment_duration, :exact)
|> Ratio.ceil()
stream = state.opts.build_stream.(format)
Membrane.HLS.maybe_warn_deprecated_stream_fields(track_id, stream)
add_track_opts = [
codecs: Membrane.HLS.serialize_codecs(format.codecs),
stream: stream,
segment_extension: ".m4s",
target_segment_duration: target_segment_duration,
codecs_complete?: true
]
actions = [
notify_parent: {:packager_add_track, track_id, add_track_opts},
notify_parent: {:packager_put_init_section, track_id, format.header}
]
{actions, state}
end
def handle_buffer(:input, buffer, _ctx, state) do
duration_ns = buffer.metadata.duration
duration =
duration_ns
|> Membrane.Time.as_seconds()
|> Ratio.to_float()
pts = buffer.pts || state.next_pts || 0
next_pts = pts + duration_ns
actions = [
notify_parent:
{:packager_put_segment, state.opts.track_id, buffer.payload, duration, pts,
Map.get(buffer, :dts)}
]
{actions, %{state | next_pts: next_pts}}
end
end