You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
6.4 KiB
6.4 KiB
Development Status
Current Milestone
Milestone 3 — SDL Video Viewport, HUD, and Wayland Compatibility
Current Architecture Decisions
- Language / UI: Python 3.9+ with PySDL2 (ctypes wrapper around system SDL2)
- DLNA Discovery: Custom SSDP M-SEARCH implementation using asyncio datagrams + aiohttp for device description XML
- Content Browsing: Direct SOAP/XML ContentDirectory client with DIDL-Lite parser (no dependency on async-upnp-client browsing at runtime — only aiohttp)
- Playback: integrated GStreamer backend via
PyGObject/GstPlayBin, decoding video intoGstAppSinkframes that are uploaded to SDL textures and rendered in the main SDL renderer - Playback viewport: SDL scales decoded video into a dedicated playback viewport in the same render pass as the HUD, with full-width video bounds and a black playback backdrop outside the viewport
- Concurrency: Dedicated asyncio event loop in a daemon thread; thread-safe queues bridge it to the SDL2 main loop
- Input: Keyboard mapping for desktop testing + SDL2 GameController for R36S D-pad/buttons
- Font: Bundled package font preferred first; system font fallback kept only for development hosts
- UI icons: prefer bundled monochrome glyphs or a bundled icon font subset instead of depending on OS emoji fonts
- Playback HUD: SDL-rendered overlay is now simplified and compact, uses bundled playback icons, uses a smaller dedicated playback font with title ellipsis for 640x480 readability, supports auto-hide or fixed visibility, stays visible while playback is paused, and remains in the same SDL render pass as video
- Wayland / DRM strategy: playback no longer depends on native overlay sinks or X11 window handles; R36S-class targets continue to prefer
kmsdrmwhen no display server is present - Deploy packaging: a
conda-forge-orientedenvironment.ymlnow defines a reproducible Miniforge/Miniconda environment for local development and release preparation
Completed Tasks
- Phase 1: Project bootstrap (
pyproject.toml,requirements.txt,README.md, package layout undersrc/) - Phase 2: DLNA discovery (
dlna/discovery.py— SSDP M-SEARCH, friendly-name fetch) and browsing (dlna/client.py— SOAP Browse, DIDL-Lite parser with relative-URL resolution +dlna/models.pydomain models +dlna/browser_state.pynavigation stack/cache) - Phase 3: SDL2 UI (
ui/sdl_app.py— window, event loop, input dispatch;ui/screens.py— server list, browse list, playback, error screens;ui/theme.py— 640×480 layout constants) - Phase 4: Playback (
player/backend.pyabstract interface +player/gstreamer_backend.pyintegrated GStreamer backend) - Phase 5: Device integration (
platform/controls.py— keyboard + gamecontroller mapping;platform/runtime.py— logging, R36S heuristic, SDL env hints) - Phase 7: Tests — 75 tests across 7 test files all passing (DIDL mapping, SOAP/XML parser, navigation state, playback backend, SDL redraw policy, input controls, runtime environment setup)
- Desktop runtime verification completed: fixed SSDP discovery socket setup for IPv4 and removed pending-task shutdown noise from the async worker thread
- Packaging hardening: bundled a local UI font asset and configured setuptools to ship it with the package
- Real LAN regression fixed: Browse SOAP parser now handles
Resultelements both with and without a namespace, matching responses from the discovered MiniDLNA/Jellyfin servers - Playback backend pivoted to GStreamer because libmpv continued to create a separate native window on the desktop host instead of remaining embedded in the SDL UI
- Milestone 2 is now implemented with GStreamer: playback uses
GstPlayBinplusGstAppSinkinstead of an external player, libmpv, or native overlay sinks - SDL playback flow updated: decoded GStreamer frames are uploaded into SDL textures, playback end-of-stream returns automatically to the browser, and playback controls support pause/resume, relative seek, and volume
- Milestone 3 implemented in code: SDL scales video into a dedicated viewport inside the SDL window, with reserved HUD margins instead of using the whole window area for video
- Playback HUD expanded: progress bar, elapsed/duration, volume, buffer, resolution, and control legends are rendered around the video area and updated from GStreamer bus/pipeline queries
- Playback-page flashing root cause addressed by removing native overlay composition entirely: video and HUD are now rendered together by SDL in one pass, with redraws driven by decoded frame availability and HUD state changes
- Playback HUD simplified: the border around the video area was removed, playback control/status icons were added as bundled SVG+PNG assets, the title/timer top bar no longer overlaps, and playback now supports
auto / fixed / hiddenHUD modes through a dedicated command while staying visible when paused - Deployment assets added:
.gitignore,environment.yml, and a realLICENSEfile so the project can be initialized and published as a clean git repository - Copilot instructions and this status file
Tasks In Progress
- Verify that the SDL-texture playback path is smooth enough on real host playback and on R36S hardware
- Measure whether BGRA frame upload is acceptable on RK3326 or whether a future YUV texture path is needed
Blockers Or Open Questions
SDL2_ttfsystem library needed for text rendering (sudo dnf install SDL2_ttfon Fedora,sudo apt install libsdl2-ttf-2.0-0on Debian/Ubuntu). The app handles its absence gracefully but will show no text.- Integrated playback requires system GStreamer plus Python GI bindings (for Fedora:
python3-gobject gstreamer1 gstreamer1-plugins-base gstreamer1-plugins-good; add codec/plugin packages as needed for target media). - Root browse verified against two real DLNA servers on the LAN.
- On-device testing on R36S hardware is pending.
- The current SDL-texture path avoids window-manager dependencies but may still need optimization on low-end hardware if BGRA upload cost is too high.
Next Recommended Actions
- Run a visual playback smoke test and confirm SDL-rendered video plus HUD eliminates flashing on host playback.
- Validate the SDL-texture playback path on the target R36S
kmsdrmbackend. - Measure CPU/load on RK3326 hardware during audio and video playback.
- If RGBA upload cost is too high, add a follow-up YUV texture upload path using
SDL_UpdateYUVTexture.