Skip to content

Commit 989bffd

Browse files
author
Nikola Hristov
authored
feat: parse edts boxes (#375)
1 parent 4285042 commit 989bffd

File tree

3 files changed

+83
-3
lines changed

3 files changed

+83
-3
lines changed

lib/tools/mp4-inspector.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
*/
1010
'use strict';
1111

12+
var MAX_UINT32 = Math.pow(2, 32);
13+
1214
var
1315
inspectMp4,
1416
textifyMp4,
@@ -123,6 +125,40 @@ var
123125
avgBitrate: view.getUint32(8)
124126
};
125127
},
128+
edts: function edts(data) {
129+
return {
130+
boxes: inspectMp4(data)
131+
};
132+
},
133+
elst: function elst(data) {
134+
var
135+
view = new DataView(data.buffer, data.byteOffset, data.byteLength),
136+
result = {
137+
version: view.getUint8(0),
138+
flags: new Uint8Array(data.subarray(1, 4)),
139+
edits: []
140+
},
141+
entryCount = view.getUint32(4),
142+
i;
143+
for (i = 8; entryCount; entryCount--) {
144+
if (result.version === 0) {
145+
result.edits.push({
146+
segmentDuration: view.getUint32(i),
147+
mediaTime: view.getInt32(i + 4),
148+
mediaRate: view.getUint16(i + 8) + view.getUint16(i + 10) / (256 * 256)
149+
});
150+
i += 12;
151+
} else {
152+
result.edits.push({
153+
segmentDuration: (view.getUint32(i) * MAX_UINT32) + view.getUint32(i + 4),
154+
mediaTime: (view.getUint32(i + 8) * MAX_UINT32) + view.getUint32(i + 12),
155+
mediaRate: view.getUint16(i + 16) + view.getUint16(i + 18) / (256 * 256)
156+
});
157+
i += 20;
158+
}
159+
}
160+
return result;
161+
},
126162
esds: function(data) {
127163
return {
128164
version: data[0],

test/mp4-inspector.test.js

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ QUnit.test('can parse a moov', function(assert) {
215215
var result = QUnit.dump.parse(mp4.tools.inspect(new Uint8Array(data)));
216216
var expected = QUnit.dump.parse([{
217217
type: 'moov',
218-
size: 981,
218+
size: 1061,
219219
boxes: [{
220220
type: 'mvhd',
221221
version: 1,
@@ -231,7 +231,7 @@ QUnit.test('can parse a moov', function(assert) {
231231
nextTrackId: 2
232232
}, {
233233
type: 'trak',
234-
size: 439,
234+
size: 475,
235235
boxes: [{
236236
type: 'tkhd',
237237
flags: new Uint8Array([0, 0, 0]),
@@ -247,6 +247,20 @@ QUnit.test('can parse a moov', function(assert) {
247247
matrix: new Uint32Array(unityMatrix),
248248
width: 300,
249249
height: 150
250+
}, {
251+
type: 'edts',
252+
size: 36,
253+
boxes: [{
254+
type: 'elst',
255+
size: 28,
256+
version: 0,
257+
flags: new Uint8Array([0, 0, 0]),
258+
edits: [{
259+
segmentDuration: 0,
260+
mediaTime: 1024,
261+
mediaRate: 1.5
262+
}]
263+
}]
250264
}, {
251265
type: 'mdia',
252266
size: 327,
@@ -349,7 +363,7 @@ QUnit.test('can parse a moov', function(assert) {
349363
}]
350364
}, {
351365
type: 'trak',
352-
size: 414,
366+
size: 458,
353367
boxes: [{
354368
type: 'tkhd',
355369
flags: new Uint8Array([0, 0, 0]),
@@ -365,6 +379,20 @@ QUnit.test('can parse a moov', function(assert) {
365379
matrix: new Uint32Array(unityMatrix),
366380
width: 300,
367381
height: 150
382+
}, {
383+
type: 'edts',
384+
size: 44,
385+
boxes: [{
386+
type: 'elst',
387+
size: 36,
388+
version: 1,
389+
flags: new Uint8Array([0, 0, 0]),
390+
edits: [{
391+
segmentDuration: 0,
392+
mediaTime: 1152921504606847000,
393+
mediaRate: 1.5
394+
}]
395+
}]
368396
}, {
369397
type: 'mdia',
370398
size: 302,

test/utils/mp4-helpers.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,14 @@ module.exports.sampleMoov =
109109
unityMatrix,
110110
0x01, 0x2c, 0x00, 0x00, // 300 in 16.16 fixed-point
111111
0x00, 0x96, 0x00, 0x00), // 150 in 16.16 fixed-point
112+
box('edts',
113+
box('elst',
114+
0x00, // version
115+
0x00, 0x00, 0x00, // flags
116+
0x00, 0x00, 0x00, 0x01, // entry_count
117+
0x00, 0x00, 0x00, 0x00, // segment_duration
118+
0x00, 0x00, 0x04, 0x00, // media_time
119+
0x00, 0x01, 0x80, 0x00)), // media_rate
112120
box('mdia',
113121
box('mdhd',
114122
0x01, // version 1
@@ -208,6 +216,14 @@ module.exports.sampleMoov =
208216
unityMatrix,
209217
0x01, 0x2c, 0x00, 0x00, // 300 in 16.16 fixed-point
210218
0x00, 0x96, 0x00, 0x00), // 150 in 16.16 fixed-point
219+
box('edts',
220+
box('elst',
221+
0x01, // version
222+
0x00, 0x00, 0x00, // flags
223+
0x00, 0x00, 0x00, 0x01, // entry_count
224+
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // segment_duration
225+
0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // media_time
226+
0x00, 0x01, 0x80, 0x00)), // media_rate
211227
box('mdia',
212228
box('mdhd',
213229
0x01, // version 1

0 commit comments

Comments
 (0)