2 * Common code between the AC-3 encoder and decoder
3 * Copyright (c) 2000 Fabrice Bellard.
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * Common code between the AC-3 encoder and decoder.
29 #include "bitstream.h"
31 static uint8_t band_start_tab
[51];
32 static uint8_t bin_to_band_tab
[253];
34 static inline int calc_lowcomp1(int a
, int b0
, int b1
, int c
)
36 if ((b0
+ 256) == b1
) {
44 static inline int calc_lowcomp(int a
, int b0
, int b1
, int bin
)
47 return calc_lowcomp1(a
, b0
, b1
, 384);
48 } else if (bin
< 20) {
49 return calc_lowcomp1(a
, b0
, b1
, 320);
51 return FFMAX(a
- 128, 0);
55 void ff_ac3_bit_alloc_calc_psd(int8_t *exp
, int start
, int end
, int16_t *psd
,
58 int bin
, i
, j
, k
, end1
, v
;
60 /* exponent mapping to PSD */
61 for(bin
=start
;bin
<end
;bin
++) {
62 psd
[bin
]=(3072 - (exp
[bin
] << 7));
67 k
=bin_to_band_tab
[start
];
71 end1
= FFMIN(band_start_tab
[k
+1], end
);
74 int adr
= FFMIN(FFABS(v
- psd
[j
]) >> 1, 255);
75 v
= FFMAX(v
, psd
[j
]) + ff_ac3_log_add_tab
[adr
];
80 } while (end
> band_start_tab
[k
]);
83 void ff_ac3_bit_alloc_calc_mask(AC3BitAllocParameters
*s
, int16_t *band_psd
,
84 int start
, int end
, int fast_gain
, int is_lfe
,
85 int dba_mode
, int dba_nsegs
, uint8_t *dba_offsets
,
86 uint8_t *dba_lengths
, uint8_t *dba_values
,
89 int16_t excite
[50]; /* excitation */
91 int bndstrt
, bndend
, begin
, end1
, tmp
;
92 int lowcomp
, fastleak
, slowleak
;
94 /* excitation function */
95 bndstrt
= bin_to_band_tab
[start
];
96 bndend
= bin_to_band_tab
[end
-1] + 1;
100 lowcomp
= calc_lowcomp1(lowcomp
, band_psd
[0], band_psd
[1], 384);
101 excite
[0] = band_psd
[0] - fast_gain
- lowcomp
;
102 lowcomp
= calc_lowcomp1(lowcomp
, band_psd
[1], band_psd
[2], 384);
103 excite
[1] = band_psd
[1] - fast_gain
- lowcomp
;
105 for (bin
= 2; bin
< 7; bin
++) {
106 if (!(is_lfe
&& bin
== 6))
107 lowcomp
= calc_lowcomp1(lowcomp
, band_psd
[bin
], band_psd
[bin
+1], 384);
108 fastleak
= band_psd
[bin
] - fast_gain
;
109 slowleak
= band_psd
[bin
] - s
->slow_gain
;
110 excite
[bin
] = fastleak
- lowcomp
;
111 if (!(is_lfe
&& bin
== 6)) {
112 if (band_psd
[bin
] <= band_psd
[bin
+1]) {
120 if (end1
> 22) end1
=22;
122 for (bin
= begin
; bin
< end1
; bin
++) {
123 if (!(is_lfe
&& bin
== 6))
124 lowcomp
= calc_lowcomp(lowcomp
, band_psd
[bin
], band_psd
[bin
+1], bin
);
126 fastleak
= FFMAX(fastleak
- s
->fast_decay
, band_psd
[bin
] - fast_gain
);
127 slowleak
= FFMAX(slowleak
- s
->slow_decay
, band_psd
[bin
] - s
->slow_gain
);
128 excite
[bin
] = FFMAX(fastleak
- lowcomp
, slowleak
);
132 /* coupling channel */
135 fastleak
= (s
->cpl_fast_leak
<< 8) + 768;
136 slowleak
= (s
->cpl_slow_leak
<< 8) + 768;
139 for (bin
= begin
; bin
< bndend
; bin
++) {
140 fastleak
= FFMAX(fastleak
- s
->fast_decay
, band_psd
[bin
] - fast_gain
);
141 slowleak
= FFMAX(slowleak
- s
->slow_decay
, band_psd
[bin
] - s
->slow_gain
);
142 excite
[bin
] = FFMAX(fastleak
, slowleak
);
145 /* compute masking curve */
147 for (bin
= bndstrt
; bin
< bndend
; bin
++) {
148 tmp
= s
->db_per_bit
- band_psd
[bin
];
150 excite
[bin
] += tmp
>> 2;
152 mask
[bin
] = FFMAX(ff_ac3_hearing_threshold_tab
[bin
>> s
->sr_shift
][s
->sr_code
], excite
[bin
]);
155 /* delta bit allocation */
157 if (dba_mode
== DBA_REUSE
|| dba_mode
== DBA_NEW
) {
158 int band
, seg
, delta
;
160 for (seg
= 0; seg
< FFMIN(8, dba_nsegs
); seg
++) {
161 band
= FFMIN(49, band
+ dba_offsets
[seg
]);
162 if (dba_values
[seg
] >= 4) {
163 delta
= (dba_values
[seg
] - 3) << 7;
165 delta
= (dba_values
[seg
] - 4) << 7;
167 for (k
= 0; k
< dba_lengths
[seg
]; k
++) {
175 void ff_ac3_bit_alloc_calc_bap(int16_t *mask
, int16_t *psd
, int start
, int end
,
176 int snr_offset
, int floor
,
177 const uint8_t *bap_tab
, uint8_t *bap
)
179 int i
, j
, k
, end1
, v
, address
;
181 /* special case, if snr offset is -960, set all bap's to zero */
182 if(snr_offset
== -960) {
188 j
= bin_to_band_tab
[start
];
190 v
= (FFMAX(mask
[j
] - snr_offset
- floor
, 0) & 0x1FE0) + floor
;
191 end1
= FFMIN(band_start_tab
[j
] + ff_ac3_critical_band_size_tab
[j
], end
);
192 for (k
= i
; k
< end1
; k
++) {
193 address
= av_clip((psd
[i
] - v
) >> 5, 0, 63);
194 bap
[i
] = bap_tab
[address
];
197 } while (end
> band_start_tab
[j
++]);
200 /* AC-3 bit allocation. The algorithm is the one described in the AC-3
202 void ac3_parametric_bit_allocation(AC3BitAllocParameters
*s
, uint8_t *bap
,
203 int8_t *exp
, int start
, int end
,
204 int snr_offset
, int fast_gain
, int is_lfe
,
205 int dba_mode
, int dba_nsegs
,
206 uint8_t *dba_offsets
, uint8_t *dba_lengths
,
209 int16_t psd
[256]; /* scaled exponents */
210 int16_t band_psd
[50]; /* interpolated exponents */
211 int16_t mask
[50]; /* masking value */
213 ff_ac3_bit_alloc_calc_psd(exp
, start
, end
, psd
, band_psd
);
215 ff_ac3_bit_alloc_calc_mask(s
, band_psd
, start
, end
, fast_gain
, is_lfe
,
216 dba_mode
, dba_nsegs
, dba_offsets
, dba_lengths
, dba_values
,
219 ff_ac3_bit_alloc_calc_bap(mask
, psd
, start
, end
, snr_offset
, s
->floor
,
220 ff_ac3_bap_tab
, bap
);
224 * Initializes some tables.
225 * note: This function must remain thread safe because it is called by the
226 * AVParser init code.
228 av_cold
void ac3_common_init(void)
231 /* compute bndtab and masktab from bandsz */
235 band_start_tab
[i
] = l
;
236 v
= ff_ac3_critical_band_size_tab
[i
];
237 for(j
=0;j
<v
;j
++) bin_to_band_tab
[k
++]=i
;
240 band_start_tab
[50] = l
;