summaryrefslogtreecommitdiff
path: root/ac3dec/rematrix.c
diff options
context:
space:
mode:
Diffstat (limited to 'ac3dec/rematrix.c')
-rw-r--r--ac3dec/rematrix.c83
1 files changed, 83 insertions, 0 deletions
diff --git a/ac3dec/rematrix.c b/ac3dec/rematrix.c
new file mode 100644
index 0000000..caa7094
--- /dev/null
+++ b/ac3dec/rematrix.c
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ *
+ *
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "ac3.h"
+#include "ac3_internal.h"
+
+
+#include "decode.h"
+#include "rematrix.h"
+
+struct rematrix_band_s
+{
+ uint_32 start;
+ uint_32 end;
+};
+
+struct rematrix_band_s rematrix_band[] = { {13,24}, {25,36}, {37 ,60}, {61,252}};
+
+static inline uint_32 min(uint_32 a,uint_32 b);
+
+static inline uint_32
+min(uint_32 a,uint_32 b)
+{
+ return (a < b ? a : b);
+}
+
+/* This routine simply does stereo rematixing for the 2 channel
+ * stereo mode */
+void rematrix(audblk_t *audblk, stream_samples_t samples)
+{
+ uint_32 num_bands;
+ uint_32 start;
+ uint_32 end;
+ uint_32 i,j;
+ float left,right;
+
+ 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++)
+ {
+ left = samples[0][j] + samples[1][j];
+ right = samples[0][j] - samples[1][j];
+ samples[0][j] = left;
+ samples[1][j] = right;
+ }
+ }
+}