diff --git a/examples/BUILD.gn b/examples/BUILD.gn index 525caca0f0..01d73a48dc 100644 --- a/examples/BUILD.gn +++ b/examples/BUILD.gn @@ -249,8 +249,6 @@ if (is_ios || (is_mac && target_cpu != "x86")) { testonly = true sources = [ "objc/AppRTCMobile/ios/ARDAppDelegate.m", - "objc/AppRTCMobile/ios/ARDFileCaptureController.h", - "objc/AppRTCMobile/ios/ARDFileCaptureController.m", "objc/AppRTCMobile/ios/ARDMainView.h", "objc/AppRTCMobile/ios/ARDMainView.m", "objc/AppRTCMobile/ios/ARDMainViewController.h", @@ -313,9 +311,6 @@ if (is_ios || (is_mac && target_cpu != "x86")) { bundle_data("AppRTCMobile_ios_bundle_data") { sources = [ "objc/AppRTCMobile/ios/resources/Roboto-Regular.ttf", - - # Sample video taken from https://media.xiph.org/video/derf/ - "objc/AppRTCMobile/ios/resources/foreman.mp4", "objc/AppRTCMobile/ios/resources/iPhone5@2x.png", "objc/AppRTCMobile/ios/resources/iPhone6@2x.png", "objc/AppRTCMobile/ios/resources/iPhone6p@3x.png", @@ -425,7 +420,6 @@ if (is_ios || (is_mac && target_cpu != "x86")) { testonly = true sources = [ "objc/AppRTCMobile/tests/ARDAppClient_xctest.mm", - "objc/AppRTCMobile/tests/ARDFileCaptureController_xctest.mm", "objc/AppRTCMobile/tests/ARDSettingsModel_xctest.mm", ] deps = [ diff --git a/examples/objc/AppRTCMobile/ARDAppClient.h b/examples/objc/AppRTCMobile/ARDAppClient.h index 5054c28676..8c27b345c6 100644 --- a/examples/objc/AppRTCMobile/ARDAppClient.h +++ b/examples/objc/AppRTCMobile/ARDAppClient.h @@ -9,6 +9,8 @@ */ #import + +#import "WebRTC/RTCCameraVideoCapturer.h" #import "WebRTC/RTCPeerConnection.h" #import "WebRTC/RTCVideoTrack.h" @@ -24,8 +26,6 @@ typedef NS_ENUM(NSInteger, ARDAppClientState) { @class ARDAppClient; @class ARDSettingsModel; @class RTCMediaConstraints; -@class RTCCameraVideoCapturer; -@class RTCFileVideoCapturer; // The delegate is informed of pertinent events and will be called on the // main queue. @@ -52,10 +52,6 @@ typedef NS_ENUM(NSInteger, ARDAppClientState) { - (void)appClient:(ARDAppClient *)client didGetStats:(NSArray *)stats; -@optional -- (void)appClient:(ARDAppClient *)client -didCreateLocalFileCapturer:(RTCFileVideoCapturer *)fileCapturer; - @end // Handles connections to the AppRTC server for a given room. Methods on this diff --git a/examples/objc/AppRTCMobile/ARDAppClient.m b/examples/objc/AppRTCMobile/ARDAppClient.m index 1c41a723f2..f753828f75 100644 --- a/examples/objc/AppRTCMobile/ARDAppClient.m +++ b/examples/objc/AppRTCMobile/ARDAppClient.m @@ -15,7 +15,6 @@ #import "WebRTC/RTCCameraVideoCapturer.h" #import "WebRTC/RTCConfiguration.h" #import "WebRTC/RTCFileLogger.h" -#import "WebRTC/RTCFileVideoCapturer.h" #import "WebRTC/RTCIceServer.h" #import "WebRTC/RTCLogging.h" #import "WebRTC/RTCMediaConstraints.h" @@ -691,24 +690,21 @@ static int const kKbpsMultiplier = 1000; } - (RTCVideoTrack *)createLocalVideoTrack { - if ([_settings currentAudioOnlySettingFromStore]) { - return nil; - } - - RTCVideoSource *source = [_factory videoSource]; - + RTCVideoTrack* localVideoTrack = nil; + // The iOS simulator doesn't provide any sort of camera capture + // support or emulation (http://goo.gl/rHAnC1) so don't bother + // trying to open a local stream. #if !TARGET_IPHONE_SIMULATOR - RTCCameraVideoCapturer *capturer = [[RTCCameraVideoCapturer alloc] initWithDelegate:source]; - [_delegate appClient:self didCreateLocalCapturer:capturer]; - -#else - if (@available(iOS 10, *)) { - RTCFileVideoCapturer *fileCapturer = [[RTCFileVideoCapturer alloc] initWithDelegate:source]; - [_delegate appClient:self didCreateLocalFileCapturer:fileCapturer]; + if (![_settings currentAudioOnlySettingFromStore]) { + RTCVideoSource *source = [_factory videoSource]; + RTCCameraVideoCapturer *capturer = [[RTCCameraVideoCapturer alloc] initWithDelegate:source]; + [_delegate appClient:self didCreateLocalCapturer:capturer]; + localVideoTrack = + [_factory videoTrackWithSource:source + trackId:kARDVideoTrackId]; } #endif - - return [_factory videoTrackWithSource:source trackId:kARDVideoTrackId]; + return localVideoTrack; } #pragma mark - Collider methods diff --git a/examples/objc/AppRTCMobile/ARDSettingsModel.m b/examples/objc/AppRTCMobile/ARDSettingsModel.m index a4eea731d4..0a2bee66e7 100644 --- a/examples/objc/AppRTCMobile/ARDSettingsModel.m +++ b/examples/objc/AppRTCMobile/ARDSettingsModel.m @@ -169,12 +169,20 @@ NS_ASSUME_NONNULL_BEGIN - (void)registerStoreDefaults { NSString *defaultVideoResolutionSetting = [self defaultVideoResolutionSetting]; + BOOL audioOnly = (defaultVideoResolutionSetting.length == 0); + +// The iOS simulator doesn't provide any sort of camera capture +// support or emulation (http://goo.gl/rHAnC1) so don't bother +// trying to open a local stream. +#if TARGET_IPHONE_SIMULATOR + audioOnly = YES; +#endif NSData *codecData = [NSKeyedArchiver archivedDataWithRootObject:[self defaultVideoCodecSetting]]; [ARDSettingsStore setDefaultsForVideoResolution:[self defaultVideoResolutionSetting] videoCodec:codecData bitrate:nil - audioOnly:NO + audioOnly:audioOnly createAecDump:NO useLevelController:NO useManualAudioConfig:YES]; diff --git a/examples/objc/AppRTCMobile/ios/ARDFileCaptureController.m b/examples/objc/AppRTCMobile/ios/ARDFileCaptureController.m deleted file mode 100644 index d61bfe2d98..0000000000 --- a/examples/objc/AppRTCMobile/ios/ARDFileCaptureController.m +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright 2017 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 "ARDFileCaptureController.h" - -#import "WebRTC/RTCFileVideoCapturer.h" - -@interface ARDFileCaptureController () - -@property(nonatomic, strong) RTCFileVideoCapturer *fileCapturer; - -@end - -@implementation ARDFileCaptureController -@synthesize fileCapturer = _fileCapturer; - -- (instancetype)initWithCapturer:(RTCFileVideoCapturer *)capturer { - if (self = [super init]) { - _fileCapturer = capturer; - } - return self; -} - -- (void)startCapture { - [self startFileCapture]; -} - -- (void)startFileCapture { - [self.fileCapturer startCapturingFromFileNamed:@"foreman.mp4" - onError:^(NSError *_Nonnull error) { - NSLog(@"Error %@", error.userInfo); - }]; -} - -- (void)stopCapture { - [self.fileCapturer stopCapture]; -} -@end diff --git a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m index e5c9e64bc2..ad5bc80d4b 100644 --- a/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m +++ b/examples/objc/AppRTCMobile/ios/ARDVideoCallViewController.m @@ -11,11 +11,9 @@ #import "ARDVideoCallViewController.h" #import "WebRTC/RTCAudioSession.h" -#import "WebRTC/RTCCameraVideoCapturer.h" #import "ARDAppClient.h" #import "ARDCaptureController.h" -#import "ARDFileCaptureController.h" #import "ARDSettingsModel.h" #import "ARDVideoCallView.h" #import "WebRTC/RTCAVFoundationVideoSource.h" @@ -34,7 +32,6 @@ ARDAppClient *_client; RTCVideoTrack *_remoteVideoTrack; ARDCaptureController *_captureController; - ARDFileCaptureController *_fileCaptureController NS_AVAILABLE_IOS(10); AVAudioSessionPortOverride _portOverride; } @@ -104,14 +101,6 @@ [_captureController startCapture]; } -- (void)appClient:(ARDAppClient *)client - didCreateLocalFileCapturer:(RTCFileVideoCapturer *)fileCapturer { - if (@available(iOS 10, *)) { - _fileCaptureController = [[ARDFileCaptureController alloc] initWithCapturer:fileCapturer]; - [_fileCaptureController startCapture]; - } -} - - (void)appClient:(ARDAppClient *)client didReceiveLocalVideoTrack:(RTCVideoTrack *)localVideoTrack { } @@ -198,8 +187,6 @@ _videoCallView.localVideoView.captureSession = nil; [_captureController stopCapture]; _captureController = nil; - [_fileCaptureController stopCapture]; - _fileCaptureController = nil; [_client disconnect]; [_delegate viewControllerDidFinish:self]; } diff --git a/examples/objc/AppRTCMobile/ios/resources/foreman.mp4 b/examples/objc/AppRTCMobile/ios/resources/foreman.mp4 deleted file mode 100644 index ccffbf4722..0000000000 Binary files a/examples/objc/AppRTCMobile/ios/resources/foreman.mp4 and /dev/null differ diff --git a/examples/objc/AppRTCMobile/tests/ARDFileCaptureController_xctest.mm b/examples/objc/AppRTCMobile/tests/ARDFileCaptureController_xctest.mm deleted file mode 100644 index e734f102d4..0000000000 --- a/examples/objc/AppRTCMobile/tests/ARDFileCaptureController_xctest.mm +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright 2017 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 -#import -#import - -#import "ARDFileCaptureController.h" - -#import "WebRTC/RTCFileVideoCapturer.h" - -NS_CLASS_AVAILABLE_IOS(10) -@interface ARDFileCaptureControllerTests : XCTestCase - -@property(nonatomic, strong) ARDFileCaptureController *fileCaptureController; -@property(nonatomic, strong) id fileCapturerMock; - -@end - -@implementation ARDFileCaptureControllerTests - -@synthesize fileCaptureController = _fileCaptureController; -@synthesize fileCapturerMock = _fileCapturerMock; - -- (void)setUp { - [super setUp]; - self.fileCapturerMock = OCMClassMock([RTCFileVideoCapturer class]); - self.fileCaptureController = - [[ARDFileCaptureController alloc] initWithCapturer:self.fileCapturerMock]; -} - -- (void)tearDown { - self.fileCaptureController = nil; - [self.fileCapturerMock stopMocking]; - self.fileCapturerMock = nil; - [super tearDown]; -} - -- (void)testCaptureIsStarted { - [[self.fileCapturerMock expect] startCapturingFromFileNamed:[OCMArg any] onError:[OCMArg any]]; - - [self.fileCaptureController startCapture]; - - [self.fileCapturerMock verify]; -} - -- (void)testCaptureIsStoped { - [[self.fileCapturerMock expect] stopCapture]; - - [self.fileCaptureController stopCapture]; - - [self.fileCapturerMock verify]; -} - -@end diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn index a923a6d62a..787ca8c13c 100644 --- a/sdk/BUILD.gn +++ b/sdk/BUILD.gn @@ -273,8 +273,8 @@ if (is_ios || is_mac) { ] if (is_ios) { sources += [ + "objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h", "objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m", - "objc/Framework/Headers/WebRTC/RTCFileVideoCapturer.h", ] } libs = [ "AVFoundation.framework" ] @@ -520,22 +520,20 @@ if (is_ios || is_mac) { } if (rtc_include_tests) { - if (is_ios) { + # TODO(denicija):remove second part of this check. + if (is_ios && (current_cpu == "arm64" || use_ios_simulator)) { rtc_source_set("sdk_unittests_sources") { testonly = true include_dirs = [ "objc/Framework/Headers", "objc/Framework/Classes", ] - sources = [ - "objc/Framework/UnitTests/RTCFileVideoCapturer_xctest.mm", + # TODO(denicija): Once more sources are included, + # move the second part of the check on line 516 here + # when adding this file to the sources + "objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm", ] - - if (current_cpu == "arm64" || use_ios_simulator) { - sources += [ "objc/Framework/UnitTests/RTCMTLVideoView_xctest.mm" ] - } - if (use_ios_simulator) { # Only include this file on simulator, as it's already # included in device builds. @@ -561,26 +559,14 @@ if (is_ios || is_mac) { ] } - bundle_data("sdk_unittests_bundle_data") { - # Sample video taken from https://media.xiph.org/video/derf/ - sources = [ - "objc/Framework/UnitTests/foreman.mp4", - ] - outputs = [ - "{{bundle_resources_dir}}/{{source_file_part}}", - ] - } - rtc_ios_xctest_test("sdk_unittests") { info_plist = "//test/ios/Info.plist" sources = [ "objc/Framework/UnitTests/main.m", ] - _bundle_id_suffix = ios_generic_test_bundle_id_suffix extra_substitutions = [ "GTEST_BUNDLE_ID_SUFFIX=$_bundle_id_suffix" ] deps = [ - ":sdk_unittests_bundle_data", ":sdk_unittests_sources", ] ldflags = [ "-all_load" ] @@ -674,7 +660,6 @@ if (is_ios || is_mac) { "objc/Framework/Headers/WebRTC/RTCDispatcher.h", "objc/Framework/Headers/WebRTC/RTCEAGLVideoView.h", "objc/Framework/Headers/WebRTC/RTCFieldTrials.h", - "objc/Framework/Headers/WebRTC/RTCFileVideoCapturer.h", "objc/Framework/Headers/WebRTC/RTCIceCandidate.h", "objc/Framework/Headers/WebRTC/RTCIceServer.h", "objc/Framework/Headers/WebRTC/RTCIntervalRange.h", diff --git a/examples/objc/AppRTCMobile/ios/ARDFileCaptureController.h b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h similarity index 54% rename from examples/objc/AppRTCMobile/ios/ARDFileCaptureController.h rename to sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h index 7e0387de3c..c8793ca172 100644 --- a/examples/objc/AppRTCMobile/ios/ARDFileCaptureController.h +++ b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.h @@ -9,32 +9,18 @@ */ #import - -@class RTCFileVideoCapturer; +#import /** - * Controls a file capturer. + * RTCVideoCapturer that reads buffers from file. + * + * Per design, the file capturer can only be run once and once stopped it cannot run again. + * To run another file capture session, create new instance of the class. */ NS_CLASS_AVAILABLE_IOS(10) -@interface ARDFileCaptureController : NSObject +@interface RTCFileVideoCapturer : RTCVideoCapturer -/** - * Creates instance of the controller. - * - * @param capturer The capturer to be controlled. - */ -- (instancetype)initWithCapturer:(RTCFileVideoCapturer *)capturer; - -/** - * Starts the file capturer. - * - * Possible errors produced by the capturer will be logged. - */ -- (void)startCapture; - -/** - * Immediately stops capturer. - */ +- (void)startCapturingFromFileNamed:(NSString *)nameOfFile; - (void)stopCapture; @end diff --git a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m index 07cb2c6668..178a958041 100644 --- a/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m +++ b/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m @@ -8,91 +8,60 @@ * be found in the AUTHORS file in the root of the source tree. */ -#import "WebRTC/RTCFileVideoCapturer.h" +#import "RTCFileVideoCapturer.h" #import "WebRTC/RTCLogging.h" #import "WebRTC/RTCVideoFrameBuffer.h" -NSString *const kRTCFileVideoCapturerErrorDomain = @"org.webrtc.RTCFileVideoCapturer"; - -typedef NS_ENUM(NSInteger, RTCFileVideoCapturerErrorCode) { - RTCFileVideoCapturerErrorCode_CapturerRunning = 2000, - RTCFileVideoCapturerErrorCode_FileNotFound -}; - -typedef NS_ENUM(NSInteger, RTCFileVideoCapturerStatus) { - RTCFileVideoCapturerStatusNotInitialized, - RTCFileVideoCapturerStatusStarted, - RTCFileVideoCapturerStatusStopped -}; - @implementation RTCFileVideoCapturer { AVAssetReader *_reader; AVAssetReaderTrackOutput *_outTrack; - RTCFileVideoCapturerStatus _status; + BOOL _capturerStopped; CMTime _lastPresentationTime; dispatch_queue_t _frameQueue; - NSURL *_fileURL; } -- (void)startCapturingFromFileNamed:(NSString *)nameOfFile - onError:(RTCFileVideoCapturerErrorBlock)errorBlock { - if (_status == RTCFileVideoCapturerStatusStarted) { - NSError *error = - [NSError errorWithDomain:kRTCFileVideoCapturerErrorDomain - code:RTCFileVideoCapturerErrorCode_CapturerRunning - userInfo:@{NSUnderlyingErrorKey : @"Capturer has been started."}]; - - errorBlock(error); - return; - } else { - _status = RTCFileVideoCapturerStatusStarted; - } - +- (void)startCapturingFromFileNamed:(NSString *)nameOfFile { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + if (_reader && _reader.status == AVAssetReaderStatusReading) { + RTCLog("Capturer exists and reads another file. Start capture request failed."); + return; + } NSString *pathForFile = [self pathForFileName:nameOfFile]; if (!pathForFile) { - NSString *errorString = - [NSString stringWithFormat:@"File %@ not found in bundle", nameOfFile]; - NSError *error = [NSError errorWithDomain:kRTCFileVideoCapturerErrorDomain - code:RTCFileVideoCapturerErrorCode_FileNotFound - userInfo:@{NSUnderlyingErrorKey : errorString}]; - errorBlock(error); + RTCLog("File %@ not found in bundle", nameOfFile); return; } _lastPresentationTime = CMTimeMake(0, 0); - _fileURL = [NSURL fileURLWithPath:pathForFile]; - [self setupReaderOnError:errorBlock]; + NSURL *URLForFile = [NSURL fileURLWithPath:pathForFile]; + AVURLAsset *asset = [AVURLAsset URLAssetWithURL:URLForFile options:nil]; + + NSArray *allTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; + NSError *error = nil; + _reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; + if (error) { + RTCLog("File reader failed with error: %@", error); + return; + } + + NSDictionary *options = @{ + (NSString *) + kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) + }; + _outTrack = [[AVAssetReaderTrackOutput alloc] initWithTrack:allTracks.firstObject + outputSettings:options]; + [_reader addOutput:_outTrack]; + + [_reader startReading]; + RTCLog(@"File capturer started reading"); + [self readNextBuffer]; }); } -- (void)setupReaderOnError:(RTCFileVideoCapturerErrorBlock)errorBlock { - AVURLAsset *asset = [AVURLAsset URLAssetWithURL:_fileURL options:nil]; - - NSArray *allTracks = [asset tracksWithMediaType:AVMediaTypeVideo]; - NSError *error = nil; - - _reader = [[AVAssetReader alloc] initWithAsset:asset error:&error]; - if (error) { - errorBlock(error); - return; - } - - NSDictionary *options = @{ - (NSString *)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_420YpCbCr8BiPlanarFullRange) - }; - _outTrack = - [[AVAssetReaderTrackOutput alloc] initWithTrack:allTracks.firstObject outputSettings:options]; - [_reader addOutput:_outTrack]; - - [_reader startReading]; - RTCLog(@"File capturer started reading"); - [self readNextBuffer]; -} - (void)stopCapture { - _status = RTCFileVideoCapturerStatusStopped; + _capturerStopped = YES; RTCLog(@"File capturer stopped."); } @@ -119,19 +88,12 @@ typedef NS_ENUM(NSInteger, RTCFileVideoCapturerStatus) { } - (void)readNextBuffer { - if (_status == RTCFileVideoCapturerStatusStopped) { + if (_reader.status != AVAssetReaderStatusReading || _capturerStopped) { [_reader cancelReading]; _reader = nil; return; } - if (_reader.status == AVAssetReaderStatusCompleted) { - [_reader cancelReading]; - _reader = nil; - [self setupReaderOnError:nil]; - return; - } - CMSampleBufferRef sampleBuffer = [_outTrack copyNextSampleBuffer]; if (!sampleBuffer) { [self readNextBuffer]; diff --git a/sdk/objc/Framework/Headers/WebRTC/RTCFileVideoCapturer.h b/sdk/objc/Framework/Headers/WebRTC/RTCFileVideoCapturer.h deleted file mode 100644 index 7b898e494c..0000000000 --- a/sdk/objc/Framework/Headers/WebRTC/RTCFileVideoCapturer.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright 2017 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 -#import - -NS_ASSUME_NONNULL_BEGIN - -/** - * Error passing block. - */ -typedef void (^RTCFileVideoCapturerErrorBlock)(NSError *error); - -/** - * Captures buffers from bundled video file. - * - * See @c RTCVideoCapturer for more info on capturers. - */ -RTC_EXPORT - -NS_CLASS_AVAILABLE_IOS(10) -@interface RTCFileVideoCapturer : RTCVideoCapturer - -/** - * Starts asynchronous capture of frames from video file. - * - * Capturing is not started if error occurs. Underlying error will be - * relayed in the errorBlock if one is provided. - * Successfully captured video frames will be passed to the delegate. - * - * @param nameOfFile The name of the bundled video file to be read. - * @errorBlock block to be executed upon error. - */ -- (void)startCapturingFromFileNamed:(NSString *)nameOfFile - onError:(__nullable RTCFileVideoCapturerErrorBlock)errorBlock; - -/** - * Immediately stops capture. - */ -- (void)stopCapture; -@end - -NS_ASSUME_NONNULL_END diff --git a/sdk/objc/Framework/UnitTests/RTCFileVideoCapturer_xctest.mm b/sdk/objc/Framework/UnitTests/RTCFileVideoCapturer_xctest.mm deleted file mode 100644 index 5cf39414b6..0000000000 --- a/sdk/objc/Framework/UnitTests/RTCFileVideoCapturer_xctest.mm +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright 2017 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 "WebRTC/RTCFileVideoCapturer.h" - -#import - -#include "rtc_base/gunit.h" - -NSString *const kTestFileName = @"foreman.mp4"; -static const int kTestTimeoutMs = 5 * 1000; // 5secs. - -@interface MockCapturerDelegate : NSObject - -@property(nonatomic, assign) NSInteger capturedFramesCount; - -@end - -@implementation MockCapturerDelegate -@synthesize capturedFramesCount = _capturedFramesCount; - -- (void)capturer:(RTCVideoCapturer *)capturer didCaptureVideoFrame:(RTCVideoFrame *)frame { - self.capturedFramesCount++; -} - -@end - -NS_CLASS_AVAILABLE_IOS(10) -@interface RTCFileVideoCapturerTests : XCTestCase - -@property(nonatomic, strong) RTCFileVideoCapturer *capturer; -@property(nonatomic, strong) MockCapturerDelegate *mockDelegate; - -@end - -@implementation RTCFileVideoCapturerTests -@synthesize capturer = _capturer; -@synthesize mockDelegate = _mockDelegate; - -- (void)setUp { - self.mockDelegate = [[MockCapturerDelegate alloc] init]; - self.capturer = [[RTCFileVideoCapturer alloc] initWithDelegate:self.mockDelegate]; -} - -- (void)tearDown { - self.capturer = nil; - self.mockDelegate = nil; -} - -- (void)testCaptureWhenFileNotInBundle { - __block BOOL errorOccured = NO; - - RTCFileVideoCapturerErrorBlock errorBlock = ^void(NSError *error) { - errorOccured = YES; - }; - - [self.capturer startCapturingFromFileNamed:@"not_in_bundle.mov" onError:errorBlock]; - ASSERT_TRUE_WAIT(errorOccured, kTestTimeoutMs); -} - -- (void)testSecondStartCaptureCallFails { - __block BOOL secondError = NO; - - RTCFileVideoCapturerErrorBlock firstErrorBlock = ^void(NSError *error) { - // This block should never be called. - NSLog(@"Error: %@", [error userInfo]); - ASSERT_TRUE(false); - }; - - RTCFileVideoCapturerErrorBlock secondErrorBlock = ^void(NSError *error) { - secondError = YES; - }; - - [self.capturer startCapturingFromFileNamed:kTestFileName onError:firstErrorBlock]; - [self.capturer startCapturingFromFileNamed:kTestFileName onError:secondErrorBlock]; - - ASSERT_TRUE_WAIT(secondError, kTestTimeoutMs); -} - -- (void)testStartStopCapturer { - if (@available(iOS 10, *)) { - [self.capturer startCapturingFromFileNamed:kTestFileName onError:nil]; - - __block BOOL done = NO; - __block NSInteger capturedFrames = -1; - NSInteger capturedFramesAfterStop = -1; - - // We're dispatching the `stopCapture` with delay to ensure the capturer has - // had the chance to capture several frames. - dispatch_time_t captureDelay = dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC); // 2secs. - dispatch_after(captureDelay, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ - capturedFrames = self.mockDelegate.capturedFramesCount; - [self.capturer stopCapture]; - done = YES; - }); - WAIT(done, kTestTimeoutMs); - - capturedFramesAfterStop = self.mockDelegate.capturedFramesCount; - ASSERT_TRUE(capturedFrames != -1); - ASSERT_EQ(capturedFrames, capturedFramesAfterStop); - } -} - -@end diff --git a/sdk/objc/Framework/UnitTests/foreman.mp4 b/sdk/objc/Framework/UnitTests/foreman.mp4 deleted file mode 100644 index ccffbf4722..0000000000 Binary files a/sdk/objc/Framework/UnitTests/foreman.mp4 and /dev/null differ