diff --git a/app/src/main/assets/steam-startup/droiddeck-startup.webm b/app/src/main/assets/steam-startup/droiddeck-startup.webm index ee181257b..7e2fa4587 100644 Binary files a/app/src/main/assets/steam-startup/droiddeck-startup.webm and b/app/src/main/assets/steam-startup/droiddeck-startup.webm differ diff --git a/artwork/boot-animation-source/README.md b/artwork/boot-animation-source/README.md index e1915c39a..4caa7aa72 100644 --- a/artwork/boot-animation-source/README.md +++ b/artwork/boot-animation-source/README.md @@ -1,13 +1,17 @@ # DroidDeck boot animation This source accompanies the single Steam startup movie bundled by the app: -`app/src/main/assets/steam-startup/droiddeck-startup.webm` (1920×1080, pitch black background, VP9 video +`app/src/main/assets/steam-startup/droiddeck-startup.webm` (1280×720 at 30 fps, pitch black background, VP8 video with Opus audio). `droiddeck-boot.html` is the editable animation; the scripts and WAV below -reproduce the selected render. No alternate MP4 or WebM exports are kept in the repository. +render the animation at the bundled playback profile. No alternate MP4 or WebM exports are kept in the repository. From the repository root, render the movie with: - python3 artwork/boot-animation-source/render.py 1920 1080 60 app/src/main/assets/steam-startup/droiddeck-startup.webm dark + python3 artwork/boot-animation-source/render.py 1280 720 30 app/src/main/assets/steam-startup/droiddeck-startup.webm dark + +The bundled profile reduces decoded pixels per second by 78% compared with 1080p/60. +VP8 also lowers software decode cost while Steam is starting. Keep the bundled movie at +720p/30; higher-resolution exports are intended for sharing. The app stages that file into Steam's `config/uioverrides/movies` folder before each session. If Steam still has its built-in startup movie selected, DroidDeck sets this movie as the device's @@ -27,13 +31,12 @@ it down or step frame by frame (arrow keys). ## Re-render the video - pip install playwright && playwright install chromium # ffmpeg with libvpx-vp9 also required - python3 render.py 1280 800 60 droiddeck-boot-1280x800.webm - python3 render.py 1920 1080 60 droiddeck-boot-1920x1080.webm + pip install playwright && playwright install chromium # ffmpeg with libvpx also required + python3 render.py 1280 720 30 droiddeck-boot-1280x720.webm python3 render.py 1920 1080 60 droiddeck-boot-1920x1080.mp4 # .mp4 = H.264 for sharing - python3 render.py 1280 800 60 droiddeck-boot-dark-1280x800.webm dark # dark version + python3 render.py 1280 720 30 droiddeck-boot-dark-1280x720.webm dark # dark version -Each frame gets real motion blur (180° shutter, adaptive sub-frames). Output is VP9 for .webm or H.264 for .mp4, both BT.709, +Each frame gets real motion blur (180° shutter, adaptive sub-frames). Output is VP8 for .webm or H.264 for .mp4, both BT.709, so the orb stays #1A9FFF after compression. ## Sound diff --git a/artwork/boot-animation-source/render.py b/artwork/boot-animation-source/render.py index 9c55b9b10..ee85ea06a 100644 --- a/artwork/boot-animation-source/render.py +++ b/artwork/boot-animation-source/render.py @@ -2,11 +2,11 @@ """Render the DroidDeck boot animation to .webm (Steam) or .mp4 (H.264). Usage: python3 render.py [WIDTH] [HEIGHT] [FPS] [OUT] [light|dark] - python3 render.py 1280 800 60 droiddeck-boot.webm + python3 render.py 1280 720 30 droiddeck-boot.webm python3 render.py 1920 1080 60 droiddeck-boot.mp4 - python3 render.py 1280 800 60 droiddeck-boot-dark.webm dark + python3 render.py 1280 720 30 droiddeck-boot-dark.webm dark -Needs: pip install playwright && playwright install chromium, plus ffmpeg with libvpx-vp9. +Needs: pip install playwright && playwright install chromium, plus ffmpeg with libvpx. The animation is drawn by droiddeck-boot.html (same folder); each frame gets real motion blur (180-degree shutter, up to 48 sub-frames when things move fast). """ @@ -15,8 +15,8 @@ from pathlib import Path from playwright.sync_api import sync_playwright W = int(sys.argv[1]) if len(sys.argv) > 1 else 1280 -H = int(sys.argv[2]) if len(sys.argv) > 2 else 800 -FPS = int(sys.argv[3]) if len(sys.argv) > 3 else 60 +H = int(sys.argv[2]) if len(sys.argv) > 2 else 720 +FPS = int(sys.argv[3]) if len(sys.argv) > 3 else 30 OUT = sys.argv[4] if len(sys.argv) > 4 else f"droiddeck-boot-{W}x{H}.webm" THEME = sys.argv[5] if len(sys.argv) > 5 else "light" # light | dark ONLY = [int(x) for x in os.environ.get("FRAMES", "").split(",") if x] # debug: render some frames only @@ -54,9 +54,9 @@ cmd += ["-vf", "scale=out_color_matrix=bt709:out_range=tv:flags=accurate_rnd+ful if OUT.lower().endswith(".mp4"): # H.264 for sharing, previews and anything that won't play webm cmd += ["-c:v", "libx264", "-preset", "slow", "-crf", "15", "-profile:v", "high", "-tune", "animation", "-g", str(FPS * 2), "-movflags", "+faststart"] -else: # VP9 webm for Steam's startup movie - cmd += ["-c:v", "libvpx-vp9", "-b:v", "0", "-crf", "18", "-deadline", "good", "-cpu-used", "2", - "-row-mt", "1", "-g", str(FPS * 2)] +else: # VP8 keeps software decoding inexpensive during Steam startup + cmd += ["-c:v", "libvpx", "-b:v", "2M", "-crf", "10", "-deadline", "good", "-cpu-used", "2", + "-g", str(FPS * 2)] cmd += COLOR + ([] if SOUND.exists() else ["-an"]) + [OUT] subprocess.run(cmd, check=True) if not os.environ.get("FRAMEDIR"):