diff --git a/lib/media/streaming_engine.js b/lib/media/streaming_engine.js index 2b8840cf47..9024dfb9d4 100644 --- a/lib/media/streaming_engine.js +++ b/lib/media/streaming_engine.js @@ -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; @@ -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); @@ -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( @@ -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)); @@ -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