| Index: webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m | 
| diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m b/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m | 
| deleted file mode 100644 | 
| index 178a9580414a10424e621b8a12c9e7cd5c24cea4..0000000000000000000000000000000000000000 | 
| --- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/RTCFileVideoCapturer.m | 
| +++ /dev/null | 
| @@ -1,163 +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 "RTCFileVideoCapturer.h" | 
| - | 
| -#import "WebRTC/RTCLogging.h" | 
| -#import "WebRTC/RTCVideoFrameBuffer.h" | 
| - | 
| -@implementation RTCFileVideoCapturer { | 
| -  AVAssetReader *_reader; | 
| -  AVAssetReaderTrackOutput *_outTrack; | 
| -  BOOL _capturerStopped; | 
| -  CMTime _lastPresentationTime; | 
| -  dispatch_queue_t _frameQueue; | 
| -} | 
| - | 
| -- (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) { | 
| -      RTCLog("File %@ not found in bundle", nameOfFile); | 
| -      return; | 
| -    } | 
| - | 
| -    _lastPresentationTime = CMTimeMake(0, 0); | 
| - | 
| -    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)stopCapture { | 
| -  _capturerStopped = YES; | 
| -  RTCLog(@"File capturer stopped."); | 
| -} | 
| - | 
| -#pragma mark - Private | 
| - | 
| -- (nullable NSString *)pathForFileName:(NSString *)fileName { | 
| -  NSArray *nameComponents = [fileName componentsSeparatedByString:@"."]; | 
| -  if (nameComponents.count != 2) { | 
| -    return nil; | 
| -  } | 
| - | 
| -  NSString *path = | 
| -      [[NSBundle mainBundle] pathForResource:nameComponents[0] ofType:nameComponents[1]]; | 
| -  return path; | 
| -} | 
| - | 
| -- (dispatch_queue_t)frameQueue { | 
| -  if (!_frameQueue) { | 
| -    _frameQueue = dispatch_queue_create("org.webrtc.filecapturer.video", DISPATCH_QUEUE_SERIAL); | 
| -    dispatch_set_target_queue(_frameQueue, | 
| -                              dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0)); | 
| -  } | 
| -  return _frameQueue; | 
| -} | 
| - | 
| -- (void)readNextBuffer { | 
| -  if (_reader.status != AVAssetReaderStatusReading || _capturerStopped) { | 
| -    [_reader cancelReading]; | 
| -    _reader = nil; | 
| -    return; | 
| -  } | 
| - | 
| -  CMSampleBufferRef sampleBuffer = [_outTrack copyNextSampleBuffer]; | 
| -  if (!sampleBuffer) { | 
| -    [self readNextBuffer]; | 
| -    return; | 
| -  } | 
| -  if (CMSampleBufferGetNumSamples(sampleBuffer) != 1 || !CMSampleBufferIsValid(sampleBuffer) || | 
| -      !CMSampleBufferDataIsReady(sampleBuffer)) { | 
| -    [self readNextBuffer]; | 
| -    return; | 
| -  } | 
| - | 
| -  [self publishSampleBuffer:sampleBuffer]; | 
| -} | 
| - | 
| -- (void)publishSampleBuffer:(CMSampleBufferRef)sampleBuffer { | 
| -  CMTime presentationTime = CMSampleBufferGetPresentationTimeStamp(sampleBuffer); | 
| -  Float64 presentationDifference = | 
| -      CMTimeGetSeconds(CMTimeSubtract(presentationTime, _lastPresentationTime)); | 
| -  _lastPresentationTime = presentationTime; | 
| -  int64_t presentationDifferenceRound = lroundf(presentationDifference * NSEC_PER_SEC); | 
| - | 
| -  __block dispatch_source_t timer = [self createStrictTimer]; | 
| -  // Strict timer that will fire |presentationDifferenceRound| ns from now and never again. | 
| -  dispatch_source_set_timer(timer, | 
| -                            dispatch_time(DISPATCH_TIME_NOW, presentationDifferenceRound), | 
| -                            DISPATCH_TIME_FOREVER, | 
| -                            0); | 
| -  dispatch_source_set_event_handler(timer, ^{ | 
| -    dispatch_source_cancel(timer); | 
| -    timer = nil; | 
| - | 
| -    CVPixelBufferRef pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); | 
| -    if (!pixelBuffer) { | 
| -      CFRelease(sampleBuffer); | 
| -      dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | 
| -        [self readNextBuffer]; | 
| -      }); | 
| -      return; | 
| -    } | 
| - | 
| -    RTCCVPixelBuffer *rtcPixelBuffer = [[RTCCVPixelBuffer alloc] initWithPixelBuffer:pixelBuffer]; | 
| -    NSTimeInterval timeStampSeconds = CACurrentMediaTime(); | 
| -    int64_t timeStampNs = lroundf(timeStampSeconds * NSEC_PER_SEC); | 
| -    RTCVideoFrame *videoFrame = | 
| -        [[RTCVideoFrame alloc] initWithBuffer:rtcPixelBuffer rotation:0 timeStampNs:timeStampNs]; | 
| -    CFRelease(sampleBuffer); | 
| - | 
| -    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ | 
| -      [self readNextBuffer]; | 
| -    }); | 
| - | 
| -    [self.delegate capturer:self didCaptureVideoFrame:videoFrame]; | 
| -  }); | 
| -  dispatch_activate(timer); | 
| -} | 
| - | 
| -- (dispatch_source_t)createStrictTimer { | 
| -  dispatch_source_t timer = dispatch_source_create( | 
| -      DISPATCH_SOURCE_TYPE_TIMER, 0, DISPATCH_TIMER_STRICT, [self frameQueue]); | 
| -  return timer; | 
| -} | 
| - | 
| -- (void)dealloc { | 
| -  [self stopCapture]; | 
| -} | 
| - | 
| -@end | 
|  |