protonscr

Subliminal

protonopen appid 2300840Game compatibility - Unofficial
ValveSoftware/Proton#10130 · opened 2026-09-08 by GlassOnTin · updated 2026-09-11 · 3 comments · github · game page · search this game
GGlassOnTin 2026-09-08 github

Subliminal (appid 2300840, UE 5.7) shows white/blank TVs wherever the game plays video (Basement, Playplace, side rooms). TV audio still plays, so it's easy to miss, but progression is gated on a TV video — the ROTTEN ending reportedly never triggers without it. ProtonDB has the same report ("videos and TV screens would fail to play").

Setup: Proton Experimental 11.0-20260903b, RTX 5090, Debian, KDE Wayland. The game's TV player is UE's Electra player opening file:// mp4s (H.264/AAC) through Media Foundation. DXVK_FILTER_DEVICE_NAME was set to avoid the separate UE adapter-selection white screen; it isn't related to this.

WINEDEBUG="+winedmo,+mfsrcsnk,+mfplat,+mfmediaengine,+mfplay,+mfreadwrite" while walking to a TV — h264parse emits sane caps and avdec_h264 refuses them, for every TV open:

0:01:27.595 INFO  h264parse gsth264parse.c:2191:gst_h264_parse_update_src_caps:<h264parse1> resolution changed 640x360
0:01:27.595 GST_EVENT creating caps event video/x-h264, stream-format=byte-stream,
  streamheader=000000016764001eacd940a02ff9701100000303e90000ea600f162d960000000168ebe3cb22c0,
  pixel-aspect-ratio=1/1, width=640, height=360, framerate=30000/1001, coded-picture-structure=frame,
  chroma-format=4:2:0, bit-depth-luma=8, bit-depth-chroma=8, parsed=true, alignment=au, profile=high, level=3
0:01:27.596 WARN  videodecoder gstvideodecoder.c:934:gst_video_decoder_setcaps:<avdec_h264-1> Subclass refused caps

Later in the same open:

warn:mfplat:topology_loader_resolve_complete Failed to connect D3D-aware input, hr 0x80004002
warn:mfplat:session_events_callback_Invoke Failed to get event ..., hr 0xc00d3e85

The game's own log shows Electra's IMediaPlayer::Open(file://...) running, but no video ever arrives and the TV stays white.

Under GE-Proton11-6 the same videos play. Its MF stack has no winegstreamer at all: it removed gstreamer entirely and runs everything through winedmo -> FFmpeg. The game's logs corroborate: 10+ "Open Media Latent: Media player is closed" failures for TV/generator videos under Proton Experimental, zero under GE-Proton11-6, and the Basement TV confirmed playing on GE.

I don't know the exact reason avdec_h264 refuses the caps — they look acceptable, so it's either winegstreamer's wg_transform caps construction (byte-stream with a streamheader attached?) or the gst-libav version in the Steam runtime. Either way, Valve's build currently decodes Media Foundation video through winegstreamer -> the runtime's gst-libav, and that path fails here, while winedmo -> FFmpeg works.

Suggestion: prefer winedmo for Media Foundation decode in Proton, the way GE's video rework already does; it demonstrably fixes this title.

Workaround today: run the game on GE-Proton 11-x.

GGlassOnTin 2026-09-08 github

Version details from the affected install (Proton Experimental 11.0, game 2300840, SteamLinuxRuntime_4 / pressure-vessel sniper 3.0.20260805.254768):

The gst plugins in the failing path are bundled in Proton itself: files/lib/x86_64-linux-gnu/gstreamer-1.0/ (GStreamer 1.22). libgstlibav.so links libavformat.so.58 / libavcodec.so.58 / libavutil.so.56, which resolve from the Steam client runtime (ubuntu12_64); its libavcodec.so.58 is dated 2023-12-20, FFmpeg 4.x generation. The sniper platform manifest itself contains no gstreamer packages.

The same files decode fine under GE-Proton11-6, whose winedmo path bundles libavcodec.so.62 (Lavc62.28.102, FFmpeg 7.1 generation).

A community report also claims the GE switch fixes the ROTTEN ending trigger, a separate symptom in the same save flow; unverified by me.

I did not determine why avdec_h264 refuses the caps; the caps themselves look valid (byte-stream, streamheader with SPS/PPS, parsed=true, alignment=au).

GGlassOnTin 2026-09-09 github

Follow-up with a separate root cause for one-shot (non-looping) clips. This is not the winegstreamer caps issue above.

The game opens its end-of-game cinematic with the playback rate already 0 (Electra/Media Foundation opens paused), then sets rate 1 when the clip should play. The clip renders to its end but MESessionEnded is never delivered, so the game never advances past the ending. We reproduced this without the game, on the same mp4 through a plain IMFMediaSession:

  • play through, no pause: MESessionEnded delivered
  • SetRate(0) at 0.5 s and SetRate(1) at 2 s (pause after Start): MESessionEnded delivered
  • SetRate(0) before Start(), SetRate(1) after: never delivers MESessionEnded, deterministic across runs

In the failing case +mfplat shows zero MEStreamSinkRequestSample and zero ProcessSample on the audio renderer, against 585/194 in the pause-after-Start case. The session just polls the clock until it is killed.

Cause is in dlls/mf/sar.c (mainline, current master):

  • IAudioClient_Start is only called from OnClockStart and OnClockRestart, and both skip it when rate == 0.0f
  • OnClockSetRate handles the 0 to 1 transition by only setting renderer->rate; it does not start the audio client and does not queue any sample request
  • audio_renderer_preroll also returns early when rate == 0.0f, and SAR_PREROLLED is never set later

So a session started while paused never gets its first sample request. The source is never pumped to EOF, MEEndOfPresentation never fires, and MESessionEnded never arrives. Any app that opens a non-looping clip paused and unpauses later hits this; Unreal Engine Electra does this on every one-shot clip.

Tested on wine-11.0 (GE-Proton11-6, Staging) with the winedmo path, and the same code is present in mainline master. Test source and traces available on request; I plan to file this on WineHQ Bugzilla with the repro attached.

Ssimifor 2026-09-11 github

games that use h264 codec need to have codec support unlocked for it, If you runt his in your terminal once, videos should play on upstream proton steam steam://unlockh264/

Proton versions

Launch options

Error codes