From 1085539bde0937dd156566b3dea957f3efbe0b29 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Mon, 3 Dec 2012 20:16:17 +0100 Subject: af_lavcac3enc, encode: support planar formats This fixes operation with current ffmpeg releases. Note that this planarization is slow and should be reverted once proper planar audio support is there in mpv. --- audio/reorder_ch.c | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'audio/reorder_ch.c') diff --git a/audio/reorder_ch.c b/audio/reorder_ch.c index 4b51a79439..330a807eae 100644 --- a/audio/reorder_ch.c +++ b/audio/reorder_ch.c @@ -1368,7 +1368,6 @@ void reorder_channel_nch(void *buf, samples, samplesize); } - #ifdef TEST static void test_copy(int channels) { @@ -1398,3 +1397,38 @@ 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 i, c; + char *outptr = (char *) out; + size_t instep = nchan * size; + + for (c = 0; c < nchan; ++c) { + const char *inptr = ((const char *) in) + c * size; + for (i = 0; i < nmemb; ++i, inptr += instep, outptr += size) { + memcpy(outptr, inptr, size); + } + } +} + +void reorder_to_planar(void *restrict out, const void *restrict in, + size_t size, size_t nchan, size_t nmemb) +{ + // special case for mono (nothing to do...) + if (nchan == 1) + memcpy(out, in, size * nchan * nmemb); + // these calls exist to insert an inline copy of to_planar_ here with known + // value of size to help the compiler replace the memcpy calls by mov + // instructions + else if (size == 1) + reorder_to_planar_(out, in, 1, nchan, nmemb); + else if (size == 2) + reorder_to_planar_(out, in, 2, nchan, nmemb); + else if (size == 4) + reorder_to_planar_(out, in, 4, nchan, nmemb); + // general case (calls memcpy a lot, should actually never happen, but + // stays here for correctness purposes) + else + reorder_to_planar_(out, in, size, nchan, nmemb); +} -- cgit v1.2.3