Deployed 1a8e633 with MkDocs version: 1.6.1

This commit is contained in:
2026-10-18 23:18:36 +00:00
parent 04749fd1aa
commit 85b45b1f4f
5 changed files with 279 additions and 9 deletions
+2 -1
View File
@@ -3230,7 +3230,8 @@ all of this in <a href="../../guide/drm-and-cdm/">DRM and CDM</a> and
the API surface.</p>
<h3 id="dolby-vision-and-hybrid">Dolby Vision and hybrid<a class="headerlink" href="#dolby-vision-and-hybrid" title="Permanent link">&para;</a></h3>
<p>Two DV mechanisms sit on top of the track model. <strong>DV fixup</strong> re-exposes DV signalling on
HLS streams that carry a valid DV RPU but advertise plain HEVC (<code>dv_compatible_bitstream</code>).
HLS and DASH streams that carry a valid DV RPU but advertise plain HEVC, with DV only in the
supplemental codecs (<code>dv_compatible_bitstream</code>). <code>--list</code> shows such a track as <code>HDR10+DV</code> or <code>HDR10P+DV</code>.
<strong>Hybrid</strong> processing (<code>Video.Range.HYBRID</code>) selects an HDR10(+) base and a DV donor,
extracts the RPU with <code>dovi_tool</code>, and injects it onto the base layer, to make a single
track that carries both HDR10 metadata and the DV RPU. Both are automatic once the
+39 -4
View File
@@ -3297,6 +3297,40 @@ either enum <strong>names</strong> or their <strong>values</strong>, comma-separ
</table>
<div class="language-shell highlight"><span class="filename">Grab HDR10 and Dolby Vision in one run</span><pre><span></span><code><span id="__span-7-1"><a id="__codelineno-7-1" name="__codelineno-7-1" href="#__codelineno-7-1"></a>unshackle<span class="w"> </span>dl<span class="w"> </span>-q<span class="w"> </span><span class="m">2160</span><span class="w"> </span>-r<span class="w"> </span>HDR10,DV<span class="w"> </span>EXAMPLE<span class="w"> </span><span class="s1">'...'</span>
</span></code></pre></div>
<p><code>--list</code> labels a track that carries a second format as <code>&lt;range&gt;+&lt;format&gt;</code>:</p>
<ul>
<li>The first part is the range that <code>-r</code> selects the track by.</li>
<li>The second part is the format that the track also carries.</li>
<li>The <code>+</code> only joins the two parts. unshackle writes HDR10+ as <code>HDR10P</code>, so <code>HDR10+DV</code> is HDR10 with
Dolby Vision, not HDR10+ with Dolby Vision.</li>
</ul>
<table>
<thead>
<tr>
<th>Label</th>
<th>Track</th>
<th>Selected by</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>DV+HDR10P</code></td>
<td>A Dolby Vision track that also carries HDR10+</td>
<td><code>-r DV</code></td>
</tr>
<tr>
<td><code>HDR10+DV</code></td>
<td>An HDR10 track whose frames also carry a Dolby Vision profile 8 RPU</td>
<td><code>-r HDR10</code></td>
</tr>
<tr>
<td><code>HDR10P+DV</code></td>
<td>An HDR10+ track whose frames also carry a Dolby Vision profile 8 RPU</td>
<td><code>-r HDR10P</code></td>
</tr>
</tbody>
</table>
<p>The output file of a track with a Dolby Vision profile 8 RPU plays as Dolby Vision on a DV screen.</p>
<div class="admonition warning">
<p class="admonition-title">HYBRID requires dovi_tool</p>
<p><code>-r HYBRID</code> makes a single hybrid track by injecting the Dolby Vision RPU
@@ -3309,10 +3343,11 @@ HEVC; a title whose HDR10/HDR10+ tracks are all in another codec fails before it
If the hybrid step fails for one resolution, unshackle logs an error, skips that resolution
and goes on with the other resolutions of the title. When no hybrid file at all was made,
the title fails.</p>
<p>A DV track that carries HDR10+ (<code>DV+HDR10P</code> in <code>--list</code>) is already a hybrid. At a resolution
that has one, <code>-r HYBRID</code> selects the DV+HDR10P track with the highest bitrate (the lowest with
<code>--worst</code>) and muxes it as it is, with no base track and no dovi_tool step. The other
resolutions get a hybrid that unshackle makes.</p>
<p>A track that is <code>DV+HDR10P</code>, <code>HDR10+DV</code> or <code>HDR10P+DV</code> in <code>--list</code> already carries Dolby Vision and an HDR10
or HDR10+ base, so it is already a hybrid. At a resolution that has one, <code>-r HYBRID</code> selects it
and muxes it as it is, with no base track and no dovi_tool step. A track that carries HDR10+
comes first, then the highest bitrate (the lowest with <code>--worst</code>). The other resolutions get a
hybrid that unshackle makes.</p>
<p>To keep an HDR10+ deliverable <em>alongside</em> the hybrid, request both ranges:
<code>-r HYBRID,HDR10P</code>. <code>-r HYBRID</code> on its own muxes only the merged hybrid.</p>
</div>
BIN
View File
Binary file not shown.
+237 -3
View File
@@ -2911,6 +2911,28 @@
<nav class="md-nav" aria-label=" Video">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;carries_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.finished_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;finished_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.range_label" class="md-nav__link">
<span class="md-ellipsis">
@@ -2948,6 +2970,39 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.dv_fourccs" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dv_fourccs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.has_dv_codec" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_dv_codec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.is_dv_composite" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;is_dv_composite
</span>
</a>
</li>
<li class="md-nav__item">
@@ -4164,6 +4219,28 @@
<nav class="md-nav" aria-label=" Video">
<ul class="md-nav__list">
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;carries_hdr10plus
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.finished_hybrid" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-attribute"></code>&nbsp;finished_hybrid
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.range_label" class="md-nav__link">
<span class="md-ellipsis">
@@ -4201,6 +4278,39 @@
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.dv_fourccs" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;dv_fourccs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.has_dv_codec" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;has_dv_codec
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#unshackle.core.tracks.Video.is_dv_composite" class="md-nav__link">
<span class="md-ellipsis">
<code class="doc-symbol doc-symbol-toc doc-symbol-method"></code>&nbsp;is_dv_composite
</span>
</a>
</li>
<li class="md-nav__item">
@@ -7813,13 +7923,17 @@ A <code>native_hybrid</code> track is the hybrid itself, so it stays unflagged t
<a href="#unshackle.core.tracks.Tracks.select_hybrid" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">select_hybrid</span><span class="p">(</span><span class="n">tracks</span><span class="p">,</span> <span class="n">quality</span><span class="p">,</span> <span class="n">worst</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">select_hybrid</span><span class="p">(</span>
</span><span id="__span-0-2"><a id="__codelineno-0-2" name="__codelineno-0-2" href="#__codelineno-0-2"></a> <span class="n">tracks</span><span class="p">,</span> <span class="n">quality</span><span class="p">,</span> <span class="n">worst</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">generate_dv</span><span class="o">=</span><span class="kc">False</span>
</span><span id="__span-0-3"><a id="__codelineno-0-3" name="__codelineno-0-3" href="#__codelineno-0-3"></a><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>A filter for the hybrid ingredients of each resolution. It sets <code>native_hybrid</code> on every track.</p>
<p>A DV track that carries HDR10+ is already a hybrid, so its resolution takes that track and no base.</p>
<p>A track that already carries DV and an HDR10 or HDR10+ base (DV+HDR10P, HDR10+DV, HDR10P+DV) is a finished
hybrid, so its resolution takes that track and no base. One that carries HDR10+ comes first. The other
resolutions get a base only when a DV track can give it an RPU, or with <code>generate_dv</code>.</p>
</div>
@@ -8208,6 +8322,54 @@ skip some checks or assume a value. Give as much information as possible.</p>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Video.carries_hdr10plus" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">carries_hdr10plus</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Video.carries_hdr10plus" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">carries_hdr10plus</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether the track carries HDR10+, as its range or, on a DV track, found by the HDR10+ probe.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
<h3 id="unshackle.core.tracks.Video.finished_hybrid" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-attribute"></code> <span class="doc doc-object-name doc-attribute-name">finished_hybrid</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-property"><code>property</code></small>
</span>
<a href="#unshackle.core.tracks.Video.finished_hybrid" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="n">finished_hybrid</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether the track already carries DV and an HDR10 or HDR10+ base, so <code>-r HYBRID</code> needs no build.</p>
</div>
</div>
<div class="doc doc-object doc-attribute">
@@ -8226,7 +8388,7 @@ skip some checks or assume a value. Give as much information as possible.</p>
<div class="doc doc-contents ">
<p>The range name, with <code>+HDR10P</code> on a DV track that also carries HDR10+.</p>
<p>The range that <code>-r</code> selects the track by, then any second format it carries: HDR10+DV, DV+HDR10P.</p>
</div>
@@ -8324,6 +8486,78 @@ FFmpeg's AVColorPrimaries/AVColorTransferCharacteristic enums.</p>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.dv_fourccs" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">dv_fourccs</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.dv_fourccs" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">dv_fourccs</span><span class="p">(</span><span class="n">codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>The Dolby Vision fourccs in a codecs list (comma or space separated, <code>/brand</code> suffixes allowed).</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.has_dv_codec" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">has_dv_codec</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.has_dv_codec" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">has_dv_codec</span><span class="p">(</span><span class="n">codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether a codecs list names a Dolby Vision codec.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.is_dv_composite" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">is_dv_composite</span>
<span class="doc doc-labels">
<small class="doc doc-label doc-label-staticmethod"><code>staticmethod</code></small>
</span>
<a href="#unshackle.core.tracks.Video.is_dv_composite" class="headerlink" title="Permanent link">&para;</a></h3>
<div class="language-python doc-signature highlight"><pre><span></span><code><span id="__span-0-1"><a id="__codelineno-0-1" name="__codelineno-0-1" href="#__codelineno-0-1"></a><span class="nf">is_dv_composite</span><span class="p">(</span><span class="n">codec</span><span class="p">,</span> <span class="n">codecs</span><span class="p">,</span> <span class="n">supplemental_codecs</span><span class="p">)</span>
</span></code></pre></div>
<div class="doc doc-contents ">
<p>Whether an HEVC track names DV only in its supplemental codecs: DV profile 8 on an HDR10, SDR or HLG base.</p>
</div>
</div>
<div class="doc doc-object doc-function">
<h3 id="unshackle.core.tracks.Video.change_color_range" class="doc doc-heading">
<code class="doc-symbol doc-symbol-heading doc-symbol-method"></code> <span class="doc doc-object-name doc-function-name">change_color_range</span>
File diff suppressed because one or more lines are too long