| 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
|
|
|