diff options
Diffstat (limited to 'audio/reorder_ch.c')
-rw-r--r-- | audio/reorder_ch.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/audio/reorder_ch.c b/audio/reorder_ch.c index 330a807eae..72849c3d13 100644 --- a/audio/reorder_ch.c +++ b/audio/reorder_ch.c @@ -1399,7 +1399,8 @@ int main(int argc, char *argv[]) { #endif static inline void reorder_to_planar_(void *restrict out, const void *restrict in, - size_t size, size_t nchan, size_t nmemb) { + size_t size, size_t nchan, size_t nmemb) +{ size_t i, c; char *outptr = (char *) out; size_t instep = nchan * size; @@ -1413,7 +1414,7 @@ static inline void reorder_to_planar_(void *restrict out, const void *restrict i } void reorder_to_planar(void *restrict out, const void *restrict in, - size_t size, size_t nchan, size_t nmemb) + size_t size, size_t nchan, size_t nmemb) { // special case for mono (nothing to do...) if (nchan == 1) @@ -1432,3 +1433,35 @@ void reorder_to_planar(void *restrict out, const void *restrict in, else reorder_to_planar_(out, in, size, nchan, nmemb); } + +static inline void reorder_to_packed_(uint8_t *out, uint8_t **in, + size_t size, size_t nchan, size_t nmemb) +{ + size_t outstep = nchan * size; + + for (size_t c = 0; c < nchan; ++c) { + char *outptr = out + c * size; + char *inptr = in[c]; + for (size_t i = 0; i < nmemb; ++i, outptr += outstep, inptr += size) { + memcpy(outptr, inptr, size); + } + } +} + +// out = destination array of packed samples of given size, nmemb frames +// in[channel] = source array of samples for the given channel +void reorder_to_packed(uint8_t *out, uint8_t **in, + size_t size, size_t nchan, size_t nmemb) +{ + if (nchan == 1) + memcpy(out, in, size * nchan * nmemb); + // See reorder_to_planar() why this is done this way + else if (size == 1) + reorder_to_packed_(out, in, 1, nchan, nmemb); + else if (size == 2) + reorder_to_packed_(out, in, 2, nchan, nmemb); + else if (size == 4) + reorder_to_packed_(out, in, 4, nchan, nmemb); + else + reorder_to_packed_(out, in, size, nchan, nmemb); +} |