Skip to content

Commit

Permalink
Fix major HLS variant creation bug
Browse files Browse the repository at this point in the history
The wrong loop index was used, which caused us to create bogus and
non-unique keys for a map, which in turn caused us to skip certain
variants that should have been created.

Fixes #1908

Change-Id: I6475acad16cd76acb81cd562ef033724c7c4ebaf
  • Loading branch information
joeyparrish committed May 2, 2019
1 parent c02cd2e commit e246a6c
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 13 deletions.
26 changes: 13 additions & 13 deletions lib/hls/hls_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -829,13 +829,18 @@ shaka.hls.HlsParser.prototype.createVariants_ =
videoInfos = [null];
}

let variants = [];
for (let i = 0; i < audioInfos.length; i++) {
for (let j = 0; j < videoInfos.length; j++) {
let audioStream = audioInfos[i] ? audioInfos[i].stream : null;
let videoStream = videoInfos[j] ? videoInfos[j].stream : null;
let audioDrmInfos = audioInfos[i] ? audioInfos[i].drmInfos : null;
let videoDrmInfos = videoInfos[j] ? videoInfos[j].drmInfos : null;
const variants = [];
for (const audioInfo of audioInfos) {
for (const videoInfo of videoInfos) {
const audioStream = audioInfo ? audioInfo.stream : null;
const videoStream = videoInfo ? videoInfo.stream : null;
const audioDrmInfos = audioInfo ? audioInfo.drmInfos : null;
const videoDrmInfos = videoInfo ? videoInfo.drmInfos : null;
const videoStreamUri =
videoInfo ? videoInfo.verbatimMediaPlaylistUri : '';
const audioStreamUri =
audioInfo ? audioInfo.verbatimMediaPlaylistUri : '';
const variantUriKey = videoStreamUri + ' - ' + audioStreamUri;

let drmInfos;
if (audioStream && videoStream) {
Expand All @@ -851,18 +856,13 @@ shaka.hls.HlsParser.prototype.createVariants_ =
drmInfos = videoDrmInfos;
}

const videoStreamUri =
videoInfos[i] ? videoInfos[i].verbatimMediaPlaylistUri : '';
const audioStreamUri =
audioInfos[i] ? audioInfos[i].verbatimMediaPlaylistUri : '';
const variantUriKey = videoStreamUri + ' - ' + audioStreamUri;
if (this.variantUriSet_.has(variantUriKey)) {
// This happens when two variants only differ in their text streams.
shaka.log.debug('Skipping variant which only differs in text streams.');
continue;
}

let variant = this.createVariant_(
const variant = this.createVariant_(
audioStream, videoStream, bandwidth, drmInfos);
variants.push(variant);
this.variantUriSet_.add(variantUriKey);
Expand Down
57 changes: 57 additions & 0 deletions test/hls/hls_parser_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -1940,4 +1940,61 @@ describe('HlsParser', function() {
await parser.start('media/master', playerInterface);
expect(manifest.periods[0].variants.length).toBe(1);
});

// https://github.com/google/shaka-player/issues/1908
it('correctly pairs variants with multiple video and audio', async () => {
const master = [
'#EXTM3U\n',
'#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",LANGUAGE="en",',
'URI="audio"\n',
'#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",LANGUAGE="fr",',
'URI="audio2"\n',
'#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1,mp4a",',
'RESOLUTION=1280x720,FRAME-RATE=30,AUDIO="aud1"\n',
'video\n',
'#EXT-X-STREAM-INF:BANDWIDTH=400,CODECS="avc1,mp4a",',
'RESOLUTION=1920x1080,FRAME-RATE=30,AUDIO="aud1"\n',
'video2\n',
].join('');

const media = [
'#EXTM3U\n',
'#EXT-X-PLAYLIST-TYPE:VOD\n',
'#EXT-X-MAP:URI="init.mp4",BYTERANGE="616@0"\n',
'#EXTINF:5,\n',
'#EXT-X-BYTERANGE:121090@616\n',
'main.mp4',
].join('');

const manifest = new shaka.test.ManifestGenerator()
.anyTimeline()
.addPeriod(0)
.addPartialVariant()
.language('en')
.addPartialStream(ContentType.VIDEO)
.size(1280, 720)
.addPartialStream(ContentType.AUDIO)
.language('en')
.addPartialVariant()
.language('fr')
.addPartialStream(ContentType.VIDEO)
.size(1280, 720)
.addPartialStream(ContentType.AUDIO)
.language('fr')
.addPartialVariant()
.language('en')
.addPartialStream(ContentType.VIDEO)
.size(1920, 1080)
.addPartialStream(ContentType.AUDIO)
.language('en')
.addPartialVariant()
.language('fr')
.addPartialStream(ContentType.VIDEO)
.size(1920, 1080)
.addPartialStream(ContentType.AUDIO)
.language('fr')
.build();

await testHlsParser(master, media, manifest);
});
});

0 comments on commit e246a6c

Please sign in to comment.