]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_rematrix.c
Created a small&clean public interface for the ac3 decoder (see ac3_decoder.h)
[vlc] / src / ac3_decoder / ac3_rematrix.c
1 #include "int_types.h"
2 #include "ac3_decoder.h"
3 #include "ac3_internal.h"
4
5 struct rematrix_band_s {
6     u32 start;
7     u32 end;
8 };
9
10 static struct rematrix_band_s rematrix_band[] = { {13,24}, {25,36}, {37 ,60}, {61,252}};
11
12 static __inline__ u32 min (u32 a, u32 b)
13 {
14     return (a < b ? a : b);
15 }
16
17 /* This routine simply does stereo rematixing for the 2 channel
18  * stereo mode */
19 void rematrix (ac3dec_t * p_ac3dec)
20 {
21     u32 num_bands;
22     u32 start;
23     u32 end;
24     u32 i,j;
25     float left,right;
26
27     if (p_ac3dec->audblk.cplinu || p_ac3dec->audblk.cplbegf > 2)
28         num_bands = 4;
29     else if (p_ac3dec->audblk.cplbegf > 0)
30         num_bands = 3;
31     else
32         num_bands = 2;
33
34     for (i=0;i < num_bands; i++) {
35         if (!p_ac3dec->audblk.rematflg[i])
36             continue;
37
38         start = rematrix_band[i].start;
39         end = min(rematrix_band[i].end ,12 * p_ac3dec->audblk.cplbegf + 36);
40
41         for (j=start;j < end; j++) {
42             left  = 0.5f * (p_ac3dec->coeffs.fbw[0][j] + p_ac3dec->coeffs.fbw[1][j]);
43             right = 0.5f * (p_ac3dec->coeffs.fbw[0][j] - p_ac3dec->coeffs.fbw[1][j]);
44             p_ac3dec->coeffs.fbw[0][j] = left;
45             p_ac3dec->coeffs.fbw[1][j] = right;
46         }
47     }
48 }