Skip to content

Plex client test build 9.5.54 — the 30–60 s playback freeze is fixed

Pre-release
Pre-release

Choose a tag to compare

@bob9 bob9 released this 02 Aug 23:32
· 4 commits to main since this release

🎬 Your movie library. Your private cinema. Your goggles.

This build turns HDZero goggles into a personal movie theater — and now backs up your flight recordings too. Lie back anywhere and watch your own movie collection on dual 1080p micro-OLED displays. Movies stream from your own media server over WiFi, decoded by the goggle's video hardware — the same silicon that handles 90 fps race footage barely breaks a sweat on a film.

✨ What it supports

  • 🎞️ Plex AND Jellyfin — both media servers, behind the same poster-wall interface
  • 📺 Movies AND TV shows — series open into an episode browser; everything streams the same way
  • 📸 Immich DVR backup — upload your flight recordings straight from the goggle to your self-hosted Immich photo server. Pick exactly which files, see which are already backed up, watch per-file progress.
  • 📼 Every video format your server can play — H.264, HEVC/H.265, MKV, AVI, 4K sources — the server converts anything automatically
  • 🔊 Any audio track — DTS, AC-3, TrueHD downmixed to clean stereo
  • 📶 Fully local — your movies and recordings never leave your home network
  • 🔑 Smart-TV-style sign-in — Plex: plex.tv/link code. Jellyfin: Quick Connect code. Immich: API key (SD-card file or typed once). No painful typing.
  • 🖼️ Instant browsing — poster artwork cached on the SD card
  • 🛩️ FPV untouched — everything racers use is exactly where it was

Requires your own Plex (plex.tv), Jellyfin (jellyfin.org), and/or Immich (immich.app) server on the same network — all free. Community test build (design docs).


🆕 What's new in 9.5.54

The big one from field testing — picture freezing 30–60 seconds in while the download kept going — is root-caused and fixed, along with several bugs that made healthy servers look broken:

  • 🧊 The 30–60 s freeze is fixed. The video decoder reads ahead of the download, and when it caught up to the not-yet-written end of the buffer file it declared the movie finished and stopped — while the download happily continued behind it. The player now detects that false ending, waits for the download to get ahead again, and resumes in place with an invisible seek. No black frame, no restart.
  • 🚀 First play after a server restart no longer fails. A cold transcode can take more than 5 s to send its first response; that pause was misread as a network failure, so the first attempt "failed" and retried at a lower quality tier. It now waits like it should.
  • 📉 Fast servers were being punished. A 32-bit overflow in the download-rate math made big fast chunks read as negative speed, so the best servers could get demoted to lower quality. Fixed.
  • 🚪 Exit always works now. If the SD card had no DVR recordings, the long-press-to-exit during playback was silently swallowed by the recordings page's key handler, leaving no way out of a video. Player keys are now routed to whichever page actually owns the player.
  • 🎯 Jellyfin accuracy — the goggle now gets the movie's exact runtime and a proper play-session ID from the server, so movies no longer end up to 59 seconds early and the server's transcode pacing stays happy.
  • 💾 The stream buffer file on the SD card is now preallocated once and reused between movies (this also removes one of the freeze triggers).

If anything still misbehaves, grab hwlog.txt from the SD card — the player logs a heartbeat and explains any early stop.


📖 User guide

Install

Copy the file for your goggle to the root of the SD card, then Menu → Version → Update Goggle:

After updating, the Firmware page should show version 9.5.54 — if it doesn't, the goggle is still on an older build.

  • HDZERO_GOGGLE2-77-184-9.5.54.bin — Goggle 2
  • HDZERO_GOGGLE-77-206-9.5.54.bin — original Goggle (G1)
  • (HDZERO_BOXPRO is a plain build without these features.)

Movies (Plex / Jellyfin)

  1. Menu → WiFi → Client mode → join your home network (one-time).
  2. Menu → Plex — the goggle lists every Plex and Jellyfin server it finds, labeled [Plex] / [Jellyfin]. Click yours. (Manual entry: ip:8096 = Jellyfin, ip = Plex.)
  3. Sign in once: Plex shows a code for plex.tv/link; Jellyfin shows a Quick Connect code you approve in any signed-in Jellyfin app (enable Quick Connect once in its dashboard). SD-card token files (plextoken.txt / jellyfintoken.txt) and on-screen entry also work.
  4. Browse & play: scroll the poster wall, click for details, click again to play. During playback: click = pause, scroll = seek, long-press (dial or Func) = back. Needs 2+ GB free on the SD card (the stream buffers there and is deleted after).

DVR backup (Immich)

  1. Menu → Immich (WiFi + SD card required).
  2. First time: create immich.txt on the SD card — line 1 your API key (Immich → Account Settings → API Keys), line 2 server-ip:2283 — it's picked up automatically. Or type both with the dial.
  3. Your recordings appear as a list; files already backed up are marked uploaded in green.
  4. Click to tick files, Func-click to upload the selection (or just the highlighted file). Progress shows per-file MB; click cancels after the current file.
  5. Already-on-server files are detected by Immich itself and marked — you can't double-upload.

Known limitations (test build)

  • Stuck on “Buffering…” with Jellyfin? The server sends video only as fast as it converts it. 4K/HEVC/HDR movies need a fast server or hardware transcoding (Jellyfin Dashboard → Playback → Transcoding → select your GPU). Quick check: play a normal 1080p movie — if that works, the goggle is fine and the server just can’t convert the 4K title in real time. The Dashboard home page shows the conversion speed while a stream runs; below ∼1.0x means it can’t keep up.
  • Seek works within the downloaded portion of the stream.
  • The media server does the remux/transcode — any PC/NAS-class server is fine.
  • Please report issues (grab hwlog.txt from the SD card if something misbehaves).

Source: plex-client branch @ c3f3e0b (fix: 1b71b02)