ffmpeg / libavcodec / liba52 / a52_internal.h @ 5509bffa
History  View  Annotate  Download (5.49 KB)
1 
/*


2 
* a52_internal.h

3 
* Copyright (C) 20002003 Michel Lespinasse <walken@zoy.org>

4 
* Copyright (C) 19992000 Aaron Holtzman <aholtzma@ess.engr.uvic.ca>

5 
*

6 
* This file is part of a52dec, a free ATSC A52 stream decoder.

7 
* See http://liba52.sourceforge.net/ for updates.

8 
*

9 
* a52dec is free software; you can redistribute it and/or modify

10 
* it under the terms of the GNU General Public License as published by

11 
* the Free Software Foundation; either version 2 of the License, or

12 
* (at your option) any later version.

13 
*

14 
* a52dec is distributed in the hope that it will be useful,

15 
* but WITHOUT ANY WARRANTY; without even the implied warranty of

16 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

17 
* GNU General Public License for more details.

18 
*

19 
* You should have received a copy of the GNU General Public License

20 
* along with this program; if not, write to the Free Software

21 
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 021101301 USA

22 
*/

23  
24 
typedef struct { 
25 
uint8_t bai; /* fine SNR offset, fast gain */

26 
uint8_t deltbae; /* delta bit allocation exists */

27 
int8_t deltba[50]; /* perband delta bit allocation */ 
28 
} ba_t; 
29  
30 
typedef struct { 
31 
uint8_t exp[256]; /* decoded channel exponents */ 
32 
int8_t bap[256]; /* derived channel bit allocation */ 
33 
} expbap_t; 
34  
35 
struct a52_state_s {

36 
uint8_t fscod; /* sample rate */

37 
uint8_t halfrate; /* halfrate factor */

38 
uint8_t acmod; /* coded channels */

39 
uint8_t lfeon; /* coded lfe channel */

40 
level_t clev; /* centre channel mix level */

41 
level_t slev; /* surround channels mix level */

42  
43 
int output; /* type of output */ 
44 
level_t level; /* output level */

45 
sample_t bias; /* output bias */

46  
47 
int dynrnge; /* apply dynamic range */ 
48 
level_t dynrng; /* dynamic range */

49 
void * dynrngdata; /* dynamic range callback funtion and data */ 
50 
level_t (* dynrngcall) (level_t range, void * dynrngdata);

51  
52 
uint8_t chincpl; /* channel coupled */

53 
uint8_t phsflginu; /* phase flags in use (stereo only) */

54 
uint8_t cplstrtmant; /* coupling channel start mantissa */

55 
uint8_t cplendmant; /* coupling channel end mantissa */

56 
uint32_t cplbndstrc; /* coupling band structure */

57 
level_t cplco[5][18]; /* coupling coordinates */ 
58  
59 
/* derived information */

60 
uint8_t cplstrtbnd; /* coupling start band (for bit allocation) */

61 
uint8_t ncplbnd; /* number of coupling bands */

62  
63 
uint8_t rematflg; /* stereo rematrixing */

64  
65 
uint8_t endmant[5]; /* channel end mantissa */ 
66  
67 
uint16_t bai; /* bit allocation information */

68  
69 
uint32_t * buffer_start; 
70 
uint16_t lfsr_state; /* dither state */

71 
uint32_t bits_left; 
72 
uint32_t current_word; 
73  
74 
uint8_t csnroffst; /* coarse SNR offset */

75 
ba_t cplba; /* coupling bit allocation parameters */

76 
ba_t ba[5]; /* channel bit allocation parameters */ 
77 
ba_t lfeba; /* lfe bit allocation parameters */

78  
79 
uint8_t cplfleak; /* coupling fast leak init */

80 
uint8_t cplsleak; /* coupling slow leak init */

81  
82 
expbap_t cpl_expbap; 
83 
expbap_t fbw_expbap[5];

84 
expbap_t lfe_expbap; 
85  
86 
sample_t * samples; 
87 
int downmixed;

88 
}; 
89  
90 
#define LEVEL_PLUS6DB 2.0 
91 
#define LEVEL_PLUS3DB 1.4142135623730951 
92 
#define LEVEL_3DB 0.7071067811865476 
93 
#define LEVEL_45DB 0.5946035575013605 
94 
#define LEVEL_6DB 0.5 
95  
96 
#define EXP_REUSE (0) 
97 
#define EXP_D15 (1) 
98 
#define EXP_D25 (2) 
99 
#define EXP_D45 (3) 
100  
101 
#define DELTA_BIT_REUSE (0) 
102 
#define DELTA_BIT_NEW (1) 
103 
#define DELTA_BIT_NONE (2) 
104 
#define DELTA_BIT_RESERVED (3) 
105  
106 
void a52_bit_allocate (a52_state_t * state, ba_t * ba, int bndstart, 
107 
int start, int end, int fastleak, int slowleak, 
108 
expbap_t * expbap); 
109  
110 
int a52_downmix_init (int input, int flags, level_t * level, 
111 
level_t clev, level_t slev); 
112 
int a52_downmix_coeff (level_t * coeff, int acmod, int output, level_t level, 
113 
level_t clev, level_t slev); 
114 
void a52_downmix (sample_t * samples, int acmod, int output, sample_t bias, 
115 
level_t clev, level_t slev); 
116 
void a52_upmix (sample_t * samples, int acmod, int output); 
117  
118 
void a52_imdct_init (uint32_t mm_accel);

