Repository navigation
VS10 Output Modes
Dolby Vision-capable Amlogic chips contain Dolby's VS10 engine, which can
convert the decoded picture before it leaves the box: SDR up to HDR10 or Dolby
Vision, HDR10 down to SDR or up to Dolby Vision, Dolby Vision down to SDR.
TinyPPI offers these conversions for the playing title through the VS10
dialog, through direct run_mode commands, and from the
web dashboard.

- Opening the dialog
- Which modes are offered
- Dialog layouts
- Position and colors
- Direct switching with run_mode
- How a switch is applied
- Reading the log
-
RunScript(script.tinyppi,dialog)from a key, or -
NotifyAll(script.tinyppi,open_dialog)(fastest), or - Settings → General → Launch mode → VS10 dialog, so the normal TinyPPI key opens the dialog instead of the overlay.
The dialog has the same requirements as the overlay: CoreELEC 22+, fullscreen video, something playing. Pressing the key again closes it.
| Key | Action |
|---|---|
| Up / Down (or Left / Right in the bar) | Move between the buttons |
| Left / Right (single-button layout) | Step to the previous / next choice (wraps around) |
| OK | Apply the mode on the focused button, or open the overlay from Player process info |
| Back, Esc, Stop | Close the dialog without switching |
The chosen mode is applied after the dialog has closed and the video window has settled (250 ms), because Kodi drops actions sent while a dialog is closing.
The first button is always Player process info, which opens the TinyPPI overlay. The other buttons depend on the source:
| Source | Buttons | Mode applied |
|---|---|---|
| SDR | Original · SDR → HDR10 · SDR → Dolby Vision |
original_sdr · hdr10 · dv
|
| HDR10 | HDR10 (Original) · HDR10 → SDR · HDR10 → Dolby Vision |
original_hdr · sdr8 · dv
|
| Dolby Vision | Dolby Vision (Original) · Dolby Vision → SDR |
original_dv · sdr8
|
| HDR10+ | (none — Player process info only) | — |
| HLG | (none — Player process info only) | — |
| Dolby Vision + HDR10+ hybrid | (none — Player process info only) | — |
Why some sources have no modes:
- HDR10+ and HLG are not VS10 inputs; the driver has no mode group for either.
- A Dolby Vision grade that also carries an HDR10+ (ST 2094-40) payload reads as Dolby Vision, but the driver does not take a VS10 mode while the HDR10+ payload rides along. Rather than offer a switch that does nothing, the dialog and the dashboard offer none. (A stream whose HDR10+ Kodi has stripped for a display without HDR10+ support keeps its modes — what was removed is no longer in what the decoder sees.)
The dialog keeps re-detecting the source twice a second while it is open. If the detection finishes after the dialog appeared, the buttons change in place, and the panel keeps its size so nothing jumps.
Pick one under Settings → VS10 dialog → Layout → Dialog layout:
| Layout | Panel size | What it looks like |
|---|---|---|
| Single button (default) | 700 × 216 | One button showing the current choice; Left/Right step through the choices. Made for remotes that have little more than a direction pad and OK. |
| Bar | 1702 × 206 | The choices side by side in a low, wide panel that leaves most of the picture visible. |
| Dialog | 471 × 546 | The original layout: the choices stacked in a tall panel. |
All three draw the same choices for the same source.
Settings → VS10 dialog → Dialog position:
| Setting | Default | Range |
|---|---|---|
| Vertical position | 100 % (resting on the bottom margin) | 0 % = top margin … 100 % = bottom margin |
| Horizontal position | 50 % (centred) | 0 % = left margin … 100 % = right margin |
Every layout keeps a 50 px margin to the screen edge. The panel is hidden until it has been placed, so it never jumps into position.
Colors (each with its own opacity): global background, background, header title, header icon, separator line, Button text (unfocused buttons), Selection (focused button background) and Selection text (focused button text, black by default). See Colors and Themes.
run_mode applies a mode immediately, without opening any window — ideal for
keymaps and automation:
RunScript(script.tinyppi,run_mode,<mode>)
| Mode | Output | Notes |
|---|---|---|
original_sdr |
Source passed through (VS10 bypass) | For SDR sources. |
original_hdr |
HDR10 | HDR10 passthrough. |
original_dv |
Dolby Vision | Alias of dv. |
original_hlg |
VS10 off | Restores follow source with Dolby Vision disabled — the state Kodi leaves for HLG. Not offered in the dialog; useful to clear a leftover mode. |
dv |
Dolby Vision | Player-LED boxes get IPT, TV-LED boxes tunnelled IPT (see below). |
hdr10 |
HDR10 | |
sdr10 |
SDR, 10-bit | |
sdr8 |
SDR, 8-bit | What the dialog's → SDR buttons use. |
run_mode applies a mode even where the dialog offers none (for example on a
Dolby Vision + HDR10+ hybrid). It then logs a warning that the driver may not
take it.
Newer CoreELEC builds contain native vs10.* actions (vs10.original,
vs10.dv, vs10.hdr10, vs10.sdr). TinyPPI detects them once per session by
asking Kodi for the setting coreelec.amlogic.dolbyvision.vs10.dv, which
arrived together with them.
When they exist and a video plays, TinyPPI sends the action and watches the Dolby Vision driver for up to 500 ms. If the driver state changed, the switch is done. If it did not — or no video plays — TinyPPI falls back to its own path.
sdr8 has no native action (vs10.sdr always means 10-bit SDR), so it always
takes TinyPPI's own path, which keeps 8-bit and 10-bit SDR distinct.
TinyPPI writes the same Amlogic Dolby Vision driver nodes CoreELEC's Kodi writes when it opens or closes a decoder:
| Node | Role |
|---|---|
/sys/module/aml_media/parameters/dolby_vision_enable |
Y / N — Dolby Vision core on or off |
/sys/module/aml_media/parameters/dolby_vision_policy |
1 follow source, 2 force output |
/sys/class/amdolby_vision/dv_mode |
The output mode to force (see below) |
/sys/module/aml_media/parameters/dolby_vision_ll_policy |
Low-latency policy: 0 for tunnelled IPT (TV-LED), 1 for IPT (Player-LED) |
/sys/module/aml_media/parameters/dolby_vision_mode |
Read only: the output the driver is actually sending |
/sys/module/aml_media/parameters/dolby_vision_status |
Read only: whether the core is still running |
dv_mode values: 0 bypass · 1 Dolby Vision IPT (Player-LED) · 2 Dolby
Vision tunnelled IPT (TV-LED) · 3 HDR10 · 4 SDR10 · 5 SDR8.
The order of the writes matters: Dolby Vision is enabled before the policy
forces an output; for bypass the policy goes back to follow source, the core
is allowed to stop, and only then is Dolby Vision disabled. Writing
enable=N into a live core left the display half-switched.
For a Dolby Vision output TinyPPI reads Kodi's
coreelec.amlogic.dolbyvisionled setting (0 = TV-LED, 1 = Player-LED) and
picks tunnelled IPT or plain IPT accordingly, setting the matching low-latency
policy. If the setting cannot be read, the driver's current low-latency policy
is used; failing that, TV-LED (CoreELEC's default).
The driver cannot move directly between an HDR10 and a Dolby Vision output. When such a switch is requested during playback, TinyPPI makes two complete switches — first to SDR10, then, once the Dolby Vision core is down and after a 250 ms pause, to the requested mode — exactly as if you had pressed SDR and then the mode by hand. A staged switch is bounded at 15 s.
Kodi only re-negotiates the HDMI output when the stream's own HDR type changes.
A VS10 switch during playback bypasses that, so the TV would stay on the old
format with wrong colors (most visibly in Player-LED mode). After a switch
TinyPPI waits for the driver to confirm the new output and then sets the
Amlogic UPDATE property on the HDMI connector through DRM — the same step
Kodi uses to re-apply the current mode.
- Switches made through sysfs always get the reset.
- Switches made through native actions get it only when they cross the Dolby Vision line (the actions handle the rest themselves).
- The reset needs CoreELEC 22's kernel (5.15); elsewhere it is a harmless no-op, and the switch itself never fails because of it.
A switch requested from the web dashboard takes exactly the
same path as run_mode. A switch takes a few seconds; taps that arrive in the
meantime are not queued up — the last one wins, so three quick taps end in the
mode tapped last rather than three switches in a row.
Every switch is logged (see Troubleshooting). Typical lines:
TinyPPI: native VS10 Actions available -> preferred during playback, with sysfs fallback if they don't take effect
TinyPPI: mode 'dv' set via VS10 Actions -> Action(vs10.dv)
TinyPPI: 'sdr8' has no native VS10 action -> using built-in TinyPPI VS10 (sysfs) to keep the exact output
TinyPPI: /sys/class/amdolby_vision/dv_mode = 5
TinyPPI: mode 'sdr8' set via built-in TinyPPI VS10 (sysfs)
TinyPPI: 'dv' cannot be reached from the output now on the wire in one switch -> going through SDR first
Warning signs:
| Line | Meaning |
|---|---|
FAILED /sys/...: [Errno …] and mode '…' NOT set via built-in TinyPPI VS10 (sysfs)
|
The driver node was not writable — usually not an Amlogic Dolby Vision box, or an unsupported kernel. |
VS10 Action(…) had no effect on the DV driver -> falling back … |
The native action did nothing; the sysfs path was used instead. |
'…' did not move the driver's output mode -> no display reset |
The driver did not confirm the change within 1 s. |
'…' is being applied to a Dolby Vision title that also carries HDR10+ … |
A run_mode on a hybrid grade; the output may not change. |
User guide
- Installation
- Getting Started
- Launching and Keymaps
- The TinyPPI Overlay
- Dolby Vision Metadata View
- VS10 Output Modes
- Codec Logos
- Channel Layout Graphic
- IMAX Detection
- Colors and Themes
Web dashboard
Reference
Developers
Project