zenpixels-convert 0.2.14

Transfer-function-aware pixel conversion, gamut mapping, and codec format negotiation for zenpixels
Documentation
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
// @generated by `cargo run -p icc-gen --bin cicp_bundle_gen` — do not edit by hand.
//
// Index for the transfer-grouped, LZ4-compressed CICP ICC bundle
// (`../profiles/cicp_bundle.lz4`). Each group packs the RGB profiles
// for one transfer code first, then the GRAY-class ones (whose kTRC
// payload LZ4-matches the RGB TRC bytes before it). Regenerate with
// the generator above after a moxcms version bump; the golden sha256
// test will flag drift.

/// One LZ4-compressed group inside the bundle blob, keyed by
/// transfer-characteristics code. Each group's decoded bytes pack every
/// unique profile that shares that transfer.
#[derive(Clone, Copy)]
pub(crate) struct BundleGroup {
    /// H.273 transfer-characteristics code this group covers.
    pub transfer: u8,
    /// Byte offset of the group's LZ4 block within `CICP_BUNDLE_LZ4`.
    pub blob_offset: usize,
    /// Length of the group's LZ4 block.
    pub compressed_len: usize,
    /// Exact size of the group's decoded bytes (the `decompress_into` buffer).
    pub decompressed_len: usize,
}

/// Locator for one synthesized profile: which group holds it, and the
/// `[offset, offset + len)` slice of that group's *decoded* bytes.
#[derive(Clone, Copy)]
pub(crate) struct BundleProfile {
    /// H.273 colour-primaries code.
    pub primaries: u8,
    /// H.273 transfer-characteristics code.
    pub transfer: u8,
    /// Index into [`BUNDLE_GROUPS`].
    pub group_index: usize,
    /// Byte offset of this profile within the group's decoded bytes.
    pub offset_in_group: usize,
    /// Length of this profile in bytes.
    pub len: usize,
}

/// The concatenated LZ4-compressed groups. Embedded at compile time.
pub(crate) static CICP_BUNDLE_LZ4: &[u8] = include_bytes!("../profiles/cicp_bundle.lz4");

/// Number of transfer groups in the bundle.
pub(crate) const NUM_GROUPS: usize = 16;

/// Group table, indexed by group index (also the order in the blob).
pub(crate) static BUNDLE_GROUPS: [BundleGroup; NUM_GROUPS] = [
    BundleGroup { transfer: 1, blob_offset: 0, compressed_len: 1084, decompressed_len: 6064 }, // 14 profile(s)
    BundleGroup { transfer: 4, blob_offset: 1084, compressed_len: 1100, decompressed_len: 5838 }, // 15 profile(s)
    BundleGroup { transfer: 5, blob_offset: 2184, compressed_len: 1096, decompressed_len: 5838 }, // 15 profile(s)
    BundleGroup { transfer: 6, blob_offset: 3280, compressed_len: 1116, decompressed_len: 6504 }, // 15 profile(s)
    BundleGroup { transfer: 7, blob_offset: 4396, compressed_len: 3460, decompressed_len: 81540 }, // 15 profile(s)
    BundleGroup { transfer: 8, blob_offset: 7856, compressed_len: 1098, decompressed_len: 5838 }, // 15 profile(s)
    BundleGroup { transfer: 9, blob_offset: 8954, compressed_len: 3456, decompressed_len: 81540 }, // 15 profile(s)
    BundleGroup { transfer: 10, blob_offset: 12410, compressed_len: 3468, decompressed_len: 81548 }, // 15 profile(s)
    BundleGroup { transfer: 11, blob_offset: 15878, compressed_len: 3458, decompressed_len: 81548 }, // 15 profile(s)
    BundleGroup { transfer: 12, blob_offset: 19336, compressed_len: 3448, decompressed_len: 81548 }, // 15 profile(s)
    BundleGroup { transfer: 13, blob_offset: 22784, compressed_len: 1082, decompressed_len: 6072 }, // 14 profile(s)
    BundleGroup { transfer: 14, blob_offset: 23866, compressed_len: 1117, decompressed_len: 6512 }, // 15 profile(s)
    BundleGroup { transfer: 15, blob_offset: 24983, compressed_len: 1115, decompressed_len: 6512 }, // 15 profile(s)
    BundleGroup { transfer: 16, blob_offset: 26098, compressed_len: 3096, decompressed_len: 81548 }, // 15 profile(s)
    BundleGroup { transfer: 17, blob_offset: 29194, compressed_len: 3361, decompressed_len: 81548 }, // 15 profile(s)
    BundleGroup { transfer: 18, blob_offset: 32555, compressed_len: 3412, decompressed_len: 81548 }, // 15 profile(s)
];

