Oh, fft_r[] and fft_l[] are similar memory areas from calloc which hold the FFT output data once it's moved from the fft3w output array. I pick left and right channels out of the PCM data and FFT them individually, then plot them separately on the same frame image.
On 5/6/21, Alan Corey <alan01...@gmail.com> wrote: > This is under Debian Bullseye Linux on a PineBook Pro so ARM 64-bit I > think although sizeof(int) is still 4. It's a fairly complicated > program at 750 lines in it's almost-done state so I'm not posting the > whole thing. I have this program that does audiograms > https://sourceforge.net/projects/audiogram-c/ and I got the bright > idea of adding FFT plots to the video generated. I read a wav file > into RAM, draw the envelope of the audio. Then move a cursor bar over > it by generating frames at different times, saving as jpegs and > calling ffmpeg at the end to make a video. Originally it was a > work-around for not being able to post audio files to social media > sites. > > The FFT version works with the PCM data in the wav file in memory and > draws more onto the same frames. tmpbuf is a per-frame output drawing > area allocated with calloc and then cleared with bzero but I still get > these uninitialized warnings: > > ==26220== > ==26220== Invalid write of size 1 > ==26220== at 0x402460: plot (agf.c:573) > ==26220== by 0x402B9F: main (agf.c:713) > ==26220== Address 0x4d2b993 is 13 bytes before an unallocated block > of size 3,278,400 in arena "client" > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x401504: plotffts (agf.c:301) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x40153C: plotffts (agf.c:303) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x401598: plotffts (agf.c:307) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x4015D0: plotffts (agf.c:309) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x40165C: plotffts (agf.c:315) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x401678: plotffts (agf.c:317) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x4016E0: plotffts (agf.c:328) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x4016F8: plotffts (agf.c:329) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x401710: plotffts (agf.c:330) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x401788: plotffts (agf.c:337) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Conditional jump or move depends on uninitialised value(s) > ==26220== at 0x4017A4: plotffts (agf.c:339) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x4017EC: plotffts (agf.c:342) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Invalid write of size 1 > ==26220== at 0x4017EC: plotffts (agf.c:342) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Address 0x4dbb9dc is 4 bytes before an unallocated block of > size 2,688,512 in arena "client" > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x401804: plotffts (agf.c:343) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Invalid write of size 1 > ==26220== at 0x401804: plotffts (agf.c:343) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Address 0x4dbb9dd is 3 bytes before an unallocated block of > size 2,688,512 in arena "client" > ==26220== > ==26220== Use of uninitialised value of size 8 > ==26220== at 0x40181C: plotffts (agf.c:344) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Uninitialised value was created by a heap allocation > ==26220== at 0x4849E4C: malloc (vg_replace_malloc.c:307) > ==26220== by 0x40125B: fft_init (agf.c:173) > ==26220== by 0x402B63: main (agf.c:707) > ==26220== > ==26220== Invalid write of size 1 > ==26220== at 0x40181C: plotffts (agf.c:344) > ==26220== by 0x401DDF: makeframes (agf.c:442) > ==26220== by 0x402BA3: main (agf.c:714) > ==26220== Address 0x4dbb9de is 2 bytes before an unallocated block of > size 2,688,512 in arena "client" > ==26220== > > The invalid writes I can't figure out either. The code section looks like > this: > > void plotffts(void) { // draw to tmpbuf > int i = 0; // initialize everything for Valgrind > int ofs = 0; > float min = -99999.9; // floats work better > float max = 99999.9; > int x = EDGESKIP; // start at left side > int y = 0; > int oldx = EDGESKIP; > int oldy = 0; > int first = 1; > half = HEIGHT/2; // redundant > for (i=EDGESKIP; i<(FFTSIZE-EDGESKIP); i++) { // common values for both > L&R > if (fft_r[i] < min) // unitialized value > min = fft_r[i]; > if (fft_r[i] > max) // something not initialized > max = fft_r[i]; > } > for (i=EDGESKIP; i<(FFTSIZE-EDGESKIP); i++) { // read other channel > if (fft_l[i] > max) // uninit > max = fft_l[i]; > if (fft_l[i] < min) // uninit > min = fft_l[i]; > } > for (i=EDGESKIP; i<(FFTSIZE-EDGESKIP); i++) { // right channel > x = i; // correct? > y = ((fft_r[i] - min) / max) * half; > if (y > half) // uninit > y = half; > if (y < 0) // uninit > y = 0; > if (first > 0) { > oldy = y; > first = 0; > } > // line(oldx,oldy,x,y); > oldx = x; > oldy = y; > ///* > ofs = (y * WIDTH * 3) + (x * 3); > tmpbuf[ofs] = 0x01; // Use of uninitialised value of size 8 > tmpbuf[ofs+1] = 0xf5; // Use of uninitialised value of size 8 > tmpbuf[ofs+2] = 0xf6; // Use of uninitialised value of size 8 > //*/ > } > oldx = EDGESKIP; > for (i=EDGESKIP; i<(FFTSIZE-EDGESKIP); i++) { // left channel > x = i; > y = ((fft_l[i] - min) / max) * half; > if (y > half) // uninit > y = half; > if (y < 0) // uninit > y = 0; > ofs = ((y + half)* WIDTH * 3) + (x * 3); > tmpbuf[ofs] = 0x01; // uninitialised value of size 8 & Invalid > write of size 1 > tmpbuf[ofs+1] = 0xf5; // uninitialised value of size 8 & Invalid > write of size 1 > tmpbuf[ofs+2] = 0xf6; // uninitialised value of size 8 & Invalid > write of size 1 > } > // lines instead of dots would work better > } > > I've looked up the line numbers given in the Valgrind error messages > and put comments on those lines above. tmpbuf is where I'm doing > graphics, it's a chunk of RAM from calloc with an int8_t pointer > making it accessible. It's not live graphics but a buffer of 24-bit > color values which get written out to jpegs. Maybe I should use > 32-bit color? This code does work, but I'm adding to it (Bresenham > line drawing) and the error messages are distracting me from errors in > the new code I'm working on. My hunch is that something is still > incomplete in Valgrind on aarch64 platforms. > > Alan > -- > ------------- > Education is contagious. > -- ------------- Education is contagious. _______________________________________________ Valgrind-users mailing list Valgrind-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/valgrind-users