From 18632897092a301955140bc9e932697dfd28b154 Mon Sep 17 00:00:00 2001 From: Rob Colantuoni Date: Mon, 17 Dec 2018 13:41:29 -0500 Subject: [PATCH] fixes 1086 and 1730 - if an X-EXT-MEDIA asset does not contain URI, ignore when building stream list --- lib/hls/hls_parser.js | 11 +++++++ test/hls/hls_parser_unit.js | 62 +++++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/lib/hls/hls_parser.js b/lib/hls/hls_parser.js index df56fa83b7..a58b456a36 100644 --- a/lib/hls/hls_parser.js +++ b/lib/hls/hls_parser.js @@ -550,6 +550,17 @@ shaka.hls.HlsParser.prototype.createVariantsForTag_ = function(tag, playlist) { const type = HlsParser.getRequiredAttributeValue_(tag, 'TYPE'); return type != 'CLOSED-CAPTIONS'; }); + + // AUDIO or VIDEO tags without a URI attribute are valid. + // If there is no uri, it means that audio/video is embedded in the + // stream described by the Variant tag. + // Do not create stream from AUDIO/VIDEO EXT-X-MEDIA tags without URI + mediaTags = mediaTags.filter((tag) => { + const uri = tag.getAttributeValue('URI') || ''; + const type = tag.getAttributeValue('TYPE') || ''; + return type == 'SUBTITLES' || uri != ''; + }); + let audioGroupId = tag.getAttributeValue('AUDIO'); let videoGroupId = tag.getAttributeValue('VIDEO'); goog.asserts.assert(audioGroupId == null || videoGroupId == null, diff --git a/test/hls/hls_parser_unit.js b/test/hls/hls_parser_unit.js index a9a8750629..8306043811 100644 --- a/test/hls/hls_parser_unit.js +++ b/test/hls/hls_parser_unit.js @@ -563,6 +563,64 @@ describe('HlsParser', function() { await testHlsParser(master, media, manifest); }); + it('parses audio variant without URI', async () => { + const master = [ + '#EXTM3U\n', + '#EXT-X-STREAM-INF:BANDWIDTH=200,', + 'RESOLUTION=960x540,FRAME-RATE=60,AUDIO="aud1"\n', + 'video\n', + '#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="aud1",NAME="audio"\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(''); + + let manifest = new shaka.test.ManifestGenerator() + .anyTimeline() + .addPeriod(0) + .addPartialVariant() + .addPartialStream(ContentType.VIDEO) + .mime('video/mp4', jasmine.any(String)) + .build(); + + await testHlsParser(master, media, manifest); + }); + + + it('parses video variant without URI', async () => { + const master = [ + '#EXTM3U\n', + '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="mp4a",VIDEO="vid1"\n', + 'audio\n', + '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid1",NAME="video"\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(''); + + let manifest = new shaka.test.ManifestGenerator() + .anyTimeline() + .addPeriod(0) + .addPartialVariant() + .addPartialStream(ContentType.AUDIO) + .mime('audio/mp4', jasmine.any(String)) + .build(); + + await testHlsParser(master, media, manifest); + }); + it('parses multiple variants', async () => { const master = [ '#EXTM3U\n', @@ -1339,9 +1397,9 @@ describe('HlsParser', function() { const master = [ '#EXTM3U\n', '#EXT-X-STREAM-INF:CODECS="avc1,mp4a",BANDWIDTH=200,', - 'RESOLUTION=960x540,FRAME-RATE=60,VIDEO="vid"\n', + 'RESOLUTION=960x540,FRAME-RATE=60,SUBTITLES="sub1"\n', 'audio\n', - '#EXT-X-MEDIA:TYPE=VIDEO,GROUP-ID="vid"', + '#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="sub1"', ].join(''); const media = [