diff --git a/lib/hls/hls_parser.js b/lib/hls/hls_parser.js index 9953513b37..0180762dab 100644 --- a/lib/hls/hls_parser.js +++ b/lib/hls/hls_parser.js @@ -732,7 +732,8 @@ shaka.hls.HlsParser = class { // Create variants for each variant tag. const variantsPromises = tags.map(async (tag) => { const frameRate = tag.getAttributeValue('FRAME-RATE'); - const bandwidth = Number(tag.getRequiredAttrValue('BANDWIDTH')); + const bandwidth = Number(tag.getAttributeValue('AVERAGE-BANDWIDTH')) || + Number(tag.getRequiredAttrValue('BANDWIDTH')); const resolution = tag.getAttributeValue('RESOLUTION'); const [width, height] = resolution ? resolution.split('x') : [null, null]; diff --git a/test/hls/hls_parser_unit.js b/test/hls/hls_parser_unit.js index 1bed59417b..a693134891 100644 --- a/test/hls/hls_parser_unit.js +++ b/test/hls/hls_parser_unit.js @@ -209,6 +209,46 @@ describe('HlsParser', () => { expect(actual).toEqual(manifest); }); + it('prioritize AVERAGE-BANDWIDTH to BANDWIDTH', async () => { + const master = [ + '#EXTM3U\n', + '#EXT-X-STREAM-INF:BANDWIDTH=200,CODECS="avc1",', + 'RESOLUTION=960x540,FRAME-RATE=60,', + 'AVERAGE-BANDWIDTH=100\n', + '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(''); + + const manifest = shaka.test.ManifestGenerator.generate((manifest) => { + manifest.anyTimeline(); + manifest.addPartialVariant((variant) => { + variant.bandwidth = 100; + variant.addPartialStream(ContentType.VIDEO, (stream) => { + stream.frameRate = 60; + stream.mime('video/mp4', 'avc1'); + stream.size(960, 540); + }); + }); + }); + + fakeNetEngine + .setResponseText('test:/master', master) + .setResponseText('test:/video', media) + .setResponseValue('test:/init.mp4', initSegmentData) + .setResponseValue('test:/main.mp4', segmentData); + + const actual = await parser.start('test:/master', playerInterface); + expect(actual).toEqual(manifest); + }); + it('ignores duplicate CODECS', async () => { const master = [ '#EXTM3U\n',