Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix fmp4 segmented audio group switching #3748

Merged
merged 1 commit into from Apr 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 4 additions & 0 deletions api-extractor/report/hls.js.api.md
Expand Up @@ -81,6 +81,8 @@ export interface AudioTrackSwitchedData {
//
// @public (undocumented)
export interface AudioTrackSwitchingData {
// (undocumented)
groupId: string;
// (undocumented)
id: number;
// (undocumented)
Expand Down Expand Up @@ -2007,6 +2009,8 @@ export interface SubtitleTracksUpdatedData {
//
// @public (undocumented)
export interface SubtitleTrackSwitchData {
// (undocumented)
groupId?: string;
// (undocumented)
id: number;
// (undocumented)
Expand Down
9 changes: 3 additions & 6 deletions src/controller/audio-stream-controller.ts
Expand Up @@ -7,7 +7,6 @@ import { FragmentState } from './fragment-tracker';
import { Level } from '../types/level';
import { PlaylistLevelType } from '../types/loader';
import { Fragment, ElementaryStreamTypes, Part } from '../loader/fragment';
import FragmentLoader from '../loader/fragment-loader';
import ChunkCache from '../demux/chunk-cache';
import TransmuxerInterface from '../demux/transmuxer-interface';
import type { TransmuxerResult } from '../types/transmuxer';
Expand Down Expand Up @@ -364,6 +363,7 @@ class AudioStreamController
event: Events.AUDIO_TRACKS_UPDATED,
{ audioTracks }: AudioTracksUpdatedData
) {
this.resetTransmuxer();
this.levels = audioTracks.map((mediaPlaylist) => new Level(mediaPlaylist));
}

Expand All @@ -374,7 +374,7 @@ class AudioStreamController
// if any URL found on new audio track, it is an alternate audio track
const altAudio = !!data.url;
this.trackId = data.id;
const { fragCurrent, transmuxer } = this;
const { fragCurrent } = this;

if (fragCurrent?.loader) {
fragCurrent.loader.abort();
Expand All @@ -383,10 +383,7 @@ class AudioStreamController
this.clearWaitingFragment();
// destroy useless transmuxer when switching audio to main
if (!altAudio) {
if (transmuxer) {
transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
} else {
// switching to audio track, start timer if not already started
this.setInterval(TICK_INTERVAL);
Expand Down
10 changes: 8 additions & 2 deletions src/controller/audio-track-controller.ts
Expand Up @@ -188,11 +188,17 @@ class AudioTrackController extends BasePlaylistController {

const lastTrack = tracks[this.trackId];
this.log(`Now switching to audio-track index ${newId}`);
const { id, name, type, url } = track;
const { id, groupId = '', name, type, url } = track;
this.trackId = newId;
this.trackName = name;
this.selectDefaultTrack = false;
this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, { id, name, type, url });
this.hls.trigger(Events.AUDIO_TRACK_SWITCHING, {
id,
groupId,
name,
type,
url,
});
const hlsUrlParameters = this.switchParams(track.url, lastTrack?.details);
this.loadPlaylist(hlsUrlParameters);
}
Expand Down
17 changes: 9 additions & 8 deletions src/controller/base-stream-controller.ts
Expand Up @@ -121,10 +121,7 @@ export default class BaseStreamController
if (frag) {
this.fragmentTracker.removeFragment(frag);
}
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
this.fragCurrent = null;
this.fragPrevious = null;
this.clearInterval();
Expand Down Expand Up @@ -1228,10 +1225,7 @@ export default class BaseStreamController
this.warn(
`Could not parse fragment ${frag.sn} ${type} duration reliably (${parsedDuration}) resetting transmuxer to fallback to playlist timing`
);
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
this.resetTransmuxer();
return result || false;
}
const drift = partial
Expand Down Expand Up @@ -1269,6 +1263,13 @@ export default class BaseStreamController
}
}

protected resetTransmuxer() {
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
}

set state(nextState) {
const previousState = this._state;
if (previousState !== nextState) {
Expand Down
7 changes: 0 additions & 7 deletions src/controller/stream-controller.ts
Expand Up @@ -715,13 +715,6 @@ export default class StreamController
);
}

private resetTransmuxer() {
if (this.transmuxer) {
this.transmuxer.destroy();
this.transmuxer = null;
}
}

private onAudioTrackSwitching(
event: Events.AUDIO_TRACK_SWITCHING,
data: AudioTrackSwitchingData
Expand Down
1 change: 0 additions & 1 deletion src/controller/subtitle-stream-controller.ts
Expand Up @@ -5,7 +5,6 @@ import { findFragmentByPDT, findFragmentByPTS } from './fragment-finders';
import type { FragmentTracker } from './fragment-tracker';
import { FragmentState } from './fragment-tracker';
import BaseStreamController, { State } from './base-stream-controller';
import FragmentLoader from '../loader/fragment-loader';
import { PlaylistLevelType } from '../types/loader';
import { Level } from '../types/level';
import type { NetworkComponentAPI } from '../types/component-api';
Expand Down
10 changes: 8 additions & 2 deletions src/controller/subtitle-track-controller.ts
Expand Up @@ -354,8 +354,14 @@ class SubtitleTrackController extends BasePlaylistController {
this.log(`Switching to subtitle track ${newId}`);
this.trackId = newId;
if (track) {
const { id, name, type, url } = track;
this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, { id, name, type, url });
const { id, groupId = '', name, type, url } = track;
this.hls.trigger(Events.SUBTITLE_TRACK_SWITCH, {
id,
groupId,
name,
type,
url,
});
const hlsUrlParameters = this.switchParams(track.url, lastTrack?.details);
this.loadPlaylist(hlsUrlParameters);
} else {
Expand Down
2 changes: 2 additions & 0 deletions src/types/events.ts
Expand Up @@ -155,6 +155,7 @@ export interface LevelPTSUpdatedData {
export interface AudioTrackSwitchingData {
id: number;
name: string;
groupId: string;
type: MediaPlaylistType | 'main';
url: string;
}
Expand All @@ -176,6 +177,7 @@ export interface SubtitleTracksUpdatedData {
export interface SubtitleTrackSwitchData {
id: number;
name?: string;
groupId?: string;
type?: MediaPlaylistType | 'main';
url?: string;
}
Expand Down
2 changes: 2 additions & 0 deletions tests/unit/controller/subtitle-track-controller.js
Expand Up @@ -129,6 +129,7 @@ describe('SubtitleTrackController', function () {
'hlsSubtitleTrackSwitch',
{
id: 1,
groupId: 'default-text-group',
name: 'English',
type: 'SUBTITLES',
url: 'bar',
Expand Down Expand Up @@ -164,6 +165,7 @@ describe('SubtitleTrackController', function () {
'hlsSubtitleTrackSwitch',
{
id: 0,
groupId: 'default-text-group',
name: 'English',
type: 'SUBTITLES',
url: 'baz',
Expand Down