Skip to content

Commit

Permalink
MediaPlayer.setInitialMediaSettingsFor compatible with fragmentedText…
Browse files Browse the repository at this point in the history
… media type
  • Loading branch information
jeffcunat committed May 5, 2020
1 parent c213537 commit d7b4d24
Show file tree
Hide file tree
Showing 9 changed files with 92 additions and 21 deletions.
6 changes: 6 additions & 0 deletions samples/captioning/multi-track-captions.html
Expand Up @@ -28,6 +28,12 @@

player = dashjs.MediaPlayer().create();
player.initialize(videoElement, url, true);
/* player.setInitialMediaSettingsFor('fragmentedText', {
lang: 'eng',
role: 'caption'
});
*/
// player.setTextDefaultLanguage('swe');
player.attachTTMLRenderingDiv(TTMLRenderingDiv);
controlbar = new ControlBar(player); // Checkout ControlBar.js for more info on how to target/add text tracks to UI
controlbar.initialize();
Expand Down
9 changes: 8 additions & 1 deletion samples/dash-if-reference-player/app/main.js
Expand Up @@ -619,7 +619,14 @@ app.controller('DashController', function ($scope, sources, contributors, dashif
});
}
if ($scope.initialSettings.text) {
$scope.player.setTextDefaultLanguage($scope.initialSettings.text);
if ($scope.initialSettings.textRole) {
$scope.player.setInitialMediaSettingsFor('fragmentedText', {
role: $scope.initialSettings.textRole,
lang: $scope.initialSettings.text
});
} else {
$scope.player.setTextDefaultLanguage($scope.initialSettings.text);
}
}
$scope.player.setTextDefaultEnabled($scope.initialSettings.textEnabled);
$scope.player.enableForcedTextStreaming($scope.initialSettings.forceTextStreaming);
Expand Down
4 changes: 3 additions & 1 deletion samples/dash-if-reference-player/index.html
Expand Up @@ -239,8 +239,10 @@
<label class="options-label">Audio:</label>
<input type="text" class="form-control" placeholder="audio initial lang, e.g. 'en'" ng-model="initialSettings.audio">
<label class="options-label">Video:</label>
<input type="text" class="form-control" placeholder="initial role, e.g. 'alternate'" ng-model="initialSettings.video"> <label class="options-label">Text:</label>
<input type="text" class="form-control" placeholder="initial role, e.g. 'alternate'" ng-model="initialSettings.video">
<label class="options-label">Text:</label>
<input type="text" class="form-control" placeholder="text initial lang, e.g. 'en'" ng-model="initialSettings.text">
<input type="text" class="form-control" placeholder="text initial role, e.g. 'caption'" ng-model="initialSettings.textRole">
<label class="topcoat-checkbox" data-toggle="tooltip" data-placement="right"
title="Enable subtitle on loading text">
<input type="checkbox" id="enableTextAtLoading" ng-model="initialSettings.textEnabled">
Expand Down
8 changes: 5 additions & 3 deletions src/streaming/MediaPlayer.js
Expand Up @@ -1370,7 +1370,6 @@ function MediaPlayer() {
if (textController === undefined) {
textController = TextController(context).getInstance();
}

textController.setTextDefaultLanguage(lang);
}

