UNPKG

kontainer-js

Version:

A media file format generator/parser that exposes a React-like API.

166 lines (131 loc) 5.5 kB
'use strict'; 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 };