History

Add a G.722 encoder

Originally committed as revision 25164 to svn://svn.ffmpeg.org/ffmpeg/trunk

Martin Storsjö committed 16 years ago

Commit 21e681b1 parent 2efcde75 files · +86 −4Browse files

Unified · Split

5 files
  1. Changelog +1 −1
  2. doc/general.texi +1 −1
  3. libavcodec/Makefile +1 −0
  4. libavcodec/allcodecs.c +1 −1
  5. libavcodec/g722.c +82 −1
Changelog+1−1
@@ -33,7 +33,7 @@ version <next>: · 32 unmodified lines
33- Apple HTTP Live Streaming demuxer33- Apple HTTP Live Streaming demuxer
34- a64 codec34- a64 codec
35- MMS-HTTP support35- MMS-HTTP support
36- G.722 ADPCM audio decoder36- G.722 ADPCM audio encoder/decoder
37- R10k video decoder37- R10k video decoder
38- ocv_smooth filter38- ocv_smooth filter
39 39
doc/general.texi+1−1
@@ -536,7 +536,7 @@ following image formats are supported: · 535 unmodified lines
536@item ADPCM Electronic Arts R2 @tab @tab X536@item ADPCM Electronic Arts R2 @tab @tab X
537@item ADPCM Electronic Arts R3 @tab @tab X537@item ADPCM Electronic Arts R3 @tab @tab X
538@item ADPCM Electronic Arts XAS @tab @tab X538@item ADPCM Electronic Arts XAS @tab @tab X
539@item ADPCM G.722 @tab @tab X539@item ADPCM G.722 @tab X @tab X
540@item ADPCM G.726 @tab X @tab X540@item ADPCM G.726 @tab X @tab X
541@item ADPCM IMA AMV @tab @tab X541@item ADPCM IMA AMV @tab @tab X
542 @tab Used in AMV files542 @tab Used in AMV files
libavcodec/Makefile+1−0
@@ -477,6 +477,7 @@ OBJS-$(CONFIG_ADPCM_EA_R2_DECODER) += adpcm.o · 476 unmodified lines
477OBJS-$(CONFIG_ADPCM_EA_R3_DECODER) += adpcm.o477OBJS-$(CONFIG_ADPCM_EA_R3_DECODER) += adpcm.o
478OBJS-$(CONFIG_ADPCM_EA_XAS_DECODER) += adpcm.o478OBJS-$(CONFIG_ADPCM_EA_XAS_DECODER) += adpcm.o
479OBJS-$(CONFIG_ADPCM_G722_DECODER) += g722.o479OBJS-$(CONFIG_ADPCM_G722_DECODER) += g722.o
480OBJS-$(CONFIG_ADPCM_G722_ENCODER) += g722.o
480OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o481OBJS-$(CONFIG_ADPCM_G726_DECODER) += g726.o
481OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o482OBJS-$(CONFIG_ADPCM_G726_ENCODER) += g726.o
482OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o483OBJS-$(CONFIG_ADPCM_IMA_AMV_DECODER) += adpcm.o
libavcodec/allcodecs.c+1−1
@@ -318,7 +318,7 @@ void avcodec_register_all(void) · 317 unmodified lines
318 REGISTER_DECODER (ADPCM_EA_R2, adpcm_ea_r2);318 REGISTER_DECODER (ADPCM_EA_R2, adpcm_ea_r2);
319 REGISTER_DECODER (ADPCM_EA_R3, adpcm_ea_r3);319 REGISTER_DECODER (ADPCM_EA_R3, adpcm_ea_r3);
320 REGISTER_DECODER (ADPCM_EA_XAS, adpcm_ea_xas);320 REGISTER_DECODER (ADPCM_EA_XAS, adpcm_ea_xas);
321 REGISTER_DECODER (ADPCM_G722, adpcm_g722);321 REGISTER_ENCDEC (ADPCM_G722, adpcm_g722);
322 REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);322 REGISTER_ENCDEC (ADPCM_G726, adpcm_g726);
323 REGISTER_DECODER (ADPCM_IMA_AMV, adpcm_ima_amv);323 REGISTER_DECODER (ADPCM_IMA_AMV, adpcm_ima_amv);
324 REGISTER_DECODER (ADPCM_IMA_DK3, adpcm_ima_dk3);324 REGISTER_DECODER (ADPCM_IMA_DK3, adpcm_ima_dk3);
libavcodec/g722.c+82−1
@@ -1,5 +1,5 @@
1/*1/*
2 * G.722 ADPCM audio decoder2 * G.722 ADPCM audio encoder/decoder
3 *3 *
4 * Copyright (c) CMU 1993 Computer Science, Speech Group4 * Copyright (c) CMU 1993 Computer Science, Speech Group
5 * Chengxiang Lu and Alex Hauptmann5 * Chengxiang Lu and Alex Hauptmann
@@ -219,6 +219,7 @@ static av_cold int g722_init(AVCodecContext * avctx) · 213 unmodified lines
219 return 0;219 return 0;
220}220}
221 221
222#if CONFIG_ADPCM_G722_DECODER
222static const int16_t low_inv_quant5[32] = {223static const int16_t low_inv_quant5[32] = {
223 -35, -35, -2919, -2195, -1765, -1458, -1219, -1023,224 -35, -35, -2919, -2195, -1765, -1458, -1219, -1023,
224 -858, -714, -587, -473, -370, -276, -190, -110,225 -858, -714, -587, -473, -370, -276, -190, -110,
@@ -301,4 +302,84 @@ AVCodec adpcm_g722_decoder = { · 76 unmodified lines
301 .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),302 .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
302 .max_lowres = 1,303 .max_lowres = 1,
303};304};
305#endif
306
307#if CONFIG_ADPCM_G722_ENCODER
308static const int16_t low_quant[33] = {
309 35, 72, 110, 150, 190, 233, 276, 323,
310 370, 422, 473, 530, 587, 650, 714, 786,
311 858, 940, 1023, 1121, 1219, 1339, 1458, 1612,
312 1765, 1980, 2195, 2557, 2919
313};
314
315static inline void filter_samples(G722Context *c, const int16_t *samples,
316 int *xlow, int *xhigh)
317{
318 int xout1, xout2;
319 c->prev_samples[c->prev_samples_pos++] = samples[0];
320 c->prev_samples[c->prev_samples_pos++] = samples[1];
321 apply_qmf(c->prev_samples + c->prev_samples_pos - 24, &xout1, &xout2);
322 *xlow = xout1 + xout2 >> 13;
323 *xhigh = xout1 - xout2 >> 13;
324 if (c->prev_samples_pos >= PREV_SAMPLES_BUF_SIZE) {
325 memmove(c->prev_samples,
326 c->prev_samples + c->prev_samples_pos - 22,
327 22 * sizeof(c->prev_samples[0]));
328 c->prev_samples_pos = 22;
329 }
330}
331
332static inline int encode_high(const struct G722Band *state, int xhigh)
333{
334 int diff = av_clip_int16(xhigh - state->s_predictor);
335 int pred = 141 * state->scale_factor >> 8;
336 /* = diff >= 0 ? (diff < pred) + 2 : diff >= -pred */
337 return ((diff ^ (diff >> (sizeof(diff)*8-1))) < pred) + 2*(diff >= 0);
338}
339
340static inline int encode_low(const struct G722Band* state, int xlow)
341{
342 int diff = av_clip_int16(xlow - state->s_predictor);
343 /* = diff >= 0 ? diff : -(diff + 1) */
344 int limit = diff ^ (diff >> (sizeof(diff)*8-1));
345 int i = 0;
346 limit = limit + 1 << 10;
347 if (limit > low_quant[8] * state->scale_factor)
348 i = 9;
349 while (i < 29 && limit > low_quant[i] * state->scale_factor)
350 i++;
351 return (diff < 0 ? (i < 2 ? 63 : 33) : 61) - i;
352}
353
354static int g722_encode_frame(AVCodecContext *avctx,
355 uint8_t *dst, int buf_size, void *data)
356{
357 G722Context *c = avctx->priv_data;
358 const int16_t *samples = data;
359 int i;
360
361 for (i = 0; i < buf_size >> 1; i++) {
362 int xlow, xhigh, ihigh, ilow;
363 filter_samples(c, &samples[2*i], &xlow, &xhigh);
364 ihigh = encode_high(&c->band[1], xhigh);
365 ilow = encode_low(&c->band[0], xlow);
366 update_high_predictor(&c->band[1], c->band[1].scale_factor *
367 high_inv_quant[ihigh] >> 10, ihigh);
368 update_low_predictor(&c->band[0], ilow >> 2);
369 *dst++ = ihigh << 6 | ilow;
370 }
371 return i;
372}
373
374AVCodec adpcm_g722_encoder = {
375 .name = "g722",
376 .type = AVMEDIA_TYPE_AUDIO,
377 .id = CODEC_ID_ADPCM_G722,
378 .priv_data_size = sizeof(G722Context),
379 .init = g722_init,
380 .encode = g722_encode_frame,
381 .long_name = NULL_IF_CONFIG_SMALL("G.722 ADPCM"),
382 .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE},
383};
384#endif
304 385

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t