aaccoder.c
Go to the documentation of this file.
1 /*
2  * AAC coefficients encoder
3  * Copyright (C) 2008-2009 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * AAC coefficients encoder
25  */
26 
27 /***********************************
28  * TODOs:
29  * speedup quantizer selection
30  * add sane pulse detection
31  ***********************************/
32 
33 #include "libavutil/libm.h" // brought forward to work around cygwin header breakage
34 
35 #include <float.h>
36 #include "libavutil/mathematics.h"
37 #include "avcodec.h"
38 #include "put_bits.h"
39 #include "aac.h"
40 #include "aacenc.h"
41 #include "aactab.h"
42 
43 /** bits needed to code codebook run value for long windows */
44 static const uint8_t run_value_bits_long[64] = {
45  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
46  5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10,
47  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
48  10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 15
49 };
50 
51 /** bits needed to code codebook run value for short windows */
52 static const uint8_t run_value_bits_short[16] = {
53  3, 3, 3, 3, 3, 3, 3, 6, 6, 6, 6, 6, 6, 6, 6, 9
54 };
55 
56 static const uint8_t *run_value_bits[2] = {
58 };
59 
60 
61 /**
62  * Quantize one coefficient.
63  * @return absolute value of the quantized coefficient
64  * @see 3GPP TS26.403 5.6.2 "Scalefactor determination"
65  */
66 static av_always_inline int quant(float coef, const float Q)
67 {
68  float a = coef * Q;
69  return sqrtf(a * sqrtf(a)) + 0.4054;
70 }
71 
72 static void quantize_bands(int *out, const float *in, const float *scaled,
73  int size, float Q34, int is_signed, int maxval)
74 {
75  int i;
76  double qc;
77  for (i = 0; i < size; i++) {
78  qc = scaled[i] * Q34;
79  out[i] = (int)FFMIN(qc + 0.4054, (double)maxval);
80  if (is_signed && in[i] < 0.0f) {
81  out[i] = -out[i];
82  }
83  }
84 }
85 
86 static void abs_pow34_v(float *out, const float *in, const int size)
87 {
88 #ifndef USE_REALLY_FULL_SEARCH
89  int i;
90  for (i = 0; i < size; i++) {
91  float a = fabsf(in[i]);
92  out[i] = sqrtf(a * sqrtf(a));
93  }
94 #endif /* USE_REALLY_FULL_SEARCH */
95 }
96 
97 static const uint8_t aac_cb_range [12] = {0, 3, 3, 3, 3, 9, 9, 8, 8, 13, 13, 17};
98 static const uint8_t aac_cb_maxval[12] = {0, 1, 1, 2, 2, 4, 4, 7, 7, 12, 12, 16};
99 
100 /**
101  * Calculate rate distortion cost for quantizing with given codebook
102  *
103  * @return quantization distortion
104  */
106  struct AACEncContext *s,
107  PutBitContext *pb, const float *in,
108  const float *scaled, int size, int scale_idx,
109  int cb, const float lambda, const float uplim,
110  int *bits, int BT_ZERO, int BT_UNSIGNED,
111  int BT_PAIR, int BT_ESC)
112 {
113  const int q_idx = POW_SF2_ZERO - scale_idx + SCALE_ONE_POS - SCALE_DIV_512;
114  const float Q = ff_aac_pow2sf_tab [q_idx];
115  const float Q34 = ff_aac_pow34sf_tab[q_idx];
116  const float IQ = ff_aac_pow2sf_tab [POW_SF2_ZERO + scale_idx - SCALE_ONE_POS + SCALE_DIV_512];
117  const float CLIPPED_ESCAPE = 165140.0f*IQ;
118  int i, j;
119  float cost = 0;
120  const int dim = BT_PAIR ? 2 : 4;
121  int resbits = 0;
122  const int range = aac_cb_range[cb];
123  const int maxval = aac_cb_maxval[cb];
124  int off;
125 
126  if (BT_ZERO) {
127  for (i = 0; i < size; i++)
128  cost += in[i]*in[i];
129  if (bits)
130  *bits = 0;
131  return cost * lambda;
132  }
133  if (!scaled) {
134  abs_pow34_v(s->scoefs, in, size);
135  scaled = s->scoefs;
136  }
137  quantize_bands(s->qcoefs, in, scaled, size, Q34, !BT_UNSIGNED, maxval);
138  if (BT_UNSIGNED) {
139  off = 0;
140  } else {
141  off = maxval;
142  }
143  for (i = 0; i < size; i += dim) {
144  const float *vec;
145  int *quants = s->qcoefs + i;
146  int curidx = 0;
147  int curbits;
148  float rd = 0.0f;
149  for (j = 0; j < dim; j++) {
150  curidx *= range;
151  curidx += quants[j] + off;
152  }
153  curbits = ff_aac_spectral_bits[cb-1][curidx];
154  vec = &ff_aac_codebook_vectors[cb-1][curidx*dim];
155  if (BT_UNSIGNED) {
156  for (j = 0; j < dim; j++) {
157  float t = fabsf(in[i+j]);
158  float di;
159  if (BT_ESC && vec[j] == 64.0f) { //FIXME: slow
160  if (t >= CLIPPED_ESCAPE) {
161  di = t - CLIPPED_ESCAPE;
162  curbits += 21;
163  } else {
164  int c = av_clip(quant(t, Q), 0, 8191);
165  di = t - c*cbrtf(c)*IQ;
166  curbits += av_log2(c)*2 - 4 + 1;
167  }
168  } else {
169  di = t - vec[j]*IQ;
170  }
171  if (vec[j] != 0.0f)
172  curbits++;
173  rd += di*di;
174  }
175  } else {
176  for (j = 0; j < dim; j++) {
177  float di = in[i+j] - vec[j]*IQ;
178  rd += di*di;
179  }
180  }
181  cost += rd * lambda + curbits;
182  resbits += curbits;
183  if (cost >= uplim)
184  return uplim;
185  if (pb) {
186  put_bits(pb, ff_aac_spectral_bits[cb-1][curidx], ff_aac_spectral_codes[cb-1][curidx]);
187  if (BT_UNSIGNED)
188  for (j = 0; j < dim; j++)
189  if (ff_aac_codebook_vectors[cb-1][curidx*dim+j] != 0.0f)
190  put_bits(pb, 1, in[i+j] < 0.0f);
191  if (BT_ESC) {
192  for (j = 0; j < 2; j++) {
193  if (ff_aac_codebook_vectors[cb-1][curidx*2+j] == 64.0f) {
194  int coef = av_clip(quant(fabsf(in[i+j]), Q), 0, 8191);
195  int len = av_log2(coef);
196 
197  put_bits(pb, len - 4 + 1, (1 << (len - 4 + 1)) - 2);
198  put_bits(pb, len, coef & ((1 << len) - 1));
199  }
200  }
201  }
202  }
203  }
204 
205  if (bits)
206  *bits = resbits;
207  return cost;
208 }
209 
210 #define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC) \
211 static float quantize_and_encode_band_cost_ ## NAME( \
212  struct AACEncContext *s, \
213  PutBitContext *pb, const float *in, \
214  const float *scaled, int size, int scale_idx, \
215  int cb, const float lambda, const float uplim, \
216  int *bits) { \
217  return quantize_and_encode_band_cost_template( \
218  s, pb, in, scaled, size, scale_idx, \
219  BT_ESC ? ESC_BT : cb, lambda, uplim, bits, \
220  BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC); \
221 }
222 
224 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SQUAD, 0, 0, 0, 0)
225 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UQUAD, 0, 1, 0, 0)
226 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(SPAIR, 0, 0, 1, 0)
227 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(UPAIR, 0, 1, 1, 0)
228 QUANTIZE_AND_ENCODE_BAND_COST_FUNC(ESC, 0, 1, 1, 1)
229 
230 static float (*const quantize_and_encode_band_cost_arr[])(
231  struct AACEncContext *s,
232  PutBitContext *pb, const float *in,
233  const float *scaled, int size, int scale_idx,
234  int cb, const float lambda, const float uplim,
235  int *bits) = {
236  quantize_and_encode_band_cost_ZERO,
237  quantize_and_encode_band_cost_SQUAD,
238  quantize_and_encode_band_cost_SQUAD,
239  quantize_and_encode_band_cost_UQUAD,
240  quantize_and_encode_band_cost_UQUAD,
241  quantize_and_encode_band_cost_SPAIR,
242  quantize_and_encode_band_cost_SPAIR,
243  quantize_and_encode_band_cost_UPAIR,
244  quantize_and_encode_band_cost_UPAIR,
245  quantize_and_encode_band_cost_UPAIR,
246  quantize_and_encode_band_cost_UPAIR,
247  quantize_and_encode_band_cost_ESC,
248 };
249 
250 #define quantize_and_encode_band_cost( \
251  s, pb, in, scaled, size, scale_idx, cb, \
252  lambda, uplim, bits) \
253  quantize_and_encode_band_cost_arr[cb]( \
254  s, pb, in, scaled, size, scale_idx, cb, \
255  lambda, uplim, bits)
256 
257 static float quantize_band_cost(struct AACEncContext *s, const float *in,
258  const float *scaled, int size, int scale_idx,
259  int cb, const float lambda, const float uplim,
260  int *bits)
261 {
262  return quantize_and_encode_band_cost(s, NULL, in, scaled, size, scale_idx,
263  cb, lambda, uplim, bits);
264 }
265 
267  const float *in, int size, int scale_idx,
268  int cb, const float lambda)
269 {
270  quantize_and_encode_band_cost(s, pb, in, NULL, size, scale_idx, cb, lambda,
271  INFINITY, NULL);
272 }
273 
274 static float find_max_val(int group_len, int swb_size, const float *scaled) {
275  float maxval = 0.0f;
276  int w2, i;
277  for (w2 = 0; w2 < group_len; w2++) {
278  for (i = 0; i < swb_size; i++) {
279  maxval = FFMAX(maxval, scaled[w2*128+i]);
280  }
281  }
282  return maxval;
283 }
284 
285 static int find_min_book(float maxval, int sf) {
287  float Q34 = sqrtf(Q * sqrtf(Q));
288  int qmaxval, cb;
289  qmaxval = maxval * Q34 + 0.4054f;
290  if (qmaxval == 0) cb = 0;
291  else if (qmaxval == 1) cb = 1;
292  else if (qmaxval == 2) cb = 3;
293  else if (qmaxval <= 4) cb = 5;
294  else if (qmaxval <= 7) cb = 7;
295  else if (qmaxval <= 12) cb = 9;
296  else cb = 11;
297  return cb;
298 }
299 
300 /**
301  * structure used in optimal codebook search
302  */
303 typedef struct BandCodingPath {
304  int prev_idx; ///< pointer to the previous path point
305  float cost; ///< path cost
306  int run;
308 
309 /**
310  * Encode band info for single window group bands.
311  */
313  int win, int group_len, const float lambda)
314 {
315  BandCodingPath path[120][12];
316  int w, swb, cb, start, size;
317  int i, j;
318  const int max_sfb = sce->ics.max_sfb;
319  const int run_bits = sce->ics.num_windows == 1 ? 5 : 3;
320  const int run_esc = (1 << run_bits) - 1;
321  int idx, ppos, count;
322  int stackrun[120], stackcb[120], stack_len;
323  float next_minrd = INFINITY;
324  int next_mincb = 0;
325 
326  abs_pow34_v(s->scoefs, sce->coeffs, 1024);
327  start = win*128;
328  for (cb = 0; cb < 12; cb++) {
329  path[0][cb].cost = 0.0f;
330  path[0][cb].prev_idx = -1;
331  path[0][cb].run = 0;
332  }
333  for (swb = 0; swb < max_sfb; swb++) {
334  size = sce->ics.swb_sizes[swb];
335  if (sce->zeroes[win*16 + swb]) {
336  for (cb = 0; cb < 12; cb++) {
337  path[swb+1][cb].prev_idx = cb;
338  path[swb+1][cb].cost = path[swb][cb].cost;
339  path[swb+1][cb].run = path[swb][cb].run + 1;
340  }
341  } else {
342  float minrd = next_minrd;
343  int mincb = next_mincb;
344  next_minrd = INFINITY;
345  next_mincb = 0;
346  for (cb = 0; cb < 12; cb++) {
347  float cost_stay_here, cost_get_here;
348  float rd = 0.0f;
349  for (w = 0; w < group_len; w++) {
350  FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(win+w)*16+swb];
351  rd += quantize_band_cost(s, sce->coeffs + start + w*128,
352  s->scoefs + start + w*128, size,
353  sce->sf_idx[(win+w)*16+swb], cb,
354  lambda / band->threshold, INFINITY, NULL);
355  }
356  cost_stay_here = path[swb][cb].cost + rd;
357  cost_get_here = minrd + rd + run_bits + 4;
358  if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run]
359  != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1])
360  cost_stay_here += run_bits;
361  if (cost_get_here < cost_stay_here) {
362  path[swb+1][cb].prev_idx = mincb;
363  path[swb+1][cb].cost = cost_get_here;
364  path[swb+1][cb].run = 1;
365  } else {
366  path[swb+1][cb].prev_idx = cb;
367  path[swb+1][cb].cost = cost_stay_here;
368  path[swb+1][cb].run = path[swb][cb].run + 1;
369  }
370  if (path[swb+1][cb].cost < next_minrd) {
371  next_minrd = path[swb+1][cb].cost;
372  next_mincb = cb;
373  }
374  }
375  }
376  start += sce->ics.swb_sizes[swb];
377  }
378 
379  //convert resulting path from backward-linked list
380  stack_len = 0;
381  idx = 0;
382  for (cb = 1; cb < 12; cb++)
383  if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
384  idx = cb;
385  ppos = max_sfb;
386  while (ppos > 0) {
387  cb = idx;
388  stackrun[stack_len] = path[ppos][cb].run;
389  stackcb [stack_len] = cb;
390  idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx;
391  ppos -= path[ppos][cb].run;
392  stack_len++;
393  }
394  //perform actual band info encoding
395  start = 0;
396  for (i = stack_len - 1; i >= 0; i--) {
397  put_bits(&s->pb, 4, stackcb[i]);
398  count = stackrun[i];
399  memset(sce->zeroes + win*16 + start, !stackcb[i], count);
400  //XXX: memset when band_type is also uint8_t
401  for (j = 0; j < count; j++) {
402  sce->band_type[win*16 + start] = stackcb[i];
403  start++;
404  }
405  while (count >= run_esc) {
406  put_bits(&s->pb, run_bits, run_esc);
407  count -= run_esc;
408  }
409  put_bits(&s->pb, run_bits, count);
410  }
411 }
412 
414  int win, int group_len, const float lambda)
415 {
416  BandCodingPath path[120][12];
417  int w, swb, cb, start, size;
418  int i, j;
419  const int max_sfb = sce->ics.max_sfb;
420  const int run_bits = sce->ics.num_windows == 1 ? 5 : 3;
421  const int run_esc = (1 << run_bits) - 1;
422  int idx, ppos, count;
423  int stackrun[120], stackcb[120], stack_len;
424  float next_minbits = INFINITY;
425  int next_mincb = 0;
426 
427  abs_pow34_v(s->scoefs, sce->coeffs, 1024);
428  start = win*128;
429  for (cb = 0; cb < 12; cb++) {
430  path[0][cb].cost = run_bits+4;
431  path[0][cb].prev_idx = -1;
432  path[0][cb].run = 0;
433  }
434  for (swb = 0; swb < max_sfb; swb++) {
435  size = sce->ics.swb_sizes[swb];
436  if (sce->zeroes[win*16 + swb]) {
437  float cost_stay_here = path[swb][0].cost;
438  float cost_get_here = next_minbits + run_bits + 4;
439  if ( run_value_bits[sce->ics.num_windows == 8][path[swb][0].run]
440  != run_value_bits[sce->ics.num_windows == 8][path[swb][0].run+1])
441  cost_stay_here += run_bits;
442  if (cost_get_here < cost_stay_here) {
443  path[swb+1][0].prev_idx = next_mincb;
444  path[swb+1][0].cost = cost_get_here;
445  path[swb+1][0].run = 1;
446  } else {
447  path[swb+1][0].prev_idx = 0;
448  path[swb+1][0].cost = cost_stay_here;
449  path[swb+1][0].run = path[swb][0].run + 1;
450  }
451  next_minbits = path[swb+1][0].cost;
452  next_mincb = 0;
453  for (cb = 1; cb < 12; cb++) {
454  path[swb+1][cb].cost = 61450;
455  path[swb+1][cb].prev_idx = -1;
456  path[swb+1][cb].run = 0;
457  }
458  } else {
459  float minbits = next_minbits;
460  int mincb = next_mincb;
461  int startcb = sce->band_type[win*16+swb];
462  next_minbits = INFINITY;
463  next_mincb = 0;
464  for (cb = 0; cb < startcb; cb++) {
465  path[swb+1][cb].cost = 61450;
466  path[swb+1][cb].prev_idx = -1;
467  path[swb+1][cb].run = 0;
468  }
469  for (cb = startcb; cb < 12; cb++) {
470  float cost_stay_here, cost_get_here;
471  float bits = 0.0f;
472  for (w = 0; w < group_len; w++) {
473  bits += quantize_band_cost(s, sce->coeffs + start + w*128,
474  s->scoefs + start + w*128, size,
475  sce->sf_idx[(win+w)*16+swb], cb,
476  0, INFINITY, NULL);
477  }
478  cost_stay_here = path[swb][cb].cost + bits;
479  cost_get_here = minbits + bits + run_bits + 4;
480  if ( run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run]
481  != run_value_bits[sce->ics.num_windows == 8][path[swb][cb].run+1])
482  cost_stay_here += run_bits;
483  if (cost_get_here < cost_stay_here) {
484  path[swb+1][cb].prev_idx = mincb;
485  path[swb+1][cb].cost = cost_get_here;
486  path[swb+1][cb].run = 1;
487  } else {
488  path[swb+1][cb].prev_idx = cb;
489  path[swb+1][cb].cost = cost_stay_here;
490  path[swb+1][cb].run = path[swb][cb].run + 1;
491  }
492  if (path[swb+1][cb].cost < next_minbits) {
493  next_minbits = path[swb+1][cb].cost;
494  next_mincb = cb;
495  }
496  }
497  }
498  start += sce->ics.swb_sizes[swb];
499  }
500 
501  //convert resulting path from backward-linked list
502  stack_len = 0;
503  idx = 0;
504  for (cb = 1; cb < 12; cb++)
505  if (path[max_sfb][cb].cost < path[max_sfb][idx].cost)
506  idx = cb;
507  ppos = max_sfb;
508  while (ppos > 0) {
509  av_assert1(idx >= 0);
510  cb = idx;
511  stackrun[stack_len] = path[ppos][cb].run;
512  stackcb [stack_len] = cb;
513  idx = path[ppos-path[ppos][cb].run+1][cb].prev_idx;
514  ppos -= path[ppos][cb].run;
515  stack_len++;
516  }
517  //perform actual band info encoding
518  start = 0;
519  for (i = stack_len - 1; i >= 0; i--) {
520  put_bits(&s->pb, 4, stackcb[i]);
521  count = stackrun[i];
522  memset(sce->zeroes + win*16 + start, !stackcb[i], count);
523  //XXX: memset when band_type is also uint8_t
524  for (j = 0; j < count; j++) {
525  sce->band_type[win*16 + start] = stackcb[i];
526  start++;
527  }
528  while (count >= run_esc) {
529  put_bits(&s->pb, run_bits, run_esc);
530  count -= run_esc;
531  }
532  put_bits(&s->pb, run_bits, count);
533  }
534 }
535 
536 /** Return the minimum scalefactor where the quantized coef does not clip. */
537 static av_always_inline uint8_t coef2minsf(float coef) {
538  return av_clip_uint8(log2f(coef)*4 - 69 + SCALE_ONE_POS - SCALE_DIV_512);
539 }
540 
541 /** Return the maximum scalefactor where the quantized coef is not zero. */
542 static av_always_inline uint8_t coef2maxsf(float coef) {
543  return av_clip_uint8(log2f(coef)*4 + 6 + SCALE_ONE_POS - SCALE_DIV_512);
544 }
545 
546 typedef struct TrellisPath {
547  float cost;
548  int prev;
549 } TrellisPath;
550 
551 #define TRELLIS_STAGES 121
552 #define TRELLIS_STATES (SCALE_MAX_DIFF+1)
553 
556  const float lambda)
557 {
558  int q, w, w2, g, start = 0;
559  int i, j;
560  int idx;
562  int bandaddr[TRELLIS_STAGES];
563  int minq;
564  float mincost;
565  float q0f = FLT_MAX, q1f = 0.0f, qnrgf = 0.0f;
566  int q0, q1, qcnt = 0;
567 
568  for (i = 0; i < 1024; i++) {
569  float t = fabsf(sce->coeffs[i]);
570  if (t > 0.0f) {
571  q0f = FFMIN(q0f, t);
572  q1f = FFMAX(q1f, t);
573  qnrgf += t*t;
574  qcnt++;
575  }
576  }
577 
578  if (!qcnt) {
579  memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
580  memset(sce->zeroes, 1, sizeof(sce->zeroes));
581  return;
582  }
583 
584  //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
585  q0 = coef2minsf(q0f);
586  //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
587  q1 = coef2maxsf(q1f);
588  if (q1 - q0 > 60) {
589  int q0low = q0;
590  int q1high = q1;
591  //minimum scalefactor index is when maximum nonzero coefficient after quantizing is not clipped
592  int qnrg = av_clip_uint8(log2f(sqrtf(qnrgf/qcnt))*4 - 31 + SCALE_ONE_POS - SCALE_DIV_512);
593  q1 = qnrg + 30;
594  q0 = qnrg - 30;
595  if (q0 < q0low) {
596  q1 += q0low - q0;
597  q0 = q0low;
598  } else if (q1 > q1high) {
599  q0 -= q1 - q1high;
600  q1 = q1high;
601  }
602  }
603 
604  for (i = 0; i < TRELLIS_STATES; i++) {
605  paths[0][i].cost = 0.0f;
606  paths[0][i].prev = -1;
607  }
608  for (j = 1; j < TRELLIS_STAGES; j++) {
609  for (i = 0; i < TRELLIS_STATES; i++) {
610  paths[j][i].cost = INFINITY;
611  paths[j][i].prev = -2;
612  }
613  }
614  idx = 1;
615  abs_pow34_v(s->scoefs, sce->coeffs, 1024);
616  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
617  start = w*128;
618  for (g = 0; g < sce->ics.num_swb; g++) {
619  const float *coefs = sce->coeffs + start;
620  float qmin, qmax;
621  int nz = 0;
622 
623  bandaddr[idx] = w * 16 + g;
624  qmin = INT_MAX;
625  qmax = 0.0f;
626  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
627  FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
628  if (band->energy <= band->threshold || band->threshold == 0.0f) {
629  sce->zeroes[(w+w2)*16+g] = 1;
630  continue;
631  }
632  sce->zeroes[(w+w2)*16+g] = 0;
633  nz = 1;
634  for (i = 0; i < sce->ics.swb_sizes[g]; i++) {
635  float t = fabsf(coefs[w2*128+i]);
636  if (t > 0.0f)
637  qmin = FFMIN(qmin, t);
638  qmax = FFMAX(qmax, t);
639  }
640  }
641  if (nz) {
642  int minscale, maxscale;
643  float minrd = INFINITY;
644  float maxval;
645  //minimum scalefactor index is when minimum nonzero coefficient after quantizing is not clipped
646  minscale = coef2minsf(qmin);
647  //maximum scalefactor index is when maximum coefficient after quantizing is still not zero
648  maxscale = coef2maxsf(qmax);
649  minscale = av_clip(minscale - q0, 0, TRELLIS_STATES - 1);
650  maxscale = av_clip(maxscale - q0, 0, TRELLIS_STATES);
651  maxval = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], s->scoefs+start);
652  for (q = minscale; q < maxscale; q++) {
653  float dist = 0;
654  int cb = find_min_book(maxval, sce->sf_idx[w*16+g]);
655  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
656  FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
657  dist += quantize_band_cost(s, coefs + w2*128, s->scoefs + start + w2*128, sce->ics.swb_sizes[g],
658  q + q0, cb, lambda / band->threshold, INFINITY, NULL);
659  }
660  minrd = FFMIN(minrd, dist);
661 
662  for (i = 0; i < q1 - q0; i++) {
663  float cost;
664  cost = paths[idx - 1][i].cost + dist
666  if (cost < paths[idx][q].cost) {
667  paths[idx][q].cost = cost;
668  paths[idx][q].prev = i;
669  }
670  }
671  }
672  } else {
673  for (q = 0; q < q1 - q0; q++) {
674  paths[idx][q].cost = paths[idx - 1][q].cost + 1;
675  paths[idx][q].prev = q;
676  }
677  }
678  sce->zeroes[w*16+g] = !nz;
679  start += sce->ics.swb_sizes[g];
680  idx++;
681  }
682  }
683  idx--;
684  mincost = paths[idx][0].cost;
685  minq = 0;
686  for (i = 1; i < TRELLIS_STATES; i++) {
687  if (paths[idx][i].cost < mincost) {
688  mincost = paths[idx][i].cost;
689  minq = i;
690  }
691  }
692  while (idx) {
693  sce->sf_idx[bandaddr[idx]] = minq + q0;
694  minq = paths[idx][minq].prev;
695  idx--;
696  }
697  //set the same quantizers inside window groups
698  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
699  for (g = 0; g < sce->ics.num_swb; g++)
700  for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
701  sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
702 }
703 
704 /**
705  * two-loop quantizers search taken from ISO 13818-7 Appendix C
706  */
708  AACEncContext *s,
710  const float lambda)
711 {
712  int start = 0, i, w, w2, g;
713  int destbits = avctx->bit_rate * 1024.0 / avctx->sample_rate / avctx->channels;
714  float dists[128] = { 0 }, uplims[128];
715  float maxvals[128];
716  int fflag, minscaler;
717  int its = 0;
718  int allz = 0;
719  float minthr = INFINITY;
720 
721  // for values above this the decoder might end up in an endless loop
722  // due to always having more bits than what can be encoded.
723  destbits = FFMIN(destbits, 5800);
724  //XXX: some heuristic to determine initial quantizers will reduce search time
725  //determine zero bands and upper limits
726  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
727  for (g = 0; g < sce->ics.num_swb; g++) {
728  int nz = 0;
729  float uplim = 0.0f;
730  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
731  FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
732  uplim += band->threshold;
733  if (band->energy <= band->threshold || band->threshold == 0.0f) {
734  sce->zeroes[(w+w2)*16+g] = 1;
735  continue;
736  }
737  nz = 1;
738  }
739  uplims[w*16+g] = uplim *512;
740  sce->zeroes[w*16+g] = !nz;
741  if (nz)
742  minthr = FFMIN(minthr, uplim);
743  allz |= nz;
744  }
745  }
746  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
747  for (g = 0; g < sce->ics.num_swb; g++) {
748  if (sce->zeroes[w*16+g]) {
749  sce->sf_idx[w*16+g] = SCALE_ONE_POS;
750  continue;
751  }
752  sce->sf_idx[w*16+g] = SCALE_ONE_POS + FFMIN(log2f(uplims[w*16+g]/minthr)*4,59);
753  }
754  }
755 
756  if (!allz)
757  return;
758  abs_pow34_v(s->scoefs, sce->coeffs, 1024);
759 
760  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
761  start = w*128;
762  for (g = 0; g < sce->ics.num_swb; g++) {
763  const float *scaled = s->scoefs + start;
764  maxvals[w*16+g] = find_max_val(sce->ics.group_len[w], sce->ics.swb_sizes[g], scaled);
765  start += sce->ics.swb_sizes[g];
766  }
767  }
768 
769  //perform two-loop search
770  //outer loop - improve quality
771  do {
772  int tbits, qstep;
773  minscaler = sce->sf_idx[0];
774  //inner loop - quantize spectrum to fit into given number of bits
775  qstep = its ? 1 : 32;
776  do {
777  int prev = -1;
778  tbits = 0;
779  fflag = 0;
780  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
781  start = w*128;
782  for (g = 0; g < sce->ics.num_swb; g++) {
783  const float *coefs = sce->coeffs + start;
784  const float *scaled = s->scoefs + start;
785  int bits = 0;
786  int cb;
787  float dist = 0.0f;
788 
789  if (sce->zeroes[w*16+g] || sce->sf_idx[w*16+g] >= 218) {
790  start += sce->ics.swb_sizes[g];
791  continue;
792  }
793  minscaler = FFMIN(minscaler, sce->sf_idx[w*16+g]);
794  cb = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
795  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
796  int b;
797  dist += quantize_band_cost(s, coefs + w2*128,
798  scaled + w2*128,
799  sce->ics.swb_sizes[g],
800  sce->sf_idx[w*16+g],
801  cb,
802  1.0f,
803  INFINITY,
804  &b);
805  bits += b;
806  }
807  dists[w*16+g] = dist - bits;
808  if (prev != -1) {
809  bits += ff_aac_scalefactor_bits[sce->sf_idx[w*16+g] - prev + SCALE_DIFF_ZERO];
810  }
811  tbits += bits;
812  start += sce->ics.swb_sizes[g];
813  prev = sce->sf_idx[w*16+g];
814  }
815  }
816  if (tbits > destbits) {
817  for (i = 0; i < 128; i++)
818  if (sce->sf_idx[i] < 218 - qstep)
819  sce->sf_idx[i] += qstep;
820  } else {
821  for (i = 0; i < 128; i++)
822  if (sce->sf_idx[i] > 60 - qstep)
823  sce->sf_idx[i] -= qstep;
824  }
825  qstep >>= 1;
826  if (!qstep && tbits > destbits*1.02 && sce->sf_idx[0] < 217)
827  qstep = 1;
828  } while (qstep);
829 
830  fflag = 0;
831  minscaler = av_clip(minscaler, 60, 255 - SCALE_MAX_DIFF);
832  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
833  for (g = 0; g < sce->ics.num_swb; g++) {
834  int prevsc = sce->sf_idx[w*16+g];
835  if (dists[w*16+g] > uplims[w*16+g] && sce->sf_idx[w*16+g] > 60) {
836  if (find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]-1))
837  sce->sf_idx[w*16+g]--;
838  else //Try to make sure there is some energy in every band
839  sce->sf_idx[w*16+g]-=2;
840  }
841  sce->sf_idx[w*16+g] = av_clip(sce->sf_idx[w*16+g], minscaler, minscaler + SCALE_MAX_DIFF);
842  sce->sf_idx[w*16+g] = FFMIN(sce->sf_idx[w*16+g], 219);
843  if (sce->sf_idx[w*16+g] != prevsc)
844  fflag = 1;
845  sce->band_type[w*16+g] = find_min_book(maxvals[w*16+g], sce->sf_idx[w*16+g]);
846  }
847  }
848  its++;
849  } while (fflag && its < 10);
850 }
851 
854  const float lambda)
855 {
856  int start = 0, i, w, w2, g;
857  float uplim[128], maxq[128];
858  int minq, maxsf;
859  float distfact = ((sce->ics.num_windows > 1) ? 85.80 : 147.84) / lambda;
860  int last = 0, lastband = 0, curband = 0;
861  float avg_energy = 0.0;
862  if (sce->ics.num_windows == 1) {
863  start = 0;
864  for (i = 0; i < 1024; i++) {
865  if (i - start >= sce->ics.swb_sizes[curband]) {
866  start += sce->ics.swb_sizes[curband];
867  curband++;
868  }
869  if (sce->coeffs[i]) {
870  avg_energy += sce->coeffs[i] * sce->coeffs[i];
871  last = i;
872  lastband = curband;
873  }
874  }
875  } else {
876  for (w = 0; w < 8; w++) {
877  const float *coeffs = sce->coeffs + w*128;
878  curband = start = 0;
879  for (i = 0; i < 128; i++) {
880  if (i - start >= sce->ics.swb_sizes[curband]) {
881  start += sce->ics.swb_sizes[curband];
882  curband++;
883  }
884  if (coeffs[i]) {
885  avg_energy += coeffs[i] * coeffs[i];
886  last = FFMAX(last, i);
887  lastband = FFMAX(lastband, curband);
888  }
889  }
890  }
891  }
892  last++;
893  avg_energy /= last;
894  if (avg_energy == 0.0f) {
895  for (i = 0; i < FF_ARRAY_ELEMS(sce->sf_idx); i++)
896  sce->sf_idx[i] = SCALE_ONE_POS;
897  return;
898  }
899  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
900  start = w*128;
901  for (g = 0; g < sce->ics.num_swb; g++) {
902  float *coefs = sce->coeffs + start;
903  const int size = sce->ics.swb_sizes[g];
904  int start2 = start, end2 = start + size, peakpos = start;
905  float maxval = -1, thr = 0.0f, t;
906  maxq[w*16+g] = 0.0f;
907  if (g > lastband) {
908  maxq[w*16+g] = 0.0f;
909  start += size;
910  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++)
911  memset(coefs + w2*128, 0, sizeof(coefs[0])*size);
912  continue;
913  }
914  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
915  for (i = 0; i < size; i++) {
916  float t = coefs[w2*128+i]*coefs[w2*128+i];
917  maxq[w*16+g] = FFMAX(maxq[w*16+g], fabsf(coefs[w2*128 + i]));
918  thr += t;
919  if (sce->ics.num_windows == 1 && maxval < t) {
920  maxval = t;
921  peakpos = start+i;
922  }
923  }
924  }
925  if (sce->ics.num_windows == 1) {
926  start2 = FFMAX(peakpos - 2, start2);
927  end2 = FFMIN(peakpos + 3, end2);
928  } else {
929  start2 -= start;
930  end2 -= start;
931  }
932  start += size;
933  thr = pow(thr / (avg_energy * (end2 - start2)), 0.3 + 0.1*(lastband - g) / lastband);
934  t = 1.0 - (1.0 * start2 / last);
935  uplim[w*16+g] = distfact / (1.4 * thr + t*t*t + 0.075);
936  }
937  }
938  memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
939  abs_pow34_v(s->scoefs, sce->coeffs, 1024);
940  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
941  start = w*128;
942  for (g = 0; g < sce->ics.num_swb; g++) {
943  const float *coefs = sce->coeffs + start;
944  const float *scaled = s->scoefs + start;
945  const int size = sce->ics.swb_sizes[g];
946  int scf, prev_scf, step;
947  int min_scf = -1, max_scf = 256;
948  float curdiff;
949  if (maxq[w*16+g] < 21.544) {
950  sce->zeroes[w*16+g] = 1;
951  start += size;
952  continue;
953  }
954  sce->zeroes[w*16+g] = 0;
955  scf = prev_scf = av_clip(SCALE_ONE_POS - SCALE_DIV_512 - log2f(1/maxq[w*16+g])*16/3, 60, 218);
956  step = 16;
957  for (;;) {
958  float dist = 0.0f;
959  int quant_max;
960 
961  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
962  int b;
963  dist += quantize_band_cost(s, coefs + w2*128,
964  scaled + w2*128,
965  sce->ics.swb_sizes[g],
966  scf,
967  ESC_BT,
968  lambda,
969  INFINITY,
970  &b);
971  dist -= b;
972  }
973  dist *= 1.0f / 512.0f / lambda;
974  quant_max = quant(maxq[w*16+g], ff_aac_pow2sf_tab[POW_SF2_ZERO - scf + SCALE_ONE_POS - SCALE_DIV_512]);
975  if (quant_max >= 8191) { // too much, return to the previous quantizer
976  sce->sf_idx[w*16+g] = prev_scf;
977  break;
978  }
979  prev_scf = scf;
980  curdiff = fabsf(dist - uplim[w*16+g]);
981  if (curdiff <= 1.0f)
982  step = 0;
983  else
984  step = log2f(curdiff);
985  if (dist > uplim[w*16+g])
986  step = -step;
987  scf += step;
988  scf = av_clip_uint8(scf);
989  step = scf - prev_scf;
990  if (FFABS(step) <= 1 || (step > 0 && scf >= max_scf) || (step < 0 && scf <= min_scf)) {
991  sce->sf_idx[w*16+g] = av_clip(scf, min_scf, max_scf);
992  break;
993  }
994  if (step > 0)
995  min_scf = prev_scf;
996  else
997  max_scf = prev_scf;
998  }
999  start += size;
1000  }
1001  }
1002  minq = sce->sf_idx[0] ? sce->sf_idx[0] : INT_MAX;
1003  for (i = 1; i < 128; i++) {
1004  if (!sce->sf_idx[i])
1005  sce->sf_idx[i] = sce->sf_idx[i-1];
1006  else
1007  minq = FFMIN(minq, sce->sf_idx[i]);
1008  }
1009  if (minq == INT_MAX)
1010  minq = 0;
1011  minq = FFMIN(minq, SCALE_MAX_POS);
1012  maxsf = FFMIN(minq + SCALE_MAX_DIFF, SCALE_MAX_POS);
1013  for (i = 126; i >= 0; i--) {
1014  if (!sce->sf_idx[i])
1015  sce->sf_idx[i] = sce->sf_idx[i+1];
1016  sce->sf_idx[i] = av_clip(sce->sf_idx[i], minq, maxsf);
1017  }
1018 }
1019 
1021  SingleChannelElement *sce,
1022  const float lambda)
1023 {
1024  int i, w, w2, g;
1025  int minq = 255;
1026 
1027  memset(sce->sf_idx, 0, sizeof(sce->sf_idx));
1028  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w]) {
1029  for (g = 0; g < sce->ics.num_swb; g++) {
1030  for (w2 = 0; w2 < sce->ics.group_len[w]; w2++) {
1031  FFPsyBand *band = &s->psy.ch[s->cur_channel].psy_bands[(w+w2)*16+g];
1032  if (band->energy <= band->threshold) {
1033  sce->sf_idx[(w+w2)*16+g] = 218;
1034  sce->zeroes[(w+w2)*16+g] = 1;
1035  } else {
1036  sce->sf_idx[(w+w2)*16+g] = av_clip(SCALE_ONE_POS - SCALE_DIV_512 + log2f(band->threshold), 80, 218);
1037  sce->zeroes[(w+w2)*16+g] = 0;
1038  }
1039  minq = FFMIN(minq, sce->sf_idx[(w+w2)*16+g]);
1040  }
1041  }
1042  }
1043  for (i = 0; i < 128; i++) {
1044  sce->sf_idx[i] = 140;
1045  //av_clip(sce->sf_idx[i], minq, minq + SCALE_MAX_DIFF - 1);
1046  }
1047  //set the same quantizers inside window groups
1048  for (w = 0; w < sce->ics.num_windows; w += sce->ics.group_len[w])
1049  for (g = 0; g < sce->ics.num_swb; g++)
1050  for (w2 = 1; w2 < sce->ics.group_len[w]; w2++)
1051  sce->sf_idx[(w+w2)*16+g] = sce->sf_idx[w*16+g];
1052 }
1053 
1055  const float lambda)
1056 {
1057  int start = 0, i, w, w2, g;
1058  float M[128], S[128];
1059  float *L34 = s->scoefs, *R34 = s->scoefs + 128, *M34 = s->scoefs + 128*2, *S34 = s->scoefs + 128*3;
1060  SingleChannelElement *sce0 = &cpe->ch[0];
1061  SingleChannelElement *sce1 = &cpe->ch[1];
1062  if (!cpe->common_window)
1063  return;
1064  for (w = 0; w < sce0->ics.num_windows; w += sce0->ics.group_len[w]) {
1065  for (g = 0; g < sce0->ics.num_swb; g++) {
1066  if (!cpe->ch[0].zeroes[w*16+g] && !cpe->ch[1].zeroes[w*16+g]) {
1067  float dist1 = 0.0f, dist2 = 0.0f;
1068  for (w2 = 0; w2 < sce0->ics.group_len[w]; w2++) {
1069  FFPsyBand *band0 = &s->psy.ch[s->cur_channel+0].psy_bands[(w+w2)*16+g];
1070  FFPsyBand *band1 = &s->psy.ch[s->cur_channel+1].psy_bands[(w+w2)*16+g];
1071  float minthr = FFMIN(band0->threshold, band1->threshold);
1072  float maxthr = FFMAX(band0->threshold, band1->threshold);
1073  for (i = 0; i < sce0->ics.swb_sizes[g]; i++) {
1074  M[i] = (sce0->coeffs[start+w2*128+i]
1075  + sce1->coeffs[start+w2*128+i]) * 0.5;
1076  S[i] = M[i]
1077  - sce1->coeffs[start+w2*128+i];
1078  }
1079  abs_pow34_v(L34, sce0->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
1080  abs_pow34_v(R34, sce1->coeffs+start+w2*128, sce0->ics.swb_sizes[g]);
1081  abs_pow34_v(M34, M, sce0->ics.swb_sizes[g]);
1082  abs_pow34_v(S34, S, sce0->ics.swb_sizes[g]);
1083  dist1 += quantize_band_cost(s, sce0->coeffs + start + w2*128,
1084  L34,
1085  sce0->ics.swb_sizes[g],
1086  sce0->sf_idx[(w+w2)*16+g],
1087  sce0->band_type[(w+w2)*16+g],
1088  lambda / band0->threshold, INFINITY, NULL);
1089  dist1 += quantize_band_cost(s, sce1->coeffs + start + w2*128,
1090  R34,
1091  sce1->ics.swb_sizes[g],
1092  sce1->sf_idx[(w+w2)*16+g],
1093  sce1->band_type[(w+w2)*16+g],
1094  lambda / band1->threshold, INFINITY, NULL);
1095  dist2 += quantize_band_cost(s, M,
1096  M34,
1097  sce0->ics.swb_sizes[g],
1098  sce0->sf_idx[(w+w2)*16+g],
1099  sce0->band_type[(w+w2)*16+g],
1100  lambda / maxthr, INFINITY, NULL);
1101  dist2 += quantize_band_cost(s, S,
1102  S34,
1103  sce1->ics.swb_sizes[g],
1104  sce1->sf_idx[(w+w2)*16+g],
1105  sce1->band_type[(w+w2)*16+g],
1106  lambda / minthr, INFINITY, NULL);
1107  }
1108  cpe->ms_mask[w*16+g] = dist2 < dist1;
1109  }
1110  start += sce0->ics.swb_sizes[g];
1111  }
1112  }
1113 }
1114 
1116  {
1120  search_for_ms,
1121  },
1122  {
1126  search_for_ms,
1127  },
1128  {
1132  search_for_ms,
1133  },
1134  {
1138  search_for_ms,
1139  },
1140 };
static const uint8_t run_value_bits_long[64]
bits needed to code codebook run value for long windows
Definition: aaccoder.c:44
Definition: start.py:1
#define INFINITY
Definition: math.h:6
struct TrellisPath TrellisPath
const char * s
Definition: avisynth_c.h:668
AACCoefficientsEncoder ff_aac_coders[AAC_CODER_NB]
Definition: aaccoder.c:1115
#define QUANTIZE_AND_ENCODE_BAND_COST_FUNC(NAME, BT_ZERO, BT_UNSIGNED, BT_PAIR, BT_ESC)
Definition: aaccoder.c:210
static av_always_inline uint8_t coef2maxsf(float coef)
Return the maximum scalefactor where the quantized coef is not zero.
Definition: aaccoder.c:542
static void encode_window_bands_info(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
Encode band info for single window group bands.
Definition: aaccoder.c:312
#define SCALE_DIFF_ZERO
codebook index corresponding to zero scalefactor indices difference
Definition: aac.h:142
FFPsyBand psy_bands[PSY_MAX_BANDS]
channel bands information
Definition: psymodel.h:49
static const uint8_t run_value_bits_short[16]
bits needed to code codebook run value for short windows
Definition: aaccoder.c:52
#define SCALE_MAX_POS
scalefactor index maximum value
Definition: aac.h:140
#define TRELLIS_STATES
Definition: aaccoder.c:552
static int find_min_book(float maxval, int sf)
Definition: aaccoder.c:285
#define SCALE_MAX_DIFF
maximum scalefactor difference allowed by standard
Definition: aac.h:141
Sinusoidal phase f
location of range
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
int common_window
Set if channels share a common &#39;IndividualChannelStream&#39; in bitstream.
Definition: aac.h:249
#define quantize_and_encode_band_cost(s, pb, in, scaled, size, scale_idx, cb, lambda, uplim, bits)
Definition: aaccoder.c:250
float cost
Definition: aaccoder.c:547
int prev_idx
pointer to the previous path point
Definition: aaccoder.c:304
#define FF_ARRAY_ELEMS(a)
uint8_t ms_mask[128]
Set if mid/side stereo is used for each scalefactor window band.
Definition: aac.h:251
static const uint8_t * run_value_bits[2]
Definition: aaccoder.c:56
static void search_for_quantizers_fast(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
Definition: aaccoder.c:1020
output residual component w
#define M(a, b)
Definition: vp3dsp.c:43
AAC encoder context.
Definition: aacenc.h:57
uint8_t bits
Definition: crc.c:216
uint8_t
static void search_for_ms(AACEncContext *s, ChannelElement *cpe, const float lambda)
Definition: aaccoder.c:1054
SingleChannelElement ch[2]
Definition: aac.h:253
static av_always_inline int quant(float coef, const float Q)
Quantize one coefficient.
Definition: aaccoder.c:66
#define b
Definition: input.c:42
const uint8_t ff_aac_scalefactor_bits[121]
Definition: aactab.c:70
static const uint8_t run_bits[7][16]
Definition: h264_cavlc.c:229
single band psychoacoustic information
Definition: psymodel.h:37
#define ZERO
Definition: hpeldsp_vis.c:102
static const uint8_t aac_cb_range[12]
Definition: aaccoder.c:97
static av_always_inline uint8_t coef2minsf(float coef)
Return the minimum scalefactor where the quantized coef does not clip.
Definition: aaccoder.c:537
static av_always_inline float quantize_and_encode_band_cost_template(struct AACEncContext *s, PutBitContext *pb, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits, int BT_ZERO, int BT_UNSIGNED, int BT_PAIR, int BT_ESC)
Calculate rate distortion cost for quantizing with given codebook.
Definition: aaccoder.c:105
#define S(s, c, i)
uint8_t max_sfb
number of scalefactor bands per group
Definition: aac.h:158
float energy
Definition: psymodel.h:39
static void put_bits(J2kEncoderContext *s, int val, int n)
put n times val bit
Definition: j2kenc.c:160
int num_swb
number of scalefactor window bands
Definition: aac.h:166
float cost
path cost
Definition: aaccoder.c:305
#define FFMAX(a, b)
Definition: common.h:56
static void quantize_bands(int *out, const float *in, const float *scaled, int size, float Q34, int is_signed, int maxval)
Definition: aaccoder.c:72
external API header
static float quantize_band_cost(struct AACEncContext *s, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits)
Definition: aaccoder.c:257
const float *const ff_aac_codebook_vectors[]
Definition: aactab.c:896
int size
#define POW_SF2_ZERO
ff_aac_pow2sf_tab index corresponding to pow(2, 0);
#define SCALE_DIV_512
scalefactor difference that corresponds to scale difference in 512 times
Definition: aac.h:138
static void search_for_quantizers_anmr(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
Definition: aaccoder.c:554
FFT buffer for g
Definition: stft_peak.m:17
static void quantize_and_encode_band(struct AACEncContext *s, PutBitContext *pb, const float *in, int size, int scale_idx, int cb, const float lambda)
Definition: aaccoder.c:266
int bit_rate
the average bitrate
#define av_assert1(cond)
assert() equivalent, that does not lie in speed critical code.
Definition: avassert.h:53
int cur_channel
Definition: aacenc.h:74
const uint8_t *const ff_aac_spectral_bits[11]
Definition: aactab.c:400
#define FFMIN(a, b)
Definition: common.h:58
t
Definition: genspecsines3.m:6
#define FFABS(a)
Definition: common.h:53
AAC definitions and structures.
static void abs_pow34_v(float *out, const float *in, const int size)
Definition: aaccoder.c:86
PutBitContext pb
Definition: aacenc.h:60
float ff_aac_pow34sf_tab[428]
Definition: aacenc.c:56
#define TRELLIS_STAGES
Definition: aaccoder.c:551
NULL
Definition: eval.c:55
int sample_rate
samples per second
FIXME Range Coding of cb
Definition: snow.txt:367
static void codebook_trellis_rate(AACEncContext *s, SingleChannelElement *sce, int win, int group_len, const float lambda)
Definition: aaccoder.c:413
main external API structure.
IndividualChannelStream ics
Definition: aac.h:228
static av_always_inline float cbrtf(float x)
Definition: libm.h:59
structure used in optimal codebook search
Definition: aaccoder.c:303
uint8_t group_len[8]
Definition: aac.h:162
Replacements for frequently missing libm functions.
synthesis window for stochastic i
Spectral data are coded with an escape sequence.
Definition: aac.h:78
const uint8_t * swb_sizes
table of scalefactor band sizes for a particular window
Definition: aac.h:165
int dim
static float(*const quantize_and_encode_band_cost_arr[])(struct AACEncContext *s, PutBitContext *pb, const float *in, const float *scaled, int size, int scale_idx, int cb, const float lambda, const float uplim, int *bits)
Definition: aaccoder.c:230
FFPsyContext psy
Definition: aacenc.h:71
uint8_t zeroes[128]
band is not coded (used by encoder)
Definition: aac.h:235
int sf_idx[128]
scalefactor indices (used by encoder)
Definition: aac.h:234
#define SCALE_ONE_POS
scalefactor index that corresponds to scale=1.0
Definition: aac.h:139
#define AAC_CODER_NB
Definition: aacenc.h:33
static void search_for_quantizers_faac(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
Definition: aaccoder.c:852
static void search_for_quantizers_twoloop(AVCodecContext *avctx, AACEncContext *s, SingleChannelElement *sce, const float lambda)
two-loop quantizers search taken from ISO 13818-7 Appendix C
Definition: aaccoder.c:707
Single Channel Element - used for both SCE and LFE elements.
Definition: aac.h:227
static const uint8_t aac_cb_maxval[12]
Definition: aaccoder.c:98
#define log2f(x)
Definition: libm.h:127
static double c[64]
float ff_aac_pow2sf_tab[428]
Definition: aac_tablegen.h:32
static float find_max_val(int group_len, int swb_size, const float *scaled)
Definition: aaccoder.c:274
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aac.h:247
const uint16_t *const ff_aac_spectral_codes[11]
Definition: aactab.c:395
int len
int channels
number of audio channels
#define av_log2
Definition: intmath.h:89
FFPsyChannel * ch
single channel information
Definition: psymodel.h:80
enum BandType band_type[128]
band types
Definition: aac.h:231
void INT64 INT64 count
Definition: avisynth_c.h:594
void INT64 start
Definition: avisynth_c.h:594
#define av_always_inline
Definition: attributes.h:41
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
struct BandCodingPath BandCodingPath
structure used in optimal codebook search
float threshold
Definition: psymodel.h:40
AAC data declarations.
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about which is also called distortion Distortion can be quantified by almost any quality measurement one chooses the sum of squared differences is used but more complex methods that consider psychovisual effects can be used as well It makes no difference in this discussion First step
bitstream writer API