NVIDIA driver bug: the crash only some viewers can cause

Sometimes a stream closes by itself in the middle of a session, with nobody touching anything, while the same application works fine for everybody else. The cause is a bug in NVIDIA's graphics driver, set off by the viewer's internet connection rising and falling. On Unreal Engine 5.8 it is already fixed on Eagle 3D Streaming. On Unreal Engine 5.7 there is no fix, but there are two ways around it.

In short: is your application affected?

It depends only on its Unreal Engine version
Your application is built onCan it crash this way?What to do
Unreal Engine 5.8 It could, but Eagle 3D Streaming prevents it. Nothing. The fix has been switched on automatically for every Unreal Engine 5.8 application on Eagle 3D Streaming since Saturday 26 September 2026.

Possible side effect: Epic Games says the fix may cause visual glitches (artefacts) in some applications. None have been seen on Eagle 3D Streaming so far — see How Unreal Engine 5.8 avoids it. If you notice any, kindly inform support@eagle3dstreaming.com. Eagle 3D Streaming is actively looking for any side effect, to weigh it against the fix.
Unreal Engine 5.7 Yes. No fix exists for this version. The best solution is to upgrade to Unreal Engine 5.8. Until then, most viewers will never see it. If a client of yours does report streams closing by themselves, give that client a link that uses the VP9 video format, or one that runs the application on DirectX 11 — see If your application is on 5.7.
Unreal Engine 5.6 or earlier Not seen. None of 5,849 sessions on these versions has ended this way. Nothing.

Moving to Unreal Engine 5.8 is the one change that removes the problem for good on Eagle 3D Streaming.

Why it happens

Five steps, and the fault is in the fourth

Pixel Streaming sends the video to the viewer over WebRTC, the browser technology for live video. Here is what happens, in order:

1 Viewer's connection changes WebRTC notices 2 WebRTC asks Unreal for different video to fit the new speed 3 Unreal adjusts the NVIDIA encoder through the driver 4 NVIDIA driver leaks memory ~3.2 MB, every time round again on every change of the connection after ~1,800 times 5 Windows stops the app the stream closes, no warning
Steps 1 to 3 are normal and happen all the time. Step 4, in red, is the fault in NVIDIA's driver. One trip round the loop is harmless; about 1,800 of them end the stream.
  1. WebRTC measures the viewer's connection, all the time. While the stream runs, it keeps estimating how much the viewer's internet can carry.
  2. When that changes, WebRTC asks Unreal Engine for different video. It asks for video that fits the connection as it is now — a little lighter when it gets worse, a little richer when it gets better. This is normal, and it is what keeps a stream watchable instead of freezing.
  3. Unreal Engine makes that video with the NVIDIA graphics card. The card's video encoder (NVENC) compresses the picture, controlled through NVIDIA's driver, and has to be adjusted each time.
  4. The NVIDIA driver makes a mistake on every adjustment. Each one leaks a little memory that is never given back. One adjustment is harmless. Many hundreds add up. (The adjustments are proven to be the trigger. Whether the leak itself is what finally stops the application, or another symptom of the same driver fault, is not confirmed. It does not change what to do.)
  5. After enough of them, Windows stops the application, and the stream closes with no warning and no error message.

Three findings, from three different places

NVIDIA's finding. A report on NVIDIA's developer forum, which NVIDIA is tracking internally as 6241525, measures about 3.2 MB of memory lost on every encoder adjustment — only for H264 video on the Direct3D 12 route. The same adjustment through Direct3D 11 or CUDA loses nothing, and the lost memory is not given back even when the encoder is shut down. Read the report

Epic Games' finding. Epic's Pixel Streaming bug report measures the application's reserved (committed) memory growing by many gigabytes within minutes, faster when the viewer's connection is poor, and not at all with VP9. An Epic team member confirmed it is a known fault in NVIDIA's drivers, that no driver version is free of it, and that Unreal Engine 5.8 added a way around it while NVIDIA works on a fix. Read the report

