mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-03 17:59:55 +02:00
Git update
This commit is contained in:
parent
bd8d7eedb6
commit
602ca1128e
3123 changed files with 521005 additions and 521005 deletions
392
node_modules/mux.js/lib/tools/caption-packet-parser.js
generated
vendored
392
node_modules/mux.js/lib/tools/caption-packet-parser.js
generated
vendored
|
@ -1,196 +1,196 @@
|
|||
/**
|
||||
* mux.js
|
||||
*
|
||||
* Copyright (c) Brightcove
|
||||
* Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE
|
||||
*
|
||||
* Reads in-band caption information from a video elementary
|
||||
* stream. Captions must follow the CEA-708 standard for injection
|
||||
* into an MPEG-2 transport streams.
|
||||
* @see https://en.wikipedia.org/wiki/CEA-708
|
||||
* @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// Supplemental enhancement information (SEI) NAL units have a
|
||||
// payload type field to indicate how they are to be
|
||||
// interpreted. CEAS-708 caption content is always transmitted with
|
||||
// payload type 0x04.
|
||||
var USER_DATA_REGISTERED_ITU_T_T35 = 4,
|
||||
RBSP_TRAILING_BITS = 128;
|
||||
|
||||
/**
|
||||
* Parse a supplemental enhancement information (SEI) NAL unit.
|
||||
* Stops parsing once a message of type ITU T T35 has been found.
|
||||
*
|
||||
* @param bytes {Uint8Array} the bytes of a SEI NAL unit
|
||||
* @return {object} the parsed SEI payload
|
||||
* @see Rec. ITU-T H.264, 7.3.2.3.1
|
||||
*/
|
||||
var parseSei = function(bytes) {
|
||||
var
|
||||
i = 0,
|
||||
result = {
|
||||
payloadType: -1,
|
||||
payloadSize: 0
|
||||
},
|
||||
payloadType = 0,
|
||||
payloadSize = 0;
|
||||
|
||||
// go through the sei_rbsp parsing each each individual sei_message
|
||||
while (i < bytes.byteLength) {
|
||||
// stop once we have hit the end of the sei_rbsp
|
||||
if (bytes[i] === RBSP_TRAILING_BITS) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Parse payload type
|
||||
while (bytes[i] === 0xFF) {
|
||||
payloadType += 255;
|
||||
i++;
|
||||
}
|
||||
payloadType += bytes[i++];
|
||||
|
||||
// Parse payload size
|
||||
while (bytes[i] === 0xFF) {
|
||||
payloadSize += 255;
|
||||
i++;
|
||||
}
|
||||
payloadSize += bytes[i++];
|
||||
|
||||
// this sei_message is a 608/708 caption so save it and break
|
||||
// there can only ever be one caption message in a frame's sei
|
||||
if (!result.payload && payloadType === USER_DATA_REGISTERED_ITU_T_T35) {
|
||||
var userIdentifier = String.fromCharCode(
|
||||
bytes[i + 3],
|
||||
bytes[i + 4],
|
||||
bytes[i + 5],
|
||||
bytes[i + 6]);
|
||||
|
||||
if (userIdentifier === 'GA94') {
|
||||
result.payloadType = payloadType;
|
||||
result.payloadSize = payloadSize;
|
||||
result.payload = bytes.subarray(i, i + payloadSize);
|
||||
break;
|
||||
} else {
|
||||
result.payload = void 0;
|
||||
}
|
||||
}
|
||||
|
||||
// skip the payload and parse the next message
|
||||
i += payloadSize;
|
||||
payloadType = 0;
|
||||
payloadSize = 0;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
// see ANSI/SCTE 128-1 (2013), section 8.1
|
||||
var parseUserData = function(sei) {
|
||||
// itu_t_t35_contry_code must be 181 (United States) for
|
||||
// captions
|
||||
if (sei.payload[0] !== 181) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// itu_t_t35_provider_code should be 49 (ATSC) for captions
|
||||
if (((sei.payload[1] << 8) | sei.payload[2]) !== 49) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// the user_identifier should be "GA94" to indicate ATSC1 data
|
||||
if (String.fromCharCode(sei.payload[3],
|
||||
sei.payload[4],
|
||||
sei.payload[5],
|
||||
sei.payload[6]) !== 'GA94') {
|
||||
return null;
|
||||
}
|
||||
|
||||
// finally, user_data_type_code should be 0x03 for caption data
|
||||
if (sei.payload[7] !== 0x03) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// return the user_data_type_structure and strip the trailing
|
||||
// marker bits
|
||||
return sei.payload.subarray(8, sei.payload.length - 1);
|
||||
};
|
||||
|
||||
// see CEA-708-D, section 4.4
|
||||
var parseCaptionPackets = function(pts, userData) {
|
||||
var results = [], i, count, offset, data;
|
||||
|
||||
// if this is just filler, return immediately
|
||||
if (!(userData[0] & 0x40)) {
|
||||
return results;
|
||||
}
|
||||
|
||||
// parse out the cc_data_1 and cc_data_2 fields
|
||||
count = userData[0] & 0x1f;
|
||||
for (i = 0; i < count; i++) {
|
||||
offset = i * 3;
|
||||
data = {
|
||||
type: userData[offset + 2] & 0x03,
|
||||
pts: pts
|
||||
};
|
||||
|
||||
// capture cc data when cc_valid is 1
|
||||
if (userData[offset + 2] & 0x04) {
|
||||
data.ccData = (userData[offset + 3] << 8) | userData[offset + 4];
|
||||
results.push(data);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
var discardEmulationPreventionBytes = function(data) {
|
||||
var
|
||||
length = data.byteLength,
|
||||
emulationPreventionBytesPositions = [],
|
||||
i = 1,
|
||||
newLength, newData;
|
||||
|
||||
// Find all `Emulation Prevention Bytes`
|
||||
while (i < length - 2) {
|
||||
if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {
|
||||
emulationPreventionBytesPositions.push(i + 2);
|
||||
i += 2;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
// If no Emulation Prevention Bytes were found just return the original
|
||||
// array
|
||||
if (emulationPreventionBytesPositions.length === 0) {
|
||||
return data;
|
||||
}
|
||||
|
||||
// Create a new array to hold the NAL unit data
|
||||
newLength = length - emulationPreventionBytesPositions.length;
|
||||
newData = new Uint8Array(newLength);
|
||||
var sourceIndex = 0;
|
||||
|
||||
for (i = 0; i < newLength; sourceIndex++, i++) {
|
||||
if (sourceIndex === emulationPreventionBytesPositions[0]) {
|
||||
// Skip this byte
|
||||
sourceIndex++;
|
||||
// Remove this position index
|
||||
emulationPreventionBytesPositions.shift();
|
||||
}
|
||||
newData[i] = data[sourceIndex];
|
||||
}
|
||||
|
||||
return newData;
|
||||
};
|
||||
|
||||
// exports
|
||||
module.exports = {
|
||||
parseSei: parseSei,
|
||||
parseUserData: parseUserData,
|
||||
parseCaptionPackets: parseCaptionPackets,
|
||||
discardEmulationPreventionBytes: discardEmulationPreventionBytes,
|
||||
USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35
|
||||
};
|
||||
/**
|
||||
* mux.js
|
||||
*
|
||||
* Copyright (c) Brightcove
|
||||
* Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE
|
||||
*
|
||||
* Reads in-band caption information from a video elementary
|
||||
* stream. Captions must follow the CEA-708 standard for injection
|
||||
* into an MPEG-2 transport streams.
|
||||
* @see https://en.wikipedia.org/wiki/CEA-708
|
||||
* @see https://www.gpo.gov/fdsys/pkg/CFR-2007-title47-vol1/pdf/CFR-2007-title47-vol1-sec15-119.pdf
|
||||
*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// Supplemental enhancement information (SEI) NAL units have a
|
||||
// payload type field to indicate how they are to be
|
||||
// interpreted. CEAS-708 caption content is always transmitted with
|
||||
// payload type 0x04.
|
||||
var USER_DATA_REGISTERED_ITU_T_T35 = 4,
|
||||
RBSP_TRAILING_BITS = 128;
|
||||
|
||||
/**
|
||||
* Parse a supplemental enhancement information (SEI) NAL unit.
|
||||
* Stops parsing once a message of type ITU T T35 has been found.
|
||||
*
|
||||
* @param bytes {Uint8Array} the bytes of a SEI NAL unit
|
||||
* @return {object} the parsed SEI payload
|
||||
* @see Rec. ITU-T H.264, 7.3.2.3.1
|
||||
*/
|
||||
var parseSei = function(bytes) {
|
||||
var
|
||||
i = 0,
|
||||
result = {
|
||||
payloadType: -1,
|
||||
payloadSize: 0
|
||||
},
|
||||
payloadType = 0,
|
||||
payloadSize = 0;
|
||||
|
||||
// go through the sei_rbsp parsing each each individual sei_message
|
||||
while (i < bytes.byteLength) {
|
||||
// stop once we have hit the end of the sei_rbsp
|
||||
if (bytes[i] === RBSP_TRAILING_BITS) {
|
||||
break;
|
||||
}
|
||||
|
||||
// Parse payload type
|
||||
while (bytes[i] === 0xFF) {
|
||||
payloadType += 255;
|
||||
i++;
|
||||
}
|
||||
payloadType += bytes[i++];
|
||||
|
||||
// Parse payload size
|
||||
while (bytes[i] === 0xFF) {
|
||||
payloadSize += 255;
|
||||
i++;
|
||||
}
|
||||
payloadSize += bytes[i++];
|
||||
|
||||
// this sei_message is a 608/708 caption so save it and break
|
||||
// there can only ever be one caption message in a frame's sei
|
||||
if (!result.payload && payloadType === USER_DATA_REGISTERED_ITU_T_T35) {
|
||||
var userIdentifier = String.fromCharCode(
|
||||
bytes[i + 3],
|
||||
bytes[i + 4],
|
||||
bytes[i + 5],
|
||||
bytes[i + 6]);
|
||||
|
||||
if (userIdentifier === 'GA94') {
|
||||
result.payloadType = payloadType;
|
||||
result.payloadSize = payloadSize;
|
||||
result.payload = bytes.subarray(i, i + payloadSize);
|
||||
break;
|
||||
} else {
|
||||
result.payload = void 0;
|
||||
}
|
||||
}
|
||||
|
||||
// skip the payload and parse the next message
|
||||
i += payloadSize;
|
||||
payloadType = 0;
|
||||
payloadSize = 0;
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
// see ANSI/SCTE 128-1 (2013), section 8.1
|
||||
var parseUserData = function(sei) {
|
||||
// itu_t_t35_contry_code must be 181 (United States) for
|
||||
// captions
|
||||
if (sei.payload[0] !== 181) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// itu_t_t35_provider_code should be 49 (ATSC) for captions
|
||||
if (((sei.payload[1] << 8) | sei.payload[2]) !== 49) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// the user_identifier should be "GA94" to indicate ATSC1 data
|
||||
if (String.fromCharCode(sei.payload[3],
|
||||
sei.payload[4],
|
||||
sei.payload[5],
|
||||
sei.payload[6]) !== 'GA94') {
|
||||
return null;
|
||||
}
|
||||
|
||||
// finally, user_data_type_code should be 0x03 for caption data
|
||||
if (sei.payload[7] !== 0x03) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// return the user_data_type_structure and strip the trailing
|
||||
// marker bits
|
||||
return sei.payload.subarray(8, sei.payload.length - 1);
|
||||
};
|
||||
|
||||
// see CEA-708-D, section 4.4
|
||||
var parseCaptionPackets = function(pts, userData) {
|
||||
var results = [], i, count, offset, data;
|
||||
|
||||
// if this is just filler, return immediately
|
||||
if (!(userData[0] & 0x40)) {
|
||||
return results;
|
||||
}
|
||||
|
||||
// parse out the cc_data_1 and cc_data_2 fields
|
||||
count = userData[0] & 0x1f;
|
||||
for (i = 0; i < count; i++) {
|
||||
offset = i * 3;
|
||||
data = {
|
||||
type: userData[offset + 2] & 0x03,
|
||||
pts: pts
|
||||
};
|
||||
|
||||
// capture cc data when cc_valid is 1
|
||||
if (userData[offset + 2] & 0x04) {
|
||||
data.ccData = (userData[offset + 3] << 8) | userData[offset + 4];
|
||||
results.push(data);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
};
|
||||
|
||||
var discardEmulationPreventionBytes = function(data) {
|
||||
var
|
||||
length = data.byteLength,
|
||||
emulationPreventionBytesPositions = [],
|
||||
i = 1,
|
||||
newLength, newData;
|
||||
|
||||
// Find all `Emulation Prevention Bytes`
|
||||
while (i < length - 2) {
|
||||
if (data[i] === 0 && data[i + 1] === 0 && data[i + 2] === 0x03) {
|
||||
emulationPreventionBytesPositions.push(i + 2);
|
||||
i += 2;
|
||||
} else {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
// If no Emulation Prevention Bytes were found just return the original
|
||||
// array
|
||||
if (emulationPreventionBytesPositions.length === 0) {
|
||||
return data;
|
||||
}
|
||||
|
||||
// Create a new array to hold the NAL unit data
|
||||
newLength = length - emulationPreventionBytesPositions.length;
|
||||
newData = new Uint8Array(newLength);
|
||||
var sourceIndex = 0;
|
||||
|
||||
for (i = 0; i < newLength; sourceIndex++, i++) {
|
||||
if (sourceIndex === emulationPreventionBytesPositions[0]) {
|
||||
// Skip this byte
|
||||
sourceIndex++;
|
||||
// Remove this position index
|
||||
emulationPreventionBytesPositions.shift();
|
||||
}
|
||||
newData[i] = data[sourceIndex];
|
||||
}
|
||||
|
||||
return newData;
|
||||
};
|
||||
|
||||
// exports
|
||||
module.exports = {
|
||||
parseSei: parseSei,
|
||||
parseUserData: parseUserData,
|
||||
parseCaptionPackets: parseCaptionPackets,
|
||||
discardEmulationPreventionBytes: discardEmulationPreventionBytes,
|
||||
USER_DATA_REGISTERED_ITU_T_T35: USER_DATA_REGISTERED_ITU_T_T35
|
||||
};
|
||||
|
|
344
node_modules/mux.js/lib/tools/flv-inspector.js
generated
vendored
344
node_modules/mux.js/lib/tools/flv-inspector.js
generated
vendored
|
@ -1,172 +1,172 @@
|
|||
/**
|
||||
* mux.js
|
||||
*
|
||||
* Copyright (c) Brightcove
|
||||
* Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var
|
||||
tagTypes = {
|
||||
0x08: 'audio',
|
||||
0x09: 'video',
|
||||
0x12: 'metadata'
|
||||
},
|
||||
hex = function(val) {
|
||||
return '0x' + ('00' + val.toString(16)).slice(-2).toUpperCase();
|
||||
},
|
||||
hexStringList = function(data) {
|
||||
var arr = [], i;
|
||||
|
||||
while (data.byteLength > 0) {
|
||||
i = 0;
|
||||
arr.push(hex(data[i++]));
|
||||
data = data.subarray(i);
|
||||
}
|
||||
return arr.join(' ');
|
||||
},
|
||||
parseAVCTag = function(tag, obj) {
|
||||
var
|
||||
avcPacketTypes = [
|
||||
'AVC Sequence Header',
|
||||
'AVC NALU',
|
||||
'AVC End-of-Sequence'
|
||||
],
|
||||
compositionTime = (tag[1] & parseInt('01111111', 2) << 16) | (tag[2] << 8) | tag[3];
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.avcPacketType = avcPacketTypes[tag[0]];
|
||||
obj.CompositionTime = (tag[1] & parseInt('10000000', 2)) ? -compositionTime : compositionTime;
|
||||
|
||||
if (tag[0] === 1) {
|
||||
obj.nalUnitTypeRaw = hexStringList(tag.subarray(4, 100));
|
||||
} else {
|
||||
obj.data = hexStringList(tag.subarray(4));
|
||||
}
|
||||
|
||||
return obj;
|
||||
},
|
||||
parseVideoTag = function(tag, obj) {
|
||||
var
|
||||
frameTypes = [
|
||||
'Unknown',
|
||||
'Keyframe (for AVC, a seekable frame)',
|
||||
'Inter frame (for AVC, a nonseekable frame)',
|
||||
'Disposable inter frame (H.263 only)',
|
||||
'Generated keyframe (reserved for server use only)',
|
||||
'Video info/command frame'
|
||||
],
|
||||
codecID = tag[0] & parseInt('00001111', 2);
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.frameType = frameTypes[(tag[0] & parseInt('11110000', 2)) >>> 4];
|
||||
obj.codecID = codecID;
|
||||
|
||||
if (codecID === 7) {
|
||||
return parseAVCTag(tag.subarray(1), obj);
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
parseAACTag = function(tag, obj) {
|
||||
var packetTypes = [
|
||||
'AAC Sequence Header',
|
||||
'AAC Raw'
|
||||
];
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.aacPacketType = packetTypes[tag[0]];
|
||||
obj.data = hexStringList(tag.subarray(1));
|
||||
|
||||
return obj;
|
||||
},
|
||||
parseAudioTag = function(tag, obj) {
|
||||
var
|
||||
formatTable = [
|
||||
'Linear PCM, platform endian',
|
||||
'ADPCM',
|
||||
'MP3',
|
||||
'Linear PCM, little endian',
|
||||
'Nellymoser 16-kHz mono',
|
||||
'Nellymoser 8-kHz mono',
|
||||
'Nellymoser',
|
||||
'G.711 A-law logarithmic PCM',
|
||||
'G.711 mu-law logarithmic PCM',
|
||||
'reserved',
|
||||
'AAC',
|
||||
'Speex',
|
||||
'MP3 8-Khz',
|
||||
'Device-specific sound'
|
||||
],
|
||||
samplingRateTable = [
|
||||
'5.5-kHz',
|
||||
'11-kHz',
|
||||
'22-kHz',
|
||||
'44-kHz'
|
||||
],
|
||||
soundFormat = (tag[0] & parseInt('11110000', 2)) >>> 4;
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.soundFormat = formatTable[soundFormat];
|
||||
obj.soundRate = samplingRateTable[(tag[0] & parseInt('00001100', 2)) >>> 2];
|
||||
obj.soundSize = ((tag[0] & parseInt('00000010', 2)) >>> 1) ? '16-bit' : '8-bit';
|
||||
obj.soundType = (tag[0] & parseInt('00000001', 2)) ? 'Stereo' : 'Mono';
|
||||
|
||||
if (soundFormat === 10) {
|
||||
return parseAACTag(tag.subarray(1), obj);
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
parseGenericTag = function(tag) {
|
||||
return {
|
||||
tagType: tagTypes[tag[0]],
|
||||
dataSize: (tag[1] << 16) | (tag[2] << 8) | tag[3],
|
||||
timestamp: (tag[7] << 24) | (tag[4] << 16) | (tag[5] << 8) | tag[6],
|
||||
streamID: (tag[8] << 16) | (tag[9] << 8) | tag[10]
|
||||
};
|
||||
},
|
||||
inspectFlvTag = function(tag) {
|
||||
var header = parseGenericTag(tag);
|
||||
switch (tag[0]) {
|
||||
case 0x08:
|
||||
parseAudioTag(tag.subarray(11), header);
|
||||
break;
|
||||
case 0x09:
|
||||
parseVideoTag(tag.subarray(11), header);
|
||||
break;
|
||||
case 0x12:
|
||||
}
|
||||
return header;
|
||||
},
|
||||
inspectFlv = function(bytes) {
|
||||
var i = 9, // header
|
||||
dataSize,
|
||||
parsedResults = [],
|
||||
tag;
|
||||
|
||||
// traverse the tags
|
||||
i += 4; // skip previous tag size
|
||||
while (i < bytes.byteLength) {
|
||||
dataSize = bytes[i + 1] << 16;
|
||||
dataSize |= bytes[i + 2] << 8;
|
||||
dataSize |= bytes[i + 3];
|
||||
dataSize += 11;
|
||||
|
||||
tag = bytes.subarray(i, i + dataSize);
|
||||
parsedResults.push(inspectFlvTag(tag));
|
||||
i += dataSize + 4;
|
||||
}
|
||||
return parsedResults;
|
||||
},
|
||||
textifyFlv = function(flvTagArray) {
|
||||
return JSON.stringify(flvTagArray, null, 2);
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
inspectTag: inspectFlvTag,
|
||||
inspect: inspectFlv,
|
||||
textify: textifyFlv
|
||||
};
|
||||
/**
|
||||
* mux.js
|
||||
*
|
||||
* Copyright (c) Brightcove
|
||||
* Licensed Apache-2.0 https://github.com/videojs/mux.js/blob/master/LICENSE
|
||||
*/
|
||||
'use strict';
|
||||
|
||||
var
|
||||
tagTypes = {
|
||||
0x08: 'audio',
|
||||
0x09: 'video',
|
||||
0x12: 'metadata'
|
||||
},
|
||||
hex = function(val) {
|
||||
return '0x' + ('00' + val.toString(16)).slice(-2).toUpperCase();
|
||||
},
|
||||
hexStringList = function(data) {
|
||||
var arr = [], i;
|
||||
|
||||
while (data.byteLength > 0) {
|
||||
i = 0;
|
||||
arr.push(hex(data[i++]));
|
||||
data = data.subarray(i);
|
||||
}
|
||||
return arr.join(' ');
|
||||
},
|
||||
parseAVCTag = function(tag, obj) {
|
||||
var
|
||||
avcPacketTypes = [
|
||||
'AVC Sequence Header',
|
||||
'AVC NALU',
|
||||
'AVC End-of-Sequence'
|
||||
],
|
||||
compositionTime = (tag[1] & parseInt('01111111', 2) << 16) | (tag[2] << 8) | tag[3];
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.avcPacketType = avcPacketTypes[tag[0]];
|
||||
obj.CompositionTime = (tag[1] & parseInt('10000000', 2)) ? -compositionTime : compositionTime;
|
||||
|
||||
if (tag[0] === 1) {
|
||||
obj.nalUnitTypeRaw = hexStringList(tag.subarray(4, 100));
|
||||
} else {
|
||||
obj.data = hexStringList(tag.subarray(4));
|
||||
}
|
||||
|
||||
return obj;
|
||||
},
|
||||
parseVideoTag = function(tag, obj) {
|
||||
var
|
||||
frameTypes = [
|
||||
'Unknown',
|
||||
'Keyframe (for AVC, a seekable frame)',
|
||||
'Inter frame (for AVC, a nonseekable frame)',
|
||||
'Disposable inter frame (H.263 only)',
|
||||
'Generated keyframe (reserved for server use only)',
|
||||
'Video info/command frame'
|
||||
],
|
||||
codecID = tag[0] & parseInt('00001111', 2);
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.frameType = frameTypes[(tag[0] & parseInt('11110000', 2)) >>> 4];
|
||||
obj.codecID = codecID;
|
||||
|
||||
if (codecID === 7) {
|
||||
return parseAVCTag(tag.subarray(1), obj);
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
parseAACTag = function(tag, obj) {
|
||||
var packetTypes = [
|
||||
'AAC Sequence Header',
|
||||
'AAC Raw'
|
||||
];
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.aacPacketType = packetTypes[tag[0]];
|
||||
obj.data = hexStringList(tag.subarray(1));
|
||||
|
||||
return obj;
|
||||
},
|
||||
parseAudioTag = function(tag, obj) {
|
||||
var
|
||||
formatTable = [
|
||||
'Linear PCM, platform endian',
|
||||
'ADPCM',
|
||||
'MP3',
|
||||
'Linear PCM, little endian',
|
||||
'Nellymoser 16-kHz mono',
|
||||
'Nellymoser 8-kHz mono',
|
||||
'Nellymoser',
|
||||
'G.711 A-law logarithmic PCM',
|
||||
'G.711 mu-law logarithmic PCM',
|
||||
'reserved',
|
||||
'AAC',
|
||||
'Speex',
|
||||
'MP3 8-Khz',
|
||||
'Device-specific sound'
|
||||
],
|
||||
samplingRateTable = [
|
||||
'5.5-kHz',
|
||||
'11-kHz',
|
||||
'22-kHz',
|
||||
'44-kHz'
|
||||
],
|
||||
soundFormat = (tag[0] & parseInt('11110000', 2)) >>> 4;
|
||||
|
||||
obj = obj || {};
|
||||
|
||||
obj.soundFormat = formatTable[soundFormat];
|
||||
obj.soundRate = samplingRateTable[(tag[0] & parseInt('00001100', 2)) >>> 2];
|
||||
obj.soundSize = ((tag[0] & parseInt('00000010', 2)) >>> 1) ? '16-bit' : '8-bit';
|
||||
obj.soundType = (tag[0] & parseInt('00000001', 2)) ? 'Stereo' : 'Mono';
|
||||
|
||||
if (soundFormat === 10) {
|
||||
return parseAACTag(tag.subarray(1), obj);
|
||||
}
|
||||
return obj;
|
||||
},
|
||||
parseGenericTag = function(tag) {
|
||||
return {
|
||||
tagType: tagTypes[tag[0]],
|
||||
dataSize: (tag[1] << 16) | (tag[2] << 8) | tag[3],
|
||||
timestamp: (tag[7] << 24) | (tag[4] << 16) | (tag[5] << 8) | tag[6],
|
||||
streamID: (tag[8] << 16) | (tag[9] << 8) | tag[10]
|
||||
};
|
||||
},
|
||||
inspectFlvTag = function(tag) {
|
||||
var header = parseGenericTag(tag);
|
||||
switch (tag[0]) {
|
||||
case 0x08:
|
||||
parseAudioTag(tag.subarray(11), header);
|
||||
break;
|
||||
case 0x09:
|
||||
parseVideoTag(tag.subarray(11), header);
|
||||
break;
|
||||
case 0x12:
|
||||
}
|
||||
return header;
|
||||
},
|
||||
inspectFlv = function(bytes) {
|
||||
var i = 9, // header
|
||||
dataSize,
|
||||
parsedResults = [],
|
||||
tag;
|
||||
|
||||
// traverse the tags
|
||||
i += 4; // skip previous tag size
|
||||
while (i < bytes.byteLength) {
|
||||
dataSize = bytes[i + 1] << 16;
|
||||
dataSize |= bytes[i + 2] << 8;
|
||||
dataSize |= bytes[i + 3];
|
||||
dataSize += 11;
|
||||
|
||||
tag = bytes.subarray(i, i + dataSize);
|
||||
parsedResults.push(inspectFlvTag(tag));
|
||||
i += dataSize + 4;
|
||||
}
|
||||
return parsedResults;
|
||||
},
|
||||
textifyFlv = function(flvTagArray) {
|
||||
return JSON.stringify(flvTagArray, null, 2);
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
inspectTag: inspectFlvTag,
|
||||
inspect: inspectFlv,
|
||||
textify: textifyFlv
|
||||
};
|
||||
|
|
1508
node_modules/mux.js/lib/tools/mp4-inspector.js
generated
vendored
1508
node_modules/mux.js/lib/tools/mp4-inspector.js
generated
vendored
File diff suppressed because it is too large
Load diff
26
node_modules/mux.js/lib/tools/parse-sample-flags.js
generated
vendored
26
node_modules/mux.js/lib/tools/parse-sample-flags.js
generated
vendored
|
@ -1,13 +1,13 @@
|
|||
var parseSampleFlags = function(flags) {
|
||||
return {
|
||||
isLeading: (flags[0] & 0x0c) >>> 2,
|
||||
dependsOn: flags[0] & 0x03,
|
||||
isDependedOn: (flags[1] & 0xc0) >>> 6,
|
||||
hasRedundancy: (flags[1] & 0x30) >>> 4,
|
||||
paddingValue: (flags[1] & 0x0e) >>> 1,
|
||||
isNonSyncSample: flags[1] & 0x01,
|
||||
degradationPriority: (flags[2] << 8) | flags[3]
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = parseSampleFlags;
|
||||
var parseSampleFlags = function(flags) {
|
||||
return {
|
||||
isLeading: (flags[0] & 0x0c) >>> 2,
|
||||
dependsOn: flags[0] & 0x03,
|
||||
isDependedOn: (flags[1] & 0xc0) >>> 6,
|
||||
hasRedundancy: (flags[1] & 0x30) >>> 4,
|
||||
paddingValue: (flags[1] & 0x0e) >>> 1,
|
||||
isNonSyncSample: flags[1] & 0x01,
|
||||
degradationPriority: (flags[2] << 8) | flags[3]
|
||||
};
|
||||
};
|
||||
|
||||
module.exports = parseSampleFlags;
|
||||
|
|
92
node_modules/mux.js/lib/tools/parse-sidx.js
generated
vendored
92
node_modules/mux.js/lib/tools/parse-sidx.js
generated
vendored
|
@ -1,46 +1,46 @@
|
|||
var MAX_UINT32 = Math.pow(2, 32);
|
||||
|
||||
var parseSidx = function(data) {
|
||||
var view = new DataView(data.buffer, data.byteOffset, data.byteLength),
|
||||
result = {
|
||||
version: data[0],
|
||||
flags: new Uint8Array(data.subarray(1, 4)),
|
||||
references: [],
|
||||
referenceId: view.getUint32(4),
|
||||
timescale: view.getUint32(8)
|
||||
},
|
||||
i = 12;
|
||||
|
||||
if (result.version === 0) {
|
||||
result.earliestPresentationTime = view.getUint32(i);
|
||||
result.firstOffset = view.getUint32(i + 4);
|
||||
i += 8;
|
||||
} else {
|
||||
// read 64 bits
|
||||
result.earliestPresentationTime = (view.getUint32(i) * MAX_UINT32) + view.getUint32(i + 4);
|
||||
result.firstOffset = (view.getUint32(i + 8) * MAX_UINT32) + view.getUint32(i + 12);
|
||||
i += 16;
|
||||
}
|
||||
|
||||
i += 2; // reserved
|
||||
|
||||
var referenceCount = view.getUint16(i);
|
||||
|
||||
i += 2; // start of references
|
||||
|
||||
for (; referenceCount > 0; i += 12, referenceCount--) {
|
||||
result.references.push({
|
||||
referenceType: (data[i] & 0x80) >>> 7,
|
||||
referencedSize: view.getUint32(i) & 0x7FFFFFFF,
|
||||
subsegmentDuration: view.getUint32(i + 4),
|
||||
startsWithSap: !!(data[i + 8] & 0x80),
|
||||
sapType: (data[i + 8] & 0x70) >>> 4,
|
||||
sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
module.exports = parseSidx;
|
||||
var MAX_UINT32 = Math.pow(2, 32);
|
||||
|
||||
var parseSidx = function(data) {
|
||||
var view = new DataView(data.buffer, data.byteOffset, data.byteLength),
|
||||
result = {
|
||||
version: data[0],
|
||||
flags: new Uint8Array(data.subarray(1, 4)),
|
||||
references: [],
|
||||
referenceId: view.getUint32(4),
|
||||
timescale: view.getUint32(8)
|
||||
},
|
||||
i = 12;
|
||||
|
||||
if (result.version === 0) {
|
||||
result.earliestPresentationTime = view.getUint32(i);
|
||||
result.firstOffset = view.getUint32(i + 4);
|
||||
i += 8;
|
||||
} else {
|
||||
// read 64 bits
|
||||
result.earliestPresentationTime = (view.getUint32(i) * MAX_UINT32) + view.getUint32(i + 4);
|
||||
result.firstOffset = (view.getUint32(i + 8) * MAX_UINT32) + view.getUint32(i + 12);
|
||||
i += 16;
|
||||
}
|
||||
|
||||
i += 2; // reserved
|
||||
|
||||
var referenceCount = view.getUint16(i);
|
||||
|
||||
i += 2; // start of references
|
||||
|
||||
for (; referenceCount > 0; i += 12, referenceCount--) {
|
||||
result.references.push({
|
||||
referenceType: (data[i] & 0x80) >>> 7,
|
||||
referencedSize: view.getUint32(i) & 0x7FFFFFFF,
|
||||
subsegmentDuration: view.getUint32(i + 4),
|
||||
startsWithSap: !!(data[i + 8] & 0x80),
|
||||
sapType: (data[i + 8] & 0x70) >>> 4,
|
||||
sapDeltaTime: view.getUint32(i + 8) & 0x0FFFFFFF
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
};
|
||||
|
||||
|
||||
module.exports = parseSidx;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue