[EXPERIMENTAL] CoreELEC 22 · samurihl DV build (20260908213005)
Pre-release⚠️ EXPERIMENTAL · UNSUPPORTED · USE AT YOUR OWN RISK
This is an unofficial, experimental CoreELEC 22 build. It is NOT an official
CoreELEC release and it is NOT a supported CE22 port. I am not a CoreELEC 22
port maintainer, and I will not be providing support, bug fixes, updates, or
ongoing maintenance for this build.
The only purpose of this build is to give Amlogic AM9 Pro-class users a more
complete Dolby Vision experience than stock CoreELEC 22, by carrying a set of
custom Kodi features I built for my own device. That is the entire scope.
READ THIS BEFORE YOU FLASH ANYTHING
- USE ENTIRELY AT YOUR OWN RISK. There is no warranty of any kind, express
or implied. It may fail to boot, misbehave, break Dolby Vision, or do nothing
useful on your hardware. - BACK UP YOUR CURRENT INSTALLATION FIRST. Take a full CoreELEC backup
(Settings → CoreELEC → Backup) and/or image your existing boot media before
you install anything from here. Assume you may have to restore it. - Prefer a SEPARATE SD card or USB stick you can boot from, instead of
overwriting a working internal (eMMC) install. - Do NOT report problems with this build to the CoreELEC team or forums.
This is not their build; it is not their responsibility. Do not ask them to
support it. - I am also not offering support. If it breaks, you keep both pieces.
By downloading or using any file in this release you accept all of the above.
Install
- Clean install (recommended): flash the
*.img.gzto an SD card or USB with
balenaEtcher (or the Amlogic USB Burning Tool for eMMC), then boot from it. - In-place update: copy the
*.tarto the/storage/.updatefolder on an
existing CoreELEC install and reboot. (Back up first — see above.) - Verify your download against the SHA256 sums below before flashing.
What's changed in this update
This is an incremental update to
v22.0-samurihl-20260906094636
(see that release and its predecessors for the standing feature set: Blu‑ray disc
menus, HDR10+ → Dolby Vision conversion, DV → HDR10 that stays in HDR10, FEL
profile‑7 reconstruction on non‑DV displays, VS10 output on non‑DV displays, VSVDB
override, tone‑mapping target controls, disc‑stated menu detection and episode
lists).
⚠️ Still experimental and completely unsupported — see the disclaimer above.
Back up your current install before flashing.Dolby Vision still requires
dovi.ko(the CE22 5.15 build) installed on your
device — it is not bundled; install it yourself exactly as on stock CoreELEC 22,
unmodified.
🙏 Credit where it is due: avdvplus
A large part of this release exists because of avdvplus — a separate developer's
Dolby Vision build, on CoreELEC 21 / Amlogic‑ng (arm). That is a different project on
a different branch, kernel and architecture from this one, and none of this is their
release or their responsibility. But their R10 series was read end to end against this
fork in September, and it moved this build forward in three distinct ways that are
worth separating honestly:
Code ported from avdvplus R10. These are theirs, adapted to this fork's structure:
- the decoder starvation bypass that dequeues a stranded picture when the fill gate
never opens (theirm_starve_bypass/m_no_data_since_reset) - letting a flush interrupt an in‑progress codec write instead of waiting it out
- not reporting a failed codec write as a consumed packet (their
m_wrFailActive
block, adapted to this fork's write loop) - buffered ISO reads, so a network dip cannot starve playback from a NAS
- padding tiny Dolby Vision FEL access units so they reach the decoder (from R9/R10)
Their review findings, implemented here. Problems and capabilities identified in
their code that this fork did not have, written independently for this codebase: an
HDR‑format preference when a file offers both DV and HDR10+, stopping rather than
hanging on an undecodable source, trusting the HEVC SPS over a mislabelled container
tag, honouring the declared NAL length when merging base and enhancement layers,
several audio‑engine thread‑safety fixes, the AES3 channel‑status description, the
kernel boot‑hint mode fix, and a handful of smaller correctness fixes.
Defects found here because their code was being read. Roughly a dozen fixes in
this release — unsigned timestamp arithmetic, clock state locking, overlay container
locking, NAL bounds, DTS header validation, audio channel mapping, steady‑clock
timing — were found in this fork by comparing it against theirs. They are this
fork's own fixes to this fork's own bugs, but they would not have been found without
avdvplus to read.
If you run an Amlogic‑ng box on CoreELEC 21, go and look at their build. It is not
this one, and for that hardware it is the more travelled road.
🎬 Blu‑ray seamless branching now actually plays
This is the headline fix. On discs authored with seamless branching — where the
film is stored as several clips the player joins on the fly — every join produced a
visible fault: a multi‑second freeze, macroblock corruption, and an audio dropout a
moment later. It happened at the same points in the film every time.
It turned out to be two separate defects at the same place.
The keyframe was being cut in half. A Blu‑ray signals a branch by stopping the
read until the player acknowledges it. Stopping the read looks like end‑of‑file to
the demuxer, which responds by flushing whatever half‑assembled picture it is holding
and discarding the rest of it. The picture it was holding is the incoming clip's
first keyframe — the one every following picture is predicted from — because the disc
library hands over the new clip's opening bytes before it reports the branch. The
decoder was therefore given a fragment of a keyframe (2,702 bytes of a ~500 KB
picture), lost the bitstream, and failed on the broken reference for the rest of the
group of pictures. Suppressing the decoder's error flagging showed the same broken
pictures instead of dropping them — the freeze and the corruption were one fault
wearing two faces.
The fix is to stop interrupting a stream that is meant to be continuous: the player
now glides across a seamless join without halting the read, and picks the boundary up
as a signal rather than as a fake end‑of‑file. This is gated to joins the disc itself
declares seamless (connection condition 5/6); non‑seamless chains — menu stubs,
chapter glue — keep the previous handling, which they need.
The clocks of two clips do not line up. Each clip on a Blu‑ray is timed
independently, so the incoming clip rarely resumes exactly where the outgoing one
stopped. Reading the disc's own playlist, the joins alternate: −0.159s, +0.332s,
−0.430s, +0.291s, and so on. A negative step is an overlap and nobody sees it. A
positive step is dead air — the player was sitting through a third of a second of
clock that contains no content. That is a brief freeze, and because the audio
bitstream stops with it, long enough for a receiver to drop lock on TrueHD, which is
why the "audio dropout" always arrived alongside it and always sounded longer than it
was. Nothing was missing from the disc; a branch is a cut, and the player now closes
the step instead of waiting it out.
Six or so joins through a typical branched film were affected, the earlier ones most
visibly. Both defects are fixed and confirmed on hardware.
🔊 Audio
- DTS‑HD MA passthrough no longer overruns its buffer. The IEC 61937 burst buffer
was 4 KB smaller than the largest burst the standard defines, and DTS‑HD MA at
48 kHz lands exactly on that largest size. Previous releases wrote past the end of
the buffer on every such frame. It is now sized correctly. (Both the bounds check that
caught this and the sizing fix are in this release, so no build ever shipped with
the check but not the fix — DTS‑HD MA passthrough has been verified working on
hardware.) - Several audio‑engine thread‑safety fixes: shared timestamp and buffering state now
synchronised, the sink info list guarded against concurrent enumeration, and the
audio settings singleton no longer left dangling at shutdown. - Top‑back speakers map to their own channels instead of being folded onto the back
pair. - A malformed DTS header with an unknown channel mode is rejected rather than used.
💿 Disc and playback robustness
- ISO playback over the network reads through a cache, so a momentary dip no longer
starves the player. Two faults in that cache are fixed here: it was fetching its
read‑ahead window backwards (starting 32 MB ahead while the player waited on the
very next page), and it kept stale read‑ahead queued across a seek or chapter skip.
Both made seeking on a NAS worse than no cache at all. - A decoder that parks with a full buffer, a stream player thread that dies, and a
source that cannot be decoded at all are now all noticed and handled rather than
hung on. - A logging race that could silently kill the audio thread — and which was triggered
by turning on debug logging — is fixed.
🎥 3D Blu‑ray discs that hang on a black screen — new setting to get past it
Some BD 3D discs ask what the display can do before deciding what to play, and
refuse one that answers no. Frozen 3D routes the title to a dead‑end playlist — one
item, one frame, a still held forever — with no path onward: black screen, no menu,
no picture, no sound, indefinitely. Sixteen playlists on that disc share the shape,
one dead end per language.
Player → Discs → "Simulate 3D display" answers yes. The disc then runs its normal
route and the film plays as ordinary 2D, because only the base view is presented.
Confirmed on the disc, on a display that cannot show 3D.
It is off by default, and you have to turn it on to get this. It is off because it
tells the disc something about your display that is not true, and because one disc is
thin evidence for changing the default for everybody — that is worth revisiting once
more 3D discs have been through it.
It also covers an honest case: a display that genuinely does show 3D but whose
capability is lost in transit through an AV receiver or scaler that rewrites EDID.
The kernel's own 3D capability flag is read‑only, so there was previously no way to
correct that.
Separately and always on, the player now reports its own 3D decoding capability
rather than the display's, which is what that register was always for — a 3D‑capable
player attached to a 2D panel decodes the base view and shows it as 2D. That is a
correctness fix on its own; it is not what gets a parked disc playing. Measured:
correcting it alone still parks Frozen 3D, because these discs branch on the display
registers, which is why every tool that works around this calls the control "simulate
3D display" rather than anything about the player.
No 3D display has been tried. All of this was tested against panels that cannot
show 3D, which is the case it was written for. If your television can do 3D, this
build has never been run in that configuration.
✅ What was tested, and what was not
Tested on an AM9 Pro against a Dolby Vision profile‑7 FEL Blu‑ray (disc and ISO) and
an HDMV menu disc:
- seamless branching, repeatedly, including full runs through both branch points
- disc menus, menu→title transitions, and ISO playback over Wi‑Fi
- DTS‑HD MA passthrough, and TrueHD passthrough
- the enhancement‑layer realignment path in the custom kernel patch, watched for the
full length of a FEL film
and, separately, several 3D Blu‑ray discs against a display that cannot show 3D —
the configuration the 3D fix above was written for.
Not tested: any 3D display. The error‑handling paths — a failed codec write, a
dead decoder, shutdown races — are correct by inspection and independent review but
are not something normal playback exercises.
⚠️ Known and accepted
- A stall long enough to fill the decoder buffer for several seconds can still cause
one access unit to be dropped on its first retry rather than after the intended
grace period. - The menu domain on some discs still logs decoder error flags at segment boundaries.
It is pre‑existing, is not the seamless‑branch fault above, and has not been
investigated.
Source
- CoreELEC (distro):
SamuriHL/CoreELECtagv22.0-samurihl-20260908213005 - Kodi:
SamuriHL/coreelec-xbmctagv22.0-samurihl-20260908213005
Checksums (SHA256)
4db45f68f2127c34e1d00cd3855cebbfb46ea3fbe540b004d14d15c44c9090b7 CoreELEC-Amlogic-no.aarch64-22.0-Piers-samurihl-EXPERIMENTAL_20260908213005.tar
07b98f7da52d696e1d4641a9647a08e42a49f8b161b368722b9fc1bb4c25a61d CoreELEC-Amlogic-no.aarch64-22.0-Piers-samurihl-EXPERIMENTAL_20260908213005-Generic.img.gz