3 * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
5 * This file is part of FFmpeg.
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.
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.
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
29 #include "gsmdec_data.h"
31 static const int requant_tab
[4][8] = {
35 { 0, 1, 2, 3, 4, 5, 6, 7 }
38 static void apcm_dequant_add(GetBitContext
*gb
, int16_t *dst
, const int *frame_bits
)
41 int maxidx
= get_bits(gb
, 6);
42 const int16_t *tab
= ff_gsm_dequant_tab
[maxidx
];
43 for (i
= 0; i
< 13; i
++) {
44 val
= get_bits(gb
, frame_bits
[i
]);
45 dst
[3*i
] += tab
[requant_tab
[frame_bits
[i
]][val
]];
49 static inline int gsm_mult(int a
, int b
)
51 return (a
* b
+ (1 << 14)) >> 15;
54 static void long_term_synth(int16_t *dst
, int lag
, int gain_idx
)
57 const int16_t *src
= dst
- lag
;
58 uint16_t gain
= ff_gsm_long_term_gain_tab
[gain_idx
];
59 for (i
= 0; i
< 40; i
++)
60 dst
[i
] = gsm_mult(gain
, src
[i
]);
63 static inline int decode_log_area(int coded
, int factor
, int offset
)
67 return gsm_mult(coded
, factor
) << 1;
70 static av_noinline
int get_rrp(int filtered
)
72 int abs
= FFABS(filtered
);
73 if (abs
< 11059) abs
<<= 1;
74 else if (abs
< 20070) abs
+= 11059;
75 else abs
= (abs
>> 2) + 26112;
76 return filtered
< 0 ? -abs
: abs
;
79 static int filter_value(int in
, int rrp
[8], int v
[9])
82 for (i
= 7; i
>= 0; i
--) {
83 in
-= gsm_mult(rrp
[i
], v
[i
]);
84 v
[i
+ 1] = v
[i
] + gsm_mult(rrp
[i
], in
);
90 static void short_term_synth(GSMContext
*ctx
, int16_t *dst
, const int16_t *src
)
94 int *lar
= ctx
->lar
[ctx
->lar_idx
];
95 int *lar_prev
= ctx
->lar
[ctx
->lar_idx
^ 1];
96 for (i
= 0; i
< 8; i
++)
97 rrp
[i
] = get_rrp((lar_prev
[i
] >> 2) + (lar_prev
[i
] >> 1) + (lar
[i
] >> 2));
98 for (i
= 0; i
< 13; i
++)
99 dst
[i
] = filter_value(src
[i
], rrp
, ctx
->v
);
101 for (i
= 0; i
< 8; i
++)
102 rrp
[i
] = get_rrp((lar_prev
[i
] >> 1) + (lar
[i
] >> 1));
103 for (i
= 13; i
< 27; i
++)
104 dst
[i
] = filter_value(src
[i
], rrp
, ctx
->v
);
106 for (i
= 0; i
< 8; i
++)
107 rrp
[i
] = get_rrp((lar_prev
[i
] >> 2) + (lar
[i
] >> 1) + (lar
[i
] >> 2));
108 for (i
= 27; i
< 40; i
++)
109 dst
[i
] = filter_value(src
[i
], rrp
, ctx
->v
);
111 for (i
= 0; i
< 8; i
++)
112 rrp
[i
] = get_rrp(lar
[i
]);
113 for (i
= 40; i
< 160; i
++)
114 dst
[i
] = filter_value(src
[i
], rrp
, ctx
->v
);
119 static int postprocess(int16_t *data
, int msr
)
122 for (i
= 0; i
< 160; i
++) {
123 msr
= av_clip_int16(data
[i
] + gsm_mult(msr
, 28180));
124 data
[i
] = av_clip_int16(msr
<< 1) & ~7;
129 static int gsm_decode_block(AVCodecContext
*avctx
, int16_t *samples
,
130 GetBitContext
*gb
, int mode
)
132 GSMContext
*ctx
= avctx
->priv_data
;
134 int16_t *ref_dst
= ctx
->ref_buf
+ 120;
135 int *lar
= ctx
->lar
[ctx
->lar_idx
];
136 lar
[0] = decode_log_area(get_bits(gb
, 6), 13107, 1 << 15);
137 lar
[1] = decode_log_area(get_bits(gb
, 6), 13107, 1 << 15);
138 lar
[2] = decode_log_area(get_bits(gb
, 5), 13107, (1 << 14) + 2048*2);
139 lar
[3] = decode_log_area(get_bits(gb
, 5), 13107, (1 << 14) - 2560*2);
140 lar
[4] = decode_log_area(get_bits(gb
, 4), 19223, (1 << 13) + 94*2);
141 lar
[5] = decode_log_area(get_bits(gb
, 4), 17476, (1 << 13) - 1792*2);
142 lar
[6] = decode_log_area(get_bits(gb
, 3), 31454, (1 << 12) - 341*2);
143 lar
[7] = decode_log_area(get_bits(gb
, 3), 29708, (1 << 12) - 1144*2);
145 for (i
= 0; i
< 4; i
++) {
146 int lag
= get_bits(gb
, 7);
147 int gain_idx
= get_bits(gb
, 2);
148 int offset
= get_bits(gb
, 2);
149 lag
= av_clip(lag
, 40, 120);
150 long_term_synth(ref_dst
, lag
, gain_idx
);
151 apcm_dequant_add(gb
, ref_dst
+ offset
, ff_gsm_apcm_bits
[mode
][i
]);
154 memcpy(ctx
->ref_buf
, ctx
->ref_buf
+ 160, 120 * sizeof(*ctx
->ref_buf
));
155 short_term_synth(ctx
, samples
, ctx
->ref_buf
+ 120);
156 // for optimal speed this could be merged with short_term_synth,
157 // not done yet because it is a bit ugly
158 ctx
->msr
= postprocess(samples
, ctx
->msr
);