From b7ab2f0b08946bacd7aaf16110716573d6c77dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Zanelli?= Date: Thu, 2 Oct 2014 00:14:03 +0200 Subject: [PATCH] vorbisdec: don't reorder streams with channels count greater than eight vorbis_reorder_map is defined for eight channels max. If we have more than eight channels, it's the application which shall define the order. Since we set audio position to none, we just interleave all the channels without any particular reordering. https://bugzilla.gnome.org/show_bug.cgi?id=737742 --- ext/vorbis/gstvorbisdeclib.c | 32 +++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/ext/vorbis/gstvorbisdeclib.c b/ext/vorbis/gstvorbisdeclib.c index cf18958b69..75f6ea7987 100644 --- a/ext/vorbis/gstvorbisdeclib.c +++ b/ext/vorbis/gstvorbisdeclib.c @@ -81,6 +81,28 @@ copy_samples (vorbis_sample_t * out, vorbis_sample_t ** in, guint samples, #endif } +static void +copy_samples_no_reorder (vorbis_sample_t * out, vorbis_sample_t ** in, + guint samples, gint channels) +{ +#ifdef GST_VORBIS_DEC_SEQUENTIAL + gint i; + + for (i = 0; i < channels; i++) { + memcpy (out, in[i], samples * sizeof (float)); + out += samples; + } +#else + gint i, j; + + for (j = 0; j < samples; j++) { + for (i = 0; i < channels; i++) { + *out++ = in[i][j]; + } + } +#endif +} + CopySampleFunc gst_vorbis_get_copy_sample_func (gint channels) { @@ -93,9 +115,17 @@ gst_vorbis_get_copy_sample_func (gint channels) case 2: f = copy_samples_s; break; - default: + case 3: + case 4: + case 5: + case 6: + case 7: + case 8: f = copy_samples; break; + default: + f = copy_samples_no_reorder; + break; } return f;