You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.1 KiB
45 lines
1.1 KiB
var toUnsigned = require('../utils/bin').toUnsigned;
|
|
var parseType = require('./parse-type.js');
|
|
|
|
var findBox = function(data, path) {
|
|
var results = [],
|
|
i, size, type, end, subresults;
|
|
|
|
if (!path.length) {
|
|
// short-circuit the search for empty paths
|
|
return null;
|
|
}
|
|
|
|
for (i = 0; i < data.byteLength;) {
|
|
size = toUnsigned(data[i] << 24 |
|
|
data[i + 1] << 16 |
|
|
data[i + 2] << 8 |
|
|
data[i + 3]);
|
|
|
|
type = parseType(data.subarray(i + 4, i + 8));
|
|
|
|
end = size > 1 ? i + size : data.byteLength;
|
|
|
|
if (type === path[0]) {
|
|
if (path.length === 1) {
|
|
// this is the end of the path and we've found the box we were
|
|
// looking for
|
|
results.push(data.subarray(i + 8, end));
|
|
} else {
|
|
// recursively search for the next box along the path
|
|
subresults = findBox(data.subarray(i + 8, end), path.slice(1));
|
|
if (subresults.length) {
|
|
results = results.concat(subresults);
|
|
}
|
|
}
|
|
}
|
|
i = end;
|
|
}
|
|
|
|
// we've finished searching all of data
|
|
return results;
|
|
};
|
|
|
|
module.exports = findBox;
|
|
|