FFmpeg  2.8.15
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
aacdec_fixed.c
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2013
3  * MIPS Technologies, Inc., California.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  * notice, this list of conditions and the following disclaimer in the
12  * documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the MIPS Technologies, Inc., nor the names of its
14  * contributors may be used to endorse or promote products derived from
15  * this software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE MIPS TECHNOLOGIES, INC. ``AS IS'' AND
18  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL THE MIPS TECHNOLOGIES, INC. BE LIABLE
21  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27  * SUCH DAMAGE.
28  *
29  * AAC decoder fixed-point implementation
30  *
31  * Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
32  * Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
33  *
34  * This file is part of FFmpeg.
35  *
36  * FFmpeg is free software; you can redistribute it and/or
37  * modify it under the terms of the GNU Lesser General Public
38  * License as published by the Free Software Foundation; either
39  * version 2.1 of the License, or (at your option) any later version.
40  *
41  * FFmpeg is distributed in the hope that it will be useful,
42  * but WITHOUT ANY WARRANTY; without even the implied warranty of
43  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
44  * Lesser General Public License for more details.
45  *
46  * You should have received a copy of the GNU Lesser General Public
47  * License along with FFmpeg; if not, write to the Free Software
48  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
49  */
50 
51 /**
52  * @file
53  * AAC decoder
54  * @author Oded Shimon ( ods15 ods15 dyndns org )
55  * @author Maxim Gavrilov ( maxim.gavrilov gmail com )
56  *
57  * Fixed point implementation
58  * @author Stanislav Ocovaj ( stanislav.ocovaj imgtec com )
59  */
60 
61 #define FFT_FLOAT 0
62 #define FFT_FIXED_32 1
63 #define USE_FIXED 1
64 
65 #include "libavutil/fixed_dsp.h"
66 #include "libavutil/opt.h"
67 #include "avcodec.h"
68 #include "internal.h"
69 #include "get_bits.h"
70 #include "fft.h"
71 #include "lpc.h"
72 #include "kbdwin.h"
73 #include "sinewin.h"
74 
75 #include "aac.h"
76 #include "aactab.h"
77 #include "aacdectab.h"
78 #include "cbrt_tablegen.h"
79 #include "sbr.h"
80 #include "aacsbr.h"
81 #include "mpeg4audio.h"
82 #include "aacadtsdec.h"
83 #include "libavutil/intfloat.h"
84 
85 #include <math.h>
86 #include <string.h>
87 
89 {
90  ps->r0.mant = 0;
91  ps->r0.exp = 0;
92  ps->r1.mant = 0;
93  ps->r1.exp = 0;
94  ps->cor0.mant = 0;
95  ps->cor0.exp = 0;
96  ps->cor1.mant = 0;
97  ps->cor1.exp = 0;
98  ps->var0.mant = 0x20000000;
99  ps->var0.exp = 1;
100  ps->var1.mant = 0x20000000;
101  ps->var1.exp = 1;
102 }
103 
104 static const int exp2tab[4] = { Q31(1.0000000000/2), Q31(1.1892071150/2), Q31(1.4142135624/2), Q31(1.6817928305/2) }; // 2^0, 2^0.25, 2^0.5, 2^0.75
105 
106 static inline int *DEC_SPAIR(int *dst, unsigned idx)
107 {
108  dst[0] = (idx & 15) - 4;
109  dst[1] = (idx >> 4 & 15) - 4;
110 
111  return dst + 2;
112 }
113 
114 static inline int *DEC_SQUAD(int *dst, unsigned idx)
115 {
116  dst[0] = (idx & 3) - 1;
117  dst[1] = (idx >> 2 & 3) - 1;
118  dst[2] = (idx >> 4 & 3) - 1;
119  dst[3] = (idx >> 6 & 3) - 1;
120 
121  return dst + 4;
122 }
123 
124 static inline int *DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
125 {
126  dst[0] = (idx & 15) * (1 - (sign & 0xFFFFFFFE));
127  dst[1] = (idx >> 4 & 15) * (1 - ((sign & 1) * 2));
128 
129  return dst + 2;
130 }
131 
132 static inline int *DEC_UQUAD(int *dst, unsigned idx, unsigned sign)
133 {
134  unsigned nz = idx >> 12;
135 
136  dst[0] = (idx & 3) * (1 + (((int)sign >> 31) * 2));
137  sign <<= nz & 1;
138  nz >>= 1;
139  dst[1] = (idx >> 2 & 3) * (1 + (((int)sign >> 31) * 2));
140  sign <<= nz & 1;
141  nz >>= 1;
142  dst[2] = (idx >> 4 & 3) * (1 + (((int)sign >> 31) * 2));
143  sign <<= nz & 1;
144  nz >>= 1;
145  dst[3] = (idx >> 6 & 3) * (1 + (((int)sign >> 31) * 2));
146 
147  return dst + 4;
148 }
149 
150 static void vector_pow43(int *coefs, int len)
151 {
152  int i, coef;
153 
154  for (i=0; i<len; i++) {
155  coef = coefs[i];
156  if (coef < 0)
157  coef = -(int)cbrt_tab[-coef];
158  else
159  coef = (int)cbrt_tab[coef];
160  coefs[i] = coef;
161  }
162 }
163 
164 static void subband_scale(int *dst, int *src, int scale, int offset, int len)
165 {
166  int ssign = scale < 0 ? -1 : 1;
167  int s = FFABS(scale);
168  unsigned int round;
169  int i, out, c = exp2tab[s & 3];
170 
171  s = offset - (s >> 2);
172 
173  if (s > 31) {
174  for (i=0; i<len; i++) {
175  dst[i] = 0;
176  }
177  } else if (s > 0) {
178  round = 1 << (s-1);
179  for (i=0; i<len; i++) {
180  out = (int)(((int64_t)src[i] * c) >> 32);
181  dst[i] = ((int)(out+round) >> s) * ssign;
182  }
183  } else if (s > -32) {
184  s = s + 32;
185  round = 1 << (s-1);
186  for (i=0; i<len; i++) {
187  out = (int)((int64_t)((int64_t)src[i] * c + round) >> s);
188  dst[i] = out * (unsigned)ssign;
189  }
190  } else {
191  av_log(NULL, AV_LOG_ERROR, "Overflow in subband_scale()\n");
192  }
193 }
194 
195 static void noise_scale(int *coefs, int scale, int band_energy, int len)
196 {
197  int ssign = scale < 0 ? -1 : 1;
198  int s = FFABS(scale);
199  unsigned int round;
200  int i, out, c = exp2tab[s & 3];
201  int nlz = 0;
202 
203  while (band_energy > 0x7fff) {
204  band_energy >>= 1;
205  nlz++;
206  }
207  c /= band_energy;
208  s = 21 + nlz - (s >> 2);
209 
210  if (s > 31) {
211  for (i=0; i<len; i++) {
212  coefs[i] = 0;
213  }
214  } else if (s >= 0) {
215  round = s ? 1 << (s-1) : 0;
216  for (i=0; i<len; i++) {
217  out = (int)(((int64_t)coefs[i] * c) >> 32);
218  coefs[i] = ((int)(out+round) >> s) * ssign;
219  }
220  }
221  else {
222  s = s + 32;
223  round = 1 << (s-1);
224  for (i=0; i<len; i++) {
225  out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
226  coefs[i] = out * ssign;
227  }
228  }
229 }
230 
232 {
233  SoftFloat tmp;
234  int s;
235 
236  tmp.exp = pf.exp;
237  s = pf.mant >> 31;
238  tmp.mant = (pf.mant ^ s) - s;
239  tmp.mant = (tmp.mant + 0x00200000U) & 0xFFC00000U;
240  tmp.mant = (tmp.mant ^ s) - s;
241 
242  return tmp;
243 }
244 
246 {
247  SoftFloat tmp;
248  int s;
249 
250  tmp.exp = pf.exp;
251  s = pf.mant >> 31;
252  tmp.mant = (pf.mant ^ s) - s;
253  tmp.mant = (tmp.mant + 0x001FFFFFU + (tmp.mant & 0x00400000U >> 16)) & 0xFFC00000U;
254  tmp.mant = (tmp.mant ^ s) - s;
255 
256  return tmp;
257 }
258 
260 {
261  SoftFloat pun;
262  int s;
263 
264  pun.exp = pf.exp;
265  s = pf.mant >> 31;
266  pun.mant = (pf.mant ^ s) - s;
267  pun.mant = pun.mant & 0xFFC00000U;
268  pun.mant = (pun.mant ^ s) - s;
269 
270  return pun;
271 }
272 
273 static av_always_inline void predict(PredictorState *ps, int *coef,
274  int output_enable)
275 {
276  const SoftFloat a = { 1023410176, 0 }; // 61.0 / 64
277  const SoftFloat alpha = { 973078528, 0 }; // 29.0 / 32
278  SoftFloat e0, e1;
279  SoftFloat pv;
280  SoftFloat k1, k2;
281  SoftFloat r0 = ps->r0, r1 = ps->r1;
282  SoftFloat cor0 = ps->cor0, cor1 = ps->cor1;
283  SoftFloat var0 = ps->var0, var1 = ps->var1;
284  SoftFloat tmp;
285 
286  if (var0.exp > 1 || (var0.exp == 1 && var0.mant > 0x20000000)) {
287  k1 = av_mul_sf(cor0, flt16_even(av_div_sf(a, var0)));
288  }
289  else {
290  k1.mant = 0;
291  k1.exp = 0;
292  }
293 
294  if (var1.exp > 1 || (var1.exp == 1 && var1.mant > 0x20000000)) {
295  k2 = av_mul_sf(cor1, flt16_even(av_div_sf(a, var1)));
296  }
297  else {
298  k2.mant = 0;
299  k2.exp = 0;
300  }
301 
302  tmp = av_mul_sf(k1, r0);
303  pv = flt16_round(av_add_sf(tmp, av_mul_sf(k2, r1)));
304  if (output_enable) {
305  int shift = 28 - pv.exp;
306 
307  if (shift < 31) {
308  if (shift > 0) {
309  *coef += (unsigned)((pv.mant + (1 << (shift - 1))) >> shift);
310  } else
311  *coef += (unsigned)pv.mant << -shift;
312  }
313  }
314 
315  e0 = av_int2sf(*coef, 2);
316  e1 = av_sub_sf(e0, tmp);
317 
318  ps->cor1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor1), av_mul_sf(r1, e1)));
319  tmp = av_add_sf(av_mul_sf(r1, r1), av_mul_sf(e1, e1));
320  tmp.exp--;
321  ps->var1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var1), tmp));
322  ps->cor0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor0), av_mul_sf(r0, e0)));
323  tmp = av_add_sf(av_mul_sf(r0, r0), av_mul_sf(e0, e0));
324  tmp.exp--;
325  ps->var0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var0), tmp));
326 
327  ps->r1 = flt16_trunc(av_mul_sf(a, av_sub_sf(r0, av_mul_sf(k1, e0))));
328  ps->r0 = flt16_trunc(av_mul_sf(a, e0));
329 }
330 
331 
332 static const int cce_scale_fixed[8] = {
333  Q30(1.0), //2^(0/8)
334  Q30(1.0905077327), //2^(1/8)
335  Q30(1.1892071150), //2^(2/8)
336  Q30(1.2968395547), //2^(3/8)
337  Q30(1.4142135624), //2^(4/8)
338  Q30(1.5422108254), //2^(5/8)
339  Q30(1.6817928305), //2^(6/8)
340  Q30(1.8340080864), //2^(7/8)
341 };
342 
343 /**
344  * Apply dependent channel coupling (applied before IMDCT).
345  *
346  * @param index index into coupling gain array
347  */
349  SingleChannelElement *target,
350  ChannelElement *cce, int index)
351 {
352  IndividualChannelStream *ics = &cce->ch[0].ics;
353  const uint16_t *offsets = ics->swb_offset;
354  int *dest = target->coeffs;
355  const int *src = cce->ch[0].coeffs;
356  int g, i, group, k, idx = 0;
357  if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
359  "Dependent coupling is not supported together with LTP\n");
360  return;
361  }
362  for (g = 0; g < ics->num_window_groups; g++) {
363  for (i = 0; i < ics->max_sfb; i++, idx++) {
364  if (cce->ch[0].band_type[idx] != ZERO_BT) {
365  const int gain = cce->coup.gain[index][idx];
366  int shift, round, c, tmp;
367 
368  if (gain < 0) {
369  c = -cce_scale_fixed[-gain & 7];
370  shift = (-gain-1024) >> 3;
371  }
372  else {
373  c = cce_scale_fixed[gain & 7];
374  shift = (gain-1024) >> 3;
375  }
376 
377  if (shift < -31) {
378  // Nothing to do
379  } else if (shift < 0) {
380  shift = -shift;
381  round = 1 << (shift - 1);
382 
383  for (group = 0; group < ics->group_len[g]; group++) {
384  for (k = offsets[i]; k < offsets[i + 1]; k++) {
385  tmp = (int)(((int64_t)src[group * 128 + k] * c + \
386  (int64_t)0x1000000000) >> 37);
387  dest[group * 128 + k] += (tmp + (int64_t)round) >> shift;
388  }
389  }
390  }
391  else {
392  for (group = 0; group < ics->group_len[g]; group++) {
393  for (k = offsets[i]; k < offsets[i + 1]; k++) {
394  tmp = (int)(((int64_t)src[group * 128 + k] * c + \
395  (int64_t)0x1000000000) >> 37);
396  dest[group * 128 + k] += tmp * (1U << shift);
397  }
398  }
399  }
400  }
401  }
402  dest += ics->group_len[g] * 128;
403  src += ics->group_len[g] * 128;
404  }
405 }
406 
407 /**
408  * Apply independent channel coupling (applied after IMDCT).
409  *
410  * @param index index into coupling gain array
411  */
413  SingleChannelElement *target,
414  ChannelElement *cce, int index)
415 {
416  int i, c, shift, round, tmp;
417  const int gain = cce->coup.gain[index][0];
418  const int *src = cce->ch[0].ret;
419  unsigned int *dest = target->ret;
420  const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
421 
422  c = cce_scale_fixed[gain & 7];
423  shift = (gain-1024) >> 3;
424  if (shift < 0) {
425  shift = -shift;
426  round = 1 << (shift - 1);
427 
428  for (i = 0; i < len; i++) {
429  tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
430  dest[i] += (tmp + round) >> shift;
431  }
432  }
433  else {
434  for (i = 0; i < len; i++) {
435  tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
436  dest[i] += tmp * (1U << shift);
437  }
438  }
439 }
440 
441 #include "aacdec_template.c"
442 
444  .name = "aac_fixed",
445  .long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
446  .type = AVMEDIA_TYPE_AUDIO,
447  .id = AV_CODEC_ID_AAC,
448  .priv_data_size = sizeof(AACContext),
450  .close = aac_decode_close,
452  .sample_fmts = (const enum AVSampleFormat[]) {
454  },
456  .channel_layouts = aac_channel_layout,
457  .flush = flush,
458 };
AAC decoder data.
#define NULL
Definition: coverity.c:32
const char * s
Definition: avisynth_c.h:631
static int shift(int a, int b)
Definition: sonic.c:82
static void flush(AVCodecContext *avctx)
AVCodecContext * avctx
Definition: aac.h:290
static av_always_inline SoftFloat flt16_round(SoftFloat pf)
Definition: aacdec_fixed.c:231
static int * DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
Definition: aacdec_fixed.c:124
static void apply_dependent_coupling_fixed(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)
Apply dependent channel coupling (applied before IMDCT).
Definition: aacdec_fixed.c:348
const char * g
Definition: vf_curves.c:108
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static av_const SoftFloat av_div_sf(SoftFloat a, SoftFloat b)
b has to be normalized and not zero.
Definition: softfloat.h:112
static int * DEC_SQUAD(int *dst, unsigned idx)
Definition: aacdec_fixed.c:114
INTFLOAT * ret
PCM output.
Definition: aac.h:264
AAC decoder.
static void vector_pow43(int *coefs, int len)
Definition: aacdec_fixed.c:150
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: avcodec.h:916
static void subband_scale(int *dst, int *src, int scale, int offset, int len)
Definition: aacdec_fixed.c:164
AVCodec.
Definition: avcodec.h:3482
const uint16_t * swb_offset
table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular wind...
Definition: aac.h:178
AAC_FLOAT cor0
Definition: aac.h:136
#define Q30(x)
Definition: aac_defines.h:93
AAC_FLOAT var1
Definition: aac.h:139
AVOptions.
SingleChannelElement ch[2]
Definition: aac.h:279
static av_cold int aac_decode_init(AVCodecContext *avctx)
AAC_FLOAT cor1
Definition: aac.h:137
static void apply_independent_coupling_fixed(AACContext *ac, SingleChannelElement *target, ChannelElement *cce, int index)
Apply independent channel coupling (applied after IMDCT).
Definition: aacdec_fixed.c:412
bitstream reader API header.
int32_t mant
Definition: softfloat.h:35
static av_always_inline void predict(PredictorState *ps, int *coef, int output_enable)
Definition: aacdec_fixed.c:273
#define av_log(a,...)
#define U(x)
Definition: vp56_arith.h:37
MPEG4AudioConfig m4ac
Definition: aac.h:124
float coeffs[1024]
coefficients for IMDCT, maybe processed
Definition: aac.h:258
static double alpha(void *priv, double x, double y)
Definition: vf_geq.c:99
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
AAC_FLOAT r1
Definition: aac.h:141
#define pv
Definition: regdef.h:60
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Definition: internal.h:178
AAC_FLOAT r0
Definition: aac.h:140
Spectral Band Replication definitions and structures.
const char * name
Name of the codec implementation.
Definition: avcodec.h:3489
static av_always_inline av_const double round(double x)
Definition: libm.h:162
uint8_t max_sfb
number of scalefactor bands per group
Definition: aac.h:172
static av_always_inline void reset_predict_state(PredictorState *ps)
Definition: aacdec_fixed.c:88
static const uint8_t offset[127][2]
Definition: vf_spp.c:92
Libavcodec external API header.
Predictor State.
Definition: aac.h:135
static const uint64_t aac_channel_layout[16]
Definition: aacdectab.h:65
#define Q31(x)
Definition: aac_defines.h:94
AAC Spectral Band Replication function declarations.
static int aac_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
signed 32 bits, planar
Definition: samplefmt.h:69
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:68
AAC definitions and structures.
static const int cce_scale_fixed[8]
Definition: aacdec_fixed.c:332
AVS_Value src
Definition: avisynth_c.h:482
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:59
static uint32_t cbrt_tab[1<< 13]
Definition: cbrt_tablegen.h:46
IndividualChannelStream ics
Definition: aac.h:246
uint8_t group_len[8]
Definition: aac.h:176
static av_cold int aac_decode_close(AVCodecContext *avctx)
int index
Definition: gxfenc.c:89
static void noise_scale(int *coefs, int scale, int band_energy, int len)
Definition: aacdec_fixed.c:195
main AAC context
Definition: aac.h:288
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:153
ChannelCoupling coup
Definition: aac.h:281
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:145
INTFLOAT gain[16][120]
Definition: aac.h:239
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
Definition: ccaption_dec.c:521
OutputConfiguration oc[2]
Definition: aac.h:349
common internal api header.
Single Channel Element - used for both SCE and LFE elements.
Definition: aac.h:245
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:98
static double c[64]
Individual Channel Stream.
Definition: aac.h:171
int32_t exp
Definition: softfloat.h:36
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aac.h:270
static const int exp2tab[4]
Definition: aacdec_fixed.c:104
int len
Scalefactors and spectral data are all zero.
Definition: aac.h:83
static int * DEC_SPAIR(int *dst, unsigned idx)
Definition: aacdec_fixed.c:106
Y Long Term Prediction.
Definition: mpeg4audio.h:64
static av_always_inline SoftFloat flt16_trunc(SoftFloat pf)
Definition: aacdec_fixed.c:259
enum BandType band_type[128]
band types
Definition: aac.h:249
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;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);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> out
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:701
AVCodec ff_aac_fixed_decoder
Definition: aacdec_fixed.c:443
int sbr
-1 implicit, 1 presence
Definition: mpeg4audio.h:34
static av_const SoftFloat av_int2sf(int v, int frac_bits)
Converts a mantisse and exponent to a SoftFloat.
Definition: softfloat.h:165
#define av_always_inline
Definition: attributes.h:37
static av_always_inline SoftFloat flt16_even(SoftFloat pf)
Definition: aacdec_fixed.c:245
AAC data declarations.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:857
AAC_FLOAT var0
Definition: aac.h:138
static int * DEC_UQUAD(int *dst, unsigned idx, unsigned sign)
Definition: aacdec_fixed.c:132