Eagle 3D Streaming's finding. Forcing the adjustments on purpose crashed the application thirteen times out of thirteen, after between about 750 and 2,100 of them. Almost every crash ended with the same Windows exit code, 0xC0000409, which means the application stopped itself on a fatal error. Windows' own crash report names where it happened: the faulting module is nvEncodeAPI64.dll, NVIDIA's video encoder — not the application's code. With Unreal Engine 5.8's way around it switched on, the same test ran more than 4,500 adjustments without a crash.

When does it actually crash?

Only after a very large number of changes, over a long session

The question is how often WebRTC asks Unreal Engine to change. Every change is one adjustment, and a crash needs a very large number of them: in Eagle 3D Streaming's tests, between about 750 and 2,100, most often around 1,800. The exact number varies from application to application, with its size and how much of the machine it uses.

That is why a short session is almost always fine. Three or five minutes of streaming is nowhere near enough changes, unless the viewer's connection is jumping up and down constantly. To reach the crash, the changes have to keep coming for a long time.

It is also why the crash almost never shows up when a developer tests the application on their own machine: a local test has a perfect, steady connection, so the changes barely happen.

The most common cause is a poor or unstable connection — mobile data, hotel Wi‑Fi, a busy shared line — because it changes all the time. But a connection does not have to be bad. Here is one example, and it is only one of many ways this can happen:

Viewer 1: steady at 20 Mbit/s safe Viewer 2: 20, 13, 20, 13 … for a long session can crash 20 13
Both viewers have a usable connection. The second keeps changing, and if it keeps changing long enough, the number of adjustments reaches the crash.

A viewer whose connection sits at 20 Mbit/s, drops to 13, comes back to 20, drops to 13 again, and keeps doing that through a long session, has a perfectly usable connection at both levels — and can still reach the crash, because what matters is how many times the connection changes, not how fast it is.

Every one of those changes goes once round this chain:

Viewer's connection 20 → 13 → 20 … WebRTC picks a new bitrate many times a minute Unreal reconfigures the encoder Driver loses ~3.2 MB every single time After ~1,800 Windows stops the application and round again on the next change in bandwidth
Every step except the last is normal, wanted behaviour. The fourth step is a fault in the graphics driver, and the fifth is Windows protecting the machine from the result.

How the test was done. To reproduce it on purpose, the test forced a change five times every second — far more often than a real connection changes. At that rate the application crashed every time, thirteen runs out of thirteen, after between about 750 and 2,100 changes — most often around 1,800, roughly six minutes in. A real viewer's connection changes much less often, so reaching the same number takes much longer. Real viewers' sessions on both Unreal Engine 5.7 and 5.8 have ended this way.

How Unreal Engine 5.8 avoids it

A way around the driver, not a repair of it

The real fix has to come from NVIDIA, in the driver. It has not arrived. Epic Games, who knew about the fault from Unreal Engine 5.7, added a way around it in Unreal Engine 5.8 instead: a setting that sends the video down a different route through the graphics card, one that does not have the leak.

That setting exists only in 5.8 and later. Eagle 3D Streaming switches it on automatically for every Unreal Engine 5.8 application, and has done since Saturday 26 September 2026. There is nothing to set.

A possible side effect. The video now takes a longer route through the graphics card, and Epic Games says this may cause visual glitches (artefacts) in some applications — those built in a particular way with DirectX 12. None have been seen on Eagle 3D Streaming since it was switched on, across the whole fleet. If you notice anything wrong with your picture, kindly inform support@eagle3dstreaming.com. Eagle 3D Streaming is actively looking for any side effect, to weigh it against the fix.

Seeing artefacts? The fix is applied to every Unreal Engine 5.8 application, and there is no setting to turn it off for one application today. If you see glitches in the picture, report them to support@eagle3dstreaming.com, with the application name and what the glitch looks like.

