0.7.17-beta-nt1
A personal Android TV fork of [NuvioMedia/NuvioTV(https://github.com/NuvioMedia/NuvioTV), focused on test builds, fixes, and optimisation for high-bitrate 4K remux playback with lossless bitstream audio passthrough.
This release rebases the fork onto upstream NuvioMedia/NuvioTV 0.7.17-beta and consolidates the entire fork development series (the earlier 0.7.13 -> 0.7.16 "nt" builds) into one baseline. Earlier per-build pre-releases have been retired.
Primary/validated target: Amlogic S905X4 (armeabi-v7a), tested on a Homatics Box R 4K Plus -> Samsung HW-Q800F -> LG C9 chain. Other devices (Nvidia Shield, Prism+, Xiaomi) have been community-tested.
Upstream 0.7.17-beta (folded in)
All of upstream's 0.7.17-beta work is included. Credit to the upstream authors:
- Improved Dolby Vision handling: safer BlockAdditional RPU conversion, P7 EL NAL stripping during DV8.1 conversion, updated ExoPlayer DV profile mapping (@halibiram)
- Improved external-player auto-next stability and edge-case fixes (@Laskco)
- Fixed Trakt regressions affecting new episodes and Continue Watching (@DeclanSC)
- Continue Watching keeps caught-up airing series visible when a new episode airs (@halibiram)
- Login support for self-hosted backends; sessions preserved during token refresh (@tapframe)
- Hardened profile isolation across sync and preference paths (@guuilp)
- Deep links for add-ons and detail screens (@tapframe)
- Fixed duplicate catalog Compose keys, corrupt strings, MPV track-snapshot ANR, duplicate Android TV preview programs (@tapframe, @halibiram)
- Better HLS manifest path matching; Sources panel keeps D-pad focus when late add-ons reshuffle the stream list (@halibiram, @termz64)
- Fixed ASS subtitle gibberish from zlib false positives in the Matroska extractor (@rubinaboobin3-cell)
- Updated parental-guidance data (@i4mth3d4ng3r); collection hero videos respect the trailer mute setting (@foXaCe)
- Simplified/Traditional Chinese, Greek, French, and Latin American Spanish localisation updates
Where upstream 0.7.17 and the fork touched the same Dolby Vision code, they were reconciled in the fork's favour only because upstream had adopted the fork's own earlier DV work -- no functional regression either way. The fork's parallel-download engine, buffer tuning, AFR, and audio-passthrough stack are preserved on the new base.
The fork changes, consolidated (0.7.13 -> 0.7.16 series)
Grouped by area -- the net state, not a per-build log.
Video throughput and buffering
- Improved parallel-connections downloading -- two fork changes to NuvioTV's parallel-connections feature (multi-connection HTTP range fetching for debrid/remote sources) that together make the buffer fill much faster on high-bitrate remux:
- Deeper, memory-budgeted read-ahead. Upstream schedules a fixed, shallow look-ahead of
connections + 1chunks (e.g. 3 chunks ahead on a 2-connection setup). The fork replaces that with a depth scaled to the connection count and bounded by the device's actual native-memory budget -- up toconnections x 4chunks ahead (e.g. 8 on the same setup). More work stays queued ahead of the reader, so the buffer builds instead of running just in front of playback. - Position-aware eviction. Upstream evicted chunks with a plain least-recently-touched policy, which systematically dropped chunks the reader was about to need and then re-downloaded them -- measured ~47% of fetched bytes re-downloaded on a 4K remux, and the deeper read-ahead above only makes that waste bigger. The fork evicts chunks behind the read cursor first and protects the
imminent read-ahead window, so useful throughput tracks what the source actually delivers and roughly half the wasted debrid data per title disappears.
Connection count and chunk size remain user-adjustable; the read-ahead depth derives from them and from available memory.
- Deeper, memory-budgeted read-ahead. Upstream schedules a fixed, shallow look-ahead of
- MP4 seek-reopen fix -- non-faststart / poorly-interleaved MP4s force scatter reads, and ExoPlayer recreates the data source on every seek. Previously that re-downloaded the same chunks dozens of times (measured ~two-thirds of transfer discarded), so these files rebuffered constantly even on fast links. A seek-surviving chunk session fixes it, and it engages even with parallel connections turned off -- so these files are watchable without needing a multi-connection mode.
- Custom playback buffers -- off-heap ("native memory") buffering with adjustable min/max/initial/rebuffer/back-buffer and an explicit byte target, tuned so high-bitrate remux rides variable links without rebuffering.
- VOD disk cache -- NuvioTV's opt-in disk cache (persists the current stream to disk for longer instant seek-back and brief-drop resilience) is unchanged in the fork; noted here only because it pairs with the buffering work above.
Dolby Vision
- App-side DV Profile 7 -> 8.1 conversion via libdovi (non-allocating RPU conversion; no per-frame GC stutter), with correct single-conversion-site handling of the BlockAdditional RPU.
- P7 in-band enhancement-layer strip -- single-track UHD remuxes (FraMeSToR-class) carry the DV7 enhancement layer in type-63 NALs in-band in the HEVC samples; the previous filter only dropped layer-id > 0 NALs, so a converted 8.1 stream that still carried an EL made the decoder fall back to HDR10. Now stripped in both the MKV and native MP4/TS paths.
- DV Profile 5 -> 8.1 conversion fix -- P5 conversion was sending libdovi mode 3, which the bundled C API maps to static 8.4 (HLG), not P5-to-8.1. Corrected so DV5 converts to proper 8.1 instead of the wrong transfer flavour.
- Preserve-mapping path fix -- the "preserve DV mapping" mode silently produced static 8.4 output (the C API exposes no mapping-preserving 8.1 conversion); it now falls back to the standard 8.1 conversion rather than the wrong profile family.
- Clean drop on conversion failure -- an unconvertible RPU is dropped (base layer continues as HDR10) instead of being forwarded raw under 8.1 signalling, and a fail-fast guard abandons per-frame conversion on a stream that is failing every frame.
Audio (lossless bitstream passthrough)
- Passthrough stability stack for TrueHD / DTS-HD MA / Atmos / DTS:X: pinned audio capabilities (so a background device blip can't tear down an active passthrough track), TV focus-handling disabled to avoid ducking-driven renegotiation, and AudioTrack handling on flush/seek. Includes passthrough startup/resume A/V resync work (credit: @halibiram, NuvioMedia#2502).
- DTS-HD MA / DTS:X detection un-gated from Dolby Vision -- the vendored Matroska extractor's DTS-HD/DTS:X first-sample sniff previously ran only when a DV feature was active, so native-DV boxes (the ones most likely to bitstream) negotiated plain core DTS. The extractor swap is now unconditional, so the HD track is surfaced for bitstream regardless of DV state.
- Hi-res AC-3 transcode fix -- 88.2/96/176.4/192 kHz sources failed AC-3 transcode (the encoder only accepts 32/44.1/48 kHz); they are now resampled to a legal rate before encode.
- Sticky forced-PCM cleared at 1.0x -- a single visit to a non-1.0x playback speed used to disable passthrough for the rest of the title; it now resets at 1.0x.
- Force-AC3 support at the sink -- a HAL under-reporting AC-3 no longer blocks passthrough.
- Honest PCM-only controls -- amplification and skip-silence (PCM-only processors, silent during bitstream) are gated on the real passthrough state and labelled as not applying during passthrough, instead of showing as live.
- Lossless-track auto-default -- prefers TrueHD > DTS-HD MA > FLAC > PCM within the language-preferred pool, without overriding an explicit or remembered choice.
- Kodi-style MAT / IEC61937 audio path (behind an Advanced toggle, off by default) -- app-side MAT packing ported from Kodi's CPackerMAT, to decouple TrueHD from vendor HALs. Experimental; fully dormant when the toggle is off.
Adaptive frame rate (AFR) and display
- AFR-on playback-hang fix -- with frame-rate matching enabled, a non-faststart MP4 (moov atom at the tail) could hang playback start indefinitely (>=109 s observed) on a blocking native probe. The ExoPlayer path now takes the frame rate from the track format ExoPlayer already reports (no network probe), with a watchdog and absolute deadline so a stuck probe can never hold start hostage.
- MKV frame-rate matching restored -- upstream matched refresh only for MP4; MKV frame rate is now declared from the container's DefaultDuration, so MKVs switch refresh too.
- 720p resolution-matching floor -- resolution matching no longer lets an SD title drop the whole HDMI output (UI included) to a 480p/576p mode.
- Precise 23.976-vs-24 matching, seamless-switch detection, per-stream AFR state reset (so mixed-rate series re-match), and a settle-then-resume after HDMI renegotiation (important on soundbar-in-the-middle eARC chains). Correct handling of tunnelled playback and single-mode displays.
Startup, UI, and diagnostics
- Faster stream start -- startup instrumentation (TTFF stage marks) plus a bootstrap-read fast path so the first frame doesn't wait on a full chunk or the file's tail index.
- "Stats for nerds" playback overlay (toggled from the More menu) -- a live diagnostics HUD built for exactly this kind of high-bitrate/lossless content, showing: measured video bitrate (container-declared, then refined from exact size/duration, then live measurement); the audio codec by name (TrueHD, DTS-HD MA, etc.) and its measured bitrate under passthrough; whether passthrough is genuinely reaching the sink; HDR/Dolby Vision detection from the stream; live network throughput; the negotiated audio output path; SoC temperature with per-chip throttle thresholds; audio-clock jitter; and AudioTrack underrun cross-checks. It's both a "is this actually playing losslessly / in the right HDR mode" confirmation and a triage tool for playback reports.
- Revised last-played-stream speed test -- runs a real throughput test against the actual last stream URL (the same source and path playback uses), rather than a generic network check, so the number reflects what the app can really pull from that debrid/Emby endpoint at your connection and chunk settings. Useful for telling a slow source apart from a buffering bug, and for tuning the connection count / chunk size. Expanded to test multiple variations of connection and chunk sizes to find the best option.
- "Best quality" auto-select -- a ranking mode that picks the highest-quality stream from the available sources.
- UI performance work on the home grid (poster prefetch/pre-decode, scroll-jank reduction).
Removals and slimming
- Single home layout -- the app now always uses the Modern layout. The layout picker was removed from both first-run setup and Settings; the Modern-specific options (landscape posters, full-screen hero backdrop, poster/card styling) remain.
- Removed unused vendored engine components: the IAMF and MPEG-H audio decoder AARs and an unused UI AAR (smaller build, no user-facing loss).
- Removed Android TV channel / preview-program sync (not used on this fork's target setup).
- In-app update check disabled -- this is a personal fork; it does not phone the upstream update feed.
Still present (sometimes assumed otherwise)
For the record: all 34 language translations, the add-on manager, and subtitle add-on support are intact -- nothing there was stripped. Only the home-layout picker was removed (the app is Modern-only, per above).
Compatibility notes
- versionCode 1097. Upgrading in place from an earlier fork build keeps your settings.
- Primary/validated target is the Amlogic S905X4 (armeabi-v7a). Treat other silicon as community-tested.
Licence and attribution
This fork is derived from [NuvioMedia/NuvioTV](https://github.com/NuvioMedia/NuvioTV) and is licensed under the GNU General Public License v3.0. All upstream copyright notices, licence headers, and author attributions are preserved. Thanks to the upstream maintainers and contributors -- this fork is a set of targeted optimisations on top of their work, not a replacement for it.