A browser+player for place.stream.video records
4
fork

Configure Feed

Select the types of activity you want to include in your feed.

Update README.md, fixup dep patching

+56 -16
+21 -3
README.md
··· 1 1 # VodBrowser 2 2 3 - ![screenshot](screenshot.png) 4 - ![screenshot](screenshot2.png) 5 - ![screenshot](screenshot3.png) 3 + <img src="screenshot.png" width="500" alt="VodBrowser grid menu"> 4 + <img src="screenshot2.png" width="500" alt="VodBrowser playing a VOD"> 5 + <img src="screenshot3.png" width="500" alt="VodBrowser post-playback stats"> 6 6 7 7 A browser for place.stream.video records with basic playback functionality, for TempleOS. Streams and plays H.264 video over HLS from place.stream.video records. Audio, pause/play, seeking, and thumbnails are not supported. 8 8 ··· 19 19 ### Prebuilt, all-in-one ISO 20 20 21 21 [Download here](https://skywell.dev/file/HohEjf). Boot it in any TempleOS-compatible VMM and `VodBrowser;` is ready from the REPL. 22 + 23 + Minimal QEMU invocation (cribbed from `qemu-run.sh`, which has more knobs if you need them): 24 + 25 + ``` 26 + qemu-system-x86_64 \ 27 + -machine pc-i440fx-10.0,vmport=off,hpet=off \ 28 + -cpu Skylake-Client \ 29 + -m 2048 \ 30 + -smp 4 \ 31 + -accel tcg,tb-size=512 \ 32 + -vga none -device cirrus-vga \ 33 + -device pcnet,netdev=net0 \ 34 + -netdev user,id=net0 \ 35 + -cdrom path/to/vodbrowser.iso \ 36 + -boot d 37 + ``` 38 + 39 + If QEMU opens headless, add `-display cocoa` (macOS), `-display gtk` (Linux), or `-display sdl` depending on what your build was compiled with. 22 40 23 41 ### From source 24 42
+9
deploy.sh
··· 15 15 SOURCES_ISO="$ISO_DIR/sources.iso" 16 16 BOOTCODE="$SCRIPT_DIR/tools/bootcode.bin" 17 17 18 + # ---- Ensure submodules are in sync with the current HEAD ---- 19 + # Guards against the common "pulled, forgot `git submodule update`" 20 + # footgun. Without this, a user who pulls new code where we bumped a 21 + # submodule pointer would keep building against the old submodule 22 + # worktree, producing confusing compile errors against stale source. 23 + # Always-run because it's cheap when already in sync. 24 + echo "=== git submodule update ===" 25 + git -C "$SCRIPT_DIR" submodule update --init --recursive 26 + 18 27 # ---- Bootstrap TempleOS install ISO (needed once for boot-code extraction) ---- 19 28 if [ ! -f "$TOS_ISO" ]; then 20 29 echo "TempleOS install ISO not found at $TOS_ISO"
+1 -1
holyc/vodbrowser/lib/Version.HC
··· 1 1 // Auto-generated by deploy.sh 2 - U0 Ver() { "VodBrowser build: 2026-04-11 17:39:34\n"; } 2 + U0 Ver() { "VodBrowser build: 2026-04-11 19:04:48\n"; } 3 3 Ver;
+25 -12
media/Makefile
··· 36 36 $(OPENH264_DIR)/codec/decoder/plus/src/welsDecoderExt.cpp 37 37 OH264_COMMON_SRCS = $(wildcard $(OPENH264_DIR)/codec/common/src/*.cpp) 38 38 39 - .PHONY: all elf clean 39 + .PHONY: all elf clean patch-oh264 patch-libmov 40 40 41 41 all: elf 42 42 ··· 58 58 # openh264: removes float/SSE usage that is incompatible with TempleOS. 59 59 # libmov: adds mov_reader_get_track_timescale() used by media_api.c's 60 60 # PTS pacing path. Both patches are idempotent — the --check --reverse 61 - # test fails with a clean tree, succeeds with an already-patched tree. 62 - $(XBUILD)/.oh264_patched: openh264-no-float.patch | $(XBUILD) 61 + # test fails with a clean tree and succeeds with an already-patched 62 + # tree, so re-running is safe. 63 + # 64 + # These are PHONY rather than stamp-file targets because `git submodule 65 + # update` (which routinely runs after `git pull`) silently reverts the 66 + # submodule worktree to its pinned commit, un-applying our patches. 67 + # A stamp file under the main repo's build_elf/ survives that and 68 + # would lie to us on the next build, causing the compile to fail with 69 + # "mov_reader_get_track_timescale undeclared" against unpatched 70 + # sources. Phony targets re-verify every build. 71 + # 72 + # The object rules attach these as ORDER-ONLY prerequisites (after the 73 + # `|`) so the phony targets always run but don't force .o rebuilds when 74 + # the .c hasn't changed. 75 + patch-oh264: 63 76 @cd $(OPENH264_DIR) && \ 64 77 if git apply --check --reverse ../../media/openh264-no-float.patch 2>/dev/null; then \ 65 78 echo "openh264: patch already applied"; \ ··· 67 80 echo "openh264: applying no-float patch"; \ 68 81 git apply ../../media/openh264-no-float.patch; \ 69 82 fi 70 - @touch $@ 71 83 72 84 LIBMOV_ROOT = $(ROOT)/lib/media-server 73 - $(XBUILD)/.libmov_patched: libmov-timescale.patch | $(XBUILD) 85 + patch-libmov: 74 86 @cd $(LIBMOV_ROOT) && \ 75 87 if git apply --check --reverse ../../media/libmov-timescale.patch 2>/dev/null; then \ 76 88 echo "libmov: patch already applied"; \ ··· 78 90 echo "libmov: applying timescale patch"; \ 79 91 git apply ../../media/libmov-timescale.patch; \ 80 92 fi 81 - @touch $@ 82 93 83 94 # Our C sources. 84 95 $(XBUILD)/media_api.o: media_api.c media_api.h | $(XBUILD) ··· 90 101 $(XBUILD)/media_minilib.o: media_minilib.c | $(XBUILD) 91 102 $(ZIGCC) $(XCFLAGS) -c -o $@ $< 92 103 93 - # libmov (C) — depends on the libmov timescale patch 94 - $(XBUILD)/libmov_%.o: $(LIBMOV_DIR)/source/%.c $(XBUILD)/.libmov_patched | $(XBUILD) 104 + # libmov (C) — patch-libmov is order-only (after `|`) so the phony 105 + # runs every build without forcing a .o rebuild. 106 + $(XBUILD)/libmov_%.o: $(LIBMOV_DIR)/source/%.c | $(XBUILD) patch-libmov 95 107 $(ZIGCC) $(XCFLAGS) $(INCLUDES) -DMOV_READER_FMP4_FAST=1 -c -o $@ $< 96 108 97 - # openh264 decoder core (C++) — depends on patch 98 - $(XBUILD)/oh264_dec_%.o: $(OPENH264_DIR)/codec/decoder/core/src/%.cpp $(XBUILD)/.oh264_patched | $(XBUILD) 109 + # openh264 decoder core (C++) — order-only patch-oh264 110 + $(XBUILD)/oh264_dec_%.o: $(OPENH264_DIR)/codec/decoder/core/src/%.cpp | $(XBUILD) patch-oh264 99 111 $(ZIGCXX) $(XCXXFLAGS) $(INCLUDES) -c -o $@ $< 100 112 101 113 # openh264 decoder plus (C++) 102 - $(XBUILD)/oh264_dec_welsDecoderExt.o: $(OPENH264_DIR)/codec/decoder/plus/src/welsDecoderExt.cpp $(XBUILD)/.oh264_patched | $(XBUILD) 114 + $(XBUILD)/oh264_dec_welsDecoderExt.o: $(OPENH264_DIR)/codec/decoder/plus/src/welsDecoderExt.cpp | $(XBUILD) patch-oh264 103 115 $(ZIGCXX) $(XCXXFLAGS) $(INCLUDES) -c -o $@ $< 104 116 105 117 # openh264 common (C++) 106 - $(XBUILD)/oh264_com_%.o: $(OPENH264_DIR)/codec/common/src/%.cpp $(XBUILD)/.oh264_patched | $(XBUILD) 118 + $(XBUILD)/oh264_com_%.o: $(OPENH264_DIR)/codec/common/src/%.cpp | $(XBUILD) patch-oh264 107 119 $(ZIGCXX) $(XCXXFLAGS) $(INCLUDES) -c -o $@ $< 108 120 109 121 # Setup.s (ELF entry) ··· 132 144 clean: 133 145 rm -rf $(XBUILD) Media.prg 134 146 @cd $(OPENH264_DIR) && git checkout -- . 2>/dev/null || true 147 + @cd $(LIBMOV_ROOT) && git checkout -- . 2>/dev/null || true