Skip to content

EVO Player v0.5.0

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Aug 03:22
· 41 commits to main since this release

If a previous release did nothing when you ran it, this is the fix. The
release shipped the bare player, which needs hbldr to be given a display
plane — sent straight to elfldr by a payload manager it started headless and
never drew anything. Download EVOPlayer-0.5.0-InstallTile.elf instead: it
registers the Media tile and carries the player inside it.

Also: a text reader, and a font that can finally spell a comma.

Fixed — install

  • The release now ships the ELF that works from a payload manager.
    EVOPlayer.elf is the bare player and needs hbldr for a display plane;
    elfldr alone runs it headless, so nothing appears. The old release notes
    documented this in a footnote under a step pointing at that very file.
    The tile launcher already carried its own copy of websrv's hbldr and works
    from elfldr alone — it just was never built or shipped. Verified on 12.70 on
    a console where only elfldr was reachable.
  • The bare player is renamed -player-only.elf so it cannot be picked by
    mistake, and the release notes now say which file is which.
  • The tile launcher announced the wrong version — a hardcoded 0.2.0 that
    had drifted two releases behind the player it embeds. It now takes the
    version from the same file CI checks against the release tag.
  • CI verified only one of the three payloads. It now checks all of them,
    and asserts the launcher is larger than the player it embeds — a launcher
    that suddenly shrinks means the .incbin picked up nothing, which would
    ship a tile that opens to a black screen and pass every other check.

New

  • A text reader. Opening a .txt, .log, .md, .nfo, .json, .csv,
    .ini/.cfg or a subtitle file from the browser now reads it instead of
    doing nothing — those extensions were listed and selectable and CROSS on
    them was silently ignored, which read as the browser being broken.

    D-pad scrolls a line, the shoulders page (with one line of overlap, so a
    paragraph keeps a landmark), the triggers jump a tenth of the file, and
    TRIANGLE cycles three reading sizes. Changing size re-wraps and keeps the
    top of the view on the same words, because losing your place is the one
    thing a size control must not do. The scrollbar thumb is sized to how much
    of the document is on screen, which is what tells you whether "half way"
    means five more pages or five hundred.

    Text is decoded as UTF-8 and folded to what the font can draw: curly quotes
    become straight ones, em dashes hyphens, ellipses three periods, accented
    Latin letters their base letter. A file that is not valid UTF-8 still opens.
    Reads at most 2 MB and says so rather than appearing to end early; refuses
    binaries instead of showing a screen of dots.

  • The UI font has punctuation. It had 69 glyphs — letters, digits and
    /._:-+ — and drew everything else as a 12px gap. Survivable in a filename,
    unreadable in prose, and a text reader is nothing but prose. 26 glyphs
    (, ' " ! ? ( ) ; [ ] { } < > = * # | \
    ~ ^ ` % & @ $) are now generated by tools/gen_icons.py at
    all four sizes.

    The original atlas is a pre-generated asset with no generator in the tree, so
    these live in a second atlas that the text routines fall back to. They sit on
    the letters' baseline because tools/measure_font.py reads the real baseline,
    cap height and stroke weight out of the atlas ink rather than guessing, and
    their advances are measured from the rasterised glyph rather than declared —
    the first pass declared them and $4.50 (approx came out with the bracket
    touching the zero.

Changed

  • Glyph lookup is shared between the player and tools/uiview.c. Both
    carried their own rr_idx scan and their own four-way face switch; with two
    atlases to choose between that would have been two more places to drift.
    Both now call evo_font.h.
  • The browser labels a file "DOCUMENT" if the reader will open it. The two
    lists had drifted the moment the reader learned new extensions, so a .json
    was labelled "FILE" right up until you pressed CROSS on it and it opened.

Documentation

  • The README is about the player again. It had grown into a twenty-section
    setup manual — Windows prerequisites, Docker, LLVM version rationale, FFmpeg
    profiles, a validation checklist — with the player itself covered in the
    first forty lines. Someone who wants to use EVO Player needed none of it.
    707 lines to 175: what it is, how to install it, what it does, the controls.
    Nothing was deleted; the developer guide moved intact to
    docs/building.md.
  • docs/architecture.md is new — the layers inside
    the player, why main.c is carved in the order it is (with the measurement
    that argues against the obvious first cut), the draw vtable, the two font
    atlases, and what can be verified without a console.
  • Eight screenshots, all real uiview renders rather than mock-ups.
  • EVO_TEXT_CHARSET is generated, not hand-maintained. It listed 69
    characters and would have gone on reporting a comma as unsupported long
    after the comma was added; tools/gen_icons.py now emits the punctuation
    alphabet into a header small enough for the UI layer to include.
  • The font warnings in docs/ui-handoff.md said prose
    could not be written and a prompt "cannot ask a question mark's worth of
    question". Both were true and are not any more.


Install — start here

Download EVOPlayer-*-InstallTile.elf. That is the one to run.

  1. Jailbreak the console (12.70) and start ps5-payload-elfldr.
  2. Copy EVOPlayer-*-InstallTile.elf to a USB stick.
  3. Start it from your payload manager — the on-console one,
    typically at http://<ps5>:8084. Anything that sends an ELF to
    elfldr works.
  4. It says "EVO Player ready in Media". Open EVO Player from the
    console's Media row.

That is the whole install. No websrv, no FTP, nothing to extract,
and no second device beyond whatever runs your payload manager — the
tile installer carries the player inside it.

Keep the payload running. It is resident by design — it is what
starts the player when you open the tile. Your payload manager may
show it as still running; that is correct.

Re-run it after every reboot, along with the jailbreak.

Which file is which

File Use it for
EVOPlayer-*-InstallTile.elf Normal install. Payload manager → tile in Media
EVOPlayer-*-UninstallTile.elf Removes the tile completely
EVOPlayer-*-homebrew.zip The websrv route: extract to a USB stick as /homebrew/EVOPlayer/, launch from http://<ps5>:8080
EVOPlayer-*-player-only.elf The bare player. Do not send this to a payload manager — with elfldr alone it runs headless with no display plane and nothing appears. It needs hbldr, which the tile installer and websrv provide

Requirements

  • PS5 on firmware 12.70, jailbroken (re-run after every reboot)
  • A USB stick for media

Verification

Built reproducibly in CI from the pinned toolchain (clang 18.1.3,
PS5 Payload SDK v0.42, FFmpeg 7.0.1). CI has no console, so these
binaries are not hardware-tested.
Checksums in SHA256SUMS.txt.

Licensed GPL-3.0-or-later. Derived from ProsperoPlayer; see NOTICE.