UNPKG

test-dist-es6-5

Version:

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

387 lines (306 loc) 12.2 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _get2 = require('babel-runtime/helpers/get'); var _get3 = _interopRequireDefault(_get2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _toConsumableArray2 = require('babel-runtime/helpers/toConsumableArray'); var _toConsumableArray3 = _interopRequireDefault(_toConsumableArray2); var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); var _MediaFormat = require('../core/MediaFormat'); var _Box = require('./Box/Box'); var _Box2 = _interopRequireDefault(_Box); var _UnknownBox = require('./Box/UnknownBox'); var _UnknownBox2 = _interopRequireDefault(_UnknownBox); var _Stream = require('../core/Stream'); var _Visitor = require('../core/Visitor'); var _BoxVisitor = require('./BoxVisitor'); 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 }; function validateChild(context, child) { var childSpec = child.type.spec; var childName = child.type.COMPACT_NAME; var checkList = context.mandatoryCheckList; var quantityTable = context.quantityTable; var container = void 0, quantity = void 0; // Container check. if (childSpec.container) { if (childSpec.container instanceof Array) { container = childSpec.container; } else { container = [childSpec.container]; } if (container.indexOf(context.container) === -1) { return [false, '"' + childName + '" cannot be a child of "' + context.container + '"']; } } // Mandatory check. checkList[childName] = true; // Quantity check. if ((quantity = childSpec.quantity) !== _Box2.default.QUANTITY_ANY_NUMBER) { // Increment if (quantityTable[childName] === void 0) { quantityTable[childName] = 1; } else { quantityTable[childName]++; } // Validate if (quantity === _Box2.default.QUANTITY_EXACTLY_ONE) { if (quantityTable[childName] !== 1) { return [false, 'Quantity of ' + childName + ' should be exactly one.']; } } else if (quantity === _Box2.default.QUANTITY_ZERO_OR_ONE) { if (quantityTable[childName] > 1) { return [false, 'Quantity of ' + childName + ' should be zero or one.']; } } } return [true, null]; } function createElement(type) { var componentClass = void 0, element = void 0, context = {}, spec = void 0, result = void 0, errorMessage = void 0, checkList = void 0; // Validate type. if (typeof type === 'string') { componentClass = clazz[type]; if (!componentClass) { console.error('IsoBmff.createElement: invalid type: "' + type + '"'); return null; } type = componentClass; } else if (!type || !(type instanceof _Box2.default)) { console.error('IsoBmff.createElement: "type" should be a subclass of the Box.'); return null; } else { componentClass = type; } // Create element. for (var _len = arguments.length, otherParams = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { otherParams[_key - 1] = arguments[_key]; } if (!(element = _MediaFormat.createElement.apply(undefined, [type].concat(otherParams)))) { return null; } // Validate children. spec = componentClass.spec; context = { container: componentClass.COMPACT_NAME, mandatoryCheckList: {}, quantityTable: {} }; if (!element.props.children.every(function (child) { var _validateChild = validateChild(context, child); var _validateChild2 = (0, _slicedToArray3.default)(_validateChild, 2); result = _validateChild2[0]; errorMessage = _validateChild2[1]; return result; })) { console.error('IsoBmff.createElement: Breaking the composition rule: ' + errorMessage); return null; } checkList = context.mandatoryCheckList; spec.mandatoryBoxList.forEach(function (boxType) { if (boxType instanceof Array) { if (boxType.some(function (box) { return checkList[box]; })) { return; } boxType = boxType.join('", or "'); } else { if (checkList[boxType]) { return; } } console.error('IsoBmff.createElement: Breaking the composition rule: "' + boxType + '" is required as a child of "' + context.container + '"'); element = null; }); return element; } function parse(buffer, offset, visitor) { var readBytesNum = void 0; var props = void 0; var base = offset; // Read the Box params as we don't know the 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 boxEnd = offset + boxSize; var boxType = props.type === 'uuid' ? props.extendedType : props.type; //console.log(`parse enter.: type=${boxType} size=${boxSize} offset=${offset}`); if (boxType.length < 4) { console.error('IsoBmff.createElementFromBuffer: Invalid type - "' + boxType + '"'); visitor.offset += readBytesNum; return boxSize; } var boxClass = clazz[boxType]; if (!boxClass) { console.error('IsoBmff.createElementFromBuffer: Unsupported type - "' + boxType + '"'); var _UnknownBox$parse = _UnknownBox2.default.parse(buffer, offset, boxType); var _UnknownBox$parse2 = (0, _slicedToArray3.default)(_UnknownBox$parse, 2); readBytesNum = _UnknownBox$parse2[0]; props = _UnknownBox$parse2[1]; boxClass = _UnknownBox2.default; } else { var _boxClass$parse = boxClass.parse(buffer, offset); var _boxClass$parse2 = (0, _slicedToArray3.default)(_boxClass$parse, 2); readBytesNum = _boxClass$parse2[0]; props = _boxClass$parse2[1]; } base += readBytesNum; visitor.offset = base; visitor.enter(boxClass, props); while (base < boxEnd) { readBytesNum = parse(buffer, base, visitor); base += readBytesNum; } visitor.exit(); visitor.offset = base; //console.log(`parse exit.: type=${boxType} readBytesNum=${Math.min(base - offset, boxSize)}`); return Math.min(base - offset, boxSize); } function createElementFromBuffer(buffer) { var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; var base = offset; if (buffer instanceof ArrayBuffer) { buffer = new Uint8Array(buffer); } var endOfBuffer = base + buffer.length; var visitor = new _Visitor.ElementVisitor(); try { while (base < endOfBuffer) { var readBytesNum = parse(buffer, base, visitor); base += readBytesNum; } } catch (err) { if (err.message !== _Error.BufferReadError.ERROR_MESSAGE) { console.error('IsoBmff.transform: An error occurred in parsing the buffer: ' + err.stack); } return null; } //console.log(`IsoBmff.createElementFromBuffer: Done. ${base - offset} bytes read.`); if (visitor.results.length === 0) { return null; } else if (visitor.results.length === 1) { return visitor.results[0]; } return _MediaFormat.createElement.apply(undefined, [clazz.file, null].concat((0, _toConsumableArray3.default)(visitor.results))); } function transform(visitor) { var Kontainer = require('..').default; // Ugly.. var vtor = void 0; if (visitor instanceof _Visitor.Visitor) { vtor = visitor; } else { // Received a filter function var TransformVisitor = function (_ElementVisitor) { (0, _inherits3.default)(TransformVisitor, _ElementVisitor); function TransformVisitor() { (0, _classCallCheck3.default)(this, TransformVisitor); return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(TransformVisitor).apply(this, arguments)); } (0, _createClass3.default)(TransformVisitor, [{ key: 'visit', value: function visit(type, props, children) { visitor(type.COMPACT_NAME, props, children); return (0, _get3.default)((0, _getPrototypeOf2.default)(TransformVisitor.prototype), 'visit', this).call(this, type, props, children); } }]); return TransformVisitor; }(_Visitor.ElementVisitor); vtor = new TransformVisitor(); } return new _Stream.TransformStream(function (buffer, offset, done) { var base = vtor.offset; var buf = buffer.getData(); if (buf instanceof ArrayBuffer) { buf = new Uint8Array(buf); } var endOfBuffer = buf.length; try { while (base < endOfBuffer) { var readBytesNum = parse(buf, base, vtor); base += readBytesNum; } } catch (err) { if (err.message !== _Error.BufferReadError.ERROR_MESSAGE) { console.error('IsoBmff.transform: An error occurred in parsing the buffer: ' + err.stack); } done(null, null); return; } while (vtor.stack.length) { vtor.exit(); } done(null, Kontainer.renderToBuffer(_MediaFormat.createElement.apply(undefined, [clazz.file, null].concat((0, _toConsumableArray3.default)(vtor.results))))); }); } exports.default = { createElement: createElement, createElementFromBuffer: createElementFromBuffer, transform: transform, ElementVisitor: _Visitor.ElementVisitor, IsoBmffDumpVisitor: _BoxVisitor.IsoBmffDumpVisitor };