I was happy to realize that the recent releases introduced some basic filtering of 3D volumes, but unfortunately I'm trying to use ipprFilter to do a simple filtering with a summation kernel on a neighborhood of 3x3x3 and I get an access violation.
What I basically did was to allocate a large 'volume' (with ippsMalloc_16s) that includes suitable margins in all dimensions: 16 voxels on each end of each row (for the original 512x512xN data to remain aligned to 32 bytes) 1 extra row on each end of each plane 1 extra plane on each end of the entire volume
The entire 'volume' was reset with ippsZero and the original data was copied row by row with extra care for the margins.
I then defined Ipp16s **pSrc = new Ipp16s*, an array of N pointers to Ipp16s, as required by ipprFilter, and initialized each element to point to the correct offset within each plane of the volume (for all but the first and last planes that serve as margins).
Did the same for pDst.
Finally, I calculated the size of the buffer required for ipprFilter, using ipprFilterGetBufSize and allocated filtAuxBuf, an Ipp8u array of that size.
You will find a working exampleof function usage in the attached file test_3df.cpp.
You need to initialize all kernel values (3*3*3 in your case) and correctly to allocate memory for volumes(not on a stack).
Thanks for the example! Regretfully, I already converted my code to use successive IPPI calls, but I will save your code for rainy days. The main difference is that you allocated plane by plane where I allocated the entire volume at once and initialized pointers to each plane. In my next attempt I would most certainly follow your guidlines.