]> git.sesse.net Git - ffmpeg/blob - libavcodec/ac3enc_template.c
Merge commit '511cf612ac979f536fd65e14603a87ca5ad435f3'
[ffmpeg] / libavcodec / ac3enc_template.c
1 /*
2  * AC-3 encoder float/fixed template
3  * Copyright (c) 2000 Fabrice Bellard
4  * Copyright (c) 2006-2011 Justin Ruggles <justin.ruggles@gmail.com>
5  * Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
6  *
7  * This file is part of FFmpeg.
8  *
9  * FFmpeg is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Lesser General Public
11  * License as published by the Free Software Foundation; either
12  * version 2.1 of the License, or (at your option) any later version.
13  *
14  * FFmpeg 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 GNU
17  * Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with FFmpeg; if not, write to the Free Software
21  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22  */
23
24 /**
25  * @file
26  * AC-3 encoder float/fixed template
27  */
28
29 #include <stdint.h>
30
31
32 /* prototypes for static functions in ac3enc_fixed.c and ac3enc_float.c */
33
34 static void scale_coefficients(AC3EncodeContext *s);
35
36 static void apply_window(void *dsp, SampleType *output,
37                          const SampleType *input, const SampleType *window,
38                          unsigned int len);
39
40 static int normalize_samples(AC3EncodeContext *s);
41
42 static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len);
43
44 static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl);
45
46 static void sum_square_butterfly(AC3EncodeContext *s, CoefSumType sum[4],
47                                  const CoefType *coef0, const CoefType *coef1,
48                                  int len);
49
50 int AC3_NAME(allocate_sample_buffers)(AC3EncodeContext *s)
51 {
52     int ch;
53
54     FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE *
55                      sizeof(*s->windowed_samples), alloc_fail);
56     FF_ALLOC_OR_GOTO(s->avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
57                      alloc_fail);
58     for (ch = 0; ch < s->channels; ch++) {
59         FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
60                           (AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
61                           alloc_fail);
62     }
63
64     return 0;
65 alloc_fail:
66     return AVERROR(ENOMEM);
67 }
68
69
70 /*
71  * Copy input samples.
72  * Channels are reordered from FFmpeg's default order to AC-3 order.
73  */
74 static void copy_input_samples(AC3EncodeContext *s, SampleType **samples)
75 {
76     int ch;
77
78     /* copy and remap input samples */
79     for (ch = 0; ch < s->channels; ch++) {
80         /* copy last 256 samples of previous frame to the start of the current frame */
81         memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_BLOCK_SIZE * s->num_blocks],
82                AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0]));
83
84         /* copy new samples for current frame */
85         memcpy(&s->planar_samples[ch][AC3_BLOCK_SIZE],
86                samples[s->channel_map[ch]],
87                AC3_BLOCK_SIZE * s->num_blocks * sizeof(s->planar_samples[0][0]));
88     }
89 }
90
91
92 /*
93  * Apply the MDCT to input samples to generate frequency coefficients.
94  * This applies the KBD window and normalizes the input to reduce precision
95  * loss due to fixed-point calculations.
96  */
97 static void apply_mdct(AC3EncodeContext *s)
98 {
99     int blk, ch;
100
101     for (ch = 0; ch < s->channels; ch++) {
102         for (blk = 0; blk < s->num_blocks; blk++) {
103             AC3Block *block = &s->blocks[blk];
104             const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
105
106 #if CONFIG_AC3ENC_FLOAT
107             apply_window(&s->fdsp, s->windowed_samples, input_samples,
108                          s->mdct_window, AC3_WINDOW_SIZE);
109 #else
110             apply_window(&s->dsp, s->windowed_samples, input_samples,
111                          s->mdct_window, AC3_WINDOW_SIZE);
112 #endif
113
114             if (s->fixed_point)
115                 block->coeff_shift[ch+1] = normalize_samples(s);
116
117             s->mdct.mdct_calcw(&s->mdct, block->mdct_coef[ch+1],
118                                s->windowed_samples);
119         }
120     }
121 }
122
123
124 /*
125  * Calculate coupling channel and coupling coordinates.
126  */
127 static void apply_channel_coupling(AC3EncodeContext *s)
128 {
129     LOCAL_ALIGNED_16(CoefType, cpl_coords,      [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]);
130 #if CONFIG_AC3ENC_FLOAT
131     LOCAL_ALIGNED_16(int32_t, fixed_cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]);
132 #else
133     int32_t (*fixed_cpl_coords)[AC3_MAX_CHANNELS][16] = cpl_coords;
134 #endif
135     int blk, ch, bnd, i, j;
136     CoefSumType energy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][16] = {{{0}}};
137     int cpl_start, num_cpl_coefs;
138
139     memset(cpl_coords,       0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
140 #if CONFIG_AC3ENC_FLOAT
141     memset(fixed_cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
142 #endif
143
144     /* align start to 16-byte boundary. align length to multiple of 32.
145         note: coupling start bin % 4 will always be 1 */
146     cpl_start     = s->start_freq[CPL_CH] - 1;
147     num_cpl_coefs = FFALIGN(s->num_cpl_subbands * 12 + 1, 32);
148     cpl_start     = FFMIN(256, cpl_start + num_cpl_coefs) - num_cpl_coefs;
149
150     /* calculate coupling channel from fbw channels */
151     for (blk = 0; blk < s->num_blocks; blk++) {
152         AC3Block *block = &s->blocks[blk];
153         CoefType *cpl_coef = &block->mdct_coef[CPL_CH][cpl_start];
154         if (!block->cpl_in_use)
155             continue;
156         memset(cpl_coef, 0, num_cpl_coefs * sizeof(*cpl_coef));
157         for (ch = 1; ch <= s->fbw_channels; ch++) {
158             CoefType *ch_coef = &block->mdct_coef[ch][cpl_start];
159             if (!block->channel_in_cpl[ch])
160                 continue;
161             for (i = 0; i < num_cpl_coefs; i++)
162                 cpl_coef[i] += ch_coef[i];
163         }
164
165         /* coefficients must be clipped in order to be encoded */
166         clip_coefficients(&s->dsp, cpl_coef, num_cpl_coefs);
167     }
168
169     /* calculate energy in each band in coupling channel and each fbw channel */
170     /* TODO: possibly use SIMD to speed up energy calculation */
171     bnd = 0;
172     i = s->start_freq[CPL_CH];
173     while (i < s->cpl_end_freq) {
174         int band_size = s->cpl_band_sizes[bnd];
175         for (ch = CPL_CH; ch <= s->fbw_channels; ch++) {
176             for (blk = 0; blk < s->num_blocks; blk++) {
177                 AC3Block *block = &s->blocks[blk];
178                 if (!block->cpl_in_use || (ch > CPL_CH && !block->channel_in_cpl[ch]))
179                     continue;
180                 for (j = 0; j < band_size; j++) {
181                     CoefType v = block->mdct_coef[ch][i+j];
182                     MAC_COEF(energy[blk][ch][bnd], v, v);
183                 }
184             }
185         }
186         i += band_size;
187         bnd++;
188     }
189
190     /* calculate coupling coordinates for all blocks for all channels */
191     for (blk = 0; blk < s->num_blocks; blk++) {
192         AC3Block *block  = &s->blocks[blk];
193         if (!block->cpl_in_use)
194             continue;
195         for (ch = 1; ch <= s->fbw_channels; ch++) {
196             if (!block->channel_in_cpl[ch])
197                 continue;
198             for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
199                 cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy[blk][ch][bnd],
200                                                           energy[blk][CPL_CH][bnd]);
201             }
202         }
203     }
204
205     /* determine which blocks to send new coupling coordinates for */
206     for (blk = 0; blk < s->num_blocks; blk++) {
207         AC3Block *block  = &s->blocks[blk];
208         AC3Block *block0 = blk ? &s->blocks[blk-1] : NULL;
209
210         memset(block->new_cpl_coords, 0, sizeof(block->new_cpl_coords));
211
212         if (block->cpl_in_use) {
213             /* send new coordinates if this is the first block, if previous
214              * block did not use coupling but this block does, the channels
215              * using coupling has changed from the previous block, or the
216              * coordinate difference from the last block for any channel is
217              * greater than a threshold value. */
218             if (blk == 0 || !block0->cpl_in_use) {
219                 for (ch = 1; ch <= s->fbw_channels; ch++)
220                     block->new_cpl_coords[ch] = 1;
221             } else {
222                 for (ch = 1; ch <= s->fbw_channels; ch++) {
223                     if (!block->channel_in_cpl[ch])
224                         continue;
225                     if (!block0->channel_in_cpl[ch]) {
226                         block->new_cpl_coords[ch] = 1;
227                     } else {
228                         CoefSumType coord_diff = 0;
229                         for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
230                             coord_diff += FFABS(cpl_coords[blk-1][ch][bnd] -
231                                                 cpl_coords[blk  ][ch][bnd]);
232                         }
233                         coord_diff /= s->num_cpl_bands;
234                         if (coord_diff > NEW_CPL_COORD_THRESHOLD)
235                             block->new_cpl_coords[ch] = 1;
236                     }
237                 }
238             }
239         }
240     }
241
242     /* calculate final coupling coordinates, taking into account reusing of
243        coordinates in successive blocks */
244     for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
245         blk = 0;
246         while (blk < s->num_blocks) {
247             int av_uninit(blk1);
248             AC3Block *block  = &s->blocks[blk];
249
250             if (!block->cpl_in_use) {
251                 blk++;
252                 continue;
253             }
254
255             for (ch = 1; ch <= s->fbw_channels; ch++) {
256                 CoefSumType energy_ch, energy_cpl;
257                 if (!block->channel_in_cpl[ch])
258                     continue;
259                 energy_cpl = energy[blk][CPL_CH][bnd];
260                 energy_ch = energy[blk][ch][bnd];
261                 blk1 = blk+1;
262                 while (!s->blocks[blk1].new_cpl_coords[ch] && blk1 < s->num_blocks) {
263                     if (s->blocks[blk1].cpl_in_use) {
264                         energy_cpl += energy[blk1][CPL_CH][bnd];
265                         energy_ch += energy[blk1][ch][bnd];
266                     }
267                     blk1++;
268                 }
269                 cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy_ch, energy_cpl);
270             }
271             blk = blk1;
272         }
273     }
274
275     /* calculate exponents/mantissas for coupling coordinates */
276     for (blk = 0; blk < s->num_blocks; blk++) {
277         AC3Block *block = &s->blocks[blk];
278         if (!block->cpl_in_use)
279             continue;
280
281 #if CONFIG_AC3ENC_FLOAT
282         s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1],
283                                    cpl_coords[blk][1],
284                                    s->fbw_channels * 16);
285 #endif
286         s->ac3dsp.extract_exponents(block->cpl_coord_exp[1],
287                                     fixed_cpl_coords[blk][1],
288                                     s->fbw_channels * 16);
289
290         for (ch = 1; ch <= s->fbw_channels; ch++) {
291             int bnd, min_exp, max_exp, master_exp;
292
293             if (!block->new_cpl_coords[ch])
294                 continue;
295
296             /* determine master exponent */
297             min_exp = max_exp = block->cpl_coord_exp[ch][0];
298             for (bnd = 1; bnd < s->num_cpl_bands; bnd++) {
299                 int exp = block->cpl_coord_exp[ch][bnd];
300                 min_exp = FFMIN(exp, min_exp);
301                 max_exp = FFMAX(exp, max_exp);
302             }
303             master_exp = ((max_exp - 15) + 2) / 3;
304             master_exp = FFMAX(master_exp, 0);
305             while (min_exp < master_exp * 3)
306                 master_exp--;
307             for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
308                 block->cpl_coord_exp[ch][bnd] = av_clip(block->cpl_coord_exp[ch][bnd] -
309                                                         master_exp * 3, 0, 15);
310             }
311             block->cpl_master_exp[ch] = master_exp;
312
313             /* quantize mantissas */
314             for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
315                 int cpl_exp  = block->cpl_coord_exp[ch][bnd];
316                 int cpl_mant = (fixed_cpl_coords[blk][ch][bnd] << (5 + cpl_exp + master_exp * 3)) >> 24;
317                 if (cpl_exp == 15)
318                     cpl_mant >>= 1;
319                 else
320                     cpl_mant -= 16;
321
322                 block->cpl_coord_mant[ch][bnd] = cpl_mant;
323             }
324         }
325     }
326
327     if (CONFIG_EAC3_ENCODER && s->eac3)
328         ff_eac3_set_cpl_states(s);
329 }
330
331
332 /*
333  * Determine rematrixing flags for each block and band.
334  */
335 static void compute_rematrixing_strategy(AC3EncodeContext *s)
336 {
337     int nb_coefs;
338     int blk, bnd;
339     AC3Block *block, *block0;
340
341     if (s->channel_mode != AC3_CHMODE_STEREO)
342         return;
343
344     for (blk = 0; blk < s->num_blocks; blk++) {
345         block = &s->blocks[blk];
346         block->new_rematrixing_strategy = !blk;
347
348         block->num_rematrixing_bands = 4;
349         if (block->cpl_in_use) {
350             block->num_rematrixing_bands -= (s->start_freq[CPL_CH] <= 61);
351             block->num_rematrixing_bands -= (s->start_freq[CPL_CH] == 37);
352             if (blk && block->num_rematrixing_bands != block0->num_rematrixing_bands)
353                 block->new_rematrixing_strategy = 1;
354         }
355         nb_coefs = FFMIN(block->end_freq[1], block->end_freq[2]);
356
357         if (!s->rematrixing_enabled) {
358             block0 = block;
359             continue;
360         }
361
362         for (bnd = 0; bnd < block->num_rematrixing_bands; bnd++) {
363             /* calculate calculate sum of squared coeffs for one band in one block */
364             int start = ff_ac3_rematrix_band_tab[bnd];
365             int end   = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]);
366             CoefSumType sum[4];
367             sum_square_butterfly(s, sum, block->mdct_coef[1] + start,
368                                  block->mdct_coef[2] + start, end - start);
369
370             /* compare sums to determine if rematrixing will be used for this band */
371             if (FFMIN(sum[2], sum[3]) < FFMIN(sum[0], sum[1]))
372                 block->rematrixing_flags[bnd] = 1;
373             else
374                 block->rematrixing_flags[bnd] = 0;
375
376             /* determine if new rematrixing flags will be sent */
377             if (blk &&
378                 block->rematrixing_flags[bnd] != block0->rematrixing_flags[bnd]) {
379                 block->new_rematrixing_strategy = 1;
380             }
381         }
382         block0 = block;
383     }
384 }
385
386
387 int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket *avpkt,
388                            const AVFrame *frame, int *got_packet_ptr)
389 {
390     AC3EncodeContext *s = avctx->priv_data;
391     int ret;
392
393     if (s->options.allow_per_frame_metadata) {
394         ret = ff_ac3_validate_metadata(s);
395         if (ret)
396             return ret;
397     }
398
399     if (s->bit_alloc.sr_code == 1 || s->eac3)
400         ff_ac3_adjust_frame_size(s);
401
402     copy_input_samples(s, (SampleType **)frame->extended_data);
403
404     apply_mdct(s);
405
406     if (s->fixed_point)
407         scale_coefficients(s);
408
409     clip_coefficients(&s->dsp, s->blocks[0].mdct_coef[1],
410                       AC3_MAX_COEFS * s->num_blocks * s->channels);
411
412     s->cpl_on = s->cpl_enabled;
413     ff_ac3_compute_coupling_strategy(s);
414
415     if (s->cpl_on)
416         apply_channel_coupling(s);
417
418     compute_rematrixing_strategy(s);
419
420     if (!s->fixed_point)
421         scale_coefficients(s);
422
423     ff_ac3_apply_rematrixing(s);
424
425     ff_ac3_process_exponents(s);
426
427     ret = ff_ac3_compute_bit_allocation(s);
428     if (ret) {
429         av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
430         return ret;
431     }
432
433     ff_ac3_group_exponents(s);
434
435     ff_ac3_quantize_mantissas(s);
436
437     if ((ret = ff_alloc_packet2(avctx, avpkt, s->frame_size)))
438         return ret;
439     ff_ac3_output_frame(s, avpkt->data);
440
441     if (frame->pts != AV_NOPTS_VALUE)
442         avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
443
444     *got_packet_ptr = 1;
445     return 0;
446 }