github pannal/CoreELEC T4c
Release T4c

6 hours ago

p3i T4c

T4c is a big one: part stabilization, part new features, on top of T4b, and the most contributor-driven build yet. swmarks rebuilt the CEC and screensaver handling, samtheruby backported the newer CEC kernel driver, fixed SD/VESA display modes and built in-GUI update channels, Sebastiii contributed MKV editions support, an Epson projector profile and DV fixes, and vlix wired the skin's codec logos into the DV pipeline and brought DV profile info to the library. On top of that: VC-1 hardware playback overhauled, a self-healing A/V sync layer for corrupt streams, AC-4 audio decoding, a nasty resume bug, per-frame tone mapping for DV→SDR, and a stack of DV picture fixes.

The headline changes:

  • CEC behaves now. The box no longer powers itself on when the TV or AVR switches inputs, no longer steals the TV's input back after you switch away, reliably puts the TV into standby on power-off, and a stuck CEC bus can no longer freeze the UI.
  • Update channels, built in: the Settings addon now updates the box straight from the p3i release/testing channels, no more manual downloads.
  • Native MKV editions support (opt-in): multi-edition Matroska files prompt for the edition to play.
  • Subtitle auto-selection reworked (upstream): forced, hearing-impaired and closed-caption tracks are picked far more predictably. Closed captions are no longer flagged hearing-impaired by default, with a new setting to restore that.
  • Video screensavers work properly: no more teardown races when playback starts, Dolby Vision engages for them, and the idle/DPMS/shutdown timers keep working while one runs.
  • VC-1 hardware playback, overhauled: the decoder's broken timestamps are repaired by default and the deinterlacer is no longer forced on. Some outliers (mostly ISOs) still misbehave.
  • Corrupt streams can't wreck playback anymore: crash-proof bitstream validation, and when damage still slips through, A/V sync now recovers on its own instead of staying off until a manual seek.
  • AC-4 audio decoding (ATSC 3.0 broadcasts) lands in the system FFmpeg (swmarks).
  • Audio settings apply live mid-playback: downmix and passthrough toggles no longer need a restart, and override.ini can drive them per folder.
  • Fixed resume jumping ~100 seconds ahead shortly after resuming a file.
  • SD content (480/576) is no longer distorted: anamorphic pixel ratios are finally signalled correctly.
  • DV→SDR conversion now uses per-frame metadata (default on): dynamic, per-shot tone mapping with the colorist's SDR trims instead of one static dim curve.
  • Letterboxed DV with subtitles now works out of the box: the L5 active-area handling defaults flipped from "off unless you dig" to sane.
  • Fixed the green/purple picture on SDR titles played after a DV title (#85), the red screen at the end credits of HDR10+→DV converted titles, VS10 crushing near-black (#83), and the black OSD at the start of some DV titles (stuck until the first scene cut).
  • 50/60Hz audio sync corrected by default: the inherited 165 ms film-rate latency no longer applies at 50/60 Hz (toggle off to restore it).
  • An Epson projector (LS12000) DV profile with XML color override (Sebastiii).
  • DV profile and HDR10+ reach the library (vlix): video info now records and shows the real Dolby Vision profile ("7.6 FEL", "8.1", …) and HDR10+ presence.
  • skin.p3i.estuary 8.8.16 and 8.8.17 land in the addon repo (vlix): the VS10 OSD button gated to the hardware decoder, codec-logo overlap fixed and animations added, dynamic OSD icon labels.

Highlights

1. CEC, overhauled

CEC has been a long-running annoyance: phantom wake-ups, stolen inputs, TVs that never got the standby message. T4c attacks it on all three layers (the kernel driver, Kodi, and libcec), with most of the Kodi work by swmarks and the kernel backport by samtheruby.

  • The kernel CEC driver is now a backport of the much newer 5.15 driver (replacing the ancient 4.9 one), with two CoreELEC-specific gates restored on top: the wake-configuration is seeded from the bootloader again instead of "everything on" (this is the fix for the box powering itself on whenever the TV or AVR switched inputs), and the suspend/poweroff mailbox stall (a 10-second hang on some bootloaders) is gated off again.
  • No more input stealing. After you switched the TV to another device, libcec would answer the TV's "who's active?" broadcast ~30 seconds later and yank the input back to the box. Fixed in libcec (the box marks itself inactive on a routing change to an external device).
  • No more waking the TV it just watched go to standby. With an AVR in the chain and "stop playback on TV standby" enabled, the AVR's routing re-announcement ~1.5s after TV standby triggered a full one-touch-play that turned the TV back on. libcec now skips the activation while the TV is in (or heading into) standby.
  • Standby handling is reliable now: the standby command is honored no matter which CEC device sends it (not just the TV), the CEC thread is joined synchronously on power-off so the TV is guaranteed to receive standby before the box dies, and toggling the CEC adapter off no longer fires a stray standby at the TV.
  • A stuck CEC bus can't freeze Kodi anymore. Blocking active-source queries were moved off the main thread and out of critical sections; keypresses now just flag the background CEC thread instead of querying the bus inline.
  • Wake-by-keypress grew into "activate on activity" (on by default), the box's active-source state survives adapter reconnects via a flag file, the phantom "all wake functions on" default that poisoned the GUI toggles is gone (SamuriHL), and peripheral settings finally display in their intended order (a tinyxml2 parsing bug).
  • Waking the chain after the box sent standby works again. When the box put devices into standby, libcec kept believing it was still the active source; that stale flag then swallowed every deliberate wake (the wake toggle just picked "standby" again). The box now marks itself inactive alongside the standby broadcast.
  • Addons can finally see CEC events. The TV going into standby and active-source changes are now announced to addons (Other.OnTVStandby, Other.OnCECSourceActivated/Deactivated), so an addon that queues episodes, like PM4K's post-play, can stop auto-playing to a dark panel.
  • Standby sticks, and waking works from anywhere. A second round of fixes closes the remaining races: putting the chain into standby no longer wakes the TV right back up (remote-button noise and AVR routing echoes within a 5-second cooldown are swallowed), turning the TV off with its own remote no longer leaves the box thinking it's still the active source (so Kore or any JSON-RPC app can wake the TV later), and a new "When manual CEC standby is triggered" setting spells out what a mapped standby button should do.
  • Input switching plays nice with screensavers. With a screensaver active, the TV switching away no longer triggers the pause/stop handling that used to dismiss the screensaver and instantly steal the input back. The TV goes to sleep cleanly, and resuming playback from a remote app re-activates the source as expected.
  • A third round tightened the state machine further: explicit standby works on a fresh boot (it used to silently fail before libcec established the active source), a race between an explicit standby and screensaver wake could permanently deadlock all CEC input handling until restart, and several callback deadlocks are gone. Displays that reject repeated Image-View-On (some Hisense models) are now woken via the Power-On key as a fallback, so wake attempts after the first actually work.

2. Update channels, built into the box

Until now, updating a p3i box meant downloading a tar by hand and dropping it into the update folder. samtheruby rebuilt the Settings addon's update module around p3i's own infrastructure: it now serves three channels directly: Release (the GitHub releases), Testing, and Internal (password-gated). Update announcements ship on, automatic updates ship off, so nothing installs behind your back; you pick the channel and the box fetches the build itself. It ships with the T4c image, so this is the last release you install by hand.

3. Video screensavers work properly

If you run a video screensaver (Aerial-style), this whole cluster is for you; all of it is swmarks' work:

  • Clean teardown, no races. Starting playback while a video screensaver runs used to race its teardown: hardware decoders freed at the wrong moment, deadlocks, or the incoming video failing to start. The teardown is now intercepted and sequenced properly: the player closes safely on the main thread, and the new video starts the moment the screensaver script exits.
  • Dolby Vision engages during video screensavers. The "Skip DV for windowed playback" setting (meant for skin trailer previews) no longer blocks DV for screensavers, which play windowed.
  • The box can actually sleep again. Video screensaver playback no longer resets the idle timer or inhibits DPMS and idle shutdown, so display-off and auto-shutdown work while a screensaver runs.
  • A modal dialog no longer breaks screensavers permanently: the Dim screensaver is enforced over modal dialogs instead of letting a Python video screensaver spin forever waiting for a window it can never get.

4. Playback fixes

  • Resume no longer jumps ~100 seconds ahead. On a hard decoder-write failure (a codec reset racing a display-mode switch), packets were silently reported as consumed (one dropped every ~2ms, adding up to ~100 seconds of discarded stream), and playback then visibly leapt forward shortly after a resume. Failed writes now requeue the packet with no data loss, escalate to a decoder reset if the failure persists, and only degrade to dropping after 2 seconds.
  • An fps change that moves screen geometry now does a full reconfigure (samtheruby). Runtime fps re-detection could switch the whitelist pick to a mode with different dimensions (e.g. 1080p GUI → anamorphic 576p50) on the fast path, leaving a squashed picture and broken sync until stop.
  • The vsync clock-sync state is cleared on fps-only mode changes (samtheruby), so A/V corrections right after a refresh switch are no longer computed against the old frame rate.
  • Files that lie about their frame rate no longer force a mid-play mode switch. mkvmerge often writes millisecond-rounded frame durations (42 ms = 23.810 fps for real 23.976 content); the bogus rate missed the resolution whitelist at start, and ~7 seconds in the measured real rate forced an HDMI mode switch: black screen, audio sink reopen, AVR re-lock. The demuxer now recognises exactly that fingerprint and snaps to the standard rate up front (upstreamed as xbmc/xbmc#28836). For the setups whose AVR latches lip-sync during the settling start, such files also get an automatic one-time audio re-sync.
  • Dialogue no longer runs late by a random amount per start. The audio labeling anchor was set from a sink-delay reading taken during start/seek churn, which can be tens of milliseconds off; the error then became a real, audible A/V offset that measured as zero and re-rolled differently on every start, seek and unpause. Mis-measured anchors are now corrected on the labels, not the master clock, and the trim waits for the measurement to settle.
  • No more correction hunting on UHD files. A quantized clock correction could land just past the opposite edge of the sync deadband, tip back over on measurement noise, and oscillate for the whole playback, visible as periodic frame skips and audio dropouts. Corrections now carry hysteresis, and the clock is no longer stepped for a re-seek that is about to happen anyway.
  • Switching audio or subtitle tracks in Blu-ray menu mode works now. In HDMV/BD-J navigation, libbluray picks the streams itself, so Kodi's track switch had no effect (most visibly for sub-path streams). The selection is now forwarded to libbluray.
  • Image subtitles no longer wash out the picture in limited range (upstream xbmc/xbmc#22383): the GLES limited-range conversion added its black-level offset even on fully transparent pixels of PGS/VobSub/DVD overlays, brightening the whole overlay rectangle.
  • InputStream addons can deliver ASS subtitles again: multi-kilobyte subtitle headers were silently discarded by a 4-byte PVR-era filter, so styled subs from inputstream addons failed to initialize.
  • Subtitle auto-selection is reworked (upstream PR 25813, ported by nissel). The old selection predicate mixed forced, default and language rules in an order nobody could reason about; the rewrite makes the priority explicit and fixes the cases where a forced or hearing-impaired track was picked over the one you asked for. One behaviour change worth knowing: closed captions used to be hard-flagged as hearing-impaired, which is why they often got selected automatically. They are not any more, and the new Set CC subtitles only for the hearing impaired setting (Player, Language) restores the old behaviour if you relied on it.
  • The debug OSD no longer resets a manually moved subtitle position (long-standing upstream quirk: opening ctrl+shift+o snapped subtitles back to default).
  • Smaller hardening: opening a folder-structured DVD/Blu-ray over NFS no longer misbehaves (directories were opened as files), a corrupt or family-name-less custom font can no longer hang Kodi at the splash screen, and a peripherals race condition was locked down.

5. SD and VESA display modes output correctly

  • 480/576 content was distorted, always. The display pipeline signalled square pixels for SD modes, but CEA-861 defines those 720-wide rasters as anamorphic (4:3 or 16:9). The result: 16:9 SD content letterboxed into ~403 of 576 lines and then stretched back out by the display. T4c derives the correct anamorphic pixel ratio per mode (samtheruby). One catch surfaced on upgraded boxes: every settings save on an older build had snapshotted the old square-pixel value as a stored "calibration", which silently overrode the fix on every start; those stale snapshots are now detected and ignored, so the fix works on dirty upgrades too.
  • VESA modes ran at the wrong speed on G12 boxes (samtheruby). Many VESA resolutions had no HPLL clock setting in the kernel, so the PLL stayed at the previous mode's frequency: 640x480p60 actually ran at 88 Hz, and with the vsync-driven reference clock, playback ran up to 1.87× fast. The missing clock settings are ported from the 5.15 vendor tree, with the modes that have no donor recipe there (1920x1200, 2560x1600 and others) hand-derived on top, so the whole VESA table now locks correctly.

6. VC-1 hardware playback, overhauled

VC-1 (older Blu-ray remuxes) over the hardware decoder has been subtly out of sync for as long as this decoder family has existed, and T4c runs the cause to ground: the Amlogic decoder's VC-1 timestamps are garbage (hundreds of reversals per clip, bursts up to nineteen frames off after a stall), while the frames themselves actually arrive in the right order. The avdvplus build had already dealt with this, and its approach is the basis of our fix:

  • The timeline is rebuilt at the stream's nominal rate (avdvplus's approach), on by default: VC-1 holds sync from mid-movie starts, across seeks and pause/resume. A reorder-by-timestamp window was trialled during the cycle and removed after direct A/B testing on four testers' setups: the timestamps are too broken to sort by, so the window scrambled frames that were already in the right order.
  • Interlaced VC-1 is handled too. The decoder's field-cadence output is unusable (slow motion, no audio), so interlaced VC-1 now asks the decoder for frame output and gets the same timeline rebuild with no reordering, which a tester's three-way comparison confirmed by eye.
  • The deinterlacer is no longer forced on. Every VC-1 frame, progressive included, used to be pushed through the full deinterlace pipeline just to be displayable, adding a fixed ~500 ms of video latency. The decoder path now produces directly displayable frames (adopting avdvplus's ge2d approach in the decoder module), and the deinterlace-latency compensation no longer misfires on progressive VC-1 (it used to shift A/V by 500 ms exactly there).
  • Software-decoded VC-1 came out fixed too. Its out-of-sync audio turned out not to be a VC-1 problem at all, but the mis-measured sync anchor described under Playback fixes; the label corrections there cleared it as a side effect.

This is much better, not perfect: a few outliers (mostly ISO rips) still misbehave, and they stay under investigation.

7. Corrupt streams: crash-proof and self-healing

A corrupt download used to be able to crash Kodi or leave A/V sync audibly off until a manual seek, with every internal metric reading clean. T4c hardens both ends:

  • Crash-proof bitstream handling. A corrupt NAL length field could wrap 32-bit pointer arithmetic, pass validation, and crash Kodi mid-play (reported with a damaged H.264 remux). Sizes are now validated against the remaining packet, the way FFmpeg does it, upstreamed as xbmc/xbmc#28845.
  • A/V sync self-recovers after stream damage. Three distinct damage signatures are detected and healed with an automatic re-seek: a broken splice (duplicate I-frame with colliding timestamps; picture a constant few hundred ms late), a wild forward timestamp excursion (a single far-future frame wedging the presentation chain), and a bitstream sync loss (audio comes out physically shorter than its timestamps claim; the AVR is starved for ~85 ms and audio runs late from then on). Recoveries chain with an escalating hop for multi-second corrupt spans, so landing short no longer strands playback out of sync.
  • Passthrough can't "detect" a phantom codec anymore. After a total sync loss, the stream parser would lock onto any plausible syncword inside the garbage: a DTS-HD MA track briefly "becoming" 2-channel E-AC3, tearing the audio sink down twice and parking sync off. Detection is now locked to the track's codec family.

8. Native MKV editions support

Some Matroska files carry multiple editions (theatrical and extended cuts, or a "just the episode" carve-out of a longer file), and Kodi has never been able to select between them; it always played the default edition. Sebastiii added native support: with the new opt-in setting enabled, opening a multi-edition MKV prompts you to pick the edition, and the demuxer plays exactly that cut. It rests on a custom FFmpeg Matroska patch carried in the CoreELEC tree. Off by default because the edition probe opens the file a second time before playback starts; only enable it if your library actually has multi-edition files. A related fix makes chapter skip work correctly in short chapter blocks (the "current chapter" was derived from the demuxer's read-ahead instead of the real playback position, which broke chapter jumps exactly in carved-out editions).

9. Dolby Vision → SDR: per-frame tone mapping

The follow-up to T4b's brightness boost, and the other half of the "DV→SDR looks dim and flat" fix (#59): the inherited pipeline stripped the source's L1/L2 extension metadata before the DV engine converted to SDR, so the whole title got one static tone curve. T4c keeps that metadata ("Use per-frame metadata for SDR conversion", default on): the DV engine now does per-shot dynamic tone mapping using the colorist's own 100-nit trims. Off restores the old static behaviour as an escape hatch.

10. Dolby Vision: letterboxed content and subtitles, sane by default

The L5 active-area machinery built across T4–T4b was all there, but defaulted off, and the pieces didn't arm each other. T4c flips it to working out of the box:

  • New defaults: the L5 master switch, source-L5 forwarding and the OSD gate now default on, and subtitle signaling defaults to "Subtitles on screen". Letterboxed DV titles behave correctly on a fresh setup without touching a single setting.
  • Subtitles on cropped encodes are no longer cut off. Auto-letterbox masked the player-added bars black, including any subtitle pixels rendered into them. Image-based subs on cropped content are now moved into the active area (the mover previously skipped exactly this case), and subs that can't be moved signal L5 so the TV shows the full frame.
  • The TV updates while paused (kernel): flipping the OSD or subtitles on a paused letterboxed title now refreshes L5 immediately instead of waiting for the next play.
  • Skin codec logos count as OSD (vlix): while the skin shows its codec startup logos, L5 stays zeroed so the TV can't crop or dim them in the letterbox bars, and the blunt fallback that used to zero L5 for ~10s on every playback start is skipped for skins that manage this themselves.
  • Cropped encodes with scene-variable L5 now compose correctly. Some cropped encodes carry per-scene L5 offsets in their metadata on top of the player-added padding; the auto-letterbox override could only replace the value, so scenes with taller in-picture bars got clipped to the static geometry. The override channel gained an additive mode: the frame's own L5 and the player padding are summed at the sink, while manual overrides stay absolute. A new video.dovi.l5.auto infolabel exposes the auto-letterbox state to skins.

11. Dolby Vision: picture fixes

  • VS10 no longer crushes near-black (#83). Every VS10 conversion handed the DV engine a hardcoded 0.005-nit target display floor, which crushed PQ output black below 10-bit code ~80 (plainly visible on black-clipping test patterns). The default is now reference black, and a new "VS10 output black level" spinner lets you pick the assumed display minimum (reference black / 0.001 / 0.005 stock / 0.01 nits), applied live while the DV core is active.
  • Green/purple picture on SDR titles after a DV title (#85, kernel): an SDR title whose metadata false-triggered the DV probe played through the previous DV title's leftover metadata: the parser restored stale backups on every parse failure with no stream scoping. The backups are now cleared between sources.
  • Red screen at the end credits of HDR10+→DV converted titles. Some Amazon encodes simply stop authoring HDR10+ metadata for the end credits (The Terminal List: Dark Wolf drops it for the final ~2 minutes). The converter only generated DV metadata for frames that carried HDR10+ data, so the stream lost its per-frame metadata mid-play and a TV-led display dropped out of DV entirely: red screen, "no HDR" on the sink. The converter now holds the last generated metadata across such gaps. (The generated metadata is also clamped so its per-frame peak can't exceed the declared source peak.)
  • The L5 active-area detector no longer double-frees on a cancelled open (a cancel landing during a slow network open corrupted memory on teardown; also fixed a 32 KB leak per detector run).
  • Black OSD at the start of some DV titles (kernel): on titles whose metadata stays constant, the graphics tone curve could latch a stale pre-playback state on the very first frame: the OSD rendered black and stayed black until the first scene cut finally refreshed it. The curve decision now uses the current frame's actual state.
  • The GUI no longer inherits playback OSD brightness (Sebastiii): under DV mode On, the "GUI max luminance in menus" and "DV OSD peak brightness" settings write the same kernel parameter, and the playback value could leak into the menus after stop (or the other way around). The restore paths are untangled.

12. Epson projector support

Sebastiii contributed a unified Epson LS12000 DV profile: selecting the Epson profile now always uses the correct VSVDB calculation, and the color primaries can be overridden via advancedsettings.xml using the full Vertex2 VSVDB hex format; the luminance byte stays dynamically managed by the CoreELEC UI.

13. Dolby Vision profile and HDR10+ in the library

The library now records what kind of HDR a stream really carries (vlix): the Dolby Vision profile with base-layer compatibility and enhancement layer ("5.0", "7.6 FEL", "7.6 MEL", "8.1", "8.4", …) and HDR10+ presence, shown in the video info. Long asked for by collectors keeping FEL and MEL versions apart.

14. Audio

  • 50/60Hz audio sync is corrected by default. This fork inherited a blanket 165 ms audio latency that was calibrated for film rates (23.976/24 Hz); at 50/60 Hz output the display pipeline runs lower-latency, so on some chains that value pushed audio ahead of the picture. A new "Correct 50/60Hz audio sync" toggle (samtheruby, on by default) uses 0 ms at 49–61 Hz for 1080p and below (matching stock Kodi and CE mainline), while 4K and other refresh rates are unchanged. If your chain is dialled in against the old 165 ms, turn the toggle off. The advancedsettings.xml latency tables were also reworked so user entries actually override the built-in defaults (the 2160p entries were effectively locked), and they no longer accumulate duplicates on profile switches.
  • The TrueHD MAT packer is hardened against malformed input: four defensive fixes backported by SamuriHL from the upstream Kodi review of the same LAV port (bounded bitstream reads, sane sync-frame sizes, a padding-loop safety net). Output on valid streams is bit-identical.
  • TrueHD 16-channel detection is fixed, and the major-sync fields (dialnorm, substream layout, extension data) are now logged whenever they change mid-stream, which makes bitstream oddities diagnosable from a normal debug log.
  • Audio settings are live now. Downmix settings (stereo upmix, LFE level, centre boost, LFE-to-front routing) rebuild the resampler on change instead of being sampled once at stream open, and the passthrough toggles (AC3/EAC3/DTS/DTS-HD/TrueHD, transcode, core fallback) switch the codec mid-playback. That also lets the per-folder override.ini engine drive them: service.p3i.override 0.1.9/0.1.10 expose the whole audiooutput.* family.
  • AC-4 decoding. The system FFmpeg gains the Dolby AC-4 decoder and parser (imported from librempeg by swmarks), with the MPEG-TS descriptors to identify AC-4 in ATSC 3.0 broadcast streams.

15. skin.p3i.estuary 8.8.16 and 8.8.17, through the addon repo

vlix published skin.p3i.estuary 8.8.16 and 8.8.17 to the pre-installed p3i addon repo, so boxes pick them up as regular addon updates:

  • The VS10 button in the video OSD is now gated to the hardware decoder (with further gating on live switching): the skin-side companion to T4a's fix that blocks VS10 on software-decoded video, so the toggle no longer offers a conversion that would corrupt the picture.
  • Codec logos: fixed overlapping DV and VS10 SDR/HDR10 logos.
  • Dynamic video OSD icon labels, cleaned-up Player Process Info labels, media flags and variables, tidied skin settings, and a refined CPU/RAM display in the top bar.
  • 8.8.17: the Player Process Info shows "Auto (letterbox)" as the L5 state while auto-letterbox masking is active (using the new infolabel), codec logos gained a duration setting and an entry animation, and the skin publishes the skin.codeclogososd property that pairs with the new core-side L5 gate.

16. Under the hood

  • Python 3.13.14 and iperf 3.21 (now baked into the base image as iperf3, samtheruby).
  • libdovi moves to vanilla upstream 3.4.0: our CMv4.0-strip primitive from T4a was merged upstream (dovi_tool #400), so the local patch is gone and libdovi builds from the plain upstream tag. The Rust toolchain is pinned to 1.91.1 to match our LLVM, fixing a broken 1.93 pin that had never actually compiled.
  • CoreELEC README now documents the build variables and local-checkout layout.

Known issues

Denon / Marantz AVRs: black screen or "no signal" on HDMI mode switches

This is not new, and we did not introduce it. It happens on stock (vanilla) CoreELEC too, not just our builds, and goes back well before T4. It is a long-standing AVR-side issue, not a p3i regression.

On some setups with a Denon or Marantz AVR between the box and the TV, the TV can drop to black or "no signal" around an HDMI mode or format change: a title starting, a resolution or refresh switch, or playback entering or leaving Dolby Vision. We have not been able to pin down exactly what sets it off; it may be any mode switch. The only reliable recovery is to power-cycle the AVR (sometimes the TV too).

In every captured failure the box was still putting a valid signal on the wire (correct timing, valid AVR EDID), but the AVR stopped forwarding it to the TV. The same box plays the same content cleanly straight into a TV, and through other AVRs and soundbars. Because the trigger is downstream of the box, no setting in the build fixes it. What does help is on the AVR side:

  • Set the AVR's HDMI input Signal Format (the "4K/8K Signal Format" option) to Enhanced. This is the classic Denon/Marantz 4K-black fix.
  • Update the AVR firmware.
  • To test or work around it, bypass the AVR: run the box straight into the TV and take the audio back over eARC.
VS10 SDR can drop video on some live-TV streams

On some live-TV sources (IPTV Simple Client / inputstream.adaptive and Tvheadend), VS10 SDR conversion sometimes fails to put out video when a stream starts. You get a black screen while the GUI still works: you can open the OSD and the menus, there is just no picture. This is not the HDMI/AVR blackout described above.

Disabling VS10 SDR avoids it entirely. It looks like a timing issue at live-TV start; we are still looking into it.


Changelog

The complete per-component commit list since T4b. Click any section to expand.

🎬 xbmc / Kodi (127 commits)

CEC (swmarks, SamuriHL)

  • 7fbd163e62 CEC: decouple libcec active-source queries from the main thread (+ 69a9f0d9e8 PR feedback: lock inversion, ActivateSource throttle)
  • 114d8df456 PeripheralCecAdapter: don't arm CEC wake-by-active-source from a phantom default
  • 8cb6f9a3b4 CEC: expand activate_on_keypress to activate_on_activity (+ 186da413b3 peripherals.xml reorganisation and strings)
  • d662d43936 CEC: observe keypresses via OnActionPre to recover the active source
  • ccfe6c703a CEC: persistent active-source tracking via flag file
  • ca28541aa4 CEC: honor standby commands addressed to broadcast, not just from the TV
  • 17222f3fb1 CEC: suppress the standby blast when disabling the CEC adapter
  • e9f42a50cd CEC: synchronous thread join on powerdown so the TV receives standby
  • dd1de654da CEC: fix tinyxml2 settings-order parsing
  • 71eff6c9c5 CEC: mark inactive source when standby devices are sent (fixes wakes swallowed after a CEC standby)
  • 5baf245c48 CEC: announce TV standby and active-source changes to addons
  • 8c020d5ffb CEC: remove redundant active-source queries and clean up comments
  • 579dd99fbb CEC: fix active-source races and standby state mismatches; add an explicit manual-standby setting
  • 3b1de505b3 CEC: fix standby/wake reliability on fresh boot and prevent callback deadlocks
  • fd23054a7e CEC: fix the permanent explicit-standby lockup race
  • 0f86b5cde5 translations: German string for CEC activate-on-activity
  • 5e3adeeec5 CEC: allow remote apps to wake the TV on resume after deactivation
  • f6fc420691 CEC: ignore playback stop/pause on deactivate while a screensaver is active

Screensavers (swmarks)

  • 1c0c6b5ca1 PlayListPlayer: intercept and dynamically tear down video screensavers (+ ae181d4de1 safe teardown without race conditions)
  • 80ab5609c9 AMLCodec: allow DV for windowed playback during screensavers
  • 2c6b0800a6 fix the video-screensaver idle timer and CEC wake behaviour (+ 717a28bd2c review follow-up)
  • d408e0237b application: fix a race when tearing down a Python video screensaver
  • c21a802d2c application: enforce the Dim screensaver when a modal dialog is active

Playback

  • 17e77c8020 AMLCodec: don't report hard-failed codec writes as consumed (the resume ~100s jump)
  • 1742990e97 RenderManager: full reconfigure when an fps change moves screen geometry (samtheruby)
  • 9480c5aa0d RenderManager: clear vsync phase state on the fps-only fast path (samtheruby)
  • ba1c3dd80e AMLUtils: anamorphic pixel ratio for SD display modes (samtheruby)
  • 1b5618e0cf Subtitles: don't reset a manual position when the debug OSD renders
  • 7ec96d4f37 VideoPlayer: auto-recover A/V sync after a corrupt splice in the stream
  • 9caf0f5e1a VideoPlayer: add native Matroska (MKV) editions selection support (Sebastiii)
  • b64098e4fc VideoPlayer: fix current-chapter detection to use the real playback position (Sebastiii)
  • fefe9c4329 Bluray: sync libbluray stream selection when switching tracks in menu mode
  • 3bf7171d47 GLES: fix limited-range wash-out on premultiplied-alpha bitmap overlays
  • 553b95b51a VideoPlayer: fix and improve subtitle stream selection (upstream CastagnaIT, ported by nissel, PR #54)
  • 0012efa742 VideoPlayer: don't discard subtitle extradata in CDVDDemuxClient
  • 221aba3048 NFS: refuse to open directories as files
  • 462ff7cd5f Safely handle a missing family_name from FT_Face
  • 3c4c70914d Prevent a race condition on m_peripherals
  • cc3be8b864 VideoPlayer: snap near-standard container frame rates at demux time (+ e90ee4474d ms-quantised fingerprint rework, 0f30f7c7b2 build fix; upstream xbmc/xbmc#28836)
  • 7fcfaaf24b VideoPlayer: re-sync the audio device after starting a frame-rate-repaired file
  • 591ca52ca8 VideoPlayer: correct audio labels, not the clock, for a mis-measured resync anchor (+ 4ea655a18e, e2285f81d7, 7357d0306c anchor-trim settling and label-shift removal)
  • 040d63d547 VideoPlayer: add hysteresis after a clock correction
  • 0c838da2dd VideoPlayer: hold clock corrections only where the averages are untrustworthy
  • c75224e4fa VideoPlayer: do not step the clock on a reseek we are about to make
  • d5642668ce BitstreamConverter: harden NAL size validation against corrupt streams (+ 7d9e8a3634 std::min clamp; upstream xbmc/xbmc#28845)
  • 6c39083221 AMLCodec: detect corrupt pts excursions for the recovery reseek
  • 15ac1a60af VideoPlayer: chain corruption-recovery reseeks with an escalating hop
  • e45d9a6b3f VideoPlayer: recover A/V sync after a mid-stream bitstream sync loss
  • cba47d1662 AudioEngine: lock passthrough resync detection to the track's codec family
  • e67c3d7d2d AMLCodec: emit decoded frames in display order for VC-1
  • 809f93ca36 AMLCodec: add a setting to choose how VC-1 frame order is repaired
  • ccddbebd9e AMLCodec: make the VC-1 timestamp repair the default
  • 51df8ccb36 AMLCodec: repair VC-1 timestamps across pause as well as playback
  • 47e326835d AMLCodec: stop forcing the deinterlacer on for VC-1 (with the matching media_modules ge2d change)
  • 37b0e59d57 VideoPlayer: require the demuxer interlace flag for VC-1 DI compensation
  • a92e63a702 AMLCodec: reorder VC-1 frames and rebuild their timeline
  • 7d903a59d6 AMLCodec: learn how deeply a VC-1 stream reorders
  • 3e4c8b8da2 AMLCodec: leave interlaced VC-1 alone (+ 18f1bbb570 ask the decoder for frames on interlaced streams, 634903490c logging clarity)
  • 9b39b353a6 DisplaySettings: don't restore stale square-pixel calibrations on SD modes
  • e984c6c674 AMLCodec: remove the VC-1 reorder window, repair only (A/B-convicted; + 969f1fe86d stall-debris hardening, d658fc7763 interlaced rebuild-only)
  • 44b89abcad VideoPlayer: count held frames in the video pipeline depth it reports
  • 8512a96bde VideoPlayer: step rapid chapter skips from the requested chapter
  • bfb37a8437 VideoPlayer: add missing space before the VSync debug label

Dolby Vision

  • 28fbead0dc AMLDV: per-frame metadata toggle for VS10 DV→SDR conversion (default on)
  • b400984827 DV: sane L5 defaults: zero L5 while OSD/subtitles are on screen
  • 28e13b5772 DV: L5 restriction: move image subs on cropped content into the active area
  • e860d6e6f0 AMLDV: count skin codec logos as OSD so L5 stays zeroed (vlix)
  • 0a7f528c44 AMLDV: gate the av.change L5 guard behind skin.codeclogososd (vlix)
  • ce0754a9a6 DV: compose auto-letterbox L5 additively with per-frame source L5
  • f84e7d5a02 DV: sanity-check auto-letterbox L5 against implausible source values
  • 858292dbce AML: fix GUI OSD max luminance not restored after DV_MODE_ON playback (Sebastiii)
  • 6f0d1d96db docs: sysfs lever reference for Kodi and the p3i kernel
  • 956baec84d DV: L5 active-area detect: fix AVIO teardown on cancel-before-open
  • dbeafcc47f DV: add a VS10 output black level setting (#83)
  • 775a19603a DV: HDR10+ conversion: hold the last RPU across SEI gaps (the Dark Wolf end-credits red screen)
  • f60b392979 DV: HDR10+ conversion: clamp L1 max_pq to source_max_pq
  • 3a267bc4bf DolbyVision: unified Epson profile with XML color override support (Sebastiii; + ee0aa76b2e cleanup)
  • ab83cf1fc0 AML: fix crashes from the auto-letterbox watcher thread on app quit (+ Sebastiii PR #53)
  • 6f686a7e72 HDR: add Dolby Vision profile and HDR10+ to video info (vlix, PR #56)

Audio

  • 531641c1f6 AdvancedSettings: add a 50/60Hz audio sync toggle and rework the latency tables (samtheruby)
  • 8a26bf9c36 Settings: enable the 50/60Hz audio sync correction by default
  • 99f4fa5c25 LAV Audio: harden the MAT packer against malformed/pathological input (SamuriHL)
  • 451fecaadb Audio: TrueHD major-sync logging, 16ch detection fix, dialnorm help note
  • 3e7f27d786 AudioEngine/VideoPlayer: react to mid-playback audio setting changes
  • cb9428735f VideoPlayerAudio: probe codec switches with pristine demuxer hints

Misc

  • bd4ae12fd9 addons: allow repository.p3i / repository.dontpanic addon updates as official repos (swmarks)
  • 795d55e08e Lang: correct setting help texts and close German gaps
🐧 Kernel (linux-amlogic, amlogic-4.9-20, 17 commits)
  • e4cec2c4451d cec: backport the 5.15 AOCEC driver to 4.9 (samtheruby)
  • 5ef21b9c33af cec: seed the function config from the uboot bootarg, not CEC_FUNC_CFG_ALL (fixes wake on every input switch)
  • c6755794f854 cec: restore the enable_cec_mailbox gate (fixes a 10s suspend/poweroff stall on some bootloaders)
  • 0e0cdee86e83 hdmitx: add missing G12A/G12B HPLL settings for VESA modes (samtheruby)
  • 26a0cf708c56 hdmitx: add hand-derived G12A/G12B HPLL settings for the remaining VESA modes (samtheruby)
  • 2bc2e6e8a418 amdolby_vision: xbmc_dv_sdr_keep_ext, keep L1/L2 for VS10 DV→SDR (per-frame tone mapping)
  • 79aa121efdc4 amdolby_vision: xbmc_dv_sdr_keep_ext, also cover the Player-Led path
  • c2c6cc7d0994 amdolby_vision: default the VS10 target min luminance to reference black (#83)
  • 057505862704 amdolby_vision: don't leak the previous stream's DV metadata into a new source (#85)
  • ef55e2868d3f amdolby_vision: refresh L5 when the OSD/subtitle gate flips while paused
  • 6d3761aa7b9f amdolby_vision: add an additive mode to the xbmc L5 override channel
  • 2c3f31339410 amdolby_vision: let CHANGE_TC2 win over CONST_TC2 in the core2 const latch (black OSD at DV start)
  • c46ad1454019 amdolby_vision: base the core2 const decision on this frame's cp result
📦 CoreELEC (distro & packages, 18 commits)
  • e5e2c34810 libcec: don't wake the TV on a routing change while it is in standby
  • eac0d61d22 libcec: fix the HDMI input grab-back on a routing change to an external device (samtheruby)
  • 67c2fe4757 libdovi: bump to vanilla 3.4.0, drop the CMv4.0-strip source patch (merged upstream in dovi_tool #400)
  • 9a7b22de1a + 1d37179211 rust: pin the toolchain to 1.91.1 for LLVM 19.1.7; fix target specs and cargo-c resolution
  • 4537605820 Python3: update to 3.13.14
  • 1d8902d09e iperf: update to 3.21 and bundle in the base image (samtheruby)
  • e8911b366d README: document building (PROJECT/DEVICE/ARCH, local checkouts)
  • d83162c3d6 ffmpeg: add the Matroska edition-selection patch (for MKV editions; Sebastiii, CE #91)
  • fc17270085 ffmpeg: import the AC-4 audio decoder and parser from librempeg (swmarks, CE #90; + 081f72e427 upstream update)
  • 9e28891157 libcec: fall back to the Power-On key when Image-View-On is unsupported (Hisense wake; swmarks, CE #93)
🎨 skin.p3i.estuary (by vlix, 8.8.15 → 8.8.17)
  • 89b6d9c Gate the VS10 OSD button to the hardware decoder
  • 44e41cf Further gate the VS10 OSD button and live switching
  • ab9262f Codec logos: fix overlapping DV and VS10 SDR/HDR10
  • 99c5c3a Dynamic video OSD icon labels
  • f3b5ff9 Clean up PPI labels, media flags, and variables
  • e94e4b0 Clean up skin settings and refine CPU/RAM display in the top bar
  • 9f075a6 Update changelog and bump to 8.8.16
  • 8b8c415 PPI: show "Auto (letterbox)" as the L5 state while auto-letterbox is active
  • 8.8.17 additions (via p3i_repo PR #2): codec-logo duration setting and entry animation, skin.codeclogososd property
🧩 Addon repository (`repository.p3i`)
  • c1c2f38 Publish skin.p3i.estuary 8.8.16 (VS10 OSD button gate, codec logos fix, video OSD dynamic icon labels), merged via p3i_repo PR #1 (vlix)
  • 6b2d278 Normalize the saved addons.xml to LF
  • 30e6039 Publish skin.p3i.estuary 8.8.17 ("Auto" L5 state, codec-logo duration & entry animation, skin.codeclogososd), via p3i_repo PR #2 (vlix)
  • 975cf25 service.p3i.override 0.1.9: expose audiooutput.* settings (+ 19c197b, 83bfe63 doc notes)
  • e1e0a69 service.p3i.override 0.1.10: expose audiooutput.channels
⚙️ CoreELEC Settings addon
  • e964b45 updates: replace the CoreELEC update service with three p3i channels: Release (GitHub), Testing, Internal (samtheruby, PR #3)
  • e04e01d updater: accept the Cryptodome namespace for pycryptodome (samtheruby, PR #5)
  • 4540b9f update the internal updater-channel key

Donations

ko-fi

Installation

Note

T4c changes several defaults (the DV L5/subtitle handling and the CEC wake settings). On a dirty upgrade your old values are kept; reset Settings/System/CoreELEC to pick up the new defaults, and re-check your CEC wake-up settings afterwards.

1. Dirty

Drop the update tar into your CoreELEC update folder and reboot - this can be used as a dirty upgrade from CPM A14 or any of the U3k, avdvplus and earlier p3i (T1–T4b) builds.

Should hitting reboot result in a black screen (long-standing issue with any build), wait 10 seconds to make sure this wasn't just a fluke, then unplug and re-plug the device's power. The upgrade will commence afterwards.

Reset Settings/System/CoreELEC, reboot.

Caution

Resetting Settings/System/CoreELEC to defaults after doing this is necessary. Not the CoreELEC Settings Addon!

2. Dirty (safe)

Drop the update tar into your CoreELEC update folder, shut down the device, pull the power plug for 30 seconds, replug.

Reset Settings/System/CoreELEC, reboot.

Caution

Resetting Settings/System/CoreELEC to defaults after doing this is necessary. Not the CoreELEC Settings Addon!

3. Flash

Use the provided Flash img.gz to prepare your SD card as you would with any other CoreELEC build.


Thanks

A massive shoutout to everyone involved in this build! This one leaned heavily on contributors: swmarks for the CEC and screensaver overhauls, samtheruby for the CEC kernel backport, the SD/VESA display-mode fixes and the update channels, Sebastiii for MKV editions and the DV fixes, SamuriHL for the CEC wake-config fix and the LAV MAT-packer hardening, and vlix for the codec-logo DV integration, the library DV-profile work and skins 8.8.16/8.8.17. Thanks also to the reporters behind the resume-jump, the SDR-after-DV corruption, the Dark Wolf red screen and the VC-1 and desync hunts, and to the upstream projects this builds on: avdvplus, libdovi (with our CMv4.0 strip now merged upstream), libass and FFmpeg.

Full Changelog (Kodi core): https://github.com/pannal/xbmc/commits/T4c/
Full Changelog (Kernel): https://github.com/pannal/linux-amlogic/commits/T4c
Full Changelog (CoreELEC-Settings): https://github.com/pannal/service.coreelec.settings/commits/T4c
Full Changelog (CoreELEC): https://github.com/pannal/CoreELEC/commits/T4c
Addon repo: https://github.com/pannal/p3i_repo

Contributors

Sources and contributors whose work landed in T4c (not exhaustive!):

  • swmarks — the CEC overhaul and the video-screensaver work, the AC-4 FFmpeg import and the Hisense wake fallback (xbmc PRs #29, #30, #32, #40, #42, #44, #47, #50, #55, #57, #58; CE #90, #93)
  • samtheruby — 5.15 CEC kernel-driver backport, SD anamorphic pixel ratios, VESA HPLL fixes, fps-change fixes, the 50/60Hz audio sync toggle, libcec input grab-back fix, iperf, and the in-GUI p3i update channels (xbmc PRs #35, #36, #37, #39; kernel #5, #7; CE #52, #72; Settings #3)
  • SamuriHL — CEC wake-config phantom-default fix (xbmc PR #28), LAV MAT-packer hardening backports
  • vlix — skin codec-logo DV/L5 integration, DV profile + HDR10+ in the library (xbmc PRs #38, #43, #56) and skin.p3i.estuary 8.8.16/8.8.17 (p3i_repo PRs #1, #2)
  • Sebastiii — MKV editions support, chapter-detection fix, the GUI OSD luminance-restore fix, and the unified Epson LS12000 DV profile (xbmc PRs #25, #49, #51, #52; CE #91)
  • nissel — upstream subtitle stream-selection rework, ported from Kodi master (xbmc PR #54)
  • quietvoid / dovi_tool — merged our CMv4.0-strip primitive upstream (libdovi 3.4.0)
  • CPM / avdvplus (R9) (@cpm-code) — DV metadata lineage, and the VC-1 hardware-decode approach (ge2d output + timeline rebuild)
  • libdovi / libass / FFmpeg — upstream projects

#CoreELEC p3i internal testing team: mad props to all of you not listed here. You made this possible. Thank you.

Don't miss a new CoreELEC release

NewReleases is sending notifications on new releases.