/// Profile locator table, sorted by `(primaries, transfer)` for binary search.
pub(crate) static BUNDLE_PROFILES: [BundleProfile; 174] = [
    BundleProfile { primaries: 1, transfer: 4, group_index: 1, offset_in_group: 1592, len: 386 },
    BundleProfile { primaries: 1, transfer: 5, group_index: 2, offset_in_group: 1592, len: 386 },
    BundleProfile { primaries: 1, transfer: 6, group_index: 3, offset_in_group: 1664, len: 440 },
    BundleProfile { primaries: 1, transfer: 7, group_index: 4, offset_in_group: 9776, len: 6524 },
    BundleProfile { primaries: 1, transfer: 8, group_index: 5, offset_in_group: 1592, len: 386 },
    BundleProfile { primaries: 1, transfer: 9, group_index: 6, offset_in_group: 9776, len: 6524 },
    BundleProfile { primaries: 1, transfer: 10, group_index: 7, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 1, transfer: 11, group_index: 8, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 1, transfer: 12, group_index: 9, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 1, transfer: 14, group_index: 11, offset_in_group: 1672, len: 440 },
    BundleProfile { primaries: 1, transfer: 15, group_index: 12, offset_in_group: 1672, len: 440 },
    BundleProfile { primaries: 1, transfer: 16, group_index: 13, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 1, transfer: 17, group_index: 14, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 1, transfer: 18, group_index: 15, offset_in_group: 9784, len: 6524 },
    BundleProfile { primaries: 4, transfer: 1, group_index: 0, offset_in_group: 1664, len: 440 },
    BundleProfile { primaries: 4, transfer: 4, group_index: 1, offset_in_group: 1978, len: 386 },
    BundleProfile { primaries: 4, transfer: 5, group_index: 2, offset_in_group: 1978, len: 386 },
    BundleProfile { primaries: 4, transfer: 6, group_index: 3, offset_in_group: 2104, len: 440 },
    BundleProfile { primaries: 4, transfer: 7, group_index: 4, offset_in_group: 16300, len: 6524 },
    BundleProfile { primaries: 4, transfer: 8, group_index: 5, offset_in_group: 1978, len: 386 },
    BundleProfile { primaries: 4, transfer: 9, group_index: 6, offset_in_group: 16300, len: 6524 },
    BundleProfile { primaries: 4, transfer: 10, group_index: 7, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 4, transfer: 11, group_index: 8, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 4, transfer: 12, group_index: 9, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 4, transfer: 13, group_index: 10, offset_in_group: 1672, len: 440 },
    BundleProfile { primaries: 4, transfer: 14, group_index: 11, offset_in_group: 2112, len: 440 },
    BundleProfile { primaries: 4, transfer: 15, group_index: 12, offset_in_group: 2112, len: 440 },
    BundleProfile { primaries: 4, transfer: 16, group_index: 13, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 4, transfer: 17, group_index: 14, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 4, transfer: 18, group_index: 15, offset_in_group: 16308, len: 6524 },
    BundleProfile { primaries: 5, transfer: 1, group_index: 0, offset_in_group: 2104, len: 440 },
    BundleProfile { primaries: 5, transfer: 4, group_index: 1, offset_in_group: 2364, len: 386 },
    BundleProfile { primaries: 5, transfer: 5, group_index: 2, offset_in_group: 2364, len: 386 },
    BundleProfile { primaries: 5, transfer: 6, group_index: 3, offset_in_group: 2544, len: 440 },
    BundleProfile { primaries: 5, transfer: 7, group_index: 4, offset_in_group: 22824, len: 6524 },
    BundleProfile { primaries: 5, transfer: 8, group_index: 5, offset_in_group: 2364, len: 386 },
    BundleProfile { primaries: 5, transfer: 9, group_index: 6, offset_in_group: 22824, len: 6524 },
    BundleProfile { primaries: 5, transfer: 10, group_index: 7, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 5, transfer: 11, group_index: 8, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 5, transfer: 12, group_index: 9, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 5, transfer: 13, group_index: 10, offset_in_group: 2112, len: 440 },
    BundleProfile { primaries: 5, transfer: 14, group_index: 11, offset_in_group: 2552, len: 440 },
    BundleProfile { primaries: 5, transfer: 15, group_index: 12, offset_in_group: 2552, len: 440 },
    BundleProfile { primaries: 5, transfer: 16, group_index: 13, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 5, transfer: 17, group_index: 14, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 5, transfer: 18, group_index: 15, offset_in_group: 22832, len: 6524 },
    BundleProfile { primaries: 6, transfer: 1, group_index: 0, offset_in_group: 2544, len: 440 },
    BundleProfile { primaries: 6, transfer: 4, group_index: 1, offset_in_group: 2750, len: 386 },
    BundleProfile { primaries: 6, transfer: 5, group_index: 2, offset_in_group: 2750, len: 386 },
    BundleProfile { primaries: 6, transfer: 6, group_index: 3, offset_in_group: 2984, len: 440 },
    BundleProfile { primaries: 6, transfer: 7, group_index: 4, offset_in_group: 29348, len: 6524 },
    BundleProfile { primaries: 6, transfer: 8, group_index: 5, offset_in_group: 2750, len: 386 },
    BundleProfile { primaries: 6, transfer: 9, group_index: 6, offset_in_group: 29348, len: 6524 },
    BundleProfile { primaries: 6, transfer: 10, group_index: 7, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 6, transfer: 11, group_index: 8, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 6, transfer: 12, group_index: 9, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 6, transfer: 13, group_index: 10, offset_in_group: 2552, len: 440 },
    BundleProfile { primaries: 6, transfer: 14, group_index: 11, offset_in_group: 2992, len: 440 },
    BundleProfile { primaries: 6, transfer: 15, group_index: 12, offset_in_group: 2992, len: 440 },
    BundleProfile { primaries: 6, transfer: 16, group_index: 13, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 6, transfer: 17, group_index: 14, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 6, transfer: 18, group_index: 15, offset_in_group: 29356, len: 6524 },
    BundleProfile { primaries: 7, transfer: 1, group_index: 0, offset_in_group: 2984, len: 440 },
    BundleProfile { primaries: 7, transfer: 4, group_index: 1, offset_in_group: 3136, len: 386 },
    BundleProfile { primaries: 7, transfer: 5, group_index: 2, offset_in_group: 3136, len: 386 },
    BundleProfile { primaries: 7, transfer: 6, group_index: 3, offset_in_group: 3424, len: 440 },
    BundleProfile { primaries: 7, transfer: 7, group_index: 4, offset_in_group: 35872, len: 6524 },
    BundleProfile { primaries: 7, transfer: 8, group_index: 5, offset_in_group: 3136, len: 386 },
    BundleProfile { primaries: 7, transfer: 9, group_index: 6, offset_in_group: 35872, len: 6524 },
    BundleProfile { primaries: 7, transfer: 10, group_index: 7, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 7, transfer: 11, group_index: 8, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 7, transfer: 12, group_index: 9, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 7, transfer: 13, group_index: 10, offset_in_group: 2992, len: 440 },
    BundleProfile { primaries: 7, transfer: 14, group_index: 11, offset_in_group: 3432, len: 440 },
    BundleProfile { primaries: 7, transfer: 15, group_index: 12, offset_in_group: 3432, len: 440 },
    BundleProfile { primaries: 7, transfer: 16, group_index: 13, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 7, transfer: 17, group_index: 14, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 7, transfer: 18, group_index: 15, offset_in_group: 35880, len: 6524 },
    BundleProfile { primaries: 8, transfer: 1, group_index: 0, offset_in_group: 3424, len: 440 },
    BundleProfile { primaries: 8, transfer: 4, group_index: 1, offset_in_group: 3522, len: 386 },
    BundleProfile { primaries: 8, transfer: 5, group_index: 2, offset_in_group: 3522, len: 386 },
    BundleProfile { primaries: 8, transfer: 6, group_index: 3, offset_in_group: 3864, len: 440 },
    BundleProfile { primaries: 8, transfer: 7, group_index: 4, offset_in_group: 42396, len: 6524 },
    BundleProfile { primaries: 8, transfer: 8, group_index: 5, offset_in_group: 3522, len: 386 },
    BundleProfile { primaries: 8, transfer: 9, group_index: 6, offset_in_group: 42396, len: 6524 },
    BundleProfile { primaries: 8, transfer: 10, group_index: 7, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 8, transfer: 11, group_index: 8, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 8, transfer: 12, group_index: 9, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 8, transfer: 13, group_index: 10, offset_in_group: 3432, len: 440 },
    BundleProfile { primaries: 8, transfer: 14, group_index: 11, offset_in_group: 3872, len: 440 },
    BundleProfile { primaries: 8, transfer: 15, group_index: 12, offset_in_group: 3872, len: 440 },
    BundleProfile { primaries: 8, transfer: 16, group_index: 13, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 8, transfer: 17, group_index: 14, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 8, transfer: 18, group_index: 15, offset_in_group: 42404, len: 6524 },
    BundleProfile { primaries: 9, transfer: 1, group_index: 0, offset_in_group: 3864, len: 440 },
    BundleProfile { primaries: 9, transfer: 4, group_index: 1, offset_in_group: 3908, len: 386 },
    BundleProfile { primaries: 9, transfer: 5, group_index: 2, offset_in_group: 3908, len: 386 },
    BundleProfile { primaries: 9, transfer: 6, group_index: 3, offset_in_group: 4304, len: 440 },
    BundleProfile { primaries: 9, transfer: 7, group_index: 4, offset_in_group: 48920, len: 6524 },
    BundleProfile { primaries: 9, transfer: 8, group_index: 5, offset_in_group: 3908, len: 386 },
    BundleProfile { primaries: 9, transfer: 9, group_index: 6, offset_in_group: 48920, len: 6524 },
    BundleProfile { primaries: 9, transfer: 10, group_index: 7, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 9, transfer: 11, group_index: 8, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 9, transfer: 12, group_index: 9, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 9, transfer: 13, group_index: 10, offset_in_group: 3872, len: 440 },
    BundleProfile { primaries: 9, transfer: 14, group_index: 11, offset_in_group: 4312, len: 440 },
    BundleProfile { primaries: 9, transfer: 15, group_index: 12, offset_in_group: 4312, len: 440 },
    BundleProfile { primaries: 9, transfer: 16, group_index: 13, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 9, transfer: 17, group_index: 14, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 9, transfer: 18, group_index: 15, offset_in_group: 48928, len: 6524 },
    BundleProfile { primaries: 10, transfer: 1, group_index: 0, offset_in_group: 4304, len: 440 },
    BundleProfile { primaries: 10, transfer: 4, group_index: 1, offset_in_group: 4294, len: 386 },
    BundleProfile { primaries: 10, transfer: 5, group_index: 2, offset_in_group: 4294, len: 386 },
    BundleProfile { primaries: 10, transfer: 6, group_index: 3, offset_in_group: 4744, len: 440 },
    BundleProfile { primaries: 10, transfer: 7, group_index: 4, offset_in_group: 55444, len: 6524 },
    BundleProfile { primaries: 10, transfer: 8, group_index: 5, offset_in_group: 4294, len: 386 },
    BundleProfile { primaries: 10, transfer: 9, group_index: 6, offset_in_group: 55444, len: 6524 },
    BundleProfile { primaries: 10, transfer: 10, group_index: 7, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 10, transfer: 11, group_index: 8, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 10, transfer: 12, group_index: 9, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 10, transfer: 13, group_index: 10, offset_in_group: 4312, len: 440 },
    BundleProfile { primaries: 10, transfer: 14, group_index: 11, offset_in_group: 4752, len: 440 },
    BundleProfile { primaries: 10, transfer: 15, group_index: 12, offset_in_group: 4752, len: 440 },
    BundleProfile { primaries: 10, transfer: 16, group_index: 13, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 10, transfer: 17, group_index: 14, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 10, transfer: 18, group_index: 15, offset_in_group: 55452, len: 6524 },
    BundleProfile { primaries: 11, transfer: 1, group_index: 0, offset_in_group: 4744, len: 440 },
    BundleProfile { primaries: 11, transfer: 4, group_index: 1, offset_in_group: 4680, len: 386 },
    BundleProfile { primaries: 11, transfer: 5, group_index: 2, offset_in_group: 4680, len: 386 },
    BundleProfile { primaries: 11, transfer: 6, group_index: 3, offset_in_group: 5184, len: 440 },
    BundleProfile { primaries: 11, transfer: 7, group_index: 4, offset_in_group: 61968, len: 6524 },
    BundleProfile { primaries: 11, transfer: 8, group_index: 5, offset_in_group: 4680, len: 386 },
    BundleProfile { primaries: 11, transfer: 9, group_index: 6, offset_in_group: 61968, len: 6524 },
    BundleProfile { primaries: 11, transfer: 10, group_index: 7, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 11, transfer: 11, group_index: 8, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 11, transfer: 12, group_index: 9, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 11, transfer: 13, group_index: 10, offset_in_group: 4752, len: 440 },
    BundleProfile { primaries: 11, transfer: 14, group_index: 11, offset_in_group: 5192, len: 440 },
    BundleProfile { primaries: 11, transfer: 15, group_index: 12, offset_in_group: 5192, len: 440 },
    BundleProfile { primaries: 11, transfer: 16, group_index: 13, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 11, transfer: 17, group_index: 14, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 11, transfer: 18, group_index: 15, offset_in_group: 61976, len: 6524 },
    BundleProfile { primaries: 12, transfer: 1, group_index: 0, offset_in_group: 5184, len: 440 },
    BundleProfile { primaries: 12, transfer: 4, group_index: 1, offset_in_group: 5066, len: 386 },
    BundleProfile { primaries: 12, transfer: 5, group_index: 2, offset_in_group: 5066, len: 386 },
    BundleProfile { primaries: 12, transfer: 6, group_index: 3, offset_in_group: 5624, len: 440 },
    BundleProfile { primaries: 12, transfer: 7, group_index: 4, offset_in_group: 68492, len: 6524 },
    BundleProfile { primaries: 12, transfer: 8, group_index: 5, offset_in_group: 5066, len: 386 },
    BundleProfile { primaries: 12, transfer: 9, group_index: 6, offset_in_group: 68492, len: 6524 },
    BundleProfile { primaries: 12, transfer: 10, group_index: 7, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 12, transfer: 11, group_index: 8, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 12, transfer: 12, group_index: 9, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 12, transfer: 13, group_index: 10, offset_in_group: 5192, len: 440 },
    BundleProfile { primaries: 12, transfer: 14, group_index: 11, offset_in_group: 5632, len: 440 },
    BundleProfile { primaries: 12, transfer: 15, group_index: 12, offset_in_group: 5632, len: 440 },
    BundleProfile { primaries: 12, transfer: 16, group_index: 13, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 12, transfer: 17, group_index: 14, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 12, transfer: 18, group_index: 15, offset_in_group: 68500, len: 6524 },
    BundleProfile { primaries: 22, transfer: 1, group_index: 0, offset_in_group: 5624, len: 440 },
    BundleProfile { primaries: 22, transfer: 4, group_index: 1, offset_in_group: 5452, len: 386 },
    BundleProfile { primaries: 22, transfer: 5, group_index: 2, offset_in_group: 5452, len: 386 },
    BundleProfile { primaries: 22, transfer: 6, group_index: 3, offset_in_group: 6064, len: 440 },
    BundleProfile { primaries: 22, transfer: 7, group_index: 4, offset_in_group: 75016, len: 6524 },
    BundleProfile { primaries: 22, transfer: 8, group_index: 5, offset_in_group: 5452, len: 386 },
    BundleProfile { primaries: 22, transfer: 9, group_index: 6, offset_in_group: 75016, len: 6524 },
    BundleProfile { primaries: 22, transfer: 10, group_index: 7, offset_in_group: 75024, len: 6524 },
    BundleProfile { primaries: 22, transfer: 11, group_index: 8, offset_in_group: 75024, len: 6524 },
    BundleProfile { primaries: 22, transfer: 12, group_index: 9, offset_in_group: 75024, len: 6524 },
    BundleProfile { primaries: 22, transfer: 13, group_index: 10, offset_in_group: 5632, len: 440 },
    BundleProfile { primaries: 22, transfer: 14, group_index: 11, offset_in_group: 6072, len: 440 },
    BundleProfile { primaries: 22, transfer: 15, group_index: 12, offset_in_group: 6072, len: 440 },
    BundleProfile { primaries: 22, transfer: 16, group_index: 13, offset_in_group: 75024, len: 6524 },
    BundleProfile { primaries: 22, transfer: 17, group_index: 14, offset_in_group: 75024, len: 6524 },
    BundleProfile { primaries: 22, transfer: 18, group_index: 15, offset_in_group: 75024, len: 6524 },
];

