Skip to content

MacGameVideoFix 4.8.0 — a fix that reports itself installed is not necessarily loaded

Choose a tag to compare

@MathiasKowoll MathiasKowoll released this 25 Aug 17:27
· 59 commits to main since this release

A minor rather than another patch, because two of the things that changed are not fixes to features — they are the repository learning to check itself.

Two titles

NieR Replicant runs on stable CrossOver 26.3. What had kept it in the Preview-only column was never the engine. Its bridge rides on dinput8, which Wine implements and prefers, so it depends on a registry override — and that override had gone missing, while --status answered installed from the two files on disk without ever asking the registry. Every measurement taken on 26.3 was of the game running with no fix at all.

Its video turned out to be WMV2 with WMA v2 audio, in ASF, sixteen bytes into the game's own .arc. The page had recorded the codec as unknowable; the earlier scan had looked one header too early. CrossOver opens the container and decodes neither stream, so the title needs the staged libgstlibav — and had been filed as needing nothing.

NINJA GAIDEN 4 answers its Media Foundation gate from whatever the engine has. It asks MFTEnumEx whether anything can decode VP9 and quits with its own dialog if the count is zero. Our answer re-asked for H.264 and handed back that count — real MFTs with real lifetimes, which was the point — but assumed H.264 was registered. On an engine offering none, the fallback had nothing to return. It now falls through to any video decoder the engine has. Measured on both 26.3 and a patched Preview 27; on 26.3 the original path still carries it, which is exactly what the change was designed to leave alone.

Both architectures

CrossOver 27 runs ARM Windows binaries as well as x86_64 ones, and a bottle records which it is. stage-codecs.sh now stages every architecture an engine ships in one pass, and each bottle gets the staging its own WineArch asks for. Staging only x86_64 had left an ARM bottle with no VC-1, WMV or WMA decoder at all.

Two guards

  • runtime/check-builds.sh rebuilds every shipped DLL from the source it names and compares export tables and strings. It is self-contained — carrier, source and export table all come from the binary itself, so no game needs to be installed. It immediately found a proxy several revisions behind its own source, with a third build again in the game folder.
  • wiki/games.py --check refuses hand-written counts of the title set outside the generated blocks, and the README's table is now generated from the same rows as the wiki's. It had eighteen and was missing NINJA GAIDEN 4 entirely.

And the defects that prompted them

All one shape — something claimed, nothing checking:

  • A fix reported as applied while the key that makes it load was gone, and an --install whose refusal to act was defined by the same predicate that called it fine.
  • A guard in front of a destructive mv that could never match, because it looked for a string the proxy does not contain.
  • An install that overwrote a dstorage.dll a Steam verification had just restored — the only copy of the original.
  • A bottle counted as written that could not be addressed, and a bottle judged as missing a key it could not be asked about.
  • Three environment levers that set a flag to the value it already had, one of them advertised in four rows of a published table.