Skip to content

Commit

Permalink
Fix playback of multi-Period embedded text content.
Browse files Browse the repository at this point in the history
Since embedded text tracks are not "real" tracks, we need to ignore them
when handling Period transitions.  This ensures that the other streams
will handle the transition instead of waiting for the text stream to get
updated.

Fixes #2075
Fixes #2094

Change-Id: I2c7c92cb04795edb3f7695677ee6745bad3f4471
  • Loading branch information
TheModMaker committed Aug 23, 2019
1 parent 30d98ff commit 67240a6
Showing 1 changed file with 24 additions and 8 deletions.
32 changes: 24 additions & 8 deletions lib/media/streaming_engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -1339,11 +1339,7 @@ shaka.media.StreamingEngine.prototype.update_ = function(mediaState) {
// If it's a text stream and the original id starts with 'CC', it's CEA
// closed captions. Do not schedule update for closed captions text
// mediastate, since closed captions are embedded in video streams.
const isCaptionState = (state) => {
return state.type == ContentType.TEXT &&
state.stream.mimeType == shaka.util.MimeUtils.CLOSED_CAPTION_MIMETYPE;
};
if (isCaptionState(mediaState)) {
if (shaka.media.StreamingEngine.isEmbeddedText_(mediaState)) {
this.playerInterface_.mediaSourceEngine.setSelectedClosedCaptionId(
mediaState.stream.originalId || '');
return null;
Expand Down Expand Up @@ -1443,7 +1439,9 @@ shaka.media.StreamingEngine.prototype.update_ = function(mediaState) {
mediaStates.forEach((otherState) => {
// Do not consider embedded captions in this calculation. It could lead
// to hangs in streaming.
if (isCaptionState(otherState)) return;
if (shaka.media.StreamingEngine.isEmbeddedText_(otherState)) {
return;
}

const timeNeeded = this.getTimeNeeded_(otherState, presentationTime);
minTimeNeeded = Math.min(minTimeNeeded, timeNeeded);
Expand Down Expand Up @@ -2199,13 +2197,15 @@ shaka.media.StreamingEngine.prototype.handlePeriodTransition_ = function(
goog.asserts.assert(
mediaStates.every(function(ms) {
return ms.needPeriodIndex == needPeriodIndex || ms.hasError ||
!shaka.media.StreamingEngine.isIdle_(ms);
!shaka.media.StreamingEngine.isIdle_(ms) ||
shaka.media.StreamingEngine.isEmbeddedText_(ms);
}),
'All MediaStates should need the same Period or be performing updates.');

// Only call onChooseStreams() when all MediaStates need the same Period.
let needSamePeriod = mediaStates.every(function(ms) {
return ms.needPeriodIndex == needPeriodIndex;
return ms.needPeriodIndex == needPeriodIndex ||
shaka.media.StreamingEngine.isEmbeddedText_(ms);
});
if (!needSamePeriod) {
shaka.log.debug(
Expand Down Expand Up @@ -2239,6 +2239,10 @@ shaka.media.StreamingEngine.prototype.handlePeriodTransition_ = function(
let allReady = mediaStates.every(function(ms) {
let isIdle = shaka.media.StreamingEngine.isIdle_(ms);
let currentPeriodIndex = this.findPeriodContainingStream_(ms.stream);
if (shaka.media.StreamingEngine.isEmbeddedText_(ms)) {
// Embedded text tracks don't do Period transitions.
return true;
}
return isIdle && ms.needPeriodIndex == needPeriodIndex &&
currentPeriodIndex != needPeriodIndex;
}.bind(this));
Expand Down Expand Up @@ -2325,6 +2329,18 @@ shaka.media.StreamingEngine.prototype.handlePeriodTransition_ = function(
};


/**
* @param {shaka.media.StreamingEngine.MediaState_} mediaState
* @return {boolean}
* @private
*/
shaka.media.StreamingEngine.isEmbeddedText_ = function(mediaState) {
const MimeUtils = shaka.util.MimeUtils;
return mediaState.type == shaka.util.ManifestParserUtils.ContentType.TEXT &&
mediaState.stream.mimeType == MimeUtils.CLOSED_CAPTION_MIMETYPE;
};


/**
* @param {shaka.media.StreamingEngine.MediaState_} mediaState
* @return {boolean} True if the given MediaState is idle; otherwise, return
Expand Down

0 comments on commit 67240a6

Please sign in to comment.