-
Notifications
You must be signed in to change notification settings - Fork 344
/
Copy pathiloc.js
101 lines (100 loc) · 2.44 KB
/
iloc.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
BoxParser.createFullBoxCtor("iloc", "ItemLocationBox", function(stream) {
var byte;
byte = stream.readUint8();
this.offset_size = (byte >> 4) & 0xF;
this.length_size = byte & 0xF;
byte = stream.readUint8();
this.base_offset_size = (byte >> 4) & 0xF;
if (this.version === 1 || this.version === 2) {
this.index_size = byte & 0xF;
} else {
this.index_size = 0;
// reserved = byte & 0xF;
}
this.items = [];
var item_count = 0;
if (this.version < 2) {
item_count = stream.readUint16();
} else if (this.version === 2) {
item_count = stream.readUint32();
} else {
throw "version of iloc box not supported";
}
for (var i = 0; i < item_count; i++) {
var item = {};
this.items.push(item);
if (this.version < 2) {
item.item_ID = stream.readUint16();
} else if (this.version === 2) {
item.item_ID = stream.readUint32();
} else {
throw "version of iloc box not supported";
}
if (this.version === 1 || this.version === 2) {
item.construction_method = (stream.readUint16() & 0xF);
} else {
item.construction_method = 0;
}
item.data_reference_index = stream.readUint16();
switch(this.base_offset_size) {
case 0:
item.base_offset = 0;
break;
case 4:
item.base_offset = stream.readUint32();
break;
case 8:
item.base_offset = stream.readUint64();
break;
default:
throw "Error reading base offset size";
}
var extent_count = stream.readUint16();
item.extents = [];
for (var j=0; j < extent_count; j++) {
var extent = {};
item.extents.push(extent);
if (this.version === 1 || this.version === 2) {
switch(this.index_size) {
case 0:
extent.extent_index = 0;
break;
case 4:
extent.extent_index = stream.readUint32();
break;
case 8:
extent.extent_index = stream.readUint64();
break;
default:
throw "Error reading extent index";
}
}
switch(this.offset_size) {
case 0:
extent.extent_offset = 0;
break;
case 4:
extent.extent_offset = stream.readUint32();
break;
case 8:
extent.extent_offset = stream.readUint64();
break;
default:
throw "Error reading extent index";
}
switch(this.length_size) {
case 0:
extent.extent_length = 0;
break;
case 4:
extent.extent_length = stream.readUint32();
break;
case 8:
extent.extent_length = stream.readUint64();
break;
default:
throw "Error reading extent index";
}
}
}
});