ffmpeg / libavcodec / ac3enc.c @ 6159bd0d
History | View | Annotate | Download (57.8 KB)
1 | de6d9b64 | Fabrice Bellard | /*
|
---|---|---|---|
2 | 14b70628 | Justin Ruggles | * The simplest AC-3 encoder
|
3 | 406792e7 | Diego Biurrun | * Copyright (c) 2000 Fabrice Bellard
|
4 | 27af78cf | Justin Ruggles | * Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
|
5 | * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
|
||
6 | de6d9b64 | Fabrice Bellard | *
|
7 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
8 | *
|
||
9 | * FFmpeg is free software; you can redistribute it and/or
|
||
10 | ff4ec49e | Fabrice Bellard | * modify it under the terms of the GNU Lesser General Public
|
11 | * License as published by the Free Software Foundation; either
|
||
12 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
13 | de6d9b64 | Fabrice Bellard | *
|
14 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
15 | de6d9b64 | Fabrice Bellard | * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
16 | ff4ec49e | Fabrice Bellard | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
17 | * Lesser General Public License for more details.
|
||
18 | de6d9b64 | Fabrice Bellard | *
|
19 | ff4ec49e | Fabrice Bellard | * You should have received a copy of the GNU Lesser General Public
|
20 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
21 | 5509bffa | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
22 | de6d9b64 | Fabrice Bellard | */
|
23 | 983e3246 | Michael Niedermayer | |
24 | /**
|
||
25 | ba87f080 | Diego Biurrun | * @file
|
26 | 14b70628 | Justin Ruggles | * The simplest AC-3 encoder.
|
27 | 983e3246 | Michael Niedermayer | */
|
28 | 6a988808 | Justin Ruggles | |
29 | 1a565432 | Fabrice Bellard | //#define DEBUG
|
30 | 22c0b03c | Justin Ruggles | |
31 | 7ffe76e5 | Reinhard Tartler | #include "libavutil/audioconvert.h" |
32 | 245976da | Diego Biurrun | #include "libavutil/crc.h" |
33 | de6d9b64 | Fabrice Bellard | #include "avcodec.h" |
34 | b2755007 | Stefano Sabatini | #include "put_bits.h" |
35 | 8846ee54 | Justin Ruggles | #include "dsputil.h" |
36 | a30ac54a | Justin Ruggles | #include "ac3dsp.h" |
37 | 6107fa87 | Fabrice Bellard | #include "ac3.h" |
38 | 120b4557 | Justin Ruggles | #include "audioconvert.h" |
39 | 6107fa87 | Fabrice Bellard | |
40 | 2f8ae522 | Justin Ruggles | |
41 | 6fd96d1a | Justin Ruggles | #ifndef CONFIG_AC3ENC_FLOAT
|
42 | #define CONFIG_AC3ENC_FLOAT 0 |
||
43 | #endif
|
||
44 | |||
45 | |||
46 | f94bacc5 | Justin Ruggles | /** Maximum number of exponent groups. +1 for separate DC exponent. */
|
47 | #define AC3_MAX_EXP_GROUPS 85 |
||
48 | |||
49 | dc7e07ac | Justin Ruggles | /* stereo rematrixing algorithms */
|
50 | #define AC3_REMATRIXING_IS_STATIC 0x1 |
||
51 | #define AC3_REMATRIXING_SUMS 0 |
||
52 | #define AC3_REMATRIXING_NONE 1 |
||
53 | #define AC3_REMATRIXING_ALWAYS 3 |
||
54 | |||
55 | c36ce0f8 | Justin Ruggles | /** Scale a float value by 2^bits and convert to an integer. */
|
56 | 918cd225 | Justin Ruggles | #define SCALE_FLOAT(a, bits) lrintf((a) * (float)(1 << (bits))) |
57 | |||
58 | 0cbd5ff7 | Justin Ruggles | |
59 | 6fd96d1a | Justin Ruggles | #if CONFIG_AC3ENC_FLOAT
|
60 | #include "ac3enc_float.h" |
||
61 | #else
|
||
62 | ad6b2c1f | Justin Ruggles | #include "ac3enc_fixed.h" |
63 | 6fd96d1a | Justin Ruggles | #endif
|
64 | e77fd066 | Justin Ruggles | |
65 | 2f8ae522 | Justin Ruggles | |
66 | c36ce0f8 | Justin Ruggles | /**
|
67 | 5901cebe | Justin Ruggles | * Data for a single audio block.
|
68 | */
|
||
69 | typedef struct AC3Block { |
||
70 | b6f6204d | Justin Ruggles | uint8_t **bap; ///< bit allocation pointers (bap)
|
71 | 0cbd5ff7 | Justin Ruggles | CoefType **mdct_coef; ///< MDCT coefficients
|
72 | ac05f903 | Justin Ruggles | int32_t **fixed_coef; ///< fixed-point MDCT coefficients
|
73 | b6f6204d | Justin Ruggles | uint8_t **exp; ///< original exponents
|
74 | uint8_t **grouped_exp; ///< grouped exponents
|
||
75 | int16_t **psd; ///< psd per frequency bin
|
||
76 | int16_t **band_psd; ///< psd per critical band
|
||
77 | int16_t **mask; ///< masking curve
|
||
78 | uint16_t **qmant; ///< quantized mantissas
|
||
79 | int8_t exp_shift[AC3_MAX_CHANNELS]; ///< exponent shift values
|
||
80 | dc7e07ac | Justin Ruggles | uint8_t new_rematrixing_strategy; ///< send new rematrixing flags in this block
|
81 | uint8_t rematrixing_flags[4]; ///< rematrixing flags |
||
82 | 5901cebe | Justin Ruggles | } AC3Block; |
83 | |||
84 | /**
|
||
85 | c36ce0f8 | Justin Ruggles | * AC-3 encoder private context.
|
86 | */
|
||
87 | 6107fa87 | Fabrice Bellard | typedef struct AC3EncodeContext { |
88 | 07965463 | Justin Ruggles | PutBitContext pb; ///< bitstream writer context
|
89 | 8846ee54 | Justin Ruggles | DSPContext dsp; |
90 | a30ac54a | Justin Ruggles | AC3DSPContext ac3dsp; ///< AC-3 optimized functions
|
91 | c41ac4f8 | Justin Ruggles | AC3MDCTContext mdct; ///< MDCT context
|
92 | 7e5a4bf8 | Justin Ruggles | |
93 | 5901cebe | Justin Ruggles | AC3Block blocks[AC3_MAX_BLOCKS]; ///< per-block info
|
94 | |||
95 | 07965463 | Justin Ruggles | int bitstream_id; ///< bitstream id (bsid) |
96 | int bitstream_mode; ///< bitstream mode (bsmod) |
||
97 | 7e5a4bf8 | Justin Ruggles | |
98 | 07965463 | Justin Ruggles | int bit_rate; ///< target bit rate, in bits-per-second |
99 | int sample_rate; ///< sampling frequency, in Hz |
||
100 | 7e5a4bf8 | Justin Ruggles | |
101 | 07965463 | Justin Ruggles | int frame_size_min; ///< minimum frame size in case rounding is necessary |
102 | 427e2293 | Justin Ruggles | int frame_size; ///< current frame size in bytes |
103 | 07965463 | Justin Ruggles | int frame_size_code; ///< frame size code (frmsizecod) |
104 | a81d7c6a | Justin Ruggles | uint16_t crc_inv[2];
|
105 | 07965463 | Justin Ruggles | int bits_written; ///< bit count (used to avg. bitrate) |
106 | int samples_written; ///< sample count (used to avg. bitrate) |
||
107 | 7e5a4bf8 | Justin Ruggles | |
108 | 07965463 | Justin Ruggles | int fbw_channels; ///< number of full-bandwidth channels (nfchans) |
109 | int channels; ///< total number of channels (nchans) |
||
110 | int lfe_on; ///< indicates if there is an LFE channel (lfeon) |
||
111 | int lfe_channel; ///< channel index of the LFE channel |
||
112 | int channel_mode; ///< channel mode (acmod) |
||
113 | const uint8_t *channel_map; ///< channel map used to reorder channels |
||
114 | 7e5a4bf8 | Justin Ruggles | |
115 | e62ef8f2 | Justin Ruggles | int cutoff; ///< user-specified cutoff frequency, in Hz |
116 | 07965463 | Justin Ruggles | int bandwidth_code[AC3_MAX_CHANNELS]; ///< bandwidth code (0 to 60) (chbwcod) |
117 | 6107fa87 | Fabrice Bellard | int nb_coefs[AC3_MAX_CHANNELS];
|
118 | 115329f1 | Diego Biurrun | |
119 | dc7e07ac | Justin Ruggles | int rematrixing; ///< determines how rematrixing strategy is calculated |
120 | |||
121 | 6107fa87 | Fabrice Bellard | /* bitrate allocation control */
|
122 | 07965463 | Justin Ruggles | int slow_gain_code; ///< slow gain code (sgaincod) |
123 | int slow_decay_code; ///< slow decay code (sdcycod) |
||
124 | int fast_decay_code; ///< fast decay code (fdcycod) |
||
125 | int db_per_bit_code; ///< dB/bit code (dbpbcod) |
||
126 | int floor_code; ///< floor code (floorcod) |
||
127 | AC3BitAllocParameters bit_alloc; ///< bit allocation parameters
|
||
128 | int coarse_snr_offset; ///< coarse SNR offsets (csnroffst) |
||
129 | int fast_gain_code[AC3_MAX_CHANNELS]; ///< fast gain codes (signal-to-mask ratio) (fgaincod) |
||
130 | int fine_snr_offset[AC3_MAX_CHANNELS]; ///< fine SNR offsets (fsnroffst) |
||
131 | e7536ac5 | Justin Ruggles | int frame_bits_fixed; ///< number of non-coefficient bits for fixed parameters |
132 | 359c1d19 | Justin Ruggles | int frame_bits; ///< all frame bits except exponents and mantissas |
133 | int exponent_bits; ///< number of bits used for exponents |
||
134 | 7e5a4bf8 | Justin Ruggles | |
135 | 6107fa87 | Fabrice Bellard | /* mantissa encoding */
|
136 | 07965463 | Justin Ruggles | int mant1_cnt, mant2_cnt, mant4_cnt; ///< mantissa counts for bap=1,2,4 |
137 | b6a1e523 | Justin Ruggles | uint16_t *qmant1_ptr, *qmant2_ptr, *qmant4_ptr; ///< mantissa pointers for bap=1,2,4
|
138 | 7e5a4bf8 | Justin Ruggles | |
139 | c05ffcd9 | Justin Ruggles | SampleType **planar_samples; |
140 | 171bc51c | Justin Ruggles | uint8_t *bap_buffer; |
141 | uint8_t *bap1_buffer; |
||
142 | 0cbd5ff7 | Justin Ruggles | CoefType *mdct_coef_buffer; |
143 | ac05f903 | Justin Ruggles | int32_t *fixed_coef_buffer; |
144 | b6f6204d | Justin Ruggles | uint8_t *exp_buffer; |
145 | uint8_t *grouped_exp_buffer; |
||
146 | int16_t *psd_buffer; |
||
147 | int16_t *band_psd_buffer; |
||
148 | int16_t *mask_buffer; |
||
149 | uint16_t *qmant_buffer; |
||
150 | aa645b98 | Justin Ruggles | |
151 | 0429e4a6 | Justin Ruggles | uint8_t exp_strategy[AC3_MAX_CHANNELS][AC3_MAX_BLOCKS]; ///< exponent strategies
|
152 | |||
153 | 0cbd5ff7 | Justin Ruggles | DECLARE_ALIGNED(16, SampleType, windowed_samples)[AC3_WINDOW_SIZE];
|
154 | 6107fa87 | Fabrice Bellard | } AC3EncodeContext; |
155 | de6d9b64 | Fabrice Bellard | |
156 | 2f8ae522 | Justin Ruggles | |
157 | f1cbbb79 | Justin Ruggles | /* prototypes for functions in ac3enc_fixed.c and ac3enc_float.c */
|
158 | ad6b2c1f | Justin Ruggles | |
159 | static av_cold void mdct_end(AC3MDCTContext *mdct); |
||
160 | |||
161 | static av_cold int mdct_init(AVCodecContext *avctx, AC3MDCTContext *mdct, |
||
162 | int nbits);
|
||
163 | |||
164 | static void mdct512(AC3MDCTContext *mdct, CoefType *out, SampleType *in); |
||
165 | |||
166 | eddf8f41 | Justin Ruggles | static void apply_window(DSPContext *dsp, SampleType *output, const SampleType *input, |
167 | ad6b2c1f | Justin Ruggles | const SampleType *window, int n); |
168 | |||
169 | static int normalize_samples(AC3EncodeContext *s); |
||
170 | |||
171 | ac05f903 | Justin Ruggles | static void scale_coefficients(AC3EncodeContext *s); |
172 | |||
173 | ad6b2c1f | Justin Ruggles | |
174 | e86ea34d | Justin Ruggles | /**
|
175 | * LUT for number of exponent groups.
|
||
176 | * exponent_group_tab[exponent strategy-1][number of coefficients]
|
||
177 | */
|
||
178 | e0698e4b | Justin Ruggles | static uint8_t exponent_group_tab[3][256]; |
179 | e86ea34d | Justin Ruggles | |
180 | 2f8ae522 | Justin Ruggles | |
181 | c36ce0f8 | Justin Ruggles | /**
|
182 | b33dae5e | Justin Ruggles | * List of supported channel layouts.
|
183 | */
|
||
184 | static const int64_t ac3_channel_layouts[] = { |
||
185 | AV_CH_LAYOUT_MONO, |
||
186 | AV_CH_LAYOUT_STEREO, |
||
187 | AV_CH_LAYOUT_2_1, |
||
188 | AV_CH_LAYOUT_SURROUND, |
||
189 | AV_CH_LAYOUT_2_2, |
||
190 | AV_CH_LAYOUT_QUAD, |
||
191 | AV_CH_LAYOUT_4POINT0, |
||
192 | AV_CH_LAYOUT_5POINT0, |
||
193 | AV_CH_LAYOUT_5POINT0_BACK, |
||
194 | (AV_CH_LAYOUT_MONO | AV_CH_LOW_FREQUENCY), |
||
195 | (AV_CH_LAYOUT_STEREO | AV_CH_LOW_FREQUENCY), |
||
196 | (AV_CH_LAYOUT_2_1 | AV_CH_LOW_FREQUENCY), |
||
197 | (AV_CH_LAYOUT_SURROUND | AV_CH_LOW_FREQUENCY), |
||
198 | (AV_CH_LAYOUT_2_2 | AV_CH_LOW_FREQUENCY), |
||
199 | (AV_CH_LAYOUT_QUAD | AV_CH_LOW_FREQUENCY), |
||
200 | (AV_CH_LAYOUT_4POINT0 | AV_CH_LOW_FREQUENCY), |
||
201 | AV_CH_LAYOUT_5POINT1, |
||
202 | AV_CH_LAYOUT_5POINT1_BACK, |
||
203 | 0
|
||
204 | }; |
||
205 | |||
206 | |||
207 | /**
|
||
208 | 160d85f5 | Justin Ruggles | * Adjust the frame size to make the average bit rate match the target bit rate.
|
209 | * This is only needed for 11025, 22050, and 44100 sample rates.
|
||
210 | */
|
||
211 | static void adjust_frame_size(AC3EncodeContext *s) |
||
212 | { |
||
213 | while (s->bits_written >= s->bit_rate && s->samples_written >= s->sample_rate) {
|
||
214 | s->bits_written -= s->bit_rate; |
||
215 | s->samples_written -= s->sample_rate; |
||
216 | } |
||
217 | 2d82d9b1 | Justin Ruggles | s->frame_size = s->frame_size_min + |
218 | 2 * (s->bits_written * s->sample_rate < s->samples_written * s->bit_rate);
|
||
219 | 160d85f5 | Justin Ruggles | s->bits_written += s->frame_size * 8;
|
220 | s->samples_written += AC3_FRAME_SIZE; |
||
221 | } |
||
222 | |||
223 | |||
224 | /**
|
||
225 | 4acc790f | Justin Ruggles | * Deinterleave input samples.
|
226 | * Channels are reordered from FFmpeg's default order to AC-3 order.
|
||
227 | */
|
||
228 | static void deinterleave_input_samples(AC3EncodeContext *s, |
||
229 | 0cbd5ff7 | Justin Ruggles | const SampleType *samples)
|
230 | 4acc790f | Justin Ruggles | { |
231 | int ch, i;
|
||
232 | |||
233 | /* deinterleave and remap input samples */
|
||
234 | for (ch = 0; ch < s->channels; ch++) { |
||
235 | 0cbd5ff7 | Justin Ruggles | const SampleType *sptr;
|
236 | 4acc790f | Justin Ruggles | int sinc;
|
237 | |||
238 | /* copy last 256 samples of previous frame to the start of the current frame */
|
||
239 | 1c3e117e | Justin Ruggles | memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_FRAME_SIZE],
|
240 | 266d24be | Justin Ruggles | AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0])); |
241 | 4acc790f | Justin Ruggles | |
242 | /* deinterleave */
|
||
243 | sinc = s->channels; |
||
244 | sptr = samples + s->channel_map[ch]; |
||
245 | for (i = AC3_BLOCK_SIZE; i < AC3_FRAME_SIZE+AC3_BLOCK_SIZE; i++) {
|
||
246 | 266d24be | Justin Ruggles | s->planar_samples[ch][i] = *sptr; |
247 | 4acc790f | Justin Ruggles | sptr += sinc; |
248 | } |
||
249 | } |
||
250 | } |
||
251 | |||
252 | |||
253 | /**
|
||
254 | 0a0a8500 | Justin Ruggles | * Apply the MDCT to input samples to generate frequency coefficients.
|
255 | * This applies the KBD window and normalizes the input to reduce precision
|
||
256 | * loss due to fixed-point calculations.
|
||
257 | */
|
||
258 | 266d24be | Justin Ruggles | static void apply_mdct(AC3EncodeContext *s) |
259 | 0a0a8500 | Justin Ruggles | { |
260 | int blk, ch;
|
||
261 | |||
262 | for (ch = 0; ch < s->channels; ch++) { |
||
263 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
264 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
265 | 0cbd5ff7 | Justin Ruggles | const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
|
266 | 0a0a8500 | Justin Ruggles | |
267 | eddf8f41 | Justin Ruggles | apply_window(&s->dsp, s->windowed_samples, input_samples, s->mdct.window, AC3_WINDOW_SIZE); |
268 | 0a0a8500 | Justin Ruggles | |
269 | 5901cebe | Justin Ruggles | block->exp_shift[ch] = normalize_samples(s); |
270 | 0a0a8500 | Justin Ruggles | |
271 | c41ac4f8 | Justin Ruggles | mdct512(&s->mdct, block->mdct_coef[ch], s->windowed_samples); |
272 | 0a0a8500 | Justin Ruggles | } |
273 | } |
||
274 | } |
||
275 | |||
276 | |||
277 | /**
|
||
278 | dc7e07ac | Justin Ruggles | * Initialize stereo rematrixing.
|
279 | * If the strategy does not change for each frame, set the rematrixing flags.
|
||
280 | */
|
||
281 | static void rematrixing_init(AC3EncodeContext *s) |
||
282 | { |
||
283 | if (s->channel_mode == AC3_CHMODE_STEREO)
|
||
284 | s->rematrixing = AC3_REMATRIXING_SUMS; |
||
285 | else
|
||
286 | s->rematrixing = AC3_REMATRIXING_NONE; |
||
287 | /* NOTE: AC3_REMATRIXING_ALWAYS might be used in
|
||
288 | the future in conjunction with channel coupling. */
|
||
289 | |||
290 | if (s->rematrixing & AC3_REMATRIXING_IS_STATIC) {
|
||
291 | int flag = (s->rematrixing == AC3_REMATRIXING_ALWAYS);
|
||
292 | s->blocks[0].new_rematrixing_strategy = 1; |
||
293 | memset(s->blocks[0].rematrixing_flags, flag,
|
||
294 | sizeof(s->blocks[0].rematrixing_flags)); |
||
295 | } |
||
296 | } |
||
297 | |||
298 | |||
299 | /**
|
||
300 | * Determine rematrixing flags for each block and band.
|
||
301 | */
|
||
302 | static void compute_rematrixing_strategy(AC3EncodeContext *s) |
||
303 | { |
||
304 | int nb_coefs;
|
||
305 | int blk, bnd, i;
|
||
306 | AC3Block *block, *block0; |
||
307 | |||
308 | if (s->rematrixing & AC3_REMATRIXING_IS_STATIC)
|
||
309 | return;
|
||
310 | |||
311 | nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]); |
||
312 | |||
313 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
314 | block = &s->blocks[blk]; |
||
315 | 6159bd0d | Justin Ruggles | block->new_rematrixing_strategy = !blk; |
316 | dc7e07ac | Justin Ruggles | for (bnd = 0; bnd < 4; bnd++) { |
317 | /* calculate calculate sum of squared coeffs for one band in one block */
|
||
318 | int start = ff_ac3_rematrix_band_tab[bnd];
|
||
319 | int end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]); |
||
320 | CoefSumType sum[4] = {0,}; |
||
321 | for (i = start; i < end; i++) {
|
||
322 | CoefType lt = block->mdct_coef[0][i];
|
||
323 | CoefType rt = block->mdct_coef[1][i];
|
||
324 | CoefType md = lt + rt; |
||
325 | CoefType sd = lt - rt; |
||
326 | sum[0] += lt * lt;
|
||
327 | sum[1] += rt * rt;
|
||
328 | sum[2] += md * md;
|
||
329 | sum[3] += sd * sd;
|
||
330 | } |
||
331 | |||
332 | /* compare sums to determine if rematrixing will be used for this band */
|
||
333 | if (FFMIN(sum[2], sum[3]) < FFMIN(sum[0], sum[1])) |
||
334 | block->rematrixing_flags[bnd] = 1;
|
||
335 | else
|
||
336 | block->rematrixing_flags[bnd] = 0;
|
||
337 | |||
338 | /* determine if new rematrixing flags will be sent */
|
||
339 | if (blk &&
|
||
340 | block->rematrixing_flags[bnd] != block0->rematrixing_flags[bnd]) { |
||
341 | block->new_rematrixing_strategy = 1;
|
||
342 | } |
||
343 | } |
||
344 | block0 = block; |
||
345 | } |
||
346 | } |
||
347 | |||
348 | |||
349 | /**
|
||
350 | * Apply stereo rematrixing to coefficients based on rematrixing flags.
|
||
351 | */
|
||
352 | static void apply_rematrixing(AC3EncodeContext *s) |
||
353 | { |
||
354 | int nb_coefs;
|
||
355 | int blk, bnd, i;
|
||
356 | int start, end;
|
||
357 | uint8_t *flags; |
||
358 | |||
359 | if (s->rematrixing == AC3_REMATRIXING_NONE)
|
||
360 | return;
|
||
361 | |||
362 | nb_coefs = FFMIN(s->nb_coefs[0], s->nb_coefs[1]); |
||
363 | |||
364 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
365 | AC3Block *block = &s->blocks[blk]; |
||
366 | if (block->new_rematrixing_strategy)
|
||
367 | flags = block->rematrixing_flags; |
||
368 | for (bnd = 0; bnd < 4; bnd++) { |
||
369 | if (flags[bnd]) {
|
||
370 | start = ff_ac3_rematrix_band_tab[bnd]; |
||
371 | end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]);
|
||
372 | for (i = start; i < end; i++) {
|
||
373 | int32_t lt = block->fixed_coef[0][i];
|
||
374 | int32_t rt = block->fixed_coef[1][i];
|
||
375 | block->fixed_coef[0][i] = (lt + rt) >> 1; |
||
376 | block->fixed_coef[1][i] = (lt - rt) >> 1; |
||
377 | } |
||
378 | } |
||
379 | } |
||
380 | } |
||
381 | } |
||
382 | |||
383 | |||
384 | /**
|
||
385 | e86ea34d | Justin Ruggles | * Initialize exponent tables.
|
386 | */
|
||
387 | static av_cold void exponent_init(AC3EncodeContext *s) |
||
388 | { |
||
389 | int i;
|
||
390 | for (i = 73; i < 256; i++) { |
||
391 | exponent_group_tab[0][i] = (i - 1) / 3; |
||
392 | exponent_group_tab[1][i] = (i + 2) / 6; |
||
393 | exponent_group_tab[2][i] = (i + 8) / 12; |
||
394 | } |
||
395 | 78646ac2 | Justin Ruggles | /* LFE */
|
396 | exponent_group_tab[0][7] = 2; |
||
397 | e86ea34d | Justin Ruggles | } |
398 | |||
399 | |||
400 | /**
|
||
401 | dfdf73eb | Justin Ruggles | * Extract exponents from the MDCT coefficients.
|
402 | * This takes into account the normalization that was done to the input samples
|
||
403 | * by adjusting the exponents by the exponent shift values.
|
||
404 | */
|
||
405 | 266d24be | Justin Ruggles | static void extract_exponents(AC3EncodeContext *s) |
406 | dfdf73eb | Justin Ruggles | { |
407 | int blk, ch, i;
|
||
408 | |||
409 | for (ch = 0; ch < s->channels; ch++) { |
||
410 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
411 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
412 | 9be52d48 | Justin Ruggles | uint8_t *exp = block->exp[ch]; |
413 | ac05f903 | Justin Ruggles | int32_t *coef = block->fixed_coef[ch]; |
414 | 9be52d48 | Justin Ruggles | int exp_shift = block->exp_shift[ch];
|
415 | dfdf73eb | Justin Ruggles | for (i = 0; i < AC3_MAX_COEFS; i++) { |
416 | int e;
|
||
417 | ac05f903 | Justin Ruggles | int v = abs(coef[i]);
|
418 | dfdf73eb | Justin Ruggles | if (v == 0) |
419 | e = 24;
|
||
420 | else {
|
||
421 | 9be52d48 | Justin Ruggles | e = 23 - av_log2(v) + exp_shift;
|
422 | dfdf73eb | Justin Ruggles | if (e >= 24) { |
423 | e = 24;
|
||
424 | 9be52d48 | Justin Ruggles | coef[i] = 0;
|
425 | dfdf73eb | Justin Ruggles | } |
426 | } |
||
427 | 9be52d48 | Justin Ruggles | exp[i] = e; |
428 | dfdf73eb | Justin Ruggles | } |
429 | } |
||
430 | } |
||
431 | } |
||
432 | |||
433 | |||
434 | /**
|
||
435 | c36ce0f8 | Justin Ruggles | * Exponent Difference Threshold.
|
436 | * New exponents are sent if their SAD exceed this number.
|
||
437 | */
|
||
438 | 10030226 | Justin Ruggles | #define EXP_DIFF_THRESHOLD 500 |
439 | 6a988808 | Justin Ruggles | |
440 | 2f8ae522 | Justin Ruggles | |
441 | c36ce0f8 | Justin Ruggles | /**
|
442 | * Calculate exponent strategies for all blocks in a single channel.
|
||
443 | */
|
||
444 | b5293036 | Justin Ruggles | static void compute_exp_strategy_ch(AC3EncodeContext *s, uint8_t *exp_strategy, |
445 | 5bff8590 | Justin Ruggles | uint8_t *exp) |
446 | de6d9b64 | Fabrice Bellard | { |
447 | ce67b7cd | Justin Ruggles | int blk, blk1;
|
448 | de6d9b64 | Fabrice Bellard | int exp_diff;
|
449 | 115329f1 | Diego Biurrun | |
450 | de6d9b64 | Fabrice Bellard | /* estimate if the exponent variation & decide if they should be
|
451 | reused in the next frame */
|
||
452 | d7da8080 | Justin Ruggles | exp_strategy[0] = EXP_NEW;
|
453 | 5bff8590 | Justin Ruggles | exp += AC3_MAX_COEFS; |
454 | ce67b7cd | Justin Ruggles | for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) { |
455 | 5bff8590 | Justin Ruggles | exp_diff = s->dsp.sad[0](NULL, exp, exp - AC3_MAX_COEFS, 16, 16); |
456 | de6d9b64 | Fabrice Bellard | if (exp_diff > EXP_DIFF_THRESHOLD)
|
457 | d7da8080 | Justin Ruggles | exp_strategy[blk] = EXP_NEW; |
458 | de6d9b64 | Fabrice Bellard | else
|
459 | d7da8080 | Justin Ruggles | exp_strategy[blk] = EXP_REUSE; |
460 | 5bff8590 | Justin Ruggles | exp += AC3_MAX_COEFS; |
461 | de6d9b64 | Fabrice Bellard | } |
462 | 30b68f33 | Zdenek Kabelac | |
463 | de6d9b64 | Fabrice Bellard | /* now select the encoding strategy type : if exponents are often
|
464 | recoded, we use a coarse encoding */
|
||
465 | ce67b7cd | Justin Ruggles | blk = 0;
|
466 | while (blk < AC3_MAX_BLOCKS) {
|
||
467 | blk1 = blk + 1;
|
||
468 | d7da8080 | Justin Ruggles | while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE)
|
469 | ce67b7cd | Justin Ruggles | blk1++; |
470 | switch (blk1 - blk) {
|
||
471 | d7da8080 | Justin Ruggles | case 1: exp_strategy[blk] = EXP_D45; break; |
472 | de6d9b64 | Fabrice Bellard | case 2: |
473 | d7da8080 | Justin Ruggles | case 3: exp_strategy[blk] = EXP_D25; break; |
474 | default: exp_strategy[blk] = EXP_D15; break; |
||
475 | de6d9b64 | Fabrice Bellard | } |
476 | ce67b7cd | Justin Ruggles | blk = blk1; |
477 | de6d9b64 | Fabrice Bellard | } |
478 | } |
||
479 | |||
480 | 2f8ae522 | Justin Ruggles | |
481 | c36ce0f8 | Justin Ruggles | /**
|
482 | dfdf73eb | Justin Ruggles | * Calculate exponent strategies for all channels.
|
483 | d7da8080 | Justin Ruggles | * Array arrangement is reversed to simplify the per-channel calculation.
|
484 | dfdf73eb | Justin Ruggles | */
|
485 | 266d24be | Justin Ruggles | static void compute_exp_strategy(AC3EncodeContext *s) |
486 | dfdf73eb | Justin Ruggles | { |
487 | d7da8080 | Justin Ruggles | int ch, blk;
|
488 | dfdf73eb | Justin Ruggles | |
489 | d7da8080 | Justin Ruggles | for (ch = 0; ch < s->fbw_channels; ch++) { |
490 | 5bff8590 | Justin Ruggles | compute_exp_strategy_ch(s, s->exp_strategy[ch], s->blocks[0].exp[ch]);
|
491 | d7da8080 | Justin Ruggles | } |
492 | if (s->lfe_on) {
|
||
493 | ch = s->lfe_channel; |
||
494 | 0429e4a6 | Justin Ruggles | s->exp_strategy[ch][0] = EXP_D15;
|
495 | 06f6f785 | Justin Ruggles | for (blk = 1; blk < AC3_MAX_BLOCKS; blk++) |
496 | 0429e4a6 | Justin Ruggles | s->exp_strategy[ch][blk] = EXP_REUSE; |
497 | dfdf73eb | Justin Ruggles | } |
498 | } |
||
499 | |||
500 | |||
501 | /**
|
||
502 | c36ce0f8 | Justin Ruggles | * Update the exponents so that they are the ones the decoder will decode.
|
503 | */
|
||
504 | b5293036 | Justin Ruggles | static void encode_exponents_blk_ch(uint8_t *exp, int nb_exps, int exp_strategy) |
505 | de6d9b64 | Fabrice Bellard | { |
506 | e86ea34d | Justin Ruggles | int nb_groups, i, k;
|
507 | de6d9b64 | Fabrice Bellard | |
508 | e86ea34d | Justin Ruggles | nb_groups = exponent_group_tab[exp_strategy-1][nb_exps] * 3; |
509 | de6d9b64 | Fabrice Bellard | |
510 | /* for each group, compute the minimum exponent */
|
||
511 | 834550ea | Justin Ruggles | switch(exp_strategy) {
|
512 | case EXP_D25:
|
||
513 | for (i = 1, k = 1; i <= nb_groups; i++) { |
||
514 | uint8_t exp_min = exp[k]; |
||
515 | if (exp[k+1] < exp_min) |
||
516 | exp_min = exp[k+1];
|
||
517 | exp[i] = exp_min; |
||
518 | k += 2;
|
||
519 | de6d9b64 | Fabrice Bellard | } |
520 | 834550ea | Justin Ruggles | break;
|
521 | case EXP_D45:
|
||
522 | for (i = 1, k = 1; i <= nb_groups; i++) { |
||
523 | uint8_t exp_min = exp[k]; |
||
524 | if (exp[k+1] < exp_min) |
||
525 | exp_min = exp[k+1];
|
||
526 | if (exp[k+2] < exp_min) |
||
527 | exp_min = exp[k+2];
|
||
528 | if (exp[k+3] < exp_min) |
||
529 | exp_min = exp[k+3];
|
||
530 | exp[i] = exp_min; |
||
531 | k += 4;
|
||
532 | } |
||
533 | break;
|
||
534 | 27af78cf | Justin Ruggles | } |
535 | de6d9b64 | Fabrice Bellard | |
536 | /* constraint for DC exponent */
|
||
537 | 27af78cf | Justin Ruggles | if (exp[0] > 15) |
538 | exp[0] = 15; |
||
539 | de6d9b64 | Fabrice Bellard | |
540 | 6a988808 | Justin Ruggles | /* decrease the delta between each groups to within 2 so that they can be
|
541 | differentially encoded */
|
||
542 | for (i = 1; i <= nb_groups; i++) |
||
543 | 27af78cf | Justin Ruggles | exp[i] = FFMIN(exp[i], exp[i-1] + 2); |
544 | cdedf7e6 | Justin Ruggles | i--; |
545 | while (--i >= 0) |
||
546 | 27af78cf | Justin Ruggles | exp[i] = FFMIN(exp[i], exp[i+1] + 2); |
547 | e44cad52 | Jeff Muizelaar | |
548 | de6d9b64 | Fabrice Bellard | /* now we have the exponent values the decoder will see */
|
549 | 834550ea | Justin Ruggles | switch (exp_strategy) {
|
550 | case EXP_D25:
|
||
551 | for (i = nb_groups, k = nb_groups * 2; i > 0; i--) { |
||
552 | uint8_t exp1 = exp[i]; |
||
553 | exp[k--] = exp1; |
||
554 | exp[k--] = exp1; |
||
555 | } |
||
556 | break;
|
||
557 | case EXP_D45:
|
||
558 | for (i = nb_groups, k = nb_groups * 4; i > 0; i--) { |
||
559 | exp[k] = exp[k-1] = exp[k-2] = exp[k-3] = exp[i]; |
||
560 | k -= 4;
|
||
561 | } |
||
562 | break;
|
||
563 | de6d9b64 | Fabrice Bellard | } |
564 | } |
||
565 | |||
566 | 2f8ae522 | Justin Ruggles | |
567 | c36ce0f8 | Justin Ruggles | /**
|
568 | dfdf73eb | Justin Ruggles | * Encode exponents from original extracted form to what the decoder will see.
|
569 | * This copies and groups exponents based on exponent strategy and reduces
|
||
570 | * deltas between adjacent exponent groups so that they can be differentially
|
||
571 | * encoded.
|
||
572 | */
|
||
573 | 266d24be | Justin Ruggles | static void encode_exponents(AC3EncodeContext *s) |
574 | dfdf73eb | Justin Ruggles | { |
575 | 7d87d56f | Justin Ruggles | int blk, blk1, ch;
|
576 | uint8_t *exp, *exp1, *exp_strategy; |
||
577 | 964f2cf2 | Justin Ruggles | int nb_coefs, num_reuse_blocks;
|
578 | dfdf73eb | Justin Ruggles | |
579 | for (ch = 0; ch < s->channels; ch++) { |
||
580 | 7d87d56f | Justin Ruggles | exp = s->blocks[0].exp[ch];
|
581 | exp_strategy = s->exp_strategy[ch]; |
||
582 | nb_coefs = s->nb_coefs[ch]; |
||
583 | |||
584 | dfdf73eb | Justin Ruggles | blk = 0;
|
585 | while (blk < AC3_MAX_BLOCKS) {
|
||
586 | blk1 = blk + 1;
|
||
587 | 964f2cf2 | Justin Ruggles | |
588 | /* count the number of EXP_REUSE blocks after the current block */
|
||
589 | 0db5d2b0 | Justin Ruggles | while (blk1 < AC3_MAX_BLOCKS && exp_strategy[blk1] == EXP_REUSE)
|
590 | dfdf73eb | Justin Ruggles | blk1++; |
591 | 964f2cf2 | Justin Ruggles | num_reuse_blocks = blk1 - blk - 1;
|
592 | |||
593 | /* for the EXP_REUSE case we select the min of the exponents */
|
||
594 | a30ac54a | Justin Ruggles | s->ac3dsp.ac3_exponent_min(exp, num_reuse_blocks, nb_coefs); |
595 | 964f2cf2 | Justin Ruggles | |
596 | 0db5d2b0 | Justin Ruggles | encode_exponents_blk_ch(exp, nb_coefs, exp_strategy[blk]); |
597 | |||
598 | dfdf73eb | Justin Ruggles | /* copy encoded exponents for reuse case */
|
599 | 7d87d56f | Justin Ruggles | exp1 = exp + AC3_MAX_COEFS; |
600 | while (blk < blk1-1) { |
||
601 | memcpy(exp1, exp, nb_coefs * sizeof(*exp));
|
||
602 | exp1 += AC3_MAX_COEFS; |
||
603 | blk++; |
||
604 | dfdf73eb | Justin Ruggles | } |
605 | blk = blk1; |
||
606 | 7d87d56f | Justin Ruggles | exp = exp1; |
607 | dfdf73eb | Justin Ruggles | } |
608 | } |
||
609 | f94bacc5 | Justin Ruggles | } |
610 | |||
611 | |||
612 | /**
|
||
613 | * Group exponents.
|
||
614 | * 3 delta-encoded exponents are in each 7-bit group. The number of groups
|
||
615 | * varies depending on exponent strategy and bandwidth.
|
||
616 | */
|
||
617 | 266d24be | Justin Ruggles | static void group_exponents(AC3EncodeContext *s) |
618 | f94bacc5 | Justin Ruggles | { |
619 | int blk, ch, i;
|
||
620 | e86ea34d | Justin Ruggles | int group_size, nb_groups, bit_count;
|
621 | f94bacc5 | Justin Ruggles | uint8_t *p; |
622 | int delta0, delta1, delta2;
|
||
623 | int exp0, exp1;
|
||
624 | |||
625 | bit_count = 0;
|
||
626 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
627 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
628 | f94bacc5 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
629 | 4b90c35d | Justin Ruggles | int exp_strategy = s->exp_strategy[ch][blk];
|
630 | if (exp_strategy == EXP_REUSE)
|
||
631 | f94bacc5 | Justin Ruggles | continue;
|
632 | 4b90c35d | Justin Ruggles | group_size = exp_strategy + (exp_strategy == EXP_D45); |
633 | nb_groups = exponent_group_tab[exp_strategy-1][s->nb_coefs[ch]];
|
||
634 | e86ea34d | Justin Ruggles | bit_count += 4 + (nb_groups * 7); |
635 | 27af78cf | Justin Ruggles | p = block->exp[ch]; |
636 | f94bacc5 | Justin Ruggles | |
637 | /* DC exponent */
|
||
638 | exp1 = *p++; |
||
639 | 5901cebe | Justin Ruggles | block->grouped_exp[ch][0] = exp1;
|
640 | f94bacc5 | Justin Ruggles | |
641 | /* remaining exponents are delta encoded */
|
||
642 | e86ea34d | Justin Ruggles | for (i = 1; i <= nb_groups; i++) { |
643 | f94bacc5 | Justin Ruggles | /* merge three delta in one code */
|
644 | exp0 = exp1; |
||
645 | exp1 = p[0];
|
||
646 | p += group_size; |
||
647 | delta0 = exp1 - exp0 + 2;
|
||
648 | |||
649 | exp0 = exp1; |
||
650 | exp1 = p[0];
|
||
651 | p += group_size; |
||
652 | delta1 = exp1 - exp0 + 2;
|
||
653 | |||
654 | exp0 = exp1; |
||
655 | exp1 = p[0];
|
||
656 | p += group_size; |
||
657 | delta2 = exp1 - exp0 + 2;
|
||
658 | |||
659 | 5901cebe | Justin Ruggles | block->grouped_exp[ch][i] = ((delta0 * 5 + delta1) * 5) + delta2; |
660 | f94bacc5 | Justin Ruggles | } |
661 | } |
||
662 | } |
||
663 | dfdf73eb | Justin Ruggles | |
664 | 359c1d19 | Justin Ruggles | s->exponent_bits = bit_count; |
665 | dfdf73eb | Justin Ruggles | } |
666 | |||
667 | |||
668 | /**
|
||
669 | * Calculate final exponents from the supplied MDCT coefficients and exponent shift.
|
||
670 | * Extract exponents from MDCT coefficients, calculate exponent strategies,
|
||
671 | * and encode final exponents.
|
||
672 | */
|
||
673 | 266d24be | Justin Ruggles | static void process_exponents(AC3EncodeContext *s) |
674 | dfdf73eb | Justin Ruggles | { |
675 | 266d24be | Justin Ruggles | extract_exponents(s); |
676 | dfdf73eb | Justin Ruggles | |
677 | 266d24be | Justin Ruggles | compute_exp_strategy(s); |
678 | dfdf73eb | Justin Ruggles | |
679 | 266d24be | Justin Ruggles | encode_exponents(s); |
680 | f94bacc5 | Justin Ruggles | |
681 | 266d24be | Justin Ruggles | group_exponents(s); |
682 | a30ac54a | Justin Ruggles | |
683 | emms_c(); |
||
684 | dfdf73eb | Justin Ruggles | } |
685 | |||
686 | |||
687 | /**
|
||
688 | e7536ac5 | Justin Ruggles | * Count frame bits that are based solely on fixed parameters.
|
689 | * This only has to be run once when the encoder is initialized.
|
||
690 | */
|
||
691 | static void count_frame_bits_fixed(AC3EncodeContext *s) |
||
692 | { |
||
693 | static const int frame_bits_inc[8] = { 0, 0, 2, 2, 2, 4, 2, 4 }; |
||
694 | int blk;
|
||
695 | int frame_bits;
|
||
696 | |||
697 | /* assumptions:
|
||
698 | * no dynamic range codes
|
||
699 | * no channel coupling
|
||
700 | * bit allocation parameters do not change between blocks
|
||
701 | * SNR offsets do not change between blocks
|
||
702 | * no delta bit allocation
|
||
703 | * no skipped data
|
||
704 | * no auxilliary data
|
||
705 | */
|
||
706 | |||
707 | /* header size */
|
||
708 | frame_bits = 65;
|
||
709 | frame_bits += frame_bits_inc[s->channel_mode]; |
||
710 | |||
711 | /* audio blocks */
|
||
712 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
713 | frame_bits += s->fbw_channels * 2 + 2; /* blksw * c, dithflag * c, dynrnge, cplstre */ |
||
714 | if (s->channel_mode == AC3_CHMODE_STEREO) {
|
||
715 | frame_bits++; /* rematstr */
|
||
716 | } |
||
717 | frame_bits += 2 * s->fbw_channels; /* chexpstr[2] * c */ |
||
718 | if (s->lfe_on)
|
||
719 | frame_bits++; /* lfeexpstr */
|
||
720 | frame_bits++; /* baie */
|
||
721 | frame_bits++; /* snr */
|
||
722 | frame_bits += 2; /* delta / skip */ |
||
723 | } |
||
724 | frame_bits++; /* cplinu for block 0 */
|
||
725 | /* bit alloc info */
|
||
726 | /* sdcycod[2], fdcycod[2], sgaincod[2], dbpbcod[2], floorcod[3] */
|
||
727 | /* csnroffset[6] */
|
||
728 | /* (fsnoffset[4] + fgaincod[4]) * c */
|
||
729 | frame_bits += 2*4 + 3 + 6 + s->channels * (4 + 3); |
||
730 | |||
731 | /* auxdatae, crcrsv */
|
||
732 | frame_bits += 2;
|
||
733 | |||
734 | /* CRC */
|
||
735 | frame_bits += 16;
|
||
736 | |||
737 | s->frame_bits_fixed = frame_bits; |
||
738 | } |
||
739 | |||
740 | |||
741 | /**
|
||
742 | 793bbf95 | Justin Ruggles | * Initialize bit allocation.
|
743 | * Set default parameter codes and calculate parameter values.
|
||
744 | */
|
||
745 | static void bit_alloc_init(AC3EncodeContext *s) |
||
746 | { |
||
747 | int ch;
|
||
748 | |||
749 | /* init default parameters */
|
||
750 | s->slow_decay_code = 2;
|
||
751 | s->fast_decay_code = 1;
|
||
752 | s->slow_gain_code = 1;
|
||
753 | ec44dd5f | Justin Ruggles | s->db_per_bit_code = 3;
|
754 | 660ab0e6 | Justin Ruggles | s->floor_code = 7;
|
755 | 793bbf95 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) |
756 | s->fast_gain_code[ch] = 4;
|
||
757 | |||
758 | /* initial snr offset */
|
||
759 | s->coarse_snr_offset = 40;
|
||
760 | |||
761 | /* compute real values */
|
||
762 | /* currently none of these values change during encoding, so we can just
|
||
763 | set them once at initialization */
|
||
764 | s->bit_alloc.slow_decay = ff_ac3_slow_decay_tab[s->slow_decay_code] >> s->bit_alloc.sr_shift; |
||
765 | s->bit_alloc.fast_decay = ff_ac3_fast_decay_tab[s->fast_decay_code] >> s->bit_alloc.sr_shift; |
||
766 | s->bit_alloc.slow_gain = ff_ac3_slow_gain_tab[s->slow_gain_code]; |
||
767 | s->bit_alloc.db_per_bit = ff_ac3_db_per_bit_tab[s->db_per_bit_code]; |
||
768 | s->bit_alloc.floor = ff_ac3_floor_tab[s->floor_code]; |
||
769 | e7536ac5 | Justin Ruggles | |
770 | count_frame_bits_fixed(s); |
||
771 | 793bbf95 | Justin Ruggles | } |
772 | |||
773 | |||
774 | /**
|
||
775 | 8999944e | Justin Ruggles | * Count the bits used to encode the frame, minus exponents and mantissas.
|
776 | e7536ac5 | Justin Ruggles | * Bits based on fixed parameters have already been counted, so now we just
|
777 | * have to add the bits based on parameters that change during encoding.
|
||
778 | 8999944e | Justin Ruggles | */
|
779 | 266d24be | Justin Ruggles | static void count_frame_bits(AC3EncodeContext *s) |
780 | 8999944e | Justin Ruggles | { |
781 | int blk, ch;
|
||
782 | e7536ac5 | Justin Ruggles | int frame_bits = 0; |
783 | 8999944e | Justin Ruggles | |
784 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
785 | dc7e07ac | Justin Ruggles | /* stereo rematrixing */
|
786 | if (s->channel_mode == AC3_CHMODE_STEREO &&
|
||
787 | s->blocks[blk].new_rematrixing_strategy) { |
||
788 | frame_bits += 4;
|
||
789 | } |
||
790 | |||
791 | 8999944e | Justin Ruggles | for (ch = 0; ch < s->fbw_channels; ch++) { |
792 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] != EXP_REUSE)
|
793 | 8999944e | Justin Ruggles | frame_bits += 6 + 2; /* chbwcod[6], gainrng[2] */ |
794 | } |
||
795 | } |
||
796 | e7536ac5 | Justin Ruggles | s->frame_bits = s->frame_bits_fixed + frame_bits; |
797 | 8999944e | Justin Ruggles | } |
798 | |||
799 | |||
800 | /**
|
||
801 | c36ce0f8 | Justin Ruggles | * Calculate the number of bits needed to encode a set of mantissas.
|
802 | */
|
||
803 | 126a29b8 | Justin Ruggles | static int compute_mantissa_size(int mant_cnt[5], uint8_t *bap, int nb_coefs) |
804 | de6d9b64 | Fabrice Bellard | { |
805 | 2d82d9b1 | Justin Ruggles | int bits, b, i;
|
806 | de6d9b64 | Fabrice Bellard | |
807 | bits = 0;
|
||
808 | 6a988808 | Justin Ruggles | for (i = 0; i < nb_coefs; i++) { |
809 | 2d82d9b1 | Justin Ruggles | b = bap[i]; |
810 | 126a29b8 | Justin Ruggles | if (b <= 4) { |
811 | // bap=1 to bap=4 will be counted in compute_mantissa_size_final
|
||
812 | mant_cnt[b]++; |
||
813 | } else if (b <= 13) { |
||
814 | // bap=5 to bap=13 use (bap-1) bits
|
||
815 | 2d82d9b1 | Justin Ruggles | bits += b - 1;
|
816 | 126a29b8 | Justin Ruggles | } else {
|
817 | // bap=14 uses 14 bits and bap=15 uses 16 bits
|
||
818 | bits += (b == 14) ? 14 : 16; |
||
819 | de6d9b64 | Fabrice Bellard | } |
820 | } |
||
821 | return bits;
|
||
822 | } |
||
823 | |||
824 | |||
825 | c36ce0f8 | Justin Ruggles | /**
|
826 | 126a29b8 | Justin Ruggles | * Finalize the mantissa bit count by adding in the grouped mantissas.
|
827 | */
|
||
828 | static int compute_mantissa_size_final(int mant_cnt[5]) |
||
829 | { |
||
830 | // bap=1 : 3 mantissas in 5 bits
|
||
831 | int bits = (mant_cnt[1] / 3) * 5; |
||
832 | // bap=2 : 3 mantissas in 7 bits
|
||
833 | // bap=4 : 2 mantissas in 7 bits
|
||
834 | bits += ((mant_cnt[2] / 3) + (mant_cnt[4] >> 1)) * 7; |
||
835 | // bap=3 : each mantissa is 3 bits
|
||
836 | bits += mant_cnt[3] * 3; |
||
837 | return bits;
|
||
838 | } |
||
839 | |||
840 | |||
841 | /**
|
||
842 | c36ce0f8 | Justin Ruggles | * Calculate masking curve based on the final exponents.
|
843 | * Also calculate the power spectral densities to use in future calculations.
|
||
844 | */
|
||
845 | 266d24be | Justin Ruggles | static void bit_alloc_masking(AC3EncodeContext *s) |
846 | bbd16dea | Justin Ruggles | { |
847 | int blk, ch;
|
||
848 | |||
849 | 6a988808 | Justin Ruggles | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
850 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
851 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
852 | cf7c961b | Justin Ruggles | /* We only need psd and mask for calculating bap.
|
853 | Since we currently do not calculate bap when exponent
|
||
854 | strategy is EXP_REUSE we do not need to calculate psd or mask. */
|
||
855 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] != EXP_REUSE) {
|
856 | 27af78cf | Justin Ruggles | ff_ac3_bit_alloc_calc_psd(block->exp[ch], 0,
|
857 | bbd16dea | Justin Ruggles | s->nb_coefs[ch], |
858 | 5901cebe | Justin Ruggles | block->psd[ch], block->band_psd[ch]); |
859 | ff_ac3_bit_alloc_calc_mask(&s->bit_alloc, block->band_psd[ch], |
||
860 | bbd16dea | Justin Ruggles | 0, s->nb_coefs[ch],
|
861 | 5ce21342 | Justin Ruggles | ff_ac3_fast_gain_tab[s->fast_gain_code[ch]], |
862 | bbd16dea | Justin Ruggles | ch == s->lfe_channel, |
863 | cc2a8443 | Justin Ruggles | DBA_NONE, 0, NULL, NULL, NULL, |
864 | 5901cebe | Justin Ruggles | block->mask[ch]); |
865 | bbd16dea | Justin Ruggles | } |
866 | } |
||
867 | } |
||
868 | } |
||
869 | |||
870 | 2f8ae522 | Justin Ruggles | |
871 | c36ce0f8 | Justin Ruggles | /**
|
872 | 171bc51c | Justin Ruggles | * Ensure that bap for each block and channel point to the current bap_buffer.
|
873 | * They may have been switched during the bit allocation search.
|
||
874 | */
|
||
875 | static void reset_block_bap(AC3EncodeContext *s) |
||
876 | { |
||
877 | int blk, ch;
|
||
878 | if (s->blocks[0].bap[0] == s->bap_buffer) |
||
879 | return;
|
||
880 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
881 | for (ch = 0; ch < s->channels; ch++) { |
||
882 | s->blocks[blk].bap[ch] = &s->bap_buffer[AC3_MAX_COEFS * (blk * s->channels + ch)]; |
||
883 | } |
||
884 | } |
||
885 | } |
||
886 | |||
887 | |||
888 | /**
|
||
889 | c36ce0f8 | Justin Ruggles | * Run the bit allocation with a given SNR offset.
|
890 | * This calculates the bit allocation pointers that will be used to determine
|
||
891 | * the quantization of each mantissa.
|
||
892 | 70fcd7ea | Justin Ruggles | * @return the number of bits needed for mantissas if the given SNR offset is
|
893 | * is used.
|
||
894 | c36ce0f8 | Justin Ruggles | */
|
895 | b5293036 | Justin Ruggles | static int bit_alloc(AC3EncodeContext *s, int snr_offset) |
896 | de6d9b64 | Fabrice Bellard | { |
897 | ce67b7cd | Justin Ruggles | int blk, ch;
|
898 | a0d763fc | Justin Ruggles | int mantissa_bits;
|
899 | 126a29b8 | Justin Ruggles | int mant_cnt[5]; |
900 | 319708da | Justin Ruggles | |
901 | a0d763fc | Justin Ruggles | snr_offset = (snr_offset - 240) << 2; |
902 | de6d9b64 | Fabrice Bellard | |
903 | 171bc51c | Justin Ruggles | reset_block_bap(s); |
904 | 70fcd7ea | Justin Ruggles | mantissa_bits = 0;
|
905 | ce67b7cd | Justin Ruggles | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
906 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
907 | 126a29b8 | Justin Ruggles | // initialize grouped mantissa counts. these are set so that they are
|
908 | // padded to the next whole group size when bits are counted in
|
||
909 | // compute_mantissa_size_final
|
||
910 | mant_cnt[0] = mant_cnt[3] = 0; |
||
911 | mant_cnt[1] = mant_cnt[2] = 2; |
||
912 | mant_cnt[4] = 1; |
||
913 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
914 | 795063db | Justin Ruggles | /* Currently the only bit allocation parameters which vary across
|
915 | blocks within a frame are the exponent values. We can take
|
||
916 | advantage of that by reusing the bit allocation pointers
|
||
917 | whenever we reuse exponents. */
|
||
918 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] == EXP_REUSE) {
|
919 | 795063db | Justin Ruggles | memcpy(block->bap[ch], s->blocks[blk-1].bap[ch], AC3_MAX_COEFS);
|
920 | } else {
|
||
921 | 68e6b099 | Justin Ruggles | ff_ac3_bit_alloc_calc_bap(block->mask[ch], block->psd[ch], 0,
|
922 | s->nb_coefs[ch], snr_offset, |
||
923 | s->bit_alloc.floor, ff_ac3_bap_tab, |
||
924 | block->bap[ch]); |
||
925 | 795063db | Justin Ruggles | } |
926 | 126a29b8 | Justin Ruggles | mantissa_bits += compute_mantissa_size(mant_cnt, block->bap[ch], s->nb_coefs[ch]); |
927 | de6d9b64 | Fabrice Bellard | } |
928 | 126a29b8 | Justin Ruggles | mantissa_bits += compute_mantissa_size_final(mant_cnt); |
929 | de6d9b64 | Fabrice Bellard | } |
930 | 70fcd7ea | Justin Ruggles | return mantissa_bits;
|
931 | de6d9b64 | Fabrice Bellard | } |
932 | |||
933 | 2f8ae522 | Justin Ruggles | |
934 | c36ce0f8 | Justin Ruggles | /**
|
935 | cb6247cb | Justin Ruggles | * Constant bitrate bit allocation search.
|
936 | * Find the largest SNR offset that will allow data to fit in the frame.
|
||
937 | c36ce0f8 | Justin Ruggles | */
|
938 | cb6247cb | Justin Ruggles | static int cbr_bit_allocation(AC3EncodeContext *s) |
939 | de6d9b64 | Fabrice Bellard | { |
940 | 8999944e | Justin Ruggles | int ch;
|
941 | 70fcd7ea | Justin Ruggles | int bits_left;
|
942 | 98e34e71 | Justin Ruggles | int snr_offset, snr_incr;
|
943 | de6d9b64 | Fabrice Bellard | |
944 | 70fcd7ea | Justin Ruggles | bits_left = 8 * s->frame_size - (s->frame_bits + s->exponent_bits);
|
945 | 7da4dc17 | Justin Ruggles | |
946 | a0d763fc | Justin Ruggles | snr_offset = s->coarse_snr_offset << 4;
|
947 | 7da4dc17 | Justin Ruggles | |
948 | 9c84a72a | Justin Ruggles | /* if previous frame SNR offset was 1023, check if current frame can also
|
949 | use SNR offset of 1023. if so, skip the search. */
|
||
950 | if ((snr_offset | s->fine_snr_offset[0]) == 1023) { |
||
951 | if (bit_alloc(s, 1023) <= bits_left) |
||
952 | return 0; |
||
953 | } |
||
954 | |||
955 | a0d763fc | Justin Ruggles | while (snr_offset >= 0 && |
956 | 171bc51c | Justin Ruggles | bit_alloc(s, snr_offset) > bits_left) { |
957 | a0d763fc | Justin Ruggles | snr_offset -= 64;
|
958 | 7da4dc17 | Justin Ruggles | } |
959 | 2d82d9b1 | Justin Ruggles | if (snr_offset < 0) |
960 | dc0bc0f8 | Justin Ruggles | return AVERROR(EINVAL);
|
961 | 7da4dc17 | Justin Ruggles | |
962 | 171bc51c | Justin Ruggles | FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); |
963 | 98e34e71 | Justin Ruggles | for (snr_incr = 64; snr_incr > 0; snr_incr >>= 2) { |
964 | 5128842e | Justin Ruggles | while (snr_offset + snr_incr <= 1023 && |
965 | 234b70d3 | Justin Ruggles | bit_alloc(s, snr_offset + snr_incr) <= bits_left) { |
966 | snr_offset += snr_incr; |
||
967 | FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); |
||
968 | } |
||
969 | de6d9b64 | Fabrice Bellard | } |
970 | 171bc51c | Justin Ruggles | FFSWAP(uint8_t *, s->bap_buffer, s->bap1_buffer); |
971 | reset_block_bap(s); |
||
972 | 115329f1 | Diego Biurrun | |
973 | a0d763fc | Justin Ruggles | s->coarse_snr_offset = snr_offset >> 4;
|
974 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) |
975 | a0d763fc | Justin Ruggles | s->fine_snr_offset[ch] = snr_offset & 0xF;
|
976 | 22c0b03c | Justin Ruggles | |
977 | de6d9b64 | Fabrice Bellard | return 0; |
978 | } |
||
979 | |||
980 | 2f8ae522 | Justin Ruggles | |
981 | c36ce0f8 | Justin Ruggles | /**
|
982 | 386268df | Justin Ruggles | * Downgrade exponent strategies to reduce the bits used by the exponents.
|
983 | * This is a fallback for when bit allocation fails with the normal exponent
|
||
984 | * strategies. Each time this function is run it only downgrades the
|
||
985 | * strategy in 1 channel of 1 block.
|
||
986 | * @return non-zero if downgrade was unsuccessful
|
||
987 | */
|
||
988 | static int downgrade_exponents(AC3EncodeContext *s) |
||
989 | { |
||
990 | int ch, blk;
|
||
991 | |||
992 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
993 | for (blk = AC3_MAX_BLOCKS-1; blk >= 0; blk--) { |
||
994 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] == EXP_D15) {
|
995 | s->exp_strategy[ch][blk] = EXP_D25; |
||
996 | 386268df | Justin Ruggles | return 0; |
997 | } |
||
998 | } |
||
999 | } |
||
1000 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
1001 | for (blk = AC3_MAX_BLOCKS-1; blk >= 0; blk--) { |
||
1002 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] == EXP_D25) {
|
1003 | s->exp_strategy[ch][blk] = EXP_D45; |
||
1004 | 386268df | Justin Ruggles | return 0; |
1005 | } |
||
1006 | } |
||
1007 | } |
||
1008 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
1009 | /* block 0 cannot reuse exponents, so only downgrade D45 to REUSE if
|
||
1010 | the block number > 0 */
|
||
1011 | for (blk = AC3_MAX_BLOCKS-1; blk > 0; blk--) { |
||
1012 | 0429e4a6 | Justin Ruggles | if (s->exp_strategy[ch][blk] > EXP_REUSE) {
|
1013 | s->exp_strategy[ch][blk] = EXP_REUSE; |
||
1014 | 386268df | Justin Ruggles | return 0; |
1015 | } |
||
1016 | } |
||
1017 | } |
||
1018 | return -1; |
||
1019 | } |
||
1020 | |||
1021 | |||
1022 | /**
|
||
1023 | * Reduce the bandwidth to reduce the number of bits used for a given SNR offset.
|
||
1024 | * This is a second fallback for when bit allocation still fails after exponents
|
||
1025 | * have been downgraded.
|
||
1026 | * @return non-zero if bandwidth reduction was unsuccessful
|
||
1027 | */
|
||
1028 | static int reduce_bandwidth(AC3EncodeContext *s, int min_bw_code) |
||
1029 | { |
||
1030 | int ch;
|
||
1031 | |||
1032 | if (s->bandwidth_code[0] > min_bw_code) { |
||
1033 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
1034 | s->bandwidth_code[ch]--; |
||
1035 | s->nb_coefs[ch] = s->bandwidth_code[ch] * 3 + 73; |
||
1036 | } |
||
1037 | return 0; |
||
1038 | } |
||
1039 | return -1; |
||
1040 | } |
||
1041 | |||
1042 | |||
1043 | /**
|
||
1044 | cb6247cb | Justin Ruggles | * Perform bit allocation search.
|
1045 | * Finds the SNR offset value that maximizes quality and fits in the specified
|
||
1046 | * frame size. Output is the SNR offset and a set of bit allocation pointers
|
||
1047 | * used to quantize the mantissas.
|
||
1048 | */
|
||
1049 | static int compute_bit_allocation(AC3EncodeContext *s) |
||
1050 | { |
||
1051 | 386268df | Justin Ruggles | int ret;
|
1052 | |||
1053 | cb6247cb | Justin Ruggles | count_frame_bits(s); |
1054 | |||
1055 | bit_alloc_masking(s); |
||
1056 | |||
1057 | 386268df | Justin Ruggles | ret = cbr_bit_allocation(s); |
1058 | while (ret) {
|
||
1059 | /* fallback 1: downgrade exponents */
|
||
1060 | if (!downgrade_exponents(s)) {
|
||
1061 | extract_exponents(s); |
||
1062 | encode_exponents(s); |
||
1063 | group_exponents(s); |
||
1064 | ret = compute_bit_allocation(s); |
||
1065 | continue;
|
||
1066 | } |
||
1067 | |||
1068 | /* fallback 2: reduce bandwidth */
|
||
1069 | /* only do this if the user has not specified a specific cutoff
|
||
1070 | frequency */
|
||
1071 | if (!s->cutoff && !reduce_bandwidth(s, 0)) { |
||
1072 | process_exponents(s); |
||
1073 | ret = compute_bit_allocation(s); |
||
1074 | continue;
|
||
1075 | } |
||
1076 | |||
1077 | /* fallbacks were not enough... */
|
||
1078 | break;
|
||
1079 | } |
||
1080 | |||
1081 | return ret;
|
||
1082 | cb6247cb | Justin Ruggles | } |
1083 | |||
1084 | |||
1085 | /**
|
||
1086 | c36ce0f8 | Justin Ruggles | * Symmetric quantization on 'levels' levels.
|
1087 | */
|
||
1088 | de6d9b64 | Fabrice Bellard | static inline int sym_quant(int c, int e, int levels) |
1089 | { |
||
1090 | int v;
|
||
1091 | |||
1092 | if (c >= 0) { |
||
1093 | 8d67072f | Fabrice Bellard | v = (levels * (c << e)) >> 24;
|
1094 | v = (v + 1) >> 1; |
||
1095 | de6d9b64 | Fabrice Bellard | v = (levels >> 1) + v;
|
1096 | } else {
|
||
1097 | 8d67072f | Fabrice Bellard | v = (levels * ((-c) << e)) >> 24;
|
1098 | v = (v + 1) >> 1; |
||
1099 | de6d9b64 | Fabrice Bellard | v = (levels >> 1) - v;
|
1100 | } |
||
1101 | 2d82d9b1 | Justin Ruggles | assert(v >= 0 && v < levels);
|
1102 | de6d9b64 | Fabrice Bellard | return v;
|
1103 | } |
||
1104 | |||
1105 | 2f8ae522 | Justin Ruggles | |
1106 | c36ce0f8 | Justin Ruggles | /**
|
1107 | * Asymmetric quantization on 2^qbits levels.
|
||
1108 | */
|
||
1109 | de6d9b64 | Fabrice Bellard | static inline int asym_quant(int c, int e, int qbits) |
1110 | { |
||
1111 | int lshift, m, v;
|
||
1112 | |||
1113 | lshift = e + qbits - 24;
|
||
1114 | if (lshift >= 0) |
||
1115 | v = c << lshift; |
||
1116 | else
|
||
1117 | v = c >> (-lshift); |
||
1118 | /* rounding */
|
||
1119 | v = (v + 1) >> 1; |
||
1120 | m = (1 << (qbits-1)); |
||
1121 | if (v >= m)
|
||
1122 | v = m - 1;
|
||
1123 | assert(v >= -m); |
||
1124 | return v & ((1 << qbits)-1); |
||
1125 | } |
||
1126 | |||
1127 | 2f8ae522 | Justin Ruggles | |
1128 | c36ce0f8 | Justin Ruggles | /**
|
1129 | b6a1e523 | Justin Ruggles | * Quantize a set of mantissas for a single channel in a single block.
|
1130 | */
|
||
1131 | ac05f903 | Justin Ruggles | static void quantize_mantissas_blk_ch(AC3EncodeContext *s, int32_t *fixed_coef, |
1132 | b5293036 | Justin Ruggles | int8_t exp_shift, uint8_t *exp, |
1133 | uint8_t *bap, uint16_t *qmant, int n)
|
||
1134 | b6a1e523 | Justin Ruggles | { |
1135 | int i;
|
||
1136 | |||
1137 | for (i = 0; i < n; i++) { |
||
1138 | int v;
|
||
1139 | ac05f903 | Justin Ruggles | int c = fixed_coef[i];
|
1140 | 27af78cf | Justin Ruggles | int e = exp[i] - exp_shift;
|
1141 | b6a1e523 | Justin Ruggles | int b = bap[i];
|
1142 | switch (b) {
|
||
1143 | case 0: |
||
1144 | v = 0;
|
||
1145 | break;
|
||
1146 | case 1: |
||
1147 | v = sym_quant(c, e, 3);
|
||
1148 | switch (s->mant1_cnt) {
|
||
1149 | case 0: |
||
1150 | s->qmant1_ptr = &qmant[i]; |
||
1151 | v = 9 * v;
|
||
1152 | s->mant1_cnt = 1;
|
||
1153 | break;
|
||
1154 | case 1: |
||
1155 | *s->qmant1_ptr += 3 * v;
|
||
1156 | s->mant1_cnt = 2;
|
||
1157 | v = 128;
|
||
1158 | break;
|
||
1159 | default:
|
||
1160 | *s->qmant1_ptr += v; |
||
1161 | s->mant1_cnt = 0;
|
||
1162 | v = 128;
|
||
1163 | break;
|
||
1164 | } |
||
1165 | break;
|
||
1166 | case 2: |
||
1167 | v = sym_quant(c, e, 5);
|
||
1168 | switch (s->mant2_cnt) {
|
||
1169 | case 0: |
||
1170 | s->qmant2_ptr = &qmant[i]; |
||
1171 | v = 25 * v;
|
||
1172 | s->mant2_cnt = 1;
|
||
1173 | break;
|
||
1174 | case 1: |
||
1175 | *s->qmant2_ptr += 5 * v;
|
||
1176 | s->mant2_cnt = 2;
|
||
1177 | v = 128;
|
||
1178 | break;
|
||
1179 | default:
|
||
1180 | *s->qmant2_ptr += v; |
||
1181 | s->mant2_cnt = 0;
|
||
1182 | v = 128;
|
||
1183 | break;
|
||
1184 | } |
||
1185 | break;
|
||
1186 | case 3: |
||
1187 | v = sym_quant(c, e, 7);
|
||
1188 | break;
|
||
1189 | case 4: |
||
1190 | v = sym_quant(c, e, 11);
|
||
1191 | switch (s->mant4_cnt) {
|
||
1192 | case 0: |
||
1193 | s->qmant4_ptr = &qmant[i]; |
||
1194 | v = 11 * v;
|
||
1195 | s->mant4_cnt = 1;
|
||
1196 | break;
|
||
1197 | default:
|
||
1198 | *s->qmant4_ptr += v; |
||
1199 | s->mant4_cnt = 0;
|
||
1200 | v = 128;
|
||
1201 | break;
|
||
1202 | } |
||
1203 | break;
|
||
1204 | case 5: |
||
1205 | v = sym_quant(c, e, 15);
|
||
1206 | break;
|
||
1207 | case 14: |
||
1208 | v = asym_quant(c, e, 14);
|
||
1209 | break;
|
||
1210 | case 15: |
||
1211 | v = asym_quant(c, e, 16);
|
||
1212 | break;
|
||
1213 | default:
|
||
1214 | v = asym_quant(c, e, b - 1);
|
||
1215 | break;
|
||
1216 | } |
||
1217 | qmant[i] = v; |
||
1218 | } |
||
1219 | } |
||
1220 | |||
1221 | |||
1222 | /**
|
||
1223 | * Quantize mantissas using coefficients, exponents, and bit allocation pointers.
|
||
1224 | */
|
||
1225 | 266d24be | Justin Ruggles | static void quantize_mantissas(AC3EncodeContext *s) |
1226 | b6a1e523 | Justin Ruggles | { |
1227 | int blk, ch;
|
||
1228 | |||
1229 | |||
1230 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
1231 | 5901cebe | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
1232 | b6a1e523 | Justin Ruggles | s->mant1_cnt = s->mant2_cnt = s->mant4_cnt = 0;
|
1233 | s->qmant1_ptr = s->qmant2_ptr = s->qmant4_ptr = NULL;
|
||
1234 | |||
1235 | for (ch = 0; ch < s->channels; ch++) { |
||
1236 | ac05f903 | Justin Ruggles | quantize_mantissas_blk_ch(s, block->fixed_coef[ch], block->exp_shift[ch], |
1237 | 27af78cf | Justin Ruggles | block->exp[ch], block->bap[ch], |
1238 | 5901cebe | Justin Ruggles | block->qmant[ch], s->nb_coefs[ch]); |
1239 | b6a1e523 | Justin Ruggles | } |
1240 | } |
||
1241 | } |
||
1242 | |||
1243 | |||
1244 | /**
|
||
1245 | 5b44ede0 | Justin Ruggles | * Write the AC-3 frame header to the output bitstream.
|
1246 | */
|
||
1247 | static void output_frame_header(AC3EncodeContext *s) |
||
1248 | { |
||
1249 | put_bits(&s->pb, 16, 0x0b77); /* frame header */ |
||
1250 | put_bits(&s->pb, 16, 0); /* crc1: will be filled later */ |
||
1251 | put_bits(&s->pb, 2, s->bit_alloc.sr_code);
|
||
1252 | put_bits(&s->pb, 6, s->frame_size_code + (s->frame_size - s->frame_size_min) / 2); |
||
1253 | put_bits(&s->pb, 5, s->bitstream_id);
|
||
1254 | put_bits(&s->pb, 3, s->bitstream_mode);
|
||
1255 | put_bits(&s->pb, 3, s->channel_mode);
|
||
1256 | if ((s->channel_mode & 0x01) && s->channel_mode != AC3_CHMODE_MONO) |
||
1257 | put_bits(&s->pb, 2, 1); /* XXX -4.5 dB */ |
||
1258 | if (s->channel_mode & 0x04) |
||
1259 | put_bits(&s->pb, 2, 1); /* XXX -6 dB */ |
||
1260 | if (s->channel_mode == AC3_CHMODE_STEREO)
|
||
1261 | put_bits(&s->pb, 2, 0); /* surround not indicated */ |
||
1262 | put_bits(&s->pb, 1, s->lfe_on); /* LFE */ |
||
1263 | put_bits(&s->pb, 5, 31); /* dialog norm: -31 db */ |
||
1264 | put_bits(&s->pb, 1, 0); /* no compression control word */ |
||
1265 | put_bits(&s->pb, 1, 0); /* no lang code */ |
||
1266 | put_bits(&s->pb, 1, 0); /* no audio production info */ |
||
1267 | put_bits(&s->pb, 1, 0); /* no copyright */ |
||
1268 | put_bits(&s->pb, 1, 1); /* original bitstream */ |
||
1269 | put_bits(&s->pb, 1, 0); /* no time code 1 */ |
||
1270 | put_bits(&s->pb, 1, 0); /* no time code 2 */ |
||
1271 | put_bits(&s->pb, 1, 0); /* no additional bit stream info */ |
||
1272 | } |
||
1273 | |||
1274 | |||
1275 | /**
|
||
1276 | c36ce0f8 | Justin Ruggles | * Write one audio block to the output bitstream.
|
1277 | */
|
||
1278 | 5fc2e007 | Justin Ruggles | static void output_audio_block(AC3EncodeContext *s, int blk) |
1279 | de6d9b64 | Fabrice Bellard | { |
1280 | f94bacc5 | Justin Ruggles | int ch, i, baie, rbnd;
|
1281 | 5fc2e007 | Justin Ruggles | AC3Block *block = &s->blocks[blk]; |
1282 | de6d9b64 | Fabrice Bellard | |
1283 | 2d82d9b1 | Justin Ruggles | /* block switching */
|
1284 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->fbw_channels; ch++) |
1285 | 2d82d9b1 | Justin Ruggles | put_bits(&s->pb, 1, 0); |
1286 | |||
1287 | /* dither flags */
|
||
1288 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->fbw_channels; ch++) |
1289 | 2d82d9b1 | Justin Ruggles | put_bits(&s->pb, 1, 1); |
1290 | |||
1291 | /* dynamic range codes */
|
||
1292 | put_bits(&s->pb, 1, 0); |
||
1293 | |||
1294 | /* channel coupling */
|
||
1295 | 5fc2e007 | Justin Ruggles | if (!blk) {
|
1296 | de6d9b64 | Fabrice Bellard | put_bits(&s->pb, 1, 1); /* coupling strategy present */ |
1297 | put_bits(&s->pb, 1, 0); /* no coupling strategy */ |
||
1298 | } else {
|
||
1299 | put_bits(&s->pb, 1, 0); /* no new coupling strategy */ |
||
1300 | } |
||
1301 | |||
1302 | 2d82d9b1 | Justin Ruggles | /* stereo rematrixing */
|
1303 | 6a988808 | Justin Ruggles | if (s->channel_mode == AC3_CHMODE_STEREO) {
|
1304 | dc7e07ac | Justin Ruggles | put_bits(&s->pb, 1, block->new_rematrixing_strategy);
|
1305 | if (block->new_rematrixing_strategy) {
|
||
1306 | /* rematrixing flags */
|
||
1307 | 6a988808 | Justin Ruggles | for (rbnd = 0; rbnd < 4; rbnd++) |
1308 | dc7e07ac | Justin Ruggles | put_bits(&s->pb, 1, block->rematrixing_flags[rbnd]);
|
1309 | 6a988808 | Justin Ruggles | } |
1310 | } |
||
1311 | de6d9b64 | Fabrice Bellard | |
1312 | /* exponent strategy */
|
||
1313 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->fbw_channels; ch++) |
1314 | 5fc2e007 | Justin Ruggles | put_bits(&s->pb, 2, s->exp_strategy[ch][blk]);
|
1315 | 6a988808 | Justin Ruggles | if (s->lfe_on)
|
1316 | 5fc2e007 | Justin Ruggles | put_bits(&s->pb, 1, s->exp_strategy[s->lfe_channel][blk]);
|
1317 | 30b68f33 | Zdenek Kabelac | |
1318 | 6a988808 | Justin Ruggles | /* bandwidth */
|
1319 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
1320 | 5fc2e007 | Justin Ruggles | if (s->exp_strategy[ch][blk] != EXP_REUSE)
|
1321 | 2d2692eb | Justin Ruggles | put_bits(&s->pb, 6, s->bandwidth_code[ch]);
|
1322 | de6d9b64 | Fabrice Bellard | } |
1323 | 115329f1 | Diego Biurrun | |
1324 | de6d9b64 | Fabrice Bellard | /* exponents */
|
1325 | 2d2692eb | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
1326 | e86ea34d | Justin Ruggles | int nb_groups;
|
1327 | |||
1328 | 5fc2e007 | Justin Ruggles | if (s->exp_strategy[ch][blk] == EXP_REUSE)
|
1329 | de6d9b64 | Fabrice Bellard | continue;
|
1330 | |||
1331 | 2d82d9b1 | Justin Ruggles | /* DC exponent */
|
1332 | 5901cebe | Justin Ruggles | put_bits(&s->pb, 4, block->grouped_exp[ch][0]); |
1333 | f94bacc5 | Justin Ruggles | |
1334 | 2d82d9b1 | Justin Ruggles | /* exponent groups */
|
1335 | 5fc2e007 | Justin Ruggles | nb_groups = exponent_group_tab[s->exp_strategy[ch][blk]-1][s->nb_coefs[ch]];
|
1336 | e86ea34d | Justin Ruggles | for (i = 1; i <= nb_groups; i++) |
1337 | 5901cebe | Justin Ruggles | put_bits(&s->pb, 7, block->grouped_exp[ch][i]);
|
1338 | de6d9b64 | Fabrice Bellard | |
1339 | 2d82d9b1 | Justin Ruggles | /* gain range info */
|
1340 | bb270c08 | Diego Biurrun | if (ch != s->lfe_channel)
|
1341 | 2d82d9b1 | Justin Ruggles | put_bits(&s->pb, 2, 0); |
1342 | de6d9b64 | Fabrice Bellard | } |
1343 | |||
1344 | /* bit allocation info */
|
||
1345 | 5fc2e007 | Justin Ruggles | baie = (blk == 0);
|
1346 | de6d9b64 | Fabrice Bellard | put_bits(&s->pb, 1, baie);
|
1347 | if (baie) {
|
||
1348 | 5ce21342 | Justin Ruggles | put_bits(&s->pb, 2, s->slow_decay_code);
|
1349 | put_bits(&s->pb, 2, s->fast_decay_code);
|
||
1350 | put_bits(&s->pb, 2, s->slow_gain_code);
|
||
1351 | put_bits(&s->pb, 2, s->db_per_bit_code);
|
||
1352 | put_bits(&s->pb, 3, s->floor_code);
|
||
1353 | de6d9b64 | Fabrice Bellard | } |
1354 | |||
1355 | /* snr offset */
|
||
1356 | 6a988808 | Justin Ruggles | put_bits(&s->pb, 1, baie);
|
1357 | de6d9b64 | Fabrice Bellard | if (baie) {
|
1358 | 5ce21342 | Justin Ruggles | put_bits(&s->pb, 6, s->coarse_snr_offset);
|
1359 | 6a988808 | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
1360 | 5ce21342 | Justin Ruggles | put_bits(&s->pb, 4, s->fine_snr_offset[ch]);
|
1361 | put_bits(&s->pb, 3, s->fast_gain_code[ch]);
|
||
1362 | de6d9b64 | Fabrice Bellard | } |
1363 | } |
||
1364 | 115329f1 | Diego Biurrun | |
1365 | de6d9b64 | Fabrice Bellard | put_bits(&s->pb, 1, 0); /* no delta bit allocation */ |
1366 | put_bits(&s->pb, 1, 0); /* no data to skip */ |
||
1367 | |||
1368 | 2d82d9b1 | Justin Ruggles | /* mantissas */
|
1369 | 2d2692eb | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) { |
1370 | de6d9b64 | Fabrice Bellard | int b, q;
|
1371 | 6a988808 | Justin Ruggles | for (i = 0; i < s->nb_coefs[ch]; i++) { |
1372 | 5901cebe | Justin Ruggles | q = block->qmant[ch][i]; |
1373 | 171bc51c | Justin Ruggles | b = block->bap[ch][i]; |
1374 | 6a988808 | Justin Ruggles | switch (b) {
|
1375 | case 0: break; |
||
1376 | case 1: if (q != 128) put_bits(&s->pb, 5, q); break; |
||
1377 | case 2: if (q != 128) put_bits(&s->pb, 7, q); break; |
||
1378 | case 3: put_bits(&s->pb, 3, q); break; |
||
1379 | case 4: if (q != 128) put_bits(&s->pb, 7, q); break; |
||
1380 | case 14: put_bits(&s->pb, 14, q); break; |
||
1381 | case 15: put_bits(&s->pb, 16, q); break; |
||
1382 | default: put_bits(&s->pb, b-1, q); break; |
||
1383 | de6d9b64 | Fabrice Bellard | } |
1384 | } |
||
1385 | } |
||
1386 | } |
||
1387 | |||
1388 | 2f8ae522 | Justin Ruggles | |
1389 | c36ce0f8 | Justin Ruggles | /** CRC-16 Polynomial */
|
1390 | de6d9b64 | Fabrice Bellard | #define CRC16_POLY ((1 << 0) | (1 << 2) | (1 << 15) | (1 << 16)) |
1391 | |||
1392 | 2f8ae522 | Justin Ruggles | |
1393 | de6d9b64 | Fabrice Bellard | static unsigned int mul_poly(unsigned int a, unsigned int b, unsigned int poly) |
1394 | { |
||
1395 | unsigned int c; |
||
1396 | |||
1397 | c = 0;
|
||
1398 | while (a) {
|
||
1399 | if (a & 1) |
||
1400 | c ^= b; |
||
1401 | a = a >> 1;
|
||
1402 | b = b << 1;
|
||
1403 | if (b & (1 << 16)) |
||
1404 | b ^= poly; |
||
1405 | } |
||
1406 | return c;
|
||
1407 | } |
||
1408 | |||
1409 | 2f8ae522 | Justin Ruggles | |
1410 | de6d9b64 | Fabrice Bellard | static unsigned int pow_poly(unsigned int a, unsigned int n, unsigned int poly) |
1411 | { |
||
1412 | unsigned int r; |
||
1413 | r = 1;
|
||
1414 | while (n) {
|
||
1415 | if (n & 1) |
||
1416 | r = mul_poly(r, a, poly); |
||
1417 | a = mul_poly(a, a, poly); |
||
1418 | n >>= 1;
|
||
1419 | } |
||
1420 | return r;
|
||
1421 | } |
||
1422 | |||
1423 | 2f8ae522 | Justin Ruggles | |
1424 | c36ce0f8 | Justin Ruggles | /**
|
1425 | * Fill the end of the frame with 0's and compute the two CRCs.
|
||
1426 | */
|
||
1427 | 1971ab6e | Justin Ruggles | static void output_frame_end(AC3EncodeContext *s) |
1428 | de6d9b64 | Fabrice Bellard | { |
1429 | a897423b | Justin Ruggles | const AVCRC *crc_ctx = av_crc_get_table(AV_CRC_16_ANSI);
|
1430 | e96dc767 | Justin Ruggles | int frame_size_58, pad_bytes, crc1, crc2_partial, crc2, crc_inv;
|
1431 | 0c1a9eda | Zdenek Kabelac | uint8_t *frame; |
1432 | de6d9b64 | Fabrice Bellard | |
1433 | 0e9b0643 | Justin Ruggles | frame_size_58 = ((s->frame_size >> 2) + (s->frame_size >> 4)) << 1; |
1434 | 2d82d9b1 | Justin Ruggles | |
1435 | /* pad the remainder of the frame with zeros */
|
||
1436 | de6d9b64 | Fabrice Bellard | flush_put_bits(&s->pb); |
1437 | frame = s->pb.buf; |
||
1438 | 427e2293 | Justin Ruggles | pad_bytes = s->frame_size - (put_bits_ptr(&s->pb) - frame) - 2;
|
1439 | eed00252 | Justin Ruggles | assert(pad_bytes >= 0);
|
1440 | if (pad_bytes > 0) |
||
1441 | memset(put_bits_ptr(&s->pb), 0, pad_bytes);
|
||
1442 | 115329f1 | Diego Biurrun | |
1443 | 2d82d9b1 | Justin Ruggles | /* compute crc1 */
|
1444 | /* this is not so easy because it is at the beginning of the data... */
|
||
1445 | b51c740e | Justin Ruggles | crc1 = av_bswap16(av_crc(crc_ctx, 0, frame + 4, frame_size_58 - 4)); |
1446 | a81d7c6a | Justin Ruggles | crc_inv = s->crc_inv[s->frame_size > s->frame_size_min]; |
1447 | 6a988808 | Justin Ruggles | crc1 = mul_poly(crc_inv, crc1, CRC16_POLY); |
1448 | AV_WB16(frame + 2, crc1);
|
||
1449 | 115329f1 | Diego Biurrun | |
1450 | 2d82d9b1 | Justin Ruggles | /* compute crc2 */
|
1451 | e96dc767 | Justin Ruggles | crc2_partial = av_crc(crc_ctx, 0, frame + frame_size_58,
|
1452 | s->frame_size - frame_size_58 - 3);
|
||
1453 | crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); |
||
1454 | /* ensure crc2 does not match sync word by flipping crcrsv bit if needed */
|
||
1455 | if (crc2 == 0x770B) { |
||
1456 | frame[s->frame_size - 3] ^= 0x1; |
||
1457 | crc2 = av_crc(crc_ctx, crc2_partial, frame + s->frame_size - 3, 1); |
||
1458 | } |
||
1459 | crc2 = av_bswap16(crc2); |
||
1460 | 0e9b0643 | Justin Ruggles | AV_WB16(frame + s->frame_size - 2, crc2);
|
1461 | de6d9b64 | Fabrice Bellard | } |
1462 | |||
1463 | 2f8ae522 | Justin Ruggles | |
1464 | c36ce0f8 | Justin Ruggles | /**
|
1465 | 67d979fe | Justin Ruggles | * Write the frame to the output bitstream.
|
1466 | */
|
||
1467 | b5293036 | Justin Ruggles | static void output_frame(AC3EncodeContext *s, unsigned char *frame) |
1468 | 67d979fe | Justin Ruggles | { |
1469 | int blk;
|
||
1470 | |||
1471 | init_put_bits(&s->pb, frame, AC3_MAX_CODED_FRAME_SIZE); |
||
1472 | |||
1473 | output_frame_header(s); |
||
1474 | |||
1475 | 2d82d9b1 | Justin Ruggles | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) |
1476 | 266d24be | Justin Ruggles | output_audio_block(s, blk); |
1477 | 67d979fe | Justin Ruggles | |
1478 | output_frame_end(s); |
||
1479 | } |
||
1480 | |||
1481 | |||
1482 | /**
|
||
1483 | c36ce0f8 | Justin Ruggles | * Encode a single AC-3 frame.
|
1484 | */
|
||
1485 | b5293036 | Justin Ruggles | static int ac3_encode_frame(AVCodecContext *avctx, unsigned char *frame, |
1486 | int buf_size, void *data) |
||
1487 | de6d9b64 | Fabrice Bellard | { |
1488 | AC3EncodeContext *s = avctx->priv_data; |
||
1489 | 0cbd5ff7 | Justin Ruggles | const SampleType *samples = data;
|
1490 | dc0bc0f8 | Justin Ruggles | int ret;
|
1491 | de6d9b64 | Fabrice Bellard | |
1492 | 160d85f5 | Justin Ruggles | if (s->bit_alloc.sr_code == 1) |
1493 | adjust_frame_size(s); |
||
1494 | |||
1495 | 266d24be | Justin Ruggles | deinterleave_input_samples(s, samples); |
1496 | 12ed6226 | Justin Ruggles | |
1497 | 266d24be | Justin Ruggles | apply_mdct(s); |
1498 | 115329f1 | Diego Biurrun | |
1499 | dc7e07ac | Justin Ruggles | compute_rematrixing_strategy(s); |
1500 | |||
1501 | ac05f903 | Justin Ruggles | scale_coefficients(s); |
1502 | |||
1503 | dc7e07ac | Justin Ruggles | apply_rematrixing(s); |
1504 | |||
1505 | 266d24be | Justin Ruggles | process_exponents(s); |
1506 | de6d9b64 | Fabrice Bellard | |
1507 | 266d24be | Justin Ruggles | ret = compute_bit_allocation(s); |
1508 | dc0bc0f8 | Justin Ruggles | if (ret) {
|
1509 | av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
|
||
1510 | return ret;
|
||
1511 | } |
||
1512 | 084f5c5a | Justin Ruggles | |
1513 | 266d24be | Justin Ruggles | quantize_mantissas(s); |
1514 | b6a1e523 | Justin Ruggles | |
1515 | 266d24be | Justin Ruggles | output_frame(s, frame); |
1516 | 1971ab6e | Justin Ruggles | |
1517 | 427e2293 | Justin Ruggles | return s->frame_size;
|
1518 | de6d9b64 | Fabrice Bellard | } |
1519 | |||
1520 | 2f8ae522 | Justin Ruggles | |
1521 | c36ce0f8 | Justin Ruggles | /**
|
1522 | * Finalize encoding and free any memory allocated by the encoder.
|
||
1523 | */
|
||
1524 | a0a9204e | Justin Ruggles | static av_cold int ac3_encode_close(AVCodecContext *avctx) |
1525 | 492cd3a9 | Michael Niedermayer | { |
1526 | e8d21fba | Justin Ruggles | int blk, ch;
|
1527 | 171bc51c | Justin Ruggles | AC3EncodeContext *s = avctx->priv_data; |
1528 | |||
1529 | e8d21fba | Justin Ruggles | for (ch = 0; ch < s->channels; ch++) |
1530 | av_freep(&s->planar_samples[ch]); |
||
1531 | av_freep(&s->planar_samples); |
||
1532 | 171bc51c | Justin Ruggles | av_freep(&s->bap_buffer); |
1533 | av_freep(&s->bap1_buffer); |
||
1534 | b6f6204d | Justin Ruggles | av_freep(&s->mdct_coef_buffer); |
1535 | ac05f903 | Justin Ruggles | av_freep(&s->fixed_coef_buffer); |
1536 | b6f6204d | Justin Ruggles | av_freep(&s->exp_buffer); |
1537 | av_freep(&s->grouped_exp_buffer); |
||
1538 | av_freep(&s->psd_buffer); |
||
1539 | av_freep(&s->band_psd_buffer); |
||
1540 | av_freep(&s->mask_buffer); |
||
1541 | av_freep(&s->qmant_buffer); |
||
1542 | 171bc51c | Justin Ruggles | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
1543 | AC3Block *block = &s->blocks[blk]; |
||
1544 | av_freep(&block->bap); |
||
1545 | b6f6204d | Justin Ruggles | av_freep(&block->mdct_coef); |
1546 | ac05f903 | Justin Ruggles | av_freep(&block->fixed_coef); |
1547 | b6f6204d | Justin Ruggles | av_freep(&block->exp); |
1548 | av_freep(&block->grouped_exp); |
||
1549 | av_freep(&block->psd); |
||
1550 | av_freep(&block->band_psd); |
||
1551 | av_freep(&block->mask); |
||
1552 | av_freep(&block->qmant); |
||
1553 | 171bc51c | Justin Ruggles | } |
1554 | |||
1555 | c41ac4f8 | Justin Ruggles | mdct_end(&s->mdct); |
1556 | |||
1557 | 492cd3a9 | Michael Niedermayer | av_freep(&avctx->coded_frame); |
1558 | ef9f7306 | Måns Rullgård | return 0; |
1559 | 492cd3a9 | Michael Niedermayer | } |
1560 | |||
1561 | 2f8ae522 | Justin Ruggles | |
1562 | c36ce0f8 | Justin Ruggles | /**
|
1563 | * Set channel information during initialization.
|
||
1564 | */
|
||
1565 | e77fd066 | Justin Ruggles | static av_cold int set_channel_info(AC3EncodeContext *s, int channels, |
1566 | int64_t *channel_layout) |
||
1567 | { |
||
1568 | int ch_layout;
|
||
1569 | |||
1570 | if (channels < 1 || channels > AC3_MAX_CHANNELS) |
||
1571 | ddf63d37 | Justin Ruggles | return AVERROR(EINVAL);
|
1572 | e77fd066 | Justin Ruggles | if ((uint64_t)*channel_layout > 0x7FF) |
1573 | ddf63d37 | Justin Ruggles | return AVERROR(EINVAL);
|
1574 | e77fd066 | Justin Ruggles | ch_layout = *channel_layout; |
1575 | if (!ch_layout)
|
||
1576 | ch_layout = avcodec_guess_channel_layout(channels, CODEC_ID_AC3, NULL);
|
||
1577 | if (av_get_channel_layout_nb_channels(ch_layout) != channels)
|
||
1578 | ddf63d37 | Justin Ruggles | return AVERROR(EINVAL);
|
1579 | e77fd066 | Justin Ruggles | |
1580 | s->lfe_on = !!(ch_layout & AV_CH_LOW_FREQUENCY); |
||
1581 | s->channels = channels; |
||
1582 | s->fbw_channels = channels - s->lfe_on; |
||
1583 | s->lfe_channel = s->lfe_on ? s->fbw_channels : -1;
|
||
1584 | if (s->lfe_on)
|
||
1585 | ch_layout -= AV_CH_LOW_FREQUENCY; |
||
1586 | |||
1587 | switch (ch_layout) {
|
||
1588 | case AV_CH_LAYOUT_MONO: s->channel_mode = AC3_CHMODE_MONO; break; |
||
1589 | case AV_CH_LAYOUT_STEREO: s->channel_mode = AC3_CHMODE_STEREO; break; |
||
1590 | case AV_CH_LAYOUT_SURROUND: s->channel_mode = AC3_CHMODE_3F; break; |
||
1591 | case AV_CH_LAYOUT_2_1: s->channel_mode = AC3_CHMODE_2F1R; break; |
||
1592 | case AV_CH_LAYOUT_4POINT0: s->channel_mode = AC3_CHMODE_3F1R; break; |
||
1593 | case AV_CH_LAYOUT_QUAD:
|
||
1594 | case AV_CH_LAYOUT_2_2: s->channel_mode = AC3_CHMODE_2F2R; break; |
||
1595 | case AV_CH_LAYOUT_5POINT0:
|
||
1596 | case AV_CH_LAYOUT_5POINT0_BACK: s->channel_mode = AC3_CHMODE_3F2R; break; |
||
1597 | default:
|
||
1598 | ddf63d37 | Justin Ruggles | return AVERROR(EINVAL);
|
1599 | e77fd066 | Justin Ruggles | } |
1600 | |||
1601 | s->channel_map = ff_ac3_enc_channel_map[s->channel_mode][s->lfe_on]; |
||
1602 | *channel_layout = ch_layout; |
||
1603 | if (s->lfe_on)
|
||
1604 | *channel_layout |= AV_CH_LOW_FREQUENCY; |
||
1605 | |||
1606 | return 0; |
||
1607 | } |
||
1608 | |||
1609 | 2f8ae522 | Justin Ruggles | |
1610 | 8f60f70d | Justin Ruggles | static av_cold int validate_options(AVCodecContext *avctx, AC3EncodeContext *s) |
1611 | e77fd066 | Justin Ruggles | { |
1612 | ddf63d37 | Justin Ruggles | int i, ret;
|
1613 | e77fd066 | Justin Ruggles | |
1614 | e0685bc9 | Justin Ruggles | /* validate channel layout */
|
1615 | e77fd066 | Justin Ruggles | if (!avctx->channel_layout) {
|
1616 | av_log(avctx, AV_LOG_WARNING, "No channel layout specified. The "
|
||
1617 | "encoder will guess the layout, but it "
|
||
1618 | "might be incorrect.\n");
|
||
1619 | } |
||
1620 | ddf63d37 | Justin Ruggles | ret = set_channel_info(s, avctx->channels, &avctx->channel_layout); |
1621 | if (ret) {
|
||
1622 | e77fd066 | Justin Ruggles | av_log(avctx, AV_LOG_ERROR, "invalid channel layout\n");
|
1623 | ddf63d37 | Justin Ruggles | return ret;
|
1624 | e77fd066 | Justin Ruggles | } |
1625 | |||
1626 | e0685bc9 | Justin Ruggles | /* validate sample rate */
|
1627 | 99ca4f73 | Justin Ruggles | for (i = 0; i < 9; i++) { |
1628 | if ((ff_ac3_sample_rate_tab[i / 3] >> (i % 3)) == avctx->sample_rate) |
||
1629 | break;
|
||
1630 | e77fd066 | Justin Ruggles | } |
1631 | 99ca4f73 | Justin Ruggles | if (i == 9) { |
1632 | ddf63d37 | Justin Ruggles | av_log(avctx, AV_LOG_ERROR, "invalid sample rate\n");
|
1633 | return AVERROR(EINVAL);
|
||
1634 | 99ca4f73 | Justin Ruggles | } |
1635 | 1607db0a | Justin Ruggles | s->sample_rate = avctx->sample_rate; |
1636 | 99ca4f73 | Justin Ruggles | s->bit_alloc.sr_shift = i % 3;
|
1637 | s->bit_alloc.sr_code = i / 3;
|
||
1638 | e77fd066 | Justin Ruggles | |
1639 | e0685bc9 | Justin Ruggles | /* validate bit rate */
|
1640 | e77fd066 | Justin Ruggles | for (i = 0; i < 19; i++) { |
1641 | 1607db0a | Justin Ruggles | if ((ff_ac3_bitrate_tab[i] >> s->bit_alloc.sr_shift)*1000 == avctx->bit_rate) |
1642 | e77fd066 | Justin Ruggles | break;
|
1643 | } |
||
1644 | ddf63d37 | Justin Ruggles | if (i == 19) { |
1645 | av_log(avctx, AV_LOG_ERROR, "invalid bit rate\n");
|
||
1646 | return AVERROR(EINVAL);
|
||
1647 | } |
||
1648 | 1607db0a | Justin Ruggles | s->bit_rate = avctx->bit_rate; |
1649 | e77fd066 | Justin Ruggles | s->frame_size_code = i << 1;
|
1650 | 8f60f70d | Justin Ruggles | |
1651 | e62ef8f2 | Justin Ruggles | /* validate cutoff */
|
1652 | if (avctx->cutoff < 0) { |
||
1653 | av_log(avctx, AV_LOG_ERROR, "invalid cutoff frequency\n");
|
||
1654 | return AVERROR(EINVAL);
|
||
1655 | } |
||
1656 | s->cutoff = avctx->cutoff; |
||
1657 | if (s->cutoff > (s->sample_rate >> 1)) |
||
1658 | s->cutoff = s->sample_rate >> 1;
|
||
1659 | |||
1660 | 8f60f70d | Justin Ruggles | return 0; |
1661 | } |
||
1662 | |||
1663 | |||
1664 | /**
|
||
1665 | 282255bb | Justin Ruggles | * Set bandwidth for all channels.
|
1666 | * The user can optionally supply a cutoff frequency. Otherwise an appropriate
|
||
1667 | * default value will be used.
|
||
1668 | */
|
||
1669 | e62ef8f2 | Justin Ruggles | static av_cold void set_bandwidth(AC3EncodeContext *s) |
1670 | 282255bb | Justin Ruggles | { |
1671 | int ch, bw_code;
|
||
1672 | |||
1673 | e62ef8f2 | Justin Ruggles | if (s->cutoff) {
|
1674 | 282255bb | Justin Ruggles | /* calculate bandwidth based on user-specified cutoff frequency */
|
1675 | int fbw_coeffs;
|
||
1676 | e62ef8f2 | Justin Ruggles | fbw_coeffs = s->cutoff * 2 * AC3_MAX_COEFS / s->sample_rate;
|
1677 | 282255bb | Justin Ruggles | bw_code = av_clip((fbw_coeffs - 73) / 3, 0, 60); |
1678 | } else {
|
||
1679 | /* use default bandwidth setting */
|
||
1680 | /* XXX: should compute the bandwidth according to the frame
|
||
1681 | size, so that we avoid annoying high frequency artifacts */
|
||
1682 | bw_code = 50;
|
||
1683 | } |
||
1684 | |||
1685 | /* set number of coefficients for each channel */
|
||
1686 | for (ch = 0; ch < s->fbw_channels; ch++) { |
||
1687 | s->bandwidth_code[ch] = bw_code; |
||
1688 | s->nb_coefs[ch] = bw_code * 3 + 73; |
||
1689 | } |
||
1690 | if (s->lfe_on)
|
||
1691 | s->nb_coefs[s->lfe_channel] = 7; /* LFE channel always has 7 coefs */ |
||
1692 | } |
||
1693 | |||
1694 | |||
1695 | 171bc51c | Justin Ruggles | static av_cold int allocate_buffers(AVCodecContext *avctx) |
1696 | { |
||
1697 | e8d21fba | Justin Ruggles | int blk, ch;
|
1698 | 171bc51c | Justin Ruggles | AC3EncodeContext *s = avctx->priv_data; |
1699 | |||
1700 | e8d21fba | Justin Ruggles | FF_ALLOC_OR_GOTO(avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
|
1701 | alloc_fail); |
||
1702 | for (ch = 0; ch < s->channels; ch++) { |
||
1703 | FF_ALLOCZ_OR_GOTO(avctx, s->planar_samples[ch], |
||
1704 | (AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
|
||
1705 | alloc_fail); |
||
1706 | } |
||
1707 | 171bc51c | Justin Ruggles | FF_ALLOC_OR_GOTO(avctx, s->bap_buffer, AC3_MAX_BLOCKS * s->channels * |
1708 | AC3_MAX_COEFS * sizeof(*s->bap_buffer), alloc_fail);
|
||
1709 | FF_ALLOC_OR_GOTO(avctx, s->bap1_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1710 | AC3_MAX_COEFS * sizeof(*s->bap1_buffer), alloc_fail);
|
||
1711 | b6f6204d | Justin Ruggles | FF_ALLOC_OR_GOTO(avctx, s->mdct_coef_buffer, AC3_MAX_BLOCKS * s->channels * |
1712 | AC3_MAX_COEFS * sizeof(*s->mdct_coef_buffer), alloc_fail);
|
||
1713 | FF_ALLOC_OR_GOTO(avctx, s->exp_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1714 | AC3_MAX_COEFS * sizeof(*s->exp_buffer), alloc_fail);
|
||
1715 | FF_ALLOC_OR_GOTO(avctx, s->grouped_exp_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1716 | 128 * sizeof(*s->grouped_exp_buffer), alloc_fail); |
||
1717 | FF_ALLOC_OR_GOTO(avctx, s->psd_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1718 | AC3_MAX_COEFS * sizeof(*s->psd_buffer), alloc_fail);
|
||
1719 | FF_ALLOC_OR_GOTO(avctx, s->band_psd_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1720 | 64 * sizeof(*s->band_psd_buffer), alloc_fail); |
||
1721 | FF_ALLOC_OR_GOTO(avctx, s->mask_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1722 | 64 * sizeof(*s->mask_buffer), alloc_fail); |
||
1723 | FF_ALLOC_OR_GOTO(avctx, s->qmant_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1724 | AC3_MAX_COEFS * sizeof(*s->qmant_buffer), alloc_fail);
|
||
1725 | 171bc51c | Justin Ruggles | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
1726 | AC3Block *block = &s->blocks[blk]; |
||
1727 | FF_ALLOC_OR_GOTO(avctx, block->bap, s->channels * sizeof(*block->bap),
|
||
1728 | alloc_fail); |
||
1729 | b6f6204d | Justin Ruggles | FF_ALLOCZ_OR_GOTO(avctx, block->mdct_coef, s->channels * sizeof(*block->mdct_coef),
|
1730 | alloc_fail); |
||
1731 | FF_ALLOCZ_OR_GOTO(avctx, block->exp, s->channels * sizeof(*block->exp),
|
||
1732 | alloc_fail); |
||
1733 | FF_ALLOCZ_OR_GOTO(avctx, block->grouped_exp, s->channels * sizeof(*block->grouped_exp),
|
||
1734 | alloc_fail); |
||
1735 | FF_ALLOCZ_OR_GOTO(avctx, block->psd, s->channels * sizeof(*block->psd),
|
||
1736 | alloc_fail); |
||
1737 | FF_ALLOCZ_OR_GOTO(avctx, block->band_psd, s->channels * sizeof(*block->band_psd),
|
||
1738 | alloc_fail); |
||
1739 | FF_ALLOCZ_OR_GOTO(avctx, block->mask, s->channels * sizeof(*block->mask),
|
||
1740 | alloc_fail); |
||
1741 | FF_ALLOCZ_OR_GOTO(avctx, block->qmant, s->channels * sizeof(*block->qmant),
|
||
1742 | alloc_fail); |
||
1743 | |||
1744 | for (ch = 0; ch < s->channels; ch++) { |
||
1745 | 7cc4be58 | Justin Ruggles | /* arrangement: block, channel, coeff */
|
1746 | b6f6204d | Justin Ruggles | block->bap[ch] = &s->bap_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)]; |
1747 | block->mdct_coef[ch] = &s->mdct_coef_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)]; |
||
1748 | block->grouped_exp[ch] = &s->grouped_exp_buffer[128 * (blk * s->channels + ch)];
|
||
1749 | block->psd[ch] = &s->psd_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)]; |
||
1750 | block->band_psd[ch] = &s->band_psd_buffer [64 * (blk * s->channels + ch)];
|
||
1751 | block->mask[ch] = &s->mask_buffer [64 * (blk * s->channels + ch)];
|
||
1752 | block->qmant[ch] = &s->qmant_buffer [AC3_MAX_COEFS * (blk * s->channels + ch)]; |
||
1753 | 7cc4be58 | Justin Ruggles | |
1754 | /* arrangement: channel, block, coeff */
|
||
1755 | block->exp[ch] = &s->exp_buffer [AC3_MAX_COEFS * (AC3_MAX_BLOCKS * ch + blk)]; |
||
1756 | b6f6204d | Justin Ruggles | } |
1757 | 171bc51c | Justin Ruggles | } |
1758 | |||
1759 | ac05f903 | Justin Ruggles | if (CONFIG_AC3ENC_FLOAT) {
|
1760 | FF_ALLOC_OR_GOTO(avctx, s->fixed_coef_buffer, AC3_MAX_BLOCKS * s->channels * |
||
1761 | AC3_MAX_COEFS * sizeof(*s->fixed_coef_buffer), alloc_fail);
|
||
1762 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
1763 | AC3Block *block = &s->blocks[blk]; |
||
1764 | FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, s->channels * |
||
1765 | sizeof(*block->fixed_coef), alloc_fail);
|
||
1766 | for (ch = 0; ch < s->channels; ch++) |
||
1767 | block->fixed_coef[ch] = &s->fixed_coef_buffer[AC3_MAX_COEFS * (blk * s->channels + ch)]; |
||
1768 | } |
||
1769 | } else {
|
||
1770 | for (blk = 0; blk < AC3_MAX_BLOCKS; blk++) { |
||
1771 | AC3Block *block = &s->blocks[blk]; |
||
1772 | FF_ALLOCZ_OR_GOTO(avctx, block->fixed_coef, s->channels * |
||
1773 | sizeof(*block->fixed_coef), alloc_fail);
|
||
1774 | for (ch = 0; ch < s->channels; ch++) |
||
1775 | block->fixed_coef[ch] = (int32_t *)block->mdct_coef[ch]; |
||
1776 | } |
||
1777 | } |
||
1778 | |||
1779 | 171bc51c | Justin Ruggles | return 0; |
1780 | alloc_fail:
|
||
1781 | return AVERROR(ENOMEM);
|
||
1782 | } |
||
1783 | |||
1784 | |||
1785 | 282255bb | Justin Ruggles | /**
|
1786 | 8f60f70d | Justin Ruggles | * Initialize the encoder.
|
1787 | */
|
||
1788 | static av_cold int ac3_encode_init(AVCodecContext *avctx) |
||
1789 | { |
||
1790 | AC3EncodeContext *s = avctx->priv_data; |
||
1791 | a81d7c6a | Justin Ruggles | int ret, frame_size_58;
|
1792 | 8f60f70d | Justin Ruggles | |
1793 | avctx->frame_size = AC3_FRAME_SIZE; |
||
1794 | |||
1795 | dff80041 | Justin Ruggles | ff_ac3_common_init(); |
1796 | 8f60f70d | Justin Ruggles | |
1797 | ret = validate_options(avctx, s); |
||
1798 | if (ret)
|
||
1799 | return ret;
|
||
1800 | |||
1801 | e35c984a | Justin Ruggles | s->bitstream_id = 8 + s->bit_alloc.sr_shift;
|
1802 | s->bitstream_mode = 0; /* complete main audio service */ |
||
1803 | |||
1804 | 427e2293 | Justin Ruggles | s->frame_size_min = 2 * ff_ac3_frame_size_tab[s->frame_size_code][s->bit_alloc.sr_code];
|
1805 | e77fd066 | Justin Ruggles | s->bits_written = 0;
|
1806 | s->samples_written = 0;
|
||
1807 | s->frame_size = s->frame_size_min; |
||
1808 | |||
1809 | a81d7c6a | Justin Ruggles | /* calculate crc_inv for both possible frame sizes */
|
1810 | frame_size_58 = (( s->frame_size >> 2) + ( s->frame_size >> 4)) << 1; |
||
1811 | s->crc_inv[0] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY); |
||
1812 | if (s->bit_alloc.sr_code == 1) { |
||
1813 | frame_size_58 = (((s->frame_size+2) >> 2) + ((s->frame_size+2) >> 4)) << 1; |
||
1814 | s->crc_inv[1] = pow_poly((CRC16_POLY >> 1), (8 * frame_size_58) - 16, CRC16_POLY); |
||
1815 | } |
||
1816 | |||
1817 | e62ef8f2 | Justin Ruggles | set_bandwidth(s); |
1818 | e77fd066 | Justin Ruggles | |
1819 | dc7e07ac | Justin Ruggles | rematrixing_init(s); |
1820 | |||
1821 | e86ea34d | Justin Ruggles | exponent_init(s); |
1822 | |||
1823 | 793bbf95 | Justin Ruggles | bit_alloc_init(s); |
1824 | e77fd066 | Justin Ruggles | |
1825 | 14166a6d | Justin Ruggles | ret = mdct_init(avctx, &s->mdct, 9);
|
1826 | 7786c384 | Justin Ruggles | if (ret)
|
1827 | 89bedc4d | Justin Ruggles | goto init_fail;
|
1828 | e77fd066 | Justin Ruggles | |
1829 | 171bc51c | Justin Ruggles | ret = allocate_buffers(avctx); |
1830 | 7786c384 | Justin Ruggles | if (ret)
|
1831 | 89bedc4d | Justin Ruggles | goto init_fail;
|
1832 | 171bc51c | Justin Ruggles | |
1833 | e77fd066 | Justin Ruggles | avctx->coded_frame= avcodec_alloc_frame(); |
1834 | |||
1835 | 8846ee54 | Justin Ruggles | dsputil_init(&s->dsp, avctx); |
1836 | a30ac54a | Justin Ruggles | ff_ac3dsp_init(&s->ac3dsp); |
1837 | 8846ee54 | Justin Ruggles | |
1838 | e77fd066 | Justin Ruggles | return 0; |
1839 | 89bedc4d | Justin Ruggles | init_fail:
|
1840 | ac3_encode_close(avctx); |
||
1841 | return ret;
|
||
1842 | e77fd066 | Justin Ruggles | } |