comparison g726.c @ 2967:ef2149182f1c libavcodec

COSMETICS: Remove all trailing whitespace.
author diego
date Sat, 17 Dec 2005 18:14:38 +0000
parents d1609cfeb1d0
children bfabfdf9ce55
comparison
equal deleted inserted replaced
2966:564788471dd4 2967:ef2149182f1c
1 /* 1 /*
2 * G.726 ADPCM audio codec 2 * G.726 ADPCM audio codec
3 * Copyright (c) 2004 Roman Shaposhnik. 3 * Copyright (c) 2004 Roman Shaposhnik.
4 * 4 *
5 * This is a very straightforward rendition of the G.726 5 * This is a very straightforward rendition of the G.726
6 * Section 4 "Computational Details". 6 * Section 4 "Computational Details".
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public 9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version. 11 * version 2 of the License, or (at your option) any later version.
24 #include "common.h" 24 #include "common.h"
25 #include "bitstream.h" 25 #include "bitstream.h"
26 26
27 /** 27 /**
28 * G.726 11bit float. 28 * G.726 11bit float.
29 * G.726 Standard uses rather odd 11bit floating point arithmentic for 29 * G.726 Standard uses rather odd 11bit floating point arithmentic for
30 * numerous occasions. It's a mistery to me why they did it this way 30 * numerous occasions. It's a mistery to me why they did it this way
31 * instead of simply using 32bit integer arithmetic. 31 * instead of simply using 32bit integer arithmetic.
32 */ 32 */
33 typedef struct Float11 { 33 typedef struct Float11 {
34 int sign; /**< 1bit sign */ 34 int sign; /**< 1bit sign */
40 { 40 {
41 f->sign = (i < 0); 41 f->sign = (i < 0);
42 if (f->sign) 42 if (f->sign)
43 i = -i; 43 i = -i;
44 f->exp = av_log2_16bit(i) + !!i; 44 f->exp = av_log2_16bit(i) + !!i;
45 f->mant = i? (i<<6) >> f->exp : 45 f->mant = i? (i<<6) >> f->exp :
46 1<<5; 46 1<<5;
47 return f; 47 return f;
48 } 48 }
49 49
50 static inline int16_t mult(Float11* f1, Float11* f2) 50 static inline int16_t mult(Float11* f1, Float11* f2)
70 int* F; /**< special table #2 */ 70 int* F; /**< special table #2 */
71 } G726Tables; 71 } G726Tables;
72 72
73 typedef struct G726Context { 73 typedef struct G726Context {
74 G726Tables* tbls; /**< static tables needed for computation */ 74 G726Tables* tbls; /**< static tables needed for computation */
75 75
76 Float11 sr[2]; /**< prev. reconstructed samples */ 76 Float11 sr[2]; /**< prev. reconstructed samples */
77 Float11 dq[6]; /**< prev. difference */ 77 Float11 dq[6]; /**< prev. difference */
78 int a[2]; /**< second order predictor coeffs */ 78 int a[2]; /**< second order predictor coeffs */
79 int b[6]; /**< sixth order predictor coeffs */ 79 int b[6]; /**< sixth order predictor coeffs */
80 int pk[2]; /**< signs of prev. 2 sez + dq */ 80 int pk[2]; /**< signs of prev. 2 sez + dq */
81 81
82 int ap; /**< scale factor control */ 82 int ap; /**< scale factor control */
83 int yu; /**< fast scale factor */ 83 int yu; /**< fast scale factor */
84 int yl; /**< slow scale factor */ 84 int yl; /**< slow scale factor */
85 int dms; /**< short average magnitude of F[i] */ 85 int dms; /**< short average magnitude of F[i] */
86 int dml; /**< long average magnitude of F[i] */ 86 int dml; /**< long average magnitude of F[i] */
90 int sez; /**< estimated second order prediction */ 90 int sez; /**< estimated second order prediction */
91 int y; /**< quantizer scaling factor for the next iteration */ 91 int y; /**< quantizer scaling factor for the next iteration */
92 } G726Context; 92 } G726Context;
93 93
94 static int quant_tbl16[] = /**< 16kbit/s 2bits per sample */ 94 static int quant_tbl16[] = /**< 16kbit/s 2bits per sample */
95 { 260, INT_MAX }; 95 { 260, INT_MAX };
96 static int iquant_tbl16[] = 96 static int iquant_tbl16[] =
97 { 116, 365, 365, 116 }; 97 { 116, 365, 365, 116 };
98 static int W_tbl16[] = 98 static int W_tbl16[] =
99 { -22, 439, 439, -22 }; 99 { -22, 439, 439, -22 };
100 static int F_tbl16[] = 100 static int F_tbl16[] =
101 { 0, 7, 7, 0 }; 101 { 0, 7, 7, 0 };
102 102
103 static int quant_tbl24[] = /**< 24kbit/s 3bits per sample */ 103 static int quant_tbl24[] = /**< 24kbit/s 3bits per sample */
104 { 7, 217, 330, INT_MAX }; 104 { 7, 217, 330, INT_MAX };
105 static int iquant_tbl24[] = 105 static int iquant_tbl24[] =
106 { INT_MIN, 135, 273, 373, 373, 273, 135, INT_MIN }; 106 { INT_MIN, 135, 273, 373, 373, 273, 135, INT_MIN };
107 static int W_tbl24[] = 107 static int W_tbl24[] =
108 { -4, 30, 137, 582, 582, 137, 30, -4 }; 108 { -4, 30, 137, 582, 582, 137, 30, -4 };
109 static int F_tbl24[] = 109 static int F_tbl24[] =
110 { 0, 1, 2, 7, 7, 2, 1, 0 }; 110 { 0, 1, 2, 7, 7, 2, 1, 0 };
111 111
112 static int quant_tbl32[] = /**< 32kbit/s 4bits per sample */ 112 static int quant_tbl32[] = /**< 32kbit/s 4bits per sample */
113 { -125, 79, 177, 245, 299, 348, 399, INT_MAX }; 113 { -125, 79, 177, 245, 299, 348, 399, INT_MAX };
114 static int iquant_tbl32[] = 114 static int iquant_tbl32[] =
115 { INT_MIN, 4, 135, 213, 273, 323, 373, 425, 115 { INT_MIN, 4, 135, 213, 273, 323, 373, 425,
116 425, 373, 323, 273, 213, 135, 4, INT_MIN }; 116 425, 373, 323, 273, 213, 135, 4, INT_MIN };
117 static int W_tbl32[] = 117 static int W_tbl32[] =
118 { -12, 18, 41, 64, 112, 198, 355, 1122, 118 { -12, 18, 41, 64, 112, 198, 355, 1122,
119 1122, 355, 198, 112, 64, 41, 18, -12}; 119 1122, 355, 198, 112, 64, 41, 18, -12};
120 static int F_tbl32[] = 120 static int F_tbl32[] =
121 { 0, 0, 0, 1, 1, 1, 3, 7, 7, 3, 1, 1, 1, 0, 0, 0 }; 121 { 0, 0, 0, 1, 1, 1, 3, 7, 7, 3, 1, 1, 1, 0, 0, 0 };
122 122
123 static int quant_tbl40[] = /**< 40kbit/s 5bits per sample */ 123 static int quant_tbl40[] = /**< 40kbit/s 5bits per sample */
124 { -122, -16, 67, 138, 197, 249, 297, 338, 124 { -122, -16, 67, 138, 197, 249, 297, 338,
125 377, 412, 444, 474, 501, 527, 552, INT_MAX }; 125 377, 412, 444, 474, 501, 527, 552, INT_MAX };
126 static int iquant_tbl40[] = 126 static int iquant_tbl40[] =
127 { INT_MIN, -66, 28, 104, 169, 224, 274, 318, 127 { INT_MIN, -66, 28, 104, 169, 224, 274, 318,
128 358, 395, 429, 459, 488, 514, 539, 566, 128 358, 395, 429, 459, 488, 514, 539, 566,
129 566, 539, 514, 488, 459, 429, 395, 358, 129 566, 539, 514, 488, 459, 429, 395, 358,
130 318, 274, 224, 169, 104, 28, -66, INT_MIN }; 130 318, 274, 224, 169, 104, 28, -66, INT_MIN };
131 static int W_tbl40[] = 131 static int W_tbl40[] =
132 { 14, 14, 24, 39, 40, 41, 58, 100, 132 { 14, 14, 24, 39, 40, 41, 58, 100,
133 141, 179, 219, 280, 358, 440, 529, 696, 133 141, 179, 219, 280, 358, 440, 529, 696,
134 696, 529, 440, 358, 280, 219, 179, 141, 134 696, 529, 440, 358, 280, 219, 179, 141,
135 100, 58, 41, 40, 39, 24, 14, 14 }; 135 100, 58, 41, 40, 39, 24, 14, 14 };
136 static int F_tbl40[] = 136 static int F_tbl40[] =
137 { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6, 137 { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6,
138 6, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; 138 6, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 };
139 139
140 static G726Tables G726Tables_pool[] = 140 static G726Tables G726Tables_pool[] =
141 {{ 2, quant_tbl16, iquant_tbl16, W_tbl16, F_tbl16 }, 141 {{ 2, quant_tbl16, iquant_tbl16, W_tbl16, F_tbl16 },
142 { 3, quant_tbl24, iquant_tbl24, W_tbl24, F_tbl24 }, 142 { 3, quant_tbl24, iquant_tbl24, W_tbl24, F_tbl24 },
143 { 4, quant_tbl32, iquant_tbl32, W_tbl32, F_tbl32 }, 143 { 4, quant_tbl32, iquant_tbl32, W_tbl32, F_tbl32 },
144 { 5, quant_tbl40, iquant_tbl40, W_tbl40, F_tbl40 }}; 144 { 5, quant_tbl40, iquant_tbl40, W_tbl40, F_tbl40 }};
145 145
146 146
147 /** 147 /**
148 * Para 4.2.2 page 18: Adaptive quantizer. 148 * Para 4.2.2 page 18: Adaptive quantizer.
149 */ 149 */
150 static inline uint8_t quant(G726Context* c, int d) 150 static inline uint8_t quant(G726Context* c, int d)
151 { 151 {
152 int sign, exp, i, dln; 152 int sign, exp, i, dln;
153 153
154 sign = i = 0; 154 sign = i = 0;
155 if (d < 0) { 155 if (d < 0) {
156 sign = 1; 156 sign = 1;
157 d = -d; 157 d = -d;
158 } 158 }
159 exp = av_log2_16bit(d); 159 exp = av_log2_16bit(d);
160 dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2); 160 dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2);
161 161
162 while (c->tbls->quant[i] < INT_MAX && c->tbls->quant[i] < dln) 162 while (c->tbls->quant[i] < INT_MAX && c->tbls->quant[i] < dln)
163 ++i; 163 ++i;
164 164
165 if (sign) 165 if (sign)
166 i = ~i; 166 i = ~i;
167 if (c->tbls->bits != 2 && i == 0) /* I'm not sure this is a good idea */ 167 if (c->tbls->bits != 2 && i == 0) /* I'm not sure this is a good idea */
168 i = 0xff; 168 i = 0xff;
169 169
170 return i; 170 return i;
171 } 171 }
172 172
173 /** 173 /**
174 * Para 4.2.3 page 22: Inverse adaptive quantizer. 174 * Para 4.2.3 page 22: Inverse adaptive quantizer.
175 */ 175 */
176 static inline int16_t inverse_quant(G726Context* c, int i) 176 static inline int16_t inverse_quant(G726Context* c, int i)
177 { 177 {
178 int dql, dex, dqt; 178 int dql, dex, dqt;
179 179
180 dql = c->tbls->iquant[i] + (c->y >> 2); 180 dql = c->tbls->iquant[i] + (c->y >> 2);
181 dex = (dql>>7) & 0xf; /* 4bit exponent */ 181 dex = (dql>>7) & 0xf; /* 4bit exponent */
182 dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */ 182 dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */
183 return (dql < 0) ? 0 : ((dqt<<7) >> (14-dex)); 183 return (dql < 0) ? 0 : ((dqt<<7) >> (14-dex));
184 } 184 }
185 185
186 static inline int16_t g726_iterate(G726Context* c, int16_t I) 186 static inline int16_t g726_iterate(G726Context* c, int16_t I)
187 { 187 {
188 int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0; 188 int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0;
189 Float11 f; 189 Float11 f;
190 190
191 dq = inverse_quant(c, I); 191 dq = inverse_quant(c, I);
192 if (I >> (c->tbls->bits - 1)) /* get the sign */ 192 if (I >> (c->tbls->bits - 1)) /* get the sign */
193 dq = -dq; 193 dq = -dq;
194 re_signal = c->se + dq; 194 re_signal = c->se + dq;
195 195
199 thr2 = (ylint > 9) ? 0x1f << 10 : (0x20 + ylfrac) << ylint; 199 thr2 = (ylint > 9) ? 0x1f << 10 : (0x20 + ylfrac) << ylint;
200 if (c->td == 1 && abs(dq) > ((thr2+(thr2>>1))>>1)) 200 if (c->td == 1 && abs(dq) > ((thr2+(thr2>>1))>>1))
201 tr = 1; 201 tr = 1;
202 else 202 else
203 tr = 0; 203 tr = 0;
204 204
205 /* Update second order predictor coefficient A2 and A1 */ 205 /* Update second order predictor coefficient A2 and A1 */
206 pk0 = (c->sez + dq) ? sgn(c->sez + dq) : 0; 206 pk0 = (c->sez + dq) ? sgn(c->sez + dq) : 0;
207 dq0 = dq ? sgn(dq) : 0; 207 dq0 = dq ? sgn(dq) : 0;
208 if (tr) { 208 if (tr) {
209 c->a[0] = 0; 209 c->a[0] = 0;
211 for (i=0; i<6; i++) 211 for (i=0; i<6; i++)
212 c->b[i] = 0; 212 c->b[i] = 0;
213 } else { 213 } else {
214 /* This is a bit crazy, but it really is +255 not +256 */ 214 /* This is a bit crazy, but it really is +255 not +256 */
215 fa1 = clip((-c->a[0]*c->pk[0]*pk0)>>5, -256, 255); 215 fa1 = clip((-c->a[0]*c->pk[0]*pk0)>>5, -256, 255);
216 216
217 c->a[1] += 128*pk0*c->pk[1] + fa1 - (c->a[1]>>7); 217 c->a[1] += 128*pk0*c->pk[1] + fa1 - (c->a[1]>>7);
218 c->a[1] = clip(c->a[1], -12288, 12288); 218 c->a[1] = clip(c->a[1], -12288, 12288);
219 c->a[0] += 64*3*pk0*c->pk[0] - (c->a[0] >> 8); 219 c->a[0] += 64*3*pk0*c->pk[0] - (c->a[0] >> 8);
220 c->a[0] = clip(c->a[0], -(15360 - c->a[1]), 15360 - c->a[1]); 220 c->a[0] = clip(c->a[0], -(15360 - c->a[1]), 15360 - c->a[1]);
221 221
230 i2f(re_signal, &c->sr[0]); 230 i2f(re_signal, &c->sr[0]);
231 for (i=5; i>0; i--) 231 for (i=5; i>0; i--)
232 c->dq[i] = c->dq[i-1]; 232 c->dq[i] = c->dq[i-1];
233 i2f(dq, &c->dq[0]); 233 i2f(dq, &c->dq[0]);
234 c->dq[0].sign = I >> (c->tbls->bits - 1); /* Isn't it crazy ?!?! */ 234 c->dq[0].sign = I >> (c->tbls->bits - 1); /* Isn't it crazy ?!?! */
235 235
236 /* Update tone detect [I'm not sure 'tr == 0' is really needed] */ 236 /* Update tone detect [I'm not sure 'tr == 0' is really needed] */
237 c->td = (tr == 0 && c->a[1] < -11776); 237 c->td = (tr == 0 && c->a[1] < -11776);
238 238
239 /* Update Ap */ 239 /* Update Ap */
240 c->dms += ((c->tbls->F[I]<<9) - c->dms) >> 5; 240 c->dms += ((c->tbls->F[I]<<9) - c->dms) >> 5;
241 c->dml += ((c->tbls->F[I]<<11) - c->dml) >> 7; 241 c->dml += ((c->tbls->F[I]<<11) - c->dml) >> 7;
242 if (tr) 242 if (tr)
243 c->ap = 256; 243 c->ap = 256;
244 else if (c->y > 1535 && !c->td && (abs((c->dms << 2) - c->dml) < (c->dml >> 3))) 244 else if (c->y > 1535 && !c->td && (abs((c->dms << 2) - c->dml) < (c->dml >> 3)))
245 c->ap += (-c->ap) >> 4; 245 c->ap += (-c->ap) >> 4;
246 else 246 else
247 c->ap += (0x200 - c->ap) >> 4; 247 c->ap += (0x200 - c->ap) >> 4;
248 248
249 /* Update Yu and Yl */ 249 /* Update Yu and Yl */
250 c->yu = clip(c->y + (((c->tbls->W[I] << 5) - c->y) >> 5), 544, 5120); 250 c->yu = clip(c->y + (((c->tbls->W[I] << 5) - c->y) >> 5), 544, 5120);
251 c->yl += c->yu + ((-c->yl)>>6); 251 c->yl += c->yu + ((-c->yl)>>6);
252 252
253 /* Next iteration for Y */ 253 /* Next iteration for Y */
254 al = (c->ap >= 256) ? 1<<6 : c->ap >> 2; 254 al = (c->ap >= 256) ? 1<<6 : c->ap >> 2;
255 c->y = (c->yl + (c->yu - (c->yl>>6))*al) >> 6; 255 c->y = (c->yl + (c->yu - (c->yl>>6))*al) >> 6;
256 256
257 /* Next iteration for SE and SEZ */ 257 /* Next iteration for SE and SEZ */
258 c->se = 0; 258 c->se = 0;
259 for (i=0; i<6; i++) 259 for (i=0; i<6; i++)
260 c->se += mult(i2f(c->b[i] >> 2, &f), &c->dq[i]); 260 c->se += mult(i2f(c->b[i] >> 2, &f), &c->dq[i]);
261 c->sez = c->se >> 1; 261 c->sez = c->se >> 1;
300 } 300 }
301 301
302 static int16_t g726_encode(G726Context* c, int16_t sig) 302 static int16_t g726_encode(G726Context* c, int16_t sig)
303 { 303 {
304 uint8_t i; 304 uint8_t i;
305 305
306 i = quant(c, sig/4 - c->se) & ((1<<c->tbls->bits) - 1); 306 i = quant(c, sig/4 - c->se) & ((1<<c->tbls->bits) - 1);
307 g726_iterate(c, i); 307 g726_iterate(c, i);
308 return i; 308 return i;
309 } 309 }
310 310
318 } AVG726Context; 318 } AVG726Context;
319 319
320 static int g726_init(AVCodecContext * avctx) 320 static int g726_init(AVCodecContext * avctx)
321 { 321 {
322 AVG726Context* c = (AVG726Context*)avctx->priv_data; 322 AVG726Context* c = (AVG726Context*)avctx->priv_data;
323 323
324 if (avctx->channels != 1 || 324 if (avctx->channels != 1 ||
325 (avctx->bit_rate != 16000 && avctx->bit_rate != 24000 && 325 (avctx->bit_rate != 16000 && avctx->bit_rate != 24000 &&
326 avctx->bit_rate != 32000 && avctx->bit_rate != 40000)) { 326 avctx->bit_rate != 32000 && avctx->bit_rate != 40000)) {
327 av_log(avctx, AV_LOG_ERROR, "G726: unsupported audio format\n"); 327 av_log(avctx, AV_LOG_ERROR, "G726: unsupported audio format\n");
328 return -1; 328 return -1;
362 for (; buf_size; buf_size--) 362 for (; buf_size; buf_size--)
363 put_bits(&pb, c->code_size, g726_encode(&c->c, *samples++)); 363 put_bits(&pb, c->code_size, g726_encode(&c->c, *samples++));
364 364
365 flush_put_bits(&pb); 365 flush_put_bits(&pb);
366 366
367 return put_bits_count(&pb)>>3; 367 return put_bits_count(&pb)>>3;
368 } 368 }
369 369
370 static int g726_decode_frame(AVCodecContext *avctx, 370 static int g726_decode_frame(AVCodecContext *avctx,
371 void *data, int *data_size, 371 void *data, int *data_size,
372 uint8_t *buf, int buf_size) 372 uint8_t *buf, int buf_size)
373 { 373 {
374 AVG726Context *c = avctx->priv_data; 374 AVG726Context *c = avctx->priv_data;
375 short *samples = data; 375 short *samples = data;
376 uint8_t code; 376 uint8_t code;
377 uint8_t mask; 377 uint8_t mask;
378 GetBitContext gb; 378 GetBitContext gb;
379 379
380 if (!buf_size) 380 if (!buf_size)
381 goto out; 381 goto out;
382 382
383 mask = (1<<c->code_size) - 1; 383 mask = (1<<c->code_size) - 1;
384 init_get_bits(&gb, buf, buf_size * 8); 384 init_get_bits(&gb, buf, buf_size * 8);
385 if (c->bits_left) { 385 if (c->bits_left) {
386 int s = c->code_size - c->bits_left;; 386 int s = c->code_size - c->bits_left;;
387 code = (c->bit_buffer << s) | get_bits(&gb, s); 387 code = (c->bit_buffer << s) | get_bits(&gb, s);
388 *samples++ = g726_decode(&c->c, code & mask); 388 *samples++ = g726_decode(&c->c, code & mask);
389 } 389 }
390 390
391 while (get_bits_count(&gb) + c->code_size <= buf_size*8) 391 while (get_bits_count(&gb) + c->code_size <= buf_size*8)
392 *samples++ = g726_decode(&c->c, get_bits(&gb, c->code_size) & mask); 392 *samples++ = g726_decode(&c->c, get_bits(&gb, c->code_size) & mask);
393 393
394 c->bits_left = buf_size*8 - get_bits_count(&gb); 394 c->bits_left = buf_size*8 - get_bits_count(&gb);
395 c->bit_buffer = get_bits(&gb, c->bits_left); 395 c->bit_buffer = get_bits(&gb, c->bits_left);
396 396
397 out: 397 out:
398 *data_size = (uint8_t*)samples - (uint8_t*)data; 398 *data_size = (uint8_t*)samples - (uint8_t*)data;
399 return buf_size; 399 return buf_size;
400 } 400 }
401 401