From a6782e6912be62ad1ecc6ecf99c94a0e34026758 Mon Sep 17 00:00:00 2001 From: Gregory Heskett Date: Tue, 2 Jul 2024 23:53:14 -0400 Subject: [PATCH] Fix seg faulting issue with MinGW build system, most likely caused by use of execl (#812) --- Makefile | 2 +- tools/Makefile | 5 +- tools/aiff_extract_codebook.c | 34 ++++++++-- tools/sdk-tools/tabledesign/print.c | 8 +++ tools/sdk-tools/tabledesign/tabledesign.c | 79 ++++++++++++++++++----- tools/sdk-tools/tabledesign/tabledesign.h | 4 ++ 6 files changed, 108 insertions(+), 24 deletions(-) diff --git a/Makefile b/Makefile index 930ee71f..1bbfce2d 100644 --- a/Makefile +++ b/Makefile @@ -780,7 +780,7 @@ endif $(BUILD_DIR)/%.table: %.aiff $(call print,Extracting codebook:,$<,$@) - $(V)$(AIFF_EXTRACT_CODEBOOK) $< >$@ + $(V)$(AIFF_EXTRACT_CODEBOOK) $< $@ $(BUILD_DIR)/%.aifc: $(BUILD_DIR)/%.table %.aiff $(call print,Encoding ADPCM:,$(word 2,$^),$@) diff --git a/tools/Makefile b/tools/Makefile index 764b0c8a..0f57861f 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -49,7 +49,10 @@ textconv_SOURCES := textconv.c utf8.c hashtable.c aifc_decode_SOURCES := aifc_decode.c -aiff_extract_codebook_SOURCES := aiff_extract_codebook.c +aiff_extract_codebook: $(LIBAUDIOFILE) +aiff_extract_codebook_SOURCES := aiff_extract_codebook.c sdk-tools/tabledesign/codebook.c sdk-tools/tabledesign/estimate.c sdk-tools/tabledesign/print.c sdk-tools/tabledesign/tabledesign.c +aiff_extract_codebook_CFLAGS := -DEXTRACT_CODEBOOK -Iaudiofile -Wno-uninitialized +aiff_extract_codebook_LDFLAGS := -Laudiofile -laudiofile -lstdc++ tabledesign$(EXT): $(LIBAUDIOFILE) tabledesign_SOURCES := sdk-tools/tabledesign/codebook.c sdk-tools/tabledesign/estimate.c sdk-tools/tabledesign/print.c sdk-tools/tabledesign/tabledesign.c diff --git a/tools/aiff_extract_codebook.c b/tools/aiff_extract_codebook.c index c229139a..c0188c34 100644 --- a/tools/aiff_extract_codebook.c +++ b/tools/aiff_extract_codebook.c @@ -9,6 +9,8 @@ #include #include +#include "sdk-tools/tabledesign/tabledesign.h" + typedef short s16; typedef int s32; typedef unsigned char u8; @@ -28,8 +30,9 @@ typedef struct s16 state[16]; } ALADPCMloop; -static const char usage[] = "input.aiff"; -static const char *progname, *infilename; +static const char usage[] = "input.aiff, output.table"; +static const char *progname; +static char *infilename, *outfilename; #define checked_fread(a, b, c, d) if (fread(a, b, c, d) != c) fail_parse("error parsing file") @@ -115,12 +118,13 @@ int main(int argc, char **argv) FILE *ifile; progname = argv[0]; - if (argc < 2) { + if (argc < 3) { fprintf(stderr, "%s %s\n", progname, usage); exit(1); } infilename = argv[1]; + outfilename = argv[2]; if ((ifile = fopen(infilename, "rb")) == NULL) { fail_parse("AIFF file could not be opened"); @@ -168,17 +172,33 @@ int main(int argc, char **argv) fclose(ifile); if (coefTable == NULL) { - execl("./tools/tabledesign", "tabledesign", "-s", "1", infilename, NULL); + char* arguments[] = { + "tabledesign", + "-s", + "1", + "-p", + outfilename, + infilename + }; + return tabledesign_entry(6, arguments); } else { - printf("%d\n%d\n", order, npredictors); + FILE *fp; + if ((fp = fopen(outfilename, "w")) == NULL) { + fprintf(stderr, "%s: could not write to file: %s", progname, outfilename); + exit(1); + } + + fprintf(fp, "%d\n%d\n", order, npredictors); for (s32 i = 0; i < npredictors; i++) { for (s32 j = 0; j < order; j++) { for (s32 k = 0; k < 8; k++) { - printf("% 5d ", coefTable[i][k][j]); + fprintf(fp, "% 5d ", coefTable[i][k][j]); } - puts(""); + fprintf(fp, "\n"); } } + + fclose(fp); } return 0; } diff --git a/tools/sdk-tools/tabledesign/print.c b/tools/sdk-tools/tabledesign/print.c index 80fe9e08..5e462d62 100644 --- a/tools/sdk-tools/tabledesign/print.c +++ b/tools/sdk-tools/tabledesign/print.c @@ -11,10 +11,18 @@ int print_entry(FILE *out, double *row, int order) int overflows; table = malloc(8 * sizeof(double*)); + if (table == NULL) { + fprintf(stderr, "print_entry: could not allocate memory for table\n"); + exit(1); + } for (i = 0; i < 8; i++) { table[i] = malloc(order * sizeof(double)); + if (table[i] == NULL) { + fprintf(stderr, "print_entry: could not allocate memory for table[%d]\n", i); + exit(1); + } } for (i = 0; i < order; i++) diff --git a/tools/sdk-tools/tabledesign/tabledesign.c b/tools/sdk-tools/tabledesign/tabledesign.c index f85757c4..d999a664 100644 --- a/tools/sdk-tools/tabledesign/tabledesign.c +++ b/tools/sdk-tools/tabledesign/tabledesign.c @@ -30,9 +30,21 @@ typedef int SampleFormat; #endif -char usage[80] = "[-o order -s bits -t thresh -i refine_iter -f frame_size] aifcfile"; +#define mallocErr(var, size, msg) \ + var = malloc(size); \ + if (var == NULL) { \ + fprintf(stderr, "%s: malloc failed at %s\n", programName, msg); \ + exit(1); \ + } +char filename[1024] = ""; +char usage[80] = "[-o order -s bits -t thresh -i refine_iter -f frame_size -p filename] aifcfile"; + +#ifndef EXTRACT_CODEBOOK int main(int argc, char **argv) +#else +int tabledesign_entry(int argc, char **argv) +#endif { const char *programName; // sp118 double thresh; // sp110 @@ -64,6 +76,7 @@ int main(int argc, char **argv) short *temp_s3; int i; int dataSize; // s4 + FILE *outfile; order = 2; bits = 2; @@ -79,7 +92,7 @@ int main(int argc, char **argv) exit(1); } - while ((opt = getopt(argc, argv, "o:s:t:i:f:")) != -1) + while ((opt = getopt(argc, argv, "o:s:t:i:f:p:")) != -1) { switch (opt) { @@ -103,9 +116,25 @@ int main(int argc, char **argv) if (sscanf(optarg, "%lf", &thresh) != 1) thresh = 10.0; break; + case 'p': + if (sscanf(optarg, "%s", filename) != 1) { + fprintf(stderr, "%s: No valid out file!\n", programName); + exit(1); + } else { + if ((outfile = fopen(filename, "w")) == NULL) { + fprintf(stderr, "%s: Could not open %s for writing\n", programName, filename); + exit(1); + } + } + break; } } + if (outfile == NULL) { + fprintf(stderr, "%s: No out file!\n", programName); + exit(1); + } + argv = &argv[optind - 1]; afFile = AFopenfile(argv[1], MODE_READ, NULL); @@ -114,6 +143,10 @@ int main(int argc, char **argv) fprintf(stderr, "%s: input AIFC file [%s] could not be opened.\n", programName, argv[1]); + + fclose(outfile); + outfile = NULL; + exit(1); } @@ -123,6 +156,10 @@ int main(int argc, char **argv) fprintf(stderr, "%s: file [%s] contains %d channels, only 1 channel supported.\n", programName, argv[1], channels); + + fclose(outfile); + outfile = NULL; + exit(1); } @@ -132,6 +169,10 @@ int main(int argc, char **argv) fprintf(stderr, "%s: file [%s] contains %d tracks, only 1 track supported.\n", programName, argv[1], tracks); + + fclose(outfile); + outfile = NULL; + exit(1); } @@ -141,34 +182,38 @@ int main(int argc, char **argv) fprintf(stderr, "%s: file [%s] contains %d bit samples, only 16 bit samples supported.\n", programName, argv[1], (int)sampleWidth); + + fclose(outfile); + outfile = NULL; + exit(1); } - temp_s1 = malloc((1 << bits) * sizeof(double*)); + mallocErr(temp_s1, (1 << bits) * sizeof(double*), "temp_s1"); for (i = 0; i < (1 << bits); i++) { - temp_s1[i] = malloc((order + 1) * sizeof(double)); + mallocErr(temp_s1[i], (order + 1) * sizeof(double), "temp_si[i]"); } - splitDelta = malloc((order + 1) * sizeof(double)); - temp_s3 = malloc(frameSize * 2 * sizeof(short)); + mallocErr(splitDelta, (order + 1) * sizeof(double), "splitDelta"); + mallocErr(temp_s3, frameSize * 2 * sizeof(short), "temp_s3"); for (i = 0; i < frameSize * 2; i++) { temp_s3[i] = 0; } - vec = malloc((order + 1) * sizeof(double)); - spF4 = malloc((order + 1) * sizeof(double)); - mat = malloc((order + 1) * sizeof(double*)); + mallocErr(vec, (order + 1) * sizeof(double), "vec"); + mallocErr(spF4, (order + 1) * sizeof(double), "spF4"); + mallocErr(mat, (order + 1) * sizeof(double*), "mat"); for (i = 0; i <= order; i++) { - mat[i] = malloc((order + 1) * sizeof(double)); + mallocErr(mat[i], (order + 1) * sizeof(double), "mat[i]"); } - perm = malloc((order + 1) * sizeof(int)); + mallocErr(perm, (order + 1) * sizeof(int), "perm"); frameCount = AFgetframecnt(afFile, AF_DEFAULT_TRACK); rate = AFgetrate(afFile, AF_DEFAULT_TRACK); - data = malloc(frameCount * sizeof(double*)); + mallocErr(data, frameCount * sizeof(double*), "data"); dataSize = 0; while (AFreadframes(afFile, AF_DEFAULT_TRACK, temp_s3 + frameSize, frameSize) == frameSize) @@ -183,7 +228,7 @@ int main(int argc, char **argv) vec[0] = 1.0; if (kfroma(vec, spF4, order) == 0) { - data[dataSize] = malloc((order + 1) * sizeof(double)); + mallocErr(data[dataSize], (order + 1) * sizeof(double), "data[dataSize]"); data[dataSize][0] = 1.0; for (i = 1; i <= order; i++) @@ -247,16 +292,20 @@ int main(int argc, char **argv) } npredictors = 1 << curBits; - fprintf(stdout, "%d\n%d\n", order, npredictors); + fprintf(outfile, "%d\n%d\n", order, npredictors); for (i = 0; i < npredictors; i++) { - numOverflows += print_entry(stdout, temp_s1[i], order); + numOverflows += print_entry(outfile, temp_s1[i], order); } if (numOverflows > 0) { fprintf(stderr, "There was overflow - check the table\n"); } + + fclose(outfile); + outfile = NULL; + return 0; } diff --git a/tools/sdk-tools/tabledesign/tabledesign.h b/tools/sdk-tools/tabledesign/tabledesign.h index 89c7a154..5cf298b2 100644 --- a/tools/sdk-tools/tabledesign/tabledesign.h +++ b/tools/sdk-tools/tabledesign/tabledesign.h @@ -27,4 +27,8 @@ void refine(double **table, int order, int npredictors, double **data, int dataS // print.c int print_entry(FILE *out, double *row, int order); +#ifdef EXTRACT_CODEBOOK +int tabledesign_entry(int, char**); +#endif + #endif