Skip to content

Commit

Permalink
add hibernate method to skip updating manifest or segments
Browse files Browse the repository at this point in the history
  • Loading branch information
jobispo committed Dec 3, 2024
1 parent 5e1dadf commit f5742f0
Show file tree
Hide file tree
Showing 18 changed files with 42 additions and 1 deletion.
4 changes: 4 additions & 0 deletions lib/dash/dash_parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -1663,6 +1663,10 @@ shaka.dash.DashParser = class {
* @private
*/
async onUpdate_() {
if (this.playerInterface_ && this.playerInterface_.isHibernated()) {
this.setUpdateTimer_(1);
return;
}
goog.asserts.assert(this.updatePeriod_ >= 0,
'There should be an update period');

Expand Down
9 changes: 8 additions & 1 deletion lib/media/streaming_engine.js
Original file line number Diff line number Diff line change
Expand Up @@ -937,6 +937,10 @@ shaka.media.StreamingEngine = class {
* @private
*/
async onUpdate_(mediaState) {
if (this.playerInterface_ && this.playerInterface_.isHibernated()) {
this.scheduleUpdate_(mediaState, 1);
return;
}
this.destroyer_.ensureNotDestroyed();

const logPrefix = shaka.media.StreamingEngine.logPrefix_(mediaState);
Expand Down Expand Up @@ -2582,7 +2586,8 @@ shaka.media.StreamingEngine = class {
* beforeAppendSegment: function(
* shaka.util.ManifestParserUtils.ContentType,!BufferSource):Promise,
* onMetadata: !function(!Array.<shaka.extern.ID3Metadata>, number, ?number),
* disableStream: function(!shaka.extern.Stream, number):boolean
* disableStream: function(!shaka.extern.Stream, number):boolean,
* isHibernated: function():boolean
* }}
*
* @property {function():number} getPresentationTime
Expand Down Expand Up @@ -2617,6 +2622,8 @@ shaka.media.StreamingEngine = class {
* @property {function(!shaka.extern.Stream, number):boolean} disableStream
* Called to temporarily disable a stream i.e. disabling all variant
* containing said stream.
* @property {function():boolean} isHibernated
* Called to check if the player is hibernated.
*/
shaka.media.StreamingEngine.PlayerInterface;

Expand Down
1 change: 1 addition & 0 deletions lib/offline/storage.js
Original file line number Diff line number Diff line change
Expand Up @@ -1177,6 +1177,7 @@ shaka.offline.Storage = class {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => config.abr.defaultBandwidthEstimate,
isHibernated: () => false,
};

parser.configure(config.manifest);
Expand Down
13 changes: 13 additions & 0 deletions lib/player.js
Original file line number Diff line number Diff line change
Expand Up @@ -753,6 +753,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
'use the attach method instead.');
this.attach(mediaElement, /* initializeMediaSource= */ true);
}
this.hibernate_ = false;
}

/**
Expand Down Expand Up @@ -1126,6 +1127,16 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
return false;
}

/**
* Sets the player to hibernate mode. In hibernate mode, the player will not
* update * the manifest, will not fetch new segments.
* @param {boolean} value
* @export
*/
hibernate(value) {
this.hibernate_ = value;
}

/**
* Unloads the currently playing stream, if any.
*
Expand Down Expand Up @@ -1714,6 +1725,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
}
},
getBandwidthEstimate: () => this.abrManager_.getBandwidthEstimate(),
isHibernated: () => this.hibernate_,
};

const startTime = Date.now() / 1000;
Expand Down Expand Up @@ -3009,6 +3021,7 @@ shaka.Player = class extends shaka.util.FakeEventTarget {
this.processTimedMetadataMediaSrc_(metadata, offset, endTime);
},
disableStream: (stream, time) => this.disableStream(stream, time),
isHibernated: () => this.hibernate_,
};

return new shaka.media.StreamingEngine(this.manifest_, playerInterface);
Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_content_protection_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ describe('DashParser ContentProtection', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};

const actual = await dashParser.start(
Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_live_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ describe('DashParser Live', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
});

Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_manifest_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ describe('DashParser Manifest', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
});

Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_segment_base_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ describe('DashParser SegmentBase', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
});

Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_segment_list_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -352,6 +352,7 @@ describe('DashParser SegmentList', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
try {
const manifest = await dashParser.start('dummy://foo', playerInterface);
Expand Down
1 change: 1 addition & 0 deletions test/dash/dash_parser_segment_template_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ describe('DashParser SegmentTemplate', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
});

Expand Down
1 change: 1 addition & 0 deletions test/hls/hls_live_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ describe('HlsParser live', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};

parser = new shaka.hls.HlsParser();
Expand Down
1 change: 1 addition & 0 deletions test/hls/hls_parser_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,7 @@ describe('HlsParser', () => {
newDrmInfo: shaka.test.Util.spyFunc(newDrmInfoSpy),
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};

parser = new shaka.hls.HlsParser();
Expand Down
1 change: 1 addition & 0 deletions test/media/streaming_engine_integration.js
Original file line number Diff line number Diff line change
Expand Up @@ -267,6 +267,7 @@ describe('StreamingEngine', () => {
beforeAppendSegment: () => Promise.resolve(),
onMetadata: () => {},
disableStream: (stream, time) => false,
isHibernated: () => false,
};
streamingEngine = new shaka.media.StreamingEngine(
/** @type {shaka.extern.Manifest} */(manifest), playerInterface);
Expand Down
1 change: 1 addition & 0 deletions test/media/streaming_engine_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,7 @@ describe('StreamingEngine', () => {
beforeAppendSegment: Util.spyFunc(beforeAppendSegment),
onMetadata: Util.spyFunc(onMetadata),
disableStream: Util.spyFunc(disableStream),
isHibernated: () => false,
};
streamingEngine = new shaka.media.StreamingEngine(
/** @type {shaka.extern.Manifest} */(manifest), playerInterface);
Expand Down
1 change: 1 addition & 0 deletions test/mss/mss_parser_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ describe('MssParser Manifest', () => {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
});

Expand Down
2 changes: 2 additions & 0 deletions test/test/util/dash_parser_util.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ shaka.test.Dash = class {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
try {
const manifest = await dashParser.start('dummy://foo', playerInterface);
Expand Down Expand Up @@ -89,6 +90,7 @@ shaka.test.Dash = class {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};

try {
Expand Down
2 changes: 2 additions & 0 deletions test/test/util/mss_parser_util.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ shaka.test.Mss = class {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
const manifest = await mssParser.start('dummy://foo', playerInterface);
const stream = manifest.variants[0].audio;
Expand Down Expand Up @@ -85,6 +86,7 @@ shaka.test.Mss = class {
newDrmInfo: (stream) => {},
onManifestUpdated: () => {},
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
const p = mssParser.start('dummy://foo', playerInterface);
await expectAsync(p).toBeRejectedWith(
Expand Down
1 change: 1 addition & 0 deletions test/util/content_steering_manager_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ describe('ContentSteeringManager', () => {
newDrmInfo: fail,
onManifestUpdated: fail,
getBandwidthEstimate: () => 1e6,
isHibernated: () => false,
};
const config = shaka.util.PlayerConfiguration.createDefault().manifest;
manager = new shaka.util.ContentSteeringManager(playerInterface);
Expand Down

0 comments on commit f5742f0

Please sign in to comment.