UNPKG

kontainer-js

Version:

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

353 lines (269 loc) 12 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = undefined; var _slicedToArray2 = require('babel-runtime/helpers/slicedToArray'); var _slicedToArray3 = _interopRequireDefault(_slicedToArray2); 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 _Box2 = require('./Box'); var _Box3 = _interopRequireDefault(_Box2); var _PropTypes = require('../../core/PropTypes'); var _PropTypes2 = _interopRequireDefault(_PropTypes); var _Writer = require('../../core/Writer'); var _Writer2 = _interopRequireDefault(_Writer); var _Reader = require('../../core/Reader'); var _Reader2 = _interopRequireDefault(_Reader); var _Buffer = require('../../core/Buffer'); var _Buffer2 = _interopRequireDefault(_Buffer); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var AVCConfigurationBox = function (_Box) { (0, _inherits3.default)(AVCConfigurationBox, _Box); function AVCConfigurationBox(props) { (0, _classCallCheck3.default)(this, AVCConfigurationBox); return (0, _possibleConstructorReturn3.default)(this, (0, _getPrototypeOf2.default)(AVCConfigurationBox).call(this, AVCConfigurationBox.COMPACT_NAME, props)); } (0, _createClass3.default)(AVCConfigurationBox, [{ key: 'serialize', value: function serialize(buffer) { var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; //console.log('--- AVCConfigurationBox.serialize enter.'); var props = this.props; var configurationVersion = props.configurationVersion; var avcProfileIndication = props.avcProfileIndication; var profileCompatibility = props.profileCompatibility; var avcLevelIndication = props.avcLevelIndication; var lengthSizeMinusOne = props.lengthSize - 1; var sequenceParameterSets = props.sequenceParameterSets; var pictureParameterSets = props.pictureParameterSets; var base = offset; base += (0, _get3.default)((0, _getPrototypeOf2.default)(AVCConfigurationBox.prototype), 'serialize', this).call(this, buffer, base); base += _Writer2.default.writeNumber(configurationVersion, buffer, base, 1); base += _Writer2.default.writeNumber(AVCConfigurationBox.encodeProfile(avcProfileIndication), buffer, base, 1); base += _Writer2.default.writeNumber(AVCConfigurationBox.encodeCompatibility(profileCompatibility), buffer, base, 1); base += _Writer2.default.writeNumber(avcLevelIndication * 10 | 0, buffer, base, 1); base += _Writer2.default.writeNumber(0xFC | lengthSizeMinusOne, buffer, base, 1); base += _Writer2.default.writeNumber(0xE0 | sequenceParameterSets.length, buffer, base, 1); sequenceParameterSets.forEach(function (sps) { var length = sps.length; var data = sps.data; base += _Writer2.default.writeNumber(length, buffer, base, 2); if (buffer) { _Buffer2.default.wrap(buffer).copyFrom(data, 0, length, base); } base += length; }); base += _Writer2.default.writeNumber(pictureParameterSets.length, buffer, base, 1); pictureParameterSets.forEach(function (pps) { var length = pps.length; var data = pps.data; base += _Writer2.default.writeNumber(length, buffer, base, 2); if (buffer) { _Buffer2.default.wrap(buffer).copyFrom(data, 0, length, base); } base += length; }); (0, _get3.default)((0, _getPrototypeOf2.default)(AVCConfigurationBox.prototype), 'setSize', this).call(this, base - offset, buffer, offset); //console.log(`--- AVCConfigurationBox.serialize exit. size=${this.size}`); return this.size; } }], [{ key: 'encodeProfile', value: function encodeProfile(profile) { var p = 0; if (profile === 'baseline') { p = 66; } else if (profile === 'main') { p = 77; } else if (profile === 'extended') { p = 88; } else if (profile === 'high') { p = 100; } return p; } }, { key: 'decodeProfile', value: function decodeProfile(p) { var profile = ''; if (p === 66) { profile = 'baseline'; } else if (p === 77) { profile = 'main'; } else if (p === 88) { profile = 'extended'; } else if (p === 100) { profile = 'high'; } else { console.error('IsoBmff.AVConfigurationBox.parse: Unknown profile - ' + p); } return profile; } }, { key: 'encodeCompatibility', value: function encodeCompatibility(compat) { var c = 0; if (compat.constraintSet0Flag) { c |= 0x01; } if (compat.constraintSet1Flag) { c |= 0x02; } if (compat.constraintSet2Flag) { c |= 0x04; } return c; } }, { key: 'decodeCompatibility', value: function decodeCompatibility(c) { var compat = { constraintSet0Flag: false, constraintSet1Flag: false, constraintSet2Flag: false }; if (c & 0x01) { compat.constraintSet0Flag = true; } if (c & 0x02) { compat.constraintSet1Flag = true; } if (c & 0x04) { compat.constraintSet2Flag = true; } return compat; } }, { key: 'parse', value: function parse(buffer) { var offset = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1]; var base = offset, readBytesNum = void 0, props = void 0, length = void 0, data = void 0, configurationVersion = void 0, avcProfileIndication = void 0, profileCompatibility = void 0, avcLevelIndication = void 0, lengthSizeMinusOne = void 0, numOfParameterSets = void 0, sequenceParameterSets = [], pictureParameterSets = []; var _Box$parse = _Box3.default.parse(buffer, base); var _Box$parse2 = (0, _slicedToArray3.default)(_Box$parse, 2); readBytesNum = _Box$parse2[0]; props = _Box$parse2[1]; base += readBytesNum; var _Reader$readNumber = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber2 = (0, _slicedToArray3.default)(_Reader$readNumber, 2); readBytesNum = _Reader$readNumber2[0]; configurationVersion = _Reader$readNumber2[1]; base += readBytesNum; var _Reader$readNumber3 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber4 = (0, _slicedToArray3.default)(_Reader$readNumber3, 2); readBytesNum = _Reader$readNumber4[0]; avcProfileIndication = _Reader$readNumber4[1]; base += readBytesNum; var _Reader$readNumber5 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber6 = (0, _slicedToArray3.default)(_Reader$readNumber5, 2); readBytesNum = _Reader$readNumber6[0]; profileCompatibility = _Reader$readNumber6[1]; base += readBytesNum; var _Reader$readNumber7 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber8 = (0, _slicedToArray3.default)(_Reader$readNumber7, 2); readBytesNum = _Reader$readNumber8[0]; avcLevelIndication = _Reader$readNumber8[1]; base += readBytesNum; var _Reader$readNumber9 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber10 = (0, _slicedToArray3.default)(_Reader$readNumber9, 2); readBytesNum = _Reader$readNumber10[0]; lengthSizeMinusOne = _Reader$readNumber10[1]; base += readBytesNum; var _Reader$readNumber11 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber12 = (0, _slicedToArray3.default)(_Reader$readNumber11, 2); readBytesNum = _Reader$readNumber12[0]; numOfParameterSets = _Reader$readNumber12[1]; base += readBytesNum; numOfParameterSets &= 0x1F; for (var i = 0; i < numOfParameterSets; i++) { var _Reader$readNumber13 = _Reader2.default.readNumber(buffer, base, 2); var _Reader$readNumber14 = (0, _slicedToArray3.default)(_Reader$readNumber13, 2); readBytesNum = _Reader$readNumber14[0]; length = _Reader$readNumber14[1]; base += readBytesNum; _Reader2.default.ASSERT(buffer, base, length); var buf = _Buffer2.default.wrap(buffer).copy(base, length); base += length; sequenceParameterSets.push({ length: length, data: buf.getData() }); } var _Reader$readNumber15 = _Reader2.default.readNumber(buffer, base, 1); var _Reader$readNumber16 = (0, _slicedToArray3.default)(_Reader$readNumber15, 2); readBytesNum = _Reader$readNumber16[0]; numOfParameterSets = _Reader$readNumber16[1]; base += readBytesNum; for (var _i = 0; _i < numOfParameterSets; _i++) { var _Reader$readNumber17 = _Reader2.default.readNumber(buffer, base, 2); var _Reader$readNumber18 = (0, _slicedToArray3.default)(_Reader$readNumber17, 2); readBytesNum = _Reader$readNumber18[0]; length = _Reader$readNumber18[1]; base += readBytesNum; _Reader2.default.ASSERT(buffer, base, length); var _buf = _Buffer2.default.wrap(buffer).copy(base, length); base += length; pictureParameterSets.push({ length: length, data: _buf.getData() }); } props.configurationVersion = configurationVersion; props.avcProfileIndication = AVCConfigurationBox.decodeProfile(avcProfileIndication); props.profileCompatibility = AVCConfigurationBox.decodeCompatibility(profileCompatibility); props.avcLevelIndication = avcLevelIndication / 10; props.lengthSize = (lengthSizeMinusOne & 0x03) + 1; props.sequenceParameterSets = sequenceParameterSets; props.pictureParameterSets = pictureParameterSets; return [base - offset, props]; } }]); return AVCConfigurationBox; }(_Box3.default); exports.default = AVCConfigurationBox; AVCConfigurationBox.COMPACT_NAME = 'avcC'; AVCConfigurationBox.propTypes = { configurationVersion: _PropTypes2.default.number, avcProfileIndication: _PropTypes2.default.oneOf(['baseline', 'main', 'extended', 'high']).isRequired, profileCompatibility: _PropTypes2.default.shape({ constraintSet0Flag: _PropTypes2.default.bool, constraintSet1Flag: _PropTypes2.default.bool, constraintSet2Flag: _PropTypes2.default.bool }).isRequired, avcLevelIndication: _PropTypes2.default.oneOf([1, 1.1, 1.2, 1.3, 2, 2.1, 2.2, 3, 3.1, 3.2, 4, 4.1, 4.2, 5, 5.1]).isRequired, lengthSize: _PropTypes2.default.oneOf([1, 2, 4]).isRequired, sequenceParameterSets: _PropTypes2.default.arrayOf(_PropTypes2.default.shape({ length: _PropTypes2.default.number, data: _PropTypes2.default.any })), pictureParameterSets: _PropTypes2.default.arrayOf(_PropTypes2.default.shape({ length: _PropTypes2.default.number, data: _PropTypes2.default.any })) }; AVCConfigurationBox.defaultProps = { configurationVersion: 1, sequenceParameterSets: [], pictureParameterSets: [] }; AVCConfigurationBox.spec = { container: 'avc1', quantity: _Box3.default.QUANTITY_EXACTORY_ONE, mandatoryList: [] };