Skip to content

Streaming & WebRTC

GFN uses WebRTC (and its own native RTC variant) to stream game video and audio from the rig to the client. The streaming stack lives primarily in vendor_beautified.js.

Stream Backends

BackendRegistry ValueDescription
LIBWEBRTCStreamServerModeOverride=1Standard libwebrtc
NATIVE_RTCStreamServerModeOverride=2NVIDIA's NativeRTC (default for all clients)

Default for all clients:

json
{
  "StreamServerMode": 2,
  "EnableNativeRTCAllClients": true,
  "EnableNativeRtcSeparateStreams": 1,
  "EnableWebRtcSeparateStreams": 1
}

Network Test (Pre-Session)

Before every session, the client runs a network quality test:

javascript
// From vendor_beautified.js
NetworkTest: {
  startNetworkTest()       // Initiate test
  stopNetworkTest()        // Cancel test
  getNetworkTestExceptionTelemetryEvent()
  getNetworkTestHttpTelemetryEvent()
}

// User-Agent for network test requests
USER_AGENT: "GFN-PC/1.0 (WebRTC) NetworkTest/0.0.51"

Results feed into networkTestSessionId tracked in telemetry.

ICE Connection

WebRTC ICE is used to establish the peer connection:

Error CodeNameDescription
0x8004000CNVST_STREAMING_ICE_CONNECTION_FAILEDICE establishment failed
0x8004000DNVST_STREAMING_ICE_CONNECTION_DISCONNECTEDICE connection lost

Codec Support

Codec selection is dynamic based on client/server capabilities:

CodecControl FlagCondition
H.264DefaultAll clients
HEVC/H.265HevcEnable=1TV clients at 1440p/4K, 4K sessions
AV1Enabled by defaultDisabled on half-GPU instances

4K Encoding

For 4K sessions, two-pass encoding can be overridden per game:

json
{
  "name": "Disable4k2Pass_ForSpecificGames4K60",
  "filters": [
    { "key": "sessionRequestData.clientRequestMonitorSettings.framesPerSecond", "value": "60" },
    { "key": "sessionRequestData.appId", "value": "101606111,100838211,..." }
  ]
}

Frame Pacing

Minimum target frame time controls the effective FPS cap:

minTargetFrameTimeUs: 7936  →  1,000,000 / 7936 ≈ 126 FPS max

Applied on both macOS and Windows clients.

Separate Streams

When EnableNativeRtcSeparateStreams=1, video and audio use separate WebRTC tracks:

  • EnableWebRtcSeparateStreams: libwebrtc path
  • EnableNativeRtcSeparateStreams: NativeRTC path
  • DisableNativeRtcSeparateStreams=0: Ensure separate streams not disabled

Surround Sound

Enabled for native Windows/macOS clients ≥ v2.0.52.0:

javascript
surroundBrowser: 1        // 7.1 surround audio
separateMicStream: 1      // Separate microphone stream

GRC (Game Ready Check)

Enabled for Windows and macOS clients:

json
{
  "name": "EnableGrc_WindowsMacOSX",
  "filters": [{ "key": "sessionRequestData.clientPlatformName", "value": "Windows,MacOSX" }]
}

Stream Server Configuration

Key registry values managed by GameStream:

Registry KeyTypeDescription
StreamServerModeREG_SZStream backend mode
StreamServerModeOverrideREG_SZPer-session override
HdrSupportedREG_DWORDHDR output enabled
Enable4kREG_DWORD4K resolution
Enable1440pREG_DWORD1440p resolution
Enable7_1ForGFNREG_DWORD7.1 audio
Allow120FpsModeSetREG_DWORD120 FPS
DynamicFrlFramePacingREG_DWORDDynamic frame pacing
EnableStreamerMinidumpREG_DWORDCrash dump collection
Av1DisableREG_DWORDDisable AV1 encoding
HevcEnableREG_DWORDEnable HEVC

Bundle Port

json
{
  "general.nativeRtcOnBundlePort": 1
}

NativeRTC uses a single bundled port for all media (mux audio+video).

NACK (Retransmission)

Hysteresis for retransmission requests, enabled for native clients:

json
{
  "name": "EnableNackHysteresisLength",
  "filters": [{ "key": "clientInfo.clientType", "value": "NATIVE" }],
  "settingParameters": [
    { "key": "video[0].nackHysteresisLengthUs", "value": "4000" }
  ]
}

Enabled for Windows and macOS native clients:

json
{
  "vqos[0].statsProcessorThread.flags": 255,
  "vqos[0].sendEndOfSessionQosTelemetry": 1
}

admindesk.top — Reversed & documented from Asgard rig backups and GCIS plugin binaries.