kontainer-js
Version:
A media file format generator/parser that exposes a React-like API.
353 lines (269 loc) • 12 kB
JavaScript
'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: []
};