From 76480f9746eced28718c5d78ee3c938b640282e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=81lvaro=20Velad=20Galv=C3=A1n?= Date: Mon, 7 Jun 2021 19:44:47 +0200 Subject: [PATCH] fix(HLS): Prioritize AVERAGE-BANDWIDTH over BANDWIDTH (#3428) Related to conversation in #3422 --- lib/hls/hls_parser.js | 3 ++- test/hls/hls_parser_unit.js | 40 +++++++++++++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 1 deletion(-) 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',