Skip to content
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 16 additions & 9 deletions MUXSDKStats/MUXSDKStats/MUXSDKPlayerBinding.m
Original file line number Diff line number Diff line change
Expand Up @@ -111,8 +111,8 @@ - (void)attachAVPlayer:(AVPlayer *)player {
} else {
[weakSelf dispatchTimeUpdateEvent:time];
}
[weakSelf computeDrift];

[weakSelf computeDriftAndDispatchSeekingIfNecessary];
[weakSelf updateLastPlayheadTime];
}
];
Expand Down Expand Up @@ -811,7 +811,7 @@ - (void)dispatchPlay {
// Note that this computation is done in response to an observed rate change and not a time update
// so we have to both compute our drift and update the playhead time as we do in the time update handler.
if(!_isAdPlaying) {
[self computeDrift];
[self computeDriftAndDispatchSeekingIfNecessary];
[self updateLastPlayheadTime];
}
}
Expand Down Expand Up @@ -845,7 +845,7 @@ - (void)dispatchPause {
[event setPlayerData:playerData];
[MUXSDKCore dispatchEvent:event forPlayer:_name];
_state = MUXSDKPlayerStatePaused;
[self computeDrift];
[self computeDriftAndDispatchSeekingIfNecessary];
}

- (void)dispatchTimeUpdateFromTimer {
Expand Down Expand Up @@ -1092,11 +1092,16 @@ - (void)updateLastPlayheadTimeOnPause {
_lastPlayheadTimeOnPauseUpdated = CFAbsoluteTimeGetCurrent();
}

- (void)computeDrift {
- (void)computeDriftAndDispatchSeekingIfNecessary {
if (!_started) {
// Avoid computing drift until playback has started (meaning play has been called).
return;
}

if (_seeking) {
return;
}

// Determing if we are seeking by infering that we went into the pause state and the playhead moved a lot.
float playheadTimeElapsed = ([self getCurrentPlayheadTimeMs] - _lastPlayheadTimeMs) / 1000;
float wallTimeElapsed = CFAbsoluteTimeGetCurrent() - _lastPlayheadTimeUpdated;
Expand All @@ -1111,17 +1116,19 @@ - (void)computeDrift {
_seeking = YES;
MUXSDKInternalSeekingEvent *event = [[MUXSDKInternalSeekingEvent alloc] init];
MUXSDKPlayerData *playerData = [self getPlayerData];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomTV) {
[self setPlayerPlayheadTime:_lastPlayheadTimeMsOnPause onPlayerData:playerData];
}
[event setPlayerData:playerData];
[MUXSDKCore dispatchEvent:event forPlayer:_name];
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomTV) {
[self setPlayerPlayheadTime:_lastPlayheadTimeMsOnPause
onPlayerData:playerData];
}
} else if (_state == MUXSDKPlayerStatePlaying || _state == MUXSDKPlayerStateBuffering) {
// If seek is called programmatically while the player is playing or buffering it will enter this block, otherwise it will run the upper branch logic
_seeking = YES;
MUXSDKInternalSeekingEvent *seekingEvent = [[MUXSDKInternalSeekingEvent alloc] init];
MUXSDKPlayerData *playerData = [self getPlayerData];
[self setPlayerPlayheadTime:_lastPlayheadTimeMs onPlayerData:playerData];
[self setPlayerPlayheadTime:_lastPlayheadTimeMs
onPlayerData:playerData];
[seekingEvent setPlayerData:playerData];
[MUXSDKCore dispatchEvent:seekingEvent forPlayer:_name];
}
Expand Down