/// GRAY-class profile locator table, sorted by `(primaries, transfer)`
/// for binary search. Locators point into the same groups as
/// [`BUNDLE_PROFILES`] (each group's decoded bytes pack RGB first,
/// then GRAY).
pub(crate) static GRAY_BUNDLE_PROFILES: [BundleProfile; 174] = [
    BundleProfile { primaries: 1, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 1, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 1, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 1, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 1, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 1, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 1, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 1, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 1, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 1, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 1, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 1, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 1, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 1, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 4, transfer: 1, group_index: 0, offset_in_group: 0, len: 414 },
    BundleProfile { primaries: 4, transfer: 4, group_index: 1, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 4, transfer: 5, group_index: 2, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 4, transfer: 6, group_index: 3, offset_in_group: 418, len: 414 },
    BundleProfile { primaries: 4, transfer: 7, group_index: 4, offset_in_group: 2446, len: 2442 },
    BundleProfile { primaries: 4, transfer: 8, group_index: 5, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 4, transfer: 9, group_index: 6, offset_in_group: 2446, len: 2442 },
    BundleProfile { primaries: 4, transfer: 10, group_index: 7, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 4, transfer: 11, group_index: 8, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 4, transfer: 12, group_index: 9, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 4, transfer: 13, group_index: 10, offset_in_group: 0, len: 416 },
    BundleProfile { primaries: 4, transfer: 14, group_index: 11, offset_in_group: 420, len: 416 },
    BundleProfile { primaries: 4, transfer: 15, group_index: 12, offset_in_group: 420, len: 416 },
    BundleProfile { primaries: 4, transfer: 16, group_index: 13, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 4, transfer: 17, group_index: 14, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 4, transfer: 18, group_index: 15, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 5, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 5, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 5, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 5, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 5, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 5, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 5, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 5, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 5, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 5, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 5, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 5, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 5, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 5, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 5, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 5, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 6, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 6, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 6, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 6, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 6, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 6, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 6, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 6, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 6, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 6, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 6, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 7, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 7, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 7, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 7, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 7, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 7, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 7, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 7, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 7, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 7, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 7, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 8, transfer: 1, group_index: 0, offset_in_group: 0, len: 414 },
    BundleProfile { primaries: 8, transfer: 4, group_index: 1, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 8, transfer: 5, group_index: 2, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 8, transfer: 6, group_index: 3, offset_in_group: 418, len: 414 },
    BundleProfile { primaries: 8, transfer: 7, group_index: 4, offset_in_group: 2446, len: 2442 },
    BundleProfile { primaries: 8, transfer: 8, group_index: 5, offset_in_group: 400, len: 396 },
    BundleProfile { primaries: 8, transfer: 9, group_index: 6, offset_in_group: 2446, len: 2442 },
    BundleProfile { primaries: 8, transfer: 10, group_index: 7, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 8, transfer: 11, group_index: 8, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 8, transfer: 12, group_index: 9, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 8, transfer: 13, group_index: 10, offset_in_group: 0, len: 416 },
    BundleProfile { primaries: 8, transfer: 14, group_index: 11, offset_in_group: 420, len: 416 },
    BundleProfile { primaries: 8, transfer: 15, group_index: 12, offset_in_group: 420, len: 416 },
    BundleProfile { primaries: 8, transfer: 16, group_index: 13, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 8, transfer: 17, group_index: 14, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 8, transfer: 18, group_index: 15, offset_in_group: 2448, len: 2444 },
    BundleProfile { primaries: 9, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 9, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 9, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 9, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 9, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 9, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 9, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 9, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 9, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 9, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 9, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 9, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 9, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 9, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 9, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 9, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 10, transfer: 1, group_index: 0, offset_in_group: 832, len: 414 },
    BundleProfile { primaries: 10, transfer: 4, group_index: 1, offset_in_group: 796, len: 396 },
    BundleProfile { primaries: 10, transfer: 5, group_index: 2, offset_in_group: 796, len: 396 },
    BundleProfile { primaries: 10, transfer: 6, group_index: 3, offset_in_group: 832, len: 414 },
    BundleProfile { primaries: 10, transfer: 7, group_index: 4, offset_in_group: 4888, len: 2442 },
    BundleProfile { primaries: 10, transfer: 8, group_index: 5, offset_in_group: 796, len: 396 },
    BundleProfile { primaries: 10, transfer: 9, group_index: 6, offset_in_group: 4888, len: 2442 },
    BundleProfile { primaries: 10, transfer: 10, group_index: 7, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 10, transfer: 11, group_index: 8, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 10, transfer: 12, group_index: 9, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 10, transfer: 13, group_index: 10, offset_in_group: 836, len: 416 },
    BundleProfile { primaries: 10, transfer: 14, group_index: 11, offset_in_group: 836, len: 416 },
    BundleProfile { primaries: 10, transfer: 15, group_index: 12, offset_in_group: 836, len: 416 },
    BundleProfile { primaries: 10, transfer: 16, group_index: 13, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 10, transfer: 17, group_index: 14, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 10, transfer: 18, group_index: 15, offset_in_group: 4892, len: 2444 },
    BundleProfile { primaries: 11, transfer: 1, group_index: 0, offset_in_group: 1246, len: 418 },
    BundleProfile { primaries: 11, transfer: 4, group_index: 1, offset_in_group: 1192, len: 400 },
    BundleProfile { primaries: 11, transfer: 5, group_index: 2, offset_in_group: 1192, len: 400 },
    BundleProfile { primaries: 11, transfer: 6, group_index: 3, offset_in_group: 1246, len: 418 },
    BundleProfile { primaries: 11, transfer: 7, group_index: 4, offset_in_group: 7330, len: 2446 },
    BundleProfile { primaries: 11, transfer: 8, group_index: 5, offset_in_group: 1192, len: 400 },
    BundleProfile { primaries: 11, transfer: 9, group_index: 6, offset_in_group: 7330, len: 2446 },
    BundleProfile { primaries: 11, transfer: 10, group_index: 7, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 11, transfer: 11, group_index: 8, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 11, transfer: 12, group_index: 9, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 11, transfer: 13, group_index: 10, offset_in_group: 1252, len: 420 },
    BundleProfile { primaries: 11, transfer: 14, group_index: 11, offset_in_group: 1252, len: 420 },
    BundleProfile { primaries: 11, transfer: 15, group_index: 12, offset_in_group: 1252, len: 420 },
    BundleProfile { primaries: 11, transfer: 16, group_index: 13, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 11, transfer: 17, group_index: 14, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 11, transfer: 18, group_index: 15, offset_in_group: 7336, len: 2448 },
    BundleProfile { primaries: 12, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 12, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 12, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 12, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 12, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 12, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 12, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 12, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 12, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 12, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 12, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 12, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 12, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 12, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 12, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 12, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 1, group_index: 0, offset_in_group: 414, len: 418 },
    BundleProfile { primaries: 22, transfer: 4, group_index: 1, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 22, transfer: 5, group_index: 2, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 22, transfer: 6, group_index: 3, offset_in_group: 0, len: 418 },
    BundleProfile { primaries: 22, transfer: 7, group_index: 4, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 22, transfer: 8, group_index: 5, offset_in_group: 0, len: 400 },
    BundleProfile { primaries: 22, transfer: 9, group_index: 6, offset_in_group: 0, len: 2446 },
    BundleProfile { primaries: 22, transfer: 10, group_index: 7, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 11, group_index: 8, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 12, group_index: 9, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 13, group_index: 10, offset_in_group: 416, len: 420 },
    BundleProfile { primaries: 22, transfer: 14, group_index: 11, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 22, transfer: 15, group_index: 12, offset_in_group: 0, len: 420 },
    BundleProfile { primaries: 22, transfer: 16, group_index: 13, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 17, group_index: 14, offset_in_group: 0, len: 2448 },
    BundleProfile { primaries: 22, transfer: 18, group_index: 15, offset_in_group: 0, len: 2448 },
];