@realsee/hdr-toolbox 1.1.2 → 1.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +56 -29
- package/dist/avif-codec.d.ts +43 -0
- package/dist/avif-codec.d.ts.map +1 -0
- package/dist/avif-codec.js +91 -0
- package/dist/avif-codec.js.map +1 -0
- package/dist/avif-container.d.ts +83 -0
- package/dist/avif-container.d.ts.map +1 -0
- package/dist/avif-container.js +368 -0
- package/dist/avif-container.js.map +1 -0
- package/dist/avif-gainmap.d.ts +31 -0
- package/dist/avif-gainmap.d.ts.map +1 -0
- package/dist/avif-gainmap.js +124 -0
- package/dist/avif-gainmap.js.map +1 -0
- package/dist/avif.d.ts +50 -0
- package/dist/avif.d.ts.map +1 -0
- package/dist/avif.js +206 -0
- package/dist/avif.js.map +1 -0
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +32 -37
- package/dist/cli.js.map +1 -1
- package/dist/convert.d.ts +36 -17
- package/dist/convert.d.ts.map +1 -1
- package/dist/convert.js +152 -44
- package/dist/convert.js.map +1 -1
- package/dist/exr.d.ts +4 -3
- package/dist/exr.d.ts.map +1 -1
- package/dist/exr.js +160 -8
- package/dist/exr.js.map +1 -1
- package/dist/hdr-transfer.d.ts +50 -0
- package/dist/hdr-transfer.d.ts.map +1 -0
- package/dist/hdr-transfer.js +147 -0
- package/dist/hdr-transfer.js.map +1 -0
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/package.json +10 -1
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AVIF (ISOBMFF / HEIF) container reader and writer.
|
|
3
|
+
*
|
|
4
|
+
* The reader covers the boxes needed to locate image items, their AV1 payloads,
|
|
5
|
+
* their properties (`av1C`, `ispe`, `pixi`, `colr`) and `dimg` references. The
|
|
6
|
+
* writer emits a minimal file with one or more `av01` image items and optional
|
|
7
|
+
* derived `tmap` items (ISO 21496-1 gain maps).
|
|
8
|
+
*/
|
|
9
|
+
/** Read the sibling boxes in [start, end). Stops silently at a malformed box. */
|
|
10
|
+
function readBoxes(buffer, start, end) {
|
|
11
|
+
const boxes = [];
|
|
12
|
+
let offset = start;
|
|
13
|
+
while (offset + 8 <= end) {
|
|
14
|
+
let size = buffer.readUInt32BE(offset);
|
|
15
|
+
const type = buffer.toString("latin1", offset + 4, offset + 8);
|
|
16
|
+
let headerSize = 8;
|
|
17
|
+
if (size === 1) {
|
|
18
|
+
size = Number(buffer.readBigUInt64BE(offset + 8));
|
|
19
|
+
headerSize = 16;
|
|
20
|
+
}
|
|
21
|
+
else if (size === 0) {
|
|
22
|
+
size = end - offset;
|
|
23
|
+
}
|
|
24
|
+
if (size < headerSize || offset + size > end)
|
|
25
|
+
break;
|
|
26
|
+
boxes.push({ type, start: offset, headerSize, size });
|
|
27
|
+
offset += size;
|
|
28
|
+
}
|
|
29
|
+
return boxes;
|
|
30
|
+
}
|
|
31
|
+
function bodyStart(box) {
|
|
32
|
+
return box.start + box.headerSize;
|
|
33
|
+
}
|
|
34
|
+
function boxEnd(box) {
|
|
35
|
+
return box.start + box.size;
|
|
36
|
+
}
|
|
37
|
+
function readItemId(buffer, offset, width) {
|
|
38
|
+
return width === 2 ? buffer.readUInt16BE(offset) : buffer.readUInt32BE(offset);
|
|
39
|
+
}
|
|
40
|
+
/** Read an unsigned big-endian integer of `size` bytes (0 bytes means zero). */
|
|
41
|
+
function readSized(buffer, offset, size) {
|
|
42
|
+
let value = 0;
|
|
43
|
+
for (let index = 0; index < size; index++)
|
|
44
|
+
value = value * 256 + buffer[offset + index];
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
function parseMeta(buffer, metaBox, parsed) {
|
|
48
|
+
// `meta` is a FullBox: four bytes of version and flags precede its children.
|
|
49
|
+
const children = readBoxes(buffer, bodyStart(metaBox) + 4, boxEnd(metaBox));
|
|
50
|
+
const propertyBoxes = [];
|
|
51
|
+
const associations = new Map();
|
|
52
|
+
// `iloc` may precede `iinf` in the file, so locations are merged in at the end.
|
|
53
|
+
const locations = new Map();
|
|
54
|
+
for (const box of children) {
|
|
55
|
+
switch (box.type) {
|
|
56
|
+
case "pitm": {
|
|
57
|
+
const version = buffer.readUInt8(bodyStart(box));
|
|
58
|
+
const id = version === 0
|
|
59
|
+
? buffer.readUInt16BE(bodyStart(box) + 4)
|
|
60
|
+
: buffer.readUInt32BE(bodyStart(box) + 4);
|
|
61
|
+
parsed.primaryItemId = id;
|
|
62
|
+
break;
|
|
63
|
+
}
|
|
64
|
+
case "iinf":
|
|
65
|
+
parseIinf(buffer, box, parsed.items);
|
|
66
|
+
break;
|
|
67
|
+
case "iloc":
|
|
68
|
+
parseIloc(buffer, box, locations);
|
|
69
|
+
break;
|
|
70
|
+
case "iref":
|
|
71
|
+
parseIref(buffer, box, parsed.references);
|
|
72
|
+
break;
|
|
73
|
+
case "iprp": {
|
|
74
|
+
const inner = readBoxes(buffer, bodyStart(box), boxEnd(box));
|
|
75
|
+
const ipco = inner.find((child) => child.type === "ipco");
|
|
76
|
+
const ipma = inner.find((child) => child.type === "ipma");
|
|
77
|
+
if (ipco)
|
|
78
|
+
propertyBoxes.push(...readBoxes(buffer, bodyStart(ipco), boxEnd(ipco)));
|
|
79
|
+
if (ipma)
|
|
80
|
+
parseIpma(buffer, ipma, associations);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
default:
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (const item of parsed.items.values()) {
|
|
88
|
+
const location = locations.get(item.id);
|
|
89
|
+
if (location) {
|
|
90
|
+
item.extents = location.extents;
|
|
91
|
+
item.constructionMethod = location.constructionMethod;
|
|
92
|
+
}
|
|
93
|
+
for (const entry of associations.get(item.id) ?? []) {
|
|
94
|
+
const property = propertyBoxes[entry.index - 1];
|
|
95
|
+
if (property)
|
|
96
|
+
item.properties.push(property);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function parseIinf(buffer, box, items) {
|
|
101
|
+
const version = buffer.readUInt8(bodyStart(box));
|
|
102
|
+
const entriesStart = bodyStart(box) + 4 + (version === 0 ? 2 : 4);
|
|
103
|
+
for (const infe of readBoxes(buffer, entriesStart, boxEnd(box))) {
|
|
104
|
+
if (infe.type !== "infe")
|
|
105
|
+
continue;
|
|
106
|
+
const infeVersion = buffer.readUInt8(bodyStart(infe));
|
|
107
|
+
// Only infe v2 and v3 carry an item_type, which is what AVIF images use.
|
|
108
|
+
if (infeVersion < 2)
|
|
109
|
+
continue;
|
|
110
|
+
let offset = bodyStart(infe) + 4;
|
|
111
|
+
const idWidth = infeVersion === 2 ? 2 : 4;
|
|
112
|
+
const id = readItemId(buffer, offset, idWidth);
|
|
113
|
+
offset += idWidth + 2; // item_protection_index
|
|
114
|
+
const type = buffer.toString("latin1", offset, offset + 4);
|
|
115
|
+
items.set(id, { id, type, extents: [], constructionMethod: 0, properties: [] });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function parseIloc(buffer, box, locations) {
|
|
119
|
+
let offset = bodyStart(box);
|
|
120
|
+
const version = buffer.readUInt8(offset);
|
|
121
|
+
offset += 4;
|
|
122
|
+
const sizes = buffer.readUInt8(offset);
|
|
123
|
+
const offsetSize = sizes >> 4;
|
|
124
|
+
const lengthSize = sizes & 0xf;
|
|
125
|
+
const indexSizes = buffer.readUInt8(offset + 1);
|
|
126
|
+
const baseOffsetSize = indexSizes >> 4;
|
|
127
|
+
const indexSize = indexSizes & 0xf;
|
|
128
|
+
offset += 2;
|
|
129
|
+
const itemCount = version < 2 ? buffer.readUInt16BE(offset) : buffer.readUInt32BE(offset);
|
|
130
|
+
offset += version < 2 ? 2 : 4;
|
|
131
|
+
const idWidth = version < 2 ? 2 : 4;
|
|
132
|
+
for (let entry = 0; entry < itemCount; entry++) {
|
|
133
|
+
const id = readItemId(buffer, offset, idWidth);
|
|
134
|
+
offset += idWidth;
|
|
135
|
+
let constructionMethod = 0;
|
|
136
|
+
if (version === 1 || version === 2) {
|
|
137
|
+
constructionMethod = buffer.readUInt16BE(offset) & 0xf;
|
|
138
|
+
offset += 2;
|
|
139
|
+
}
|
|
140
|
+
offset += 2; // data_reference_index
|
|
141
|
+
const baseOffset = readSized(buffer, offset, baseOffsetSize);
|
|
142
|
+
offset += baseOffsetSize;
|
|
143
|
+
const extentCount = buffer.readUInt16BE(offset);
|
|
144
|
+
offset += 2;
|
|
145
|
+
const extents = [];
|
|
146
|
+
for (let extent = 0; extent < extentCount; extent++) {
|
|
147
|
+
if ((version === 1 || version === 2) && indexSize > 0)
|
|
148
|
+
offset += indexSize;
|
|
149
|
+
const extentOffset = readSized(buffer, offset, offsetSize);
|
|
150
|
+
offset += offsetSize;
|
|
151
|
+
const extentLength = readSized(buffer, offset, lengthSize);
|
|
152
|
+
offset += lengthSize;
|
|
153
|
+
extents.push({ offset: baseOffset + extentOffset, length: extentLength });
|
|
154
|
+
}
|
|
155
|
+
locations.set(id, { constructionMethod, extents });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
function parseIref(buffer, box, references) {
|
|
159
|
+
const version = buffer.readUInt8(bodyStart(box));
|
|
160
|
+
const idWidth = version === 0 ? 2 : 4;
|
|
161
|
+
for (const ref of readBoxes(buffer, bodyStart(box) + 4, boxEnd(box))) {
|
|
162
|
+
let offset = bodyStart(ref);
|
|
163
|
+
const from = readItemId(buffer, offset, idWidth);
|
|
164
|
+
offset += idWidth;
|
|
165
|
+
const count = buffer.readUInt16BE(offset);
|
|
166
|
+
offset += 2;
|
|
167
|
+
const to = [];
|
|
168
|
+
for (let index = 0; index < count; index++) {
|
|
169
|
+
to.push(readItemId(buffer, offset, idWidth));
|
|
170
|
+
offset += idWidth;
|
|
171
|
+
}
|
|
172
|
+
references.push({ type: ref.type, from, to });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function parseIpma(buffer, box, associations) {
|
|
176
|
+
const offset0 = bodyStart(box);
|
|
177
|
+
const version = buffer.readUInt8(offset0);
|
|
178
|
+
const flags = buffer.readUIntBE(offset0 + 1, 3);
|
|
179
|
+
let offset = offset0 + 4;
|
|
180
|
+
const entryCount = buffer.readUInt32BE(offset);
|
|
181
|
+
offset += 4;
|
|
182
|
+
for (let entry = 0; entry < entryCount; entry++) {
|
|
183
|
+
const idWidth = version < 1 ? 2 : 4;
|
|
184
|
+
const itemId = readItemId(buffer, offset, idWidth);
|
|
185
|
+
offset += idWidth;
|
|
186
|
+
const count = buffer.readUInt8(offset);
|
|
187
|
+
offset += 1;
|
|
188
|
+
const list = [];
|
|
189
|
+
for (let index = 0; index < count; index++) {
|
|
190
|
+
if (flags & 1) {
|
|
191
|
+
list.push({ index: buffer.readUInt16BE(offset) & 0x7fff });
|
|
192
|
+
offset += 2;
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
list.push({ index: buffer.readUInt8(offset) & 0x7f });
|
|
196
|
+
offset += 1;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
associations.set(itemId, list);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/** Parse an AVIF file's item graph. Throws if the file has no `meta` box. */
|
|
203
|
+
export function parseAvif(buffer) {
|
|
204
|
+
try {
|
|
205
|
+
const top = readBoxes(buffer, 0, buffer.length);
|
|
206
|
+
const metaBox = top.find((box) => box.type === "meta");
|
|
207
|
+
if (!metaBox)
|
|
208
|
+
throw new Error("Not an AVIF file: no meta box found.");
|
|
209
|
+
const parsed = {
|
|
210
|
+
buffer,
|
|
211
|
+
primaryItemId: undefined,
|
|
212
|
+
items: new Map(),
|
|
213
|
+
references: [],
|
|
214
|
+
};
|
|
215
|
+
parseMeta(buffer, metaBox, parsed);
|
|
216
|
+
return parsed;
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (error instanceof RangeError)
|
|
220
|
+
throw new Error("Malformed AVIF: truncated container.");
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/** Return the concatenated payload bytes of an item stored in the file. */
|
|
225
|
+
export function itemPayload(parsed, item) {
|
|
226
|
+
if (item.constructionMethod !== 0)
|
|
227
|
+
throw new Error(`AVIF item ${item.id} uses an unsupported construction method.`);
|
|
228
|
+
if (item.extents.length === 0)
|
|
229
|
+
throw new Error(`AVIF item ${item.id} has no data.`);
|
|
230
|
+
return Buffer.concat(item.extents.map((extent) => parsed.buffer.subarray(extent.offset, extent.offset + extent.length)));
|
|
231
|
+
}
|
|
232
|
+
/** Return the bytes of the first property of a given type on an item. */
|
|
233
|
+
export function itemPropertyBytes(parsed, item, type) {
|
|
234
|
+
const box = item.properties.find((property) => property.type === type);
|
|
235
|
+
return box ? parsed.buffer.subarray(box.start, box.start + box.size) : undefined;
|
|
236
|
+
}
|
|
237
|
+
/** Bit depth declared by an item's `pixi` property, if present. */
|
|
238
|
+
export function itemBitDepth(parsed, item) {
|
|
239
|
+
const pixi = item.properties.find((property) => property.type === "pixi");
|
|
240
|
+
if (!pixi)
|
|
241
|
+
return undefined;
|
|
242
|
+
// pixi: FullBox header (4 bytes), num_channels (1 byte), then one depth byte per channel.
|
|
243
|
+
return parsed.buffer.readUInt8(bodyStart(pixi) + 5);
|
|
244
|
+
}
|
|
245
|
+
/** CICP colour information from an item's `colr` (nclx) property. */
|
|
246
|
+
export function itemColourInfo(parsed, item) {
|
|
247
|
+
const colr = item.properties.find((property) => property.type === "colr");
|
|
248
|
+
if (!colr)
|
|
249
|
+
return undefined;
|
|
250
|
+
const offset = bodyStart(colr);
|
|
251
|
+
if (parsed.buffer.toString("latin1", offset, offset + 4) !== "nclx")
|
|
252
|
+
return undefined;
|
|
253
|
+
return {
|
|
254
|
+
primaries: parsed.buffer.readUInt16BE(offset + 4),
|
|
255
|
+
transfer: parsed.buffer.readUInt16BE(offset + 6),
|
|
256
|
+
matrix: parsed.buffer.readUInt16BE(offset + 8),
|
|
257
|
+
fullRange: (parsed.buffer.readUInt8(offset + 10) & 0x80) !== 0,
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
function box(type, ...parts) {
|
|
261
|
+
const body = Buffer.concat(parts);
|
|
262
|
+
const header = Buffer.alloc(8);
|
|
263
|
+
header.writeUInt32BE(8 + body.length, 0);
|
|
264
|
+
header.write(type, 4, "latin1");
|
|
265
|
+
return Buffer.concat([header, body]);
|
|
266
|
+
}
|
|
267
|
+
function fullBox(type, version, flags, ...parts) {
|
|
268
|
+
const header = Buffer.from([version, (flags >> 16) & 0xff, (flags >> 8) & 0xff, flags & 0xff]);
|
|
269
|
+
return box(type, header, ...parts);
|
|
270
|
+
}
|
|
271
|
+
function u16(value) {
|
|
272
|
+
const buffer = Buffer.alloc(2);
|
|
273
|
+
buffer.writeUInt16BE(value, 0);
|
|
274
|
+
return buffer;
|
|
275
|
+
}
|
|
276
|
+
function u32(value) {
|
|
277
|
+
const buffer = Buffer.alloc(4);
|
|
278
|
+
buffer.writeUInt32BE(value, 0);
|
|
279
|
+
return buffer;
|
|
280
|
+
}
|
|
281
|
+
/** CICP `colr` box with an nclx payload. */
|
|
282
|
+
export function colrBox(info) {
|
|
283
|
+
return box("colr", Buffer.from("nclx", "latin1"), u16(info.primaries), u16(info.transfer), u16(info.matrix), Buffer.from([info.fullRange ? 0x80 : 0x00]));
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Serialise an AVIF file. Layout: `ftyp`, `meta` (hdlr, pitm, iloc, iinf, iref,
|
|
287
|
+
* iprp), then `mdat` holding the item payloads in order. Item offsets are
|
|
288
|
+
* absolute file offsets (construction method 0).
|
|
289
|
+
*/
|
|
290
|
+
export function writeAvifContainer(options) {
|
|
291
|
+
const { items } = options;
|
|
292
|
+
const ids = new Set();
|
|
293
|
+
for (const item of items) {
|
|
294
|
+
if (ids.has(item.id))
|
|
295
|
+
throw new Error(`Duplicate AVIF item id ${item.id}.`);
|
|
296
|
+
if (item.id > 0xffff)
|
|
297
|
+
throw new Error("AVIF item ids must fit in 16 bits.");
|
|
298
|
+
ids.add(item.id);
|
|
299
|
+
}
|
|
300
|
+
if (!ids.has(options.primaryItemId))
|
|
301
|
+
throw new Error("Primary item id is not an item.");
|
|
302
|
+
const brands = ["avif", "mif1", "miaf"];
|
|
303
|
+
if (items.some((item) => item.type === "tmap"))
|
|
304
|
+
brands.push("tmap");
|
|
305
|
+
const ftyp = box("ftyp", Buffer.from("avif", "latin1"), u32(0), ...brands.map((brand) => Buffer.from(brand, "latin1")));
|
|
306
|
+
const hdlr = fullBox("hdlr", 0, 0, u32(0), Buffer.from("pict", "latin1"), Buffer.alloc(12), Buffer.from("hdr-toolbox\0", "latin1"));
|
|
307
|
+
const pitm = fullBox("pitm", 0, 0, u16(options.primaryItemId));
|
|
308
|
+
const infe = items.map((item) => fullBox("infe", 2, 0, u16(item.id), u16(0), Buffer.from(item.type, "latin1"), Buffer.from([0])));
|
|
309
|
+
const iinf = fullBox("iinf", 0, 0, u16(items.length), ...infe);
|
|
310
|
+
const properties = [];
|
|
311
|
+
const associations = [];
|
|
312
|
+
for (const item of items) {
|
|
313
|
+
const props = item.properties ?? [];
|
|
314
|
+
if (props.length === 0)
|
|
315
|
+
continue;
|
|
316
|
+
const entries = [];
|
|
317
|
+
for (const prop of props) {
|
|
318
|
+
properties.push(prop);
|
|
319
|
+
const index = properties.length;
|
|
320
|
+
const essential = prop.toString("latin1", 4, 8) === "av1C";
|
|
321
|
+
entries.push(Buffer.from([(essential ? 0x80 : 0) | index]));
|
|
322
|
+
}
|
|
323
|
+
associations.push(u16(item.id), Buffer.from([props.length]), ...entries);
|
|
324
|
+
}
|
|
325
|
+
const ipco = box("ipco", ...properties);
|
|
326
|
+
const ipma = fullBox("ipma", 0, 0, u32(countEntries(items)), ...associations);
|
|
327
|
+
const iprp = box("iprp", ipco, ipma);
|
|
328
|
+
const references = (options.references ?? []).map((reference) => {
|
|
329
|
+
if (reference.to.length > 0xffff)
|
|
330
|
+
throw new Error("Too many references for one item.");
|
|
331
|
+
return box(reference.type, u16(reference.from), u16(reference.to.length), ...reference.to.map((id) => u16(id)));
|
|
332
|
+
});
|
|
333
|
+
const iref = references.length > 0 ? [fullBox("iref", 0, 0, ...references)] : [];
|
|
334
|
+
const grpl = (options.alternatives ?? []).length > 0
|
|
335
|
+
? [
|
|
336
|
+
box("grpl", ...(options.alternatives ?? []).map((group, index) => fullBox("altr", 0, 0, u32(index + 1), u32(group.entities.length), ...group.entities.map((id) => u32(id))))),
|
|
337
|
+
]
|
|
338
|
+
: [];
|
|
339
|
+
const buildMeta = (payloadOffsets) => {
|
|
340
|
+
const ilocEntries = items.map((item, index) => Buffer.concat([
|
|
341
|
+
u16(item.id),
|
|
342
|
+
u16(0), // data_reference_index
|
|
343
|
+
u16(1), // extent_count
|
|
344
|
+
u32(payloadOffsets[index]),
|
|
345
|
+
u32(item.payload.length),
|
|
346
|
+
]));
|
|
347
|
+
const iloc = fullBox("iloc", 0, 0, Buffer.from([0x44, 0x00]), u16(items.length), ...ilocEntries);
|
|
348
|
+
return fullBox("meta", 0, 0, hdlr, pitm, iloc, iinf, ...iref, iprp, ...grpl);
|
|
349
|
+
};
|
|
350
|
+
// Offsets are fixed-width, so the meta size does not depend on them: size the
|
|
351
|
+
// meta with placeholder offsets, then write the real ones.
|
|
352
|
+
const placeholder = buildMeta(items.map(() => 0));
|
|
353
|
+
const mdatStart = ftyp.length + placeholder.length;
|
|
354
|
+
let cursor = mdatStart + 8;
|
|
355
|
+
const offsets = items.map((item) => {
|
|
356
|
+
const offset = cursor;
|
|
357
|
+
cursor += item.payload.length;
|
|
358
|
+
return offset;
|
|
359
|
+
});
|
|
360
|
+
const meta = buildMeta(offsets);
|
|
361
|
+
const mdat = box("mdat", ...items.map((item) => item.payload));
|
|
362
|
+
return Buffer.concat([ftyp, meta, mdat]);
|
|
363
|
+
}
|
|
364
|
+
/** Number of `ipma` entries: one per item that carries at least one property. */
|
|
365
|
+
function countEntries(items) {
|
|
366
|
+
return items.filter((item) => (item.properties?.length ?? 0) > 0).length;
|
|
367
|
+
}
|
|
368
|
+
//# sourceMappingURL=avif-container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avif-container.js","sourceRoot":"","sources":["../src/avif-container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISO 21496-1 gain map metadata (`tmap` item payload) for AVIF.
|
|
3
|
+
*
|
|
4
|
+
* Maps between the log2-space fields of the standard and the linear
|
|
5
|
+
* {@link GainMapConfig} used everywhere else in this package.
|
|
6
|
+
*
|
|
7
|
+
* Layout (big-endian):
|
|
8
|
+
* u8 version (0)
|
|
9
|
+
* u16 minimum_version (0)
|
|
10
|
+
* u16 writer_version (0)
|
|
11
|
+
* u8 flags: bit 7 is_multichannel, bit 6 use_base_colour_space
|
|
12
|
+
* base_hdr_headroom (s32 numerator / u32 denominator, log2)
|
|
13
|
+
* alternate_hdr_headroom (s32 / u32, log2)
|
|
14
|
+
* per channel (1 or 3):
|
|
15
|
+
* gain_map_min (s32 / u32, log2)
|
|
16
|
+
* gain_map_max (s32 / u32, log2)
|
|
17
|
+
* gamma (u32 / u32)
|
|
18
|
+
* base_offset (s32 / u32)
|
|
19
|
+
* alternate_offset (s32 / u32)
|
|
20
|
+
*/
|
|
21
|
+
import type { GainMapConfig } from "./types.js";
|
|
22
|
+
/** Serialise a gain map config as ISO 21496-1 `tmap` item metadata. */
|
|
23
|
+
export declare function serializeTmapMetadata(config: GainMapConfig): Buffer;
|
|
24
|
+
/**
|
|
25
|
+
* Parse ISO 21496-1 `tmap` metadata into a linear {@link GainMapConfig}. The
|
|
26
|
+
* config is scalar, so only channel 0 is kept (see the note below). A base
|
|
27
|
+
* rendition brighter than the alternate (HDR base) is rejected, because the
|
|
28
|
+
* gain map pipeline assumes an SDR base.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseTmapMetadata(bytes: Buffer): GainMapConfig;
|
|
31
|
+
//# sourceMappingURL=avif-gainmap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avif-gainmap.d.ts","sourceRoot":"","sources":["../src/avif-gainmap.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAyBhD,uEAAuE;AACvE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAsBnE;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,aAAa,CAkE9D"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ISO 21496-1 gain map metadata (`tmap` item payload) for AVIF.
|
|
3
|
+
*
|
|
4
|
+
* Maps between the log2-space fields of the standard and the linear
|
|
5
|
+
* {@link GainMapConfig} used everywhere else in this package.
|
|
6
|
+
*
|
|
7
|
+
* Layout (big-endian):
|
|
8
|
+
* u8 version (0)
|
|
9
|
+
* u16 minimum_version (0)
|
|
10
|
+
* u16 writer_version (0)
|
|
11
|
+
* u8 flags: bit 7 is_multichannel, bit 6 use_base_colour_space
|
|
12
|
+
* base_hdr_headroom (s32 numerator / u32 denominator, log2)
|
|
13
|
+
* alternate_hdr_headroom (s32 / u32, log2)
|
|
14
|
+
* per channel (1 or 3):
|
|
15
|
+
* gain_map_min (s32 / u32, log2)
|
|
16
|
+
* gain_map_max (s32 / u32, log2)
|
|
17
|
+
* gamma (u32 / u32)
|
|
18
|
+
* base_offset (s32 / u32)
|
|
19
|
+
* alternate_offset (s32 / u32)
|
|
20
|
+
*/
|
|
21
|
+
/** Denominator for every fraction. Gives 1e-6 resolution and fits int32 for |value| < 2147. */
|
|
22
|
+
const fractionDenominator = 1_000_000;
|
|
23
|
+
const flagMultichannel = 0x80;
|
|
24
|
+
const flagUseBaseColourSpace = 0x40;
|
|
25
|
+
/** Channels written. The gain map is RGB, so all three channels carry the same parameters. */
|
|
26
|
+
const channelCount = 3;
|
|
27
|
+
function writeSignedFraction(buffer, offset, value) {
|
|
28
|
+
const numerator = Math.round(value * fractionDenominator);
|
|
29
|
+
buffer.writeInt32BE(numerator, offset);
|
|
30
|
+
buffer.writeUInt32BE(fractionDenominator, offset + 4);
|
|
31
|
+
return offset + 8;
|
|
32
|
+
}
|
|
33
|
+
function writeUnsignedFraction(buffer, offset, value) {
|
|
34
|
+
const numerator = Math.round(value * fractionDenominator);
|
|
35
|
+
buffer.writeUInt32BE(numerator, offset);
|
|
36
|
+
buffer.writeUInt32BE(fractionDenominator, offset + 4);
|
|
37
|
+
return offset + 8;
|
|
38
|
+
}
|
|
39
|
+
/** Serialise a gain map config as ISO 21496-1 `tmap` item metadata. */
|
|
40
|
+
export function serializeTmapMetadata(config) {
|
|
41
|
+
const size = 6 + 8 + 8 + channelCount * 40;
|
|
42
|
+
const buffer = Buffer.alloc(size);
|
|
43
|
+
let offset = 0;
|
|
44
|
+
buffer.writeUInt8(0, offset);
|
|
45
|
+
buffer.writeUInt16BE(0, offset + 1);
|
|
46
|
+
buffer.writeUInt16BE(0, offset + 3);
|
|
47
|
+
buffer.writeUInt8(flagMultichannel | (config.useBaseColorSpace ? flagUseBaseColourSpace : 0), offset + 5);
|
|
48
|
+
offset += 6;
|
|
49
|
+
offset = writeSignedFraction(buffer, offset, Math.log2(config.hdrCapacityMin));
|
|
50
|
+
offset = writeSignedFraction(buffer, offset, Math.log2(config.hdrCapacityMax));
|
|
51
|
+
for (let channel = 0; channel < channelCount; channel++) {
|
|
52
|
+
offset = writeSignedFraction(buffer, offset, Math.log2(config.minContentBoost));
|
|
53
|
+
offset = writeSignedFraction(buffer, offset, Math.log2(config.maxContentBoost));
|
|
54
|
+
offset = writeUnsignedFraction(buffer, offset, config.gamma);
|
|
55
|
+
offset = writeSignedFraction(buffer, offset, config.offsetSdr);
|
|
56
|
+
offset = writeSignedFraction(buffer, offset, config.offsetHdr);
|
|
57
|
+
}
|
|
58
|
+
return buffer;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Parse ISO 21496-1 `tmap` metadata into a linear {@link GainMapConfig}. The
|
|
62
|
+
* config is scalar, so only channel 0 is kept (see the note below). A base
|
|
63
|
+
* rendition brighter than the alternate (HDR base) is rejected, because the
|
|
64
|
+
* gain map pipeline assumes an SDR base.
|
|
65
|
+
*/
|
|
66
|
+
export function parseTmapMetadata(bytes) {
|
|
67
|
+
if (bytes.length < 6 + 16)
|
|
68
|
+
throw new Error("tmap metadata is truncated.");
|
|
69
|
+
const version = bytes.readUInt8(0);
|
|
70
|
+
if (version !== 0)
|
|
71
|
+
throw new Error(`Unsupported tmap metadata version ${version}.`);
|
|
72
|
+
const flags = bytes.readUInt8(5);
|
|
73
|
+
const multichannel = (flags & flagMultichannel) !== 0;
|
|
74
|
+
const channels = multichannel ? channelCount : 1;
|
|
75
|
+
if (bytes.length < 6 + 16 + channels * 40)
|
|
76
|
+
throw new Error("tmap metadata is truncated.");
|
|
77
|
+
let offset = 6;
|
|
78
|
+
const readSigned = () => {
|
|
79
|
+
const numerator = bytes.readInt32BE(offset);
|
|
80
|
+
const denominator = bytes.readUInt32BE(offset + 4);
|
|
81
|
+
offset += 8;
|
|
82
|
+
return denominator === 0 ? 0 : numerator / denominator;
|
|
83
|
+
};
|
|
84
|
+
const readUnsigned = () => {
|
|
85
|
+
const numerator = bytes.readUInt32BE(offset);
|
|
86
|
+
const denominator = bytes.readUInt32BE(offset + 4);
|
|
87
|
+
offset += 8;
|
|
88
|
+
return denominator === 0 ? 0 : numerator / denominator;
|
|
89
|
+
};
|
|
90
|
+
const baseHeadroom = readSigned();
|
|
91
|
+
const alternateHeadroom = readSigned();
|
|
92
|
+
const channelValues = [];
|
|
93
|
+
for (let channel = 0; channel < channels; channel++) {
|
|
94
|
+
channelValues.push({
|
|
95
|
+
gainMapMin: readSigned(),
|
|
96
|
+
gainMapMax: readSigned(),
|
|
97
|
+
gamma: readUnsigned(),
|
|
98
|
+
baseOffset: readSigned(),
|
|
99
|
+
alternateOffset: readSigned(),
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
// Only channel 0 is used. The config model is scalar, and this matches the
|
|
103
|
+
// panorama viewer. Real files can carry different per-channel values (the
|
|
104
|
+
// libavif sample has R/G/B gain map max of 3.28/2.53/3.23), so highlights may
|
|
105
|
+
// tint slightly.
|
|
106
|
+
const [first] = channelValues;
|
|
107
|
+
if (baseHeadroom > alternateHeadroom)
|
|
108
|
+
throw new Error("HDR base renditions (base headroom above alternate) are not supported.");
|
|
109
|
+
// Some files declare equal headrooms (libavif writes 0 and 0 when the
|
|
110
|
+
// alternate is not brighter than the base). Then the gain map's own maximum is
|
|
111
|
+
// the best available capacity, matching the panorama viewer.
|
|
112
|
+
const hdrCapacityMax = alternateHeadroom > baseHeadroom ? 2 ** alternateHeadroom : 2 ** first.gainMapMax;
|
|
113
|
+
return {
|
|
114
|
+
minContentBoost: 2 ** first.gainMapMin,
|
|
115
|
+
maxContentBoost: 2 ** first.gainMapMax,
|
|
116
|
+
gamma: first.gamma,
|
|
117
|
+
offsetSdr: first.baseOffset,
|
|
118
|
+
offsetHdr: first.alternateOffset,
|
|
119
|
+
hdrCapacityMin: 2 ** baseHeadroom,
|
|
120
|
+
hdrCapacityMax,
|
|
121
|
+
useBaseColorSpace: (flags & flagUseBaseColourSpace) !== 0,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=avif-gainmap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avif-gainmap.js","sourceRoot":"","sources":["../src/avif-gainmap.ts"],"names":[],"mappings":"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"}
|
package/dist/avif.d.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AVIF reading and writing for HDR content.
|
|
3
|
+
*
|
|
4
|
+
* Two AVIF forms are supported:
|
|
5
|
+
* - gain map AVIF: an 8-bit SDR base, an 8-bit gain map and an ISO 21496-1
|
|
6
|
+
* `tmap` item that references both (`dimg`, base first, gain map second).
|
|
7
|
+
* - 10-bit HDR AVIF: one `av01` image in PQ or HLG (BT.2020), read as linear light.
|
|
8
|
+
*
|
|
9
|
+
* Plain 8-bit AVIF is not HDR, so it is rejected here. Tiled (`grid`) items are
|
|
10
|
+
* rejected too.
|
|
11
|
+
*/
|
|
12
|
+
import type { LinearHdrImage } from "./exr.js";
|
|
13
|
+
import type { GainMapConfig } from "./types.js";
|
|
14
|
+
/** Interleaved 8-bit RGB image. */
|
|
15
|
+
export interface RgbImage {
|
|
16
|
+
width: number;
|
|
17
|
+
height: number;
|
|
18
|
+
data: Buffer;
|
|
19
|
+
}
|
|
20
|
+
/** SDR base, gain map and the config that relates them. */
|
|
21
|
+
export interface GainMapPair {
|
|
22
|
+
sdr: RgbImage;
|
|
23
|
+
gain: RgbImage;
|
|
24
|
+
config: GainMapConfig;
|
|
25
|
+
}
|
|
26
|
+
export type AvifContent = {
|
|
27
|
+
kind: "gainmap";
|
|
28
|
+
pair: GainMapPair;
|
|
29
|
+
} | {
|
|
30
|
+
kind: "hdr10";
|
|
31
|
+
image: LinearHdrImage;
|
|
32
|
+
};
|
|
33
|
+
/** Default lossy quality for AVIF output (0-100). */
|
|
34
|
+
export declare const defaultAvifQuality = 90;
|
|
35
|
+
/** Read an AVIF file as either a gain map pair or linear HDR, whichever it is. */
|
|
36
|
+
export declare function readAvif(buffer: Buffer): Promise<AvifContent>;
|
|
37
|
+
/** Encode a gain map pair as a gain map AVIF (ISO 21496-1 `tmap`). */
|
|
38
|
+
export declare function encodeAvifGainMap(pair: GainMapPair, options?: {
|
|
39
|
+
quality?: number;
|
|
40
|
+
}): Promise<Buffer>;
|
|
41
|
+
/**
|
|
42
|
+
* Encode linear HDR as a 10-bit PQ AVIF (BT.2020 primaries, full range, 4:2:0).
|
|
43
|
+
* Values above 10000 nits are clipped; SDR white (linear 1) is 203 nits. The
|
|
44
|
+
* 10-bit 4:4:4 encoder fails above about 30 megapixels (7680x3840 encodes,
|
|
45
|
+
* 8000x4000 does not), so 4:2:0 is used at every size.
|
|
46
|
+
*/
|
|
47
|
+
export declare function encodeAvifHdr10(image: LinearHdrImage, options?: {
|
|
48
|
+
quality?: number;
|
|
49
|
+
}): Promise<Buffer>;
|
|
50
|
+
//# sourceMappingURL=avif.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"avif.d.ts","sourceRoot":"","sources":["../src/avif.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAgC/C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,mCAAmC;AACnC,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2DAA2D;AAC3D,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,QAAQ,CAAC;IACd,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GACtC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAE7C,qDAAqD;AACrD,eAAO,MAAM,kBAAkB,KAAK,CAAC;AA+ErC,kFAAkF;AAClF,wBAAsB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAiDnE;AA+BD,sEAAsE;AACtE,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,WAAW,EACjB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,CAAC,CAwCjB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,cAAc,EACrB,OAAO,GAAE;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GACjC,OAAO,CAAC,MAAM,CAAC,CAoBjB"}
|