Skip to content

Commit 697a71b

Browse files
committed
Update 2.1.1 - See changelog.txt for details
1 parent 75938f6 commit 697a71b

File tree

9 files changed

+91
-17
lines changed

9 files changed

+91
-17
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ StreamLight is a fork of [Moonlight](https://github.com/moonlight-stream/moonlig
1414

1515
StreamLight is currently available for **Windows only**.
1616

17-
## ✨ What's New in Version 2.1.0 — "The Telemetry Update" (27/03/2026)
17+
## ✨ What's New in Version 2.1.1 — "The Jitter Update" (28/03/2026)
18+
19+
### 🔧 Improvements
20+
* **Jitter in session telemetry** — RTT variance (jitter) is now sampled from `LiGetEstimatedRttInfo` and included in every SESSIONDATA batch; StreamTweak stores `jitter_avg` and `jitter_max` per sample alongside the existing RTT metrics
21+
22+
### Previously in 2.1.0 — "The Telemetry Update"
1823

1924
### 🚀 New Features
2025
* **Session telemetry reporting** — StreamLight streams real-time client-side metrics to StreamTweak during active sessions: FPS, frame drops, RTT, decode latency, and bitrate are sampled every second and transmitted in periodic batches; StreamTweak uses this data to generate a session quality report visible in the Logs tab (requires StreamTweak 5.2.0 or later on the host PC)

StreamLight.iss

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
; =====================================================
2-
; StreamLight v2.1.0 - Installer
2+
; StreamLight v2.1.1 - Installer
33
; A Moonlight fork with StreamTweak integration
44
; =====================================================
55
#define AppName "StreamLight"
6-
#define AppVersion "2.1.0"
6+
#define AppVersion "2.1.1"
77
#define AppPublisher "FoggyBytes"
88
#define AppURL "https://github.com/FoggyBytes/StreamLight"
99
#define AppExeName "StreamLight.exe"

app/SessionTelemetrySampler.cpp

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -58,12 +58,15 @@ void SessionTelemetrySampler::onSampleTimer()
5858
s.drops = ws.drops;
5959
s.rttAvg = (float)ws.rttAvgMs;
6060
s.rttMax = s.rttAvg; // will be refined across batch as running max
61+
s.jitterAvg = (float)ws.jitterMs;
62+
s.jitterMax = s.jitterAvg; // will be refined across batch as running max
6163
s.decodeMs = ws.decodeAvgMs;
6264
s.bitrateMbps = ws.bitrateMbps;
6365

6466
// Track running min/max within the current batch
65-
if (s.fpsAvg < m_BatchFpsMin) m_BatchFpsMin = s.fpsAvg;
66-
if (s.rttAvg > m_BatchRttMax) m_BatchRttMax = s.rttAvg;
67+
if (s.fpsAvg < m_BatchFpsMin) m_BatchFpsMin = s.fpsAvg;
68+
if (s.rttAvg > m_BatchRttMax) m_BatchRttMax = s.rttAvg;
69+
if (s.jitterAvg > m_BatchJitterMax) m_BatchJitterMax = s.jitterAvg;
6770

6871
m_Samples.append(s);
6972
}
@@ -82,8 +85,9 @@ void SessionTelemetrySampler::flushAndStop()
8285

8386
// Apply batch-level min/max before the final send
8487
for (auto& s : m_Samples) {
85-
s.fpsMin = m_BatchFpsMin;
86-
s.rttMax = m_BatchRttMax;
88+
s.fpsMin = m_BatchFpsMin;
89+
s.rttMax = m_BatchRttMax;
90+
s.jitterMax = m_BatchJitterMax;
8791
}
8892

8993
// Use synchronous send: exec() has returned and the Qt event loop is no
@@ -97,18 +101,20 @@ void SessionTelemetrySampler::sendBatch()
97101
{
98102
if (m_Samples.isEmpty()) return;
99103

100-
// Apply batch-level min/max to each sample's fpsMin and rttMax fields
104+
// Apply batch-level min/max to each sample's fpsMin, rttMax, jitterMax fields
101105
for (auto& s : m_Samples) {
102-
s.fpsMin = m_BatchFpsMin;
103-
s.rttMax = m_BatchRttMax;
106+
s.fpsMin = m_BatchFpsMin;
107+
s.rttMax = m_BatchRttMax;
108+
s.jitterMax = m_BatchJitterMax;
104109
}
105110

106111
QString json = buildBatchJson();
107112
m_Bridge.sendSessionData(m_HostAddress, json);
108113

109114
m_Samples.clear();
110-
m_BatchFpsMin = 9999.0f;
111-
m_BatchRttMax = -1.0f;
115+
m_BatchFpsMin = 9999.0f;
116+
m_BatchRttMax = -1.0f;
117+
m_BatchJitterMax = -1.0f;
112118
}
113119

114120
QString SessionTelemetrySampler::buildBatchJson() const
@@ -121,6 +127,8 @@ QString SessionTelemetrySampler::buildBatchJson() const
121127
obj[QStringLiteral("drops")] = s.drops;
122128
obj[QStringLiteral("rtt_avg")] = qRound(s.rttAvg * 10) / 10.0;
123129
obj[QStringLiteral("rtt_max")] = qRound(s.rttMax * 10) / 10.0;
130+
obj[QStringLiteral("jitter_avg")] = qRound(s.jitterAvg * 10) / 10.0;
131+
obj[QStringLiteral("jitter_max")] = qRound(s.jitterMax * 10) / 10.0;
124132
obj[QStringLiteral("decode_ms")] = qRound(s.decodeMs * 10) / 10.0;
125133
obj[QStringLiteral("bitrate_mbps")] = qRound(s.bitrateMbps * 10) / 10.0;
126134
samplesArray.append(obj);

app/SessionTelemetrySampler.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ private slots:
4646
int drops;
4747
float rttAvg;
4848
float rttMax;
49+
float jitterAvg;
50+
float jitterMax;
4951
float decodeMs;
5052
float bitrateMbps;
5153
};
@@ -63,6 +65,7 @@ private slots:
6365
QList<TelemetrySample> m_Samples;
6466

6567
// Running min/max within the current batch (reset each flush)
66-
float m_BatchFpsMin = 9999.0f;
67-
float m_BatchRttMax = -1.0f;
68+
float m_BatchFpsMin = 9999.0f;
69+
float m_BatchRttMax = -1.0f;
70+
float m_BatchJitterMax = -1.0f;
6871
};

app/streaming/video/ffmpeg.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2200,8 +2200,10 @@ TelemetryWindowStats FFmpegVideoDecoder::getLastWindowStats() const
22002200
// only called on the dst of addVideoStats, never written into m_ActiveWndVideoStats
22012201
// itself). Read it directly from Limelight at sample time instead.
22022202
uint32_t rtt = 0, rttVariance = 0;
2203-
if (LiGetEstimatedRttInfo(&rtt, &rttVariance))
2204-
out.rttAvgMs = (int)rtt;
2203+
if (LiGetEstimatedRttInfo(&rtt, &rttVariance)) {
2204+
out.rttAvgMs = (int)rtt;
2205+
out.jitterMs = (int)rttVariance;
2206+
}
22052207

22062208
return out;
22072209
}

app/streaming/video/ffmpeg.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ struct TelemetryWindowStats {
1717
double fpsAvg;
1818
int drops;
1919
int rttAvgMs;
20+
int jitterMs; // RTT variance from LiGetEstimatedRttInfo
2021
float decodeAvgMs;
2122
float bitrateMbps;
2223
};

app/version.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
2.1.0
1+
2.1.1

changelog.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ StreamLight - ChangeLog - Developed by FoggyBytes
44

55
https://github.com/FoggyBytes/StreamLight
66

7+
Version 2.1.1 - The "Jitter Update" (28/03/2026)
8+
------------------------------------------
9+
10+
🔧 IMPROVEMENTS:
11+
• Session telemetry — jitter reporting: RTT variance (jitter) is now collected from LiGetEstimatedRttInfo and included in every SESSIONDATA batch alongside RTT; StreamTweak stores jitter_avg and jitter_max per sample and can use them in future quality analysis
12+
713
Version 2.1.0 - The "Telemetry Update" (27/03/2026)
814
------------------------------------------
915

scripts/incremental_build.ps1

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
param([switch]$CopyOnly)
2+
3+
$ErrorActionPreference = 'Stop'
4+
5+
$env:PATH = 'C:\Qt\6.7.3\msvc2022_64\bin;C:\Program Files\7-Zip;' + $env:PATH
6+
7+
$vcvars = 'C:\Program Files\Microsoft Visual Studio\18\Community\VC\Auxiliary\Build\vcvars64.bat'
8+
9+
# Capture all environment variables set by vcvars64.bat
10+
# Add the VS installer dir to PATH within the cmd session so vcvars internal
11+
# calls to vswhere.exe (located there) succeed.
12+
$vsInstallerDir = 'C:\Program Files (x86)\Microsoft Visual Studio\Installer'
13+
$cmdLine = "set PATH=$vsInstallerDir;%PATH% && `"$vcvars`" && set"
14+
$envVars = & cmd /c $cmdLine 2>&1
15+
foreach ($line in $envVars) {
16+
if ($line -match '^([^=]+)=(.*)$') {
17+
[System.Environment]::SetEnvironmentVariable($Matches[1], $Matches[2], 'Process')
18+
}
19+
}
20+
Write-Host "MSVC env activated"
21+
Write-Host "cl: $(& where.exe cl 2>&1)"
22+
23+
if ($CopyOnly) {
24+
Write-Host "--- CopyOnly mode: skipping compile ---"
25+
} else {
26+
$jom = 'C:\Users\marce\source\repos\StreamLight\scripts\jom.exe'
27+
$buildDir = 'C:\Users\marce\source\repos\StreamLight\build\build-x64-release\app'
28+
29+
Push-Location $buildDir
30+
try {
31+
Write-Host "--- Running jom -j8 release ---"
32+
& $jom -j8 release
33+
$jomExit = $LASTEXITCODE
34+
} finally {
35+
Pop-Location
36+
}
37+
38+
if ($jomExit -ne 0) {
39+
Write-Error "jom failed with exit code $jomExit"
40+
exit $jomExit
41+
}
42+
Write-Host "--- jom succeeded ---"
43+
}
44+
45+
$src = 'C:\Users\marce\source\repos\StreamLight\build\build-x64-release\app\release\StreamLight.exe'
46+
$dst = 'C:\Users\marce\source\repos\StreamLight\build\deploy-x64-release\StreamLight.exe'
47+
Copy-Item $src $dst -Force
48+
Write-Host "--- EXE copied to deploy directory ---"
49+
Write-Host "DONE"

0 commit comments

Comments
 (0)