Skip to content

Commit cc9831f

Browse files
authored
Merge pull request #122 from hoene/issue-55-sadie-files-do-not-open
Issue 55 sadie files do not open
2 parents 65cedbf + b95a031 commit cc9831f

23 files changed

Lines changed: 486 additions & 126 deletions

CMakeLists.txt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,20 @@ if(BUILD_TESTS)
4747

4848
enable_testing()
4949

50+
add_test(D1_48K_24bit_0.3s_FIR_SOFA src/mysofa2json
51+
../tests/D1_48K_24bit_0.3s_FIR_SOFA.sofa)
52+
add_test(H20_44K_16bit_256tap_FIR_SOFA ../tests/compareIgnoreNew.sh
53+
../tests/H20_44K_16bit_256tap_FIR_SOFA)
54+
add_test(MIT_KEMAR_large_pinna ../tests/compare.sh
55+
../tests/MIT_KEMAR_large_pinna)
56+
add_test(MIT_KEMAR_normal_pinna ../tests/compareIgnoreNew.sh
57+
../tests/MIT_KEMAR_normal_pinna)
58+
add_test(MIT_KEMAR_normal_pinna.old ../tests/compare.sh
59+
../tests/MIT_KEMAR_normal_pinna.old)
5060
add_test(dtf_nh2 ../tests/compareIgnoreNew.sh
5161
../tests/dtf_nh2)
5262
add_test(hrtf_c_nh898 ../tests/compareIgnoreNew.sh
5363
../tests/hrtf_c_nh898)
54-
5564
foreach(
5665
ISSUE
5766
72
@@ -71,8 +80,6 @@ if(BUILD_TESTS)
7180
add_test(FHK_HRIR_L2354 ../tests/compare.sh ../tests/FHK_HRIR_L2354)
7281
add_test(LISTEN_1002_IRC_1002_C_HRIR ../tests/compare.sh
7382
../tests/LISTEN_1002_IRC_1002_C_HRIR)
74-
add_test(MIT_KEMAR_large_pinna ../tests/compare.sh
75-
../tests/MIT_KEMAR_large_pinna)
7683
add_test(Pulse ../tests/compare.sh ../tests/Pulse)
7784
add_test(Tester ../tests/compare.sh ../tests/tester)
7885
add_test(TU-Berlin_QU_KEMAR_anechoic_radius_0.5_1_2_3_m ../tests/compare.sh

share/MIT_KEMAR_normal_pinna.sofa

-36.6 KB
Binary file not shown.

src/hdf/dataobject.c

Lines changed: 111 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,7 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
477477
}
478478

479479
layout_class = (uint8_t)fgetc(reader->fhd);
480+
mylog("data layout %d\n", layout_class);
480481

481482
switch (layout_class) {
482483
#if 0
@@ -513,10 +514,14 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
513514

514515
case 2:
515516
dimensionality = (uint8_t)fgetc(reader->fhd);
516-
if (dimensionality < 1 ||
517-
dimensionality >
518-
sizeof(data->datalayout_chunk) / sizeof(data->datalayout_chunk)[0])
517+
mylog("dimensionality %d\n", dimensionality);
518+
519+
if (dimensionality < 1 || dimensionality > DATAOBJECT_MAX_DIMENSIONALITY) {
520+
mylog("data layout 2: invalid dimensionality %d %lu %lu\n",
521+
dimensionality, sizeof(data->datalayout_chunk),
522+
sizeof(data->datalayout_chunk[0]));
519523
return MYSOFA_INVALID_FORMAT; // LCOV_EXCL_LINE
524+
}
520525
data_address = readValue(reader, reader->superblock.size_of_offsets);
521526
mylog(" CHUNK %" PRIX64 "\n", data_address);
522527
for (i = 0; i < dimensionality; i++) {
@@ -529,7 +534,7 @@ static int readOHDRHeaderMessageDataLayout(struct READER *reader,
529534
for (i = 0; i < data->ds.dimensionality; i++)
530535
size *= data->ds.dimension_size[i];
531536

532-
if (validAddress(reader, data_address)) {
537+
if (validAddress(reader, data_address) && dimensionality <= 4) {
533538
store = ftell(reader->fhd);
534539
if (fseek(reader->fhd, data_address, SEEK_SET) < 0)
535540
return errno; // LCOV_EXCL_LINE
@@ -599,9 +604,67 @@ static int readOHDRHeaderMessageGroupInfo(struct READER *reader,
599604
*
600605
*/
601606

602-
static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
607+
/* type 1
608+
609+
00 |......G.8.......|
610+
000010a0 00 00 00 00 00 02 00 08 00 01 00 01 00 73 68 75 |.............shu|
611+
000010b0 66 66 6c 65 00 08 00 00 00 00 00 00 00 01 00 08 |ffle............|
612+
000010c0 00 01 00 01 00 64 65 66 6c 61 74 65 00 01 00 00 |.....deflate....|
613+
000010d0 00 00 00 00 00 08 17 00 01 00 00 03 02 03 01 48 |...............H|
614+
*/
615+
static int readOHDRHeaderMessageFilterPipelineV1(struct READER *reader,
616+
uint8_t filters) {
617+
int i, j;
618+
uint16_t filter_identification_value, flags, number_client_data_values,
619+
namelength;
620+
uint32_t client_data;
621+
622+
if (readValue(reader, 6) != 0) {
623+
mylog("reserved values not zero\n");
624+
return MYSOFA_INVALID_FORMAT;
625+
}
626+
627+
for (i = 0; i < filters; i++) {
628+
filter_identification_value = (uint16_t)readValue(reader, 2);
629+
switch (filter_identification_value) {
630+
case 1:
631+
case 2:
632+
break;
633+
default:
634+
// LCOV_EXCL_START
635+
mylog("object OHDR filter pipeline message contains unsupported filter: "
636+
"%d %lX\n",
637+
filter_identification_value, ftell(reader->fhd) - 2);
638+
return MYSOFA_INVALID_FORMAT;
639+
// LCOV_EXCL_STOP
640+
}
641+
namelength = (uint16_t)readValue(reader, 2);
642+
flags = (uint16_t)readValue(reader, 2);
643+
number_client_data_values = (uint16_t)readValue(reader, 2);
644+
645+
if (namelength > 0)
646+
fseek(reader->fhd, ((namelength - 1) & ~7) + 8, SEEK_CUR); // skip name
647+
648+
mylog(" filter %d namelen %d flags %04X values %d\n",
649+
filter_identification_value, namelength, flags,
650+
number_client_data_values);
651+
652+
if (number_client_data_values > 0x1000)
653+
return MYSOFA_UNSUPPORTED_FORMAT; // LCOV_EXCL_LINE
654+
/* no name here */
655+
for (j = 0; j < number_client_data_values; j++) {
656+
client_data = readValue(reader, 4);
657+
}
658+
if ((number_client_data_values & 1) == 1)
659+
readValue(reader, 4);
660+
}
661+
662+
return MYSOFA_OK;
663+
}
664+
665+
static int readOHDRHeaderMessageFilterPipelineV2(struct READER *reader,
666+
uint8_t filters) {
603667
int i, j;
604-
uint8_t filters;
605668
uint16_t filter_identification_value, flags, number_client_data_values;
606669
uint32_t client_data;
607670
uint64_t maximum_compact_value, minimum_dense_value, number_of_entries,
@@ -614,22 +677,6 @@ static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
614677
UNUSED(number_of_entries);
615678
UNUSED(length_of_entries);
616679

617-
if (fgetc(reader->fhd) != 2) {
618-
// LCOV_EXCL_START
619-
mylog("object OHDR filter pipeline message must have version 2\n");
620-
return MYSOFA_INVALID_FORMAT;
621-
// LCOV_EXCL_STOP
622-
}
623-
624-
filters = (uint8_t)fgetc(reader->fhd);
625-
if (filters > 32) {
626-
// LCOV_EXCL_START
627-
mylog("object OHDR filter pipeline message has too many filters: %d\n",
628-
filters);
629-
return MYSOFA_INVALID_FORMAT;
630-
// LCOV_EXCL_STOP
631-
}
632-
633680
for (i = 0; i < filters; i++) {
634681
filter_identification_value = (uint16_t)readValue(reader, 2);
635682
switch (filter_identification_value) {
@@ -658,6 +705,35 @@ static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
658705
return MYSOFA_OK;
659706
}
660707

708+
static int readOHDRHeaderMessageFilterPipeline(struct READER *reader) {
709+
uint8_t filterversion, filters;
710+
711+
filterversion = fgetc(reader->fhd);
712+
713+
filters = (uint8_t)fgetc(reader->fhd);
714+
if (filters > 32) {
715+
// LCOV_EXCL_START
716+
mylog("object OHDR filter pipeline message has too many filters: %d\n",
717+
filters);
718+
return MYSOFA_INVALID_FORMAT;
719+
// LCOV_EXCL_STOP
720+
}
721+
722+
switch (filterversion) {
723+
case 1:
724+
return readOHDRHeaderMessageFilterPipelineV1(reader, filters);
725+
case 2:
726+
return readOHDRHeaderMessageFilterPipelineV2(reader, filters);
727+
default:
728+
// LCOV_EXCL_START
729+
mylog(
730+
"object OHDR filter pipeline message must have version 1 or 2 not %d\n",
731+
filterversion);
732+
return MYSOFA_INVALID_FORMAT;
733+
// LCOV_EXCL_STOP
734+
}
735+
}
736+
661737
int readDataVar(struct READER *reader, struct DATAOBJECT *data,
662738
struct DATATYPE *dt, struct DATASPACE *ds) {
663739

@@ -796,7 +872,7 @@ static int readOHDRHeaderMessageContinue(struct READER *reader,
796872
return MYSOFA_UNSUPPORTED_FORMAT; // LCOV_EXCL_LINE
797873

798874
mylog(" continue %08" PRIX64 " %08" PRIX64 "\n", offset, length);
799-
if (reader->recursive_counter >= 20) {
875+
if (reader->recursive_counter >= 25) {
800876
mylog("recursive problem");
801877
return MYSOFA_UNSUPPORTED_FORMAT; // LCOV_EXCL_LINE
802878
} else
@@ -1134,12 +1210,12 @@ int dataobjectRead(struct READER *reader, struct DATAOBJECT *dataobject,
11341210
return err;
11351211
}
11361212

1137-
/* not needed
1138-
if (validAddress(reader, dataobject->ai.attribute_name_btree)) {
1139-
fseek(reader->fhd, dataobject->ai.attribute_name_btree, SEEK_SET);
1140-
btreeRead(reader, &dataobject->attributes);
1141-
}
1142-
*/
1213+
if (validAddress(reader, dataobject->ai.attribute_name_btree)) {
1214+
/* not needed
1215+
fseek(reader->fhd, dataobject->ai.attribute_name_btree, SEEK_SET);
1216+
btreeRead(reader, &dataobject->attributes);
1217+
*/
1218+
}
11431219

11441220
/* parse message attribute info */
11451221
if (validAddress(reader, dataobject->ai.fractal_heap_address)) {
@@ -1158,12 +1234,12 @@ int dataobjectRead(struct READER *reader, struct DATAOBJECT *dataobject,
11581234
return err;
11591235
}
11601236

1161-
/* not needed
1162-
if (validAddress(reader, dataobject->li.address_btree_index)) {
1163-
fseek(reader->fhd, dataobject->li.address_btree_index, SEEK_SET);
1164-
btreeRead(reader, &dataobject->objects);
1165-
}
1166-
*/
1237+
if (validAddress(reader, dataobject->li.address_btree_index)) {
1238+
/* not needed
1239+
fseek(reader->fhd, dataobject->li.address_btree_index, SEEK_SET);
1240+
btreeRead(reader, &dataobject->objects);
1241+
*/
1242+
}
11671243

11681244
dataobject->all = reader->all;
11691245
reader->all = dataobject;

0 commit comments

Comments
 (0)