summaryrefslogtreecommitdiff
path: root/src/libac3/rematrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libac3/rematrix.c')
-rw-r--r--src/libac3/rematrix.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/libac3/rematrix.c b/src/libac3/rematrix.c
new file mode 100644
index 000000000..95ce0117c
--- /dev/null
+++ b/src/libac3/rematrix.c
@@ -0,0 +1,95 @@
+/*
+ * rematrix.c
+ *
+ * Copyright (C) Aaron Holtzman - July 1999
+ *
+ * This file is part of ac3dec, a free Dolby AC-3 stream decoder.
+ *
+ * ac3dec is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * ac3dec is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "ac3.h"
+#include "ac3_internal.h"
+
+
+#include "rematrix.h"
+
+
+struct rematrix_band_s
+{
+ uint32_t start;
+ uint32_t end;
+} rematrix_band[] = {
+ {13, 24},
+ {25, 36},
+ {37, 60},
+ {61, 252}
+};
+
+
+/**
+ *
+ **/
+
+inline uint32_t min (uint32_t a, uint32_t b)
+{
+ return (a < b) ? a : b;
+}
+
+
+/**
+ * This routine simply does stereo remartixing for the 2 channel
+ * stereo mode
+ **/
+
+void rematrix (audblk_t *audblk, stream_samples_t samples)
+{
+ uint32_t num_bands;
+ uint32_t start;
+ uint32_t end;
+ int i,j;
+
+ if (!audblk->cplinu || audblk->cplbegf > 2)
+ num_bands = 4;
+ else if (audblk->cplbegf > 0)
+ num_bands = 3;
+ else
+ num_bands = 2;
+
+ for (i=0; i < num_bands; i++) {
+ if (!audblk->rematflg[i])
+ continue;
+
+ start = rematrix_band[i].start;
+ end = min (rematrix_band[i].end ,12 * audblk->cplbegf + 36);
+
+ for (j=start;j < end; j++) {
+ float left,right;
+
+ left = samples[0][j] + samples[1][j];
+ right = samples[0][j] - samples[1][j];
+ samples[0][j] = left;
+ samples[1][j] = right;
+ }
+ }
+}