You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
61 lines
1.9 KiB
61 lines
1.9 KiB
//
|
|
// SCManagedVideoCapturerTimeObserver.m
|
|
// Snapchat
|
|
//
|
|
// Created by Michel Loenngren on 4/3/17.
|
|
// Copyright © 2017 Snapchat, Inc. All rights reserved.
|
|
//
|
|
|
|
#import "SCManagedVideoCapturerTimeObserver.h"
|
|
|
|
#import "SCTimedTask.h"
|
|
|
|
#import <SCFoundation/SCAssertWrapper.h>
|
|
#import <SCFoundation/SCLog.h>
|
|
#import <SCFoundation/SCThreadHelpers.h>
|
|
|
|
@implementation SCManagedVideoCapturerTimeObserver {
|
|
NSMutableArray<SCTimedTask *> *_tasks;
|
|
BOOL _isProcessing;
|
|
}
|
|
|
|
- (instancetype)init
|
|
{
|
|
if (self = [super init]) {
|
|
_tasks = [NSMutableArray new];
|
|
_isProcessing = NO;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)addTimedTask:(SCTimedTask *_Nonnull)task
|
|
{
|
|
SCAssert(!_isProcessing,
|
|
@"[SCManagedVideoCapturerTimeObserver] Trying to add an SCTimedTask after streaming started.");
|
|
SCAssert(CMTIME_IS_VALID(task.targetTime),
|
|
@"[SCManagedVideoCapturerTimeObserver] Trying to add an SCTimedTask with invalid time.");
|
|
[_tasks addObject:task];
|
|
[_tasks sortUsingComparator:^NSComparisonResult(SCTimedTask *_Nonnull obj1, SCTimedTask *_Nonnull obj2) {
|
|
return (NSComparisonResult)CMTimeCompare(obj2.targetTime, obj1.targetTime);
|
|
}];
|
|
SCLogGeneralInfo(@"[SCManagedVideoCapturerTimeObserver] Adding task: %@, task count: %lu", task,
|
|
(unsigned long)_tasks.count);
|
|
}
|
|
|
|
- (void)processTime:(CMTime)relativePresentationTime
|
|
sessionStartTimeDelayInSecond:(CGFloat)sessionStartTimeDelayInSecond
|
|
{
|
|
_isProcessing = YES;
|
|
SCTimedTask *last = _tasks.lastObject;
|
|
while (last && last.task && CMTimeCompare(relativePresentationTime, last.targetTime) >= 0) {
|
|
[_tasks removeLastObject];
|
|
void (^task)(CMTime relativePresentationTime, CGFloat sessionStartTimeDelay) = last.task;
|
|
last.task = nil;
|
|
runOnMainThreadAsynchronously(^{
|
|
task(relativePresentationTime, sessionStartTimeDelayInSecond);
|
|
});
|
|
last = _tasks.lastObject;
|
|
}
|
|
}
|
|
|
|
@end
|