ac3enc_template.c
Go to the documentation of this file.
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 #include "libavutil/internal.h"
32 
33 /* prototypes for static functions in ac3enc_fixed.c and ac3enc_float.c */
34 
36 
37 static void apply_window(void *dsp, SampleType *output,
38  const SampleType *input, const SampleType *window,
39  unsigned int len);
40 
42 
43 static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len);
44 
45 static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl);
46 
48  const CoefType *coef0, const CoefType *coef1,
49  int len);
50 
52 {
53  int ch;
54 
55  FF_ALLOC_OR_GOTO(s->avctx, s->windowed_samples, AC3_WINDOW_SIZE *
56  sizeof(*s->windowed_samples), alloc_fail);
57  FF_ALLOC_OR_GOTO(s->avctx, s->planar_samples, s->channels * sizeof(*s->planar_samples),
58  alloc_fail);
59  for (ch = 0; ch < s->channels; ch++) {
60  FF_ALLOCZ_OR_GOTO(s->avctx, s->planar_samples[ch],
61  (AC3_FRAME_SIZE+AC3_BLOCK_SIZE) * sizeof(**s->planar_samples),
62  alloc_fail);
63  }
64 
65  return 0;
66 alloc_fail:
67  return AVERROR(ENOMEM);
68 }
69 
70 
71 /*
72  * Copy input samples.
73  * Channels are reordered from FFmpeg's default order to AC-3 order.
74  */
76 {
77  int ch;
78 
79  /* copy and remap input samples */
80  for (ch = 0; ch < s->channels; ch++) {
81  /* copy last 256 samples of previous frame to the start of the current frame */
82  memcpy(&s->planar_samples[ch][0], &s->planar_samples[ch][AC3_BLOCK_SIZE * s->num_blocks],
83  AC3_BLOCK_SIZE * sizeof(s->planar_samples[0][0]));
84 
85  /* copy new samples for current frame */
86  memcpy(&s->planar_samples[ch][AC3_BLOCK_SIZE],
87  samples[s->channel_map[ch]],
88  AC3_BLOCK_SIZE * s->num_blocks * sizeof(s->planar_samples[0][0]));
89  }
90 }
91 
92 
93 /*
94  * Apply the MDCT to input samples to generate frequency coefficients.
95  * This applies the KBD window and normalizes the input to reduce precision
96  * loss due to fixed-point calculations.
97  */
99 {
100  int blk, ch;
101 
102  for (ch = 0; ch < s->channels; ch++) {
103  for (blk = 0; blk < s->num_blocks; blk++) {
104  AC3Block *block = &s->blocks[blk];
105  const SampleType *input_samples = &s->planar_samples[ch][blk * AC3_BLOCK_SIZE];
106 
107 #if CONFIG_AC3ENC_FLOAT
108  apply_window(&s->fdsp, s->windowed_samples, input_samples,
110 #else
111  apply_window(&s->dsp, s->windowed_samples, input_samples,
113 #endif
114 
115  if (s->fixed_point)
116  block->coeff_shift[ch+1] = normalize_samples(s);
117 
118  s->mdct.mdct_calcw(&s->mdct, block->mdct_coef[ch+1],
119  s->windowed_samples);
120  }
121  }
122 }
123 
124 
125 /*
126  * Calculate coupling channel and coupling coordinates.
127  */
129 {
131 #if CONFIG_AC3ENC_FLOAT
132  LOCAL_ALIGNED_16(int32_t, fixed_cpl_coords, [AC3_MAX_BLOCKS], [AC3_MAX_CHANNELS][16]);
133 #else
134  int32_t (*fixed_cpl_coords)[AC3_MAX_CHANNELS][16] = cpl_coords;
135 #endif
136  int av_uninit(blk), ch, bnd, i, j;
137  CoefSumType energy[AC3_MAX_BLOCKS][AC3_MAX_CHANNELS][16] = {{{0}}};
138  int cpl_start, num_cpl_coefs;
139 
140  memset(cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
141 #if CONFIG_AC3ENC_FLOAT
142  memset(fixed_cpl_coords, 0, AC3_MAX_BLOCKS * sizeof(*cpl_coords));
143 #endif
144 
145  /* align start to 16-byte boundary. align length to multiple of 32.
146  note: coupling start bin % 4 will always be 1 */
147  cpl_start = s->start_freq[CPL_CH] - 1;
148  num_cpl_coefs = FFALIGN(s->num_cpl_subbands * 12 + 1, 32);
149  cpl_start = FFMIN(256, cpl_start + num_cpl_coefs) - num_cpl_coefs;
150 
151  /* calculate coupling channel from fbw channels */
152  for (blk = 0; blk < s->num_blocks; blk++) {
153  AC3Block *block = &s->blocks[blk];
154  CoefType *cpl_coef = &block->mdct_coef[CPL_CH][cpl_start];
155  if (!block->cpl_in_use)
156  continue;
157  memset(cpl_coef, 0, num_cpl_coefs * sizeof(*cpl_coef));
158  for (ch = 1; ch <= s->fbw_channels; ch++) {
159  CoefType *ch_coef = &block->mdct_coef[ch][cpl_start];
160  if (!block->channel_in_cpl[ch])
161  continue;
162  for (i = 0; i < num_cpl_coefs; i++)
163  cpl_coef[i] += ch_coef[i];
164  }
165 
166  /* coefficients must be clipped in order to be encoded */
167  clip_coefficients(&s->dsp, cpl_coef, num_cpl_coefs);
168  }
169 
170  /* calculate energy in each band in coupling channel and each fbw channel */
171  /* TODO: possibly use SIMD to speed up energy calculation */
172  bnd = 0;
173  i = s->start_freq[CPL_CH];
174  while (i < s->cpl_end_freq) {
175  int band_size = s->cpl_band_sizes[bnd];
176  for (ch = CPL_CH; ch <= s->fbw_channels; ch++) {
177  for (blk = 0; blk < s->num_blocks; blk++) {
178  AC3Block *block = &s->blocks[blk];
179  if (!block->cpl_in_use || (ch > CPL_CH && !block->channel_in_cpl[ch]))
180  continue;
181  for (j = 0; j < band_size; j++) {
182  CoefType v = block->mdct_coef[ch][i+j];
183  MAC_COEF(energy[blk][ch][bnd], v, v);
184  }
185  }
186  }
187  i += band_size;
188  bnd++;
189  }
190 
191  /* calculate coupling coordinates for all blocks for all channels */
192  for (blk = 0; blk < s->num_blocks; blk++) {
193  AC3Block *block = &s->blocks[blk];
194  if (!block->cpl_in_use)
195  continue;
196  for (ch = 1; ch <= s->fbw_channels; ch++) {
197  if (!block->channel_in_cpl[ch])
198  continue;
199  for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
200  cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy[blk][ch][bnd],
201  energy[blk][CPL_CH][bnd]);
202  }
203  }
204  }
205 
206  /* determine which blocks to send new coupling coordinates for */
207  for (blk = 0; blk < s->num_blocks; blk++) {
208  AC3Block *block = &s->blocks[blk];
209  AC3Block *block0 = blk ? &s->blocks[blk-1] : NULL;
210 
211  memset(block->new_cpl_coords, 0, sizeof(block->new_cpl_coords));
212 
213  if (block->cpl_in_use) {
214  /* send new coordinates if this is the first block, if previous
215  * block did not use coupling but this block does, the channels
216  * using coupling has changed from the previous block, or the
217  * coordinate difference from the last block for any channel is
218  * greater than a threshold value. */
219  if (blk == 0 || !block0->cpl_in_use) {
220  for (ch = 1; ch <= s->fbw_channels; ch++)
221  block->new_cpl_coords[ch] = 1;
222  } else {
223  for (ch = 1; ch <= s->fbw_channels; ch++) {
224  if (!block->channel_in_cpl[ch])
225  continue;
226  if (!block0->channel_in_cpl[ch]) {
227  block->new_cpl_coords[ch] = 1;
228  } else {
229  CoefSumType coord_diff = 0;
230  for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
231  coord_diff += FFABS(cpl_coords[blk-1][ch][bnd] -
232  cpl_coords[blk ][ch][bnd]);
233  }
234  coord_diff /= s->num_cpl_bands;
235  if (coord_diff > NEW_CPL_COORD_THRESHOLD)
236  block->new_cpl_coords[ch] = 1;
237  }
238  }
239  }
240  }
241  }
242 
243  /* calculate final coupling coordinates, taking into account reusing of
244  coordinates in successive blocks */
245  for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
246  blk = 0;
247  while (blk < s->num_blocks) {
248  int av_uninit(blk1);
249  AC3Block *block = &s->blocks[blk];
250 
251  if (!block->cpl_in_use) {
252  blk++;
253  continue;
254  }
255 
256  for (ch = 1; ch <= s->fbw_channels; ch++) {
257  CoefSumType energy_ch, energy_cpl;
258  if (!block->channel_in_cpl[ch])
259  continue;
260  energy_cpl = energy[blk][CPL_CH][bnd];
261  energy_ch = energy[blk][ch][bnd];
262  blk1 = blk+1;
263  while (!s->blocks[blk1].new_cpl_coords[ch] && blk1 < s->num_blocks) {
264  if (s->blocks[blk1].cpl_in_use) {
265  energy_cpl += energy[blk1][CPL_CH][bnd];
266  energy_ch += energy[blk1][ch][bnd];
267  }
268  blk1++;
269  }
270  cpl_coords[blk][ch][bnd] = calc_cpl_coord(energy_ch, energy_cpl);
271  }
272  blk = blk1;
273  }
274  }
275 
276  /* calculate exponents/mantissas for coupling coordinates */
277  for (blk = 0; blk < s->num_blocks; blk++) {
278  AC3Block *block = &s->blocks[blk];
279  if (!block->cpl_in_use)
280  continue;
281 
282 #if CONFIG_AC3ENC_FLOAT
283  s->ac3dsp.float_to_fixed24(fixed_cpl_coords[blk][1],
284  cpl_coords[blk][1],
285  s->fbw_channels * 16);
286 #endif
288  fixed_cpl_coords[blk][1],
289  s->fbw_channels * 16);
290 
291  for (ch = 1; ch <= s->fbw_channels; ch++) {
292  int bnd, min_exp, max_exp, master_exp;
293 
294  if (!block->new_cpl_coords[ch])
295  continue;
296 
297  /* determine master exponent */
298  min_exp = max_exp = block->cpl_coord_exp[ch][0];
299  for (bnd = 1; bnd < s->num_cpl_bands; bnd++) {
300  int exp = block->cpl_coord_exp[ch][bnd];
301  min_exp = FFMIN(exp, min_exp);
302  max_exp = FFMAX(exp, max_exp);
303  }
304  master_exp = ((max_exp - 15) + 2) / 3;
305  master_exp = FFMAX(master_exp, 0);
306  while (min_exp < master_exp * 3)
307  master_exp--;
308  for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
309  block->cpl_coord_exp[ch][bnd] = av_clip(block->cpl_coord_exp[ch][bnd] -
310  master_exp * 3, 0, 15);
311  }
312  block->cpl_master_exp[ch] = master_exp;
313 
314  /* quantize mantissas */
315  for (bnd = 0; bnd < s->num_cpl_bands; bnd++) {
316  int cpl_exp = block->cpl_coord_exp[ch][bnd];
317  int cpl_mant = (fixed_cpl_coords[blk][ch][bnd] << (5 + cpl_exp + master_exp * 3)) >> 24;
318  if (cpl_exp == 15)
319  cpl_mant >>= 1;
320  else
321  cpl_mant -= 16;
322 
323  block->cpl_coord_mant[ch][bnd] = cpl_mant;
324  }
325  }
326  }
327 
328  if (CONFIG_EAC3_ENCODER && s->eac3)
330 }
331 
332 
333 /*
334  * Determine rematrixing flags for each block and band.
335  */
337 {
338  int nb_coefs;
339  int blk, bnd;
340  AC3Block *block, *block0 = NULL;
341 
343  return;
344 
345  for (blk = 0; blk < s->num_blocks; blk++) {
346  block = &s->blocks[blk];
347  block->new_rematrixing_strategy = !blk;
348 
349  block->num_rematrixing_bands = 4;
350  if (block->cpl_in_use) {
351  block->num_rematrixing_bands -= (s->start_freq[CPL_CH] <= 61);
352  block->num_rematrixing_bands -= (s->start_freq[CPL_CH] == 37);
353  if (blk && block->num_rematrixing_bands != block0->num_rematrixing_bands)
354  block->new_rematrixing_strategy = 1;
355  }
356  nb_coefs = FFMIN(block->end_freq[1], block->end_freq[2]);
357 
358  if (!s->rematrixing_enabled) {
359  block0 = block;
360  continue;
361  }
362 
363  for (bnd = 0; bnd < block->num_rematrixing_bands; bnd++) {
364  /* calculate calculate sum of squared coeffs for one band in one block */
365  int start = ff_ac3_rematrix_band_tab[bnd];
366  int end = FFMIN(nb_coefs, ff_ac3_rematrix_band_tab[bnd+1]);
367  CoefSumType sum[4];
368  sum_square_butterfly(s, sum, block->mdct_coef[1] + start,
369  block->mdct_coef[2] + start, end - start);
370 
371  /* compare sums to determine if rematrixing will be used for this band */
372  if (FFMIN(sum[2], sum[3]) < FFMIN(sum[0], sum[1]))
373  block->rematrixing_flags[bnd] = 1;
374  else
375  block->rematrixing_flags[bnd] = 0;
376 
377  /* determine if new rematrixing flags will be sent */
378  if (blk &&
379  block->rematrixing_flags[bnd] != block0->rematrixing_flags[bnd]) {
380  block->new_rematrixing_strategy = 1;
381  }
382  }
383  block0 = block;
384  }
385 }
386 
387 
389  const AVFrame *frame, int *got_packet_ptr)
390 {
392  int ret;
393 
395  ret = ff_ac3_validate_metadata(s);
396  if (ret)
397  return ret;
398  }
399 
400  if (s->bit_alloc.sr_code == 1 || s->eac3)
402 
403  copy_input_samples(s, (SampleType **)frame->extended_data);
404 
405  apply_mdct(s);
406 
407  if (s->fixed_point)
409 
410  clip_coefficients(&s->dsp, s->blocks[0].mdct_coef[1],
411  AC3_MAX_COEFS * s->num_blocks * s->channels);
412 
413  s->cpl_on = s->cpl_enabled;
415 
416  if (s->cpl_on)
418 
420 
421  if (!s->fixed_point)
423 
425 
427 
429  if (ret) {
430  av_log(avctx, AV_LOG_ERROR, "Bit allocation failed. Try increasing the bitrate.\n");
431  return ret;
432  }
433 
435 
437 
438  if ((ret = ff_alloc_packet2(avctx, avpkt, s->frame_size)) < 0)
439  return ret;
440  ff_ac3_output_frame(s, avpkt->data);
441 
442  if (frame->pts != AV_NOPTS_VALUE)
443  avpkt->pts = frame->pts - ff_samples_to_time_base(avctx, avctx->delay);
444 
445  *got_packet_ptr = 1;
446  return 0;
447 }
static void scale_coefficients(AC3EncodeContext *s)
uint8_t new_rematrixing_strategy
send new rematrixing flags in this block
Definition: ac3enc.h:140
Definition: start.py:1
static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl)
float v
const char * s
Definition: avisynth_c.h:668
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
int AC3_NAME() allocate_sample_buffers(AC3EncodeContext *s)
static void apply_mdct(AC3EncodeContext *s)
uint8_t ** cpl_coord_exp
coupling coord exponents (cplcoexp)
Definition: ac3enc.h:137
#define AC3_MAX_COEFS
Definition: ac3.h:34
#define AC3_WINDOW_SIZE
Definition: ac3.h:38
void ff_ac3_process_exponents(AC3EncodeContext *s)
Calculate final exponents from the supplied MDCT coefficients and exponent shift. ...
Definition: ac3enc.c:635
void ff_eac3_set_cpl_states(AC3EncodeContext *s)
Set coupling states.
Definition: eac3enc.c:93
uint8_t ** cpl_coord_mant
coupling coord mantissas (cplcomant)
Definition: ac3enc.h:138
int start_freq[AC3_MAX_CHANNELS]
start frequency bin (strtmant)
Definition: ac3enc.h:205
#define blk(i)
Definition: sha.c:169
AC3BitAllocParameters bit_alloc
bit allocation parameters
Definition: ac3enc.h:222
#define FFALIGN(x, a)
Definition: common.h:63
DSPContext dsp
Definition: ac3enc.h:162
int ff_ac3_validate_metadata(AC3EncodeContext *s)
Validate metadata options as set by AVOption system.
Definition: ac3enc.c:1831
int rematrixing_enabled
stereo rematrixing enabled
Definition: ac3enc.h:214
static void apply_channel_coupling(AC3EncodeContext *s)
void(* extract_exponents)(uint8_t *exp, int32_t *coef, int nb_coefs)
Definition: ac3dsp.h:127
int channel_mode
channel mode (acmod)
Definition: ac3enc.h:193
int num_cpl_subbands
number of coupling subbands (ncplsubnd)
Definition: ac3enc.h:210
uint8_t rematrixing_flags[4]
rematrixing flags
Definition: ac3enc.h:142
int fbw_channels
number of full-bandwidth channels (nfchans)
Definition: ac3enc.h:187
uint8_t new_cpl_coords[AC3_MAX_CHANNELS]
send new coupling coordinates (cplcoe)
Definition: ac3enc.h:147
end end
uint8_t cpl_master_exp[AC3_MAX_CHANNELS]
coupling coord master exponents (mstrcplco)
Definition: ac3enc.h:148
int num_rematrixing_bands
number of rematrixing bands
Definition: ac3enc.h:141
AC3DSPContext ac3dsp
AC-3 optimized functions.
Definition: ac3enc.h:164
int num_cpl_bands
number of coupling bands (ncplbnd)
Definition: ac3enc.h:211
int64_t CoefSumType
Definition: ac3enc.h:69
frame
Definition: stft.m:14
CoefType ** mdct_coef
MDCT coefficients.
Definition: ac3enc.h:129
uint8_t channel_in_cpl[AC3_MAX_CHANNELS]
channel in coupling (chincpl)
Definition: ac3enc.h:145
AC3EncOptions options
encoding options
Definition: ac3enc.h:159
void(* mdct_calcw)(struct FFTContext *s, FFTDouble *output, const FFTSample *input)
Definition: fft.h:84
int channels
total number of channels (nchans)
Definition: ac3enc.h:188
#define AC3_MAX_CHANNELS
maximum number of channels, including coupling channel
Definition: ac3.h:31
#define AC3_NAME(x)
Definition: ac3enc.h:62
these buffered frames must be flushed immediately if a new input produces new the filter must not call request_frame to get more It must just process the frame or queue it The task of requesting more frames is left to the filter s request_frame method or the application If a filter has several the filter must be ready for frames arriving randomly on any input any filter with several inputs will most likely require some kind of queuing mechanism It is perfectly acceptable to have a limited queue and to drop frames when the inputs are too unbalanced request_frame This method is called when a frame is wanted on an output For an input
int cpl_on
coupling turned on for this frame
Definition: ac3enc.h:208
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
int fixed_point
indicates if fixed-point encoder is being used
Definition: ac3enc.h:170
overlapping window(triangular window to avoid too much overlapping) ovidx
#define FFMAX(a, b)
Definition: common.h:56
int cpl_in_use
coupling in use for this block (cplinu)
Definition: ac3enc.h:144
int cpl_enabled
coupling enabled for all frames
Definition: ac3enc.h:209
#define AC3_BLOCK_SIZE
Definition: ac3.h:35
int16_t SampleType
Definition: ac3enc.h:67
static int normalize_samples(AC3EncodeContext *s)
Data for a single audio block.
Definition: ac3enc.h:128
common internal API header
int ff_ac3_compute_bit_allocation(AC3EncodeContext *s)
Definition: ac3enc.c:1144
#define FFMIN(a, b)
Definition: common.h:58
int eac3
indicates if this is E-AC-3 vs. AC-3
Definition: ac3enc.h:171
ret
Definition: avfilter.c:821
int32_t
#define FFABS(a)
Definition: common.h:53
void ff_ac3_adjust_frame_size(AC3EncodeContext *s)
Adjust the frame size to make the average bit rate match the target bit rate.
Definition: ac3enc.c:181
FFTContext mdct
FFT context for MDCT calculation.
Definition: ac3enc.h:165
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
int AC3_NAME() encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
AVFloatDSPContext fdsp
Definition: ac3enc.h:163
const SampleType * mdct_window
MDCT window function array.
Definition: ac3enc.h:166
SampleType ** planar_samples
Definition: ac3enc.h:231
1i.*Xphase exp()
NULL
Definition: eval.c:55
#define CPL_CH
coupling channel index
Definition: ac3.h:32
#define NEW_CPL_COORD_THRESHOLD
Definition: ac3enc.h:66
main external API structure.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
const uint8_t * channel_map
channel map used to reorder channels
Definition: ac3enc.h:194
int end_freq[AC3_MAX_CHANNELS]
end frequency bin (endmant)
Definition: ac3enc.h:151
synthesis window for stochastic i
static void apply_window(void *dsp, SampleType *output, const SampleType *input, const SampleType *window, unsigned int len)
#define AC3_MAX_BLOCKS
Definition: ac3.h:36
AC-3 encoder private context.
Definition: ac3enc.h:157
void ff_ac3_output_frame(AC3EncodeContext *s, unsigned char *frame)
Write the frame to the output bitstream.
Definition: ac3enc.c:1659
AC3Block blocks[AC3_MAX_BLOCKS]
per-block info
Definition: ac3enc.h:168
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
SampleType * windowed_samples
Definition: ac3enc.h:230
void ff_ac3_quantize_mantissas(AC3EncodeContext *s)
Quantize mantissas using coefficients, exponents, and bit allocation pointers.
Definition: ac3enc.c:1298
int num_blocks
number of blocks per frame
Definition: ac3enc.h:179
uint8_t coeff_shift[AC3_MAX_CHANNELS]
fixed-point coefficient shift values
Definition: ac3enc.h:139
#define AC3_FRAME_SIZE
Definition: ac3.h:37
int frame_size
current frame size in bytes
Definition: ac3enc.h:181
int cpl_end_freq
coupling channel end frequency bin
Definition: ac3enc.h:206
uint8_t cpl_band_sizes[AC3_MAX_CPL_BANDS]
number of coeffs in each coupling band
Definition: ac3enc.h:212
static void sum_square_butterfly(AC3EncodeContext *s, CoefSumType sum[4], const CoefType *coef0, const CoefType *coef1, int len)
#define FF_ALLOC_OR_GOTO(ctx, p, size, label)
these buffered frames must be flushed immediately if a new input produces new output(Example:frame rate-doubling filter:filter_frame must(1) flush the second copy of the previous frame, if it is still there,(2) push the first copy of the incoming frame,(3) keep the second copy for later.) If the input frame is not enough to produce output
AVCodecContext * avctx
parent AVCodecContext
Definition: ac3enc.h:160
static void compute_rematrixing_strategy(AC3EncodeContext *s)
int allow_per_frame_metadata
Definition: ac3enc.h:119
int len
static void copy_input_samples(AC3EncodeContext *s, SampleType **samples)
#define MAC_COEF(d, a, b)
Definition: ac3enc.h:63
#define av_uninit(x)
Definition: attributes.h:137
Filter the word “frame” indicates either a video frame or a group of audio samples
#define LOCAL_ALIGNED_16(t, v,...)
void ff_ac3_apply_rematrixing(AC3EncodeContext *s)
Apply stereo rematrixing to coefficients based on rematrixing flags.
Definition: ac3enc.c:270
const uint8_t ff_ac3_rematrix_band_tab[5]
Table of bin locations for rematrixing bands reference: Section 7.5.2 Rematrixing : Frequency Band De...
Definition: ac3tab.c:139
static av_always_inline int64_t ff_samples_to_time_base(AVCodecContext *avctx, int64_t samples)
Rescale from sample rate to AVCodecContext.time_base.
void ff_ac3_group_exponents(AC3EncodeContext *s)
Group exponents.
Definition: ac3enc.c:577
#define CONFIG_EAC3_ENCODER
Definition: config.h:1095
int32_t CoefType
Definition: ac3enc.h:68
void ff_ac3_compute_coupling_strategy(AC3EncodeContext *s)
Set the initial coupling strategy parameters prior to coupling analysis.
Definition: ac3enc.c:199
This structure stores compressed data.
int delay
Codec delay.
#define FF_ALLOCZ_OR_GOTO(ctx, p, size, label)
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition: avutil.h:190
void(* float_to_fixed24)(int32_t *dst, const float *src, unsigned int len)
Convert an array of float in range [-1.0,1.0] to int32_t with range [-(1<<24),(1<<24)].
Definition: ac3dsp.h:89
DSPContext.
Definition: dsputil.h:127
static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int len)