Skip to content

Commit 6bf09b8

Browse files
address comments
1 parent 720bfe2 commit 6bf09b8

3 files changed

Lines changed: 38 additions & 27 deletions

File tree

WebDriverAgentLib/Routing/FBWebServer.m

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ @interface FBWebServer ()
4747
@property (nonatomic, strong) RoutingHTTPServer *server;
4848
@property (atomic, assign) BOOL keepAlive;
4949
@property (nonatomic, nullable) FBTCPSocket *screenshotsBroadcaster;
50+
@property (nonatomic, nullable, strong) FBMjpegServer *mjpegServer;
5051
@end
5152

5253
@implementation FBWebServer
@@ -130,21 +131,23 @@ - (void)startHTTPServer
130131
- (void)initScreenshotsBroadcaster
131132
{
132133
[self readMjpegSettingsFromEnv];
133-
FBMjpegServer *mjpegServer = [[FBMjpegServer alloc] init];
134+
self.mjpegServer = [[FBMjpegServer alloc] init];
134135
self.screenshotsBroadcaster = [[FBTCPSocket alloc]
135136
initWithPort:(uint16_t)FBConfiguration.mjpegServerPort];
136-
self.screenshotsBroadcaster.delegate = mjpegServer;
137+
self.screenshotsBroadcaster.delegate = self.mjpegServer;
137138
NSError *error;
138139
if (![self.screenshotsBroadcaster startWithError:&error]) {
139140
[FBLogger logFmt:@"Cannot init screenshots broadcaster service on port %@. Original error: %@", @(FBConfiguration.mjpegServerPort), error.description];
140-
[mjpegServer stopStreaming];
141+
[self.mjpegServer stopStreaming];
142+
self.mjpegServer = nil;
141143
self.screenshotsBroadcaster = nil;
142144
}
143145
}
144146

145147
- (void)stopScreenshotsBroadcaster
146148
{
147149
if (nil == self.screenshotsBroadcaster) {
150+
self.mjpegServer = nil;
148151
return;
149152
}
150153

@@ -155,6 +158,7 @@ - (void)stopScreenshotsBroadcaster
155158
self.screenshotsBroadcaster.delegate = nil;
156159
[self.screenshotsBroadcaster stop];
157160
self.screenshotsBroadcaster = nil;
161+
self.mjpegServer = nil;
158162
}
159163

160164
- (void)readMjpegSettingsFromEnv

WebDriverAgentLib/Utilities/FBImageProcessor.m

Lines changed: 23 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,29 +66,31 @@ - (void)submitImageData:(NSData *)image
6666
#pragma clang diagnostic ignored "-Wcompletion-handler"
6767
dispatch_async(self.scalingQueue, ^{
6868
while (YES) {
69-
[self.nextImageLock lock];
70-
NSData *nextImageData = self.nextImage;
71-
self.nextImage = nil;
72-
if (nextImageData == nil) {
73-
self.isScalingScheduled = NO;
69+
@autoreleasepool {
70+
[self.nextImageLock lock];
71+
NSData *nextImageData = self.nextImage;
72+
self.nextImage = nil;
73+
if (nextImageData == nil) {
74+
self.isScalingScheduled = NO;
75+
[self.nextImageLock unlock];
76+
return;
77+
}
7478
[self.nextImageLock unlock];
75-
return;
76-
}
77-
[self.nextImageLock unlock];
7879

79-
// We do not want this value to be too high because then we get images larger in size than original ones
80-
// Although, we also don't want to lose too much of the quality on recompression
81-
CGFloat recompressionQuality = MAX(0.9,
82-
MIN(FBMaxCompressionQuality, FBConfiguration.mjpegServerScreenshotQuality / 100.0));
83-
NSData *thumbnailData = [self.class fixedImageDataWithImageData:nextImageData
84-
scalingFactor:scalingFactor
85-
uti:UTTypeJPEG
86-
compressionQuality:recompressionQuality
87-
// iOS always returns screnshots in portrait orientation, but puts the real value into the metadata
88-
// Use it with care. See https://github.com/appium/WebDriverAgent/pull/812
89-
fixOrientation:FBConfiguration.mjpegShouldFixOrientation
90-
desiredOrientation:nil];
91-
completionHandler(thumbnailData ?: nextImageData);
80+
// We do not want this value to be too high because then we get images larger in size than original ones
81+
// Although, we also don't want to lose too much of the quality on recompression
82+
CGFloat recompressionQuality = MAX(0.9,
83+
MIN(FBMaxCompressionQuality, FBConfiguration.mjpegServerScreenshotQuality / 100.0));
84+
NSData *thumbnailData = [self.class fixedImageDataWithImageData:nextImageData
85+
scalingFactor:scalingFactor
86+
uti:UTTypeJPEG
87+
compressionQuality:recompressionQuality
88+
// iOS always returns screnshots in portrait orientation, but puts the real value into the metadata
89+
// Use it with care. See https://github.com/appium/WebDriverAgent/pull/812
90+
fixOrientation:FBConfiguration.mjpegShouldFixOrientation
91+
desiredOrientation:nil];
92+
completionHandler(thumbnailData ?: nextImageData);
93+
}
9294
}
9395
});
9496
#pragma clang diagnostic pop

WebDriverAgentLib/Utilities/FBMjpegServer.m

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@
2727
static NSString *const SERVER_NAME = @"WDA MJPEG Server";
2828
static const char *QUEUE_NAME = "JPEG Screenshots Provider Queue";
2929

30+
static NSUInteger FBNormalizedMjpegFramerate(NSUInteger framerate)
31+
{
32+
return (0 == framerate || framerate > MAX_FPS) ? MAX_FPS : framerate;
33+
}
34+
3035

3136
@interface FBMjpegServer()
3237

@@ -89,8 +94,8 @@ - (void)streamScreenshot
8994
if (!self.isStreaming) {
9095
return;
9196
}
92-
NSUInteger framerate = FBConfiguration.mjpegServerFramerate;
93-
uint64_t timerInterval = (uint64_t)(1.0 / ((0 == framerate || framerate > MAX_FPS) ? MAX_FPS : framerate) * NSEC_PER_SEC);
97+
NSUInteger framerate = FBNormalizedMjpegFramerate(FBConfiguration.mjpegServerFramerate);
98+
uint64_t timerInterval = (uint64_t)(1.0 / framerate * NSEC_PER_SEC);
9499
uint64_t timeStarted = clock_gettime_nsec_np(CLOCK_MONOTONIC_RAW);
95100
@synchronized (self.listeningClients) {
96101
if (0 == self.listeningClients.count) {
@@ -142,7 +147,7 @@ - (void)sendScreenshot:(NSData *)screenshotData {
142147
}
143148
self.sentFramesCount++;
144149
self.sentBytesCount += chunk.length * self.listeningClients.count;
145-
NSUInteger framerate = MAX(1, MIN(MAX_FPS, FBConfiguration.mjpegServerFramerate));
150+
NSUInteger framerate = FBNormalizedMjpegFramerate(FBConfiguration.mjpegServerFramerate);
146151
if (0 == self.sentFramesCount % framerate) {
147152
[FBLogger verboseLog:[NSString stringWithFormat:@"MJPEG stats: clients=%@ sentFrames=%@ sentBytes=%@",
148153
@(self.listeningClients.count),

0 commit comments

Comments
 (0)