1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- "use strict";
- var toUnsigned = require('../utils/bin').toUnsigned;
- var parseType = require('./parse-type.js');
- var findBox = function findBox(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;
|