/* * Copyright 2018 The WebRTC Project Authors. All rights reserved. * * Use of this source code is governed by a BSD-style license * that can be found in the LICENSE file in the root of the source * tree. An additional intellectual property rights grant can be found * in the file PATENTS. All contributing project authors may * be found in the AUTHORS file in the root of the source tree. */ #import "ARDBroadcastSampleHandler.h" #import #import "ARDExternalSampleCapturer.h" #import "ARDSettingsModel.h" #import "sdk/objc/api/logging/RTCCallbackLogger.h" #import "sdk/objc/base/RTCLogging.h" @implementation ARDBroadcastSampleHandler { ARDAppClient *_client; RTC_OBJC_TYPE(RTCCallbackLogger) * _callbackLogger; } @synthesize capturer = _capturer; - (instancetype)init { if (self = [super init]) { _callbackLogger = [[RTC_OBJC_TYPE(RTCCallbackLogger) alloc] init]; os_log_t rtc_os_log = os_log_create("com.google.AppRTCMobile", "RTCLog"); [_callbackLogger start:^(NSString *logMessage) { os_log(rtc_os_log, "%{public}s", [logMessage cStringUsingEncoding:NSUTF8StringEncoding]); }]; } return self; } - (void)broadcastStartedWithSetupInfo:(NSDictionary *)setupInfo { // User has requested to start the broadcast. Setup info from the UI extension can be supplied but // optional. ARDSettingsModel *settingsModel = [[ARDSettingsModel alloc] init]; _client = [[ARDAppClient alloc] initWithDelegate:self]; _client.broadcast = YES; NSString *roomName = nil; if (setupInfo[@"roomName"]) { roomName = (NSString *)setupInfo[@"roomName"]; } else { u_int32_t randomRoomSuffix = arc4random_uniform(1000); roomName = [NSString stringWithFormat:@"broadcast_%d", randomRoomSuffix]; } [_client connectToRoomWithId:roomName settings:settingsModel isLoopback:NO]; RTCLog(@"Broadcast started."); } - (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. [_client disconnect]; } - (void)processSampleBuffer:(CMSampleBufferRef)sampleBuffer withType:(RPSampleBufferType)sampleBufferType { switch (sampleBufferType) { case RPSampleBufferTypeVideo: [self.capturer didCaptureSampleBuffer:sampleBuffer]; break; case RPSampleBufferTypeAudioApp: break; case RPSampleBufferTypeAudioMic: break; default: break; } } #pragma mark - ARDAppClientDelegate - (void)appClient:(ARDAppClient *)client didChangeState:(ARDAppClientState)state { switch (state) { case kARDAppClientStateConnected: RTCLog(@"Client connected."); break; case kARDAppClientStateConnecting: RTCLog("Client connecting."); break; case kARDAppClientStateDisconnected: RTCLog(@"Client disconnected."); break; } } - (void)appClient:(ARDAppClient *)client didChangeConnectionState:(RTCIceConnectionState)state { RTCLog(@"ICE state changed: %ld", (long)state); } - (void)appClient:(ARDAppClient *)client didCreateLocalCapturer:(RTC_OBJC_TYPE(RTCCameraVideoCapturer) *)localCapturer { } - (void)appClient:(ARDAppClient *)client didCreateLocalExternalSampleCapturer:(ARDExternalSampleCapturer *)externalSampleCapturer { self.capturer = externalSampleCapturer; } - (void)appClient:(ARDAppClient *)client didReceiveLocalVideoTrack:(RTC_OBJC_TYPE(RTCVideoTrack) *)localVideoTrack { } - (void)appClient:(ARDAppClient *)client didReceiveRemoteVideoTrack:(RTC_OBJC_TYPE(RTCVideoTrack) *)remoteVideoTrack { } - (void)appClient:(ARDAppClient *)client didGetStats:(NSArray *)stats { } - (void)appClient:(ARDAppClient *)client didError:(NSError *)error { RTCLog(@"Error: %@", error); } @end