Skip to content

Commit

Permalink
Add role selection to the demo app
Browse files Browse the repository at this point in the history
Closes shaka-project#967

Change-Id: I3a83a85b327901a6ab071b355e6cd890a13d7550
  • Loading branch information
ismena authored and joeyparrish committed Dec 18, 2017
1 parent 1cf0a38 commit 2b920e2
Show file tree
Hide file tree
Showing 4 changed files with 318 additions and 47 deletions.
81 changes: 59 additions & 22 deletions demo/info_section.js
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ shakaDemo.onTracksChanged_ = function(event) {
shakaDemo.updateVariantTracks_ = function() {
var trackList = document.getElementById('variantTracks');
var langList = document.getElementById('audioLanguages');
var language = langList.selectedIndex >= 0 ?
var languageAndRole = langList.selectedIndex >= 0 ?
langList.options[langList.selectedIndex].value :
'';

Expand All @@ -75,7 +75,7 @@ shakaDemo.updateVariantTracks_ = function() {
return t1.bandwidth - t2.bandwidth;
});

shakaDemo.updateTrackOptions_(trackList, tracks, language);
shakaDemo.updateTrackOptions_(trackList, tracks, languageAndRole);
};


Expand All @@ -86,28 +86,30 @@ shakaDemo.updateTextTracks_ = function() {
var trackList = document.getElementById('textTracks');

var langList = document.getElementById('textLanguages');
var language = langList.selectedIndex >= 0 ?
var languageAndRole = langList.selectedIndex >= 0 ?
langList.options[langList.selectedIndex].value :
'';

var tracks = shakaDemo.player_.getTextTracks();

shakaDemo.updateTrackOptions_(trackList, tracks, language);
shakaDemo.updateTrackOptions_(trackList, tracks, languageAndRole);
};


/**
* @param {Element} list
* @param {!Array.<!shakaExtern.Track>} tracks
* @param {!string} language
* @param {!string} languageAndRole
* @private
*/
shakaDemo.updateTrackOptions_ = function(list, tracks, language) {
shakaDemo.updateTrackOptions_ = function(list, tracks, languageAndRole) {
var formatters = {
variant: function(track) {
var trackInfo = '';
if (track.language) trackInfo += 'language: ' + track.language + ', ';
if (track.label) trackInfo += 'label: ' + track.label + ', ';
if (track.roles.length)
trackInfo += 'roles: [' + track.roles.join() + '], ';
if (track.width && track.height)
trackInfo += track.width + 'x' + track.height + ', ';
trackInfo += track.bandwidth + ' bits/s';
Expand All @@ -116,6 +118,8 @@ shakaDemo.updateTrackOptions_ = function(list, tracks, language) {
text: function(track) {
var trackInfo = 'language: ' + track.language + ', ';
if (track.label) trackInfo += 'label: ' + track.label + ', ';
if (track.roles.length)
trackInfo += 'roles: [' + track.roles.join() + '], ';
trackInfo += 'kind: ' + track.kind;
return trackInfo;
}
Expand All @@ -125,8 +129,15 @@ shakaDemo.updateTrackOptions_ = function(list, tracks, language) {
list.removeChild(list.firstChild);
}

// Split language and role
var res = languageAndRole.split(':');
var language = res[0];
var role = res[1] || '';

tracks = tracks.filter(function(track) {
return track.language == language;
var langMatch = track.language == language;
var roleMatch = role == '' || track.roles.indexOf(role) > -1;
return langMatch && roleMatch;
});

tracks.forEach(function(track) {
Expand Down Expand Up @@ -156,10 +167,10 @@ shakaDemo.updateLanguages_ = function() {
shakaDemo.updateTextLanguages_ = function() {
var player = shakaDemo.player_;
var list = document.getElementById('textLanguages');
var languages = player.getTextLanguages();
var languagesAndRoles = player.getTextLanguagesAndRoles();
var tracks = player.getTextTracks();

shakaDemo.updateLanguageOptions_(list, languages, tracks);
shakaDemo.updateLanguageOptions_(list, languagesAndRoles, tracks);
};


Expand All @@ -170,21 +181,21 @@ shakaDemo.updateTextLanguages_ = function() {
shakaDemo.updateAudioLanguages_ = function() {
var player = shakaDemo.player_;
var list = document.getElementById('audioLanguages');
var languages = player.getAudioLanguages();
var languagesAndRoles = player.getAudioLanguagesAndRoles();
var tracks = player.getVariantTracks();

shakaDemo.updateLanguageOptions_(list, languages, tracks);
shakaDemo.updateLanguageOptions_(list, languagesAndRoles, tracks);
};


/**
* @param {Element} list
* @param {!Array.<!string>} languages
* @param {!Array.<{language: string, role: string}>} languagesAndRoles
* @param {!Array.<shakaExtern.Track>} tracks
* @private
*/
shakaDemo.updateLanguageOptions_ =
function(list, languages, tracks) {
function(list, languagesAndRoles, tracks) {
// Remove old options
while (list.firstChild) {
list.removeChild(list.firstChild);
Expand All @@ -198,11 +209,32 @@ shakaDemo.updateLanguageOptions_ =
var selectedTrack = activeTracks[0];

// Populate list with new options.
languages.forEach(function(lang) {
languagesAndRoles.forEach(function(langAndRole) {
var language = langAndRole.language;
var role = langAndRole.role;

var label = language;
if (role) {
label += ' (role: ' + role + ')';
}

var option = document.createElement('option');
option.textContent = lang;
option.value = lang;
option.selected = lang == selectedTrack.language;
option.textContent = label;
option.value = language + ':' + role;
var isSelected = false;

if (selectedTrack.language == language) {
if (selectedTrack.roles.length) {
selectedTrack.roles.forEach(function(selectedRole) {
if (selectedRole == role)
isSelected = true;
});
} else {
isSelected = true;
}
}

option.selected = isSelected;
list.appendChild(option);
});
};
Expand Down Expand Up @@ -265,10 +297,12 @@ shakaDemo.onTrackSelected_ = function(event) {
*/
shakaDemo.onAudioLanguageSelected_ = function(event) {
var list = event.target;
var language = list.options[list.selectedIndex].value;
var option = list.options[list.selectedIndex].value;
var player = shakaDemo.player_;

player.selectAudioLanguage(language);
var res = option.split(':');
var language = res[0];
var role = res[1] || '';
player.selectAudioLanguage(language, role);
shakaDemo.updateVariantTracks_();
};

Expand All @@ -279,10 +313,13 @@ shakaDemo.onAudioLanguageSelected_ = function(event) {
*/
shakaDemo.onTextLanguageSelected_ = function(event) {
var list = event.target;
var language = list.options[list.selectedIndex].value;
var option = list.options[list.selectedIndex].value;
var player = shakaDemo.player_;
var res = option.split(':');
var language = res[0];
var role = res[1] || '';

player.selectTextLanguage(language);
player.selectTextLanguage(language, role);
shakaDemo.updateTextTracks_();
};

Expand Down
2 changes: 2 additions & 0 deletions lib/cast/cast_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -114,13 +114,15 @@ shaka.cast.CastUtils.PlayerEvents = [
shaka.cast.CastUtils.PlayerGetterMethods = {
'drmInfo': 20,
'getAudioLanguages': 2,
'getAudioLanguagesAndRoles': 2,
'getBufferedInfo': 2,
'getConfiguration': 2,
'getExpiration': 2,
// Note that the 'getManifest' property is not proxied, as it is very large.
'getManifestUri': 2,
'getPlaybackRate': 2,
'getTextLanguages': 2,
'getTextLanguagesAndRoles': 2,
'getTextTracks': 2,
'getStats': 5,
'getVariantTracks': 2,
Expand Down
90 changes: 84 additions & 6 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ goog.require('shaka.media.SegmentReference');
goog.require('shaka.media.StreamingEngine');
goog.require('shaka.net.NetworkingEngine');
goog.require('shaka.text.SimpleTextDisplayer');
goog.require('shaka.util.ArrayUtils');
goog.require('shaka.util.CancelableChain');
goog.require('shaka.util.ConfigUtils');
goog.require('shaka.util.Error');
Expand Down Expand Up @@ -1325,6 +1326,46 @@ shaka.Player.prototype.selectVariantTrack = function(track, opt_clearBuffer) {
};


/**
* Return a list of audio language-role combinations available for the current
* Period.
*
* @return {!Array.<{language: string, role: string}>}
* @export
*/
shaka.Player.prototype.getAudioLanguagesAndRoles = function() {
if (!this.streamingEngine_) {
return [];
}

var StreamUtils = shaka.util.StreamUtils;
var period = this.streamingEngine_.getCurrentPeriod();
var variants = StreamUtils.getPlayableVariants(period.variants);
var audioStreams = variants.map(function(variant) {
return variant.audio;
}).filter(shaka.util.Functional.isNotDuplicate);

return this.getLanguagesAndRoles_(audioStreams);
};


/**
* Return a list of text language-role combinations available for the current
* Period.
*
* @return {!Array.<{language: string, role: string}>}
* @export
*/
shaka.Player.prototype.getTextLanguagesAndRoles = function() {
if (!this.streamingEngine_) {
return [];
}

var period = this.streamingEngine_.getCurrentPeriod();
return this.getLanguagesAndRoles_(period.textStreams);
};


/**
* Return a list of audio languages available for the current
* Period.
Expand Down Expand Up @@ -1366,14 +1407,50 @@ shaka.Player.prototype.getTextLanguages = function() {


/**
* Sets currentAudioLanguage to the selected language and chooses
* new variant in that language if need be.
* Given a list of streams return a list of language-role combinations
* available for them.
*
* @param {!Array.<?shakaExtern.Stream>} streams
* @return {!Array.<{language: string, role: string}>}
* @private
*/
shaka.Player.prototype.getLanguagesAndRoles_ = function(streams) {
var roleLangCombinations = [];
streams.forEach(function(stream) {
if (!stream) {
// Video-only variant
roleLangCombinations.push({ language: 'und', role: '' });
} else {
var language = stream.language;

if (stream.roles.length) {
stream.roles.forEach(function(role) {
roleLangCombinations.push({ language: language, role: role });
});
} else {
// No roles, just add language by itself
roleLangCombinations.push({ language: language, role: '' });
}
}
});
return shaka.util.ArrayUtils.removeDuplicates(
roleLangCombinations,
function(a, b) {
return a.language == b.language && a.role == b.role;
});
};


/**
* Sets currentAudioLanguage and currentVariantRole to the selected
* language and role, and chooses new variant if need be.
*
* @param {!string} language
* @param {string=} opt_role
* @export
*/
shaka.Player.prototype.selectAudioLanguage = function(language, opt_role) {
shaka.Player.prototype.selectAudioLanguage =
function(language, opt_role) {
if (!this.streamingEngine_) return;
var period = this.streamingEngine_.getCurrentPeriod();
this.currentAudioLanguage_ = language;
Expand All @@ -1383,14 +1460,15 @@ shaka.Player.prototype.selectAudioLanguage = function(language, opt_role) {


/**
* Sets currentTextLanguage to the selected language and chooses
* new text stream in that language if need be.
* Sets currentTextLanguage and currentTextRole to the selected
* language and role, and chooses new text stream if need be.
*
* @param {!string} language
* @param {string=} opt_role
* @export
*/
shaka.Player.prototype.selectTextLanguage = function(language, opt_role) {
shaka.Player.prototype.selectTextLanguage =
function(language, opt_role) {
if (!this.streamingEngine_) return;
var period = this.streamingEngine_.getCurrentPeriod();
this.currentTextLanguage_ = language;
Expand Down
Loading

0 comments on commit 2b920e2

Please sign in to comment.