diff --git a/demo/chart/timeline-chart.ts b/demo/chart/timeline-chart.ts index c9517802ff0..0f06269614b 100644 --- a/demo/chart/timeline-chart.ts +++ b/demo/chart/timeline-chart.ts @@ -107,7 +107,7 @@ export class TimelineChart { if (pos.x > chartArea.left - 11) { const scale = this.chartScales[X_AXIS_SECONDS]; if (event.deltaY) { - const direction = event.deltaY / Math.abs(event.deltaY); + const direction = -event.deltaY / Math.abs(event.deltaY); const normal = Math.min(333, Math.abs(event.deltaY)) / 1000; const ease = 1 - (1 - normal) * (1 - normal); this.zoom(scale, pos, ease * direction); diff --git a/src/demux/transmuxer-interface.ts b/src/demux/transmuxer-interface.ts index b30ec0cfcfe..27eee915f54 100644 --- a/src/demux/transmuxer-interface.ts +++ b/src/demux/transmuxer-interface.ts @@ -14,6 +14,7 @@ import type { ChunkMetadata, TransmuxerResult } from '../types/transmuxer'; import type Hls from '../hls'; import type { HlsEventEmitter } from '../events'; import type { PlaylistLevelType } from '../types/loader'; +import type { TypeSupported } from './tsdemuxer'; const MediaSource = getMediaSource() || { isTypeSupported: () => false }; @@ -54,7 +55,7 @@ export default class TransmuxerInterface { this.observer.on(Events.FRAG_DECRYPTED, forwardMessage); this.observer.on(Events.ERROR, forwardMessage); - const typeSupported = { + const typeSupported: TypeSupported = { mp4: MediaSource.isTypeSupported('video/mp4'), mpeg: MediaSource.isTypeSupported('audio/mpeg'), mp3: MediaSource.isTypeSupported('audio/mp4; codecs="mp3"'), @@ -102,7 +103,8 @@ export default class TransmuxerInterface { this.observer, typeSupported, config, - vendor + vendor, + id ); this.worker = null; } @@ -111,7 +113,8 @@ export default class TransmuxerInterface { this.observer, typeSupported, config, - vendor + vendor, + id ); } } diff --git a/src/demux/transmuxer-worker.ts b/src/demux/transmuxer-worker.ts index e7ae8442f97..f69145e3a6c 100644 --- a/src/demux/transmuxer-worker.ts +++ b/src/demux/transmuxer-worker.ts @@ -24,7 +24,8 @@ export default function TransmuxerWorker(self) { observer, data.typeSupported, config, - data.vendor + data.vendor, + data.id ); enableLogs(config.debug); forwardMessage('init', null); diff --git a/src/demux/transmuxer.ts b/src/demux/transmuxer.ts index 767a48fcfdc..330646cf154 100644 --- a/src/demux/transmuxer.ts +++ b/src/demux/transmuxer.ts @@ -4,19 +4,19 @@ import { ErrorTypes, ErrorDetails } from '../errors'; import Decrypter from '../crypt/decrypter'; import AACDemuxer from '../demux/aacdemuxer'; import MP4Demuxer from '../demux/mp4demuxer'; -import TSDemuxer from '../demux/tsdemuxer'; +import TSDemuxer, { TypeSupported } from '../demux/tsdemuxer'; import MP3Demuxer from '../demux/mp3demuxer'; import MP4Remuxer from '../remux/mp4-remuxer'; import PassThroughRemuxer from '../remux/passthrough-remuxer'; -import type { Demuxer, KeyData } from '../types/demuxer'; -import type { Remuxer } from '../types/remuxer'; -import type { TransmuxerResult, ChunkMetadata } from '../types/transmuxer'; import ChunkCache from './chunk-cache'; import { appendUint8Array } from '../utils/mp4-tools'; - import { logger } from '../utils/logger'; +import type { Demuxer, KeyData } from '../types/demuxer'; +import type { Remuxer } from '../types/remuxer'; +import type { TransmuxerResult, ChunkMetadata } from '../types/transmuxer'; import type { HlsConfig } from '../config'; -import { LevelKey } from '../loader/level-key'; +import type { LevelKey } from '../loader/level-key'; +import type { PlaylistLevelType } from '../types/loader'; let now; // performance.now() not available on WebWorker, at least on Safari Desktop @@ -47,9 +47,10 @@ muxConfig.forEach(({ demux }) => { export default class Transmuxer { private observer: HlsEventEmitter; - private typeSupported: any; + private typeSupported: TypeSupported; private config: HlsConfig; - private vendor: any; + private vendor: string; + private id: PlaylistLevelType; private demuxer?: Demuxer; private remuxer?: Remuxer; private decrypter?: Decrypter; @@ -61,14 +62,16 @@ export default class Transmuxer { constructor( observer: HlsEventEmitter, - typeSupported, + typeSupported: TypeSupported, config: HlsConfig, - vendor + vendor: string, + id: PlaylistLevelType ) { this.observer = observer; this.typeSupported = typeSupported; this.config = config; this.vendor = vendor; + this.id = id; } configure(transmuxConfig: TransmuxConfig) { @@ -258,7 +261,8 @@ export default class Transmuxer { textTrack, timeOffset, accurateTimeOffset, - true + true, + this.id ); transmuxResults.push({ remuxResult, @@ -354,7 +358,8 @@ export default class Transmuxer { textTrack, timeOffset, accurateTimeOffset, - false + false, + this.id ); return { remuxResult, @@ -379,7 +384,8 @@ export default class Transmuxer { demuxResult.textTrack, timeOffset, accurateTimeOffset, - false + false, + this.id ); return { remuxResult, diff --git a/src/remux/mp4-remuxer.ts b/src/remux/mp4-remuxer.ts index 3607d59a204..49b83dc17cc 100644 --- a/src/remux/mp4-remuxer.ts +++ b/src/remux/mp4-remuxer.ts @@ -12,6 +12,8 @@ import { RemuxedTrack, RemuxedUserdata, } from '../types/remuxer'; +import { PlaylistLevelType } from '../types/loader'; +import { toMsFromMpegTsClock } from '../utils/timescale-conversion'; import type { AudioSample, AvcSample, @@ -24,7 +26,6 @@ import type { TrackSet } from '../types/track'; import type { SourceBufferName } from '../types/buffer'; import type { Fragment } from '../loader/fragment'; import type { HlsConfig } from '../config'; -import { toMsFromMpegTsClock } from '../utils/timescale-conversion'; const MAX_SILENT_FRAME_DURATION = 10 * 1000; // 10 seconds const AAC_SAMPLES_PER_FRAME = 1024; @@ -116,7 +117,8 @@ export default class MP4Remuxer implements Remuxer { textTrack: DemuxedUserdataTrack, timeOffset: number, accurateTimeOffset: boolean, - flush: boolean + flush: boolean, + playlistType: PlaylistLevelType ): RemuxerResult { let video: RemuxedTrack | undefined; let audio: RemuxedTrack | undefined; @@ -202,7 +204,11 @@ export default class MP4Remuxer implements Remuxer { audioTimeOffset, this.isAudioContiguous, accurateTimeOffset, - enoughVideoSamples ? videoTimeOffset : undefined + hasVideo || + enoughVideoSamples || + playlistType === PlaylistLevelType.AUDIO + ? videoTimeOffset + : undefined ); if (enoughVideoSamples) { const audioTrackLength = audio ? audio.endPTS - audio.startPTS : 0; diff --git a/src/types/remuxer.ts b/src/types/remuxer.ts index a8870a34530..0fbc89d080e 100644 --- a/src/types/remuxer.ts +++ b/src/types/remuxer.ts @@ -8,6 +8,7 @@ import { UserdataSample, } from './demuxer'; import type { SourceBufferName } from './buffer'; +import type { PlaylistLevelType } from './loader'; export interface Remuxer { remux( @@ -17,7 +18,8 @@ export interface Remuxer { textTrack: DemuxedUserdataTrack, timeOffset: number, accurateTimeOffset: boolean, - flush: boolean + flush: boolean, + playlistType: PlaylistLevelType ): RemuxerResult; resetInitSegment( initSegment: Uint8Array | undefined,