Expand Down Expand Up @@ -1696,11 +1695,14 @@ function MediaPlayer() {
* @throws {@link module:MediaPlayer~MEDIA_PLAYER_NOT_INITIALIZED_ERROR MEDIA_PLAYER_NOT_INITIALIZED_ERROR} if called before initialize function
* @instance
*/
function setQualityForSettingsFor(type, value) {
function setInitialMediaSettingsFor(type, value) {
if (!mediaPlayerInitialized) {
throw MEDIA_PLAYER_NOT_INITIALIZED_ERROR;
}
mediaController.setInitialSettings(type, value);
if (type === Constants.FRAGMENTED_TEXT) {
textController.setInitialSettings(value);
}
}

/**
Expand Down Expand Up @@ -2402,7 +2404,7 @@ function MediaPlayer() {
getTracksFor: getTracksFor,
getTracksForTypeFromManifest: getTracksForTypeFromManifest,
getCurrentTrackFor: getCurrentTrackFor,
setInitialMediaSettingsFor: setQualityForSettingsFor,
setInitialMediaSettingsFor: setInitialMediaSettingsFor,
getInitialMediaSettingsFor: getInitialMediaSettingsFor,
setCurrentTrack: setCurrentTrack,
getTrackSwitchModeFor: getTrackSwitchModeFor,
Expand Down
1 change: 1 addition & 0 deletions src/streaming/controllers/MediaController.js
Expand Up @@ -496,6 +496,7 @@ function MediaController() {
getSelectionModeForInitialTrack: getSelectionModeForInitialTrack,
isMultiTrackSupportedByType: isMultiTrackSupportedByType,
isTracksEqual: isTracksEqual,
matchSettings: matchSettings,
setConfig: setConfig,
reset: reset
};
Expand Down
32 changes: 20 additions & 12 deletions src/streaming/text/TextController.js
Expand Up @@ -54,7 +54,7 @@ function TextController() {
vttParser,
ttmlParser,
eventBus,
defaultLanguage,
defaultSettings,
lastEnabledIndex,
textDefaultEnabled, // this is used for default settings (each time a file is loaded, we check value of this settings )
allTracksAreDisabled, // this is used for one session (when a file has been loaded, we use this settings to enable/disable text)
Expand All @@ -63,7 +63,7 @@ function TextController() {

function setup() {

defaultLanguage = '';
defaultSettings = {};
lastEnabledIndex = -1;
textDefaultEnabled = true;
forceTextStreaming = false;
Expand Down Expand Up @@ -170,24 +170,31 @@ function TextController() {

function setTextDefaultLanguage(lang) {
checkParameterType(lang, 'string');
defaultLanguage = lang;
defaultSettings.lang = lang;
}

function setInitialSettings(settings) {
defaultSettings = settings;
}

function getTextDefaultLanguage() {
return defaultLanguage;
return defaultSettings.lang || '';
}

function onTextTracksAdded(e) {
let tracks = e.tracks;
let index = e.index;

tracks.some((item, idx) => {
if (item.lang === defaultLanguage) {
this.setTextTrack(idx);
index = idx;
return true;
}
});
if (defaultSettings) {
tracks.some((item, idx) => {
// matchSettings is compatible with setTextDefaultLanguage and setInitialSettings
if (mediaController.matchSettings(defaultSettings, item)) {
this.setTextTrack(idx);
index = idx;
return true;
}
});
}

if (!textDefaultEnabled) {
// disable text at startup
Expand Down Expand Up @@ -249,7 +256,7 @@ function TextController() {
}

function setTextTrack(idx) {
//For external time text file, the only action needed to change a track is marking the track mode to showing.
//For external time text file, the only action needed to change a track is marking the track mode to showing.
// Fragmented text tracks need the additional step of calling TextController.setTextTrack();
let config = textSourceBuffer.getConfig();
let fragmentModel = config.fragmentModel;
Expand Down Expand Up @@ -342,6 +349,7 @@ function TextController() {
setTextDefaultLanguage: setTextDefaultLanguage,
setTextDefaultEnabled: setTextDefaultEnabled,
getTextDefaultEnabled: getTextDefaultEnabled,
setInitialSettings: setInitialSettings,
enableText: enableText,
isTextEnabled: isTextEnabled,
setTextTrack: setTextTrack,
Expand Down
7 changes: 7 additions & 0 deletions test/unit/mocks/MediaControllerMock.js
Expand Up @@ -104,6 +104,13 @@ class MediaControllerMock {
return (mediaInfoForType.lang === 'deu');
}

matchSettings(settings, track) {
const matchRole = !settings.role || !!track.roles.filter(function (item) {
return item === settings.role;
})[0];
return settings.lang === track.lang && matchRole;
}

setConfig() {}

reset() {
Expand Down
7 changes: 7 additions & 0 deletions test/unit/streaming.MediaPlayer.js
Expand Up @@ -1040,6 +1040,13 @@ describe('MediaPlayer', function () {

initialSettings = player.getInitialMediaSettingsFor('audio');
expect(initialSettings).to.equal('settings');

player.setInitialMediaSettingsFor('fragmentedText', { lang: 'en', role: 'caption'});
initialSettings = player.getInitialMediaSettingsFor('fragmentedText');
expect(initialSettings).to.exist; ; // jshint ignore:line
expect(initialSettings.lang).to.equal('en');
expect(initialSettings.role).to.equal('caption');

});

it('should set current track', function () {
Expand Down
39 changes: 35 additions & 4 deletions test/unit/streaming.text.TextController.js
Expand Up @@ -8,6 +8,8 @@ import Constants from '../../src/streaming/constants/Constants';

import VideoModelMock from './mocks/VideoModelMock';
import StreamControllerMock from './mocks/StreamControllerMock';
import MediaControllerMock from './mocks/MediaControllerMock';


const expect = require('chai').expect;
const context = {};
Expand All @@ -19,6 +21,7 @@ describe('TextController', function () {

let videoModelMock = new VideoModelMock();
let streamControllerMock = new StreamControllerMock();
let mediaControllerMock = new MediaControllerMock();
let textTracks;
let textController;

Expand Down Expand Up @@ -49,7 +52,8 @@ describe('TextController', function () {
textController = TextController(context).getInstance();
textController.setConfig({
videoModel: videoModelMock,
streamController: streamControllerMock
streamController: streamControllerMock,
mediaController: mediaControllerMock
});
});

Expand Down Expand Up @@ -208,17 +212,24 @@ describe('TextController', function () {

textTracksQueue.push({
index: 0,
kind: 'subtitles',
roles: ['subtitles'],
label: 'sub_en',
lang: 'eng'
});

textTracksQueue.push({
index: 1,
kind: 'subtitles',
roles: ['subtitles'],
label: 'sub_fr',
lang: 'fr'
});

textTracksQueue.push({
index: 2,
roles: ['captions'],
label: 'sub_fr_hoh',
lang: 'fr'
});
});

it('should send TEXT_TRACKS_ADDED event', function (done) {
Expand All @@ -242,7 +253,7 @@ describe('TextController', function () {
eventBus.trigger(Events.TEXT_TRACKS_QUEUE_INITIALIZED, event);
});

it('should choose langauge according to default language', function (done) {
it('should choose language according to default language', function (done) {
// init test
textController.setTextDefaultLanguage('fr');

Expand Down Expand Up @@ -282,6 +293,26 @@ describe('TextController', function () {
// send event
eventBus.trigger(Events.TEXT_TRACKS_QUEUE_INITIALIZED, event);
});

it('should choose track according to default settings', function (done) {
// init test
textController.setInitialSettings({ lang: 'fr', role: 'captions' });

const event = {
index: initialIndex,
tracks: textTracksQueue
};
const onTracksAdded = function (e) {
expect(e.index).to.equal(2); // jshint ignore:line
expect(e.tracks.length).to.equal(textTracksQueue.length); // jshint ignore:line
eventBus.off(Events.TEXT_TRACKS_ADDED, onTracksAdded, this);
done();
};
eventBus.on(Events.TEXT_TRACKS_ADDED, onTracksAdded, this);

// send event
eventBus.trigger(Events.TEXT_TRACKS_QUEUE_INITIALIZED, event);
});
});

});

0 comments on commit d7b4d24

Please sign in to comment.