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.inican 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
- 2. Update channels, built into the box
- 3. Video screensavers work properly
- 4. Playback fixes
- 5. SD and VESA display modes output correctly
- 6. VC-1 hardware playback, overhauled
- 7. Corrupt streams: crash-proof and self-healing
- 8. Native MKV editions support
- 9. Dolby Vision → SDR: per-frame tone mapping
- 10. Dolby Vision: letterboxed content and subtitles, sane by default
- 11. Dolby Vision: picture fixes
- 12. Epson projector support
- 13. Dolby Vision profile and HDR10+ in the library
- 14. Audio
- 15. skin.p3i.estuary 8.8.16 and 8.8.17, through the addon repo
- 16. Under the hood
- Known issues
- Changelog
- Donations
- Installation
- Thanks
- Contributors
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.
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.
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.
- 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.
- 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.
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.
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.
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).
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.
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.autoinfolabel exposes the auto-letterbox state to skins.
- 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.
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.
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.
- 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.xmllatency 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.iniengine drive them:service.p3i.override0.1.9/0.1.10 expose the wholeaudiooutput.*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.
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.codeclogososdproperty that pairs with the new core-side L5 gate.
- 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.
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.
The complete per-component commit list since T4b. Click any section to expand.
🎬 xbmc / Kodi (127 commits)
CEC (swmarks, SamuriHL)
7fbd163e62CEC: decouple libcec active-source queries from the main thread (+69a9f0d9e8PR feedback: lock inversion, ActivateSource throttle)114d8df456PeripheralCecAdapter: don't arm CEC wake-by-active-source from a phantom default8cb6f9a3b4CEC: expand activate_on_keypress to activate_on_activity (+186da413b3peripherals.xml reorganisation and strings)d662d43936CEC: observe keypresses via OnActionPre to recover the active sourceccfe6c703aCEC: persistent active-source tracking via flag fileca28541aa4CEC: honor standby commands addressed to broadcast, not just from the TV17222f3fb1CEC: suppress the standby blast when disabling the CEC adaptere9f42a50cdCEC: synchronous thread join on powerdown so the TV receives standbydd1de654daCEC: fix tinyxml2 settings-order parsing71eff6c9c5CEC: mark inactive source when standby devices are sent (fixes wakes swallowed after a CEC standby)5baf245c48CEC: announce TV standby and active-source changes to addons8c020d5ffbCEC: remove redundant active-source queries and clean up comments579dd99fbbCEC: fix active-source races and standby state mismatches; add an explicit manual-standby setting3b1de505b3CEC: fix standby/wake reliability on fresh boot and prevent callback deadlocksfd23054a7eCEC: fix the permanent explicit-standby lockup race0f86b5cde5translations: German string for CEC activate-on-activity5e3adeeec5CEC: allow remote apps to wake the TV on resume after deactivationf6fc420691CEC: ignore playback stop/pause on deactivate while a screensaver is active
Screensavers (swmarks)
1c0c6b5ca1PlayListPlayer: intercept and dynamically tear down video screensavers (+ae181d4de1safe teardown without race conditions)80ab5609c9AMLCodec: allow DV for windowed playback during screensavers2c6b0800a6fix the video-screensaver idle timer and CEC wake behaviour (+717a28bd2creview follow-up)d408e0237bapplication: fix a race when tearing down a Python video screensaverc21a802d2capplication: enforce the Dim screensaver when a modal dialog is active
Playback
17e77c8020AMLCodec: don't report hard-failed codec writes as consumed (the resume ~100s jump)1742990e97RenderManager: full reconfigure when an fps change moves screen geometry (samtheruby)9480c5aa0dRenderManager: clear vsync phase state on the fps-only fast path (samtheruby)ba1c3dd80eAMLUtils: anamorphic pixel ratio for SD display modes (samtheruby)1b5618e0cfSubtitles: don't reset a manual position when the debug OSD renders7ec96d4f37VideoPlayer: auto-recover A/V sync after a corrupt splice in the stream9caf0f5e1aVideoPlayer: add native Matroska (MKV) editions selection support (Sebastiii)b64098e4fcVideoPlayer: fix current-chapter detection to use the real playback position (Sebastiii)fefe9c4329Bluray: sync libbluray stream selection when switching tracks in menu mode3bf7171d47GLES: fix limited-range wash-out on premultiplied-alpha bitmap overlays553b95b51aVideoPlayer: fix and improve subtitle stream selection (upstream CastagnaIT, ported by nissel, PR #54)0012efa742VideoPlayer: don't discard subtitle extradata in CDVDDemuxClient221aba3048NFS: refuse to open directories as files462ff7cd5fSafely handle a missing family_name from FT_Face3c4c70914dPrevent a race condition on m_peripheralscc3be8b864VideoPlayer: snap near-standard container frame rates at demux time (+e90ee4474dms-quantised fingerprint rework,0f30f7c7b2build fix; upstream xbmc/xbmc#28836)7fcfaaf24bVideoPlayer: re-sync the audio device after starting a frame-rate-repaired file591ca52ca8VideoPlayer: correct audio labels, not the clock, for a mis-measured resync anchor (+4ea655a18e,e2285f81d7,7357d0306canchor-trim settling and label-shift removal)040d63d547VideoPlayer: add hysteresis after a clock correction0c838da2ddVideoPlayer: hold clock corrections only where the averages are untrustworthyc75224e4faVideoPlayer: do not step the clock on a reseek we are about to maked5642668ceBitstreamConverter: harden NAL size validation against corrupt streams (+7d9e8a3634std::min clamp; upstream xbmc/xbmc#28845)6c39083221AMLCodec: detect corrupt pts excursions for the recovery reseek15ac1a60afVideoPlayer: chain corruption-recovery reseeks with an escalating hope45d9a6b3fVideoPlayer: recover A/V sync after a mid-stream bitstream sync losscba47d1662AudioEngine: lock passthrough resync detection to the track's codec familye67c3d7d2dAMLCodec: emit decoded frames in display order for VC-1809f93ca36AMLCodec: add a setting to choose how VC-1 frame order is repairedccddbebd9eAMLCodec: make the VC-1 timestamp repair the default51df8ccb36AMLCodec: repair VC-1 timestamps across pause as well as playback47e326835dAMLCodec: stop forcing the deinterlacer on for VC-1 (with the matching media_modules ge2d change)37b0e59d57VideoPlayer: require the demuxer interlace flag for VC-1 DI compensationa92e63a702AMLCodec: reorder VC-1 frames and rebuild their timeline7d903a59d6AMLCodec: learn how deeply a VC-1 stream reorders3e4c8b8da2AMLCodec: leave interlaced VC-1 alone (+18f1bbb570ask the decoder for frames on interlaced streams,634903490clogging clarity)9b39b353a6DisplaySettings: don't restore stale square-pixel calibrations on SD modese984c6c674AMLCodec: remove the VC-1 reorder window, repair only (A/B-convicted; +969f1fe86dstall-debris hardening,d658fc7763interlaced rebuild-only)44b89abcadVideoPlayer: count held frames in the video pipeline depth it reports8512a96bdeVideoPlayer: step rapid chapter skips from the requested chapterbfb37a8437VideoPlayer: add missing space before the VSync debug label
Dolby Vision
28fbead0dcAMLDV: per-frame metadata toggle for VS10 DV→SDR conversion (default on)b400984827DV: sane L5 defaults: zero L5 while OSD/subtitles are on screen28e13b5772DV: L5 restriction: move image subs on cropped content into the active areae860d6e6f0AMLDV: count skin codec logos as OSD so L5 stays zeroed (vlix)0a7f528c44AMLDV: gate the av.change L5 guard behind skin.codeclogososd (vlix)ce0754a9a6DV: compose auto-letterbox L5 additively with per-frame source L5f84e7d5a02DV: sanity-check auto-letterbox L5 against implausible source values858292dbceAML: fix GUI OSD max luminance not restored after DV_MODE_ON playback (Sebastiii)6f0d1d96dbdocs: sysfs lever reference for Kodi and the p3i kernel956baec84dDV: L5 active-area detect: fix AVIO teardown on cancel-before-opendbeafcc47fDV: add a VS10 output black level setting (#83)775a19603aDV: HDR10+ conversion: hold the last RPU across SEI gaps (the Dark Wolf end-credits red screen)f60b392979DV: HDR10+ conversion: clamp L1 max_pq to source_max_pq3a267bc4bfDolbyVision: unified Epson profile with XML color override support (Sebastiii; +ee0aa76b2ecleanup)ab83cf1fc0AML: fix crashes from the auto-letterbox watcher thread on app quit (+ Sebastiii PR #53)6f686a7e72HDR: add Dolby Vision profile and HDR10+ to video info (vlix, PR #56)
Audio
531641c1f6AdvancedSettings: add a 50/60Hz audio sync toggle and rework the latency tables (samtheruby)8a26bf9c36Settings: enable the 50/60Hz audio sync correction by default99f4fa5c25LAV Audio: harden the MAT packer against malformed/pathological input (SamuriHL)451fecaadbAudio: TrueHD major-sync logging, 16ch detection fix, dialnorm help note3e7f27d786AudioEngine/VideoPlayer: react to mid-playback audio setting changescb9428735fVideoPlayerAudio: probe codec switches with pristine demuxer hints
Misc
bd4ae12fd9addons: allow repository.p3i / repository.dontpanic addon updates as official repos (swmarks)795d55e08eLang: correct setting help texts and close German gaps
🐧 Kernel (linux-amlogic, amlogic-4.9-20, 17 commits)
e4cec2c4451dcec: backport the 5.15 AOCEC driver to 4.9 (samtheruby)5ef21b9c33afcec: seed the function config from the uboot bootarg, not CEC_FUNC_CFG_ALL (fixes wake on every input switch)c6755794f854cec: restore the enable_cec_mailbox gate (fixes a 10s suspend/poweroff stall on some bootloaders)0e0cdee86e83hdmitx: add missing G12A/G12B HPLL settings for VESA modes (samtheruby)26a0cf708c56hdmitx: add hand-derived G12A/G12B HPLL settings for the remaining VESA modes (samtheruby)2bc2e6e8a418amdolby_vision: xbmc_dv_sdr_keep_ext, keep L1/L2 for VS10 DV→SDR (per-frame tone mapping)79aa121efdc4amdolby_vision: xbmc_dv_sdr_keep_ext, also cover the Player-Led pathc2c6cc7d0994amdolby_vision: default the VS10 target min luminance to reference black (#83)057505862704amdolby_vision: don't leak the previous stream's DV metadata into a new source (#85)ef55e2868d3famdolby_vision: refresh L5 when the OSD/subtitle gate flips while paused6d3761aa7b9famdolby_vision: add an additive mode to the xbmc L5 override channel2c3f31339410amdolby_vision: let CHANGE_TC2 win over CONST_TC2 in the core2 const latch (black OSD at DV start)c46ad1454019amdolby_vision: base the core2 const decision on this frame's cp result
📦 CoreELEC (distro & packages, 18 commits)
e5e2c34810libcec: don't wake the TV on a routing change while it is in standbyeac0d61d22libcec: fix the HDMI input grab-back on a routing change to an external device (samtheruby)67c2fe4757libdovi: bump to vanilla 3.4.0, drop the CMv4.0-strip source patch (merged upstream in dovi_tool #400)9a7b22de1a+1d37179211rust: pin the toolchain to 1.91.1 for LLVM 19.1.7; fix target specs and cargo-c resolution4537605820Python3: update to 3.13.141d8902d09eiperf: update to 3.21 and bundle in the base image (samtheruby)e8911b366dREADME: document building (PROJECT/DEVICE/ARCH, local checkouts)d83162c3d6ffmpeg: add the Matroska edition-selection patch (for MKV editions; Sebastiii, CE #91)fc17270085ffmpeg: import the AC-4 audio decoder and parser from librempeg (swmarks, CE #90; +081f72e427upstream update)9e28891157libcec: 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)
89b6d9cGate the VS10 OSD button to the hardware decoder44e41cfFurther gate the VS10 OSD button and live switchingab9262fCodec logos: fix overlapping DV and VS10 SDR/HDR1099c5c3aDynamic video OSD icon labelsf3b5ff9Clean up PPI labels, media flags, and variablese94e4b0Clean up skin settings and refine CPU/RAM display in the top bar9f075a6Update changelog and bump to 8.8.168b8c415PPI: 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.codeclogososdproperty
🧩 Addon repository (`repository.p3i`)
c1c2f38Publish 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)6b2d278Normalize the saved addons.xml to LF30e6039Publish skin.p3i.estuary 8.8.17 ("Auto" L5 state, codec-logo duration & entry animation, skin.codeclogososd), via p3i_repo PR #2 (vlix)975cf25service.p3i.override 0.1.9: expose audiooutput.* settings (+19c197b,83bfe63doc notes)e1e0a69service.p3i.override 0.1.10: expose audiooutput.channels
⚙️ CoreELEC Settings addon
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.
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!
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!
Use the provided Flash img.gz to prepare your SD card as you would with any other CoreELEC build.
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
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.estuary8.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.