Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow setInitialMediaSettingsFor with fragmentedText media type #3245

Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
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', {
jeffcunat marked this conversation as resolved.
Show resolved Hide resolved
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);
jeffcunat marked this conversation as resolved.
Show resolved Hide resolved
}
}
$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);
});
});

});