Skip to content

MacGameVideoFix 4.7.4 — answer the gate from what the engine has

Choose a tag to compare

@MathiasKowoll MathiasKowoll released this 25 Aug 16:52
· 65 commits to main since this release

NINJA GAIDEN 4 asks Media Foundation a question and quits if it does not like the answer. It calls MFTEnumEx for VP9, and if the count is zero it shows its own dialog — "Windows is missing required components… Media Foundation and the VP9 Codec" — and exits, before it has opened a single video file. It is the only title here that fails on the answer to a question rather than on decoding.

Our answer re-asked for H.264 and handed back that count. That was deliberate: those are real MFTs with real lifetimes, not an array we fabricated for the game to free. But it assumed H.264 was registered, and on a CrossOver that offers none, the fallback had nothing to return — so the game still quit, on an engine where every other part of the fix was working.

It now falls through to any video decoder the engine has, whatever it happens to register. Same reason, no dependence on a format being present by name. Measured: the gate passes, and MFCreateSourceReaderFromURL opens the .msd.

Two guards

A day of this turned up the same shape five times — something claimed, nothing checking.

  • runtime/check-builds.sh rebuilds every shipped DLL from the source it names and compares export tables and strings. It is self-contained: the carrier comes from the forwarders the DLL exports, the source from the log file it names, the export table from the binary itself, so no game needs to be installed. It immediately found runtime/amd_ags_x64.dll several revisions behind its own source, with a third build again in the game folder — three versions of one proxy, and nothing anywhere said so.
  • wiki/games.py --check now refuses hand-written counts of the title set outside the generated blocks. "Three titles need a codec" was seven. "Six of the eighteen run on stable" was seventeen of nineteen. "Four sources" was five. A count of something local — executables in one package, modes in one list — stays, marked <!-- count-ok -->.

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.

Installers

  • --install and --status now agree. Install called a run a success on one bottle out of five while status required all of them, so a mixed run printed installed and answered broken for ever after — with the app re-offering a repair that could not change the answer.
  • Bottles outside CrossOver's own directory are skipped out loud. wine --bottle takes a name, not a path, so two bottles called "Steam" in two roots collapse onto one. Claiming to have written to the other took a correctly installed game to broken and kept it there.
  • NINJA GAIDEN 4's install no longer overwrites a dstorage.dll that a Steam verification has just restored. It asked whether the saved copy existed rather than which of the two was ours, and the only copy of the original was the one it replaced. --restore now checks the file is ours before removing it, which its own comment had promised for a long time.
  • install-node-guard learned half — the one script that modifies a bundle every bottle shares, and the only one with no way back out of that state.
  • A dinput8 that is not ours is refused rather than overwritten. A mod or an input wrapper is not in Steam's manifest, so "verify the game files" does not bring it back.

In the app

half is repairable where the carrier is copied from the bottle rather than shipped by the game — true for NieR Replicant and Kingdom Hearts, false for the rest. The header used to declare all of them unfixable, on rows a single click would have completed.

Also

Three dead levers removed or made real. P5S_REAL_FRAMES set a flag to the value it already had, so the compiler dropped the branch entirely and four rows of the table advertised a control that moved nothing.

Known, and stated rather than hidden: runtime/amd_ags_x64.dll still lags its source. Rebuilding it changes which D3D9 entry point is hooked, so it waits for a run of Persona 5 Strikers rather than shipping unmeasured. check-builds.sh reports it, which is the point of having it.