If your application is on 5.7

Two ways around it, for the client who is affected and only for them

The best solution is to upgrade to Unreal Engine 5.8. Until then, 5.7 does not have the 5.8 setting, so it cannot be protected the same way — but there are two ways around the leaking part of the driver. Both cost something, which is why neither is switched on for everybody.

Way around itHow it avoids the bugWhat it costs
1. VP9 video format Uses a different video format instead of H264, which does not go through the part of the driver that leaks. The picture is slightly less sharp, and VP9 is encoded on the streaming machine's CPU rather than its GPU.
2. DirectX 11 Runs the application on DirectX 11 instead of 12. The driver does not leak on that route. Some applications use features that only work on DirectX 12, such as Nanite or hardware ray tracing. In those applications, those parts stop working or look different. Applications that do not use them are unaffected. Check the application on DirectX 11 before sharing it.

Eagle 3D Streaming could switch every 5.7 application to one of these, and chose not to. Only a small share of viewers ever run into this crash — a few sessions in every hundred — while either way around it costs every viewer something. Lowering the quality for everybody to protect a few is not a good trade.

So use one only where it is needed. If a client of yours reports streams closing by themselves, give that client alone a second configuration on VP9 — the steps are on the Codec page — or one with -dx11 in its Parameters To Pass To App field on the Developer tab (turn on Advanced Options first, or the Developer tab is hidden; see Command-line parameters). Everyone else keeps the default, sharper picture.

The rest of this article is the full technical story — how the crash was reproduced, what the exit code means, and how to test for it yourself. None of it is needed to act on the sections above.

How to reproduce it on your own machine

Epic's own server, one script, ten to fifteen minutes

This needs nothing from Eagle 3D Streaming. It crashes an Unreal Engine 5.7 or 5.8 application running on your own machine — 5.8 too, because the fix is only switched on by Eagle 3D Streaming, not by Unreal itself.

Launch the app with -AllowPixelStreamingCommands. Without it, the app refuses the commands this test sends, nothing happens, and the crash cannot be reproduced.

  1. Stream the app locally by following Testing locally: from your own browser. Its launch line already includes -AllowPixelStreamingCommands.
  2. Open player.html in Notepad. It is at <build>\<Project>\Samples\PixelStreaming2\WebServers\SignallingWebServer\www\player.html, in the packaged build from that guide.
  3. Paste the script below just before </body> and save. The whole file is one long line: use Notepad's Find (Ctrl+F) to locate </body>.
  4. Reload http://127.0.0.1 (or http://localhost) and press CLICK TO START. The script starts by itself: a counter appears in the top-left corner once the video is playing.
  5. Leave it running for ten to fifteen minutes. The application closes by itself. Remove the script from player.html afterwards.
<script>
// Crash test: asks Unreal to change the video bitrate five times a second,
// as a viewer's changing connection would. Starts by itself.
(function () {
  var HIGH = 8000000, LOW = 1000000, EVERY_MS = 200;
  var count = 0, high = false;
  function start() {
    var box = document.createElement('div');
    box.style.cssText = 'position:fixed;top:8px;left:8px;z-index:99999;padding:6px 10px;' +
      'background:rgba(0,0,0,.75);color:#fff;font:14px sans-serif;border-radius:6px';
    box.textContent = 'Crash test: waiting for the video...';
    document.body.appendChild(box);
    setInterval(function () {
      var ps = window.pixelStreaming;
      if (!ps) return;
      high = !high;
      var value = high ? HIGH : LOW;
      // Older plugin, then Pixel Streaming 2: whichever the app uses takes effect.
      var a = ps.emitConsoleCommand('PixelStreaming.WebRTC.MaxBitrate ' + value);
      var b = ps.emitConsoleCommand('PixelStreaming2.WebRTC.MaxBitrate ' + value);
      if (!a && !b) {
        if (count === 0) box.textContent = 'Crash test: waiting for the video... ' +
          '(stuck? add -AllowPixelStreamingCommands)';
        return;
      }
      count++;
      box.textContent = 'Crash test running: ' + count + ' changes sent';
    }, EVERY_MS);
  }
  // Works wherever it is pasted: waits for the page body if it is not there yet.
  if (document.body) start(); else document.addEventListener('DOMContentLoaded', start);
})();
</script>

