Skip to content

Commit

Permalink
Shift DateRange metadata Cue times when media timeline is shifted
Browse files Browse the repository at this point in the history
Fixes #6203
  • Loading branch information
robwalch committed Feb 19, 2024
1 parent 75468ef commit 1c91036
Showing 1 changed file with 33 additions and 10 deletions.
43 changes: 33 additions & 10 deletions src/controller/id3-track-controller.ts
Expand Up @@ -10,10 +10,12 @@ import {
isDateRangeCueAttribute,
isSCTE35Attribute,
} from '../loader/date-range';
import { LevelDetails } from '../loader/level-details';
import { MetadataSchema } from '../types/demuxer';
import type {
BufferFlushingData,
FragParsingMetadataData,
LevelPTSUpdatedData,
LevelUpdatedData,
MediaAttachedData,
} from '../types/events';
Expand Down Expand Up @@ -95,7 +97,7 @@ class ID3TrackController implements ComponentAPI {
this._registerListeners();
}

destroy() {
public destroy() {
this._unregisterListeners();
this.id3Track = null;
this.media = null;
Expand All @@ -112,6 +114,7 @@ class ID3TrackController implements ComponentAPI {
hls.on(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);
hls.on(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);
hls.on(Events.LEVEL_UPDATED, this.onLevelUpdated, this);
hls.on(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);
}

private _unregisterListeners() {
Expand All @@ -122,17 +125,18 @@ class ID3TrackController implements ComponentAPI {
hls.off(Events.FRAG_PARSING_METADATA, this.onFragParsingMetadata, this);
hls.off(Events.BUFFER_FLUSHING, this.onBufferFlushing, this);
hls.off(Events.LEVEL_UPDATED, this.onLevelUpdated, this);
hls.off(Events.LEVEL_PTS_UPDATED, this.onLevelPtsUpdated, this);
}

// Add ID3 metatadata text track.
protected onMediaAttached(
private onMediaAttached(
event: Events.MEDIA_ATTACHED,
data: MediaAttachedData,
): void {
this.media = data.media;
}

protected onMediaDetaching(): void {
private onMediaDetaching(): void {
if (!this.id3Track) {
return;
}
Expand All @@ -146,13 +150,13 @@ class ID3TrackController implements ComponentAPI {
this.dateRangeCuesAppended = {};
}

createTrack(media: HTMLMediaElement): TextTrack {
private createTrack(media: HTMLMediaElement): TextTrack {
const track = this.getID3Track(media.textTracks) as TextTrack;
track.mode = 'hidden';
return track;
}

getID3Track(textTracks: TextTrackList): TextTrack | void {
private getID3Track(textTracks: TextTrackList): TextTrack | void {
if (!this.media) {
return;
}
Expand All @@ -169,7 +173,7 @@ class ID3TrackController implements ComponentAPI {
return this.media.addTextTrack('metadata', 'id3');
}

onFragParsingMetadata(
private onFragParsingMetadata(
event: Events.FRAG_PARSING_METADATA,
data: FragParsingMetadataData,
) {
Expand Down Expand Up @@ -243,7 +247,7 @@ class ID3TrackController implements ComponentAPI {
}
}

updateId3CueEnds(startTime: number, type: MetadataSchema) {
private updateId3CueEnds(startTime: number, type: MetadataSchema) {
const cues = this.id3Track?.cues;
if (cues) {
for (let i = cues.length; i--; ) {
Expand All @@ -259,7 +263,7 @@ class ID3TrackController implements ComponentAPI {
}
}

onBufferFlushing(
private onBufferFlushing(
event: Events.BUFFER_FLUSHING,
{ startOffset, endOffset, type }: BufferFlushingData,
) {
Expand Down Expand Up @@ -291,7 +295,23 @@ class ID3TrackController implements ComponentAPI {
}
}

onLevelUpdated(event: Events.LEVEL_UPDATED, { details }: LevelUpdatedData) {
private onLevelUpdated(
event: Events.LEVEL_UPDATED,
{ details }: LevelUpdatedData,
) {
this.updateDateRangeCues(details, true);
}

private onLevelPtsUpdated(
event: Events.LEVEL_PTS_UPDATED,
data: LevelPTSUpdatedData,
) {
if (Math.abs(data.drift) > 0.01) {
this.updateDateRangeCues(data.details);
}
}

private updateDateRangeCues(details: LevelDetails, removeOldCues?: true) {
if (
!this.media ||
!details.hasProgramDateTime ||
Expand All @@ -303,7 +323,7 @@ class ID3TrackController implements ComponentAPI {
const { dateRanges } = details;
const ids = Object.keys(dateRanges);
// Remove cues from track not found in details.dateRanges
if (id3Track) {
if (id3Track && removeOldCues) {
const idsToRemove = Object.keys(dateRangeCuesAppended).filter(
(id) => !ids.includes(id),
);
Expand Down Expand Up @@ -376,6 +396,9 @@ class ID3TrackController implements ComponentAPI {
if (cue) {
if (durationKnown && !appendedDateRangeCues.durationKnown) {
cue.endTime = endTime;
} else if (Math.abs(cue.startTime - startTime) > 0.01) {
cue.startTime = startTime;
cue.endTime = endTime;
}
} else if (Cue) {
let data = dateRange.attr[key];
Expand Down

0 comments on commit 1c91036

Please sign in to comment.