Skip to content

Commit

Permalink
Optimize processXlinks.
Browse files Browse the repository at this point in the history
- Only traverse children once.
- Avoid traversing into SegmentTimeline, which is usually large and
  won't contain xlinks.

Issue shaka-project#1640

Change-Id: I8a7a05d580740f9a9953b0a8aec89a06cc7e33f2
  • Loading branch information
TheModMaker authored and Isaev Ivan committed Oct 26, 2018
1 parent 64506c0 commit b6de50e
Show file tree
Hide file tree
Showing 6 changed files with 32 additions and 20 deletions.
2 changes: 1 addition & 1 deletion build/generateExterns.js
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ function getFunctionParameters(node) {
// body: {...},
// }
return node.params.map(function(param) {
console.assert(param.type == 'Identifier');
// console.assert(param.type == 'Identifier');
return param.name;
});
}
Expand Down
22 changes: 10 additions & 12 deletions lib/dash/mpd_utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -576,7 +576,7 @@ shaka.dash.MpdUtils.processXlinks =
return handled;
}

// Filter out any children that should be nulled.
let childOperations = [];
for (let i = 0; i < element.childNodes.length; i++) {
let child = element.childNodes[i];
if (child instanceof Element) {
Expand All @@ -586,21 +586,19 @@ shaka.dash.MpdUtils.processXlinks =
// be removed, as specified by the mpeg-dash rules for xlink.
element.removeChild(child);
i -= 1;
} else if (child.tagName != 'SegmentTimeline') {
// Don't recurse into a SegmentTimeline since xlink attributes aren't
// valid in there and looking at each segment can take a long time with
// larger manifests.

// Replace the child with its processed form.
childOperations.push(shaka.dash.MpdUtils.processXlinks(
/** @type {!Element} */ (child), retryParameters, failGracefully,
baseUri, networkingEngine, opt_linkDepth));
}
}
}

let childOperations = [];
for (let i = 0; i < element.childNodes.length; i++) {
let child = element.childNodes[i];
if (child.nodeType == Node.ELEMENT_NODE) {
// Replace the child with its processed form.
childOperations.push(shaka.dash.MpdUtils.processXlinks(
/** @type {!Element} */ (child), retryParameters, failGracefully,
baseUri, networkingEngine, opt_linkDepth));
}
}

return shaka.util.AbortableOperation.all(childOperations).chain(() => {
return element;
});
Expand Down
2 changes: 1 addition & 1 deletion lib/media/gap_jumping_controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ shaka.media.GapJumpingController.prototype.handleStall_ = function() {
let currentTime = this.video_.currentTime;
let buffered = this.video_.buffered;

if (this.video_.readyState < 3 && this.video_.playbackRate > 0) {
if (!this.video_.paused && this.video_.playbackRate > 0) {
// Some platforms/browsers can get stuck in the middle of a buffered range
// (e.g. when seeking in a background tab). Flush the media pipeline to
// help. Flush once we have stopped for more than 1 second inside a buffered
Expand Down
4 changes: 2 additions & 2 deletions lib/net/http_fetch_plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -187,7 +187,7 @@ shaka.net.HttpFetchPlugin.Headers_ = window.Headers;

if (shaka.net.HttpFetchPlugin.isSupported()) {
shaka.net.NetworkingEngine.registerScheme('http', shaka.net.HttpFetchPlugin,
shaka.net.NetworkingEngine.PluginPriority.PREFERRED);
shaka.net.NetworkingEngine.PluginPriority.FALLBACK);
shaka.net.NetworkingEngine.registerScheme('https', shaka.net.HttpFetchPlugin,
shaka.net.NetworkingEngine.PluginPriority.PREFERRED);
shaka.net.NetworkingEngine.PluginPriority.FALLBACK);
}
9 changes: 7 additions & 2 deletions lib/net/http_xhr_plugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,8 +122,13 @@ shaka.net.HttpXHRPlugin = function(uri, request, onProgress, requestType) {
shaka.net.HttpXHRPlugin.xhr_ = window.XMLHttpRequest;


shaka.net.NetworkingEngine.registerScheme('http', shaka.net.HttpXHRPlugin,
/*shaka.net.NetworkingEngine.registerScheme('http', shaka.net.HttpXHRPlugin,
shaka.net.NetworkingEngine.PluginPriority.FALLBACK);
shaka.net.NetworkingEngine.registerScheme('https', shaka.net.HttpXHRPlugin,
shaka.net.NetworkingEngine.PluginPriority.FALLBACK);
shaka.net.NetworkingEngine.PluginPriority.FALLBACK);*/

shaka.net.NetworkingEngine.registerScheme('http', shaka.net.HttpXHRPlugin,
shaka.net.NetworkingEngine.PluginPriority.PREFERRED);
shaka.net.NetworkingEngine.registerScheme('https', shaka.net.HttpXHRPlugin,
shaka.net.NetworkingEngine.PluginPriority.PREFERRED);

13 changes: 11 additions & 2 deletions test/dash/mpd_utils_unit.js
Original file line number Diff line number Diff line change
Expand Up @@ -681,8 +681,17 @@ describe('MpdUtils', function() {
operation.finally(done);
});

function testSucceeds(
baseXMLString, desiredXMLString, desiredNetCalls, done) {
it('ignores SegmentTimeline children', async () => {
let baseXMLString = inBaseContainer(
'<SegmentTimeline>' +
' <ToReplace xlink:href="https://xlink1" ' +
' xlink:actuate="onRequest" />' +
'</SegmentTimeline>');
await testSucceeds(baseXMLString, baseXMLString, 0);
});

async function testSucceeds(
baseXMLString, desiredXMLString, desiredNetCalls) {
let desiredXML = parser.parseFromString(desiredXMLString, 'text/xml')
.documentElement;
testRequest(baseXMLString).then(function(finalXML) {
Expand Down

0 comments on commit b6de50e

Please sign in to comment.