kontainer-js
Version:
A media file format generator/parser that exposes a React-like API.
166 lines (131 loc) • 5.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _keys = require('babel-runtime/core-js/object/keys');
var _keys2 = _interopRequireDefault(_keys);
var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray');
var _slicedToArray3 = _interopRequireDefault(_slicedToArray2);
var _Box = require('./Box/Box');
var _Box2 = _interopRequireDefault(_Box);
var _UnknownBox = require('./Box/UnknownBox');
var _UnknownBox2 = _interopRequireDefault(_UnknownBox);
var _Util = require('../core/Util');
var _Error = require('../core/Error');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var clazz = {
'file': require('./Box/File').default,
'ftyp': require('./Box/FileTypeBox').default,
'moov': require('./Box/MovieBox').default,
'mvhd': require('./Box/MovieHeaderBox').default,
'trak': require('./Box/TrackBox').default,
'tkhd': require('./Box/TrackHeaderBox').default,
'mdia': require('./Box/MediaBox').default,
'mdhd': require('./Box/MediaHeaderBox').default,
'hdlr': require('./Box/HandlerReferenceBox').default,
'minf': require('./Box/MediaInformationBox').default,
'vmhd': require('./Box/VideoMediaHeaderBox').default,
'smhd': require('./Box/SoundMediaHeaderBox').default,
'hmhd': require('./Box/HintMediaHeaderBox').default,
'nmhd': require('./Box/NullMediaHeaderBox').default,
'dinf': require('./Box/DataInformationBox').default,
'dref': require('./Box/DataReferenceBox').default,
'url ': require('./Box/DataEntryUrlBox').default,
'urn ': require('./Box/DataEntryUrnBox').default,
'stbl': require('./Box/SampleTableBox').default,
'stsd': require('./Box/SampleDescriptionBox').default,
'avc1': require('./Box/AVCSampleEntry').default,
'avcC': require('./Box/AVCConfigurationBox').default,
'stts': require('./Box/TimeToSampleBox').default,
'stsz': require('./Box/SampleSizeBox').default,
'stz2': require('./Box/CompactSampleSizeBox').default,
'stsc': require('./Box/SampleToChunkBox').default,
'stco': require('./Box/ChunkOffsetBox').default,
'mp4a': require('./Box/MP4AudioSampleEntry').default,
'esds': require('./Box/ESDBox').default,
'mdat': require('./Box/MediaDataBox').default,
'btrt': require('./Box/MPEG4BitRateBox').default,
'stss': require('./Box/SyncSampleBox').default,
'mvex': require('./Box/MovieExtendsBox').default,
'mehd': require('./Box/MovieExtendsHeaderBox').default,
'trex': require('./Box/TrackExtendsBox').default,
'moof': require('./Box/MovieFragmentBox').default,
'mfhd': require('./Box/MovieFragmentHeaderBox').default,
'traf': require('./Box/TrackFragmentBox').default,
'tfhd': require('./Box/TrackFragmentHeaderBox').default,
'trun': require('./Box/TrackRunBox').default,
'tfdt': require('./Box/TrackFragmentBaseMediaDecodeTimeBox').default,
'edts': require('./Box/EditBox').default,
'elst': require('./Box/EditListBox').default
};
function getComponentClass(name) {
return clazz[name];
}
function parseTypeAndSize(buffer, offset) {
var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2];
var readBytesNum = void 0,
props = void 0;
//console.log(`IsoBmff.parseTypeAndSize: props.type="${props.type}"`);
var _Box$parse = _Box2.default.parse(buffer, offset);
var _Box$parse2 = (0, _slicedToArray3.default)(_Box$parse, 2);
readBytesNum = _Box$parse2[0];
props = _Box$parse2[1];
var boxSize = props.size || buffer.length - offset;
var boxType = props.type === 'uuid' ? props.extendedType : props.type;
if (boxType.length < 4 || boxType.search(/^[a-z]{1}[\w\s]{3}$/g) !== 0) {
//console.error(`IsoBmff.parseTypeAndSize: Invalid type - "${boxType}"`);
return [readBytesNum, null, boxSize];
}
var boxClass = clazz[boxType];
if (!boxClass && !options.ignoreUnknown) {
//console.error(`IsoBmff.parseTypeAndSize: Unsupported type - "${boxType}"`);
return [readBytesNum, (0, _UnknownBox2.default)(boxType), boxSize];
}
return [readBytesNum, boxClass, boxSize];
}
function getRootWrapperClass() {
return clazz['file'];
}
function skipBytes(buffer, offset) {
var names = (0, _keys2.default)(clazz);
for (var i = offset; i < buffer.length; i++) {
var end = i + 4;
var chars = [];
for (var _j = i; _j < end; _j++) {
chars.push(String.fromCharCode(buffer[_j]));
}
if (names.indexOf(chars.join('')) !== -1) {
return j - offset;
}
}
(0, _Util.throwException)('IsoBmff.skipBytes: Reached the end of buffer.');
}
function canParse(buffer, offset) {
var readBytesNum = void 0,
componentClass = void 0;
try {
var _parseTypeAndSize = parseTypeAndSize(buffer, offset);
var _parseTypeAndSize2 = (0, _slicedToArray3.default)(_parseTypeAndSize, 2);
readBytesNum = _parseTypeAndSize2[0];
componentClass = _parseTypeAndSize2[1];
if (componentClass) {
var _componentClass$parse = componentClass.parse(buffer, offset);
var _componentClass$parse2 = (0, _slicedToArray3.default)(_componentClass$parse, 1);
readBytesNum = _componentClass$parse2[0];
return true;
}
} catch (err) {
if (componentClass && err.message === _Error.BufferReadError.ERROR_MESSAGE) {
return true;
}
}
return false;
}
exports.default = {
name: 'mp4',
getComponentClass: getComponentClass,
parseTypeAndSize: parseTypeAndSize,
getRootWrapperClass: getRootWrapperClass,
skipBytes: skipBytes,
canParse: canParse
};