/src/ffmpeg/libavcodec/g726.c
Line | Count | Source |
1 | | /* |
2 | | * G.726 ADPCM audio codec |
3 | | * Copyright (c) 2004 Roman Shaposhnik |
4 | | * |
5 | | * This is a very straightforward rendition of the G.726 |
6 | | * Section 4 "Computational Details". |
7 | | * |
8 | | * This file is part of FFmpeg. |
9 | | * |
10 | | * FFmpeg is free software; you can redistribute it and/or |
11 | | * modify it under the terms of the GNU Lesser General Public |
12 | | * License as published by the Free Software Foundation; either |
13 | | * version 2.1 of the License, or (at your option) any later version. |
14 | | * |
15 | | * FFmpeg is distributed in the hope that it will be useful, |
16 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
17 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
18 | | * Lesser General Public License for more details. |
19 | | * |
20 | | * You should have received a copy of the GNU Lesser General Public |
21 | | * License along with FFmpeg; if not, write to the Free Software |
22 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
23 | | */ |
24 | | |
25 | | #include "config_components.h" |
26 | | |
27 | | #include <limits.h> |
28 | | |
29 | | #include "libavutil/channel_layout.h" |
30 | | #include "libavutil/opt.h" |
31 | | #include "avcodec.h" |
32 | | #include "codec_internal.h" |
33 | | #include "decode.h" |
34 | | #include "encode.h" |
35 | | #include "get_bits.h" |
36 | | #include "put_bits.h" |
37 | | |
38 | | /** |
39 | | * G.726 11-bit float. |
40 | | * G.726 Standard uses rather odd 11-bit floating point arithmetic for |
41 | | * numerous occasions. It's a mystery to me why they did it this way |
42 | | * instead of simply using 32-bit integer arithmetic. |
43 | | */ |
44 | | typedef struct Float11 { |
45 | | uint8_t sign; /**< 1 bit sign */ |
46 | | uint8_t exp; /**< 4 bits exponent */ |
47 | | uint8_t mant; /**< 6 bits mantissa */ |
48 | | } Float11; |
49 | | |
50 | | static inline Float11* i2f(int i, Float11* f) |
51 | 974M | { |
52 | 974M | f->sign = (i < 0); |
53 | 974M | if (f->sign) |
54 | 275M | i = -i; |
55 | 974M | f->exp = av_log2_16bit(i) + !!i; |
56 | 974M | f->mant = i? (i<<6) >> f->exp : 1<<5; |
57 | 974M | return f; |
58 | 974M | } |
59 | | |
60 | | static inline int16_t mult(Float11* f1, Float11* f2) |
61 | 779M | { |
62 | 779M | int res, exp; |
63 | | |
64 | 779M | exp = f1->exp + f2->exp; |
65 | 779M | res = (((f1->mant * f2->mant) + 0x30) >> 4); |
66 | 779M | res = exp > 19 ? res << (exp - 19) : res >> (19 - exp); |
67 | 779M | return (f1->sign ^ f2->sign) ? -res : res; |
68 | 779M | } |
69 | | |
70 | | static inline int sgn(int value) |
71 | 752M | { |
72 | 752M | return (value < 0) ? -1 : 1; |
73 | 752M | } |
74 | | |
75 | | typedef struct G726Tables { |
76 | | const int* quant; /**< quantization table */ |
77 | | const int16_t* iquant; /**< inverse quantization table */ |
78 | | const int16_t* W; /**< special table #1 ;-) */ |
79 | | const uint8_t* F; /**< special table #2 */ |
80 | | } G726Tables; |
81 | | |
82 | | typedef struct G726Context { |
83 | | AVClass *class; |
84 | | G726Tables tbls; /**< static tables needed for computation */ |
85 | | |
86 | | Float11 sr[2]; /**< prev. reconstructed samples */ |
87 | | Float11 dq[6]; /**< prev. difference */ |
88 | | int a[2]; /**< second order predictor coeffs */ |
89 | | int b[6]; /**< sixth order predictor coeffs */ |
90 | | int pk[2]; /**< signs of prev. 2 sez + dq */ |
91 | | |
92 | | int ap; /**< scale factor control */ |
93 | | int yu; /**< fast scale factor */ |
94 | | int yl; /**< slow scale factor */ |
95 | | int dms; /**< short average magnitude of F[i] */ |
96 | | int dml; /**< long average magnitude of F[i] */ |
97 | | int td; /**< tone detect */ |
98 | | |
99 | | int se; /**< estimated signal for the next iteration */ |
100 | | int sez; /**< estimated second order prediction */ |
101 | | int y; /**< quantizer scaling factor for the next iteration */ |
102 | | int code_size; |
103 | | int little_endian; /**< little-endian bitstream as used in aiff and Sun AU */ |
104 | | } G726Context; |
105 | | |
106 | | static const int quant_tbl16[] = /**< 16kbit/s 2 bits per sample */ |
107 | | { 260, INT_MAX }; |
108 | | static const int16_t iquant_tbl16[] = |
109 | | { 116, 365, 365, 116 }; |
110 | | static const int16_t W_tbl16[] = |
111 | | { -22, 439, 439, -22 }; |
112 | | static const uint8_t F_tbl16[] = |
113 | | { 0, 7, 7, 0 }; |
114 | | |
115 | | static const int quant_tbl24[] = /**< 24kbit/s 3 bits per sample */ |
116 | | { 7, 217, 330, INT_MAX }; |
117 | | static const int16_t iquant_tbl24[] = |
118 | | { INT16_MIN, 135, 273, 373, 373, 273, 135, INT16_MIN }; |
119 | | static const int16_t W_tbl24[] = |
120 | | { -4, 30, 137, 582, 582, 137, 30, -4 }; |
121 | | static const uint8_t F_tbl24[] = |
122 | | { 0, 1, 2, 7, 7, 2, 1, 0 }; |
123 | | |
124 | | static const int quant_tbl32[] = /**< 32kbit/s 4 bits per sample */ |
125 | | { -125, 79, 177, 245, 299, 348, 399, INT_MAX }; |
126 | | static const int16_t iquant_tbl32[] = |
127 | | { INT16_MIN, 4, 135, 213, 273, 323, 373, 425, |
128 | | 425, 373, 323, 273, 213, 135, 4, INT16_MIN }; |
129 | | static const int16_t W_tbl32[] = |
130 | | { -12, 18, 41, 64, 112, 198, 355, 1122, |
131 | | 1122, 355, 198, 112, 64, 41, 18, -12}; |
132 | | static const uint8_t F_tbl32[] = |
133 | | { 0, 0, 0, 1, 1, 1, 3, 7, 7, 3, 1, 1, 1, 0, 0, 0 }; |
134 | | |
135 | | static const int quant_tbl40[] = /**< 40kbit/s 5 bits per sample */ |
136 | | { -122, -16, 67, 138, 197, 249, 297, 338, |
137 | | 377, 412, 444, 474, 501, 527, 552, INT_MAX }; |
138 | | static const int16_t iquant_tbl40[] = |
139 | | { INT16_MIN, -66, 28, 104, 169, 224, 274, 318, |
140 | | 358, 395, 429, 459, 488, 514, 539, 566, |
141 | | 566, 539, 514, 488, 459, 429, 395, 358, |
142 | | 318, 274, 224, 169, 104, 28, -66, INT16_MIN }; |
143 | | static const int16_t W_tbl40[] = |
144 | | { 14, 14, 24, 39, 40, 41, 58, 100, |
145 | | 141, 179, 219, 280, 358, 440, 529, 696, |
146 | | 696, 529, 440, 358, 280, 219, 179, 141, |
147 | | 100, 58, 41, 40, 39, 24, 14, 14 }; |
148 | | static const uint8_t F_tbl40[] = |
149 | | { 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6, |
150 | | 6, 6, 5, 4, 3, 2, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }; |
151 | | |
152 | | static const G726Tables G726Tables_pool[] = |
153 | | {{ quant_tbl16, iquant_tbl16, W_tbl16, F_tbl16 }, |
154 | | { quant_tbl24, iquant_tbl24, W_tbl24, F_tbl24 }, |
155 | | { quant_tbl32, iquant_tbl32, W_tbl32, F_tbl32 }, |
156 | | { quant_tbl40, iquant_tbl40, W_tbl40, F_tbl40 }}; |
157 | | |
158 | | |
159 | | /** |
160 | | * Paragraph 4.2.2 page 18: Adaptive quantizer. |
161 | | */ |
162 | | static inline uint8_t quant(G726Context* c, int d) |
163 | 0 | { |
164 | 0 | int sign, exp, i, dln; |
165 | |
|
166 | 0 | sign = i = 0; |
167 | 0 | if (d < 0) { |
168 | 0 | sign = 1; |
169 | 0 | d = -d; |
170 | 0 | } |
171 | 0 | exp = av_log2_16bit(d); |
172 | 0 | dln = ((exp<<7) + (((d<<7)>>exp)&0x7f)) - (c->y>>2); |
173 | |
|
174 | 0 | while (c->tbls.quant[i] < INT_MAX && c->tbls.quant[i] < dln) |
175 | 0 | ++i; |
176 | |
|
177 | 0 | if (sign) |
178 | 0 | i = ~i; |
179 | 0 | if (c->code_size != 2 && i == 0) /* I'm not sure this is a good idea */ |
180 | 0 | i = 0xff; |
181 | |
|
182 | 0 | return i; |
183 | 0 | } |
184 | | |
185 | | /** |
186 | | * Paragraph 4.2.3 page 22: Inverse adaptive quantizer. |
187 | | */ |
188 | | static inline int16_t inverse_quant(G726Context* c, int i) |
189 | 97.4M | { |
190 | 97.4M | int dql, dex, dqt; |
191 | | |
192 | 97.4M | dql = c->tbls.iquant[i] + (c->y >> 2); |
193 | 97.4M | dex = (dql>>7) & 0xf; /* 4-bit exponent */ |
194 | 97.4M | dqt = (1<<7) + (dql & 0x7f); /* log2 -> linear */ |
195 | 97.4M | return (dql < 0) ? 0 : ((dqt<<dex) >> 7); |
196 | 97.4M | } |
197 | | |
198 | | static int16_t g726_decode(G726Context* c, int I) |
199 | 97.4M | { |
200 | 97.4M | int dq, re_signal, pk0, fa1, i, tr, ylint, ylfrac, thr2, al, dq0; |
201 | 97.4M | Float11 f; |
202 | 97.4M | int I_sig= I >> (c->code_size - 1); |
203 | | |
204 | 97.4M | dq = inverse_quant(c, I); |
205 | | |
206 | | /* Transition detect */ |
207 | 97.4M | ylint = (c->yl >> 15); |
208 | 97.4M | ylfrac = (c->yl >> 10) & 0x1f; |
209 | 97.4M | thr2 = (ylint > 9) ? 0x1f << 10 : (0x20 + ylfrac) << ylint; |
210 | 97.4M | tr= (c->td == 1 && dq > ((3*thr2)>>2)); |
211 | | |
212 | 97.4M | if (I_sig) /* get the sign */ |
213 | 23.9M | dq = -dq; |
214 | 97.4M | re_signal = (int16_t)(c->se + dq); |
215 | | |
216 | | /* Update second order predictor coefficient A2 and A1 */ |
217 | 97.4M | pk0 = (c->sez + dq) ? sgn(c->sez + dq) : 0; |
218 | 97.4M | dq0 = dq ? sgn(dq) : 0; |
219 | 97.4M | if (tr) { |
220 | 57.0k | c->a[0] = 0; |
221 | 57.0k | c->a[1] = 0; |
222 | 399k | for (i=0; i<6; i++) |
223 | 342k | c->b[i] = 0; |
224 | 97.4M | } else { |
225 | | /* This is a bit crazy, but it really is +255 not +256 */ |
226 | 97.4M | fa1 = av_clip_intp2((-c->a[0]*c->pk[0]*pk0)>>5, 8); |
227 | | |
228 | 97.4M | c->a[1] += 128*pk0*c->pk[1] + fa1 - (c->a[1]>>7); |
229 | 97.4M | c->a[1] = av_clip(c->a[1], -12288, 12288); |
230 | 97.4M | c->a[0] += 64*3*pk0*c->pk[0] - (c->a[0] >> 8); |
231 | 97.4M | c->a[0] = av_clip(c->a[0], -(15360 - c->a[1]), 15360 - c->a[1]); |
232 | | |
233 | 681M | for (i=0; i<6; i++) |
234 | 584M | c->b[i] += 128*dq0*sgn(-c->dq[i].sign) - (c->b[i]>>8); |
235 | 97.4M | } |
236 | | |
237 | | /* Update Dq and Sr and Pk */ |
238 | 97.4M | c->pk[1] = c->pk[0]; |
239 | 97.4M | c->pk[0] = pk0 ? pk0 : 1; |
240 | 97.4M | c->sr[1] = c->sr[0]; |
241 | 97.4M | i2f(re_signal, &c->sr[0]); |
242 | 584M | for (i=5; i>0; i--) |
243 | 487M | c->dq[i] = c->dq[i-1]; |
244 | 97.4M | i2f(dq, &c->dq[0]); |
245 | 97.4M | c->dq[0].sign = I_sig; /* Isn't it crazy ?!?! */ |
246 | | |
247 | 97.4M | c->td = c->a[1] < -11776; |
248 | | |
249 | | /* Update Ap */ |
250 | 97.4M | c->dms += (c->tbls.F[I]<<4) + ((- c->dms) >> 5); |
251 | 97.4M | c->dml += (c->tbls.F[I]<<4) + ((- c->dml) >> 7); |
252 | 97.4M | if (tr) |
253 | 57.0k | c->ap = 256; |
254 | 97.4M | else { |
255 | 97.4M | c->ap += (-c->ap) >> 4; |
256 | 97.4M | if (c->y <= 1535 || c->td || abs((c->dms << 2) - c->dml) >= (c->dml >> 3)) |
257 | 76.5M | c->ap += 0x20; |
258 | 97.4M | } |
259 | | |
260 | | /* Update Yu and Yl */ |
261 | 97.4M | c->yu = av_clip(c->y + c->tbls.W[I] + ((-c->y)>>5), 544, 5120); |
262 | 97.4M | c->yl += c->yu + ((-c->yl)>>6); |
263 | | |
264 | | /* Next iteration for Y */ |
265 | 97.4M | al = (c->ap >= 256) ? 1<<6 : c->ap >> 2; |
266 | 97.4M | c->y = (c->yl + (c->yu - (c->yl>>6))*al) >> 6; |
267 | | |
268 | | /* Next iteration for SE and SEZ */ |
269 | 97.4M | c->se = 0; |
270 | 682M | for (i=0; i<6; i++) |
271 | 584M | c->se += mult(i2f(c->b[i] >> 2, &f), &c->dq[i]); |
272 | 97.4M | c->sez = c->se >> 1; |
273 | 292M | for (i=0; i<2; i++) |
274 | 194M | c->se += mult(i2f(c->a[i] >> 2, &f), &c->sr[i]); |
275 | 97.4M | c->se >>= 1; |
276 | | |
277 | 97.4M | return av_clip(re_signal * 4, -0xffff, 0xffff); |
278 | 97.4M | } |
279 | | |
280 | | static av_cold int g726_reset(G726Context *c) |
281 | 85.5k | { |
282 | 85.5k | int i; |
283 | | |
284 | 85.5k | c->tbls = G726Tables_pool[c->code_size - 2]; |
285 | 256k | for (i=0; i<2; i++) { |
286 | 171k | c->sr[i].mant = 1<<5; |
287 | 171k | c->pk[i] = 1; |
288 | 171k | } |
289 | 598k | for (i=0; i<6; i++) { |
290 | 513k | c->dq[i].mant = 1<<5; |
291 | 513k | } |
292 | 85.5k | c->yu = 544; |
293 | 85.5k | c->yl = 34816; |
294 | | |
295 | 85.5k | c->y = 544; |
296 | | |
297 | 85.5k | return 0; |
298 | 85.5k | } |
299 | | |
300 | | #if CONFIG_ADPCM_G726_ENCODER || CONFIG_ADPCM_G726LE_ENCODER |
301 | | static int16_t g726_encode(G726Context* c, int16_t sig) |
302 | 0 | { |
303 | 0 | uint8_t i; |
304 | |
|
305 | 0 | i = av_zero_extend(quant(c, sig/4 - c->se), c->code_size); |
306 | 0 | g726_decode(c, i); |
307 | 0 | return i; |
308 | 0 | } |
309 | | |
310 | | /* Interfacing to the libavcodec */ |
311 | | |
312 | | static av_cold int g726_encode_init(AVCodecContext *avctx) |
313 | 0 | { |
314 | 0 | G726Context* c = avctx->priv_data; |
315 | |
|
316 | 0 | c->little_endian = !strcmp(avctx->codec->name, "g726le"); |
317 | |
|
318 | 0 | if (avctx->strict_std_compliance > FF_COMPLIANCE_UNOFFICIAL && |
319 | 0 | avctx->sample_rate != 8000) { |
320 | 0 | av_log(avctx, AV_LOG_ERROR, "Sample rates other than 8kHz are not " |
321 | 0 | "allowed when the compliance level is higher than unofficial. " |
322 | 0 | "Resample or reduce the compliance level.\n"); |
323 | 0 | return AVERROR(EINVAL); |
324 | 0 | } |
325 | 0 | if (avctx->sample_rate <= 0) { |
326 | 0 | av_log(avctx, AV_LOG_ERROR, "Invalid sample rate %d\n", |
327 | 0 | avctx->sample_rate); |
328 | 0 | return AVERROR(EINVAL); |
329 | 0 | } |
330 | | |
331 | 0 | if (avctx->ch_layout.nb_channels != 1) { |
332 | 0 | av_log(avctx, AV_LOG_ERROR, "Only mono is supported\n"); |
333 | 0 | return AVERROR(EINVAL); |
334 | 0 | } |
335 | | |
336 | 0 | if (avctx->bit_rate) |
337 | 0 | c->code_size = (avctx->bit_rate + avctx->sample_rate/2) / avctx->sample_rate; |
338 | |
|
339 | 0 | c->code_size = av_clip(c->code_size, 2, 5); |
340 | 0 | avctx->bit_rate = c->code_size * avctx->sample_rate; |
341 | 0 | avctx->bits_per_coded_sample = c->code_size; |
342 | |
|
343 | 0 | g726_reset(c); |
344 | | |
345 | | /* select a frame size that will end on a byte boundary and have a size of |
346 | | approximately 1024 bytes */ |
347 | 0 | avctx->frame_size = ((int[]){ 4096, 2736, 2048, 1640 })[c->code_size - 2]; |
348 | |
|
349 | 0 | return 0; |
350 | 0 | } |
351 | | |
352 | | static int g726_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, |
353 | | const AVFrame *frame, int *got_packet_ptr) |
354 | 0 | { |
355 | 0 | G726Context *c = avctx->priv_data; |
356 | 0 | const int16_t *samples = (const int16_t *)frame->data[0]; |
357 | 0 | PutBitContext pb; |
358 | 0 | int i, ret, out_size; |
359 | |
|
360 | 0 | out_size = (frame->nb_samples * c->code_size + 7) / 8; |
361 | 0 | if ((ret = ff_get_encode_buffer(avctx, avpkt, out_size, 0)) < 0) |
362 | 0 | return ret; |
363 | 0 | init_put_bits(&pb, avpkt->data, avpkt->size); |
364 | |
|
365 | 0 | for (i = 0; i < frame->nb_samples; i++) |
366 | 0 | if (c->little_endian) { |
367 | 0 | put_bits_le(&pb, c->code_size, g726_encode(c, *samples++)); |
368 | 0 | } else { |
369 | 0 | put_bits(&pb, c->code_size, g726_encode(c, *samples++)); |
370 | 0 | } |
371 | |
|
372 | 0 | if (c->little_endian) { |
373 | 0 | flush_put_bits_le(&pb); |
374 | 0 | } else { |
375 | 0 | flush_put_bits(&pb); |
376 | 0 | } |
377 | |
|
378 | 0 | *got_packet_ptr = 1; |
379 | 0 | return 0; |
380 | 0 | } |
381 | | |
382 | | #define OFFSET(x) offsetof(G726Context, x) |
383 | | #define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM |
384 | | static const AVOption options[] = { |
385 | | { "code_size", "Bits per code", OFFSET(code_size), AV_OPT_TYPE_INT, { .i64 = 4 }, 2, 5, AE }, |
386 | | { NULL }, |
387 | | }; |
388 | | |
389 | | static const AVClass g726_class = { |
390 | | .class_name = "g726", |
391 | | .item_name = av_default_item_name, |
392 | | .option = options, |
393 | | .version = LIBAVUTIL_VERSION_INT, |
394 | | }; |
395 | | |
396 | | static const FFCodecDefault defaults[] = { |
397 | | { "b", "0" }, |
398 | | { NULL }, |
399 | | }; |
400 | | #endif |
401 | | |
402 | | #if CONFIG_ADPCM_G726_ENCODER |
403 | | const FFCodec ff_adpcm_g726_encoder = { |
404 | | .p.name = "g726", |
405 | | CODEC_LONG_NAME("G.726 ADPCM"), |
406 | | .p.type = AVMEDIA_TYPE_AUDIO, |
407 | | .p.id = AV_CODEC_ID_ADPCM_G726, |
408 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME | |
409 | | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
410 | | .priv_data_size = sizeof(G726Context), |
411 | | .init = g726_encode_init, |
412 | | FF_CODEC_ENCODE_CB(g726_encode_frame), |
413 | | CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S16), |
414 | | .p.priv_class = &g726_class, |
415 | | .defaults = defaults, |
416 | | }; |
417 | | #endif |
418 | | |
419 | | #if CONFIG_ADPCM_G726LE_ENCODER |
420 | | const FFCodec ff_adpcm_g726le_encoder = { |
421 | | .p.name = "g726le", |
422 | | CODEC_LONG_NAME("G.726 little endian ADPCM (\"right-justified\")"), |
423 | | .p.type = AVMEDIA_TYPE_AUDIO, |
424 | | .p.id = AV_CODEC_ID_ADPCM_G726LE, |
425 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_SMALL_LAST_FRAME | |
426 | | AV_CODEC_CAP_ENCODER_REORDERED_OPAQUE, |
427 | | .priv_data_size = sizeof(G726Context), |
428 | | .init = g726_encode_init, |
429 | | FF_CODEC_ENCODE_CB(g726_encode_frame), |
430 | | CODEC_SAMPLEFMTS(AV_SAMPLE_FMT_S16), |
431 | | .p.priv_class = &g726_class, |
432 | | .defaults = defaults, |
433 | | }; |
434 | | #endif |
435 | | |
436 | | #if CONFIG_ADPCM_G726_DECODER || CONFIG_ADPCM_G726LE_DECODER |
437 | | static av_cold int g726_decode_init(AVCodecContext *avctx) |
438 | 1.30k | { |
439 | 1.30k | G726Context* c = avctx->priv_data; |
440 | | |
441 | 1.30k | if (avctx->ch_layout.nb_channels > 1){ |
442 | 214 | avpriv_request_sample(avctx, "Decoding more than one channel"); |
443 | 214 | return AVERROR_PATCHWELCOME; |
444 | 214 | } |
445 | 1.08k | av_channel_layout_uninit(&avctx->ch_layout); |
446 | 1.08k | avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; |
447 | | |
448 | 1.08k | c->little_endian = !strcmp(avctx->codec->name, "g726le"); |
449 | | |
450 | 1.08k | c->code_size = avctx->bits_per_coded_sample; |
451 | 1.08k | if (c->code_size < 2 || c->code_size > 5) { |
452 | 206 | av_log(avctx, AV_LOG_ERROR, "Invalid number of bits %d\n", c->code_size); |
453 | 206 | return AVERROR(EINVAL); |
454 | 206 | } |
455 | 882 | g726_reset(c); |
456 | | |
457 | 882 | avctx->sample_fmt = AV_SAMPLE_FMT_S16; |
458 | 882 | if (!avctx->sample_rate) |
459 | 124 | avctx->sample_rate = 8000; |
460 | | |
461 | 882 | return 0; |
462 | 1.08k | } |
463 | | |
464 | | static int g726_decode_frame(AVCodecContext *avctx, AVFrame *frame, |
465 | | int *got_frame_ptr, AVPacket *avpkt) |
466 | 278k | { |
467 | 278k | const uint8_t *buf = avpkt->data; |
468 | 278k | int buf_size = avpkt->size; |
469 | 278k | G726Context *c = avctx->priv_data; |
470 | 278k | int16_t *samples; |
471 | 278k | GetBitContext gb; |
472 | 278k | int out_samples, ret; |
473 | | |
474 | 278k | out_samples = buf_size * 8 / c->code_size; |
475 | | |
476 | | /* get output buffer */ |
477 | 278k | frame->nb_samples = out_samples; |
478 | 278k | if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) |
479 | 0 | return ret; |
480 | 278k | samples = (int16_t *)frame->data[0]; |
481 | | |
482 | 278k | init_get_bits(&gb, buf, buf_size * 8); |
483 | | |
484 | 97.7M | while (out_samples--) |
485 | 97.4M | *samples++ = g726_decode(c, c->little_endian ? |
486 | 49.5M | get_bits_le(&gb, c->code_size) : |
487 | 97.4M | get_bits(&gb, c->code_size)); |
488 | | |
489 | 278k | if (get_bits_left(&gb) > 0) |
490 | 40.5k | av_log(avctx, AV_LOG_ERROR, "Frame invalidly split, missing parser?\n"); |
491 | | |
492 | 278k | *got_frame_ptr = 1; |
493 | | |
494 | 278k | return buf_size; |
495 | 278k | } |
496 | | |
497 | | static void g726_decode_flush(AVCodecContext *avctx) |
498 | 84.6k | { |
499 | 84.6k | G726Context *c = avctx->priv_data; |
500 | 84.6k | g726_reset(c); |
501 | 84.6k | } |
502 | | #endif |
503 | | |
504 | | #if CONFIG_ADPCM_G726_DECODER |
505 | | const FFCodec ff_adpcm_g726_decoder = { |
506 | | .p.name = "g726", |
507 | | CODEC_LONG_NAME("G.726 ADPCM"), |
508 | | .p.type = AVMEDIA_TYPE_AUDIO, |
509 | | .p.id = AV_CODEC_ID_ADPCM_G726, |
510 | | .priv_data_size = sizeof(G726Context), |
511 | | .init = g726_decode_init, |
512 | | FF_CODEC_DECODE_CB(g726_decode_frame), |
513 | | .flush = g726_decode_flush, |
514 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, |
515 | | }; |
516 | | #endif |
517 | | |
518 | | #if CONFIG_ADPCM_G726LE_DECODER |
519 | | const FFCodec ff_adpcm_g726le_decoder = { |
520 | | .p.name = "g726le", |
521 | | .p.type = AVMEDIA_TYPE_AUDIO, |
522 | | .p.id = AV_CODEC_ID_ADPCM_G726LE, |
523 | | .priv_data_size = sizeof(G726Context), |
524 | | .init = g726_decode_init, |
525 | | FF_CODEC_DECODE_CB(g726_decode_frame), |
526 | | .flush = g726_decode_flush, |
527 | | .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, |
528 | | CODEC_LONG_NAME("G.726 ADPCM little-endian"), |
529 | | }; |
530 | | #endif |