119 
void a52_imdct_256 (sample_t * data, sample_t * delay, sample_t bias);

120 
void a52_imdct_512 (sample_t * data, sample_t * delay, sample_t bias);

121 
//extern void (* a52_imdct_256) (sample_t data[], sample_t delay[], sample_t bias);

122 
//extern void (* a52_imdct_512) (sample_t data[], sample_t delay[], sample_t bias);

123  
124 
#define ROUND(x) ((int)((x) + ((x) > 0 ? 0.5 : 0.5))) 
125  
126 
#ifndef LIBA52_FIXED

127  
128 
typedef sample_t quantizer_t;

129 
#define SAMPLE(x) (x)

130 
#define LEVEL(x) (x)

131 
#define MUL(a,b) ((a) * (b))

132 
#define MUL_L(a,b) ((a) * (b))

133 
#define MUL_C(a,b) ((a) * (b))

134 
#define DIV(a,b) ((a) / (b))

135 
#define BIAS(x) ((x) + bias)

136  
137 
#else /* LIBA52_FIXED */ 
138  
139 
typedef int16_t quantizer_t;

140 
#define SAMPLE(x) (sample_t)((x) * (1 << 30)) 
141 
#define LEVEL(x) (level_t)((x) * (1 << 26)) 
142  
143 
#if 0

144 
#define MUL(a,b) ((int)(((int64_t)(a) * (b) + (1 << 29)) >> 30))

145 
#define MUL_L(a,b) ((int)(((int64_t)(a) * (b) + (1 << 25)) >> 26))

146 
#elif 1

147 
#define MUL(a,b) \

148 
({ int32_t _ta=(a), _tb=(b), _tc; \ 
149 
_tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)(((_tc >> 14))+ (((_ta >> 16)*(_tb >> 16)) << 2 )); }) 
150 
#define MUL_L(a,b) \

151 
({ int32_t _ta=(a), _tb=(b), _tc; \ 
152 
_tc=(_ta & 0xffff)*(_tb >> 16)+(_ta >> 16)*(_tb & 0xffff); (int32_t)((_tc >> 10) + (((_ta >> 16)*(_tb >> 16)) << 6)); }) 
153 
#else

154 
#define MUL(a,b) (((a) >> 15) * ((b) >> 15)) 
155 
#define MUL_L(a,b) (((a) >> 13) * ((b) >> 13)) 
156 
#endif

157  
158 
#define MUL_C(a,b) MUL_L (a, LEVEL (b))

159 
#define DIV(a,b) ((((int64_t)LEVEL (a)) << 26) / (b)) 
160 
#define BIAS(x) (x)

161  
162 
#endif
