Hook for Quantum Break that plays the live-action episodes from local copies and overrides their captions.
| Type | Value |
|---|---|
| Developer(s) | Remedy Entertainment |
| Publisher(s) | Microsoft Studios |
| Director(s) | Sam Lake, Mikael Kasurinen |
| Producer(s) | Miloš Jeřábek |
| Engine | Northlight Engine |
| Platform(s) | Windows, Xbox One |
| Genre(s) | Action-adventure, third-person shooter |
| Mode(s) | Single-player |
- The project contains no original assets from the game.
- To use this project you need to have an original copy of the game (bought from Steam), the project doesn't make piracy easier and doesn't break any of the DRM included in-game.
- The project is not affiliated with or endorsed by Remedy Entertainment or Microsoft.
- Offline playback of the live-action episodes downloaded with QuantumFetcher
- Caption overrides: the episodes' captions can be translated or edited in SubRip files (QuantumFetcher exports the original captions)
- Optionally remove closed-caption annotations and music notes from overridden captions
- Visual Studio 2026
- Poco
- GoogleTest (unit tests)
See the shared build workflows cpp-checks.yml and cpp-dll.yml, which CI and the release build run, for more detailed steps
- Integrate vcpkg with Visual Studio
- Build the solution
QuantumStreamer.slnxin Visual Studio as x64 Release; the hook is written tox64\Release\loc_x64_f.dll - Run
x64\Release\QuantumStreamer.Tests.exeto run the unit tests - To also check the game's own files, set the
QUANTUMSTREAMER_GAME_DIRenvironment variable to the game folder before running the tests; these tests read its video lists and stored caption overrides and change nothing
The hook takes the place of the game's loc_x64_f.dll and forwards every call to the original library, renamed to loc_x64_f_o.dll.
- In the game's
dx11folder, rename the originalloc_x64_f.dlltoloc_x64_f_o.dll - Copy
loc_x64_f.dllthere, either from the latest build in GitHub Releases or fromx64\Releaseif you compiled it yourself
To uninstall:
- Delete the hook's
loc_x64_f.dllfrom thedx11folder and renameloc_x64_f_o.dllback toloc_x64_f.dll - Copy the kept video list (
data/videoList_original.rmdjby default) overdata/videoList.rmdj, since the patched list points at the hook's local server; verifying the game files in Steam restoresloc_x64_f.dllanddata/videoList.rmdjas well
You can change the default behavior of the hook by creating a config file named after the game executable, QuantumBreak, next to it (in the dx11 folder) or in the game folder.
The following formats are supported:
QuantumBreak.properties- properties fileQuantumBreak.ini- initialization fileQuantumBreak.json- JSON fileQuantumBreak.xml- XML file
In the config, you can set the following values (a dot separates the section and the key). Relative paths start from the game folder. An invalid logging value keeps its default and is reported in the log; an invalid value of any other setting is reported in the log, and the hook does not start its server.
| Key | Description | Allowed values | Default |
|---|---|---|---|
| Logger.ShowConsole | Show hook log in a console window; closing that window closes the game | Boolean | false |
| Logger.SaveToLogFile | Save hook log to file | Boolean | false |
| Logger.LogFile | Path of the log file | String | QuantumStreamer.log |
| Logger.LogLevel_Core | Changes how detailed Core logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_Network | Changes how detailed Network logging is (HTTP Requests/Responses) | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_VideoList | Changes how detailed Video List subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_OfflineStreaming | Changes how detailed Offline Streaming subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Logger.LogLevel_SubtitleOverride | Changes how detailed Subtitle Override subsystem logging is | Poco::Message::Priority | 6 (PRIO_INFORMATION) |
| Server.EpisodesPath | Folder with one subfolder per stored episode | String | ./videos/episodes |
| Server.MaxQueued | Max queued HTTP requests | Integer | 100 |
| Server.MaxThreads | Max threads (HTTP server) | Integer | Logical CPU count or 2 if failed |
| Server.OfflineMode | Disable online streaming, episodes stored locally will continue to work | Boolean | false |
| Server.Port | Port the HTTP server listens on at 127.0.0.1 (game has to point to this port), 0 picks a free port |
Unsigned short | 0 |
| Server.VideoListPath | Path to original, unmodified ./data/videoList.rmdj file |
String | ./data/videoList_original.rmdj |
| Subtitles.ClosedCaptioning | Keep closed-caption annotations such as [ door slams ] in overridden captions |
Boolean | false |
| Subtitles.MusicNotes | Keep ♪♪ music notes in overridden captions |
Boolean | true |
| VideoList.PatchFile | Patch ./data/videoList.rmdj to point to server on startup |
Boolean | true |
Example config that disables online streaming and keeps closed-caption annotations:
[Server]
OfflineMode=true
[Subtitles]
ClosedCaptioning=true
Each stored episode has its own folder, named after the episode, under Server.EpisodesPath (for example videos/episodes/J1A-X1-X2 for episode J1A-X1-X2). QuantumFetcher writes these folders in the Smooth Streaming server layout the hook reads:
| File | Content |
|---|---|
<episode>.ism |
the server manifest; its head names the client manifest |
<episode>.ismc |
the client manifest the game receives |
<episode>_<stream>_<bitrate>.ismv, .isma, .ismt |
the video, audio and caption tracks the server manifest lists, each ending with an mfra fragment index |
The server manifest names the client manifest like this:
<head>
<meta name="clientManifestRelativePath" content="J1A-X1-X2.ismc"/>
</head>A track that is missing or has no valid fragment index is skipped; its fragments are then fetched online unless Server.OfflineMode is on.
A SubRip file in an episode folder whose name contains _captions replaces the caption track of the same name, for example enus_captions.srt replaces the enus_captions track. The file is UTF-8 and holds numbered cues, each with its times and one or more lines of text, separated by blank lines:
1
00:00:07,500 --> 00:00:09,833
EPISODE 1
2
00:00:10,960 --> 00:00:12,500
[ door slams ]
- Who is there?
Text is shown as written: there are no escapes, and markup such as <i> appears literally. A cue whose end time cannot be read is never shown. Annotations in brackets with spaces, such as [ door slams ], and ♪♪ music notes are kept or removed as Subtitles.ClosedCaptioning and Subtitles.MusicNotes say.
- Install the hook and, if needed, create the config file
- Put the episodes downloaded with QuantumFetcher and any caption overrides into
Server.EpisodesPath - Start the game; with the default config, episodes that are not stored keep streaming online as before
When the game starts, the hook:
- Reads the config file and opens a local HTTP server on
127.0.0.1 - Keeps the game's own
data/videoList.rmdjasServer.VideoListPathif no copy is kept yet, then rewritesdata/videoList.rmdjto point at the local server - Indexes the stored episodes and caption overrides
- Serves every episode request: stored files from disk, everything else from the online service unless
Server.OfflineModeis on, with overridden caption tracks rewritten on the way
With VideoList.PatchFile set to false, data/videoList.rmdj is left alone and has to point at the hook already, for example after quantumfetcher videolist patch from QuantumFetcher. Set Server.Port to the port that list uses (QuantumFetcher's default is 10000), and keep the store's copy at Server.VideoListPath, since the hook reads the episodes' online addresses from it.
A kept copy that already points at the local server no longer holds the episodes' online addresses, so the hook removes it and leaves data/videoList.rmdj as it is; verify the game files in Steam to restore the original list. When the kept copy cannot be read, data/videoList.rmdj is left alone as well.
Thanks to:
- r00t0 (for help with decoding
videoList.rmdj)
Special thanks to:
- Remedy Entertainment (for making the game)
- Microsoft Studios (for publishing the game on PC)
