/*
 *  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 "sdk/objc/components/capturer/RTCFileVideoCapturer.h"

@interface ARDFileCaptureController ()

@property(nonatomic, strong) RTC_OBJC_TYPE(RTCFileVideoCapturer) * fileCapturer;

@end

@implementation ARDFileCaptureController
@synthesize fileCapturer = _fileCapturer;

- (instancetype)initWithCapturer:(RTC_OBJC_TYPE(RTCFileVideoCapturer) *)capturer {
  self = [super init];
  if (self) {
    _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
