mirror of
https://github.com/DanielnetoDotCom/YouPHPTube
synced 2025-10-03 17:59:55 +02:00
This commit is contained in:
parent
746e163d01
commit
1c7ea28b46
808 changed files with 316395 additions and 381162 deletions
139
node_modules/mux.js/cjs/m2ts/metadata-stream.js
generated
vendored
139
node_modules/mux.js/cjs/m2ts/metadata-stream.js
generated
vendored
|
@ -12,84 +12,7 @@
|
|||
|
||||
var Stream = require('../utils/stream'),
|
||||
StreamTypes = require('./stream-types'),
|
||||
// return a percent-encoded representation of the specified byte range
|
||||
// @see http://en.wikipedia.org/wiki/Percent-encoding
|
||||
percentEncode = function percentEncode(bytes, start, end) {
|
||||
var i,
|
||||
result = '';
|
||||
|
||||
for (i = start; i < end; i++) {
|
||||
result += '%' + ('00' + bytes[i].toString(16)).slice(-2);
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
// return the string representation of the specified byte range,
|
||||
// interpreted as UTf-8.
|
||||
parseUtf8 = function parseUtf8(bytes, start, end) {
|
||||
return decodeURIComponent(percentEncode(bytes, start, end));
|
||||
},
|
||||
// return the string representation of the specified byte range,
|
||||
// interpreted as ISO-8859-1.
|
||||
parseIso88591 = function parseIso88591(bytes, start, end) {
|
||||
return unescape(percentEncode(bytes, start, end)); // jshint ignore:line
|
||||
},
|
||||
parseSyncSafeInteger = function parseSyncSafeInteger(data) {
|
||||
return data[0] << 21 | data[1] << 14 | data[2] << 7 | data[3];
|
||||
},
|
||||
tagParsers = {
|
||||
TXXX: function TXXX(tag) {
|
||||
var i;
|
||||
|
||||
if (tag.data[0] !== 3) {
|
||||
// ignore frames with unrecognized character encodings
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < tag.data.length; i++) {
|
||||
if (tag.data[i] === 0) {
|
||||
// parse the text fields
|
||||
tag.description = parseUtf8(tag.data, 1, i); // do not include the null terminator in the tag value
|
||||
|
||||
tag.value = parseUtf8(tag.data, i + 1, tag.data.length).replace(/\0*$/, '');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tag.data = tag.value;
|
||||
},
|
||||
WXXX: function WXXX(tag) {
|
||||
var i;
|
||||
|
||||
if (tag.data[0] !== 3) {
|
||||
// ignore frames with unrecognized character encodings
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 1; i < tag.data.length; i++) {
|
||||
if (tag.data[i] === 0) {
|
||||
// parse the description and URL fields
|
||||
tag.description = parseUtf8(tag.data, 1, i);
|
||||
tag.url = parseUtf8(tag.data, i + 1, tag.data.length);
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
PRIV: function PRIV(tag) {
|
||||
var i;
|
||||
|
||||
for (i = 0; i < tag.data.length; i++) {
|
||||
if (tag.data[i] === 0) {
|
||||
// parse the description and URL fields
|
||||
tag.owner = parseIso88591(tag.data, 0, i);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
tag.privateData = tag.data.subarray(i + 1);
|
||||
tag.data = tag.privateData;
|
||||
}
|
||||
},
|
||||
id3 = require('../tools/parse-id3'),
|
||||
_MetadataStream;
|
||||
|
||||
_MetadataStream = function MetadataStream(options) {
|
||||
|
@ -152,7 +75,7 @@ _MetadataStream = function MetadataStream(options) {
|
|||
// last four bytes of the ID3 header.
|
||||
// The most significant bit of each byte is dropped and the
|
||||
// results concatenated to recover the actual value.
|
||||
tagSize = parseSyncSafeInteger(chunk.data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more
|
||||
tagSize = id3.parseSyncSafeInteger(chunk.data.subarray(6, 10)); // ID3 reports the tag size excluding the header but it's more
|
||||
// convenient for our comparisons to include it
|
||||
|
||||
tagSize += 10;
|
||||
|
@ -185,23 +108,25 @@ _MetadataStream = function MetadataStream(options) {
|
|||
// advance the frame start past the extended header
|
||||
frameStart += 4; // header size field
|
||||
|
||||
frameStart += parseSyncSafeInteger(tag.data.subarray(10, 14)); // clip any padding off the end
|
||||
frameStart += id3.parseSyncSafeInteger(tag.data.subarray(10, 14)); // clip any padding off the end
|
||||
|
||||
tagSize -= parseSyncSafeInteger(tag.data.subarray(16, 20));
|
||||
tagSize -= id3.parseSyncSafeInteger(tag.data.subarray(16, 20));
|
||||
} // parse one or more ID3 frames
|
||||
// http://id3.org/id3v2.3.0#ID3v2_frame_overview
|
||||
|
||||
|
||||
do {
|
||||
// determine the number of bytes in this frame
|
||||
frameSize = parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));
|
||||
frameSize = id3.parseSyncSafeInteger(tag.data.subarray(frameStart + 4, frameStart + 8));
|
||||
|
||||
if (frameSize < 1) {
|
||||
this.trigger('log', {
|
||||
level: 'warn',
|
||||
message: 'Malformed ID3 frame encountered. Skipping metadata parsing.'
|
||||
});
|
||||
return;
|
||||
message: 'Malformed ID3 frame encountered. Skipping remaining metadata parsing.'
|
||||
}); // If the frame is malformed, don't parse any further frames but allow previous valid parsed frames
|
||||
// to be sent along.
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
frameHeader = String.fromCharCode(tag.data[frameStart], tag.data[frameStart + 1], tag.data[frameStart + 2], tag.data[frameStart + 3]);
|
||||
|
@ -209,29 +134,37 @@ _MetadataStream = function MetadataStream(options) {
|
|||
id: frameHeader,
|
||||
data: tag.data.subarray(frameStart + 10, frameStart + frameSize + 10)
|
||||
};
|
||||
frame.key = frame.id;
|
||||
frame.key = frame.id; // parse frame values
|
||||
|
||||
if (tagParsers[frame.id]) {
|
||||
tagParsers[frame.id](frame); // handle the special PRIV frame used to indicate the start
|
||||
// time for raw AAC data
|
||||
if (id3.frameParsers[frame.id]) {
|
||||
// use frame specific parser
|
||||
id3.frameParsers[frame.id](frame);
|
||||
} else if (frame.id[0] === 'T') {
|
||||
// use text frame generic parser
|
||||
id3.frameParsers['T*'](frame);
|
||||
} else if (frame.id[0] === 'W') {
|
||||
// use URL link frame generic parser
|
||||
id3.frameParsers['W*'](frame);
|
||||
} // handle the special PRIV frame used to indicate the start
|
||||
// time for raw AAC data
|
||||
|
||||
if (frame.owner === 'com.apple.streaming.transportStreamTimestamp') {
|
||||
var d = frame.data,
|
||||
size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;
|
||||
size *= 4;
|
||||
size += d[7] & 0x03;
|
||||
frame.timeStamp = size; // in raw AAC, all subsequent data will be timestamped based
|
||||
// on the value of this frame
|
||||
// we couldn't have known the appropriate pts and dts before
|
||||
// parsing this ID3 tag so set those values now
|
||||
|
||||
if (tag.pts === undefined && tag.dts === undefined) {
|
||||
tag.pts = frame.timeStamp;
|
||||
tag.dts = frame.timeStamp;
|
||||
}
|
||||
if (frame.owner === 'com.apple.streaming.transportStreamTimestamp') {
|
||||
var d = frame.data,
|
||||
size = (d[3] & 0x01) << 30 | d[4] << 22 | d[5] << 14 | d[6] << 6 | d[7] >>> 2;
|
||||
size *= 4;
|
||||
size += d[7] & 0x03;
|
||||
frame.timeStamp = size; // in raw AAC, all subsequent data will be timestamped based
|
||||
// on the value of this frame
|
||||
// we couldn't have known the appropriate pts and dts before
|
||||
// parsing this ID3 tag so set those values now
|
||||
|
||||
this.trigger('timestamp', frame);
|
||||
if (tag.pts === undefined && tag.dts === undefined) {
|
||||
tag.pts = frame.timeStamp;
|
||||
tag.dts = frame.timeStamp;
|
||||
}
|
||||
|
||||
this.trigger('timestamp', frame);
|
||||
}
|
||||
|
||||
tag.frames.push(frame);
|
||||
|
|
37
node_modules/mux.js/cjs/mp4/probe.js
generated
vendored
37
node_modules/mux.js/cjs/mp4/probe.js
generated
vendored
|
@ -16,6 +16,8 @@ var findBox = require('../mp4/find-box.js');
|
|||
|
||||
var parseType = require('../mp4/parse-type.js');
|
||||
|
||||
var emsg = require('../mp4/emsg.js');
|
||||
|
||||
var parseTfhd = require('../tools/parse-tfhd.js');
|
||||
|
||||
var parseTrun = require('../tools/parse-trun.js');
|
||||
|
@ -24,9 +26,11 @@ var parseTfdt = require('../tools/parse-tfdt.js');
|
|||
|
||||
var getUint64 = require('../utils/numbers.js').getUint64;
|
||||
|
||||
var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks, getTimescaleFromMediaHeader;
|
||||
var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks, getTimescaleFromMediaHeader, getEmsgID3;
|
||||
|
||||
var window = require('global/window');
|
||||
|
||||
var parseId3Frames = require('../tools/parse-id3.js').parseId3Frames;
|
||||
/**
|
||||
* Parses an MP4 initialization segment and extracts the timescale
|
||||
* values for any declared tracks. Timescale values indicate the
|
||||
|
@ -346,6 +350,34 @@ getTracks = function getTracks(init) {
|
|||
});
|
||||
return tracks;
|
||||
};
|
||||
/**
|
||||
* Returns an array of emsg ID3 data from the provided segmentData.
|
||||
* An offset can also be provided as the Latest Arrival Time to calculate
|
||||
* the Event Start Time of v0 EMSG boxes.
|
||||
* See: https://dashif-documents.azurewebsites.net/Events/master/event.html#Inband-event-timing
|
||||
*
|
||||
* @param {Uint8Array} segmentData the segment byte array.
|
||||
* @param {number} offset the segment start time or Latest Arrival Time,
|
||||
* @return {Object[]} an array of ID3 parsed from EMSG boxes
|
||||
*/
|
||||
|
||||
|
||||
getEmsgID3 = function getEmsgID3(segmentData, offset) {
|
||||
if (offset === void 0) {
|
||||
offset = 0;
|
||||
}
|
||||
|
||||
var emsgBoxes = findBox(segmentData, ['emsg']);
|
||||
return emsgBoxes.map(function (data) {
|
||||
var parsedBox = emsg.parseEmsgBox(new Uint8Array(data));
|
||||
var parsedId3Frames = parseId3Frames(parsedBox.message_data);
|
||||
return {
|
||||
cueTime: emsg.scaleTime(parsedBox.presentation_time, parsedBox.timescale, parsedBox.presentation_time_delta, offset),
|
||||
duration: emsg.scaleTime(parsedBox.event_duration, parsedBox.timescale),
|
||||
frames: parsedId3Frames
|
||||
};
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
// export mp4 inspector's findBox and parseType for backwards compatibility
|
||||
|
@ -356,5 +388,6 @@ module.exports = {
|
|||
compositionStartTime: compositionStartTime,
|
||||
videoTrackIds: getVideoTrackIds,
|
||||
tracks: getTracks,
|
||||
getTimescaleFromMediaHeader: getTimescaleFromMediaHeader
|
||||
getTimescaleFromMediaHeader: getTimescaleFromMediaHeader,
|
||||
getEmsgID3: getEmsgID3
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue