vorbisdec: don't reorder streams with channels count greater than eight
authorAurélien Zanelli <aurelien.zanelli@darkosphere.fr>
Wed, 1 Oct 2014 22:14:03 +0000 (00:14 +0200)
committerSebastian Dröge <sebastian@centricular.com>
Thu, 2 Oct 2014 07:42:40 +0000 (10:42 +0300)
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

index cf18958..75f6ea7 100644 (file)
@@ -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;