What happened when Eagle 3D Streaming ran it. The application closed every time, thirteen runs out of thirteen, after between about 750 and 2,100 changes — most often around 1,800, roughly six minutes in. The first seven runs alone spanned four machines, three graphics driver versions and two graphics card generations. The same test with no changes did not crash. A real viewer's connection changes far less often than five times a second, which is why real sessions take much longer to get there. Re-checked on 29 September 2026 with Epic's own page and this exact script, on an Unreal Engine 5.7 application: it closed after about 2,700 changes, nine minutes in, with exit code 0xC0000409.

If it does not crash: check that the counter is climbing, and that the delivered bitrate in the player's statistics panel drops to about 1 Mbit/s. If the counter is stuck at "waiting", the app was not launched with -AllowPixelStreamingCommands.

The exit code, and what it actually means

0xC0000409 — and why it does not mean "out of memory"

Almost every one of these crashes ends with the same exit code. If an application is stopping by itself with this code, this article is very likely about it:

exit code   3221226505      (the same number written in hexadecimal: 0xC0000409)
name        STATUS_STACK_BUFFER_OVERRUN

It means the application ended itself through Windows' fail-fast mechanism, which stops a process at once on a fatal condition. Many different faults end this way; the name STATUS_STACK_BUFFER_OVERRUN is historical and does not mean a buffer was actually overrun. That is why it vanishes with no crash dialog and often nothing in its own log.

  • It is not an out-of-memory error. The machines in the tests had plenty of memory free.
  • It is not a bug in the application's own code. The same build runs for hours when the trigger is absent.

Occasionally the same fault ends with plain exit code 3 instead. Different route, same event.

Stop the crash, and test it yourself

One extra launch argument, then the same test again

Once the crash reproduces, stop it by adding one more argument to the same launch line you used for the test, then run the whole test again.

Unreal Engine 5.8

Add this to the launch line — it is the way around the bug that Epic Games provides:

-AVCodecs.NvEnc.D3D12UsesCUDA=true

To build it into the application instead, so it also applies when you stream outside Eagle 3D Streaming, add this to Config/DefaultGame.ini and repackage:

[AVCodecs.NvEnc]
D3D12UsesCUDA=True

Run the same test again. The application should no longer crash. In Eagle 3D Streaming's tests, with this argument added the same machines ran more than 4,500 changes without a crash, where they had crashed at about 1,800 without it. Those tests were on RTX 50 series cards. The crash also happens on RTX 40 series, where the argument has not been measured yet.

If you notice any visual glitches (artefacts) in the picture with it on, please tell support@eagle3dstreaming.com. Epic Games warns this can happen, and Eagle 3D Streaming is still looking out for it.

Unreal Engine 5.7

The argument above does not exist in 5.7. Add one of these instead, and run the test again:

-PixelStreamingEncoderCodec=VP9

streams in VP9 instead of H264 (slightly less sharp, and encoded on the CPU rather than the GPU), or

-dx11

runs the application on DirectX 11 (features that need DirectX 12, such as Nanite, stop working or look different).

Updating the graphics driver does not fix it. The newest driver tested, newer than the one in NVIDIA's report, still crashed.

Tell Eagle 3D Streaming what you found

Please send your results to support@eagle3dstreaming.com — whether it crashed, after how long, and whether the argument stopped it. Eagle 3D Streaming is keen to know how well this helps others reproduce the issue and get familiar with it, and whether you found anything these tests missed.

Last updated