From 9327b8baa083c4b2bfff74f83c3631e85dd71999 Mon Sep 17 00:00:00 2001 From: Bertrand Berthelot Date: Thu, 4 Jun 2020 08:49:48 +0200 Subject: [PATCH] Remove NextFragmentRequestRule (no more used, logic moved into StreamProcessor) (#3278) --- .../scheduling/NextFragmentRequestRule.js | 117 ------------------ src/streaming/text/TextController.js | 2 +- ...ules.scheduling.NextFragmentRequestRule.js | 51 -------- 3 files changed, 1 insertion(+), 169 deletions(-) delete mode 100644 src/streaming/rules/scheduling/NextFragmentRequestRule.js delete mode 100644 test/unit/streaming.rules.scheduling.NextFragmentRequestRule.js diff --git a/src/streaming/rules/scheduling/NextFragmentRequestRule.js b/src/streaming/rules/scheduling/NextFragmentRequestRule.js deleted file mode 100644 index 8703a9c474..0000000000 --- a/src/streaming/rules/scheduling/NextFragmentRequestRule.js +++ /dev/null @@ -1,117 +0,0 @@ -/** - * The copyright in this software is being made available under the BSD License, - * included below. This software may be subject to other third party and contributor - * rights, including patent rights, and no such rights are granted under this license. - * - * Copyright (c) 2013, Dash Industry Forum. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * * Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation and/or - * other materials provided with the distribution. - * * Neither the name of Dash Industry Forum nor the names of its - * contributors may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS AS IS AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. - * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -import Constants from '../../constants/Constants'; -import Debug from '../../../core/Debug'; -import FactoryMaker from '../../../core/FactoryMaker'; -import FragmentRequest from '../../../streaming/vo/FragmentRequest'; - -function NextFragmentRequestRule(config) { - - config = config || {}; - const context = this.context; - const textController = config.textController; - const playbackController = config.playbackController; - - let instance, - logger; - - function setup() { - logger = Debug(context).getInstance().getLogger(instance); - } - - function execute(streamProcessor, seekTarget, requestToReplace) { - if (!streamProcessor) { - return null; - } - const representationInfo = streamProcessor.getRepresentationInfo(); - const mediaType = streamProcessor.getType(); - const hasSeekTarget = !isNaN(seekTarget); - const bufferController = streamProcessor.getBufferController(); - const currentTime = playbackController.getNormalizedTime(); - let time = hasSeekTarget ? seekTarget : streamProcessor.getIndexHandlerTime(); - let bufferIsDivided = false; - let request; - - if (isNaN(time) || (mediaType === Constants.FRAGMENTED_TEXT && !textController.isTextEnabled())) { - return null; - } - /** - * This is critical for IE/Safari/EDGE - * */ - if (bufferController) { - let range = bufferController.getRangeAt(time); - const playingRange = bufferController.getRangeAt(currentTime); - const hasDiscontinuities = bufferController.getBuffer().hasDiscontinuitiesAfter(currentTime); - if ((range !== null || playingRange !== null) && !hasSeekTarget) { - if (!range || (playingRange && playingRange.start != range.start && playingRange.end != range.end)) { - if (hasDiscontinuities && mediaType !== Constants.FRAGMENTED_TEXT) { - streamProcessor.getFragmentModel().removeExecutedRequestsAfterTime(playingRange.end); - bufferIsDivided = true; - } - range = playingRange; - } - } - } - - if (requestToReplace) { - time = requestToReplace.startTime + (requestToReplace.duration / 2); - request = streamProcessor.getFragmentRequest(representationInfo, time, { - timeThreshold: 0, - ignoreIsFinished: true - }); - } else { - // Use time just whenever is strictly needed - request = streamProcessor.getFragmentRequest(representationInfo, - hasSeekTarget || bufferIsDivided ? time : undefined, { - keepIdx: !hasSeekTarget && !bufferIsDivided - }); - - // Then, check if this request was downloaded or not - while (request && request.action !== FragmentRequest.ACTION_COMPLETE && streamProcessor.getFragmentModel().isFragmentLoaded(request)) { - // loop until we found not loaded fragment, or no fragment - request = streamProcessor.getFragmentRequest(representationInfo); - } - } - - return request; - } - - instance = { - execute: execute - }; - - setup(); - - return instance; -} - -NextFragmentRequestRule.__dashjs_factory_name = 'NextFragmentRequestRule'; -export default FactoryMaker.getClassFactory(NextFragmentRequestRule); diff --git a/src/streaming/text/TextController.js b/src/streaming/text/TextController.js index 7fc094c81b..1f753013a8 100644 --- a/src/streaming/text/TextController.js +++ b/src/streaming/text/TextController.js @@ -242,7 +242,7 @@ function TextController() { return enabled; } - // when set to true NextFragmentRequestRule will allow schedule of chunks even if tracks are all disabled. Allowing streaming to hidden track for external players to work with. + // when set to true ScheduleController will allow schedule of chunks even if tracks are all disabled. Allowing streaming to hidden track for external players to work with. function enableForcedTextStreaming(enable) { checkParameterType(enable,'boolean'); forceTextStreaming = enable; diff --git a/test/unit/streaming.rules.scheduling.NextFragmentRequestRule.js b/test/unit/streaming.rules.scheduling.NextFragmentRequestRule.js deleted file mode 100644 index 04a3c828bb..0000000000 --- a/test/unit/streaming.rules.scheduling.NextFragmentRequestRule.js +++ /dev/null @@ -1,51 +0,0 @@ -import NextFragmentRequestRule from '../../src/streaming/rules/scheduling/NextFragmentRequestRule'; - -import TextControllerMock from './mocks/TextControllerMock'; -import StreamProcessorMock from './mocks/StreamProcessorMock'; -import PlaybackControllerMock from './mocks/PlaybackControllerMock'; - -const expect = require('chai').expect; - -const context = {}; -const nextFragmentRequestRule = NextFragmentRequestRule(context).create({textController: new TextControllerMock(), - playbackController: new PlaybackControllerMock()}); - -describe('NextFragmentRequestRule', function () { - it('should return null if streamProcessor is undefined', function () { - const result = nextFragmentRequestRule.execute(); - - expect(result).to.be.null; // jshint ignore:line - }); - - it('should return null if streamProcessor is defined and current representation is fragmentedText, and subtitles are disabled', function () { - const testType = 'fragmentedText'; - const streamInfo = { - id: 'id' - }; - const result = nextFragmentRequestRule.execute(new StreamProcessorMock(testType, streamInfo), 1); - - expect(result).to.be.null; // jshint ignore:line - }); - - it('should return a mock request (duration of 2 seconds, and startTime of 0) if streamProcessor is defined and current representation is audio, with requestToReplace defined', function () { - const testType = 'audio'; - const streamInfo = { - id: 'id' - }; - const request = nextFragmentRequestRule.execute(new StreamProcessorMock(testType, streamInfo), 1,{startTime: 0, duration: 1}); - - expect(request.startTime).to.be.equal(0); // jshint ignore:line - expect(request.duration).to.be.equal(2); // jshint ignore:line - }); - - it('should return a mock request (duration of 2 seconds, and startTime of 0) if streamProcessor is defined and current representation is audio, with requestToReplace is undefined', function () { - const testType = 'audio'; - const streamInfo = { - id: 'id' - }; - const request = nextFragmentRequestRule.execute(new StreamProcessorMock(testType, streamInfo), 1); - - expect(request.startTime).to.be.equal(0); // jshint ignore:line - expect(request.duration).to.be.equal(2); // jshint ignore:line - }); -}); \ No newline at end of file