]> git.sesse.net Git - vlc/blob - src/ac3_decoder/ac3_rematrix.c
travail sur l'ac3_decoder : debut de separation de ce qui est specifique a
[vlc] / src / ac3_decoder / ac3_rematrix.c
1 #include <unistd.h>                                              /* getpid() */
2
3 #include <stdio.h>                                           /* "intf_msg.h" */
4 #include <stdlib.h>                                      /* malloc(), free() */
5 #include <sys/soundcard.h>                               /* "audio_output.h" */
6 #include <sys/types.h>
7 #include <sys/uio.h>                                            /* "input.h" */
8
9 #include "common.h"
10 #include "config.h"
11 #include "mtime.h"
12 #include "vlc_thread.h"
13 #include "debug.h"                                      /* "input_netlist.h" */
14
15 #include "intf_msg.h"                        /* intf_DbgMsg(), intf_ErrMsg() */
16
17 #include "input.h"                                           /* pes_packet_t */
18 #include "input_netlist.h"                         /* input_NetlistFreePES() */
19 #include "decoder_fifo.h"         /* DECODER_FIFO_(ISEMPTY|START|INCSTART)() */
20
21 #include "audio_output.h"
22
23 #include "ac3_decoder.h"
24 #include "ac3_parse.h"
25 #include "ac3_exponent.h"
26 #include "ac3_bit_allocate.h"
27 #include "ac3_mantissa.h"
28 #include "ac3_rematrix.h"
29
30 struct rematrix_band_s
31 {
32         u32 start;
33         u32 end;
34 };
35
36 static struct rematrix_band_s rematrix_band[] = { {13,24}, {25,36}, {37 ,60}, {61,252}};
37
38 static __inline__ u32 min( u32 a, u32 b )
39 {
40         return( a < b ? a : b );
41 }
42
43 /* This routine simply does stereo rematixing for the 2 channel
44  * stereo mode */
45 void rematrix( ac3dec_t * p_ac3dec )
46 {
47         u32 num_bands;
48         u32 start;
49         u32 end;
50         u32 i,j;
51         float left,right;
52
53         if(p_ac3dec->audblk.cplinu || p_ac3dec->audblk.cplbegf > 2)
54                 num_bands = 4;
55         else if (p_ac3dec->audblk.cplbegf > 0)
56                 num_bands = 3;
57         else
58                 num_bands = 2;
59
60         for(i=0;i < num_bands; i++)
61         {
62                 if(!p_ac3dec->audblk.rematflg[i])
63                         continue;
64
65                 start = rematrix_band[i].start;
66                 end = min(rematrix_band[i].end ,12 * p_ac3dec->audblk.cplbegf + 36);
67         
68                 for(j=start;j < end; j++)
69                 {
70                         left  = 0.5f * (p_ac3dec->coeffs.fbw[0][j] + p_ac3dec->coeffs.fbw[1][j]);
71                         right = 0.5f * (p_ac3dec->coeffs.fbw[0][j] - p_ac3dec->coeffs.fbw[1][j]);
72                         p_ac3dec->coeffs.fbw[0][j] = left;
73                         p_ac3dec->coeffs.fbw[1][j] = right;
74                 }
75         }
76 }