123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- /*
- * Copyright @ 2021-present 8x8, Inc.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
- #import "SampleHandler.h"
- #import "SocketConnection.h"
- #import "SampleUploader.h"
- #import "DarwinNotificationCenter.h"
-
- @interface SampleHandler ()
-
- @property (nonatomic, retain) SocketConnection *clientConnection;
- @property (nonatomic, retain) SampleUploader *uploader;
-
- @end
-
- @implementation SampleHandler
-
- - (instancetype)init {
- self = [super init];
- if (self) {
- self.clientConnection = [[SocketConnection alloc] initWithFilePath:self.socketFilePath];
- [self setupConnection];
-
- self.uploader = [[SampleUploader alloc] initWithConnection:self.clientConnection];
- }
-
- return self;
- }
-
- - (void)broadcastStartedWithSetupInfo:(NSDictionary<NSString *,NSObject *> *)setupInfo {
- // User has requested to start the broadcast. Setup info from the UI extension can be supplied but optional.
- NSLog(@"broadcast started");
-
- [[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStartedNotification];
- [self openConnection];
- }
-
- - (void)broadcastPaused {
- // User has requested to pause the broadcast. Samples will stop being delivered.
- }
-
- - (void)broadcastResumed {
- // User has requested to resume the broadcast. Samples delivery will resume.
- }
-
- - (void)broadcastFinished {
- // User has requested to finish the broadcast.
- [[DarwinNotificationCenter sharedInstance] postNotificationWithName:kBroadcastStoppedNotification];
- [self.clientConnection close];
- }
-
- - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType {
- static NSUInteger frameCount = 0;
- switch (sampleBufferType) {
- case RPSampleBufferTypeVideo:
- // adjust frame rate by using every third frame
- if (++frameCount%3 == 0 && self.uploader.isReady) {
- [self.uploader sendSample:sampleBuffer];
- }
- break;
-
- default:
- break;
- }
- }
-
- // MARK: Private Methods
-
- - (NSString *)socketFilePath {
- // the appGroupIdentifier must match the value provided in the app's info.plist for the RTCAppGroupIdentifier key
- NSString *appGroupIdentifier = @"group.org.jitsi.meet.appgroup";
- NSURL *sharedContainer = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:appGroupIdentifier];
- NSString *socketFilePath = [[sharedContainer URLByAppendingPathComponent:@"rtc_SSFD"] path];
-
- return socketFilePath;
- }
-
- - (void)setupConnection {
- __weak __typeof(self) weakSelf = self;
- self.clientConnection.didClose = ^(NSError *error) {
- NSLog(@"client connection did close: %@", error);
- if (error) {
- [weakSelf finishBroadcastWithError:error];
- }
- else {
- NSInteger JMScreenSharingStopped = 10001;
- NSError *customError = [NSError errorWithDomain:RPRecordingErrorDomain
- code:JMScreenSharingStopped
- userInfo:@{NSLocalizedDescriptionKey: @"Screen sharing stopped"}];
- [weakSelf finishBroadcastWithError:customError];
- }
- };
- }
-
- - (void)openConnection {
- dispatch_queue_t queue = dispatch_queue_create("org.jitsi.meet.broadcast.connectTimer", 0);
- dispatch_source_t timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, queue);
- dispatch_source_set_timer(timer, dispatch_walltime(NULL, 0), 0.1 * NSEC_PER_SEC, 0.1 * NSEC_PER_SEC);
-
- dispatch_source_set_event_handler(timer, ^{
- BOOL success = [self.clientConnection open];
- if (success) {
- dispatch_source_cancel(timer);
- }
- });
-
- dispatch_resume(timer);
- }
-
- @end
|