Changelog
libCEC 8.1.7 fixes three Raspberry Pi threading bugs, stops a Sony's input switch from suspending the box behind it, and makes every distribution ship a licence text that actually matches what is inside it.
Highlights
- Raspberry Pi: VideoCore callbacks no longer run on VideoCore's own 4KiB stack. vcos asks for that size and does not check that it was granted; glibc refuses and hands out the 8MiB default, musl grants it, and the first log message a callback formatted then ran off the end of the stack. Callbacks now copy their arguments onto a queue and every handler runs on a thread libCEC sized itself (#746).
- Raspberry Pi: bus changes are reported off the callback dispatch thread. A lost logical address and a physical address change both transmit, and a transmit waits for the
VC_CEC_TXconfirmation that arrives on the very thread they were blocking. Every such transmit stalled for its full timeout: the address was renegotiated blind, and a hotplug reported its new physical address to nothing. - A power toggle no longer switches the device off as the TV selects it (#744). A Sony sends
<user control pressed>power (0x40) to wake the source it is switching to, then power on (0x6d) a moment later. Resolved against this device's own power status, a running box reads as on, so libCEC announced<inactive source>and handed the client a power key — suspending the box before the power on arrived. A toggle now only means off while the TV is showing this device. - Per-distribution licence texts, generated from one manifest.
licenses/components.jsonrecords what each component is, whose copyright it is and which distributions carry it. The Windows installer's text now covers the libusb-win32, DPInst and node-addon-api it ships and the source tree does not; the npm and crates.io packages carry a licence text at all; anddebian/copyrightno longer misstates the AMD ADL headers.
Added
cecc-clientimplements--helpand--list-devices; both parsed their option and printed nothing (thanks Barak A. Pearlmutter)- man pages for
cecc-clientandpyCecClient, written by Barak A. Pearlmutter for the Debian package - per-distribution licence texts assembled from
licenses/, withsupport/generate-licenses.pywritingLICENSE.md,debian/copyright, the npm and crates.io licence files and the installer's own text per build - the licence texts name the contributors who hold copyright in the Exynos, AOCEC and Linux backends, record the EventGhost plugin's GPL-2+ terms, and declare the MIT-licensed AMD ADL headers
debian/upstream/metadata, pointing the archive's tooling at the issue tracker and the repository
Changed
- the AMD ADL headers are AMD's recent GPUOpen release under the MIT licence, replacing headers whose terms granted no permission to use, copy, modify or redistribute (thanks Barak A. Pearlmutter)
- the i.MX6 backend is recorded as GPL-2+ only; its files never carried the commercial paragraph, so the blanket dual licence claimed an option that cannot be offered on them
- the Pulse-Eight copyright years read 2011-2026 everywhere, the .NET assembly and the
cec.dllversion resource included - Debian:
libcec8-devisMulti-Arch: same, and thelibudev-devbuild dependency is Linux-only - every binding's documentation leads with its registry install (npm, NuGet, crates.io) rather than with building from this tree, and says the package binds the native library rather than carrying it
Fixed
- RPi: VideoCore callbacks are handled on a thread libCEC sizes itself (#746)
- RPi: logical address loss and physical address changes are reported off the callback dispatch thread
- RPi: the VideoCore host was only torn down when it had never been set up, and passive mode was left after the host connection that call needs had been closed
- a power toggle switched the device off as the TV selected it (#744)
- the Python module was packaged outside Debian's module search path, so
import cecfailed on an installedpython-libcec - Debian: a clean left cmake's generated files in the source tree, so a second build in the same tree started dirty
TegraCECDev.hcarried no licence header or include guardrelease.pydid not actually serialise the Jenkins builds (#743)- spelling: occured to occurred (thanks Barak A. Pearlmutter)
Note on the x86 installer
libcec-x86-8.1.7.exe carries no Node.js component. Node dropped its 32-bit Windows builds in v23, so node-gyp cannot fetch an ia32 node.lib and there is nothing to link a 32-bit addon against. Use libcec-x64-8.1.7.exe if you need the Node.js binding; the difference is otherwise invisible on the release page.
Full Changelog: libcec-8.1.6...libcec-8.1.7