8000 feat: support emsg box parsing · videojs/mux.js@2e77285 · GitHub
[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
Skip to content

Commit 2e77285

Browse files
committed
feat: support emsg box parsing
1 parent 2e50704 commit 2e77285

File tree

2 files changed

+85
-2
lines changed

2 files changed

+85
-2
lines changed

lib/mp4/emsg.js

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
var parseStringUntilNullChar = function(data) {
2+
var index = 0;
3+
var curChar = String.fromCharCode(data[index]);
4+
var retString = '';
5+
while (curChar !== '\0') {
6+
retString += curChar;
7+
index++;
8+
curChar = String.fromCharCode(data[index]);
9+
}
10+
// Add nullChar
11+
retString += curChar;
12+
return retString;
13+
};
14+
15+
var parseEmsgBox = function(boxData) {
16+
var offset = 0
17+
var version = boxData[offset];
18+
var scheme_id_uri, value, timescale, presentation_time, presentation_time_delta, event_duration, id;
19+
// version 0 vs version 1 have different formats.
20+
if (version === 0) {
21+
// Parse id and value strings first.
22+
scheme_id_uri = parseStringUntilNullChar(boxData);
23+
offset += scheme_id_uri.length - 1;
24+
value = parseStringUntilNullChar(boxData.subarray(offset));
25+
26+
var dv = new DataView(boxData);
27+
timescale = dv.getUint32(12);
28+
presentation_time_delta = dv.getUint32(16);
29+
event_duration = dv.getUint32(20);
30+
id = dv.getUint32(24);
31+
offset = 28;
32+
} else if (version === 1) {
33+
var dv = new DataView(boxData);
34+
timescale = dv.getUint32(0);
35+
presentation_time = dv.getBigUint64(4);
36+
event_duration = dv.getUint32(12);
37+
id = dv.getUint32(16);
38+
39+
offset = 20;
40+
scheme_id_uri = parseStringUntilNullChar(boxData.subarray(offset));
41+
offset += scheme_id_uri.length - 1;
42+
value = parseStringUntilNullChar(boxData.subarray(offset));
43+
offset += value.length - 1;
44+
45+
}
46+
var message_data = boxData.subarray(offset, boxData.byteLength);
47+
return { scheme_id_uri, value,
48+
timescale, presentation_time,
49+
presentation_time_delta,
50+
event_duration, id,
51+
message_data };
52+
};
53+
54+
var scaleTime = function(presentationTime, timescale, timeDelta, offset) {
55+
return presentationTime ? presentationTime / timescale : offset + timeDelta / timescale;
56+
};
57+
58+
// TODO: This may need to return more ID3 specific data rather than just data, pts, duration.
59+
var getEmsgData = function(data, ptOffset) {
60+
var emsgBoxes = findBox(data, ['emsg']);
61+
var parsedBoxes = [];
62+
emsgBoxes.forEach(function(boxData) {
63+
// TODO: We may need to check for ID3 specific schemeIdURI before returning data.
64+
var parsedBox = parseEmsgBox(boxData);
65+
var pts = scaleTime(parsedBox.presentation_time, parsedBox.timescale, parsedBox.presentation_time_delta, ptOffset);
66+
var duration = scaleTime(parsedBox.duration, parsedBox.timescale);
67+
parsedBoxes.push({
68+
data: parsedBox.message_data,
69+
pts,
70+
duration,
71+
});
72+
});
73+
return parsedBoxes;
74+
};
75+
76+
module.exports = getEmsgData;

lib/mp4/probe.js

+9-2
5B40
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,9 @@ var parseTfhd = require('../tools/parse-tfhd.js');
1616
var parseTrun = require('../tools/parse-trun.js');
1717
var parseTfdt = require('../tools/parse-tfdt.js');
1818
var getUint64 = require('../utils/numbers.js').getUint64;
19+
var getEmsgData = require('../mp4/emsg.js');
1920
var timescale, startTime, compositionStartTime, getVideoTrackIds, getTracks,
20-
getTimescaleFromMediaHeader;
21+
getTimescaleFromMediaHeader, getEmsg;
2122
var window = require('global/window');
2223

2324

@@ -370,6 +371,11 @@ getTracks = function(init) {
370371
return tracks;
371372
};
372373

374+
// TODO: If we are returning specific ID3 emsg data lets modify the function signature.
375+
getEmsg = function(segmentData, ptOffset) {
376+
return getEmsgData(segmentData, ptOffset);
377+
};
378+
373379
module.exports = {
374380
// export mp4 inspector's findBox and parseType for backwards compatibility
375381
findBox: findBox,
@@ -379,5 +385,6 @@ module.exports = {
379385
compositionStartTime: compositionStartTime,
380386
videoTrackIds: getVideoTrackIds,
381387
tracks: getTracks,
382-
getTimescaleFromMediaHeader: getTimescaleFromMediaHeader
388+
getTimescaleFromMediaHeader: getTimescaleFromMediaHeader,
389+
getEmsg: getEmsg,
383390
};

0 commit comments

Comments
 (0)
0