Skip to content

Commit 9eb3fd7

Browse files
committed
Delay based on rountrip time.
1 parent 364c5ab commit 9eb3fd7

File tree

2 files changed

+18
-50
lines changed

2 files changed

+18
-50
lines changed

Desktop.Core/Services/Viewer.cs

Lines changed: 18 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class Viewer : IDisposable
2525
private const int MinQuality = 20;
2626

2727
private readonly ConcurrentQueue<DateTimeOffset> _fpsQueue = new();
28-
private readonly ConcurrentQueue<ReceivedFrame> _receivedFrames = new();
28+
private readonly ConcurrentQueue<SentFrame> _receivedFrames = new();
2929
public Viewer(ICasterSocket casterSocket,
3030
IScreenCapturer screenCapturer,
3131
IClipboardService clipboardService,
@@ -42,9 +42,8 @@ public Viewer(ICasterSocket casterSocket,
4242
}
4343
public IScreenCapturer Capturer { get; }
4444
public double CurrentFps { get; private set; }
45-
public double AverageMbps { get; private set; }
45+
public double CurrentMbps { get; private set; }
4646
public bool DisconnectRequested { get; set; }
47-
public EncoderParameters EncoderParams { get; private set; }
4847
public bool HasControl { get; set; } = true;
4948
public int ImageQuality { get; private set; } = DefaultQuality;
5049
public bool IsConnected => CasterSocket.IsConnected;
@@ -100,30 +99,21 @@ public void ApplyAutoQuality()
10099
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp > TimeSpan.FromMilliseconds(50),
101100
TimeSpan.FromSeconds(5));
102101

103-
// Wait for pending frames to be received.
102+
// Delay based on roundtrip time to prevent too many frames from queuing up on slow connections.
103+
_ = TaskHelper.DelayUntil(() => PendingSentFrames.Count < 1 / RoundTripLatency.TotalSeconds,
104+
TimeSpan.FromSeconds(5));
105+
106+
// Wait until oldest pending frame is within the past 1 second.
104107
_ = TaskHelper.DelayUntil(() =>
105108
!PendingSentFrames.TryPeek(out var result) || DateTimeOffset.Now - result.Timestamp < TimeSpan.FromSeconds(1),
106109
TimeSpan.FromSeconds(5));
107110

108-
// Estimate how long it will take to send pending frames and adjust quality
109-
var frameSizes = PendingSentFrames.Sum(x => x.FrameSize);
110-
if (AverageMbps > 0 && frameSizes > 0)
111-
{
112-
var pendingMegabits = (double)frameSizes / 1024 / 1024 * 8;
113-
var secondsToSend = pendingMegabits / AverageMbps;
114-
115-
if (secondsToSend > 1)
116-
{
117-
var targetQuality = 1 / secondsToSend * ImageQuality;
118-
ImageQuality = (int)Math.Max(20, targetQuality);
119-
Thread.Sleep(500);
120-
}
121-
}
122111

123112
Debug.WriteLine(
124-
$"Average Mbps: {AverageMbps}. " +
113+
$"Current Mbps: {CurrentMbps}. " +
125114
$"Current FPS: {CurrentFps}. " +
126-
$"Setting quality to {ImageQuality}");
115+
$"Roundtrip Latency: {RoundTripLatency}. " +
116+
$"Image Quality: {ImageQuality}");
127117
}
128118

129119
public void CalculateFps()
@@ -144,24 +134,16 @@ public void DequeuePendingFrame()
144134
if (PendingSentFrames.TryDequeue(out var frame))
145135
{
146136
RoundTripLatency = Time.Now - frame.Timestamp;
147-
148-
_receivedFrames.Enqueue(new ReceivedFrame()
149-
{
150-
FrameSize = frame.FrameSize,
151-
TimeToSend = Time.Now - frame.Timestamp
152-
});
153-
154-
while (_receivedFrames.Count > 20)
155-
{
156-
_receivedFrames.TryDequeue(out _);
157-
}
158-
159-
var megabits = (double)_receivedFrames.Sum(x => x.FrameSize) / 1024 / 1024 * 8;
160-
var secondsSpentSending = _receivedFrames.Sum(x => x.TimeToSend.TotalSeconds);
161-
162-
AverageMbps = megabits / secondsSpentSending;
137+
_receivedFrames.Enqueue(new SentFrame(frame.FrameSize));
163138
}
139+
while (_receivedFrames.TryPeek(out var oldestFrame) &&
140+
Time.Now - oldestFrame.Timestamp > TimeSpan.FromSeconds(1))
141+
{
142+
_receivedFrames.TryDequeue(out _);
143+
}
144+
CurrentMbps = (double)_receivedFrames.Sum(x => x.FrameSize) / 1024 / 1024 * 8;
164145
}
146+
165147
public void Dispose()
166148
{
167149
DisconnectRequested = true;

Shared/Models/ReceivedFrame.cs

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)