@@ -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 ;
0 commit comments