diff --git a/lib/media/streaming_engine.js b/lib/media/streaming_engine.js index 9d5f9e9f50..9767a02677 100644 --- a/lib/media/streaming_engine.js +++ b/lib/media/streaming_engine.js @@ -927,7 +927,6 @@ shaka.media.StreamingEngine.prototype.update_ = function(mediaState) { // Get the next timestamp we need. var timeNeeded = this.getTimeNeeded_(mediaState, playheadTime); shaka.log.v2(logPrefix, 'timeNeeded=' + timeNeeded); - mediaState.resumeAt = 0; var currentPeriodIndex = this.findPeriodContainingStream_(mediaState.stream); var needPeriodIndex = this.findPeriodContainingTime_(timeNeeded); @@ -992,6 +991,7 @@ shaka.media.StreamingEngine.prototype.update_ = function(mediaState) { return 1; } + mediaState.resumeAt = 0; this.fetchAndAppend_(mediaState, playheadTime, currentPeriodIndex, reference); return null; }; diff --git a/test/media/streaming_engine_unit.js b/test/media/streaming_engine_unit.js index d4fd4e8ab8..9fe1174e4e 100644 --- a/test/media/streaming_engine_unit.js +++ b/test/media/streaming_engine_unit.js @@ -754,6 +754,46 @@ describe('StreamingEngine', function() { }); }); + it('doesn\'t get stuck when 2nd Period isn\'t available yet', function() { + // See: https://github.com/google/shaka-player/pull/839 + setupVod(); + manifest.periods[0].textStreams = []; + + // For the first update, indicate the segment isn't available. This should + // not cause us to fallback to the Playhead time to determine which segment + // to start streaming. + var oldGet = textStream2.getSegmentReference; + textStream2.getSegmentReference = function(idx) { + if (idx == 1) { + textStream2.getSegmentReference = oldGet; + return null; + } + return oldGet(idx); + }; + + mediaSourceEngine = new shaka.test.FakeMediaSourceEngine(segmentData); + createStreamingEngine(); + + playhead.getTime.and.returnValue(0); + onStartupComplete.and.callFake(setupFakeGetTime.bind(null, 0)); + onChooseStreams.and.callFake(function(period) { + var chosen = defaultOnChooseStreams(period); + if (period == manifest.periods[0]) + delete chosen[ContentType.TEXT]; + return chosen; + }); + + // Here we go! + streamingEngine.init(); + runTest(); + + expect(mediaSourceEngine.segments).toEqual({ + audio: [true, true, true, true], + video: [true, true, true, true], + text: [false, false, true, true] + }); + }); + it('only reinitializes text when switching streams', function() { // See: https://github.com/google/shaka-player/issues/910 setupVod();