dasher
DASH and HLS segmenter¶
Register name used to load filter: dasher
This filter may be automatically loaded during graph resolution.
This filter requires the graph resolver to be activated.
This filter provides segmentation and manifest generation for MPEG-DASH and HLS formats.
The segmenter currently supports:
- MPD and m3u8 generation (potentially in parallel)
- ISOBMFF, MPEG-2 TS, MKV and raw bitstream segment formats
- override of profiles and levels in manifest for codecs
- most MPEG-DASH profiles
- static and dynamic (live) manifest offering
- context store and reload for batch processing of live/dynamic sessions
The filter does perform per-segment real-time regulation using sreg.
If you need per-frame real-time regulation on non-real-time inputs, insert a reframer before to perform real-time regulation.
Example
gpac -i file.mp4 reframer:rt=on -o live.mpd:dmode=dynamic
Template strings¶
The segmenter uses templates to derive output file names, regardless of the DASH mode (even when templates are not used). The default one is $File$_dash
for ondemand and single file modes, and $File$_$Number$
for separate segment files
Example
template=Great_$File$_$Width$_$Number$
foo.mp4
with 640x360
video resolution, this will resolve in Great_foo_640_$Number$
for the DASH template.Example
template=Great_$File$_$Width$
foo.mp4
with 640x360
video resolution, this will resolve in Great_foo_640.mp4
for onDemand case.
Standard DASH replacement strings:
$Number[%%0Nd]$: replaced by the segment number, possibly prefixed with 0
$RepresentationID$: replaced by representation name
$Time$: replaced by segment start time
$Bandwidth$: replaced by representation bandwidth.
Note: these strings are not replaced in the manifest templates elements.
Additional replacement strings (not DASH, not generic GPAC replacements but may occur multiple times in template):
- $Init=NAME$: replaced by NAME for init segment, ignored otherwise
- $XInit=NAME$: complete replace by NAME for init segment, ignored otherwise
- $InitExt=EXT$: replaced by EXT for init segment file extensions, ignored otherwise
- $Index=NAME$: replaced by NAME for index segments, ignored otherwise
- $Path=PATH$: replaced by PATH when creating segments, ignored otherwise
- $Segment=NAME$: replaced by NAME for media segments, ignored for init segments
- $SegExt=EXT$: replaced by EXT for media segment file extensions, ignored for init segments
- $FS$ (FileSuffix): replaced by
_trackN
in case the input is an AV multiplex, or kept empty otherwise
Note: these strings are replaced in the manifest templates elements.
PID assignment and configuration¶
To assign PIDs into periods and adaptation sets and configure the session, the segmenter looks for the following properties on each input PID:
Representation
: assigns representation ID to input PID. If not set, the default behavior is to have each media component in different adaptation sets. Setting theRepresentation
allows explicit multiplexing of the source(s)Period
: assigns period ID to input PID. If not set, the default behavior is to have all media in the same period with the same start timePStart
: assigns period start. If not set, 0 is assumed, and periods appear in the Period ID declaration order. If negative, this gives the period order (-1 first, then -2 ...). If positive, this gives the true start time and will abort DASHing at period end
Note: When both positive and negative values are found, the by-order periods (negative) will be inserted AFTER the timed period (positive)ASID
: assigns parent adaptation set ID. If not 0, only sources with same AS ID will be in the same adaptation set
Note: If multiple streams in source, only the first stream will have an AS ID assignedxlink
: for remote periods, only checked for null PIDRole
,PDesc
,ASDesc
,ASCDesc
,RDesc
: various descriptors to set for period, AS or representationBUrl
: overrides segmenter [-base] with a set of BaseURLs to use for the PID (per representation)Template
: overrides segmenter template for this PIDDashDur
: overrides segmenter segment duration for this PIDStartNumber
: sets the start number for the first segment in the PID, default is 1IntraOnly
: indicates input PID follows HLS EXT-X-I-FRAMES-ONLY guidelinesCropOrigin
: indicates x and y coordinates of video for SRD (size is video size)SRD
: indicates SRD position and size of video for SRD, ignored ifCropOrigin
is setSRDRef
: indicates global width and height of SRD, ignored ifCropOrigin
is setHLSPL
: name of variant playlist, can use templatesHLSMExt
: list of extensions to add to master playlist entries, ['foo','bar=val'] added as,foo,bar=val
HLSVExt
: list of extensions to add to variant playlist, ['#foo','#bar=val'] added as#foo \n #bar=val
- Non-dash properties:
Bitrate
,SAR
,Language
,Width
,Height
,SampleRate
,NumChannels
,Language
,ID
,DependencyID
,FPS
,Interlaced
,Codec
. These properties are used to setup each representation and can be overridden on input PIDs using the general PID property settings (cf global help).
Example
gpac -i test.mp4:#Bitrate=1M -o test.mpd
Example
gpac -i muxav.mp4 -o test.mpd
Example
gpac -i muxav.mp4:#Representation=1 -o test.mpd
Example
gpac -i m1.mp4 -i m2.mp4:#Period=Yep -o test.mpd
m1.mp4
in first period, m2.mp4
in second period.Example
gpac -i m1.mp4:#BUrl=http://foo/bar -o test.mpd
m1.mp4
.Example
gpac -i m1.mp4:#ASCDesc=<ElemName val="attval">text</ElemName> -o test.mpd
Note: this can be used to inject most DASH descriptors not natively handled by the segmenter.
The segmenter handles the XML descriptor as a string and does not attempt to validate it. Descriptors, as well as some segmenter filter arguments, are string lists (comma-separated by default), so that multiple descriptors can be added:
Example
gpac -i m1.mp4:#RDesc=<Elem attribute="1"/>,<Elem2>text</Elem2> -o test.mpd
m1.mp4
.Example
gpac -i video.mp4:#Template=foo$Number$ -i audio.mp4:#Template=bar$Number$ -o test.mpd
Example
gpac -i null:#xlink=http://foo/bar.xml:#PDur=4 -i m.mp4:#PStart=-1 -o test.mpd
Example
gpac -i null:#xlink=http://foo/bar.xml:#PStart=6 -i m.mp4 -o test.mpd
Example
gpac -i v1:#SRD=0x0x1280x360:#SRDRef=1280x720 -i v2:#SRD=0x360x1280x360 -o test.mpd
v2
below v1
using a global SRD size of 1280x720.
The segmenter will create multiplexing filter chains for each representation and will reassign PID IDs so that each media component (video, audio, ...) in an adaptation set has the same ID.
For HLS, the output manifest PID will deliver the master playlist and the variant playlists.
The default variant playlist are $NAME_$N.m3u8, where $NAME is the radical of the output file name and $N is the 1-based index of the variant.
When HLS mode is enabled, the segment template is relative to the variant playlist file, which can also be templated.
Example
gpac -i av.mp4:#HLSPL=$Type$/index.m3u8 -o dash/live.m3u8:dual:template='$Number$'
This will put video segments and playlist in dash/video/
and audio segments and playlist in dash/audio/
Segmentation¶
The default behavior of the segmenter is to estimate the theoretical start time of each segment based on target segment duration, and start a new segment when a packet with SAP type 1,2,3 or 4 with time greater than the theoretical time is found.
This behavior can be changed to find the best SAP packet around a segment theoretical boundary using sbound:
closest
mode: the segment will start at the closest SAP of the theoretical boundary
in
mode: the segment will start at or before the theoretical boundary
Warning: These modes will introduce delay in the segmenter (typically buffering of one GOP) and should not be used for low-latency modes.
The segmenter can also be configured to:
- completely ignore SAP when segmenting using sap.
- ignore SAP on non-video streams when segmenting using strict_sap.
When seg_sync is disabled, the segmenter will by default announce a new segment in the manifest(s) as soon as its size/offset is known or its name is known, but the segment (or part in LL-HLS) may still not be completely written/sent.
This may result in temporary mismatches between segment/part size currently received versus size as advertized in manifest.
When seg_sync is enabled, the segmenter will wait for the last byte of the fragment/segment to be pushed before announcing a new segment in the manifest(s). This can however slightly increase the latency in MPEG-DASH low-latency.
Dynamic (real-time live) Mode¶
The dasher does not perform real-time regulation by default.
For regular segmentation, you should enable segment regulation sreg if your sources are not real-time.
Example
gpac -i source.mp4 -o live.mpd:segdur=2:profile=live:dmode=dynamic:sreg
For low latency segmentation with fMP4, you will need to specify the following options:
- cdur: set the fMP4 fragment duration
- asto: set the availability time offset for DASH. This value should be equal or slightly greater than segment duration minus cdur
- llhls: enable low latency for HLS
Note: llhls does not force cmaf
mode to allow for multiplexed media in segments but it enforces to tfdt_traf
in the muxer.
If your sources are not real-time, insert a reframer filter with real-time regulation
Example
gpac -i source.mp4 reframer:rt=on -o live.mpd:segdur=2:cdur=0.2:asto=1.8:profile=live:dmode=dynamic
Example
gpac -i source.mp4 reframer:rt=on -o live.m3u8:segdur=2:cdur=0.2:llhls=br:dmode=dynamic
Example
gpac -i source.mp4 reframer:rt=on -o live.m3u8:segdur=2:cdur=0.2:llhls=sf:dmode=dynamic
You can combine LL-HLS and DASH-LL generation:
Example
gpac -i source.mp4 reframer:rt=on -o live.mpd:dual:segdur=2:cdur=0.2:asto=1.8:llhls=br:profile=live:dmode=dynamic
For DASH, the filter will use the local clock for UTC anchor points in DASH.
The filter can fetch and signal clock in other ways using utcs.
Example
[opts]:utcs=inband
Example
[opts]::utcs=http://time.akamai.com[::opts]
http://time.akamai.com
, use it as the UTC reference for segment generation and insert in the MPD a UTCTiming descriptor containing the time server URL.Note: if not set as a global option using
--utcs=
, you must escape the url using double ::
or use other separators.
Cue-driven segmentation¶
The segmenter can take a list of instructions, or Cues, to use for the segmentation process, in which case only these are used to derive segment boundaries. Cues can be set through XML files or injected in input packets.
Cue files can be specified for the entire segmenter, or per PID using DashCue
property.
Cues are given in an XML file with a root element called <DASHCues>, with currently no attribute specified. The children are one or more <Stream> elements, with attributes:
- id: integer for stream/track/PID ID
- timescale: integer giving the units of following timestamps
- mode: if present and value is
edit
, the timestamp are in presentation time (edit list applied) otherwise they are in media time - ts_offset: integer giving a value (in timescale) to subtract to the DTS/CTS values listed
The children of <Stream> are one or more <Cue> elements, with attributes:
- sample: integer giving the sample/frame number of a sample at which splitting shall happen
- dts: long integer giving the decoding time stamp of a sample at which splitting shall happen
- cts: long integer giving the composition / presentation time stamp of a sample at which splitting shall happen
Warning: Cues shall be listed in decoding order.
If the DashCue
property of a PID equals inband
, the PID will be segmented according to the CueStart
property of input packets.
This feature is typically combined with a list of files as input:
Example
gpac -i list.m3u:sigcues -o res/live.mpd
flist
filter in cue mode, generating continuous timelines from the sources and injecting a CueStart
property at each new file.
If the cues option equals none
, the DashCue
property of input PIDs will be ignored.
Manifest Generation only mode¶
The segmenter can be used to generate manifests from already fragmented ISOBMFF inputs using sigfrag.
In this case, segment boundaries are attached to each packet starting a segment and used to drive the segmentation.
This can be used with single-track ISOBMFF sources, either single file or multi file.
For single file source:
- if onDemand profile is requested, sources have to be formatted as a DASH self-initializing media segment with the proper sidx.
- templates are disabled.
- sseg is forced for all profiles except onDemand ones.
For multi files source: - input shall be a playlist containing the initial file followed by the ordered list of segments.
- if no template is provided, the full or main profile will be used
- if -template is provided, it shall be correct: the filter will not try to guess one from the input file names and will not validate it either.
The manifest generation-only mode supports both MPD and HLS generation.
Example
gpac -i ondemand_src.mp4 -o dash.mpd:sigfrag:profile=onDemand
Example
gpac -i ondemand_src.mp4 -o dash.m3u8:sigfrag
Example
gpac -i seglist.txt -o dash.mpd:sigfrag
Example
gpac -i seglist.txt:Template=$XInit=init$$q1/$Number$ -o dash.mpd:sigfrag:profile=live
init.mp4
, q1/1.m4s
, q1/2.m4s
...
Cue Generation only mode¶
The segmenter can be used to only generate segment boundaries from a set of inputs using gencues, without generating manifests or output files.
In this mode, output PIDs are declared directly rather than redirected to media segment files.
The segmentation logic is not changed, and packets are forwarded with the same information and timing as in regular mode.
Output PIDs are forwarded with DashCue=inband
property, so that any subsequent dasher follows the same segmentation process (see above).
The first packet in a segment has:
- property FileNumber
(and, if multiple files, FileName
) set as usual
- property CueStart
set
- property DFPStart=0
set if this is the first packet in a period
This mode can be used to pre-segment the streams for later processing that must take place before final dashing.
Example
gpac -i source.mp4 dasher:gencues cecrypt:cfile=roll_seg.xml -o live.mpd
Example
gpac -i s1.mp4 -i s2.mp4:#CryptInfo=clear:#Period=3 -i s3.mp4:#Period=3 dasher:gencues cecrypt:cfile=roll_period.xml -o live.mpd
keyRoll=period
, this will generate:- first period crypted with one key
- second period clear
- third period crypted with another key
Forced-Template mode¶
When tpl_force is set, the template string is not analyzed nor modified for missing elements.
This is typically used to redirect segments to a given destination regardless of the dash profile.
Example
gpac -i SRC -o null:ext=mpd:tpl_force --template=pipe://mypipe
mypipe
as destination for the muxer result.
Warning: Options for segment destination cannot be set through the template, global options must be used.
Output redirecting¶
When loaded implicitly during link resolution, the dasher will only link its outputs to the target sink
Example
gpac -i SRC -o URL1:OPTS1 -o URL2:OPTS1
This allows dashing to multiple outputs with different formats, dash durations, etc.
It can be useful to redirect all the filter outputs to several sinks, for example to push through ROUTE and through HTTP the same segments.
In order to do this, the filter MUST be explicitly loaded and all options related to dash and MP4 must be set either globally or on the dasher filter.
Example
gpac -i SRC dasher:cmfc:segdur=2 -o URL1 -o URL2
When explicitly loading the filter, the dual option will be disabled unless mname is set to the alternate output name.
Multiplexer development considerations¶
Output multiplexers allowing segmented output must obey the following:
- inspect packet properties
* FileNumber: if set, indicate the start of a new DASH segment
* FileName: if set, indicate the file name. If not present, output shall be a single file. This is only set for packet carrying the FileNumber
property, and only on one PID (usually the first) for multiplexed outputs
* IDXName: gives the optional index name. If not present, index shall be in the same file as dash segment. Only used for MPEG-2 TS for now
* EODS: property is set on packets with no payload and no timestamp to signal the end of a DASH segment. This is only used when stopping/resuming the segmentation process, in order to flush segments without dispatching an EOS (see subdur )
- for each segment done, send a downstream event on the first connected PID signaling the size of the segment and the size of its index if any
- for multiplexers with init data, send a downstream event signaling the size of the init and the size of the global index if any
- the following filter options are passed to multiplexers, which should declare them as arguments:
* noinit: disables output of init segment for the multiplexer (used to handle bitstream switching with single init in DASH)
* frag: indicates multiplexer shall use fragmented format (used for ISOBMFF mostly)
* subs_sidx=0: indicates an SIDX shall be generated - only added if not already specified by user
* xps_inband=all|no|both: indicates AVC/HEVC/... parameter sets shall be sent inband, out of band, or both
* nofragdef: indicates fragment defaults should be set in each segment rather than in init segment
The segmenter adds the following properties to the output PIDs:
DashMode: identifies VoD (single file with global index) or regular DASH mode used by segmenter
DashDur: identifies target DASH segment duration - this can be used to estimate the SIDX size for example
LLHLS: identifies LLHLS is used; the multiplexer must send fragment size events back to the dasher, and set LLHLSFragNum
on the first packet of each fragment
SegSync: indicates that fragments/segments must be completely flushed before sending back size events
Options¶
segdur (frac, default: 0/0): target segment duration in seconds. A value less than or equal to 0 defaults to 1.0 second
tpl (bool, default: true): use template mode (multiple segment, template URLs)
stl (bool, default: false): use segment timeline (ignored in on_demand mode)
dmode (enum, default: static, updatable): dash content mode
static: static content
dynamic: live generation
dynlast: last call for live, will turn the MPD into static
dynauto: live generation and move to static manifest upon end of stream
sseg (bool, default: false): single segment is used
sfile (bool, default: false): use a single file for all segments (default in on_demand)
align (bool, default: true): enable segment time alignment between representations
sap (bool, default: true): enable splitting segments at SAP boundaries
mix_codecs (bool, default: false): enable mixing different codecs in an adaptation set
ntp (enum, default: rem): insert/override NTP clock at the beginning of each segment
rem: removes NTP from all input packets
yes: inserts NTP at each segment start
* keep: leaves input packet NTP untouched
no_sar (bool, default: false): do not check for identical sample aspect ratio for adaptation sets
bs_switch (enum, default: def): bitstream switching mode (single init segment)
def: resolves to off for onDemand and inband for live
off: disables BS switching
on: enables it if same decoder configuration is possible
inband: moves decoder config inband if possible
both: inband and outband parameter sets
pps: moves PPS and APS inband, keep VPS,SPS and DCI out of band (used for VVC RPR)
force: enables it even if only one representation
multi: uses multiple stsd entries in ISOBMFF
template (str): template string to use to generate segment name
segext (str): file extension to use for segments
initext (str): file extension to use for the init segment
muxtype (enum, default: auto): muxtype to use for the segments
mp4: uses ISOBMFF format
ts: uses MPEG-2 TS format
mkv: uses Matroska format
webm: uses WebM format
ogg: uses OGG format
raw: uses raw media format (disables multiplexed representations)
* auto: guess format based on extension, default to mp4 if no extension
rawsub (bool, default: no): use raw subtitle format instead of encapsulating in container
asto (dbl, default: 0): availabilityStartTimeOffset to use in seconds. A negative value simply increases the AST, a positive value sets the ASToffset to representations
profile (enum, default: auto): target DASH profile. This will set default option values to ensure conformance to the desired profile. For MPEG-2 TS, only main and live are used, others default to main
auto: turns profile to live for dynamic and full for non-dynamic
live: DASH live profile, using segment template
onDemand: MPEG-DASH live profile
main: MPEG-DASH main profile, using segment list
full: MPEG-DASH full profile
hbbtv1.5.live: HBBTV 1.5 DASH profile
dashavc264.live: DASH-IF live profile
dashavc264.onDemand: DASH-IF onDemand profile
* dashif.ll: DASH IF low-latency profile (set UTC server to time.akamai.com if none set)
profX (str): list of profile extensions, as used by DASH-IF and DVB. The string will be colon-concatenated with the profile used. If starting with +
, the profile string by default is erased and +
is skipped
cp (enum, default: set): content protection element location
set: in adaptation set element
rep: in representation element
* both: in both adaptation set and representation elements
pssh (enum, default: v): storage mode for PSSH box
f: stores in movie fragment only
v: stores in movie only, or movie and fragments if key roll is detected
m: stores in mpd only
mf: stores in mpd and movie fragment
mv: stores in mpd and movie
n: discard pssh from mpd and segments
buf (sint, default: -100): min buffer duration in ms. negative value means percent of segment duration (e.g. -150 = 1.5seg_dur)
spd (sint, default: 0): suggested presentation delay in ms
timescale (sint, default: 0): set timescale for timeline and segment list/template. A value of 0 picks up the first timescale of the first stream in an adaptation set. A negative value forces using stream timescales for each timed element (multiplication of segment list/template/timelines). A positive value enforces the MPD timescale
check_dur (bool, default: true): check duration of sources in period, trying to have roughly equal duration. Enforced whenever period start times are used
skip_seg (bool, default: false): increment segment number whenever an empty segment would be produced - NOT DASH COMPLIANT
title (str): MPD title
source (str): MPD Source
info (str): MPD info url
cprt (str): MPD copyright string
lang (str): language of MPD Info
location (strl): set MPD locations to given URL
base (strl): set base URLs of MPD
refresh (dbl, default: 0): refresh rate for dynamic manifests, in seconds (a negative value sets the MPD duration, value 0 uses dash duration)
tsb (dbl, default: 30): time-shift buffer depth in seconds (a negative value means infinity)
keep_segs (bool, default: false): do not delete segments no longer in time-shift buffer
subdur (dbl, default: 0): maximum duration of the input file to be segmented. This does not change the segment duration, segmentation stops once segments produced exceeded the duration
ast (str): set start date (as xs:date, e.g. YYYY-MM-DDTHH:MM:SSZ) for live mode. Default is now. !! Do not use with multiple periods, nor when DASH duration is not a multiple of GOP size !!
state (str): path to file used to store/reload state info when simulating live. This is stored as a valid MPD with GPAC XML extensions
loop (bool, default: false): loop sources when dashing with subdur and state. If not set, a new period is created once the sources are over
split (bool, default: true): enable cloning samples for text/metadata/scene description streams, marking further clones as redundant
hlsc (bool, default: false): insert clock reference in variant playlist in live HLS
cues (str): set cue file
strict_cues (bool, default: false): strict mode for cues, complains if splitting is not on SAP type 1/2/3 or if unused cue is found
strict_sap (enum, default: off): strict mode for sap
off: ignore SAP types for PID other than video, enforcing startsWithSAP=1
sig: same as off but keep startsWithSAP to the true SAP value
on: warn if any PID uses SAP 3 or 4 and switch to FULL profile
* intra: ignore SAP types greater than 3 on all media types
subs_sidx (sint, default: -1): number of subsegments per sidx. negative value disables sidx. Only used to inherit sidx option of destination
cmpd (bool, default: false): skip line feed and spaces in MPD XML for compactness
styp (str): indicate the 4CC to use for styp boxes when using ISOBMFF output
dual (bool): indicate to produce both MPD and M3U files
sigfrag (bool): use manifest generation only mode
sbound (enum, default: out): indicate how the theoretical segment start TSS (= segment_number * duration)
should be handled
out: segment split as soon as TSS
is exceeded (TSS
<= segment_start)
closest: segment split at closest SAP to theoretical bound
* in: TSS
is always in segment (TSS
>= segment_start)
reschedule (bool, default: false): reschedule sources with no period ID assigned once done (dynamic mode only)
sreg (bool, default: false): regulate the session
- when using subdur and context, only generate segments from the past up to live edge
- otherwise in dynamic mode without context, do not generate segments ahead of time
scope_deps (bool, default: true): scope PID dependencies to be within source. If disabled, PID dependencies will be checked across all input PIDs regardless of their sources
utcs (str): URL to use as time server / UTCTiming source. Special value inband
enables inband UTC (same as publishTime), special prefix xsd@
uses xsDateTime schemeURI rather than ISO
force_flush (bool, default: false): force generating a single segment for each input. This can be useful in batch mode when average source duration is known and used as segment duration but actual duration may sometimes be greater
last_seg_merge (bool, default: false): force merging last segment if less than half the target duration
mha_compat (enum, default: no): adaptation set generation mode for compatible MPEG-H Audio profile
no: only generate the adaptation set for the main profile
comp: only generate the adaptation sets for all compatible profiles
* all: generate the adaptation set for the main profile and all compatible profiles
mname (str): output manifest name for ATSC3 multiplexing (using 'm3u8' only toggles HLS generation)
llhls (enum, default: off): HLS low latency type
off: do not use LL-HLS
br: use LL-HLS with byte-range for segment parts, pointing to full segment (DASH-LL compatible)
sf: use separate files for segment parts (post-fixed .1, .2 etc.)
brsf: generate two sets of manifest, one for byte-range and one for files (_IF
added before extension of manifest)
hlsdrm (str): cryp file info for HLS full segment encryption
hlsx (strl): list of string to append to master HLS header before variants with ['#foo','#bar=val']
added as #foo \n #bar=val
ll_preload_hint (bool, default: true): inject preload hint for LL-HLS
ll_rend_rep (bool, default: true): inject rendition reports for LL-HLS
ll_part_hb (dbl, default: -1): user-defined part hold-back for LLHLS, negative value means 3 times max part duration in session
ckurl (str): set the ClearKey URL common to all encrypted streams (overriden by CKUrl
pid property)
hls_absu (enum, default: no): use absolute url in HLS generation using first URL in base
no: do not use absolute URL
var: use absolute URL only in variant playlists
mas: use absolute URL only in master playlist
both: use absolute URL everywhere
hls_ap (bool, default: false): use audio as primary media instead of video when generating playlists
seg_sync (enum, default: auto): control how waiting on last packet P of fragment/segment to be written impacts segment injection in manifest
no: do not wait for P
yes: wait for P
* auto: wait for P if HLS is used
cmaf (enum, default: no): use cmaf guidelines
no: CMAF not enforced
cmfc: use CMAF cmfc
guidelines
* cmf2: use CMAF cmf2
guidelines
pswitch (enum, default: single): period switch control mode
single: change period if PID configuration changes
force: force period switch at each PID reconfiguration instead of absorbing PID reconfiguration (for splicing or add insertion not using periodID)
* stsd: change period if PID configuration changes unless new configuration was advertised in initial config
chain (str): URL of next MPD for regular chaining
chain_fbk (str): URL of fallback MPD
gencues (bool, default: false): only insert segment boundaries and do not generate manifests
force_init (bool, default: false): force init segment creation in bitstream switching mode
keep_src (bool, default: false): keep source URLs in manifest generation mode
gxns (bool, default: false): insert some gpac extensions in manifest (for now, only tfdt of first segment)
dkid (enum, default: auto): control injection of default KID in MPD
off: default KID not injected
on: default KID always injected
* auto: default KID only injected if no key roll is detected (as per DASH-IF guidelines)
tpl_force (bool, default: false): use template string as is without trying to add extension or solve conflicts in names