Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/libktx/external/dfdutils/printdfd.c
9906 views
1
/* -*- tab-width: 4; -*- */
2
/* vi: set sw=2 ts=4 expandtab: */
3
4
/* Copyright 2019-2020 The Khronos Group Inc.
5
* SPDX-License-Identifier: Apache-2.0
6
*/
7
8
/**
9
* @file
10
* @~English
11
* @brief Utilities for printing data format descriptors.
12
*/
13
14
/*
15
* Author: Andrew Garrard
16
*/
17
18
#include <assert.h>
19
#include <stdbool.h>
20
#include <stdio.h>
21
#include <string.h>
22
#include <KHR/khr_df.h>
23
#include "dfd.h"
24
25
enum {
26
// These constraints are not mandated by the spec and only used as a
27
// reasonable upper limit to stop parsing garbage data during print
28
MAX_NUM_BDFD_SAMPLES = 16,
29
MAX_NUM_DFD_BLOCKS = 10,
30
};
31
32
const char* dfdToStringVendorID(khr_df_vendorid_e value) {
33
switch (value) {
34
case KHR_DF_VENDORID_KHRONOS:
35
return "KHR_DF_VENDORID_KHRONOS";
36
37
case KHR_DF_VENDORID_MAX:
38
// These enum values are not meant for string representation. Ignore
39
break;
40
}
41
return NULL;
42
}
43
44
const char* dfdToStringDescriptorType(khr_df_khr_descriptortype_e value) {
45
switch (value) {
46
case KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT:
47
return "KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT";
48
case KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_PLANES:
49
return "KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_PLANES";
50
case KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_DIMENSIONS:
51
return "KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_DIMENSIONS";
52
53
case KHR_DF_KHR_DESCRIPTORTYPE_NEEDED_FOR_WRITE_BIT:
54
case KHR_DF_KHR_DESCRIPTORTYPE_NEEDED_FOR_DECODE_BIT:
55
case KHR_DF_KHR_DESCRIPTORTYPE_MAX:
56
// These enum values are not meant for string representation. Ignore
57
break;
58
}
59
return NULL;
60
}
61
62
const char* dfdToStringVersionNumber(khr_df_versionnumber_e value) {
63
switch (value) {
64
case KHR_DF_VERSIONNUMBER_1_1:
65
// case KHR_DF_VERSIONNUMBER_1_0: // Fallthrough, Matching values
66
return "KHR_DF_VERSIONNUMBER_1_1";
67
case KHR_DF_VERSIONNUMBER_1_2:
68
return "KHR_DF_VERSIONNUMBER_1_2";
69
case KHR_DF_VERSIONNUMBER_1_3:
70
return "KHR_DF_VERSIONNUMBER_1_3";
71
72
// case KHR_DF_VERSIONNUMBER_LATEST: // Fallthrough, Matching values
73
case KHR_DF_VERSIONNUMBER_MAX:
74
// These enum values are not meant for string representation. Ignore
75
break;
76
}
77
return NULL;
78
}
79
80
const char* dfdToStringFlagsBit(uint32_t bit_index, bool bit_value) {
81
switch (bit_index) {
82
case 0:
83
return bit_value ? "KHR_DF_FLAG_ALPHA_PREMULTIPLIED" : "KHR_DF_FLAG_ALPHA_STRAIGHT";
84
default:
85
return NULL;
86
}
87
}
88
89
const char* dfdToStringTransferFunction(khr_df_transfer_e value) {
90
switch (value) {
91
case KHR_DF_TRANSFER_UNSPECIFIED:
92
return "KHR_DF_TRANSFER_UNSPECIFIED";
93
case KHR_DF_TRANSFER_LINEAR:
94
return "KHR_DF_TRANSFER_LINEAR";
95
case KHR_DF_TRANSFER_SRGB:
96
// case KHR_DF_TRANSFER_SRGB_EOTF:
97
// case KHR_DF_TRANSFER_SCRGB:
98
// case KHR_DF_TRANSFER_SCRGB_EOTF: // Fallthrough, matching values
99
return "KHR_DF_TRANSFER_SRGB";
100
case KHR_DF_TRANSFER_ITU:
101
// case KHR_DF_ITU_OETF:
102
// case KHR_DF_TRANSFER_BT601:
103
// case KHR_DF_TRANSFER_BT601_OETF:
104
// case KHR_DF_TRANSFER_BT709:
105
// case KHR_DF_TRANSFER_BT709_OETF:
106
// case KHR_DF_TRANSFER_BT2020:
107
// case KHR_DF_TRANSFER_BT2020_OETF:
108
// case KHR_DF_TRANSFER_SMTPE170M:
109
// case KHR_DF_TRANSFER_SMTPE170M_OETF:
110
// case KHR_DF_TRANSFER_SMTPE170M_EOTF:
111
// case KHR_DF_TRANSFER_SMTPE170M: // Fallthrough, matching values
112
return "KHR_DF_TRANSFER_ITU";
113
case KHR_DF_TRANSFER_NTSC:
114
// case KHR_DF_TRANSFER_NTSC_EOTF: // Fallthrough, matching values
115
return "KHR_DF_TRANSFER_NTSC";
116
case KHR_DF_TRANSFER_SLOG:
117
//case KHR_DF_TRANSFER_SLOG_OETF: // Fallthrough, matching values
118
return "KHR_DF_TRANSFER_SLOG";
119
case KHR_DF_TRANSFER_SLOG2:
120
// case KHR_DF_TRANSFER_SLOG2_OETF:
121
return "KHR_DF_TRANSFER_SLOG2";
122
case KHR_DF_TRANSFER_BT1886:
123
// case KHR_DF_TRANSFER_BT1886_EOTF: // Fallthrough, matching values
124
return "KHR_DF_TRANSFER_BT1886";
125
case KHR_DF_TRANSFER_HLG_OETF:
126
return "KHR_DF_TRANSFER_HLG_OETF";
127
case KHR_DF_TRANSFER_HLG_EOTF:
128
return "KHR_DF_TRANSFER_HLG_EOTF";
129
case KHR_DF_TRANSFER_PQ_EOTF:
130
return "KHR_DF_TRANSFER_PQ_EOTF";
131
case KHR_DF_TRANSFER_PQ_OETF:
132
return "KHR_DF_TRANSFER_PQ_OETF";
133
case KHR_DF_TRANSFER_DCIP3:
134
// case KHR_DF_TRANSFER_DCIP3_EOTF: // Fallthrough, matching values
135
return "KHR_DF_TRANSFER_DCIP3";
136
case KHR_DF_TRANSFER_PAL_OETF:
137
return "KHR_DF_TRANSFER_PAL_OETF";
138
case KHR_DF_TRANSFER_PAL625_EOTF:
139
return "KHR_DF_TRANSFER_PAL625_EOTF";
140
case KHR_DF_TRANSFER_ST240:
141
// case KHR_DF_TRANSFER_ST240_EOTF:
142
// case KHR_DF_TRANSFER_ST240_OETF: // Fallthrough, matching values
143
return "KHR_DF_TRANSFER_ST240";
144
case KHR_DF_TRANSFER_ACESCC:
145
// case KHR_DF_TRANSFER_ACESCC_OETF: // Fallthrough, matching values
146
return "KHR_DF_TRANSFER_ACESCC";
147
case KHR_DF_TRANSFER_ACESCCT:
148
// case KHR_DF_TRANSFER_ACESCCT_OETF: // Fallthrough, matching values
149
return "KHR_DF_TRANSFER_ACESCCT";
150
case KHR_DF_TRANSFER_ADOBERGB:
151
// case KHR_DF_TRANSFER_ADOBERGB_EOTF: // Fallthrough, matching values
152
return "KHR_DF_TRANSFER_ADOBERGB";
153
case KHR_DF_TRANSFER_HLG_UNNORMALIZED_OETF:
154
return "KHR_DF_TRANSFER_HLG_UNNORMALIZED_OETF";
155
156
case KHR_DF_TRANSFER_MAX:
157
// These enum values are not meant for string representation. Ignore
158
break;
159
}
160
return NULL;
161
}
162
163
const char* dfdToStringColorPrimaries(khr_df_primaries_e value) {
164
switch (value) {
165
case KHR_DF_PRIMARIES_UNSPECIFIED:
166
return "KHR_DF_PRIMARIES_UNSPECIFIED";
167
case KHR_DF_PRIMARIES_BT709:
168
// case KHR_DF_PRIMARIES_SRGB: // Fallthrough, Matching values
169
return "KHR_DF_PRIMARIES_BT709";
170
case KHR_DF_PRIMARIES_BT601_EBU:
171
return "KHR_DF_PRIMARIES_BT601_EBU";
172
case KHR_DF_PRIMARIES_BT601_SMPTE:
173
return "KHR_DF_PRIMARIES_BT601_SMPTE";
174
case KHR_DF_PRIMARIES_BT2020:
175
return "KHR_DF_PRIMARIES_BT2020";
176
case KHR_DF_PRIMARIES_CIEXYZ:
177
return "KHR_DF_PRIMARIES_CIEXYZ";
178
case KHR_DF_PRIMARIES_ACES:
179
return "KHR_DF_PRIMARIES_ACES";
180
case KHR_DF_PRIMARIES_ACESCC:
181
return "KHR_DF_PRIMARIES_ACESCC";
182
case KHR_DF_PRIMARIES_NTSC1953:
183
return "KHR_DF_PRIMARIES_NTSC1953";
184
case KHR_DF_PRIMARIES_PAL525:
185
return "KHR_DF_PRIMARIES_PAL525";
186
case KHR_DF_PRIMARIES_DISPLAYP3:
187
return "KHR_DF_PRIMARIES_DISPLAYP3";
188
case KHR_DF_PRIMARIES_ADOBERGB:
189
return "KHR_DF_PRIMARIES_ADOBERGB";
190
191
case KHR_DF_PRIMARIES_MAX:
192
// These enum values are not meant for string representation. Ignore
193
break;
194
}
195
return NULL;
196
}
197
198
const char* dfdToStringColorModel(khr_df_model_e value) {
199
switch (value) {
200
case KHR_DF_MODEL_UNSPECIFIED:
201
return "KHR_DF_MODEL_UNSPECIFIED";
202
case KHR_DF_MODEL_RGBSDA:
203
return "KHR_DF_MODEL_RGBSDA";
204
case KHR_DF_MODEL_YUVSDA:
205
return "KHR_DF_MODEL_YUVSDA";
206
case KHR_DF_MODEL_YIQSDA:
207
return "KHR_DF_MODEL_YIQSDA";
208
case KHR_DF_MODEL_LABSDA:
209
return "KHR_DF_MODEL_LABSDA";
210
case KHR_DF_MODEL_CMYKA:
211
return "KHR_DF_MODEL_CMYKA";
212
case KHR_DF_MODEL_XYZW:
213
return "KHR_DF_MODEL_XYZW";
214
case KHR_DF_MODEL_HSVA_ANG:
215
return "KHR_DF_MODEL_HSVA_ANG";
216
case KHR_DF_MODEL_HSLA_ANG:
217
return "KHR_DF_MODEL_HSLA_ANG";
218
case KHR_DF_MODEL_HSVA_HEX:
219
return "KHR_DF_MODEL_HSVA_HEX";
220
case KHR_DF_MODEL_HSLA_HEX:
221
return "KHR_DF_MODEL_HSLA_HEX";
222
case KHR_DF_MODEL_YCGCOA:
223
return "KHR_DF_MODEL_YCGCOA";
224
case KHR_DF_MODEL_YCCBCCRC:
225
return "KHR_DF_MODEL_YCCBCCRC";
226
case KHR_DF_MODEL_ICTCP:
227
return "KHR_DF_MODEL_ICTCP";
228
case KHR_DF_MODEL_CIEXYZ:
229
return "KHR_DF_MODEL_CIEXYZ";
230
case KHR_DF_MODEL_CIEXYY:
231
return "KHR_DF_MODEL_CIEXYY";
232
case KHR_DF_MODEL_BC1A:
233
// case KHR_DF_MODEL_DXT1A: // Fallthrough, Matching values
234
return "KHR_DF_MODEL_BC1A";
235
case KHR_DF_MODEL_BC2:
236
// case KHR_DF_MODEL_DXT2: // Fallthrough, Matching values
237
// case KHR_DF_MODEL_DXT3: // Fallthrough, Matching values
238
return "KHR_DF_MODEL_BC2";
239
case KHR_DF_MODEL_BC3:
240
// case KHR_DF_MODEL_DXT4: // Fallthrough, Matching values
241
// case KHR_DF_MODEL_DXT5: // Fallthrough, Matching values
242
return "KHR_DF_MODEL_BC3";
243
case KHR_DF_MODEL_BC4:
244
return "KHR_DF_MODEL_BC4";
245
case KHR_DF_MODEL_BC5:
246
return "KHR_DF_MODEL_BC5";
247
case KHR_DF_MODEL_BC6H:
248
return "KHR_DF_MODEL_BC6H";
249
case KHR_DF_MODEL_BC7:
250
return "KHR_DF_MODEL_BC7";
251
case KHR_DF_MODEL_ETC1:
252
return "KHR_DF_MODEL_ETC1";
253
case KHR_DF_MODEL_ETC2:
254
return "KHR_DF_MODEL_ETC2";
255
case KHR_DF_MODEL_ASTC:
256
return "KHR_DF_MODEL_ASTC";
257
case KHR_DF_MODEL_ETC1S:
258
return "KHR_DF_MODEL_ETC1S";
259
case KHR_DF_MODEL_PVRTC:
260
return "KHR_DF_MODEL_PVRTC";
261
case KHR_DF_MODEL_PVRTC2:
262
return "KHR_DF_MODEL_PVRTC2";
263
case KHR_DF_MODEL_UASTC:
264
return "KHR_DF_MODEL_UASTC";
265
266
case KHR_DF_MODEL_MAX:
267
// These enum values are not meant for string representation. Ignore
268
break;
269
}
270
return NULL;
271
}
272
273
const char* dfdToStringSampleDatatypeQualifiersBit(uint32_t bit_index, bool bit_value) {
274
if (!bit_value)
275
return NULL;
276
277
switch (1u << bit_index) {
278
case KHR_DF_SAMPLE_DATATYPE_LINEAR:
279
return "KHR_DF_SAMPLE_DATATYPE_LINEAR";
280
case KHR_DF_SAMPLE_DATATYPE_EXPONENT:
281
return "KHR_DF_SAMPLE_DATATYPE_EXPONENT";
282
case KHR_DF_SAMPLE_DATATYPE_SIGNED:
283
return "KHR_DF_SAMPLE_DATATYPE_SIGNED";
284
case KHR_DF_SAMPLE_DATATYPE_FLOAT:
285
return "KHR_DF_SAMPLE_DATATYPE_FLOAT";
286
}
287
return NULL;
288
}
289
290
const char* dfdToStringChannelId(khr_df_model_e model, khr_df_model_channels_e value) {
291
switch (model) {
292
case KHR_DF_MODEL_RGBSDA:
293
switch (value) {
294
case KHR_DF_CHANNEL_RGBSDA_RED:
295
return "KHR_DF_CHANNEL_RGBSDA_RED";
296
case KHR_DF_CHANNEL_RGBSDA_GREEN:
297
return "KHR_DF_CHANNEL_RGBSDA_GREEN";
298
case KHR_DF_CHANNEL_RGBSDA_BLUE:
299
return "KHR_DF_CHANNEL_RGBSDA_BLUE";
300
case KHR_DF_CHANNEL_RGBSDA_STENCIL:
301
return "KHR_DF_CHANNEL_RGBSDA_STENCIL";
302
case KHR_DF_CHANNEL_RGBSDA_DEPTH:
303
return "KHR_DF_CHANNEL_RGBSDA_DEPTH";
304
case KHR_DF_CHANNEL_RGBSDA_ALPHA:
305
return "KHR_DF_CHANNEL_RGBSDA_ALPHA";
306
default:
307
return NULL;
308
}
309
310
case KHR_DF_MODEL_YUVSDA:
311
switch (value) {
312
case KHR_DF_CHANNEL_YUVSDA_Y:
313
return "KHR_DF_CHANNEL_YUVSDA_Y";
314
case KHR_DF_CHANNEL_YUVSDA_U:
315
return "KHR_DF_CHANNEL_YUVSDA_U";
316
case KHR_DF_CHANNEL_YUVSDA_V:
317
return "KHR_DF_CHANNEL_YUVSDA_V";
318
case KHR_DF_CHANNEL_YUVSDA_STENCIL:
319
return "KHR_DF_CHANNEL_YUVSDA_STENCIL";
320
case KHR_DF_CHANNEL_YUVSDA_DEPTH:
321
return "KHR_DF_CHANNEL_YUVSDA_DEPTH";
322
case KHR_DF_CHANNEL_YUVSDA_ALPHA:
323
return "KHR_DF_CHANNEL_YUVSDA_ALPHA";
324
default:
325
return NULL;
326
}
327
328
case KHR_DF_MODEL_YIQSDA:
329
switch (value) {
330
case KHR_DF_CHANNEL_YIQSDA_Y:
331
return "KHR_DF_CHANNEL_YIQSDA_Y";
332
case KHR_DF_CHANNEL_YIQSDA_I:
333
return "KHR_DF_CHANNEL_YIQSDA_I";
334
case KHR_DF_CHANNEL_YIQSDA_Q:
335
return "KHR_DF_CHANNEL_YIQSDA_Q";
336
case KHR_DF_CHANNEL_YIQSDA_STENCIL:
337
return "KHR_DF_CHANNEL_YIQSDA_STENCIL";
338
case KHR_DF_CHANNEL_YIQSDA_DEPTH:
339
return "KHR_DF_CHANNEL_YIQSDA_DEPTH";
340
case KHR_DF_CHANNEL_YIQSDA_ALPHA:
341
return "KHR_DF_CHANNEL_YIQSDA_ALPHA";
342
default:
343
return NULL;
344
}
345
346
case KHR_DF_MODEL_LABSDA:
347
switch (value) {
348
case KHR_DF_CHANNEL_LABSDA_L:
349
return "KHR_DF_CHANNEL_LABSDA_L";
350
case KHR_DF_CHANNEL_LABSDA_A:
351
return "KHR_DF_CHANNEL_LABSDA_A";
352
case KHR_DF_CHANNEL_LABSDA_B:
353
return "KHR_DF_CHANNEL_LABSDA_B";
354
case KHR_DF_CHANNEL_LABSDA_STENCIL:
355
return "KHR_DF_CHANNEL_LABSDA_STENCIL";
356
case KHR_DF_CHANNEL_LABSDA_DEPTH:
357
return "KHR_DF_CHANNEL_LABSDA_DEPTH";
358
case KHR_DF_CHANNEL_LABSDA_ALPHA:
359
return "KHR_DF_CHANNEL_LABSDA_ALPHA";
360
default:
361
return NULL;
362
}
363
364
case KHR_DF_MODEL_CMYKA:
365
switch (value) {
366
case KHR_DF_CHANNEL_CMYKSDA_CYAN:
367
return "KHR_DF_CHANNEL_CMYKSDA_CYAN";
368
case KHR_DF_CHANNEL_CMYKSDA_MAGENTA:
369
return "KHR_DF_CHANNEL_CMYKSDA_MAGENTA";
370
case KHR_DF_CHANNEL_CMYKSDA_YELLOW:
371
return "KHR_DF_CHANNEL_CMYKSDA_YELLOW";
372
case KHR_DF_CHANNEL_CMYKSDA_BLACK:
373
return "KHR_DF_CHANNEL_CMYKSDA_BLACK";
374
case KHR_DF_CHANNEL_CMYKSDA_ALPHA:
375
return "KHR_DF_CHANNEL_CMYKSDA_ALPHA";
376
default:
377
return NULL;
378
}
379
380
case KHR_DF_MODEL_XYZW:
381
switch (value) {
382
case KHR_DF_CHANNEL_XYZW_X:
383
return "KHR_DF_CHANNEL_XYZW_X";
384
case KHR_DF_CHANNEL_XYZW_Y:
385
return "KHR_DF_CHANNEL_XYZW_Y";
386
case KHR_DF_CHANNEL_XYZW_Z:
387
return "KHR_DF_CHANNEL_XYZW_Z";
388
case KHR_DF_CHANNEL_XYZW_W:
389
return "KHR_DF_CHANNEL_XYZW_W";
390
default:
391
return NULL;
392
}
393
394
case KHR_DF_MODEL_HSVA_ANG:
395
switch (value) {
396
case KHR_DF_CHANNEL_HSVA_ANG_VALUE:
397
return "KHR_DF_CHANNEL_HSVA_ANG_VALUE";
398
case KHR_DF_CHANNEL_HSVA_ANG_SATURATION:
399
return "KHR_DF_CHANNEL_HSVA_ANG_SATURATION";
400
case KHR_DF_CHANNEL_HSVA_ANG_HUE:
401
return "KHR_DF_CHANNEL_HSVA_ANG_HUE";
402
case KHR_DF_CHANNEL_HSVA_ANG_ALPHA:
403
return "KHR_DF_CHANNEL_HSVA_ANG_ALPHA";
404
default:
405
return NULL;
406
}
407
408
case KHR_DF_MODEL_HSLA_ANG:
409
switch (value) {
410
case KHR_DF_CHANNEL_HSLA_ANG_LIGHTNESS:
411
return "KHR_DF_CHANNEL_HSLA_ANG_LIGHTNESS";
412
case KHR_DF_CHANNEL_HSLA_ANG_SATURATION:
413
return "KHR_DF_CHANNEL_HSLA_ANG_SATURATION";
414
case KHR_DF_CHANNEL_HSLA_ANG_HUE:
415
return "KHR_DF_CHANNEL_HSLA_ANG_HUE";
416
case KHR_DF_CHANNEL_HSLA_ANG_ALPHA:
417
return "KHR_DF_CHANNEL_HSLA_ANG_ALPHA";
418
default:
419
return NULL;
420
}
421
422
case KHR_DF_MODEL_HSVA_HEX:
423
switch (value) {
424
case KHR_DF_CHANNEL_HSVA_HEX_VALUE:
425
return "KHR_DF_CHANNEL_HSVA_HEX_VALUE";
426
case KHR_DF_CHANNEL_HSVA_HEX_SATURATION:
427
return "KHR_DF_CHANNEL_HSVA_HEX_SATURATION";
428
case KHR_DF_CHANNEL_HSVA_HEX_HUE:
429
return "KHR_DF_CHANNEL_HSVA_HEX_HUE";
430
case KHR_DF_CHANNEL_HSVA_HEX_ALPHA:
431
return "KHR_DF_CHANNEL_HSVA_HEX_ALPHA";
432
default:
433
return NULL;
434
}
435
436
case KHR_DF_MODEL_HSLA_HEX:
437
switch (value) {
438
case KHR_DF_CHANNEL_HSLA_HEX_LIGHTNESS:
439
return "KHR_DF_CHANNEL_HSLA_HEX_LIGHTNESS";
440
case KHR_DF_CHANNEL_HSLA_HEX_SATURATION:
441
return "KHR_DF_CHANNEL_HSLA_HEX_SATURATION";
442
case KHR_DF_CHANNEL_HSLA_HEX_HUE:
443
return "KHR_DF_CHANNEL_HSLA_HEX_HUE";
444
case KHR_DF_CHANNEL_HSLA_HEX_ALPHA:
445
return "KHR_DF_CHANNEL_HSLA_HEX_ALPHA";
446
default:
447
return NULL;
448
}
449
450
case KHR_DF_MODEL_YCGCOA:
451
switch (value) {
452
case KHR_DF_CHANNEL_YCGCOA_Y:
453
return "KHR_DF_CHANNEL_YCGCOA_Y";
454
case KHR_DF_CHANNEL_YCGCOA_CG:
455
return "KHR_DF_CHANNEL_YCGCOA_CG";
456
case KHR_DF_CHANNEL_YCGCOA_CO:
457
return "KHR_DF_CHANNEL_YCGCOA_CO";
458
case KHR_DF_CHANNEL_YCGCOA_ALPHA:
459
return "KHR_DF_CHANNEL_YCGCOA_ALPHA";
460
default:
461
return NULL;
462
}
463
464
case KHR_DF_MODEL_CIEXYZ:
465
switch (value) {
466
case KHR_DF_CHANNEL_CIEXYZ_X:
467
return "KHR_DF_CHANNEL_CIEXYZ_X";
468
case KHR_DF_CHANNEL_CIEXYZ_Y:
469
return "KHR_DF_CHANNEL_CIEXYZ_Y";
470
case KHR_DF_CHANNEL_CIEXYZ_Z:
471
return "KHR_DF_CHANNEL_CIEXYZ_Z";
472
default:
473
return NULL;
474
}
475
476
case KHR_DF_MODEL_CIEXYY:
477
switch (value) {
478
case KHR_DF_CHANNEL_CIEXYY_X:
479
return "KHR_DF_CHANNEL_CIEXYY_X";
480
case KHR_DF_CHANNEL_CIEXYY_YCHROMA:
481
return "KHR_DF_CHANNEL_CIEXYY_YCHROMA";
482
case KHR_DF_CHANNEL_CIEXYY_YLUMA:
483
return "KHR_DF_CHANNEL_CIEXYY_YLUMA";
484
default:
485
return NULL;
486
}
487
488
case KHR_DF_MODEL_BC1A:
489
switch (value) {
490
case KHR_DF_CHANNEL_BC1A_COLOR:
491
return "KHR_DF_CHANNEL_BC1A_COLOR";
492
case KHR_DF_CHANNEL_BC1A_ALPHA:
493
return "KHR_DF_CHANNEL_BC1A_ALPHA";
494
default:
495
return NULL;
496
}
497
498
case KHR_DF_MODEL_BC2:
499
switch (value) {
500
case KHR_DF_CHANNEL_BC2_COLOR:
501
return "KHR_DF_CHANNEL_BC2_COLOR";
502
case KHR_DF_CHANNEL_BC2_ALPHA:
503
return "KHR_DF_CHANNEL_BC2_ALPHA";
504
default:
505
return NULL;
506
}
507
508
case KHR_DF_MODEL_BC3:
509
switch (value) {
510
case KHR_DF_CHANNEL_BC3_COLOR:
511
return "KHR_DF_CHANNEL_BC3_COLOR";
512
case KHR_DF_CHANNEL_BC3_ALPHA:
513
return "KHR_DF_CHANNEL_BC3_ALPHA";
514
default:
515
return NULL;
516
}
517
518
case KHR_DF_MODEL_BC4:
519
switch (value) {
520
case KHR_DF_CHANNEL_BC4_DATA:
521
return "KHR_DF_CHANNEL_BC4_DATA";
522
default:
523
return NULL;
524
}
525
526
case KHR_DF_MODEL_BC5:
527
switch (value) {
528
case KHR_DF_CHANNEL_BC5_RED:
529
return "KHR_DF_CHANNEL_BC5_RED";
530
case KHR_DF_CHANNEL_BC5_GREEN:
531
return "KHR_DF_CHANNEL_BC5_GREEN";
532
default:
533
return NULL;
534
}
535
536
case KHR_DF_MODEL_BC6H:
537
switch (value) {
538
case KHR_DF_CHANNEL_BC6H_COLOR:
539
return "KHR_DF_CHANNEL_BC6H_COLOR";
540
default:
541
return NULL;
542
}
543
544
case KHR_DF_MODEL_BC7:
545
switch (value) {
546
case KHR_DF_CHANNEL_BC7_COLOR:
547
return "KHR_DF_CHANNEL_BC7_COLOR";
548
default:
549
return NULL;
550
}
551
552
case KHR_DF_MODEL_ETC1:
553
switch (value) {
554
case KHR_DF_CHANNEL_ETC1_COLOR:
555
return "KHR_DF_CHANNEL_ETC1_COLOR";
556
default:
557
return NULL;
558
}
559
560
case KHR_DF_MODEL_ETC2:
561
switch (value) {
562
case KHR_DF_CHANNEL_ETC2_RED:
563
return "KHR_DF_CHANNEL_ETC2_RED";
564
case KHR_DF_CHANNEL_ETC2_GREEN:
565
return "KHR_DF_CHANNEL_ETC2_GREEN";
566
case KHR_DF_CHANNEL_ETC2_COLOR:
567
return "KHR_DF_CHANNEL_ETC2_COLOR";
568
case KHR_DF_CHANNEL_ETC2_ALPHA:
569
return "KHR_DF_CHANNEL_ETC2_ALPHA";
570
default:
571
return NULL;
572
}
573
574
case KHR_DF_MODEL_ASTC:
575
switch (value) {
576
case KHR_DF_CHANNEL_ASTC_DATA:
577
return "KHR_DF_CHANNEL_ASTC_DATA";
578
default:
579
return NULL;
580
}
581
582
case KHR_DF_MODEL_ETC1S:
583
switch (value) {
584
case KHR_DF_CHANNEL_ETC1S_RGB:
585
return "KHR_DF_CHANNEL_ETC1S_RGB";
586
case KHR_DF_CHANNEL_ETC1S_RRR:
587
return "KHR_DF_CHANNEL_ETC1S_RRR";
588
case KHR_DF_CHANNEL_ETC1S_GGG:
589
return "KHR_DF_CHANNEL_ETC1S_GGG";
590
case KHR_DF_CHANNEL_ETC1S_AAA:
591
return "KHR_DF_CHANNEL_ETC1S_AAA";
592
default:
593
return NULL;
594
}
595
596
case KHR_DF_MODEL_PVRTC:
597
switch (value) {
598
case KHR_DF_CHANNEL_PVRTC_COLOR:
599
return "KHR_DF_CHANNEL_PVRTC_COLOR";
600
default:
601
return NULL;
602
}
603
604
case KHR_DF_MODEL_PVRTC2:
605
switch (value) {
606
case KHR_DF_CHANNEL_PVRTC2_COLOR:
607
return "KHR_DF_CHANNEL_PVRTC2_COLOR";
608
default:
609
return NULL;
610
}
611
612
case KHR_DF_MODEL_UASTC:
613
switch (value) {
614
case KHR_DF_CHANNEL_UASTC_RGB:
615
return "KHR_DF_CHANNEL_UASTC_RGB";
616
case KHR_DF_CHANNEL_UASTC_RGBA:
617
return "KHR_DF_CHANNEL_UASTC_RGBA";
618
case KHR_DF_CHANNEL_UASTC_RRR:
619
return "KHR_DF_CHANNEL_UASTC_RRR";
620
case KHR_DF_CHANNEL_UASTC_RRRG:
621
return "KHR_DF_CHANNEL_UASTC_RRRG";
622
case KHR_DF_CHANNEL_UASTC_RG:
623
return "KHR_DF_CHANNEL_UASTC_RG";
624
default:
625
return NULL;
626
}
627
628
default:
629
break;
630
}
631
632
switch (value) {
633
case KHR_DF_CHANNEL_UNSPECIFIED_0:
634
return "KHR_DF_CHANNEL_UNSPECIFIED_0";
635
case KHR_DF_CHANNEL_UNSPECIFIED_1:
636
return "KHR_DF_CHANNEL_UNSPECIFIED_1";
637
case KHR_DF_CHANNEL_UNSPECIFIED_2:
638
return "KHR_DF_CHANNEL_UNSPECIFIED_2";
639
case KHR_DF_CHANNEL_UNSPECIFIED_3:
640
return "KHR_DF_CHANNEL_UNSPECIFIED_3";
641
case KHR_DF_CHANNEL_UNSPECIFIED_4:
642
return "KHR_DF_CHANNEL_UNSPECIFIED_4";
643
case KHR_DF_CHANNEL_UNSPECIFIED_5:
644
return "KHR_DF_CHANNEL_UNSPECIFIED_5";
645
case KHR_DF_CHANNEL_UNSPECIFIED_6:
646
return "KHR_DF_CHANNEL_UNSPECIFIED_6";
647
case KHR_DF_CHANNEL_UNSPECIFIED_7:
648
return "KHR_DF_CHANNEL_UNSPECIFIED_7";
649
case KHR_DF_CHANNEL_UNSPECIFIED_8:
650
return "KHR_DF_CHANNEL_UNSPECIFIED_8";
651
case KHR_DF_CHANNEL_UNSPECIFIED_9:
652
return "KHR_DF_CHANNEL_UNSPECIFIED_9";
653
case KHR_DF_CHANNEL_UNSPECIFIED_10:
654
return "KHR_DF_CHANNEL_UNSPECIFIED_10";
655
case KHR_DF_CHANNEL_UNSPECIFIED_11:
656
return "KHR_DF_CHANNEL_UNSPECIFIED_11";
657
case KHR_DF_CHANNEL_UNSPECIFIED_12:
658
return "KHR_DF_CHANNEL_UNSPECIFIED_12";
659
case KHR_DF_CHANNEL_UNSPECIFIED_13:
660
return "KHR_DF_CHANNEL_UNSPECIFIED_13";
661
case KHR_DF_CHANNEL_UNSPECIFIED_14:
662
return "KHR_DF_CHANNEL_UNSPECIFIED_14";
663
case KHR_DF_CHANNEL_UNSPECIFIED_15:
664
return "KHR_DF_CHANNEL_UNSPECIFIED_15";
665
default:
666
break;
667
}
668
669
return NULL;
670
}
671
672
/**
673
* @internal
674
*/
675
static void printFlagBits(uint32_t flags, const char*(*toStringFn)(uint32_t, bool)) {
676
bool first = true;
677
for (uint32_t bit_index = 0; bit_index < 32; ++bit_index) {
678
uint32_t bit_mask = 1u << bit_index;
679
bool bit_value = (bit_mask & (uint32_t) flags) != 0;
680
681
const char* comma = first ? "" : ", ";
682
const char* str = toStringFn(bit_index, bit_value);
683
if (str) {
684
printf("%s%s", comma, str);
685
first = false;
686
} else if (bit_value) {
687
printf("%s%u", comma, bit_mask);
688
first = false;
689
}
690
}
691
}
692
693
/**
694
* @internal
695
*/
696
static void printFlagBitsJSON(uint32_t indent, const char* nl, uint32_t flags, const char*(*toStringFn)(uint32_t, bool)) {
697
bool first = true;
698
for (uint32_t bit_index = 0; bit_index < 32; ++bit_index) {
699
uint32_t bit_mask = 1u << bit_index;
700
bool bit_value = (bit_mask & (uint32_t) flags) != 0;
701
702
const char* str = toStringFn(bit_index, bit_value);
703
if (str) {
704
printf("%s%s%*s\"%s\"", first ? "" : ",", first ? "" : nl, indent, "", str);
705
first = false;
706
} else if (bit_value) {
707
printf("%s%s%*s%u", first ? "" : ",", first ? "" : nl, indent, "", bit_mask);
708
first = false;
709
}
710
}
711
if (!first)
712
printf("%s", nl);
713
}
714
715
/**
716
* @~English
717
* @brief Print a human-readable interpretation of a data format descriptor.
718
*
719
* @param DFD Pointer to a data format descriptor.
720
* @param dataSize The maximum size that can be considered as part of the DFD.
721
**/
722
void printDFD(uint32_t *DFD, uint32_t dataSize)
723
{
724
#define PRINT_ENUM(VALUE, TO_STRING_FN) { \
725
int value = VALUE; \
726
const char* str = TO_STRING_FN(value); \
727
if (str) \
728
printf("%s", str); \
729
else \
730
printf("%u", value); \
731
}
732
733
const uint32_t sizeof_dfdTotalSize = sizeof(uint32_t);
734
const uint32_t sizeof_DFDBHeader = sizeof(uint32_t) * 2;
735
const uint32_t sizeof_BDFD = sizeof(uint32_t) * KHR_DF_WORD_SAMPLESTART;
736
const uint32_t sizeof_BDFDSample = sizeof(uint32_t) * KHR_DF_WORD_SAMPLEWORDS;
737
738
uint32_t dfdTotalSize = dataSize >= sizeof_dfdTotalSize ? DFD[0] : 0;
739
uint32_t remainingSize = dfdTotalSize < dataSize ? dfdTotalSize : dataSize;
740
if (remainingSize < sizeof_dfdTotalSize)
741
return; // Invalid DFD: dfdTotalSize must be present
742
743
uint32_t* block = DFD + 1;
744
remainingSize -= sizeof_dfdTotalSize;
745
746
printf("DFD total bytes: %u\n", dfdTotalSize);
747
748
for (int i = 0; i < MAX_NUM_DFD_BLOCKS; ++i) { // At most only iterate MAX_NUM_DFD_BLOCKS block
749
if (remainingSize < sizeof_DFDBHeader)
750
break; // Invalid DFD: Missing or partial block header
751
752
const khr_df_vendorid_e vendorID = KHR_DFDVAL(block, VENDORID);
753
const khr_df_khr_descriptortype_e descriptorType = KHR_DFDVAL(block, DESCRIPTORTYPE);
754
const khr_df_versionnumber_e versionNumber = KHR_DFDVAL(block, VERSIONNUMBER);
755
const uint32_t blockSize = KHR_DFDVAL(block, DESCRIPTORBLOCKSIZE);
756
757
printf("Vendor ID: ");
758
PRINT_ENUM(vendorID, dfdToStringVendorID);
759
printf("\nDescriptor type: ");
760
PRINT_ENUM(descriptorType, dfdToStringDescriptorType);
761
printf("\nVersion: ");
762
PRINT_ENUM(versionNumber, dfdToStringVersionNumber);
763
printf("\nDescriptor block size: %u", blockSize);
764
printf("\n");
765
766
if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {
767
if (remainingSize < sizeof_BDFD)
768
break; // Invalid DFD: Missing or partial basic DFD block
769
770
const int model = KHR_DFDVAL(block, MODEL);
771
772
khr_df_flags_e flags = KHR_DFDVAL(block, FLAGS);
773
printf("Flags: 0x%X (", flags);
774
printFlagBits(flags, dfdToStringFlagsBit);
775
printf(")\nTransfer: ");
776
PRINT_ENUM(KHR_DFDVAL(block, TRANSFER), dfdToStringTransferFunction);
777
printf("\nPrimaries: ");
778
PRINT_ENUM(KHR_DFDVAL(block, PRIMARIES), dfdToStringColorPrimaries);
779
printf("\nModel: ");
780
PRINT_ENUM(model, dfdToStringColorModel);
781
printf("\n");
782
783
printf("Dimensions: %u, %u, %u, %u\n",
784
KHR_DFDVAL(block, TEXELBLOCKDIMENSION0) + 1,
785
KHR_DFDVAL(block, TEXELBLOCKDIMENSION1) + 1,
786
KHR_DFDVAL(block, TEXELBLOCKDIMENSION2) + 1,
787
KHR_DFDVAL(block, TEXELBLOCKDIMENSION3) + 1);
788
printf("Plane bytes: %u, %u, %u, %u, %u, %u, %u, %u\n",
789
KHR_DFDVAL(block, BYTESPLANE0),
790
KHR_DFDVAL(block, BYTESPLANE1),
791
KHR_DFDVAL(block, BYTESPLANE2),
792
KHR_DFDVAL(block, BYTESPLANE3),
793
KHR_DFDVAL(block, BYTESPLANE4),
794
KHR_DFDVAL(block, BYTESPLANE5),
795
KHR_DFDVAL(block, BYTESPLANE6),
796
KHR_DFDVAL(block, BYTESPLANE7));
797
798
int samples = (blockSize - sizeof_BDFD) / sizeof_BDFDSample;
799
if (samples > MAX_NUM_BDFD_SAMPLES)
800
samples = MAX_NUM_BDFD_SAMPLES; // Too many BDFD samples
801
for (int sample = 0; sample < samples; ++sample) {
802
if (remainingSize < sizeof_BDFD + (sample + 1) * sizeof_BDFDSample)
803
break; // Invalid DFD: Missing or partial basic DFD sample
804
805
khr_df_model_channels_e channelType = KHR_DFDSVAL(block, sample, CHANNELID);
806
printf("Sample %u:\n", sample);
807
808
khr_df_sample_datatype_qualifiers_e qualifiers = KHR_DFDSVAL(block, sample, QUALIFIERS);
809
printf(" Qualifiers: 0x%X (", qualifiers);
810
printFlagBits(qualifiers, dfdToStringSampleDatatypeQualifiersBit);
811
printf(")\n");
812
printf(" Channel Type: 0x%X", channelType);
813
{
814
const char* str = dfdToStringChannelId(model, channelType);
815
if (str)
816
printf(" (%s)\n", str);
817
else
818
printf(" (%u)\n", channelType);
819
}
820
printf(" Length: %u bits Offset: %u\n",
821
KHR_DFDSVAL(block, sample, BITLENGTH) + 1,
822
KHR_DFDSVAL(block, sample, BITOFFSET));
823
printf(" Position: %u, %u, %u, %u\n",
824
KHR_DFDSVAL(block, sample, SAMPLEPOSITION0),
825
KHR_DFDSVAL(block, sample, SAMPLEPOSITION1),
826
KHR_DFDSVAL(block, sample, SAMPLEPOSITION2),
827
KHR_DFDSVAL(block, sample, SAMPLEPOSITION3));
828
printf(" Lower: 0x%08x\n Upper: 0x%08x\n",
829
KHR_DFDSVAL(block, sample, SAMPLELOWER),
830
KHR_DFDSVAL(block, sample, SAMPLEUPPER));
831
}
832
} else if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_DIMENSIONS) {
833
// TODO: Implement DFD print for ADDITIONAL_DIMENSIONS
834
} else if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_PLANES) {
835
// TODO: Implement DFD print for ADDITIONAL_PLANES
836
} else {
837
printf("Unknown block\n");
838
}
839
840
const uint32_t advance = sizeof_DFDBHeader > blockSize ? sizeof_DFDBHeader : blockSize;
841
if (advance > remainingSize)
842
break;
843
remainingSize -= advance;
844
block += advance / 4;
845
}
846
#undef PRINT_ENUM
847
}
848
849
/**
850
* @~English
851
* @brief Print a JSON interpretation of a data format descriptor.
852
*
853
* @param DFD Pointer to a data format descriptor.
854
* @param dataSize The maximum size that can be considered as part of the DFD.
855
* @param base_indent The number of indentations to include at the front of every line
856
* @param indent_width The number of spaces to add with each nested scope
857
* @param minified Specifies whether the JSON output should be minified
858
**/
859
void printDFDJSON(uint32_t* DFD, uint32_t dataSize, uint32_t base_indent, uint32_t indent_width, bool minified)
860
{
861
if (minified) {
862
base_indent = 0;
863
indent_width = 0;
864
}
865
const char* space = minified ? "" : " ";
866
const char* nl = minified ? "" : "\n";
867
868
#define LENGTH_OF_INDENT(INDENT) ((base_indent + INDENT) * indent_width)
869
870
/** Prints an enum as string or number */
871
#define PRINT_ENUM(INDENT, NAME, VALUE, TO_STRING_FN, COMMA) { \
872
int value = VALUE; \
873
printf("%*s\"" NAME "\":%s", LENGTH_OF_INDENT(INDENT), "", space); \
874
const char* str = TO_STRING_FN(value); \
875
if (str) \
876
printf("\"%s\"", str); \
877
else \
878
printf("%u", value); \
879
printf(COMMA "%s", nl); \
880
}
881
882
/** Prints an enum as string or number if the to string function fails with a trailing comma*/
883
#define PRINT_ENUM_C(INDENT, NAME, VALUE, TO_STRING_FN) \
884
PRINT_ENUM(INDENT, NAME, VALUE, TO_STRING_FN, ",")
885
886
/** Prints an enum as string or number if the to string function fails without a trailing comma*/
887
#define PRINT_ENUM_E(INDENT, NAME, VALUE, TO_STRING_FN) \
888
PRINT_ENUM(INDENT, NAME, VALUE, TO_STRING_FN, "")
889
890
#define PRINT_INDENT(INDENT, FMT, ...) { \
891
printf("%*s" FMT, LENGTH_OF_INDENT(INDENT), "", __VA_ARGS__); \
892
}
893
894
#define PRINT_INDENT_NOARG(INDENT, FMT) { \
895
printf("%*s" FMT, LENGTH_OF_INDENT(INDENT), ""); \
896
}
897
898
const uint32_t sizeof_dfdTotalSize = sizeof(uint32_t);
899
const uint32_t sizeof_DFDBHeader = sizeof(uint32_t) * 2;
900
const uint32_t sizeof_BDFD = sizeof(uint32_t) * KHR_DF_WORD_SAMPLESTART;
901
const uint32_t sizeof_BDFDSample = sizeof(uint32_t) * KHR_DF_WORD_SAMPLEWORDS;
902
903
uint32_t dfdTotalSize = dataSize >= sizeof_dfdTotalSize ? DFD[0] : 0;
904
PRINT_INDENT(0, "\"totalSize\":%s%u,%s", space, dfdTotalSize, nl)
905
906
uint32_t remainingSize = dfdTotalSize < dataSize ? dfdTotalSize : dataSize;
907
if (remainingSize < sizeof_dfdTotalSize) {
908
PRINT_INDENT(0, "\"blocks\":%s[]%s", space, nl) // Print empty blocks to confirm to the json scheme
909
return; // Invalid DFD: dfdTotalSize must be present
910
}
911
912
uint32_t* block = DFD + 1;
913
remainingSize -= sizeof_dfdTotalSize;
914
PRINT_INDENT(0, "\"blocks\":%s[", space)
915
916
for (int i = 0; i < MAX_NUM_DFD_BLOCKS; ++i) { // At most only iterate MAX_NUM_DFD_BLOCKS block
917
if (remainingSize < sizeof_DFDBHeader)
918
break; // Invalid DFD: Missing or partial block header
919
920
const khr_df_vendorid_e vendorID = KHR_DFDVAL(block, VENDORID);
921
const khr_df_khr_descriptortype_e descriptorType = KHR_DFDVAL(block, DESCRIPTORTYPE);
922
const khr_df_versionnumber_e versionNumber = KHR_DFDVAL(block, VERSIONNUMBER);
923
const uint32_t blockSize = KHR_DFDVAL(block, DESCRIPTORBLOCKSIZE);
924
925
const int model = KHR_DFDVAL(block, MODEL);
926
927
if (i == 0) {
928
printf("%s", nl);
929
} else {
930
printf(",%s", nl);
931
}
932
PRINT_INDENT(1, "{%s", nl)
933
PRINT_ENUM_C(2, "vendorId", vendorID, dfdToStringVendorID);
934
PRINT_ENUM_C(2, "descriptorType", descriptorType, dfdToStringDescriptorType);
935
PRINT_ENUM_C(2, "versionNumber", versionNumber, dfdToStringVersionNumber);
936
PRINT_INDENT(2, "\"descriptorBlockSize\":%s%u", space, blockSize)
937
938
if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_BASICFORMAT) {
939
if (remainingSize < sizeof_BDFD) {
940
// Invalid DFD: Missing or partial basic DFD block
941
printf("%s", nl);
942
PRINT_INDENT(1, "}%s", nl) // End of block
943
break;
944
}
945
946
printf(",%s", nl);
947
PRINT_INDENT(2, "\"flags\":%s[%s", space, nl)
948
khr_df_flags_e flags = KHR_DFDVAL(block, FLAGS);
949
printFlagBitsJSON(LENGTH_OF_INDENT(3), nl, flags, dfdToStringFlagsBit);
950
PRINT_INDENT(2, "],%s", nl)
951
952
PRINT_ENUM_C(2, "transferFunction", KHR_DFDVAL(block, TRANSFER), dfdToStringTransferFunction);
953
PRINT_ENUM_C(2, "colorPrimaries", KHR_DFDVAL(block, PRIMARIES), dfdToStringColorPrimaries);
954
PRINT_ENUM_C(2, "colorModel", model, dfdToStringColorModel);
955
PRINT_INDENT(2, "\"texelBlockDimension\":%s[%u,%s%u,%s%u,%s%u],%s", space,
956
KHR_DFDVAL(block, TEXELBLOCKDIMENSION0) + 1, space,
957
KHR_DFDVAL(block, TEXELBLOCKDIMENSION1) + 1, space,
958
KHR_DFDVAL(block, TEXELBLOCKDIMENSION2) + 1, space,
959
KHR_DFDVAL(block, TEXELBLOCKDIMENSION3) + 1, nl)
960
PRINT_INDENT(2, "\"bytesPlane\":%s[%u,%s%u,%s%u,%s%u,%s%u,%s%u,%s%u,%s%u],%s", space,
961
KHR_DFDVAL(block, BYTESPLANE0), space,
962
KHR_DFDVAL(block, BYTESPLANE1), space,
963
KHR_DFDVAL(block, BYTESPLANE2), space,
964
KHR_DFDVAL(block, BYTESPLANE3), space,
965
KHR_DFDVAL(block, BYTESPLANE4), space,
966
KHR_DFDVAL(block, BYTESPLANE5), space,
967
KHR_DFDVAL(block, BYTESPLANE6), space,
968
KHR_DFDVAL(block, BYTESPLANE7), nl)
969
970
PRINT_INDENT(2, "\"samples\":%s[%s", space, nl)
971
int samples = (blockSize - sizeof_BDFD) / sizeof_BDFDSample;
972
if (samples > MAX_NUM_BDFD_SAMPLES)
973
samples = MAX_NUM_BDFD_SAMPLES;
974
for (int sample = 0; sample < samples; ++sample) {
975
if (remainingSize < sizeof_BDFD + (sample + 1) * sizeof_BDFDSample)
976
break; // Invalid DFD: Missing or partial basic DFD sample
977
978
if (sample != 0)
979
printf(",%s", nl);
980
PRINT_INDENT(3, "{%s", nl)
981
982
khr_df_sample_datatype_qualifiers_e qualifiers = KHR_DFDSVAL(block, sample, QUALIFIERS);
983
if (qualifiers == 0) {
984
PRINT_INDENT(4, "\"qualifiers\":%s[],%s", space, nl)
985
986
} else {
987
PRINT_INDENT(4, "\"qualifiers\":%s[%s", space, nl)
988
printFlagBitsJSON(LENGTH_OF_INDENT(5), nl, qualifiers, dfdToStringSampleDatatypeQualifiersBit);
989
PRINT_INDENT(4, "],%s", nl)
990
}
991
992
khr_df_model_channels_e channelType = KHR_DFDSVAL(block, sample, CHANNELID);
993
const char* channelStr = dfdToStringChannelId(model, channelType);
994
if (channelStr)
995
PRINT_INDENT(4, "\"channelType\":%s\"%s\",%s", space, channelStr, nl)
996
else
997
PRINT_INDENT(4, "\"channelType\":%s%u,%s", space, channelType, nl)
998
999
PRINT_INDENT(4, "\"bitLength\":%s%u,%s", space, KHR_DFDSVAL(block, sample, BITLENGTH), nl)
1000
PRINT_INDENT(4, "\"bitOffset\":%s%u,%s", space, KHR_DFDSVAL(block, sample, BITOFFSET), nl)
1001
PRINT_INDENT(4, "\"samplePosition\":%s[%u,%s%u,%s%u,%s%u],%s", space,
1002
KHR_DFDSVAL(block, sample, SAMPLEPOSITION0), space,
1003
KHR_DFDSVAL(block, sample, SAMPLEPOSITION1), space,
1004
KHR_DFDSVAL(block, sample, SAMPLEPOSITION2), space,
1005
KHR_DFDSVAL(block, sample, SAMPLEPOSITION3), nl)
1006
1007
if (qualifiers & KHR_DF_SAMPLE_DATATYPE_SIGNED) {
1008
PRINT_INDENT(4, "\"sampleLower\":%s%d,%s", space, KHR_DFDSVAL(block, sample, SAMPLELOWER), nl)
1009
PRINT_INDENT(4, "\"sampleUpper\":%s%d%s", space, KHR_DFDSVAL(block, sample, SAMPLEUPPER), nl)
1010
} else {
1011
PRINT_INDENT(4, "\"sampleLower\":%s%u,%s", space, (unsigned int) KHR_DFDSVAL(block, sample, SAMPLELOWER), nl)
1012
PRINT_INDENT(4, "\"sampleUpper\":%s%u%s", space, (unsigned int) KHR_DFDSVAL(block, sample, SAMPLEUPPER), nl)
1013
}
1014
1015
PRINT_INDENT_NOARG(3, "}")
1016
}
1017
printf("%s", nl);
1018
PRINT_INDENT(2, "]%s", nl) // End of samples
1019
} else if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_DIMENSIONS) {
1020
printf("%s", nl);
1021
// printf(",%s", nl); // If there is extra member printed
1022
// TODO: Implement DFD print for ADDITIONAL_DIMENSIONS
1023
} else if (vendorID == KHR_DF_VENDORID_KHRONOS && descriptorType == KHR_DF_KHR_DESCRIPTORTYPE_ADDITIONAL_PLANES) {
1024
printf("%s", nl);
1025
// printf(",%s", nl); // If there is extra member printed
1026
// TODO: Implement DFD print for ADDITIONAL_PLANES
1027
} else {
1028
printf("%s", nl);
1029
// printf(",%s", nl); // If there is extra member printed
1030
// TODO: What to do with unknown blocks for json?
1031
// Unknown block data in binary?
1032
}
1033
1034
PRINT_INDENT_NOARG(1, "}") // End of block
1035
1036
const uint32_t advance = sizeof_DFDBHeader > blockSize ? sizeof_DFDBHeader : blockSize;
1037
if (advance > remainingSize)
1038
break;
1039
remainingSize -= advance;
1040
block += advance / 4;
1041
}
1042
printf("%s", nl);
1043
PRINT_INDENT(0, "]%s", nl) // End of blocks
1044
1045
#undef PRINT_ENUM
1046
#undef PRINT_ENUM_C
1047
#undef PRINT_ENUM_E
1048
#undef PRINT_INDENT
1049
#undef PRINT_INDENT_NOARG
1050
}
1051
1052