FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups 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_data.h"
79 #include "sbr.h"
80 #include "aacsbr.h"
81 #include "mpeg4audio.h"
82 #include "aacadtsdec.h"
83 #include "profiles.h"
84 #include "libavutil/intfloat.h"
85 
86 #include <math.h>
87 #include <string.h>
88 
90 {
91  ps->r0.mant = 0;
92  ps->r0.exp = 0;
93  ps->r1.mant = 0;
94  ps->r1.exp = 0;
95  ps->cor0.mant = 0;
96  ps->cor0.exp = 0;
97  ps->cor1.mant = 0;
98  ps->cor1.exp = 0;
99  ps->var0.mant = 0x20000000;
100  ps->var0.exp = 1;
101  ps->var1.mant = 0x20000000;
102  ps->var1.exp = 1;
103 }
104 
105 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
106 
107 static inline int *DEC_SPAIR(int *dst, unsigned idx)
108 {
109  dst[0] = (idx & 15) - 4;
110  dst[1] = (idx >> 4 & 15) - 4;
111 
112  return dst + 2;
113 }
114 
115 static inline int *DEC_SQUAD(int *dst, unsigned idx)
116 {
117  dst[0] = (idx & 3) - 1;
118  dst[1] = (idx >> 2 & 3) - 1;
119  dst[2] = (idx >> 4 & 3) - 1;
120  dst[3] = (idx >> 6 & 3) - 1;
121 
122  return dst + 4;
123 }
124 
125 static inline int *DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
126 {
127  dst[0] = (idx & 15) * (1 - (sign & 0xFFFFFFFE));
128  dst[1] = (idx >> 4 & 15) * (1 - ((sign & 1) << 1));
129 
130  return dst + 2;
131 }
132 
133 static inline int *DEC_UQUAD(int *dst, unsigned idx, unsigned sign)
134 {
135  unsigned nz = idx >> 12;
136 
137  dst[0] = (idx & 3) * (1 + (((int)sign >> 31) << 1));
138  sign <<= nz & 1;
139  nz >>= 1;
140  dst[1] = (idx >> 2 & 3) * (1 + (((int)sign >> 31) << 1));
141  sign <<= nz & 1;
142  nz >>= 1;
143  dst[2] = (idx >> 4 & 3) * (1 + (((int)sign >> 31) << 1));
144  sign <<= nz & 1;
145  nz >>= 1;
146  dst[3] = (idx >> 6 & 3) * (1 + (((int)sign >> 31) << 1));
147 
148  return dst + 4;
149 }
150 
151 static void vector_pow43(int *coefs, int len)
152 {
153  int i, coef;
154 
155  for (i=0; i<len; i++) {
156  coef = coefs[i];
157  if (coef < 0)
158  coef = -(int)ff_cbrt_tab_fixed[-coef];
159  else
160  coef = (int)ff_cbrt_tab_fixed[coef];
161  coefs[i] = coef;
162  }
163 }
164 
165 static void subband_scale(int *dst, int *src, int scale, int offset, int len)
166 {
167  int ssign = scale < 0 ? -1 : 1;
168  int s = FFABS(scale);
169  unsigned int round;
170  int i, out, c = exp2tab[s & 3];
171 
172  s = offset - (s >> 2);
173 
174  if (s > 0) {
175  round = 1 << (s-1);
176  for (i=0; i<len; i++) {
177  out = (int)(((int64_t)src[i] * c) >> 32);
178  dst[i] = ((int)(out+round) >> s) * ssign;
179  }
180  }
181  else {
182  s = s + 32;
183  round = 1 << (s-1);
184  for (i=0; i<len; i++) {
185  out = (int)((int64_t)((int64_t)src[i] * c + round) >> s);
186  dst[i] = out * ssign;
187  }
188  }
189 }
190 
191 static void noise_scale(int *coefs, int scale, int band_energy, int len)
192 {
193  int ssign = scale < 0 ? -1 : 1;
194  int s = FFABS(scale);
195  unsigned int round;
196  int i, out, c = exp2tab[s & 3];
197  int nlz = 0;
198 
199  while (band_energy > 0x7fff) {
200  band_energy >>= 1;
201  nlz++;
202  }
203  c /= band_energy;
204  s = 21 + nlz - (s >> 2);
205 
206  if (s > 0) {
207  round = 1 << (s-1);
208  for (i=0; i<len; i++) {
209  out = (int)(((int64_t)coefs[i] * c) >> 32);
210  coefs[i] = ((int)(out+round) >> s) * ssign;
211  }
212  }
213  else {
214  s = s + 32;
215  round = 1 << (s-1);
216  for (i=0; i<len; i++) {
217  out = (int)((int64_t)((int64_t)coefs[i] * c + round) >> s);
218  coefs[i] = out * ssign;
219  }
220  }
221 }
222 
224 {
225  SoftFloat tmp;
226  int s;
227 
228  tmp.exp = pf.exp;
229  s = pf.mant >> 31;
230  tmp.mant = (pf.mant ^ s) - s;
231  tmp.mant = (tmp.mant + 0x00200000U) & 0xFFC00000U;
232  tmp.mant = (tmp.mant ^ s) - s;
233 
234  return tmp;
235 }
236 
238 {
239  SoftFloat tmp;
240  int s;
241 
242  tmp.exp = pf.exp;
243  s = pf.mant >> 31;
244  tmp.mant = (pf.mant ^ s) - s;
245  tmp.mant = (tmp.mant + 0x001FFFFFU + (tmp.mant & 0x00400000U >> 16)) & 0xFFC00000U;
246  tmp.mant = (tmp.mant ^ s) - s;
247 
248  return tmp;
249 }
250 
252 {
253  SoftFloat pun;
254  int s;
255 
256  pun.exp = pf.exp;
257  s = pf.mant >> 31;
258  pun.mant = (pf.mant ^ s) - s;
259  pun.mant = pun.mant & 0xFFC00000U;
260  pun.mant = (pun.mant ^ s) - s;
261 
262  return pun;
263 }
264 
265 static av_always_inline void predict(PredictorState *ps, int *coef,
266  int output_enable)
267 {
268  const SoftFloat a = { 1023410176, 0 }; // 61.0 / 64
269  const SoftFloat alpha = { 973078528, 0 }; // 29.0 / 32
270  SoftFloat e0, e1;
271  SoftFloat pv;
272  SoftFloat k1, k2;
273  SoftFloat r0 = ps->r0, r1 = ps->r1;
274  SoftFloat cor0 = ps->cor0, cor1 = ps->cor1;
275  SoftFloat var0 = ps->var0, var1 = ps->var1;
276  SoftFloat tmp;
277 
278  if (var0.exp > 1 || (var0.exp == 1 && var0.mant > 0x20000000)) {
279  k1 = av_mul_sf(cor0, flt16_even(av_div_sf(a, var0)));
280  }
281  else {
282  k1.mant = 0;
283  k1.exp = 0;
284  }
285 
286  if (var1.exp > 1 || (var1.exp == 1 && var1.mant > 0x20000000)) {
287  k2 = av_mul_sf(cor1, flt16_even(av_div_sf(a, var1)));
288  }
289  else {
290  k2.mant = 0;
291  k2.exp = 0;
292  }
293 
294  tmp = av_mul_sf(k1, r0);
295  pv = flt16_round(av_add_sf(tmp, av_mul_sf(k2, r1)));
296  if (output_enable) {
297  int shift = 28 - pv.exp;
298 
299  if (shift < 31)
300  *coef += (pv.mant + (1 << (shift - 1))) >> shift;
301  }
302 
303  e0 = av_int2sf(*coef, 2);
304  e1 = av_sub_sf(e0, tmp);
305 
306  ps->cor1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor1), av_mul_sf(r1, e1)));
307  tmp = av_add_sf(av_mul_sf(r1, r1), av_mul_sf(e1, e1));
308  tmp.exp--;
309  ps->var1 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var1), tmp));
310  ps->cor0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, cor0), av_mul_sf(r0, e0)));
311  tmp = av_add_sf(av_mul_sf(r0, r0), av_mul_sf(e0, e0));
312  tmp.exp--;
313  ps->var0 = flt16_trunc(av_add_sf(av_mul_sf(alpha, var0), tmp));
314 
315  ps->r1 = flt16_trunc(av_mul_sf(a, av_sub_sf(r0, av_mul_sf(k1, e0))));
316  ps->r0 = flt16_trunc(av_mul_sf(a, e0));
317 }
318 
319 
320 static const int cce_scale_fixed[8] = {
321  Q30(1.0), //2^(0/8)
322  Q30(1.0905077327), //2^(1/8)
323  Q30(1.1892071150), //2^(2/8)
324  Q30(1.2968395547), //2^(3/8)
325  Q30(1.4142135624), //2^(4/8)
326  Q30(1.5422108254), //2^(5/8)
327  Q30(1.6817928305), //2^(6/8)
328  Q30(1.8340080864), //2^(7/8)
329 };
330 
331 /**
332  * Apply dependent channel coupling (applied before IMDCT).
333  *
334  * @param index index into coupling gain array
335  */
337  SingleChannelElement *target,
338  ChannelElement *cce, int index)
339 {
340  IndividualChannelStream *ics = &cce->ch[0].ics;
341  const uint16_t *offsets = ics->swb_offset;
342  int *dest = target->coeffs;
343  const int *src = cce->ch[0].coeffs;
344  int g, i, group, k, idx = 0;
345  if (ac->oc[1].m4ac.object_type == AOT_AAC_LTP) {
347  "Dependent coupling is not supported together with LTP\n");
348  return;
349  }
350  for (g = 0; g < ics->num_window_groups; g++) {
351  for (i = 0; i < ics->max_sfb; i++, idx++) {
352  if (cce->ch[0].band_type[idx] != ZERO_BT) {
353  const int gain = cce->coup.gain[index][idx];
354  int shift, round, c, tmp;
355 
356  if (gain < 0) {
357  c = -cce_scale_fixed[-gain & 7];
358  shift = (-gain-1024) >> 3;
359  }
360  else {
361  c = cce_scale_fixed[gain & 7];
362  shift = (gain-1024) >> 3;
363  }
364 
365  if (shift < 0) {
366  shift = -shift;
367  round = 1 << (shift - 1);
368 
369  for (group = 0; group < ics->group_len[g]; group++) {
370  for (k = offsets[i]; k < offsets[i + 1]; k++) {
371  tmp = (int)(((int64_t)src[group * 128 + k] * c + \
372  (int64_t)0x1000000000) >> 37);
373  dest[group * 128 + k] += (tmp + round) >> shift;
374  }
375  }
376  }
377  else {
378  for (group = 0; group < ics->group_len[g]; group++) {
379  for (k = offsets[i]; k < offsets[i + 1]; k++) {
380  tmp = (int)(((int64_t)src[group * 128 + k] * c + \
381  (int64_t)0x1000000000) >> 37);
382  dest[group * 128 + k] += tmp << shift;
383  }
384  }
385  }
386  }
387  }
388  dest += ics->group_len[g] * 128;
389  src += ics->group_len[g] * 128;
390  }
391 }
392 
393 /**
394  * Apply independent channel coupling (applied after IMDCT).
395  *
396  * @param index index into coupling gain array
397  */
399  SingleChannelElement *target,
400  ChannelElement *cce, int index)
401 {
402  int i, c, shift, round, tmp;
403  const int gain = cce->coup.gain[index][0];
404  const int *src = cce->ch[0].ret;
405  int *dest = target->ret;
406  const int len = 1024 << (ac->oc[1].m4ac.sbr == 1);
407 
408  c = cce_scale_fixed[gain & 7];
409  shift = (gain-1024) >> 3;
410  if (shift < 0) {
411  shift = -shift;
412  round = 1 << (shift - 1);
413 
414  for (i = 0; i < len; i++) {
415  tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
416  dest[i] += (tmp + round) >> shift;
417  }
418  }
419  else {
420  for (i = 0; i < len; i++) {
421  tmp = (int)(((int64_t)src[i] * c + (int64_t)0x1000000000) >> 37);
422  dest[i] += tmp << shift;
423  }
424  }
425 }
426 
427 #include "aacdec_template.c"
428 
430  .name = "aac_fixed",
431  .long_name = NULL_IF_CONFIG_SMALL("AAC (Advanced Audio Coding)"),
432  .type = AVMEDIA_TYPE_AUDIO,
433  .id = AV_CODEC_ID_AAC,
434  .priv_data_size = sizeof(AACContext),
436  .close = aac_decode_close,
438  .sample_fmts = (const enum AVSampleFormat[]) {
440  },
442  .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
443  .channel_layouts = aac_channel_layout,
445  .flush = flush,
446 };
AAC decoder data.
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:295
static av_always_inline SoftFloat flt16_round(SoftFloat pf)
Definition: aacdec_fixed.c:223
static int * DEC_UPAIR(int *dst, unsigned idx, unsigned sign)
Definition: aacdec_fixed.c:125
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:336
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:116
static int * DEC_SQUAD(int *dst, unsigned idx)
Definition: aacdec_fixed.c:115
const AVProfile ff_aac_profiles[]
Definition: profiles.c:26
INTFLOAT * ret
PCM output.
Definition: aac.h:269
AAC decoder.
static void vector_pow43(int *coefs, int len)
Definition: aacdec_fixed.c:151
#define AV_CODEC_CAP_CHANNEL_CONF
Codec should fill in channel configuration and samplerate instead of container.
Definition: avcodec.h:1015
static void subband_scale(int *dst, int *src, int scale, int offset, int len)
Definition: aacdec_fixed.c:165
AVCodec.
Definition: avcodec.h:3542
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:181
#define FF_CODEC_CAP_INIT_THREADSAFE
The codec does not modify any global variables in the init function, allowing to call the init functi...
Definition: internal.h:40
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:284
static av_cold int aac_decode_init(AVCodecContext *avctx)
AAC_FLOAT cor1
Definition: aac.h:137
uint32_t ff_cbrt_tab_fixed[1<< 13]
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:398
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:265
#define av_log(a,...)
#define U(x)
Definition: vp56_arith.h:37
MPEG4AudioConfig m4ac
Definition: aac.h:124
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:176
AAC_FLOAT r0
Definition: aac.h:140
Spectral Band Replication definitions and structures.
const char * name
Name of the codec implementation.
Definition: avcodec.h:3549
static av_always_inline av_const double round(double x)
Definition: libm.h:444
uint8_t max_sfb
number of scalefactor bands per group
Definition: aac.h:175
static av_always_inline void reset_predict_state(PredictorState *ps)
Definition: aacdec_fixed.c:89
static const uint8_t offset[127][2]
Definition: vf_spp.c:92
Predictor State.
Definition: aac.h:135
static const uint64_t aac_channel_layout[16]
Definition: aacdectab.h:57
#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:68
#define FFABS(a)
Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they are not representable ...
Definition: common.h:72
AAC definitions and structures.
#define src
Definition: vp9dsp.c:530
static const int cce_scale_fixed[8]
Definition: aacdec_fixed.c:320
Libavcodec external API header.
AVSampleFormat
Audio sample formats.
Definition: samplefmt.h:58
IndividualChannelStream ics
Definition: aac.h:249
uint8_t group_len[8]
Definition: aac.h:179
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:191
main AAC context
Definition: aac.h:293
static av_const SoftFloat av_sub_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:166
ChannelCoupling coup
Definition: aac.h:286
static av_const SoftFloat av_add_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:155
INTFLOAT coeffs[1024]
coefficients for IMDCT, maybe processed
Definition: aac.h:262
INTFLOAT gain[16][120]
Definition: aac.h:242
static int decode(AVCodecContext *avctx, void *data, int *got_sub, AVPacket *avpkt)
Definition: ccaption_dec.c:722
OutputConfiguration oc[2]
Definition: aac.h:354
common internal api header.
Single Channel Element - used for both SCE and LFE elements.
Definition: aac.h:248
static av_const SoftFloat av_mul_sf(SoftFloat a, SoftFloat b)
Definition: softfloat.h:102
static double c[64]
Individual Channel Stream.
Definition: aac.h:174
int32_t exp
Definition: softfloat.h:36
channel element - generic struct for SCE/CPE/CCE/LFE
Definition: aac.h:275
static const int exp2tab[4]
Definition: aacdec_fixed.c:105
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:107
static uint8_t tmp[8]
Definition: des.c:38
Y Long Term Prediction.
Definition: mpeg4audio.h:64
static av_always_inline SoftFloat flt16_trunc(SoftFloat pf)
Definition: aacdec_fixed.c:251
enum BandType band_type[128]
band types
Definition: aac.h:252
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:701
AVCodec ff_aac_fixed_decoder
Definition: aacdec_fixed.c:429
FILE * out
Definition: movenc.c:54
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:176
#define av_always_inline
Definition: attributes.h:39
static av_always_inline SoftFloat flt16_even(SoftFloat pf)
Definition: aacdec_fixed.c:237
AAC data declarations.
#define AV_CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
Definition: avcodec.h:956
AAC_FLOAT var0
Definition: aac.h:138
static int * DEC_UQUAD(int *dst, unsigned idx, unsigned sign)
Definition: aacdec_fixed.c:133