VP8: unroll MB mode decoding tree
[ffmpeg.git] / libavcodec / gsmdec.c
1 /*
2  * gsm 06.10 decoder
3  * Copyright (c) 2010 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
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  * GSM decoder
25  */
26
27 #define ALT_BITSTREAM_READER_LE
28 #include "avcodec.h"
29 #include "get_bits.h"
30
31 // input and output sizes in byte
32 #define GSM_BLOCK_SIZE    33
33 #define GSM_MS_BLOCK_SIZE 65
34 #define GSM_FRAME_SIZE   160
35
36 typedef struct {
37     // Contains first 120 elements from the previous frame
38     // (used by long_term_synth according to the "lag"),
39     // then in the following 160 elements the current
40     // frame is constructed.
41     int16_t ref_buf[280];
42     int v[9];
43     int lar[2][8];
44     int lar_idx;
45     int msr;
46 } GSMContext;
47
48 static av_cold int gsm_init(AVCodecContext *avctx)
49 {
50     avctx->channels = 1;
51     if (!avctx->sample_rate)
52         avctx->sample_rate = 8000;
53     avctx->sample_fmt = SAMPLE_FMT_S16;
54
55     switch (avctx->codec_id) {
56     case CODEC_ID_GSM:
57         avctx->frame_size  = GSM_FRAME_SIZE;
58         avctx->block_align = GSM_BLOCK_SIZE;
59         break;
60     case CODEC_ID_GSM_MS:
61         avctx->frame_size  = 2 * GSM_FRAME_SIZE;
62         avctx->block_align = GSM_MS_BLOCK_SIZE;
63     }
64
65     return 0;
66 }
67
68 static const int16_t dequant_tab[64][8] = {
69     {   -28,    -20,    -12,     -4,      4,     12,     20,     28},
70     {   -56,    -40,    -24,     -8,      8,     24,     40,     56},
71     {   -84,    -60,    -36,    -12,     12,     36,     60,     84},
72     {  -112,    -80,    -48,    -16,     16,     48,     80,    112},
73     {  -140,   -100,    -60,    -20,     20,     60,    100,    140},
74     {  -168,   -120,    -72,    -24,     24,     72,    120,    168},
75     {  -196,   -140,    -84,    -28,     28,     84,    140,    196},
76     {  -224,   -160,    -96,    -32,     32,     96,    160,    224},
77     {  -252,   -180,   -108,    -36,     36,    108,    180,    252},
78     {  -280,   -200,   -120,    -40,     40,    120,    200,    280},
79     {  -308,   -220,   -132,    -44,     44,    132,    220,    308},
80     {  -336,   -240,   -144,    -48,     48,    144,    240,    336},
81     {  -364,   -260,   -156,    -52,     52,    156,    260,    364},
82     {  -392,   -280,   -168,    -56,     56,    168,    280,    392},
83     {  -420,   -300,   -180,    -60,     60,    180,    300,    420},
84     {  -448,   -320,   -192,    -64,     64,    192,    320,    448},
85     {  -504,   -360,   -216,    -72,     72,    216,    360,    504},
86     {  -560,   -400,   -240,    -80,     80,    240,    400,    560},
87     {  -616,   -440,   -264,    -88,     88,    264,    440,    616},
88     {  -672,   -480,   -288,    -96,     96,    288,    480,    672},
89     {  -728,   -520,   -312,   -104,    104,    312,    520,    728},
90     {  -784,   -560,   -336,   -112,    112,    336,    560,    784},
91     {  -840,   -600,   -360,   -120,    120,    360,    600,    840},
92     {  -896,   -640,   -384,   -128,    128,    384,    640,    896},
93     { -1008,   -720,   -432,   -144,    144,    432,    720,   1008},
94     { -1120,   -800,   -480,   -160,    160,    480,    800,   1120},
95     { -1232,   -880,   -528,   -176,    176,    528,    880,   1232},
96     { -1344,   -960,   -576,   -192,    192,    576,    960,   1344},
97     { -1456,  -1040,   -624,   -208,    208,    624,   1040,   1456},
98     { -1568,  -1120,   -672,   -224,    224,    672,   1120,   1568},
99     { -1680,  -1200,   -720,   -240,    240,    720,   1200,   1680},
100     { -1792,  -1280,   -768,   -256,    256,    768,   1280,   1792},
101     { -2016,  -1440,   -864,   -288,    288,    864,   1440,   2016},
102     { -2240,  -1600,   -960,   -320,    320,    960,   1600,   2240},
103     { -2464,  -1760,  -1056,   -352,    352,   1056,   1760,   2464},
104     { -2688,  -1920,  -1152,   -384,    384,   1152,   1920,   2688},
105     { -2912,  -2080,  -1248,   -416,    416,   1248,   2080,   2912},
106     { -3136,  -2240,  -1344,   -448,    448,   1344,   2240,   3136},
107     { -3360,  -2400,  -1440,   -480,    480,   1440,   2400,   3360},
108     { -3584,  -2560,  -1536,   -512,    512,   1536,   2560,   3584},
109     { -4032,  -2880,  -1728,   -576,    576,   1728,   2880,   4032},
110     { -4480,  -3200,  -1920,   -640,    640,   1920,   3200,   4480},
111     { -4928,  -3520,  -2112,   -704,    704,   2112,   3520,   4928},
112     { -5376,  -3840,  -2304,   -768,    768,   2304,   3840,   5376},
113     { -5824,  -4160,  -2496,   -832,    832,   2496,   4160,   5824},
114     { -6272,  -4480,  -2688,   -896,    896,   2688,   4480,   6272},
115     { -6720,  -4800,  -2880,   -960,    960,   2880,   4800,   6720},
116     { -7168,  -5120,  -3072,  -1024,   1024,   3072,   5120,   7168},
117     { -8063,  -5759,  -3456,  -1152,   1152,   3456,   5760,   8064},
118     { -8959,  -6399,  -3840,  -1280,   1280,   3840,   6400,   8960},
119     { -9855,  -7039,  -4224,  -1408,   1408,   4224,   7040,   9856},
120     {-10751,  -7679,  -4608,  -1536,   1536,   4608,   7680,  10752},
121     {-11647,  -8319,  -4992,  -1664,   1664,   4992,   8320,  11648},
122     {-12543,  -8959,  -5376,  -1792,   1792,   5376,   8960,  12544},
123     {-13439,  -9599,  -5760,  -1920,   1920,   5760,   9600,  13440},
124     {-14335, -10239,  -6144,  -2048,   2048,   6144,  10240,  14336},
125     {-16127, -11519,  -6912,  -2304,   2304,   6912,  11519,  16127},
126     {-17919, -12799,  -7680,  -2560,   2560,   7680,  12799,  17919},
127     {-19711, -14079,  -8448,  -2816,   2816,   8448,  14079,  19711},
128     {-21503, -15359,  -9216,  -3072,   3072,   9216,  15359,  21503},
129     {-23295, -16639,  -9984,  -3328,   3328,   9984,  16639,  23295},
130     {-25087, -17919, -10752,  -3584,   3584,  10752,  17919,  25087},
131     {-26879, -19199, -11520,  -3840,   3840,  11520,  19199,  26879},
132     {-28671, -20479, -12288,  -4096,   4096,  12288,  20479,  28671}
133 };
134
135 static void apcm_dequant_add(GetBitContext *gb, int16_t *dst)
136 {
137     int i;
138     int maxidx = get_bits(gb, 6);
139     const int16_t *tab = dequant_tab[maxidx];
140     for (i = 0; i < 13; i++)
141         dst[3*i] += tab[get_bits(gb, 3)];
142 }
143
144 static inline int gsm_mult(int a, int b)
145 {
146     return (a * b + (1 << 14)) >> 15;
147 }
148
149 static const uint16_t long_term_gain_tab[4] = {
150     3277, 11469, 21299, 32767
151 };
152
153 static void long_term_synth(int16_t *dst, int lag, int gain_idx)
154 {
155     int i;
156     const int16_t *src = dst - lag;
157     uint16_t gain = long_term_gain_tab[gain_idx];
158     for (i = 0; i < 40; i++)
159         dst[i] = gsm_mult(gain, src[i]);
160 }
161
162 static inline int decode_log_area(int coded, int factor, int offset)
163 {
164     coded <<= 10;
165     coded -= offset;
166     return gsm_mult(coded, factor) << 1;
167 }
168
169 static av_noinline int get_rrp(int filtered)
170 {
171     int abs = FFABS(filtered);
172     if      (abs < 11059) abs <<= 1;
173     else if (abs < 20070) abs += 11059;
174     else                  abs = (abs >> 2) + 26112;
175     return filtered < 0 ? -abs : abs;
176 }
177
178 static int filter_value(int in, int rrp[8], int v[9])
179 {
180     int i;
181     for (i = 7; i >= 0; i--) {
182         in -= gsm_mult(rrp[i], v[i]);
183         v[i + 1] = v[i] + gsm_mult(rrp[i], in);
184     }
185     v[0] = in;
186     return in;
187 }
188
189 static void short_term_synth(GSMContext *ctx, int16_t *dst, const int16_t *src)
190 {
191     int i;
192     int rrp[8];
193     int *lar = ctx->lar[ctx->lar_idx];
194     int *lar_prev = ctx->lar[ctx->lar_idx ^ 1];
195     for (i = 0; i < 8; i++)
196         rrp[i] = get_rrp((lar_prev[i] >> 2) + (lar_prev[i] >> 1) + (lar[i] >> 2));
197     for (i = 0; i < 13; i++)
198         dst[i] = filter_value(src[i], rrp, ctx->v);
199
200     for (i = 0; i < 8; i++)
201         rrp[i] = get_rrp((lar_prev[i] >> 1) + (lar     [i] >> 1));
202     for (i = 13; i < 27; i++)
203         dst[i] = filter_value(src[i], rrp, ctx->v);
204
205     for (i = 0; i < 8; i++)
206         rrp[i] = get_rrp((lar_prev[i] >> 2) + (lar     [i] >> 1) + (lar[i] >> 2));
207     for (i = 27; i < 40; i++)
208         dst[i] = filter_value(src[i], rrp, ctx->v);
209
210     for (i = 0; i < 8; i++)
211         rrp[i] = get_rrp(lar[i]);
212     for (i = 40; i < 160; i++)
213         dst[i] = filter_value(src[i], rrp, ctx->v);
214
215     ctx->lar_idx ^= 1;
216 }
217
218 static int postprocess(int16_t *data, int msr)
219 {
220     int i;
221     for (i = 0; i < 160; i++) {
222         msr = av_clip_int16(data[i] + gsm_mult(msr, 28180));
223         data[i] = av_clip_int16(msr << 1) & ~7;
224     }
225     return msr;
226 }
227
228 static int gsm_decode_block(AVCodecContext *avctx, int16_t *samples,
229                             GetBitContext *gb)
230 {
231     GSMContext *ctx = avctx->priv_data;
232     int i;
233     int16_t *ref_dst = ctx->ref_buf + 120;
234     int *lar = ctx->lar[ctx->lar_idx];
235     lar[0] = decode_log_area(get_bits(gb, 6), 13107,  1 << 15);
236     lar[1] = decode_log_area(get_bits(gb, 6), 13107,  1 << 15);
237     lar[2] = decode_log_area(get_bits(gb, 5), 13107, (1 << 14) + 2048*2);
238     lar[3] = decode_log_area(get_bits(gb, 5), 13107, (1 << 14) - 2560*2);
239     lar[4] = decode_log_area(get_bits(gb, 4), 19223, (1 << 13) +   94*2);
240     lar[5] = decode_log_area(get_bits(gb, 4), 17476, (1 << 13) - 1792*2);
241     lar[6] = decode_log_area(get_bits(gb, 3), 31454, (1 << 12) -  341*2);
242     lar[7] = decode_log_area(get_bits(gb, 3), 29708, (1 << 12) - 1144*2);
243
244     for (i = 0; i < 4; i++) {
245         int lag      = get_bits(gb, 7);
246         int gain_idx = get_bits(gb, 2);
247         int offset   = get_bits(gb, 2);
248         lag = av_clip(lag, 40, 120);
249         long_term_synth(ref_dst, lag, gain_idx);
250         apcm_dequant_add(gb, ref_dst + offset);
251         ref_dst += 40;
252     }
253     memcpy(ctx->ref_buf, ctx->ref_buf + 160, 120 * sizeof(*ctx->ref_buf));
254     short_term_synth(ctx, samples, ctx->ref_buf + 120);
255     // for optimal speed this could be merged with short_term_synth,
256     // not done yet because it is a bit ugly
257     ctx->msr = postprocess(samples, ctx->msr);
258     return 0;
259 }
260
261 static int gsm_decode_frame(AVCodecContext *avctx, void *data,
262                             int *data_size, AVPacket *avpkt)
263 {
264     int res;
265     GetBitContext gb;
266     const uint8_t *buf = avpkt->data;
267     int buf_size = avpkt->size;
268     int16_t *samples = data;
269     int frame_bytes = 2 * avctx->frame_size;
270
271     if (*data_size < frame_bytes)
272         return -1;
273     *data_size = 0;
274     if(buf_size < avctx->block_align)
275         return AVERROR_INVALIDDATA;
276     init_get_bits(&gb, buf, buf_size * 8);
277
278     switch (avctx->codec_id) {
279     case CODEC_ID_GSM:
280         if (get_bits(&gb, 4) != 0xd)
281             av_log(avctx, AV_LOG_WARNING, "Missing GSM magic!\n");
282         res = gsm_decode_block(avctx, samples, &gb);
283         if (res < 0)
284             return res;
285         break;
286     case CODEC_ID_GSM_MS:
287         res = gsm_decode_block(avctx, samples, &gb);
288         if (res < 0)
289             return res;
290         res = gsm_decode_block(avctx, samples + GSM_FRAME_SIZE, &gb);
291         if (res < 0)
292             return res;
293     }
294     *data_size = frame_bytes;
295     return avctx->block_align;
296 }
297
298 AVCodec gsm_decoder = {
299     "gsm",
300     AVMEDIA_TYPE_AUDIO,
301     CODEC_ID_GSM,
302     sizeof(GSMContext),
303     gsm_init,
304     NULL,
305     NULL,
306     gsm_decode_frame,
307     .long_name = NULL_IF_CONFIG_SMALL("GSM"),
308 };
309
310 AVCodec gsm_ms_decoder = {
311     "gsm_ms",
312     AVMEDIA_TYPE_AUDIO,
313     CODEC_ID_GSM_MS,
314     sizeof(GSMContext),
315     gsm_init,
316     NULL,
317     NULL,
318     gsm_decode_frame,
319     .long_name = NULL_IF_CONFIG_SMALL("GSM Microsoft variant"),
320 };